• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

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

saeedsmk

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

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
ما که هم از برنامه و همینطور نقد اون استفاده (کرده) و لذت بردیم. :)
 

mohammad_110

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

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

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

سلام یه مدت نبودم چقدر اینجا پست خورده:D

اینم بهینه شده برنامه سعید خان برای فیبوناچی
کد:
#include<stdio.h>
#include<conio.h>

int fibonachi(int n);

void main() {

  int number;
  clrscr();

  scanf("%d",&number);
  printf("\n%d",fibonachi(number));

  getch();
}

int fibonachi(int n) {

  static int pre; 		// this varibale save value of the fibonachi(n-2)
  int tmp1;		// tmp1 temporary value of the fibonachi(n-1)
  int tmp2;		// tmp2 temporary value of the fibonachi(n-2)

  if (n=<0)  return 0;
  if (n==1) {
    pre = 1;
    return 1;
  }

  tmp1 = fibonachi(n-1);
  tmp2 = pre;
  pre  = tmp1;		// tmp1 is the fibonachi(n-2) at upper level 

  return tmp1 + tmp2;
}
 

mohammad_110

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


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

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

کد:
#include<conio.h>
#include<iostream.h>
 class Complex {
   private:
     float real;
     float imag;
   public:
     Complex (void) {
      real=imag=0;
     }
     Complex (float r,float i) {
      real=r;imag=i;
     }
     float getReal() {
      return real;
     }
     float getImage() {
      return imag;
     }
     Complex operator+ (Complex& c) {
      return Complex(real+c.real,imag+c.imag);
     }
     Complex operator- (Complex& c) {
      return Complex(real-c.real,imag-c.imag);
     }
     Complex operator- () {
      return Complex(-real,-imag);
     }
     Complex operator* (Complex& c) {
      return Complex(real*c.real-imag*c.imag,real*c.imag+imag*c.real);
     }
     Complex operator/ (Complex& c) {
      float modulus=c.real*c.real+c.imag*c.imag;
      float newReal=real*c.real+imag*c.imag;
      float newImag=imag*c.real-real*c.imag;
      return Complex(newReal/modulus,newImag/modulus);
     }
 };
 ostream& operator<< (ostream& s,Complex& c) {
  s <<"("<<c.getReal()<<","<<c.getImage()<<"i)";
  return s;
 }
void main (void) {
 clrscr();
 Complex a(2,3),b(3,1),c;
 c=a+b;
 cout<<a<<"+"<<b<<"->"<<c<<endl;

 c=a-b;
 cout<<a<<"-"<<b<<"->"<<c<<endl;

 c=b*a;
 cout<<b<<"*"<<a<<"->"<<c<<endl;

 a=c/b;
 cout<<c<<"/"<<b<<"->"<<a<<endl;

 a=Complex(2,1);
 cout<<"-"<<a<<"->"<<-a<<endl;

 getch();
}

سئوال بعدی سئوال بعدی ...
124.gif
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
سری فیبو ناچی اشتباه یعنی اصلا جواب مسئله رو نمی ده مثلا برای 4 جواب 4 هست ولی برنامهی شما 5 چاپ می کنه

برناه دومی هم خطای سینتکسی داشت و کامپایل نشد البته اولی هم یه کوچولو خظا سینتکسی داشت( if (n=<0) return 0;)
 

Mehdi.T

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

:p سخت شد
اونایی که میفهمم خیلی عالین و اونهایی که نمیفهمم عالیی++ (سقراط)

1 سوال : در این زمینه بهینه کردن الگوریتم کاری ، قانون خاصی حاکمه !؟ ، مرجعی موجوده ؟!
 

saeedsmk

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

و در ضمن برنامت فیگوناچی عدد بعدی رو میده نه فیگو ناچی خود عدد تو
مثلا فیگوناچی 10 میشه 55 و فیگوناچی 11 میشه 89 و برنامت فیگوناچی 10 رو برابر 89 حساب میکنه
قرض از نوشتن این تمرینها اشنایی دوستان با اصول و نحوه بهینه کردن کد هاست که برنامه شما کاملا این کار رو میکنه ( البته باید اروراش درست بشه )

کد زیر هم کد بهینه کد خودمه که نوشته بودم توضیحاتم داخل متن هست
کد:
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <process.h>

