برگزیده های پرشین تولز

تمرین هایی برای سی++

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
خب تمرین
بدون استفاده از آرایه ساختار کلاس یونینون و...
فقط به کمک اوناع پایه ای و اشاره گرها
برنامه ای بنویسید که تمامی حروفی که کاربر می نویسد را بدون نمایس بر روی صفحه ذخیره نماید تا کاربر حروف Q یا q را وارد کند بعد از این کار تمام حروف تایپ شده را به ترتیب از اولین به اخرین نمایش دهد
 

Arman_BTC

کاربر تازه وارد
تاریخ عضویت
28 فوریه 2006
نوشته‌ها
138
لایک‌ها
1
اقا ارش سلام
در مورد این تمرین برای ذخیره کردن حرو ف بدون نمایش به غیر از ارایه ها راه دیگه ای هم هست؟اخه شما نوشتین
بدون استفاده از ارایه:(
و اینکه گفتید شاید قبلا حل کردید منظورتون توی تاپیک های قبلیه؟
 

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
به نقل از Arash_j13 :
خب تمرین
بدون استفاده از آرایه ساختار کلاس یونینون و...
فقط به کمک اوناع پایه ای و اشاره گرها
برنامه ای بنویسید که تمامی حروفی که کاربر می نویسد را بدون نمایس بر روی صفحه ذخیره نماید تا کاربر حروف Q یا q را وارد کند بعد از این کار تمام حروف تایپ شده را به ترتیب از اولین به اخرین نمایش دهد

سلام
یه برنامه ای نوشتم ولی فکر می کنم یه جورایی از آرایه استفاده کردم. مگه بدون آرایه و ساختار میشه؟
کد:
#include<stdio.h>
#include<conio.h>
#include<string.h>

void main()
{
  char *pch,*pcht,ch;
  int i=0;
  clrscr();

  pch  = new char[i];
  *pch = '\0';

  while((ch=getch())!='\r')
  {
    i++;
    pcht = new char[i+1];
    strcpy(pcht,pch);
    delete pch;
    pch=pcht;
    *(pch+i-1)=ch;
    *(pch+i)='\0';
  }
  printf("s=%s",pch);
  getch();
}

در ضمن منتظر بقیه سئوال ها هستیم!:)
 

Arman_BTC

کاربر تازه وارد
تاریخ عضویت
28 فوریه 2006
نوشته‌ها
138
لایک‌ها
1
اقا محمد دستتون درد نکنه عجب برنامه تمیزی.:)
من چندتا سوال داشتم.البته نمیدونم اینجا باید پست بزنم یا تو تاپیک اموزش از پایه به هر حال اگه جاش مناسب نیست اقا سالک زحمت انتقالشو به تاپیک مناسب بکشند
می خواستم اگه میشه در مورده getch,و همچنین فرقش با getche توضیح بدید
من برنامتونو که اجرا کردم باید کلید اینتر بزنیم تا حروف نمایش داده بشن البته من کوچکتر از اونی هستم که از شما اشکال بگیرم:blush:
ولی فکر میکنم به جای
کد:
 while((ch=getch())!='\r')
اگه
کد:
while((ch=getch())!='p')
باشه با صورت سوال جور در میاد
اگه میشه یه توضیح کلی هم راجع به کل برنامه بدید.ممنون میشم
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
آقا محمد برنامه تون خوب بود ولی از ارایه استفده کردید حالا درسته پویا شده اما بازم ارایه است

در مورد getch و getche اولی کارکتر گرفته شده رو نمایش نمی ده ولی دومی می ده
مثلا

کد:
#include <stdio.h>
#include <conio.h>

