آموزش C از پایه

وضعیت
موضوع بسته شده است.

dark-man

Member
حلقه Do-While

حلقه Do-While

حلقه Do-While تا حد زیادی شبیه به حلقه While می باشد به شکل کلی آن توجه کنید ...
کد:
[left]
do{دستور
}while(شرط  );

[/left]


تنها فرق آن با حلقه While این است که وقتی کامپایلر به حلقه میرسد ابتدا دستورات یک بار اجرا می شوند و سپس به سراغ شرط حلقه می رود ....توجه داشته باشید که این حلقه نیز همانند حلقه While در صورت درست بودن شرط تکرار می شود یعنی تا زمانی که شرط تعین شده صدق کند حلقه ادامه می یابد ...
به مثال زیر دقت فرمایید
کد:
[left]


do
sum=a+b;
while(a<=10);

[/left]



همانطور که می بینید هنگامی که فقط یک دستور باشد از ; در پایان دستور استفاده می شود


مثال زیر را ببینید
کد:
[left]

do{
printf("iran");
a=b;
scanf("%d",&a);
}while(s>10);

[/left]
این هم مثالی برای وقتی که بیش از یک دستور داشته باشیم


------------------------------
همانند حلقه While این حلقه نیز چون افزایشگری(یا کاهشگری) ندارد ما باید خودمان این افزایشگر یا کاهشگر را در حلقه تعبیه کنیم (در جای لازم )....
-----------------------------------

مثال :برنامه ای بنویسید که واژه Dreamer را 9 بار با استفاده از حلقه do while چاپ کند

(این مثال را به 2 راه افزایشی و کاهشی حل خواهیم کرد )


1-افزایشی :

کد:
[left]

#include <stdio.h>
#include <conio.h>
void main()
{
int i=0;
do{
printf("Dreamer");
i++;
}while(i<8);
getch ();
}

[/left]
2- کاهشی :
کد:
[left]

#include <stdio.h>
#include <conio.h>
void main()
{
int i=8;
do{
printf("Dreamer");
i--;
}while(i<0);
getch ();
}


[/left]
 

***UNIQUE***

Active Member
آموزش | توابع (قسمت اول )

بسياري از برنامه هايي که مسائل جهان واقعي را حل مي کنند برنامه هاي بزرگي هستند و بهترين راه طراحي برنامه هاي بزرگ ساخت آن از طريق قطعات کوچک است با اين روش مديريت و بررسي هر يک از آنها راحت تر از برنامه اصلي است .به هر يک از اين قطعه برنامه ها تابع يا Class مي گويند.
انگيزه هاي متعددي براي نوشتن برنامه ها با استفاده از توابع وجود دارد . قابليت استفاده مجدد از نرم افزار که از توبع موجود به عنوان پايه و اساس ايجاد برنامه هاي جديد استفاده مي کنند.و همين قابليت جلوگيري استفاده مجدد از نرم افزار عامل اصلي برنامه نويسي شي گرا است. انگيزه ديگر در استفاده توابع از تکرار شدن قطعه برنامه هاي تکاري است. بسته بندي قطعه برنامه ها به صورت تابع به شما اجازه مي دهد که از چند جاي مختلف در برنامه از طريق فرخواني تابع يک قطعه برنامه را چند سري اجرا کنبد .
شما مي توانيد توابعي براي تعريف کارهاي مشخص بنويسيد که بتوانيد از انها در نقاط مختلف برنامه استفاده کنيد همچنين انتخاب نام مناسب براي توابعي که تعريف مي کنيم و اينکه تابع يک کار خاص انجام دهد قابليت استفاده مجدد از نرم افزارمان را افزايش مي دهد .
يک تابع با احضار تابع فراخوانده مي شود تا کار خاصي را انجام دهد براي احضار تابع نام تابع و پارامترهايي که تابع احضار شده براي کارش به آن نيازمند است ذکر مي شود.
معمولا" توابع با نوشتن نام تابع و به دنبال آن , پرانتز باز و در داخل آن آرگومان تابع ( يا ليستي از آرگومان ها که با کاما از هم جدا مي شوند )قرار مي گيرد و بعد از آن پرانتز بسته مي آيد .
برای مثال اگر بخواهیم ریشه دوم 900 را محاسبه و آن را در خروجی چاپ کنبم میتوانیم از دستور زیر استفاده کنیم
کد:
cout <<sqrt(900.0);
با اجرای این دستور تابع ریاضی ()Sqrt برای محاسبه ریشه دوم عدد داخل پرانتز(در اینجا عدد 900.0)فرخوانی میشود (در اینجا عدد 900.0 آرگومان تابع sqrt می باشد)
این دستور عدد 30 را در خروجی چاپ می کند تابع sqrt آرگومانی از نوع Double گرفته و نتیجه ای با فرمت Double برمیگرداند تمام توابع کتابخانه ای ریاضی داده ای از نوع Double برمیگردانند
برای استفاده از این توابع (کتابخانه ای ریاضی) باید math.h را به اول برنامه خود اضافه کنیم ( math.h در کتابخانه استاندارد جدید cmath نامگذاری شده).
برای هر تابع کتابخانه ای که در برنامه استفاده می کنیم باید سرفایلهای مربوطه را در اول برنامه اضافه کنیم (برای مثال سرفایل math.h را هنگام استفاده از توابع کتابخانه ای ریاضی) اگر سرفایلهای مربوطه را اضافه نکنیم با خطای دستوری مواجه می شویم )