long double f(long double i);

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)<<
	  endl<<"Press any key to continue...";
     getch();
     return 0;
}
long double f( long double i){
    static long double oldf[6]; //buffer for old value
    static long double oldn[6]; //buffer for old number
    static long cntm=0;
    long double lngTmp;
    long double lngTmp2;
    long fd;
    //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
    // now check to found if value has last returned value
      for(int y=0;y<=5 && y-1<=cntm;y++)
	if (oldn[y]==i){
	    fd=y;
	    y=6;}
    // if the number is new one so call function again
    // for calculating new value
    if (fd==-1){
	lngTmp=f(i-2)+f(i-1);
	// our buffer just store 5 last returaned value and number
	// so we check if our buffer is empty or not
	// if emtpy new value and number added to end of buffer
	// if not. we role buffer to down to free last buffer
	// so we do not need so many memory for buffering all value and #
	if (cntm>=5){
	oldf[cntm]=lngTmp; //store this value for latter usage
	oldn[cntm]=i; //store this number for latter usage
	cntm++; // one added to our array counter.
	}else{
	    // free last buffer index for add new value
	    for(y=0;y<=4;y++){
		oldf[y]=oldf[y+1];
		oldn[y]=oldn[y+1];}
	    oldf[y]=lngTmp;
	    oldn[y]=i;
	}
    }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
محل سکونت
مشهد
آقا سعید افرین

منم راه حل خودم رو می نویسم

کد:
#include <iostream>
#include <conio.h>
#include <time.h>

long int fibo(long int,long int a=3,long int b=1,long int c=1);

using namespace std;

int main(void)
{
    long int num;

    cout<<"enter a number ";
    cin>>num;
    cout<< fibo(num);


    getch();
    return 0;
}







long int fibo(long int x, //user number
             long int n, //curent number
             long int p1, //fibo(n-1)
             long int p2) //fibo(n-1)
{

    if(x<=0)         //if number is negative
         return 0;
    if(x==1 || x==2) //fibo(1)=fibo(2)=0
         return 1;

    if(x==n)         //fibo(n)=fibo(n-1)+fibo(n-2)
         return p1+p2;

         //if x!=n then find fibo(n+1) and return its value
    return fibo(x, //final number
                    n+1, //next nuuber
                    p1+p2, //fibo(n)
                    p1     //fibo(n-1)
                    );
}
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
به نقل از MehdiTeh :
:p سخت شد
اونایی که میفهمم خیلی عالین و اونهایی که نمیفهمم عالیی++ (سقراط)

1 سوال : در این زمینه بهینه کردن الگوریتم کاری ، قانون خاصی حاکمه !؟ ، مرجعی موجوده ؟!

زیاد سخت نیست

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

Arash_j13

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

برنامه ای نویسید که عدد را از کاربر بگیرد و تعییرن کند ایا این عدد بر 15 بخش پذیر هست یا نه تعداد ارقام این عدد ممکن است بیش از چند هزار رقم باشد و کاربر نباید بتواند غیر از عدد چیز دیگری را وارد کند
 

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
به نقل از Arash_j13 :
سری فیبو ناچی اشتباه یعنی اصلا جواب مسئله رو نمی ده مثلا برای 4 جواب 4 هست ولی برنامهی شما 5 چاپ می کنه
سلام
عیدتون مبارک باشه :D
:blink: تا اونجایی که من می دونم سری فیبوناچی اینجوریه:
کد:
1 1 2 3 5 8 13 21 ...

برناه دومی هم خطای سینتکسی داشت و کامپایل نشد البته اولی هم یه کوچولو خظا سینتکسی داشت( if (n=<0) return 0;)
بله من چون توی یه کامپیوتر دیگه کار می کردم مجبور شدم برای اصلاح کدها از نوت پد استفاده کنم همین باعث شد کدها اشکال پیدا کنند که من کد دوم که مربوط به کلاس ها می شد رو اصلاح کردم .
اصلاح شده کد فیبوناچی رو هم توی پست بعدی میزارم.
 

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
به نقل از MehdiTeh :
:p سخت شد
اونایی که میفهمم خیلی عالین و اونهایی که نمیفهمم عالیی++ (سقراط)

1 سوال : در این زمینه بهینه کردن الگوریتم کاری ، قانون خاصی حاکمه !؟ ، مرجعی موجوده ؟!

یک کتاب از جعفر نژاد قمی در زمینه نوشتن الگوریتم دیدم ولی نمی دونم چطوریه .
 

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
به نقل از saeedsmk :
و در ضمن برنامت فیگوناچی عدد بعدی رو میده نه فیگو ناچی خود عدد تو
مثلا فیگوناچی 10 میشه 55 و فیگوناچی 11 میشه 89 و برنامت فیگوناچی 10 رو برابر 89 حساب میکنه
قرض از نوشتن این تمرینها اشنایی دوستان با اصول و نحوه بهینه کردن کد هاست که برنامه شما کاملا این کار رو میکنه ( البته باید اروراش درست بشه )
اون برنامه کلاس complex رو درست کردم .
یه مقدار توی نوت پد تغییرش دادم برای همین اینجوری شد .

این مشکل عدد بعدی رو هم درست کردم.
کد:
#include<stdio.h>
#include<conio.h>

long int fibonachi(int n);

void main() {

  int number;
  clrscr();
  printf("Enter a number: ");
  scanf("%d",&number);

  printf("\n\t\t\tfibonachi(%d) = %ld\n\npress any key...",
			    number,fibonachi(number));

  getch();
}

long int fibonachi(int n) {

  static long int pre; 		// this varibale save value of the fibonachi(n-2)
  long int tmp1;		// tmp1 temporary value of the fibonachi(n-1)
  long int tmp2;		// tmp2 temporary value of the fibonachi(n-2)

  if (n<=0)  return 0;
  if (n==1 || n==2) {
    pre = 1;
    return 1;
  }

  tmp1 = fibonachi(n-1);
  tmp2 = pre;
  pre  = tmp1;		// tmp1 is the fibonachi(n-2) at upper level

  return tmp1 + tmp2;
}
 

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
کد زیر رو برای مقایسه کدهای نوشته شده برای فیبوناچی نوشتم:
کد:
#include<stdio.h>
#include<conio.h>
#include<time.h>

long double f( long double i);
long int fibonachi(int n);
long int fibo(long int,long int a=3,long int b=1,long int c=1);

void main() {

  int number;
  time_t t1,t2;

  clrscr();

  printf("please wait");

  t1 = time(NULL);
  for (int k=0;k<1000;k++)
    for (int j=0;j<1000;j++)
      for (int i=0;i<40;i++)
      {
	f(i);
      }
  t2 = time(NULL);
  printf("\n%ld",t2-t1);

  t1 = time(NULL);
  for (k=0;k<1000;k++)
    for (j=0;j<1000;j++)
      for (i=0;i<40;i++)
      {
	fibonachi(i);
      }
  t2 = time(NULL);
  printf("\n%ld",t2-t1);

  t1 = time(NULL);
  for (k=0;k<1000;k++)
    for (j=0;j<1000;j++)
      for (i=0;i<40;i++)
      {
	fibo(i);
      }
  t2 = time(NULL);
  printf("\n%ld",t2-t1);

  printf("\npress any key...");
  getch();
}

long double f( long double i){
    static long double oldf[6]; //buffer for old value
    static long double oldn[6]; //buffer for old number
    static long cntm=0;
    long double lngTmp;
    long double lngTmp2;
    long fd;

    //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
    // now check to found if value has last returned value
      for(int y=0;y<=5 && y-1<=cntm;y++)
	if (oldn[y]==i){
	    fd=y;
	    y=6;}
    // if the number is new one so call function again
    // for calculating new value
    if (fd==-1){
	lngTmp=f(i-2)+f(i-1);
	// our buffer just store 5 last returaned value and number
	// so we check if our buffer is empty or not
	// if emtpy new value and number added to end of buffer
	// if not. we role buffer to down to free last buffer
	// so we do not need so many memory for buffering all value and #
	if (cntm>=5){
	oldf[cntm]=lngTmp; //store this value for latter usage
	oldn[cntm]=i; //store this number for latter usage
	cntm++; // one added to our array counter.
	}else{
	    // free last buffer index for add new value
	    for(y=0;y<=4;y++){
		oldf[y]=oldf[y+1];
		oldn[y]=oldn[y+1];}
	    oldf[y]=lngTmp;
	    oldn[y]=i;
	}
    }else lngTmp=oldf[fd]; //we have this value so set it!

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

long int fibonachi(int n) {

  static long int pre; 		// this varibale save value of the fibonachi(n-2)
  long int tmp1;		// tmp1 temporary value of the fibonachi(n-1)
  long int tmp2;		// tmp2 temporary value of the fibonachi(n-2)

  if (n<=0)  return 0;
  if (n==1 || n==2) {
    pre = 1;
    return 1;
  }

  tmp1 = fibonachi(n-1);
  tmp2 = pre;
  pre  = tmp1;		// tmp1 is the fibonachi(n-2) at upper level

  return tmp1 + tmp2;
}

long int fibo(long int x, //user number
	     long int n, //curent number
	     long int p1, //fibo(n-1)
	     long int p2) //fibo(n-1)
{

    if(x<=0)         //if number is negative
	 return 0;
    if(x==1 || x==2) //fibo(1)=fibo(2)=0
	 return 1;

    if(x==n)         //fibo(n)=fibo(n-1)+fibo(n-2)
	 return p1+p2;

	 //if x!=n then find fibo(n+1) and return its value
    return fibo(x, //final number
		    n+1, //next nuuber
		    p1+p2, //fibo(n)
		    p1     //fibo(n-1)
		    );
}

که خروجی زیر بدست اومد(پنتیوم 1.7):
کد:
please wait
52
19
21
press any key...

فکر می کنید چرا؟:wacko:
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
سلام عیدتون مبارک
محمد جان تابع اول ( بهینه شده ) 3*2 بار بیشتر عملیات مقایسه رو انجام میده - همچنین بعد از 8، 5*2 بار جایگذینی بیشتر که در 40* 1000* 1000 بار تعداد خطوط خیلی زیاد شده و در نتیجه سرعت میاد پایین
کد شما این تعداد خطوط نداره در نتیجه بهتر جواب گو است
اما کد اخری بعلت استفاده از ادرس دهی غیر ثابت و غیر استاتیک و در نتیجه نیازمند به به ترنسفرو یا نیازمند push وpop کردن متغیر ها در حافظه، است که وقت گیر بوده ( در حالت متغیر استاتیک تا زمان خروج از تابع ذخیره نمیشود ) پس در نتیجه برنامه کندتر کار مینماید .
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
یه تمرین خیلی ساده هم می گم برای دوستانی که فکر می کنن تمرین ها یکمی سخته

برنامه ای نویسید که عدد را از کاربر بگیرد و تعییرن کند ایا این عدد بر 15 بخش پذیر هست یا نه تعداد ارقام این عدد ممکن است بیش از چند هزار رقم باشد و کاربر نباید بتواند غیر از عدد چیز دیگری را وارد کند

تمرین های بسیار جالبی مطرح میکنید آرش جان.:rolleyes:

من خیلی سریع یه چیزی نوشتم چون امشب عیده و وقت تنگ و کار هم زیاد !!!:D

تست کنید ببینید درسته یا نه
کد:
#include<iostream.h>
#include<conio.h>

int accept(char c)
{
	if((c>='0')&&(c<='9'))
	  return 1;
	else
	 return 0;
}
//--------
int chrtoint(char c)
{
	if((c>=48)&&(c<=57))
	  return c-48;
	else
	  return 0;
}
//--------
int main()
{
	unsigned long int sum=0;
	char ch,temp='1';
	beg:
	clrscr();
	cout<<"Enter Number: ";
	while((ch=getch()) != 13)
	{
	  if(accept(ch))
	  {
	   temp=ch;
	   cout<<ch;
	   sum=sum+chrtoint(ch);
	  }
	}
	cout<<"\nSum="<<sum<<endl;
	if((sum % 3 == 0)&&(chrtoint(temp) % 5 ==0))
	  cout<<"**** BAR 15 BAKHSH PAZIR AST !!! ****"<<endl;
	else
	  cout<<"BAR 15 BAKHSH PAZIR NIST. "<<endl;
	q:
	cout<<"\nDo you want to continue(y/n)?";
	ch=getch();
	if((ch=='Y')||(ch=='y'))
	  goto beg;
	else if((ch=='N')||(ch=='n'))
	  return 0;
	else goto q;
}
 

Arash_j13

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

آقا محمد برنامه فیبوناچی تون عالی بود فکر کنم پرونده ی فیبوناچب بسته شده باشه

اما در مورد اعداد مختلط کامل نیست مثلا یه ثابت صحیح مثل 2 رو نمی شه باید عدد مختلط جمع کرد؟
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
جناب پروگرمر الگوریتم برنامه تون درسته فقط توی کد نویسی مشکل داره البته ممکنه روی بعضی از کامپایلر ها جواب بده و مشکل نداشته باشه ولی رو کامپایلر من(gcc) این خطا رو داشت
خطا از این قراره که تابع یه chrtoint یه عدد علامت دار بر می گردونه و متغییر sum بدون علامت هست در جمع این دوتا ممکنه مشلکی پیش بیاد که برای برنامه ی شما پیش می یاد
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
به نقل از mohammad_110 :
یک کتاب از جعفر نژاد قمی در زمینه نوشتن الگوریتم دیدم ولی نمی دونم چطوریه .

تشکر ، منظور شما همان (مبانی کامپیوتر و الگوریتم ها (با عکس فلوچارت روی جلد و تقریبا آبی رنگ !!)) ؟
 
بالا