int main()
{
      int c;
      c=getch();
      printf("you was entered %c\n",c);
      c=getche();
      getch();
      return 0;
}
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
به نقل از Arman_BTC :
اقا ارش سلام
در مورد این تمرین برای ذخیره کردن حرو ف بدون نمایش به غیر از ارایه ها راه دیگه ای هم هست؟اخه شما نوشتین
بدون استفاده از ارایه:(
و اینکه گفتید شاید قبلا حل کردید منظورتون توی تاپیک های قبلیه؟
خب این قبلا حل نکردم
اما راهی که به نظرم می شه اینکه که یه صف تشکیل بدیم بعد خیلی راحت می شه بقیه کارها رو انجام داد حالا شبیه سازی صف بدون ساختار به عهده ی شما:happy:
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
براي همچين مثالي بايد شما مقداري حافظه الو كيت كنيد
فقط توي اين كد چون 100 بايت الوكيت كردم وقتي اينتر ميزنيد مقداري كه ذخيره شده است رو نمايش ميده وهنگامي كه كليد هاي كمكي رو ميزنيد از روشون ميپره
و اسكيپ هم باعث خروج ميشه
کد:
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <alloc.h>
#include <process.h>

int main(void)
{
   char *myBuffer;
   char ch;
   int i=0;
      clrscr();
      /* allocate memory for string */
      if ((myBuffer = (char *) malloc(100)) == NULL)
	{
	  cout<<"There is some Error";
	  getch();
	  exit(0);
	}
      cout<<"Type some text and The String you Typed is :"<<endl;
      ch=getch();
      while(ch!=27)
	{
	if (i==100) {
	   *(myBuffer+i)='\0';
	   cout<<myBuffer<<endl;
	   i=0;
	   }
	if (ch==13) {
	   *(myBuffer+i)='\0';
	   cout<<myBuffer<<endl;
	   i=0;
	}else if (ch!=0) {
	    *(myBuffer+i++)=ch;
	}else ch=getch();
	ch=getch();
	}
     *(myBuffer+i)='\0';
     cout<<myBuffer<<endl;
     free(myBuffer);
     cout<<"our buffer is empty now. press any key to continue..."<<endl;
     getch();   
     return 0;
     }
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
خیلی خوب بود


تمرین بعدی یه تمرین شی گرا

یه کلاس طراحی کنید برای عملیات بر رروی اعداد مختلط با اور لود کردن تمام اپراتور مورد نیاز به طوری که برنامه نویس با اون مانند انواع معملی برخورد کنه
 

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
به نقل از Arman_BTC :
ولی فکر میکنم به جای
کد:
 while((ch=getch())!='\r')
اگه
کد:
while((ch=getch())!='p')
باشه با صورت سوال جور در میاد
اگه میشه یه توضیح کلی هم راجع به کل برنامه بدید.ممنون میشم

سلام :)

همینجوری خواستم از اینتر استفاده کنم

در مورد برنامه هم همین چیزایی که به ذهنم رسید رو می گم اگه منظورت چیز دیگه ای بود بگو:
کد:
new char[i];
این دستور new می تونه از سیستم حافظه بگیره . وقتی شما متغییری تعریف می کنید ، به هنگام اجرای برنامه از سیستم حافظه گرفته می شود و تا پایان اجرای برنامه این حافظه به سیستم برگردانده نمی شود ولی با دستور new و delete یا malloc , calloc,free میشه از سیستم حافظه گرفت و یا اون حافظه را به سیستم برگرداند.

اینطوری مقداری حافظه که تا انتهای برنامه دیگه مورد نیاز نیست به سیستم برگردانده می شود و بیخودی حافظه اشغال نمیشه .

فرق new با malloc هم اینه که new نوع رو تشخیص می دهد ولی malloc اینطور نیست . یعنی اگر شما بخواهید از malloc استفاده کنید مقدار حافظه ای رو که نیاز دارید باید حساب کنید ( که معمولا اینکار رو با تابع sizeof انجام می دهند) و تعداد بایت مورد نیاز رو به تابع بدید تا اون مقدار بایت رو از سیستم درخواست کنه مثلا اگر شما به اندازه 10 تا متغییر float حافظه بخواهید باید از این دستور استفاده کنید.
کد:
float *p;
p=malloc (sizeof(float) * 10);
ولی دستور new که در c++ بوجود اومده می تونه نوع رو خودش تشخیص بده و مقدار حافظه رو تخصیص بده .
کد:
float *p;
p=new float[10];

حالا با این توضیحات ما به تعداد کارکتر های وارد شده به اضافه یک (به خاطر '0\') از سیستم حافظه می گیریم ولی هر دفعه باید کل حافظه رو دوباره بگیریم چون نمی تونیم به حافظه قبلی یک بایت اضافه کنیم . بعد کارکتر های قبلی رو در حافظه جدید کپی می کنیم و حافظه قبلی رو به سیستم پس بدیم.
 

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
به نقل از Arash_j13 :
آقا محمد برنامه تون خوب بود ولی از ارایه استفده کردید حالا درسته پویا شده اما بازم ارایه است

:)

برنامه منم که شبیه برنامه سعید جان بود .:blink:

منتظر سئوال بعدی هستیم ;)
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
محمد جان بخاطر اينكه نوشته بودي
pch = new char;
اين اشتباه بوجود امده بود يعني انگار ارايه تعريف كردي كه در واقعه ارايه تعريف نكرده بودي بلكه از دستورات جديد c++ استفاده كردي كه توي سي نيست .
راستي فرق بعدي malloc و new اينكه با گرفتن حافظه توسط الوكيت شما بايد مديريت اين بخش رو به عهده داشته باشيد پس ميتونيد يك خانه جلو يا عقب بريد در حالي كه با new نميتوانيد اين كار رو انجام دهيد چون خودش تعدا بايت ها رو تشخيص ميده نه شما با دستوراتتان

اميدوارم كمك كنه
راستي پست 9 هم سئوال پرسيده شده
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
سوال رو بالا گفتم

یه سوال یگه هم می گم