برنامه مثال بالا :
کد:
#include <conio.h>
#include <iostream.h>
#include <math.h>
main()
{
	cout <<sqrt(900.0);
   getch();
}

پارامترهای توابع ثابت و متغیر و یا عبارت می توانند باشند به طور مثال برای دستور بالا :

اگر c1 = 13.0 , d = 3.0 , f = 4.0 باشد

در این صورت دستور زیر
کد:
cout << sqrt(c1 + d + f);
جذر عبارت 4.0 * 3.0 + 13.0 را محاسبه می کند و خروجی 5 را می دهد ( زیرا معمولا" در ++C نقطه اعشار یک عدد اعشاری که قسمت اعشاری ندارد یا صفرهای ابتدای عدد
چاپ نمی شود)
4 نمونه از توابع کتابخانه ای ریاضی در فایل زیر آورده شده
منبع : C++ How TO PROGRAM
 

پیوست ها

  • تابع.zip
    3.3 کیلوبایت · بازدیدها: 75

dark-man

Member
شرط (قسمت اول )

نحوه کار با دستور If:

در این درس نحوه کار با دستور If وIf-elseوIf-else-If را فرا خواهیم گرفت ...
در ابتدا با دستور ساده If شروع خواهیم کرد ..
دستور If زمانی استفاده می شود که ساختار شرط ما فقط یک حالت دارد یعنی اینکه هنگامی که کامپایلر به دستور If می رسد آن را برسی می کند و اگر شرط درون If درست بود به دستور داده شده می پردازد و اگر شرط درست نبود به خط بعد از شرط می رود و روند برنامه ادامه پیدا می کند(این در حالتی است که else نداشته باشیم )...

شکل کلی دستور If به صورت زیر می باشد :
کد:
[left]
if(  شرط )
دستور;
[/left]


در زیر نیز مثالی را می بینید که از شرط If استفاده شده است ...
کد:
[left]
int a;
scanf("%d",&a);
if (a>3)
printf("Your number is bigger than 3");
printf("Your number is lower than 3");
.
.
.
[/left]


خوب بیایید با هم مثال بالا را مرور کنیم :

در ابتدا یک متغیر از نوع int ایجاد کردیم و سپس برنامه را منتظر ورود یک عدد از ورودی گذاشیم تا کاربر عددی را به ورودی وارد کند ..سپس یک شرط برای برنامه تعیین کردیم که اگر عدد ما از 3 بزرگتر بود چاپ کند که عدد ما بزرگتر از 3 است ...(این دستور (( Your number is bigger than 3 )) زمانی اجرا می شود که شرط ما درست باشد )و اگر شرط ما درست نباشد (یعنی اگر کابر عددی بزرگتر از کوچکتر از 3 را وارد کرده باشد ) برنامه به خط پایین دستور شرط می رود و چاپ می کند که عدد ما کوچکتر از 3 بوده است ((Your number is lower than 3)) ..و به ادامه روند برنامه می پردازد


حال اگر شرط ما بیش از یک دستور داشت از قاعده زیر پیروی می کنیم
کد:
[left]
if( شرط   )
{
 دستور;
دستور;
.
.
}
[/left]


یک مثال :

کد:
[left]
int b;
scanf("%d",&b);
if(b<1000)
{
printf("Your numer is acceptable");
d=b-2;
}

[/left]
 

dark-man

Member
شرط (قسمت دوم )

دستور if-else :

این دستور هنگامی بکار می رود که ما برای برنامه شرطی تعیین کنیم و بخواهیم در صورت درست بودن شرط یک (یا چند) کار و در صورت غلط بودن یک (یا چند ) کار دیگر را انجام دهد ....

شکل کلی دستور به صورت زیر می باشد :

کد:
[left]
if (  شرط   )
دستور;
else
دستور;

[/left]



و اگر بخواهیم به جای یک دستور از چند دستور استفاده کنیم :

کد:
[left]

