رفتن به مطلب

برنامه نویسی c++ - آموزش و سورس برنامه ی سی پلاس پلاس


poor!a

ارسال های توصیه شده

تمرین

 

همون برنامه، با 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

لینک به دیدگاه
  • پاسخ 172
  • ایجاد شد
  • آخرین پاسخ

بهترین ارسال کنندگان این موضوع

بهترین ارسال کنندگان این موضوع

تمرین

یکی از تمارین قبلی، ایندفعه با 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

لینک به دیدگاه

تمرین

 

تمرین قبلی ولی با 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

لینک به دیدگاه

در زیر تعدادی از توابع ریاضی مهم در ++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

لینک به دیدگاه

تمرین

31-برنامه ای بنویسید که یک عدد و یک توان از ورودی گرفته، عدد را به آن توان رسانده و در خروجی چاپ کند.(با استفاده از توابع ریاضی)

 

#include

#include

 

void main()

{

long x,y;

cout

cin>>x;

cout

cin>>y;

cout

}

 

 

//end

لینک به دیدگاه

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

توابع در ++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 را داریم.

 

به دلیل حجم نسبتا بالای مطالب، محل تعریف تابع و دیگر نکات آن را در جلسات آتی بیان میکنم.

لینک به دیدگاه

محل تعریف توابع:

 

1.تعریف تابع و بدنه ی آن قبل از تابع اصلی:

 

(لیست آرگومان ها) نام تابع نوع تابع

}

بدنه

{

int main()

{

return 0;

}

 

//end

 

2. تعریف خطی (معرفی تابع قبل از main و تعریف آن بعد از main):

 

;(لیست آرگومان ها) نام تابع نوع تابع

int main()

{

return 0;

}

//end

(لیست آرگومان ها) نام تابع نوع تابع

}

بدنه