برنامه ای بنویسید که دنباله فیبوناچی رو طوری به وسیله توابع بازگشتی پیاده سازی کنی که زمان محاسبه اش زیاد با زمان محاسبه به روش غیر بازگشتی فرق نکنه ( مرتبه ی زمانیش خطی باشه)
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
ارش جان مرسي از سئوال هاي كه ميپرسي ولي بهتره يه ذره بيشتر توضيح بدي
مثلا دنباله فیبوناچی چيه و ....
و مرتبه ی زمانیش خطی باشه چيه ....
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
ببخشید عجله داشتم سرع گفتم

دنباله فیبوناچی یه دنباله معروف توی ریاضایات با این فرمول

fibo(1)=1
fibo(2)=1
fibo(x)=fibo(x-1)+fibo(x-2)

مرتبه زمانیش خطی باشه یعنی اینکه اگه اندازه مسئله رو n برار برار کنیم زمان اجرای برنامه هم n برار بشه
یا اینکه تابع زمان بر حسب اندازه مسئله یک تابع خطی باشه
که اندازه مسئله اینجا مقدار x هست

اگه به حالت معمولی این برنامه رو با تابع بازگشتی بنویسید مرتبه تابع خط نمی شه بلکه به صورت توانی می شه و با تابع 2 به توان n مشخص می شه این یعنی اینکه اگه x رو 10 برار کنید زمان محاسبه مسئله دو به توان 10 برار می شه ولی در حالی که برای یه برنامه ی بهینه باید 10 برابر بشه حالا من می خوام این برنامهی بهینه رو بنویسید
حالت معمولیش رو خودم اینجا می نویسم کسی نیاد بگه من این جوری نوشتم

کد:
long int fibo(long int x)
{
    if (x<=0) 
       return 0;
       
    if (x==1||x==2)  
       return 1;
         
    return fibo(x-1)+fibo(x-2);
}

اینی که من نوشتم برای عدد های بالای 50 برخلاف چیزی که به نظر می رسه و معموله زمان زیادی رو در حد خودش می گیره
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
فکر کنم برای سرعت بتونیم از کلاس حافظه register استفاده کنیم
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
کلاس حافظه ریجستر فقط جنبه توصیه داره در ثانی مرتبه زمانی رو تغییر نمی ده یعنی اگه عدد x رو 10 برابر کنید زمان بسیار بیشتر از 10 برابر می شه خیلی راحت می تونید امتحان کنید جلمه ی 10 سری حساب کنید خواهید دید در زمانی کمتر از یک ثانیه جواب برگردانده خواهد شد حالا 100 رو وارد کنید زمان بسیار وحشت ناک طولانی خواهد بود به طوری که می تونید برید یه چرت بخوابید بعد بیاید جواب رو ببینید البته اگه استک سریز نشه
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
درسته، این چرخه تابع است که سرعت گیره
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
سلام
خوب هستید
یک قانون کلی برای افزایش سرعت :
اگر یک عمل چند بار مشابه و یا دقیقا اجرا میشه با ایجاد تغییرات مناسب و حذف قسمات های یکسان سرعت برنامه افزایش پیدا میکنه
توی مثال اقا ارش مشکل اصلی صدا زدن ان باز f 1 و n-1 بار f 2 و ... است پس باید این قسمت کد بهینه بشه
کد:
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <process.h>

long double f(long double i,int cnt);

int main(void)
{
     clrscr();
     long double i;

//our code start from here
     cout<<"Please Enter number for calculating figona chee value: ";
     cin>>i;
     cout<<"our calculating Result is: "<<f(i,0)<<
	  endl<<"Press any key to continue...";
     getch();
     return 0;
}
long double f( long double i,int cnt){
    static long double oldf[1000];
    static long cntm;
    long double lngTmp;
    long fd;
    if (cnt==0) cntm=0;
    //if our number reaches zero then our functions returns nothing
    if (i<=0) return 0;
    //if our number equal 1 or 2 then our function return 1
    if (i==1 || i==2) return 1;
    // Check our number exist in our array or not?
    // if exist find function value index from our array index
    fd=-1; // set Parameter value to detected found index or not
    if (cntm+2>=i) fd=i-3;
    // if index not founded call function again for calculate for new number
    if (fd==-1){
	lngTmp=f(i-2,1)+f(i-1,1);
	oldf[cntm]=lngTmp; //store this value for latter usage
	cntm++; // one added to our array counter.
    }else lngTmp=oldf[fd]; //we have this value so set it!

    return lngTmp; // finished new number calculating send back this value
}
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
راه خوبی رفتید اما هنوز بهینه نیست یه ارایه هزارتایی برای عدد های بزرگتر کافی نیست و البته اگه این عدد رو بزرگتر بکنید برنامه خیلی حافظه می بره
دوستا یکم بیشتر فکر کنید و این برنامه رو بدون نیاز به این حجم از حافظه بنویسید البته اقا سعید تا جاهای خیلی خوبی پیش رفتن

اسم اون قانونی هم که اقا سعید گفت بهره ترکیبی هست این قانون می گه که یه تابع بازگشتی باید از نتایج ضمنی تولید شده توسط مراحل قبلی برای کوتاهی محاسبات استفاده کنه
 
بالا