if ( شرط )
{
دستور;
دستور;
}
else 
{
دستور;
دستور;
}
[/left]



به مثال زیر توجه کنید :


کد:
[left]
a,b , max=0;
scanf("%d%d",&a,&b);
if (a<b)
{
printf("%d is bigger than %d",b,a);
printf("\n try again ");
}
else
{ 
print("%d is bigger than(or equall ) %d",a,b);
max=a;
}
.
.
.
 
[/left]



در مثال بالا سه متغیر از نوع int تعیین کرده ایم و سپس برنامه را به انتظار ورود 2 عدد از سوی کاربر گذاشته ایم ..سپس شرطی تعیین کرده ایم که اگر ورودی اول کاربر کوچکتر از ورودی دوم باشدبرنامه به ما بگوید که عدد دوم بزرگتر از عدد اول است و همچنین پیغام دهد که مجدد تلاش کن ...
اگر شرط درست نبود (در بخش else) معین کردیم تا چاپ کند که عدد اول بزرگتر یا مساوی عدد دوم است و همچنین عدد اول را در متغیر max بریزد ....
 

dark-man

Member
شرط (قسمت سوم )

if-else-if :

این نوع از شرط زمانی به کار می رود که چندین شرط را تعین کنیم (به اصطلاح به آن حلقه های شرطی تو در تو می گویند )...
شکل کلی آن نیز به صورت زیر می باشد :


کد:
[left]
if (شرط   )
دستور;
else if ( شرط  )
دستور;
else ......
[/left]


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

برای درک بهتر موضوع به مثال زیر توجه کنید :

در این مثال برنامه می خواهد نمره یکی از درس های یک دانشجو را از ورودی بخواند و طبق شرط های تعین شده عمل کند :


کد:
[left]
int grade;
printf("Enter studet`s Grade");
scanf("%d",&grade);
if (grade<10)
printf("Fail");
else if (grade>=10 && grade<12)
printf("Bad");
else if (grade>=12 && grade<15)
printf("Not Bad");
else if (grade>=15 && grade<17)
printf("Good");
else if (grade>=17 && grade<=20)
printf("Exelent");
else 
printf("You Enter Wrong Number");
.
.
.
.
[/left]






بیایید مثال بالا را بررسی کنیم :


در ابتدا متغیری به نام grade را تعریف کرده ایم و سپس دستور چاپ عبارت (( نمره دانشجو را وارد کن)) را داده ایم :
کد:
[left]
int grade;
printf("Enter studet`s Grade");
[/left]

سپس دستور داده ایم تا برنامه نمره دانشجو را از ورودی بگیرد

کد:
[left]
scanf("%d",&grade);
[/left]

با دریافت نمره دانشجو از ورودی برای برنامه شرط تعین کرده ایم (اولین شرط) که اگر نمره دانشجو زیر 10 است عبارت (( رد )) را چاپ کند

کد:
[left]
if (grade<10)
printf("Fail");
[/left]

اگر شرط(شرط اول ) درست نبود یک شرط دیگر مطرح شود (شرط دوم ) که اگر نمره دانشجو بین 10 و 12 بود عبارت (( بد )) را چاپ کند

کد:
[left]
else if (grade>=10 && grade<12)
printf("Bad");
[/left]

اگر شرط دوم نیز درست نبود یک شرط دیگر تعین کرده ایم (شرط سوم ) که اگر نمره دانشجو بین 12 و 15 بود عبارت (( بد نیست )) را چاپ کند

کد:
[left]
else if (grade>=12 && grade<15)
printf("Not Bad");
[/left]

اگر شرط سوم نیز درست نبود مجددا شرطی تعین کرده ایم (شرط چهارم ) که اگر نمره دانشجو بین 15 و 17 بود عبارت (( خوب )) را چاپ کند

کد:
[left]
else if (grade>=15 && grade<17)
printf("Good");
[/left]

اگر شرط چهارم هم درست نبود نیز یک شرط دیگر تعین کرده ایم (شرط پنجم ) که اگر نمره دانشجئ بین 17 و 20 بود عبارت (( عالی )) را چاپ کند

کد:
[left]
else if (grade>=17 && grade<=20)
printf("Exelent");
[/left]

و اگر هیچ کدام از شرط ها درست نبود چاپ کند(( شما نمره اشتباه وارد کرده اید ))..(چون امکان دارد کاربر نمره ای بالاتر از 20 به ورودی داده باشد )...

کد:
[left]
else 
printf("You Enter Wrong Number");
[/left]


موفق باشید
 

***UNIQUE***

Active Member
آموزش | توابع (قسمت دوم )