{

نکته: به دلیل ساختار top to down بودن در ++C، هنگامی که میخواهیم تابع را بعد از تابع اصلی(main) تعریف کنیم باید قبل از تابع اصلی آن را معرفی کنیم.

 

نکته: هنگام تعریف خطی تابع حتما دقت میکنیم که بعد از پرانتز بسته ی لیست آرگومان ها، گذاشتن ; الزامی است.

 

نکته: فراخوانی یک تابع، داخل تابع دیگر مجاز است ولی تعریف یک تابع در تابع دیگر مجاز نیست و خطا دارد.

لینک به دیدگاه

تو پست های قبل یکی از دوستان پروژه ای رو خواسته بودن که اون موقع به اندازه ی کافی وقت نداشتم و هل هلکی نوشتم که چند محدودیت برای ورود عدد داشت. در اینجا همون برنامه رو طوری نوشتم که تا بیش از 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

لینک به دیدگاه

فراخوانی توابع:

 

برای فراخوانی یک تابع در تابع اصلی، کافیست نام تابع به همراه مقادیر پارامتر های تابع(در صورت وجود) را بنویسیم.

 

مثال:

#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 اول مقدار را بازگشت داده و مابقی دستورات اجرا نمیشوند.

لینک به دیدگاه

تابعی که یک عدد و یک توان به عنوان آرگومان ورودی گرفته و مقدار حاصل را بازگشت میدهد:

 

long power(int x, int y)

{

long z=1;

while(y>0)

{

z*=x;

y--;

}

return z;

}

 

//end

لینک به دیدگاه

توابع بازگشتی:

 

همان طور که قبلا ذکر شد، امکان فراخوانی یک تابع در تابع دیگر همواره وجود دارد.

خاصیت مهم اینجاست که در زبان ++C میتوان درون یک تابع، خود تابع را نیز با لیست آرگومانهای جدید فراخوانی کرد.

 

از خاصیت بالا برای انجام کارهایی که به صورت تکرار محاسبات مراحل قبلی صورت میگیرند، میتوان استفاده نمود.

 

در توابع بازگشتی، توجه به دو نقطه بسیار مهم است:

 

1.نقطه بازگشت

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

 

2.نقطه بن بست

نقطه بن بست جایی است که در آنجا باید روند فراخوانی را که انجام داده ایم، بصورت بازگشت به عقب انجام دهیم تا جواب مطلوب حاصل شود.

 

مثال: تابع بدست آوردن فاکتوریل عدد از نوع بازگشتی:

 

unsigned long fact(int x)

{

if(x!=0)

return (x*fact(x-1));

return 1;

}

 

//end

لینک به دیدگاه

یک تابع بازگشتی برای محاسبه ی ب م م دو عدد به عنوان آرگومان ورودی:

 

 

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

لینک به دیدگاه

تابعی که عددی به عنوان آرگومان ورودی گرفته و مقدار ارقام زوج آن را بازگشت میدهد. به عنوان مثال اگر آرگومان ورودی 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

لینک به دیدگاه

تابعی برای تبدیل عدد ورودی به حروف انگلیسی از نوع بازگشتی. برای مثال عدد 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

لینک به دیدگاه

توابع inline:

اگر یک برنامه به روش ساخت یافته(با استفاده از توابع) پیاده سازی کنیم، از نقطه نظر زمان اجرای برنامه باعث بروز تاخیر به لحاظ فراخوانی یک تابع، اجرای آن و بازگشت به تابع اصلی میشود که سرعت اجرای برنامه را پایین می آورد.

حال اگر یک برنامه کد اجرایی کوتاهی داشته باشد و در تابع اصلی یا توابع دیگر این تابع چندین بار فراخوانی شود، باعث بروز تاخیر زمانی زیادی میشود. لذا برای این گونه توابع که خاصیت گفته شده را دارا میباشند، راهکار تعریف به صورت inline تعریف شده است. بدین صورت که اگر ما در طی برنامه از کلمه کلیدی inline قبل از تعریف تابع استفاده کنیم، این امر موجب میشود که کد تابع در هنگام اجرای برنامه در جایی که تابع فراخوانی میشود کپی شده و دیگر تاخیر زمانی بابت فراخوانی، بازگشت و اجرا نداریم.

 

قالب های تابع(function template):

در توابع عم نام اگر تعداد آرگومان ها یکسان باشد و بدنه ی اجرایی تابع نیز به یک شکل باشد و فقط توابع در نوع بازگشتی و نوع آرگومانها تفاوت داشته باشند، می توان به جای نوشتن هر تابع از یک قالب تابع استفاده کرد. به شکل زیر و با کلمه ی کلیدی template:

 

 

template

T A ( T1, T2, ...)

{

...

}

 

//end

در بالا منظور از T هر نوع داده ای(مانند int) و از A نام تابع است. هم چنین T1, T2, ... آرگومان های تابع هستند.

لینک به دیدگاه

آرایه های یک بعدی:

تاکنون داده های ورودی و بقیه داده های مورد نیاز را در متغیر ها و ثابت ها ذخیره میکردیم. اما اگر تعداد ورودی ها زیاد باشد، نیاز داریم تعداد زیادی متغیر را تشکیل دهیم که این کار باعث میشود روند عملیات برنامه نویسی بسیار پیچیده شود. بنابراین برای جلوگیری از این مشکلات میتوانیم از امکان تعریف آرایه ها در زبان ++C بهره مند شویم.

آرایه ها خانه های پشت سر هم در حافظه هستند که همگی از یک نوع و با یک نام و با شماره های خانه متفاوت(اندیس آرایه) هستند.

 

روش تعریف آرایه یک بعدی:

;[طول آرایه]نام آرایه نوع آرایه

روش تعریف یک آرایه یک بعدی که به آن لیست (List) هم میگویند به صورت فوق است. در این روش دقت میکنیم که نوع آرایه می تواند از انواع داده ها(Data Types) قابل استفاده در زبان ++C باشد و نام انتخابی برای آرایه چون یک شناسه است، باید از قوائد تولید شناسه در زبان ++C تبعیت کند.

 

نکته: محل هر عضو از آرایه توسط شماره(اندیس) که در [] می گذاریم، مشخص میشود.

 

نکته: اندیس شروع آرایه در زبان ++C صفر میباشد یعنی شماره گذاری خانه های آرایه از 0 شروع میشود و خانه ی اول آرایه اندیس 0 دارد.

 

نکته: در زبان ++C اسم آرایه آدرس خانه ی اول آرایه است.

لینک به دیدگاه

حالا که آرایه ها رو معرفی کردیم، سورس یک برنامه ی جالب و معروف میزارم که الگوریتمشو خودم نوشتم.

این برنامه که اسمش مربع جادویی هست، ابتدا تعداد سطر و ستون رو که باید عددی فرد باشه از کاربر میگیره و بعد مربع رو درست میکنه.

تو این مربع جمع اعداد هر سطر، ستون و ضربدری با هم برابره و هم چنین ضربدر چپ به راست، هر دفعه عددش یک واحد کم میشه. مثال(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

لینک به دیدگاه

سورس برنامه ای که از کاربر میپرسد روز اول سال چند شنبه است و براساس آن، چند شنبه بودن 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

لینک به دیدگاه

مقدار دهی اولیه به آرایه تک بعدی:

 

در هنگام تعریف میتوان خانه های یک آرایه ی یک بعدی را مقداردهی اولیه نمود، در این حالت حداقل یک مقدار و حداکثر به تعداد عناصر آرایه میتوان مقدار دهی را انجام داد.

مقدار دهی به آرایه هنگام تعریف آن باید از خانه ی اول، پشت سر هم و به صورت پیوسته انجام شود.

 

مثال:

 

int x[3] = {10};

int x[3] = {10, 20};

int x[3] = {10, 20, 30};

 

//end

 

 

خالی گذاشتن بُعد آرایه هنگام تعریف:

 

در زبان c++ در آرایه های یک بعدی فقط به شرطی میتوان بعد آرایه را خالی گذاشت که هنگام تعریف آن مقدار دهی نماییم، در غیر این صورت خطا خواهیم داشت.

 

مثال درست:

 

int x[] = {10, 20, 30};

 

//end

لینک به دیدگاه

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


×
×
  • اضافه کردن...