poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 تمرین همون برنامه، با do while: 28- برنامه ای بنویسید که یک عدد از ورودی گرفته و تعداد ارقام آن را محاسبه و چاپ نماید(با do while) #include int main() { long int x; int c=0; cout cin>>x; while(x>=1) { c++; x/=10; } cout return 0; } //end 3
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 تمرین یکی از تمارین قبلی، ایندفعه با while: 29- برنامه ای بنویسید که یک عدد از ورودی گرفته و حاصل جمع ارقام آن را چاپ نماید.(با while) #include int main() { long int x; int sum=0; cout cin>>x; while(x>=1) { sum+=x%10; x/=10; } cout return 0; } //end 3
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 تمرین تمرین قبلی ولی با do while: 30- برنامه ای بنویسید که یک عدد از ورودی گرفته و حاصل جمع ارقام آن را چاپ نماید.(با do while) #include int main() { long int x; int sum=0; cout cin>>x; do { sum+=x%10; x/=10; }while(x>=1); cout return 0; } //end 3
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 در زیر تعدادی از توابع ریاضی مهم در ++C را آورده ام که برای استفاده از آنها باید هدر کتابخانه ای math.h را فراخوانی کنید: sqr(x): مجذور متغیر x sqrt(x): جذر متغیر x>=0 fmod(x): باقیمانده تقسیم x بر y pow(x,y): x به توان y abs(x): قدر مطلق x و تعدادی از توابع آشنا: log(x) log10(x) sin(x) cos(x) tan(x) //end 4
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 تمرین 31-برنامه ای بنویسید که یک عدد و یک توان از ورودی گرفته، عدد را به آن توان رسانده و در خروجی چاپ کند.(با استفاده از توابع ریاضی) #include #include void main() { long x,y; cout cin>>x; cout cin>>y; cout } //end 4
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 همان طور که دیدید تا بحال ما از توابع آماده ی زبان سی پلاس پلاس استفاده میکردیم. حال میخواهم به معرفی روشی بپردازم که خودمان امکان نوشتن و تعریف تابع را داشته باشیم. توابع در ++C: برنامه ای که به این زبان نوشته میشود، حداقل شامل تابع main است که علاوه بر این میتواند از یک یا چند تابع تعریف شده توسط کاربر استفاده کند. تعریف تابع: روش اول: (لیست آرگومان ها) نام تابع نوع بازگشتی } بدنه تابع { مثال: int a(x,y,z) char x; int y; float z; { x='a'; } //end روش دوم: (...،آرگومان2 نوع2 ،آرگومان1 نوع 1) نام تابع نوع بازگشتی } بدنه تابع { مثال: int b(char x, int y, float z) { x='a'; } //end تعریف بخش های یک تابع: 1. نوع بازگشتی: نوع داده ای که قرار است تابع داده ای از آن نوع را به قسمتی که تابع را فراخوانی کرده است، برگرداند. مانند: int, float, double, char, void نکته: در صورتی که نوع بازگشتی void تعیین شود یا هیچ نوعی قرار نگیرد، تابع هیچ مقداری را بر نمیگرداند و فقط دستورات بدنه را اجرا و از آن خارج میشود. 2. نام تابع: اسامی انتخاب شده برای توابع باید از قواعد تولید شناسه پیروی کند. 3. لیست آرگومان ها: میزان، تعداد و نوع مقادیر ورودی یک تابع توسط لیست آرگومان های تابع مشخص میشود. نکته: اگر تابعی فاقد لیست آرگومان ها باشد، یعنی این تابع ورودی از طریق آرگومان هایش ندارد، لذا باید یا لیست آرگومان ها را خالی بگذاریم و یا اینکه از نوع داده ای void استفاده کنیم. 4. بدنه ی تابع: بدنه ی تابع قسمتی است که در آن دستورات یک تابع که باید روی مقادیر آرگومان هایش انجام شود، را مینویسیم. در این قسمت نیز همانند داخل تابع main امکان استفاده از تمامی دستورات زبان برنامه نویسی ++C را داریم. به دلیل حجم نسبتا بالای مطالب، محل تعریف تابع و دیگر نکات آن را در جلسات آتی بیان میکنم. 4
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 محل تعریف توابع: 1.تعریف تابع و بدنه ی آن قبل از تابع اصلی: (لیست آرگومان ها) نام تابع نوع تابع } بدنه { int main() { return 0; } //end 2. تعریف خطی (معرفی تابع قبل از main و تعریف آن بعد از main): ;(لیست آرگومان ها) نام تابع نوع تابع int main() { return 0; } //end (لیست آرگومان ها) نام تابع نوع تابع } بدنه { نکته: به دلیل ساختار top to down بودن در ++C، هنگامی که میخواهیم تابع را بعد از تابع اصلی(main) تعریف کنیم باید قبل از تابع اصلی آن را معرفی کنیم. نکته: هنگام تعریف خطی تابع حتما دقت میکنیم که بعد از پرانتز بسته ی لیست آرگومان ها، گذاشتن ; الزامی است. نکته: فراخوانی یک تابع، داخل تابع دیگر مجاز است ولی تعریف یک تابع در تابع دیگر مجاز نیست و خطا دارد. 4
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 تو پست های قبل یکی از دوستان پروژه ای رو خواسته بودن که اون موقع به اندازه ی کافی وقت نداشتم و هل هلکی نوشتم که چند محدودیت برای ورود عدد داشت. در اینجا همون برنامه رو طوری نوشتم که تا بیش از 99 رقم رو پشت سر هم از کاربر میگیره و اون رو به حروف تبدیل میکنه. البته برای سادگی، از وکتور ها استفاده نکردم ولی اگر کسی خواست، میتونم اونو هم بزارم. #include #include int main() { RE:clrscr(); int s=0,i2=0,x[99]; char y[99]={0}; //Get number cout do { i2++; y[i2]=getche(); }while(y[i2]!=13); i2--; //recognize digits for(register int i=1;i2>=1;i2--) { x=y[i2]-48; i++; } i--; //Show number clrscr(); cout for(register int i3=i;i3>=1;i3--) cout cout //Translate for(;i>=1;i--) { if(s==1) { switch(x) { case 0:cout case 1:cout case 2:cout case 3:cout case 4:cout case 5:cout case 6:cout case 7:cout case 8:cout case 9:cout } s=0; } else { if(i%3==2) { switch(x) { case 0:cout case 1:s=1;break; case 2:cout case 3:cout case 4:cout case 5:cout case 6:cout case 7:cout case 8:cout case 9:cout } } else { switch(x) { case 0:cout case 1:cout case 2:cout case 3:cout case 4:cout case 5:cout case 6:cout case 7:cout case 8:cout case 9:cout default:goto ESC; } } } if((x[i+2]==0&&x==0)||(x==0&&x[i-2]==0)) { cout } else { if(i%3==0) cout else if(i==4) cout else if(i==7) cout else if(i==10) cout else if(i==13) cout else if(i==16) cout else if(i==19) cout else if(i==22) cout else if(i==25) cout else if(i==28) cout else if(i==31) cout else if(i==34) cout else if(i==37) cout else if(i==40) cout else if(i==43) cout else if(i==46) cout else if(i==49) cout else if(i==52) cout else if(i==55) cout else if(i==58) cout else if(i==61) cout else if(i==64) cout else if(i==67) cout else if(i==70) cout else if(i==73) cout else if(i==76) cout else if(i==79) cout else if(i==82) cout else if(i==85) cout else if(i==88) cout else if(i==91) cout else if(i==94) cout else if(i==97) cout else if(i==100) cout ESC: } } gotoxy(0,22); cout getch(); goto RE; } //end 4
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 فراخوانی توابع: برای فراخوانی یک تابع در تابع اصلی، کافیست نام تابع به همراه مقادیر پارامتر های تابع(در صورت وجود) را بنویسیم. مثال: #include int f(int x, int y) { return x*y; } void main() { int a,b; cout cin>>a>>b; cout } //end نعریف پارامتر: به مقادیر یا متغیر هایی که هنگام فراخوانی یک تابع، جایگزین آرگومان های تابع میشوند، پارامتر گویند. در مثال قبل که f(a,b) را فراخوانی کردیم، مقادیر a,b جایگزین x,y در تابع شدند. یعنی x,y آرگومان های تابع هستند و a,b پارامتر های تابع محسوب میشوند. نکته: تابع میتواند آرگومان ورودی نداشته باشد که در این صورت میتوان در هنگام تعریف، نوع بازگشتی تابع را از نوع void معرفی کرد یا پرانتز جلوی تابع را خالی گذاشت. مقدار بازگشتی تابع: به مقداری که تابع بعد از اتمام عملیات به خود می گیرد، مقدار بازگشتی تابع میگویند که با return مشخص میشود. در مثال قبل، بعد از کلمه ی return عبارت x*y وجود دارد. یعنی x*y محاسبه شده و مقدار حاصل را در تابع میریزد. نکته: در صورتی که در یک تابع بیش از یک return وجود داشته باشد، return اول مقدار را بازگشت داده و مابقی دستورات اجرا نمیشوند. 2
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 تابعی غیر بازگشتی که مقدار فاکتوریل یک عدد را به خود میگیرد: long fact(int x) { long y=1; while(x>=1) { y*=x; x--; } return y; } //end 2
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 تابعی که یک عدد و یک توان به عنوان آرگومان ورودی گرفته و مقدار حاصل را بازگشت میدهد: long power(int x, int y) { long z=1; while(y>0) { z*=x; y--; } return z; } //end 3
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 توابع بازگشتی: همان طور که قبلا ذکر شد، امکان فراخوانی یک تابع در تابع دیگر همواره وجود دارد. خاصیت مهم اینجاست که در زبان ++C میتوان درون یک تابع، خود تابع را نیز با لیست آرگومانهای جدید فراخوانی کرد. از خاصیت بالا برای انجام کارهایی که به صورت تکرار محاسبات مراحل قبلی صورت میگیرند، میتوان استفاده نمود. در توابع بازگشتی، توجه به دو نقطه بسیار مهم است: 1.نقطه بازگشت نقطه بازگشت جایی است که باید خود تابع با آرگومان لیست جدید فراخوانی شود. یعنی به نقطه ین بست نرسیده ایم. 2.نقطه بن بست نقطه بن بست جایی است که در آنجا باید روند فراخوانی را که انجام داده ایم، بصورت بازگشت به عقب انجام دهیم تا جواب مطلوب حاصل شود. مثال: تابع بدست آوردن فاکتوریل عدد از نوع بازگشتی: unsigned long fact(int x) { if(x!=0) return (x*fact(x-1)); return 1; } //end 3
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 یک تابع بازگشتی برای محاسبه ی ب م م دو عدد به عنوان آرگومان ورودی: long bmm(int a, int b) { if(a return bmm(b,a); else if(b==0) return a; else return bmm(b,a%b); } //end 2
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 تابعی که عددی به عنوان آرگومان ورودی گرفته و مقدار ارقام زوج آن را بازگشت میدهد. به عنوان مثال اگر آرگومان ورودی 1234 باشد، مقدار 42 را به خود میگیرد. long even(long x) { long y=0; while(x>=1) { if((x%10)%2==0) { y*=10; y+=x%10; } x/=10; } return y; } //end 3
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 تابعی برای تبدیل عدد ورودی به حروف انگلیسی از نوع بازگشتی. برای مثال عدد 123: one hundred twenty three void trans() { clrscr(); int s=0,i2=0,x[99]; char y[99]={0}; //Get number cout do { i2++; y[i2]=getche(); }while(y[i2]!=13); i2--; //recognize digits for(register int i=1;i2>=1;i2--) { x=y[i2]-48; i++; } i--; //Show number clrscr(); cout for(register int i3=i;i3>=1;i3--) cout cout //Translate for(;i>=1;i--) { if(s==1) { switch(x) { case 0:cout case 1:cout case 2:cout case 3:cout case 4:cout case 5:cout case 6:cout case 7:cout case 8:cout case 9:cout } s=0; } else { if(i%3==2) { switch(x) { case 0:cout case 1:s=1;break; case 2:cout case 3:cout case 4:cout case 5:cout case 6:cout case 7:cout case 8:cout case 9:cout } } else { switch(x) { case 0:cout case 1:cout case 2:cout case 3:cout case 4:cout case 5:cout case 6:cout case 7:cout case 8:cout case 9:cout default: trans(); } } } if((x[i+2]==0&&x==0)||(x==0&&x[i-2]==0)) { cout } else { if(i%3==0) cout else if(i==4) cout else if(i==7) cout else if(i==10) cout else if(i==13) cout else if(i==16) cout else if(i==19) cout else if(i==22) cout else if(i==25) cout else if(i==28) cout else if(i==31) cout else if(i==34) cout else if(i==37) cout else if(i==40) cout else if(i==43) cout else if(i==46) cout else if(i==49) cout else if(i==52) cout else if(i==55) cout else if(i==58) cout else if(i==61) cout else if(i==64) cout else if(i==67) cout else if(i==70) cout else if(i==73) cout else if(i==76) cout else if(i==79) cout else if(i==82) cout else if(i==85) cout else if(i==88) cout else if(i==91) cout else if(i==94) cout else if(i==97) cout else if(i==100) cout ESC: } } gotoxy(0,22); cout getch(); trans(); } //end 4
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 توابع inline: اگر یک برنامه به روش ساخت یافته(با استفاده از توابع) پیاده سازی کنیم، از نقطه نظر زمان اجرای برنامه باعث بروز تاخیر به لحاظ فراخوانی یک تابع، اجرای آن و بازگشت به تابع اصلی میشود که سرعت اجرای برنامه را پایین می آورد. حال اگر یک برنامه کد اجرایی کوتاهی داشته باشد و در تابع اصلی یا توابع دیگر این تابع چندین بار فراخوانی شود، باعث بروز تاخیر زمانی زیادی میشود. لذا برای این گونه توابع که خاصیت گفته شده را دارا میباشند، راهکار تعریف به صورت inline تعریف شده است. بدین صورت که اگر ما در طی برنامه از کلمه کلیدی inline قبل از تعریف تابع استفاده کنیم، این امر موجب میشود که کد تابع در هنگام اجرای برنامه در جایی که تابع فراخوانی میشود کپی شده و دیگر تاخیر زمانی بابت فراخوانی، بازگشت و اجرا نداریم. قالب های تابع(function template): در توابع عم نام اگر تعداد آرگومان ها یکسان باشد و بدنه ی اجرایی تابع نیز به یک شکل باشد و فقط توابع در نوع بازگشتی و نوع آرگومانها تفاوت داشته باشند، می توان به جای نوشتن هر تابع از یک قالب تابع استفاده کرد. به شکل زیر و با کلمه ی کلیدی template: template T A ( T1, T2, ...) { ... } //end در بالا منظور از T هر نوع داده ای(مانند int) و از A نام تابع است. هم چنین T1, T2, ... آرگومان های تابع هستند. 3
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 آرایه های یک بعدی: تاکنون داده های ورودی و بقیه داده های مورد نیاز را در متغیر ها و ثابت ها ذخیره میکردیم. اما اگر تعداد ورودی ها زیاد باشد، نیاز داریم تعداد زیادی متغیر را تشکیل دهیم که این کار باعث میشود روند عملیات برنامه نویسی بسیار پیچیده شود. بنابراین برای جلوگیری از این مشکلات میتوانیم از امکان تعریف آرایه ها در زبان ++C بهره مند شویم. آرایه ها خانه های پشت سر هم در حافظه هستند که همگی از یک نوع و با یک نام و با شماره های خانه متفاوت(اندیس آرایه) هستند. روش تعریف آرایه یک بعدی: ;[طول آرایه]نام آرایه نوع آرایه روش تعریف یک آرایه یک بعدی که به آن لیست (List) هم میگویند به صورت فوق است. در این روش دقت میکنیم که نوع آرایه می تواند از انواع داده ها(Data Types) قابل استفاده در زبان ++C باشد و نام انتخابی برای آرایه چون یک شناسه است، باید از قوائد تولید شناسه در زبان ++C تبعیت کند. نکته: محل هر عضو از آرایه توسط شماره(اندیس) که در [] می گذاریم، مشخص میشود. نکته: اندیس شروع آرایه در زبان ++C صفر میباشد یعنی شماره گذاری خانه های آرایه از 0 شروع میشود و خانه ی اول آرایه اندیس 0 دارد. نکته: در زبان ++C اسم آرایه آدرس خانه ی اول آرایه است. 2
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 حالا که آرایه ها رو معرفی کردیم، سورس یک برنامه ی جالب و معروف میزارم که الگوریتمشو خودم نوشتم. این برنامه که اسمش مربع جادویی هست، ابتدا تعداد سطر و ستون رو که باید عددی فرد باشه از کاربر میگیره و بعد مربع رو درست میکنه. تو این مربع جمع اعداد هر سطر، ستون و ضربدری با هم برابره و هم چنین ضربدر چپ به راست، هر دفعه عددش یک واحد کم میشه. مثال(3X3): 8 1 6 3 5 7 4 9 2 #include #include #include #include void main() { int a[10][10],i,j,n,k=1; clrscr(); cout cin>>n; if(n%2==0 ||n>9) { cout getch(); exit(1); } else { for (i=0;i for (j=0;j a[j]=0; j=(n/2)+1; i=1; a[j]=k; for(k=2;k { i=i-1; j=j-1; if((i==0 &&j==0)||(a[j]!=0)) { i=i+2; j=j+1; } else { if(i==0) i=n; else if(j==0) j=n; } a[j]=k; } } cout for (i=1;i { for (j=1;j cout cout } getch(); } //end 2
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 سورس برنامه ای که از کاربر میپرسد روز اول سال چند شنبه است و براساس آن، چند شنبه بودن n امین روز سال را محاسبه میکند: #include void main() { int x,y,c; cout cin>>x; cout cin>>y; c=(y+x-1)%7; cout switch© { case 0:cout case 1:cout case 2:cout case 3:cout case 4:cout case 5:cout case 6:cout } } //end 2
poor!a 15130 مالک ارسال شده در 24 بهمن، 2011 مقدار دهی اولیه به آرایه تک بعدی: در هنگام تعریف میتوان خانه های یک آرایه ی یک بعدی را مقداردهی اولیه نمود، در این حالت حداقل یک مقدار و حداکثر به تعداد عناصر آرایه میتوان مقدار دهی را انجام داد. مقدار دهی به آرایه هنگام تعریف آن باید از خانه ی اول، پشت سر هم و به صورت پیوسته انجام شود. مثال: int x[3] = {10}; int x[3] = {10, 20}; int x[3] = {10, 20, 30}; //end خالی گذاشتن بُعد آرایه هنگام تعریف: در زبان c++ در آرایه های یک بعدی فقط به شرطی میتوان بعد آرایه را خالی گذاشت که هنگام تعریف آن مقدار دهی نماییم، در غیر این صورت خطا خواهیم داشت. مثال درست: int x[] = {10, 20, 30}; //end 2
ارسال های توصیه شده