به نام خدا
تمام متغیرهایی که داخل توابع تعین می شوند متغیرهای محلی هستند که فقط در داخل تابعی مه تعریف شده اند شناخته شده هستند .اکثر توابع دارای لیستی از پارامترها هستند که وسیله ای برای انتقال اطلاعات بین توابع فرام میکنند. پارامترهای یک تابع متغیرهایی محلی هستند اکنون با بررسی یک تابع توضیح میدهیم یک برنامه نویس چگونه میتواند توابعی به دلخواه خود بنویسد
این برنامه را که شامل تابع ()square - تابعی تعریف شده توسط کاربراست - در نظر میگریم
این برنامه مربع اعداد صحیح از 1 تا 10 را محاسبه میکند
کد:
#include <conio.h>
#include <iostream.h>

int square(int);   //function prototype
int main()
{
	for(int x=1;x<=10;x++)
		cout<<square(x)<<" ";
	cout <<endl;
   getch();
	return 0 ;
}
//Function definition
int square(int y)
{
	return y*y;
}

نمونه خروجی این برنامه به صورت زیر است
کد:
1  4  9  16  25  36  49  64  81  100

- سعی کنید برای جدا کردن توابع و افزایش خوانایی برنامه خود بین تعریف توابع یک خط خالی بگذارید. -
با دستور زیر تابع ()square فراخوانده ( احضار) می شود
کد:
square(x);

این تابع یک کپی از مقدار x را دریافت می کند و در پارامتر y قرار می دهد , سپس مقدار y * y را محاسبه می کند نتیجه به جایی در main برمی گردد که این تایع (تابع ()square ) فراخوانی شده و سپس نتیجه در خروجی چاپ می شود.
توجه داشته باشید که مقدار x با فراخوانی تابع تغییر نمی کند. و این عمل با استفاده از حلقه تکرار for به تعداد 10 مرتبه تکرار می شود.
تعریف square که به صورت (square(int y است نشان می دهد که این تابع انتظار دارد پارامتر ورودی اش یک عدد صحیح باشد کلمه کلیدی int قبل از تابع نشان می دهد که این تابع عدد صحیح به عنوان خروجی برمی گرداند - اگر نوع داده برگشتی هم مشخص نمی شد به طور پیش فرض int بود اما با وجود این بهتر است همیشه نوع داده برگشتی را واضح مشخص کنید - دستور return در تابع ()square نتیجه محاسبه را به تابع احضار کننده برمی گرداند.
به خط زیر در برنامه بالا پیش نمونه تابع می گویند.
کد:
int square(int);   //function prototype
کامپایلر با مراجعه به پیش نمونه تابع بررسی می کند که آیا در تابع احضار شده نوع داده برگشتی و تعداد آرگومان ها و نوع داده ای آرگومان ها و ترتیب آرگومان ها درست است یا خیر.
اگر تعریف تابع قبل از اولین استفاده تابع در برنامه نشان داده شود دیگر احتیاجی به پیش نمونه تابع نیست در این وضعیت تعریف تابع نقش پیش نمونه تابع را نیز ایفا می کند.
به طور مثال در برنامه بالا اگر خطوط
کد:
//Function definition
int square(int y)
{
	return y*y;
}
قبل از main در برنامه قرار می گرفتند دیگر احتیاجی به پیش نمونه تابع در برنامه نبود
به این ترتیب تعریف کلی تابع دارای صورت زیر است

(لیست پارامترها) نام تابع نوع داده برگشتی
}
توضیحات و دستورات
{


نام تابع هر شناسه مجازی می تواند باشد. نوع مقدار برگشتی نوع داده نتیجه برگرداننده شده از تابع به احضار کننده است در صورتی که نوع مقدار برگشتی void باشد نشان می دهد که تابع هیچ مقداری برنمی گرداند و در صورتی که برای مقدار برگشتی نوع مشخص نشده باشد پیش فرض آن برای سیستم int خواهد بود.

خطاهایی که ممکن است در این مورد با آن مواجه شویم

- اگر در پیش نمونه تابع نوع داده برگشتی بغیر از int باشد حذف نوع مقدار برگشتی در یک تابع خطای دستورس بحساب می آید
- اگر فراموش کنیم یک مقدار برای تابعی که قرار است مقداری را برگرداند برگردانیم با خطای دستوری (syntax error) مواجه می شویم.
- اگر برای تابعی که نوع برگشتی آن void اعلان شده مقداری را برگردانیم خطای دستوری محسوب می شود.
- اگر بعد از پرانتز بستهء حاوی لیست پارامترهای تعریف تابع سمیکالن قرار دهیم خطای دستورس بحساب می آید.
- تعریف کردن دوباره پارامتر تابع به صورت متغیر محلی در داخل تابع خطای دستوری بحساب می آید.
- پارامترهایی از تابع که همنوع هستند را مثلا" به جای اعلان به صورت float x, float y به صورت float x,y تعریف کنید اعلان پارامترها به صورت float x, float y باعث تولید خطای زمان کامپایل می شود زیرا هم پارامتر داخل لیست پارامترها خود به یک نوع داده نیازمند است.
- در احضار تابع در واقع یک عملگر ++C است که باعث احضار تابع می شود اگرتابعی که هیچ آرگومانی را نمی گیرد احضار کنیم خطای دستوری رخ نمی دهد اما وقتی بخواهیم تابع را احضار کنیم تابع فراخوانی نمی شود.اعلان ها و دستورهای داخل آکولادهای باز و بسته بدنه تابع را تشکیل می دهند. بدنه تابع دستور مرکبی است که اعلان ها داخل آن قرار می گیرند.متغیرها را می توان در هر بدنه ای از تابع تعریف کرد و بدنه ها می توانند تو در تو باشند اما تحت هیچ شرایطی نمی توان تابعی داخل تابع دیگر تعریف کرد.
- اگر یک تابع را داخل تابعی دیگر تعریف کنیم با خطای دستوری مواجه می شویم.
- اگر پیش نمونه تابع و عنوان تابع و احضارهای تابع از نظر تعداد و نوع داده ای و ترتیب قرار گرفتن آرگومان ها و نوع مقدار برگشتی با هم هماهنگی نداشته باشند با خطای دستوری مواجه می شویم

نکاتی درباره مهندسی نرم افزار

- با اینکه استفاده از یک نام برای آرگومان های منتقل شده به یک تابع و پارامترهای متناظرش عملا" کاری اشتباه نیست اما پیشنهاد می کنیم از اینکار خودداری کنید زیرا با جلوگیری از این کار از ایجاد ابهام در برنامه جلوگیری می کنید.
- بهتر است برای خوانایی بیشتر برنامه ها و استفاده کمتر از توضیحات (Comment) برای توابع و پارامترها نامهایی با معنی انتخاب کنبم.
- تابع باید به اندازه ای باشد که در پنجره یک ویرایشگر جای گیرد. هرتابع باید یک کار خاص انجام دهد. اینکار قابلیت استفاده مجدد نرم افزار را افزایش می دهد.
- برای اینکه نوشتن و اشکال زدایی و ویرایش و نگهداری و تغییر برنامه ها آسان شود برنامه ها باید به صورت مجموعه ای از توابع کوچک نوشته شوند.
- توابعی که نیازمند پارامترهای زیادی هستند حتما" کارهای زیادی نیز می توانند انجام دهند بهتر است یک تابع بزرگ را به توابعی کوچکتر که کارهایی مستقل می توانند انجام دهند تبدیل کنید. عنوان تابع در صورت امکان در یک خط باید قرار داده شود.

منبع : C++ How TO PROGRAM
 
آخرین ویرایش:

dark-man

Member
آموزش Switch

در این پست قصد دارم تا شما را با Switch آشنا کنم ....

Switch کاربردی شبیه به If دارد با تفاوت هایی که در زیر به آن اشاره خواهم کرد :
در ابتدا اجازه دهید تا مقداری شما را با Switch آشنا کنم ...

فرض کنید ما در یک برنامه قصد داریم شرطی را تعیین کنیم که بر فرض با زدن عدد 1 یک کار انجام دهد و با زدن عدد 2 یک کار دیگر انجام دهد و... یا در یک مثال دیگر می خواهیم برنامه ای بنویسیم که اگر عملگر جمع را وارد کردیم برنامه عمل جمع را انجام دهد ویا اگر عملگر ضرب را وارد کردیم برنامه عمل ضرب را انجام دهد و.....

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

برای درک بهترابتدا به شکل کلی دستور Switch توجه فرمایید :


کد:
[left]

switch ( عملگر   ){
case حالت     :
    دستور   ;
   break ;
case حالت     :
  دستور   ;
   break;
.
.
.
.
   default:


}

[/left]



بیایید با هم نحوه نوشتن برنامه ای که در بالا مثال زدم ( می خواهیم برنامه ای بنویسیم که اگر عملگر جمع را وارد کردیم برنامه عمل جمع را انجام دهد ویا اگر عملگر ضرب را وارد کردیم برنامه عمل ضرب را انجام دهد و.....) را با استفاده از Switch را پیاده سازی کنیم تا بیشتر با Switch آشنا شویم :

کد:
[left]
char operator;
scanf("%c",&operator);
switch (operator){
case '+' :
d=a+b ;
break;

case '-'  :
d=a-b;
break;

case ' * '  :
d=a*b;
break;

case '/' :
d=a/b;
break;

default :
printf("Wrong Entry");

}
[/left]


در ابتدا مشاهده می کنید که متغیری به نام operator (عملگر ) را که از نوع کاراکتری است تعریف کرده ایم سپس برنامه را به انتظار ورود کاراکتری گذاشته ایم تا کاربر کاراکتری را وارد کند ....
کد:
[left]

char operator;
scanf("%c",&operator);

[/left]
سپس برای برنامه یک Switch تعریف کرده ایم ( باید در داخل پرانتز بعد از Switch متغیری که می خواهیم در شرط Switch قرار گیرد را بنویسیم که در اینجا operator می باشد)...

کد:
[left]
switch (operator){
[/left]

خوب در ابتدا حالتی که + باشد را تعریف کرده ایم و گفته ایم که اگر + بود دو متغیر a ,b را با هم جمع کن و درون d بریز :

کد:
[left]

case '+' :
d=a+b ;
break;

[/left]


دستور break برای این تعبیه شده است که وقتی که شرطی درست بود و برنامه به دستورات آن شرط عمل کرد از حلقه به بیرون بپرد (یعنی بر فرض اگر کاربر در این برنامه عملگر + را وارد کرده است دستور مربوط به آن ( یعنی ریختن مجموع a ,b در d ) را انجام بدهد و سپس از حلقه (دستور Switch ) بیرون آید ) ....


حال اگر کاربر + را وارد نکرده بود شرط Switch به حالت دوم می رود و چک می کند که آیا کاربر را وارد کرده است و اگر شرط صدق کرد (یعنی در حالتی که کاربر را وارد کرده باشد ) دستور مربوط به آن حالت ( یعنی کم کردن b از a و ریختن آن در d ) را انجام دهد ...

کد:
[left]
case '-'  :
d=a-b;
break;
[/left]

برای دو حالت ضرب و تقسیم هم روال یکی می باشد :

کد:
[left]
case ' * '  :
d=a*b;
break;

case '/' :
d=a/b;
break;

[/left]

حال اگر کاربر هیچکدام از 4 دستور بالا را وارد نکرده بود ( یعنی عملگرهای جمع . تفریق.ضرب .تقسیم ) برای برنامه حالتی را تعریف کرده ایم تا پیغام ( یا دستور ) مناسب را انجام دهد ... پس دستور default را در Switch برای این استفاده می کنیم که اگر هیچکدام از حالت های تعریف شده در Switch صدق نکرد دستور ( یا دستورات ) مناسب را انجام دهد ... که برای ما در این برنامه ای که نوشتیم این است که بگوید ورودی اشتباه است ...

کد:
[left]

default :
printf("Wrong Entry");

[/left]


-----------------------------------------------------------------------------------------------------------------
حال که با Switch آشنا شدید اجازه دهید تا دو نکته را در مورد Switch بگویم :

مهمترین تفاوت Switch با If این است که دستور If را می تواند عبارت منطقی یا رابطه ای را بررسی کند ولی Switch فقط می تواند مساوی بودن مطلب را بررسی کند

اگر در Switch دستور default را به کار نبریم برنامه تمامی حالت هایی که ما تعریف کرده ایم را بررسی می کند و اگر هیچکدام از آنها درست نبود بدون هیچ کار خاصی از Switch بیرون می آید


امیدوارم که با کاربرد Switch به خوبی آشنا شده باشید


موفق باشید
 

***UNIQUE***

Active Member
آموزش| توابع (قسمت سوم)

به نام خدا
در ++C اگر تابع نتيجه اي را برنگرداند فقط زماني که اجراي تابع به آکولاد بسته پايان تابع يا دستور ;return مي رسد کنترل از آن برمي گردد . واگر تابع نتيجه اي را برگرداند دستور ;return expression مقدار نتيجه عبارت (expression) را به احضار کننده تابع برمي گرداند.
مثال زير از تابع Macimum (که تابعي تعريف شده توسط برنامه نويس است) استفاده مي کند و بزرگترين عدد ميان سه عدد صحيح را پيدا کرده و آنرا به عنوان نتيجه برمي گرداند
روال کار اين برنامه بدين صورت است که ابتدا سه عدد صحيح را از ورودي مي گيرد آنها را به تابع Maximum انتقال مي دهد در اين تابع بزرگترين عدد صحيح پيدا مي شود و سپس به تابع Main برگردانده مي شود و در خروجي چاپ ميشود.
کد:
#include <iostream.h>
#include <conio.h>

int maximum(int, int, int); /* پيش نمونه تابع */

int main()
{
	int a, b, c;
   cout << "Enter three integers : ";
   cin >> a >> b >> c;

   /*  آرگومانها براي صدا زدن تابع ماکزيمم هستند  a, b , c */
   cout << "Maximum is: " << maximum(a, b,c) << endl;
   getch();
   return 0;
}

/*تعريف تابع ماکزيممهستند
 maximum پارامترهاي تابع x,y,z */

int maximum(int x, int y, int z)
{
	int max = x;
   if(y > max)
   {
   	max = y;
   }
   if(z > max)
   {
   	max = z;
   }

   return max;
}

نمونه خروجي اين تابع
کد:
Enter three integers : 9 8 95
maximum is : 95
پيش نمونه تابع يکي از مهمترين ويژگيهاي ++C است .پيش نمونه تابع اطلاعاتي از قبيل نام تابع و نوع داده برگشتي تابع وتعداد پارامترهايي که تابع بايد دريافت کند و اوناع پارمترها و ترتيب قرار گرفتن آنها را به کامپايلر ميدهد.و کامپايلر از پيش نمونه تابع براي بررسي درست بودن احضارهاي تابع استفاده مي کند. در نسخه هاي اوليه C اين نوع بررسي انجام نمي شد به همين دليل امکان داشت که احضارهاي تابع بدون کشف خطا و به صورت نادرست انجام شود . اينگونه احضارهاي نادرست مي توانست به خطاهاي fatal , nonfatal (مخرب و غير مخرب)(خطاهاي ظريف منطقي که پيدا کردن آنها به سادگي امکان پذير نبود) زمان اجرا منجر شود. پيش نمونه توابع اين مشکلات را برطرف کرده.
يکي از ويژگيهاي مهم پيش نمونه توابع تبديل نوع آرگومانهاست .يعني آرگومانها را وادار به تبديل به يک نوع خاص کنيم
براي مثال تابع رياضي کتابخانه اي ()sqrt را حتي اگر پيش نمونه تابع در سرفايل math.h يک ارگومان Double براي آن مشخص کرده .مي توان با يک آرگومان صحيح احضار کرد و باز هم تابع همچنان به درستي کار خواهد کرد.
دستور
کد:
cout << sqrt( 4 );
مقدار (sqrt(4 را به درستي ارزيابي کرده و مقدار 2 را در خروجي چاپ مي کند.
پيش نمونه تابع سبب مي شود کامپايلر قبل از انتقال مقدار به تابع ()sqrt مقدار آرگومان 4 را که مقداري صحيح است به مقدار 4.0 از نوع double تبديل کند.
به صورت کلي قبل از احضار تابع مقاديري از آرگومان ها که با انواع داده اي پيش نمونه تابع متناظر نيستند به نوع درست تبديل مي شوند.
اگر از قوانين ارتقاء نوع در ++C پيروي نکنيم اين تبديلات منجبر به نتايج نادرست مي شود.اين قوانين (قوانين ارتقاء نوع) مشخص مي کنند که چگونه انواع داده اي به انواع داده اي ديگر تبديل مي شوند بدون اينکه اطلاعاتي در اين تبديلات از بين برود.در ()sqrt مثال بالا نوع int به صورت اتوماتيک به نوع double تبديل شد بدون اينکه در تبديلات اطلاعاتي از بين برود.تبديل انواع داده اي بزرگتر به انواع داده اي کوچکتر(مثلا" تبديل بلند long به کوتاه short) باعث مي شود که مقادير آنها تغيير کند.
استفاده معمول ارتقاء نوع در هنگامي است که نوع آرگومان تابع با نوع پارامتر مشخص شده در تعريف تابع سازگار نيست تبديل مقادير به کوچکترين نوع داده ميتواند منجر به مقادير نادرست شود.مقادير آرگومان تابع به نوع پارامتر پيش نمونه تابع تبديل مي شوند دقيقا" مثا اينکه در متغير هايي از آن نوع جايگزين شده اند . اگر تابع ()square در زير
کد:
//Function definition
int square(int y)
{
	return y*y;
}
که از يک پارامتر صحيح استفاده مي کند با آرگومان اعشاري احضار شود اين آرگومان به نوع int کوچکترين نوع تبديل مي شود و تابع ()square معمولا" يک مقدار نادرست بر مي گرداند .براي مثال (square(4.5 مقدار 16 را برميگرداندو 20.25 را برنمي گرداند.
ليست انواع داده اي از بالاتريد به پايين ترين نوع در زير آورده شده
کد:
long double
double
float
unsigned long int     (همنام با unsigned long)
long int                     (همنام با long)
unsigned int            (همنام با unsigned)
int
unsigned short int  (همنام با unsigned short)
short int                   (همنام با short)
unsigned char
short
char

خطاهايي که ممکن است در اين مورد با آن مواجه شويم

- فراموشي در قرار دادن سميکالن در پايان پيش نمونه توابع خطاي دستوري محسوب مي شود.
- اگر احضار تابعي با پيش نمونه تابع سازگار نباشد خطاي دستوري اتفاق مي افتد.
- اگر پيش نمونه تابع و تعريف تابع با هم سازگار نباشند اين نيز يک خطاي دستوري است.
به عنوان مثال اگر پيش نمونه تابع زير
کد:
int maximum(int x, int y, int z)
{
	int max = x;
   if(y > max)
   {
   	max = y;
   }
   if(z > max)
   {
   	max = z;
   }

   return max;
}
به صورت
کد:
void maximum(int x, int y, int z);
نوشته شود کامپايلر پيغام خطا مي دهد زيرا نوع برگشتي void در پيش نمونه تابع متفاوت با نوع برگشتي int در عنوان تابع است.
- در سلسله مراتب ارتقاء نوع تبديل از نوع داده بالاتر به نوع داده پايين تر مي تواند مقدار نوع داده را نيز تغير دهد.
- هنگامي که قبل از اولين احضار تابع تعريف نشده باشد , ننوشتن پيش نمونه يک تابع خطاي دستوري است.

نکاتي درباره مهندسي نرم افزار

- در ++C پيش نمونه توابع مورد نياز هستند براي بدست آوردن پيش نمونه توابع کتابخانه استاندارد از سرفايل کتابخانه هاي مربوط ,
از دستور پيش پردازنده include# استفاده مي کنيم
- اگر تعريف تابع قبل از اولين استفاده از تابع در برنامه ظاهر شود در آن صورت , احتياجي به پيش نمونه تابع نيست. در اين حالت تعريف تابع به صورت پيش نمونه تابع عمل
مي کند.

سرفايل ها :
هر کتابخانه استاندارد سرفايل مربوط به خود که شامل پيش نمونه تمام توابع در آن کتابخانه و تعريف هاي انواع داده اي مختلف و ثابتهاست که اين توابع به آنها نياز دارند را دارد
در ليست زير بعضي از سرفيل هاي کتابخانه استاندارد ++C ارائه شده
___________________________________________________________________
-------------------------------------------------------------------------------------------------------------------------
سرفايل کتابخانه استاندارد شرح عملکرد
-------------------------------------------------------------------------------------------------------------------------
<assert.h> حاوي ماکروها و اطلاعات تشخيص خطاست که به برنامه نويس در اشکال زدائي
کمک مي کند .

<ctyre.h> حاوي پيش نمونه توابعي است که کاراکتري را براي ويژگيهاي مشخص آزمايش
مي کند.و نيز حاوي پيش نمونه توابعي است که براي تبديل حروف کوچک به حروف
بزرگ به کارمي رود و برعکس .

<float.h> حاوي حدود اعشاري سيستم است.

<limits.h> حاوي حدود صحيح سيستم است.

<math.h> حاوي پيش نمونه توابع رياضي کتابخانه اي است.

<stdio.h> حاوي پيش نمونه توايع کتابخانه اي ورودي/خروجي استاندارد و اطلاعات مربوطه است
که توسط آنها مورد استفاده قرار مي گيرد.

<stdlib.h> حاوي پيش نمونه توابع تبديل اعداد به متن , متن به اعداد , تخصيص حافظه , اعداد تصادفي
و انواع ديگري از توابع مفيد است.

<string.h> حاوي پيش نمونه توابع پردازش رشته هاي زبان c است.

<time.h> حاوي پيش نمونه توابع و انواع داده اي براي کار با ساعت (time) و تاريخ (date) است.

<iostream.h> حاوي پيش نمونه توابع براي توابع ورودي و خروجي استاندارد است.

<iomanip.h> حاوي پيش نمونه توابع دستکاري کننده هاي جريان است که امکان فرمت بندي جريان
داده ها را فراهم مي سازد.

<fstream.h> حاوي پيش نمونه توابعي است که اطلاعات ورودي را از فايل روي ديسک مي خواند
و خروجي اش را در فايل روي ديسک مي نويسد.

___________________________________________________________________

شما مي توانيد سر فايل هايي را براي خود ايجاد کنيد . سرفايل هاي ايجاد شده توسط برنامه نويس بايد با h. به پايان برسد.
سرفايل هاي ايجاد شده توسط شما ميتوانند با دستور پيش پردازنده include# به برنامه اضافه شوند. براي مثال سرفايل
square.h با دستور زير مي تواند به بالاي برنامه اضافه شود
کد:
#include "square.h"
منبع : C++ How TO PROGRAM
 
آخرین ویرایش:
وضعیت
موضوع بسته شده است.

جدیدترین ارسال ها

بالا