• مشکی
  • سفید
  • سبز
  • آبی
  • قرمز
  • نارنجی
  • بنفش
  • طلایی
تعداد مطالب : 351
تعداد نظرات : 75
زمان آخرین مطلب : 6094روز قبل
کامپیوتر و اینترنت
آموزش زبان C بخش هجدهم
ارزش دهي اوليه به آرايه ها

گاهي ممكن است در هنگام تعريف آرايه ها خواسته باشيم مقاديري را نيز به آنها
نسبت بدهيم . به اين مقادير ارزش هاي اوليه آرايه مي گوييم . بايد توجه داشت
كه فقط آرايه هاي داراي كلاس هاي حافظه staticو externو مي توانند مقادير اوليه
را بپذيرند . براي ارزش دهي اوليه به آرايه ها از روش كلي زير مي توان استفاده
كرد : }
مقادير]={طول بعدnام [..].طول بعد دوم ][طول بعداول [ <كلاس حافظه ><نوع><اسم آرايه >

در روش كلي فوق ، كلاس حافظه ، يكي از كلاس هاي static و يا extern است و
مقادير كه در داخل {} قرار مي گيرند بترتيب به عناصر آرايه نسبت داده مي شوند.
يعني اولين مقدار به اولين عنصر ، دومين مقدار به دومين عنصر و n امين مقدار
به n امين عنصر آرايه نسبت داده مي شوند .
در مورد ارزش دهي اوليه به آرايه ها ، بايد دو نكته زير را در نظر گرفت : 1
اگر طول آرايه مشخص شود و تعداد مقاديري كه به آرايه نسبت داده مي شوند
كمتر از تعداد عناصر آرايه باشند ، بقيه عناصر صفر فرض خواهند شد . 2
اگر طول آرايه مشخص نشود ، به تعداد مقاديري كه به آرايه نسبت داده
مي شوند ، منظور خواهد شد .

مثال 1: نمونه اي از ارزش دهي اوليه به آرايه هاي يك بعدي . main)(
{
int i ;
static int array[5]={10/5/15/20/25};
static int table[]={5/6/8/9/11} ;
static int mix[5]={0} ;
printf("\n\t tehe result of " );
printf("operation is:\n\n\t" );
for(i=0 ; i<4 ; i++)
{
mix[i]=array[i]+table[i] ;
printf("%d\t"/mix[i] );
}
printf("%d\t"/mix[4] );
}

خروجي برنامه مثال 1 : the result of operation is:
15 11 23 29 0

در مثال 1 اولين دستور ، آرايه اي از نوع صحيح با كلاس حافظه static را تعريف
مي كند كه طول آن 5 بوده و مقادير 25 ، 20 ، 15، 5، و 10 را به عناصر آن نسبت
مي دهد . دومين دستور ، آرايه اي بنام table را با طول نامشخص تعريف مي كند و
و پنج مقدار 5، 6،، 8،، 9، و 11 را به آن نسبت مي دهد ، لذا كامپايلر طول اين
را 5 فرض خواهد كرد . سومين دستور آرايه اي بنام mix را با طول 5 تعريف مي كند
و به كليه عناصر آن مقدار صفر را نسبت مي دهد .
براي ارزش دهي اوليه آرايه دو بعدي و يا چند بعدي به دو روش مي توان عمل
كرد . اين دو روش با ذكر مثالي تشريح مي شود .

مثال 2: دستوراتي كه به دو روش ، آرايه دو بعدي را ارزش اوليه مي دهد : static int array[2][3]={1/2/3/4/5/6} ;
static int table[2][3]={3/4} ;
static int mix[2][3]={{1/2/3}/{4/5/6}};

اولين دستور، آرايه دو بعدي به ابعاد 2 x 3 را تعريف كرده و مقادير 1، 2، و 3
به سطر اول و مقادير 4، 5،و 6و به سطر دوم نسبت داده مي شوند . دومين دستور
مثال 2 آرايه اي دو بعدي با ابعاد 2 x 3 را تعريف مي كند و دو مقدار3و 4و را به
آن نسبت مي دهد كه 3 در محل table[1][1]و 4و در محل table[1][2] قرار مي گيرد
و بقيه عناصر آن صفر خواهند بود .
دستور سوم روش ديگري براي دستور اول است .

مثال 3: نمونه اي از ارزش دهي اوليه به آرايه سه بعدي . static intthreed[3][2][4]=
{{{1.2.3.4}/
{5/6/7/8}/}/
{{7/9/3/2}/
{4/6/8/3}/}/
{{7/2/6/3}/

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 21:57
کامپیوتر و اینترنت
آموزش زبان C بخش هفدهم
قسمت اول
آرايه ها

آرايه ، اسمي براي چند متغير همنوع است و يا بعبارت ديگر مجموعه اي است از
چند كميت كه داراي يك اسم باشند . به هر يك از اين كميت ها يك عنصر آرايه گفته
مي شود . دسترسي به هر يك از عناصر آرايه توسط نام آرايه و محل قرار گرفتن اين
عنصر در آرايه مشخص مي شود . نامگذاري براي آرايه ها از قانون نامگذاري براي
متغيرها تبعيت مي كند. بعنوان مثال ك مجموعه اي از دانشجويان يك كلاس مي توانند
تشكيل يك آرايه بدهند . اگر نام اين آرايه را Y انتخاب كنيم ، آنگاه (1)Y اولين
عنصر آرايه ، (2)Y دومين عنصر آرايه و بالاخره (n)Y، n امين عنصر آرايه را مشخص
مي كند . به هر يك از اعداد 1، 2، و ... و n كه محل قرار گرفتن يك عنصر را در
آرايه مشخص مي كنند ، انديس آرايه گفته مي شود . انديس آرايه ارتباط بين عناصر
آرايه را مشخص مي كند مثلا"(َ2)Y در آرايه قبل از (3)Y و بعد از (1)Y قرار دارد.
چون دسترسي به عناصر آرايه از طريق انديس امكان پذير است ، آرايه را متغير
انديس دار نيز مي گويند .
آرايه هاي داراي يك انديس را آرايه هاي يك بعدي ، آرايه هاي داراي دو انديس را
آرايه هاي دو بعدي و به طور كلي آرايه هاي داراي n انديس را آرايه هاي n بعدي
مي گويند .
آرايه ها و رشته ها دو قسمت مجزا نيستند زيرا : " رشته آرايه اي از كاراكترها
است " .

آرايه هاي يك بعدي
آرايه يك بعدي كه نام ديگر آن ليست است ، بصورت زير تعريف مي شود : ]
طول آرايه [ <نوع آرايه > <اسم آرايه >
نوع ، يكي از نوع هاي معتبر در زبان C مثل intو floatو است كه مشخص مي كند
هر يك از عناصر آرايه از چه نوعي هستند . طول آرايه ، عددي صحيح است كه تعداد
عناصر آرايه را مشخص مي كند . با استفاده از طول آرايه و نوع آن مي توان مشخص
كرد كه آرايه چند بايت از حافظه را اشغال مي كند :
طول آرايه * ( نوع آرايه ) = sizeof مقدار حافظه مورد نياز آرايه
انديس آرايه ها در زبان C از صفر شروع مي شود . بعنوان مثال اگر آرايه اي به
طول 5 داشته باشيم ، اولين متغير آن داراي انديس صفر و آخرين عنصر داراي انديس 4
خواهد بود .

مثال 1: int temp [5];

دستور فوق آرايه اي بنام temp و به طول 5 را تعريف ميكند كه همه عناصر آن از
نوع int هستند . شكل 1 نشان مي دهد كه چگونه مي توان به هر يك از عناصر آرايه temp
دسترسي پيدا كرد .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ temp | | | | | |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ temp [0] temp [1] temp [2] temp [3] temp [4]


شكل (1) . نحوه دسترسي به عناصر آرايه

نكته اي كه در مورد آرايه ها در زبان C بايد توجه داشت اين است كه در آن bounds checking
وجود ندارد. بعنوان مثال ، اگر آرايه اي بنام x و به طول 10 را
تعريف كرده باشيم ( با توجه به اين كه بزرگترين انديس آن 9 است ) ، مي توانيم
اين آرايه را با انديس هاي بزرگتر از 9 ( بدون اينكه از طرف كامپايلر C جلوي
آن گرفته شود ) مورد استفاده قرار دهيم . در اين مورد دستوراتي مثل y = x[10]
و k = x[n] ازنظر كامپايلر با اشكالي مواجه نخواهد شد. ولي بديهي است كه نتيجه
مطلوبي حاصل نخواهد شد. لذا برنامه نويس بايد مطلب فوق را در نظر داشته باشد تا
در نتيجه اجراي برنامه اشكالي پيش نيايد .

مثال 2: برنامه اي كه با تعريف يك آرايه به طول 10 ، مقدار هر عنصر آن را
برابر با انديس آن قرار داده و سپس با محاسبه مجموع مربعات عناصر آرايه ، آنها
را در خروجي چاپ مي كند . main)(
{
float list[20]/max ;
int i / j ;
for(i=0 ; i<20/i++)
{
printf("\n enter moadel %d :"/i+1);
scanf("%f"/&list[i] );
}
max=list[0] ;
j=1 ;
for(i=1 ;i<20 ; i++)
{
if(list[i]>max)
{
max=list[i] ;
j=i+1 ;
}
}
printf("\nmax=%f/position=%d"/max/j);
}

خروجي حاصل از برنامه مثال 2 : enter moadel 1 :12
enter moadel 2 :12.5
enter moadel 3 :10.75
enter moadel 4 :14
enter moadel 5 :13
enter moadel 6 :16
enter moadel 7 :17.25
enter moadel 8 :18.5
enter moadel 9 :17.5
enter moadel 10 :18.25
enter moadel 11 :19.5
enter moadel 12 :15.75
enter moadel 13 :16.25
enter moadel 14 :17.5
enter moadel 15 :18.5
enter moadel 16 :19.25
enter moadel 17 :20
enter moadel 18 :11.5
enter moadel 19 :10.5
enter moadel 20 :10.75

max=20.000000/position=17


مثال 3: برنامه اي كه با خواندن تعدادي عدد از ورودي ، آنها را در آرايه اي
قرار مي دهد . سپس اين آرايه را به طريق حبابي (bubble sort) مرتب مي كند . main)(
{
counst int k=7 ;
int temp[7]/i/j/item ;
for(i=0 ; i
{
printf("\n enter number %d:"/i+1);
scanf("%d"/&temp[i] );
}
printf("\n\t\t the intitial");
printf(" data are: " );
printf("\n\n\t\t" );
for(i=0 ;i<K;I++)
printf(" %3d"/temp[i] );
for(i=k-1 ;i>0;i)--
for(j=0;j
if(temp[j]>temp[j+1])
{
item=temp[j] ;
temp[j]=temp[j+1];
temp[j+1]=item ;
}

printf("\n\t\t the sorted data");
printf(" are: " );
printf("\n\n\t\t" );
for(i=0 ;i<K;I++)
printf(" %3d"/temp[i] );
}

نمونه اي از خروجي برنامه مثال 3 : enter number 1:10
enter number 2:1
enter number 3:20
enter number 4:6
enter number 5:45
enter number 6:34
enter number 7:47
the initial data are:
10 1 20 6 45 34 47
the sorted data are:
1 6 10 20 34 45 47


مثال 4: برنامه اي كه با خواندن تعدادي عدد از ورودي آنها را در يك آرايه
قرار داده ، سپس كليه عناصر آرايه را بر عنصر وسط تقسيم مي كند . اگر عنصر وسط
صفر باشد ، بر عنصر بعد از عنصر وسط و اگر اين عنصر نيز صفر باشد بر عنصر قبل
از عنصر وسط تقسيم مي كند . اگر اين عناصر صفر باشند براي پيدا كردن عنصري غير
صفر و انجام عمل تقسيم به ترتيبي كه در بالا گفته شد عمل مي كند و اگر چنانچه
كليه عناصر آرايه برابر با صفر باشند پيام مناسبي صادر مي شود ( تعداد عناصر
آرايه فرد است ) . main)(
{
int i/j/m/k/sign/y ;
const int n=9 ;
int list[9] ;
printf("\nenter 9 number and press");
printf(" enter\n");
for(i=0;i<N;I++)
scanf("%d"/&list[i] );
m=(n+1)/2-1 ;
k=list[m] ;
if(k==0)
{
j=1 ;
sign=1 ;
while(j<M)
{
y=0 ;
while(y<2)
{
k=list[m+j*sign] ;
sign=-sign ;
if(k==0)
y++ ;
else
{
action(list/k/n );
break ;
}
}
j++ ;
}
printf("\nall elemens are zero.");
}
else
action(list/k/n );
}

action(int arr[]/int gol/int length)
{
int i ;
printf("\n\t\t the intitial list:");
printf("\n\n\t\t" );
for(i=0 ; i
printf(" %3d"/arr[i] );
for(i=0 ; i
arr[i]=arr[i]/gol ;
printf("\n\t\t the final list: ");
printf("\n\n\t\t" );
for(i=0 ; i
printf(" %3d"/arr[i] );
}

دو نمونه از خروجي برنامه مثال 4 :
( الف ) enter 9 number and press enter.
10 12 14 16 2 18 20 22 24
the initial list:
10 12 14 16 2 18 20 22 24
the final list:
5 6 7 8 1 9 10 11 12


( ب ) enter 9 number and press enter.

0 0 0 0 0 0 0 0 0
all elements are zero.

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 21:56
کامپیوتر و اینترنت
آموزش زبان C بخش شانزدهم
قسمت اول
كلاسهاي حافظه

تاكنون برنامه هايي را نوشته ايم كه در بعضي از آنها از چند تابع نيز استفاده
شده است . در اين برنامه ها متغيرهاي مورد نياز هر تابع را در همان تابع تعريف
كرده ايم . متغيرهايي كه در يك تابع تعريف مي شوند در موقع انتقال كنترل اجراي
برنامه به آن تابع ايجاد شده ( حافظه به آنها تخصيص داده مي شود ) و در موقع
برگشت كنترل اجراي برنامه از آن تابع ، حافظه تخصيص يافته به متغيرهاي آن تابع
از آنها اخذ ميشود و به سيستم عامل برگردانده خواهد شد. يعني اين گونه متغيرها
فقط در همان تابعي كه تعريف يم شوند اعتبار دارند و در تابع ديگر قابل استفاده
نيستند . اين مساله حتي در مورد متغيرهاي همنام نيز صادق است . بدين معني كه
اگر به عنوان مثال متغيري به نام I در تابع اصلي (()main) وجود داشته باشد و
متغيري تحت همين نام در تابع فرعي ديگري كه توسط تابع ()main فراخواني مي شود
تعريف گردد اين دو متغير كاملا" از يكديگر مجزا خواهند بود و در حافظه ، دو محل
جداگانه براي آنها در نظر گرفته مي شود و هرگونه تغيير در يكي از آنها ، در
ديگري تاثيري نخواهد داشت .

مثال 1: برنامه اي كه چگونگي استفاده از متغيرهاي همنام را در توابع مختلف
نشان مي دهد . main)(
{
int i ;
printf("enter the value of i:" );
scanf("%d"/&i );
input )(;
printf("\nvalue of i in main is:");
print("%d"/i );
}

input)(
{
int i ;
printf("enter value of i");
printf("(in function:)");
scanf("%d"/&i );
printf("\nvalue of i in function is:");
printf("%d"/i);
}

به نمونه اي از خروجي حاصل از اجراي برنامه مثال 1 كه درپاسخ به اولين دستور scanf
عدد 10 و در پاسخ به دومين دستورscanf عدد 40 وارد شده است توجه نماييد: enter the value of i:10
enter vale of i(in function:)40
vale of i in function is: 40
value of i in main is : 10

با مطالبي كه تاكنون گفته شد روشن گرديد كه متغيرهايي كه در يك تابع تعريف
ميشوند فقط درهمان تابع قابل استفاده هستند و به محض برگشت كنترل اجراي برنامه
از آن تابع ، اين متغيرها عملا" وجود ندارند. به چنين متغيرهايي كه محدوده حضور
آنها فقط در تابعي است كه در آن تابع تعريف شده اند متغيرهاي محلي گفته مي شود.
همه متغيرها در زبان C داراي چنين خصيصه اي نيستند. بلكه انواع ديگري ازمتغيرها
نيز وجود دارند كه براي معرفي آنها لازم است به تشريح كلاس حافظه بپردازيم .
كلاس حافظه هر متغير دو چيز را براي آن متغير مشخص مي كند : 1
مدت حضور آن در برنامه يا طول عمر (life time) متغير . 2
محدوده حضور آن در برنامه (scope vvisibility) .
يكي از علل مطالعه كلاس هاي حافظه اين است كه با داشتن اطلاعاتي در مورد مدت
حضور متغيرها در برنامه و همچنين محدوده حضور آنها ، مي توانيم برنامه هايي
بنويسيم كه : 1
از حافظه كامپيوتر به نحو خوبي استفاده گردد . 2
سرعت اجراي آنها بالا باشد . 3
برنامه ها كمتر با خطا مواجه شوند و عيب يابي سهل تر گردد .

كلاس هاي حافظه اي كه در زبان C از آنها استفاده مي شود عبارتند از :
1
كلاس حافظه اتوماتيك (automatic) . 2
كلاس حافظه استاتيك (static) . 3
كلاس حافظه ثبات (register) . 4
كلاس حافظه خارجي (extern) .
كلمات كليدي auto، static،، register،و externو بترتيب مشخص كننده كلاس هاي
حافظه اتوماتيك ، استاتيك ، ثبات و خارجي هستند. اين كلمات قبل از كلمات كليدي
تعيين نوع متغير بكار مي روند .
شكل كلي تعيين كلاس هاي حافظه بصورت زير است : ;
<كلاس حافظه > <نوع متغير> <اسامي متغيرها>
بعنوان مثال دستور auto int i/y ; متغيرهاي iو yو را از نوع " صحيح " و با
كلاس حافظه اتوماتيك تعريف مي نمايد .

كلاس حافظه اتوماتيك
متغيرهايي با كلاس حافظه اتوماتيك ، بيشتر ازساير انواع متغيرها مورداستفاده
قرار مي گيرند . متغيرهايي كه تاكنون در برنامه ها استفاده شده اند ، داراي كلاس
حافظه اتوماتيك بوده اند. يعني در زبان C متغيرها در حالت عادي داراي كلاس حافظه
اتوماتيك هستند . متغيرهاي با كلاس حافظه اتوماتيك داراي خصوصيات زير مي باشند: 1
وقتي در يك تابع و يا يك بلاك تعريف مي شوند فقط درآن تابع و يا بلاك قابل
دسترسي اند ( " محلي " آن تابع و يا بلاك محسوب مي شوند ) . 2
در موقع ورود به تابع و يا بلاك به آنها حافظه اختصاص مي يابد . 3
در هنگام خروج از تابع و يا بلاك ، حافظه اختصاص يافته به آنها، پس گرفته
مي شود .

مثال 2: برنامه اي كه تعريف متغيرهاي اتوماتيك در بلاك را نشان مي دهد . main)(
{
int sum=10 ;
{
float sum=3.1416;
printf("\n sum in block is:");
printf(%6.4f\n"/sum );
}
printf("\n sum out of block is:");
printf("%2d\n/sum );
}

نمونه اي از خروجي حاصل از اجراي برنامه مثال 2 در ذيل آمده است : sum in block is:3.1416
sum out of block is:10

متغيرهاي اتوماتيك مي توانند مقدار اوليه بگيرند . اگر ارزش اوليه اين گونه
متغيرها در تابعي صورت گيرد كه اين تابع چندين بار فراخواني مي گردد ، هر بار
اجراي تابع ، مقدار اوليه به آن ميگردد ( برخلاف متغيرهاي با كلاس حافظه استاتيك
كه ارزش دهي اوليه فقط يكبار انجام مي شود ) .

مثال 3: استفاده از متغيرهاي با كلاس حافظه اتوماتيك كه داراي ارزش اوليه
مي باشند . main)(
{
auto int k ;
void aquare )(;
for(k=1;k<5;k++)
aquare(k);
}

void square(d)
int d;
{
int squared=d^d ;
printf("\n%2d squared is" );
printf(" %3d\n"/d/squared);
}

خروجي حاصل از اجراي برنامه مثال 3 : 1 squared is 1
2 squared is 4
3 squared is 9
4 squared is 16


متغيرهاي عمومي و كلاس حافظه خارجي
همانطور كه قبلا" گفته شد متغيرهاي تعريف شده در يك تابع و يا يك بلاك فقط در
همان تابع و يا بلاك اعتبار دارند . اينگونه متغيرها را متغيرهاي محلي نامگذاري
كرديم . نوع ديگري از متغيرها در زبان C قابل استفاده هستند كه در كليه توابع
موجود در برنامه قابل دسترسي اند. به اين متغيرها، متغيرهاي عمومي گفته ميشود.
متغيرهاي عمومي در خارج از تابع اصلي تعريف مي شوند .

مثال 4: برنامه اي كه نحوه استفاده از متغيرهاي عمومي را نشان مي دهد . اين
برنامه تعداد 5 عدد رااز ورودي خوانده و مجموع مربعات آنهارا محاسبه مي نمايد. int k/sq ;
int sum=0 ;
main)(
{
auto j/i=5 ;
printf("\n enter five number:" );
for(j=0 ;j input )(;
printf("\n sum of square is:%d"/sum);
}

input)(
{
scanf("%d"/&k );
square )(;
sum+=sq ;
}

square)(
{
sq=k*k ;
}

نمونه اي از خروجي حاصل از اجراي برنامه مثال 4 : enter five number: 10 12 4 7 20
sum of square is:709

در مثال 4 متغيرهاي sq، k،و sumو در خارج از تابع ()main تعريف شده اند و در
توابع ()square و ()input بدون تعريف اين متغيرها از آنها استفاده شده است .
اگر توابع تعريف شده در يك برنامه علاوه بر متغيرهاي عمومي از متغيرهاي محلي
نيز استفاده نمايند و يك يا چند متغير محلي توابع ، با يك يا چند متغير عمومي
مراجعه داشته باشد ( مقدار آنرا تغيير دهد و يا مقدار آن متغير را مورداستفاده
قرار دهد ) تاثيري در متغير عمومي همنام با اين متغير محلي نخواهد داشت .


خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 21:55
کامپیوتر و اینترنت
آموزش زبان C بخش پانزدهم
تعيين نوع تابع

همانطور كه قبلا" گفته شد اگر در حين تعريف تابع از ذكر نوع آن خودداري شود
كامپايلر فرض مي كند مقداري كه توسط اين تابع برگردانده مي شود ( توسط دستور return
) يك مقدار " صحيح " است . به اينگونه توابع ، توابع نوع صحيح گفته
مي شود . اگر بخواهيم توابعي غير از نوع " صحيح " داشته باشيم بايد: الف ) نوع
تابع ار در تابع فراخواننده به كامپايلر اعلان كنيم . ب ) نوع تابع را در حين
تعريف تابع مشخص كنيم ( مثال ) .

مثال : برنامه اي كه شعاع دايره اي را از ورودي خوانده و با محاسبه مساحت آن
را به خروجي مي برد . main)(
{
float area(float );
float radius ;
printf("\n entera radius : " );
scanf("%f"/&radius );
printf("area of circle is:");
printf("%.2f"/area(radius ));
}
float area(float rad)
{
return(3.13*rad*rad );
}

به نمونه اي از خروجي برنامه مثال توجه نماييد : enter radius: 4
area of circle is: 50.08

همانطوري كه در مثال بالا مشاهده مي گردد ، مقداري كه توسط تابع ()area
برگردانده ميشود از نوع اعشاري است ، لذا در اولين دستور تابع ()main نوع تابع
()area را به كامپايلر اعلان كرده و در حين تعريف اين تابع ، نوع آن را نيز مشخص
نموده ايم . در بسياري از گونه هاي زبان C ذكر نوع نتيجه تابع ، در آرگومان آن
الزامي نيست و درمثال بالا اولين دستور تابع ()main را نيز مي توان به صورت زير
نوشت . f

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 21:55
کامپیوتر و اینترنت
آموزش زبان C بخش چهاردهم
انواع فراخواني و مقاديري كه توابع برمي گردانند

همانطوريكه قبلا" گفتيم ، توابع از نظر تعداد مقاديري كه به تابع فراخواننده
برمي گردانند به سه دسته تقسيم مي شوند كه يك دسته از آنها ( توابعي كه هيچ
مقداري را برنمي گردانند ) را مورد بررسي قرار داده ايم .
توابع در زبان C به دو روش فراخواني مي شوند كه عبارتند از : 1
فراخواني توسط ارزش (Call by value). دراين روش مقدار آرگومان تابع ، در
پارامتر متناظر با آن كپي مي شود . لذا هرگونه تغييري در پارامترها هيچگونه
تاثيري در مقدار آرگومان ها نخواهد داشت . بنابراين در روش فراخواني توسط ارزش
هيچ مقداري توسط پارامترها وآرگومانها به تابع فراخواننده ، برگردانده نميشوند.
ولي مي توان فقط يك مقدار را با استفاده از دستور return به تابع فراخواننده
برگرداند . مقداري كه توسط اين دستور به تابع فراخواننده برگردانده مي شود، در
نام تابع فراخوانده شده قرار ميگيرد. دستور return به دو صورت زير بكار ميرود: return( 1)

(َ2) (مقدار) return
دستور return در حالت (1) صرفا" خاتمه اجراي تابع را مشخص مي كند و هيچگونه
مقداري را به تابع فراخواننده برنمي گرداند. در حالت (2) ضمن اعلام خاتمه اجراي
تابع ، مقداري را نيز به تابع فراخواننده برمي گرداند ( مثال 1 ) .

مثال 1: main)(
{
int t=10 ;
printf("\n t=%d/square is:"/t);
printf("%d"/aqr(t ));
}
eqr(int x)
{
int y ;
y=x*x;
return(y );
}

خروجي حاصل از اجراي برنامه مثال 1 به صورت زير است : t=10/aqurare is:100

در مثال 1 تابع sqr براي انجام عمل توان نوشته شده است كه پارامتر آن x بوده
و از نوع "صحيح " است ( به چگونگي تعريف نوع پارامتر دقت شود ). پس از فراخواني
تابع sqr مقدار آرگومان t (10) در پارامتر x كپي مي شود و از اين لحظه به بعد
هيچ كاري با t نيست . در اين تابع ، نتيجه عمل در متغير y قرار مي گيرد و سپس
توسط دستور return مقدار متغير y به تابع فراخواننده برگردانده مي شود . اين
مقدار در نام تابع ((t)sqr) قرار مي گيرد .
2
فراخواني توسط ارجاع (Call by reference) . در اين روش ، آدرس آرگومان
در پارامتر كپي مي شود . لذا در داخل تابع فراخوانده شده ، آدرس آرگومان براي
دسترسي به آرگومان مورداستفاده قرار ميگيرد و اين بدان معني است كه درفراخواني
توسط ارجاع ، پارامترها حاوي آدرس هاي آرگومان ها هستند. لذا در فراخواني توسط
ارجاع بايد آدرس آرگومان بجاي مقدار آرگومان به تابع فراخواننده منتقل گردد .
بحث بيشتر در اين مورد را به مطالعه اشاره گرها (pointer) موكول مي كنيم .

مثال 2: برنامه اي كه كاراكترهايي را از ورودي خوانده و تشخيص مي دهد آيا
كاراكتر وارد شده a، b، و يا غير از اين دو حرف بوده است . ضمنا" اين برنامه
قبل از انجام عمل مقايسه ، با استفاده از يك تابع كاراكترهاي خوانده شده را به
حروف كوچك تبديل مي كند ( كد اسكي حروف بزرگ درباره 65 و 91 است كه اگر به اين
بازه 32 واحد اضافه شود كد اسكي حروف كوچك حاصل خواهد شد ) . main)(
{
char ch ;
printf("\n type a character: " );
ch=getcha )(;
switch(ch)
{
case 'a':
printf("\n you typed the");
printf(" character 'a'" );
break ;
case 'b':
printf("\n you typed the");
printf(" character 'b'" );
break ;
default:
printf("\n you typed no 'a'");
printf(" and no 'b'" );
}
}

getcha)(
{
char cl ;
cl=getch )(;
if(cl>64 && cl<91)
cl+=32 ;
return(cl );
}

نمونه اي از خروجي حاصل از اجراي برنامه مثال 2 : type a character: s
you typed no 'a' and no 'b'

تعريف توابع در داخل يكديگر امكان پذيرنيست ، اما فراخواني سطوح مختلف تابع
ممكن است . اين مطلب در مثال 3 مشاهده مي شود .

مثال 3: برنامه اي كه با استفاده از چند تابع ، دو عدد را از ورودي خوانده و
با محاسبه مجموع مربعات آن دو ، آنها را به خروجي منتقل مي كند . main)(
{
int num1/num2 ;
printf("\n type two number:" );
scanf(%d%d"/&num1/&num2 );
printf("\nsum of square is:");
printf("%d/sumsqr(num1/num2));
}

sumsqr(j/k)
int j /k ;
{
return(sum(sqr(j)/sqr(k )));
}
sqr(z)
int z ;
{
return(z*z);
}

sum(x/y)
int x/y ;
{
return(x+y);
}

نمونه اي از خروجي حاصل از اجراي برنامه مثال 3 : type two number : 12 9
sum of square is:225

در مثال 3از 3ز تابع به نامهاي sumsqr، sqr،و sumو استفاده شده است . وظيفه
تابع sumsqr محاسبه مجموع مربعات دو عدد num1و num2و است كه براي اين كار ، دو
تابع sumو sqrو را فراخواني مي كند . تابع sqr در دو بار فراخواني ، مربع دو
عدد num1و num2و را محاسبه كرده و تحويل تابع sum مي دهد . اين تابع مجموع دو
پارامتر خود را كه همان مربعات دو عدد num1و num2و هستند ، محاسبه مي كند و به گرداند .

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 21:54
کامپیوتر و اینترنت
آموزش زبان C بخش سیزدهم
توابعي كه هيچ مقداري را برنمي گردانند

خوب است قبل از بحث در مورد اينگونه توابع ، مثالي را متذكر شويم .

مثال 1: برنامه اي كه با استفاده از يك تابع ، زماني كه شامل ساعت ، دقيقه
و ثانيه است را از ورودي خوانده و اين زمان را به ثانيه محاسبه مي نمايد : main)(
{
convert )(;
}

convert)(
{
int hours/minutes/second/time ;
printf("enter time to be convertd");
printf("\n hour/minutes/second : ");
scanf("%d%d"/&hours/&minutes);
printf("%d/&second);
time=(60*hours+minutes)*60+second ;
printf("\ntime is: %d second."/time);
}

به نمونه اي از خروجي برنامه مثال 1 توجه نماييد : enter time to be convertd
hour/minutes/secound : 4 8 30

time is: 14910 second.

در مثال 1 از تابعي به نام convert استفاده شده است كه هيچگونه پارامتري
ندارد . متغيرهاي مورد نياز اين تابع ، تعريف شده ، اطلاعات از ورودي خوانده
مي شوند و پس از انجام محاسبات به خروجي منتقل مي گردند . اين تابع هيچ مقداري
را به تابع فراخوانده ( تابع اصلي ) برنمي گرداند . به چنين توابعي توابع از
نوع void گفته مي شود . اگر بخواهيم برنامه مثال 1 را با استفاده از اين تعريف
( تابع از نوع void ) بنويسيم ، مثال (2) حاصل خواهد شد .

مثال 2: برنامه مثال 1 با استفاده از تعريف نوع void : main)(
{
void convert )(;
convert )(;
}

void convert)(
{
int hours/minutes/second/time ;
printf("enter time to be convertd");
printf("\n hour/minutes/second : ");
scanf("%d%d"/&hours/&minutes);
printf("%d/&second);
time=(60*hours+minutes)*60+second ;
printf("\ntime is: %d second."/time);
}

همانطوريكه در مثال 2 مشاهده ميشود بايد درتابع فراخواننده ( در اينجا تابع
اصلي ) نوع تابع convert را كه از نوع void است به كامپايلر اعلان نمود وسپس در
حين تعريف تابع نوع آن مشخص گردد (()void convert) .
در توابعي مانند convert كه هيچگونه پارامتري ندارند ، براي جلوگيري از
هر گونه اشتباه احتمالي در فراخواني اينگونه توابع ( كه ممكن است اشتباها" با
پارامتر فراخواني گردند ) مي توان بجاي پارامتر و آرگومان از كلمه كليدي void
استفاده نمود. با توجه به اين نكته كه اگر اشتباها" توابع فاقد هرگونه پارامتر
( و آرگومان ) با پارامتر فراخواني گردند . كامپايلر C خطايي را اعلام نمي كند.
در اين حالت ذكر كلمه كليدي void بجاي پارامتر و آرگومان تابع مفيد بنظر ميرسد
( مثال 3 ) .

مثال 3: main)(
{
void convert(void );
convert )(;
}

void convert(void)
{
int hours/minutes/second/time ;
printf("enter time to be convertd");
printf("\n hour/minutes/second : ");
scanf("%d%d"/&hours/&minutes);
printf("%d/&second);
time=(60*hours+minutes)*60+second ;
printf("\ntime is: %d second."/ti


خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 21:54
کامپیوتر و اینترنت
آموزش زبان C بخش دوازدهم
توابع و كلاسهاي حافظه

در مورد برنامه هاي طولاني و پيچيده كه شامل چندين قسمت منطقي تقريبا" مستقلي
هستند بهتر است براي هر قسمت منطقي ، برنامه اي نوشته و سپس آنها را به يكديگر
متصل (Link) كرد . هر يك از اين قسمتها يك زير برنامه نام دارند . استفاده از
زير برنامه جهت طراحي برنامه ها ، داراي مزاياي زيادي است كه بر اهل كامپيوتر
پوشيده نيست . در زبانهاي برنامه سازي مختلف معمولا"دو نوع زيربرنامه وجود دارند
و عبارتند از : ( الف ) زير برنامه هاي تابع ( ب ) زير برنامه هاي زير روال ، در
زبان C فقط زيربرنامه تابع مورد استفاده قرار ميگيرد. كاري را كه زيربرنامه هاي
زير روال در ساير زبان هاي برنامه سازي انجام مي دهند ، در زبان C توسط زير
برنامه هاي تابع صورت مي گيرد . در اينجا منظور از زير برنامه ، توابع هستند .
توابع در زبان C داراي ساختمان خاصي هستند كه شكل (1) آن را نشان مي دهد .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
<نوع تابع > <نام تابع > ( اسامي پارامترها ) | |
تعريف پارامترها | | { |
|
بدنه تابع | | } |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
شكل (1) . ساختمان توابع

در شكل (1) منظور از نوع تابع ، يكي از انواع معتبر در زبان C است كه نوع
مقدار برگردانده شده توسط تابع را مشخص مي كند . تعيين نوع توابع ، اختياري
است . اگر تابعي تعيين نوع نگردد كامپايلر زبان C فرض مي كند مقداري كه توسط
تابع برگردانده مي شود از نوع " صحيح " است . نام تابع از قانون نامگذاري براي
متغيرهاي تبعيت مي كند . اسامي پارامترها شامل متغيرهايي است كه بايد به تابع
منتقل كردند . اگر تعداد پارامترها بيش از يكي باشد يا كاما از يكديگر جدا
مي شوند . تعريف پارامترها مجموعه دستوراتي است كه نوع پارامترها را تعيين
مي نمايد . تعيين نوع پارامترها در حين تعريف تابع نيز امكان پذير است . بدنه
تابع شامل دستورالعمل هايي است كه عمل تابع را مشخص مي كند .
نكاتي را كه بايد در مورد توابع در نظر داشت عبارتند از : 1
كليه توابع فرعي بعد از تابع اصلي (()main) تعريف مي شوند . 2
اگر نوع تابعي غيراز نوع " صحيح " باشد، نوع آن بايد در تابع فراخواننده
به كامپايلر اعلان شود . 3
براي اجراي تابع بايد آنها را فراخواني نمود ( فراخواني توابع توسط نام
آنها انجام مي شود ) . 4
همانطور كه متغيرهاي قابل استفاده در تابع اصلي بايد در ابتداي اين تابع
تعريف شوند ، متغيرهاي مورد نياز هر تابع فرعي نيز بايد در ابتداي آنها تعريف
كردند . 5
تعريف يك تابع در داخل تابع ديگر امكان پذير نيست . ولي فراخواني سطوح
مختلف توابع ، ممكن است . 6
توابع از نظر تعداد مقاديري كه به تابع فراخواننده برمي گردانند ، به سه
دسته تقسيم مي شوند .
الف ) توابعي كه هيچ مقداري را برنمي گردانند .
ب ) توابعي كه فقط يك مقدار را برمي گردانند .
ج ) توابعي كه چند مقدار را به عنوان نتيجه عمل برمي گردانند . 7
درموقع فراخواني توابع بايد دقت داشت كه تعداد و نوع آرگومانها با تعداد
ونوع پارامترها يكسان باشند. براي پي بردن به تفاوت بين آرگومانها و پارامترها
مي توانند به شكل (2) مراجعه نماييد .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | main )(|
| { |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | |
آرگومان ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | |
< فراخواني تابع ؤؤؤؤؤؤ;(a/b)out | | |
| } |
| |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | |
پارامتر تابع ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | |
(< تعريف تابع ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤk/i)out | | int k/i; |
| { |
| |
| printf("k=%d/i=%d"/k/i); |
| |
| } |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
شكل (2) . تفاوت آرگومان و پارامتر

در شكل (2) aو bو را كه در فراخواني تابع out آمده اند ، آرگومان تابع و I و K
را كه در تعريف تابع out آمده اند پارامتر تابع مي گوييم . همانطور كه ملاحظه وانند هم نام نباشند .

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 21:53
کامپیوتر و اینترنت
آموزش زبان C بخش یازدهم
قسمت دوم


مثال 5: main)(
{
int num1 / num2 ;
char op ;
while(1)
{
printf("type number/operator/");
printf("number \n" );
scanf("%d%c%d"/&num1/&op/&num2);
if(op=='+')
printf("\n sum=%d"/num1+num2);
else if(op=='-')
printf("\n subtract=%d"/num1-num2);
else if(op=='*')
printf("\n multiple=%d"/num1*num2);
else if(op=='/')
printf("\n divition=%d"/num1+num2);
else
printf("\n operator is illegal");
printf("\n\n" );
}
}

همانطوركه ملاحظه ميشود برنامه اي كه با ساختار else if نوشته شده است ( مثال 5
) كوتاهتر بوده و از خوانايي بهتري برخوردار است . لذا توصيه مي شود كه در
اين گونه موارد از else if بجاي ساختار if استفاده گردد .

انتقال كنترل غيرشرطي
ساختارهاي ifو else ifو را تحت عنوان انتقال كنترل شرطي مورد بررسي قرار
داده ايم . چند دستور در زبان C وجود دارند كه بدون تست كردن شرطي سبب انتقال
كنترل برنامه ، از جايي به جايي ديگر مي شوند . نام اين دستور انتقال كنترل
غيرشرطي مي باشد كه در ذيل مورد بررسي قرار مي گيرند .

دستور goto
در زبان C علاوه بر ساختارهاي تصميم ، دستوري بنام goto نيز وجود دارد كه سبب
انتقال كنترل اجراي برنامه ، از نقطه اي به نقطه ديگر مي گردد. اين دستور بصورت
زير بكار مي رود : ;
برچسب دستور goto
برچسب دستور ، همانند يك متغير نامگذاري شده و به دو نقطه (:) ختم مي شود .
پيشنهاد مي گردد حتي الامكان از دستور goto كه معمولا" سبب كاهش ميزان خوانايي
برنامه مي شود ، استفاده نگردد .

مثال 6: برنامه اي كه با استفاده از دستور goto يك حلقه تكرار مي سازد . main)(
{
int x=1 ;
loop1:
x++ ;
if(x<100 )goto loop1 ;
printf("\n the maximum value");
printf(" of x is:%d"/x );
}

خروجي حاصل از اجراي برنامه مثال 6 : the maximum value of x is:100

يكي از خواص gotoدر Cر اين است كه از تابعي به تابع ديگر نمي توان انشعاب
كرد و فقط انتقال كنترل در يك تابع امكان پذير است . يعني برچسب goto بايد در
تابعي باشد كه اين دستور در آن تابع بكار رفته است .

دستور break
اين دستور يكي از دستورات انتقال كنترل غير شرطي است و به صورت زير مورد
استفاده قرار مي گيرد :

دستور break به دو منظور استفاده مي شود : الف ) خاتمه داده به case در
ساختار switch ، ب ) خاتمه دادن به حلقه تكرار ( حلقه هاي تكرار ممكن با for do
يا whileا ساخته شوند ) . پس از اجراي دستور break در داخل ساختارهاي تكرار
كنترل اجراي برنامه به اولين دستور پس از حلقه تكرار منتقل مي شود .

مثال 7: main)(
{
int t ;
for(t=0 ; t<100 ; t++)
{
printf("%3d"/t );
if(t==5)
break ;
}
printf("\nmaximum value of t is:");
printf("%d"/t);
}

خروجي حاصل از اجراي برنامه مثال 7: 0 1 2 3 4 5
maximum value of t is:5

همانطور كه از خروجي برنامه پيداست پس از آن كه مقدار tبه 5 رسيد كنترل
اجراي برناه از حلقه تكرار for خارج شده و با اجراي دستور printfعدد 5د را چاپ
مي كند . نكته اي كه در مورد break بايد توجه داشت اين است كه اگر دو يا چند
حلقه تكرار تودرتو داشته باشيم ، دستور break موجود در داخلي ترين حلقه ، فقط
موجب خروج از همين حلقه تكرار مي شود .

مثال 8: main)(
{
int t ;
for(t=0 ; t<100 ; t++)
{
count=1 ;
printf("\n" );
for(;;)
{
printf("%3d"/count );
count ++ ;
if(count==4 )break ;
}
}
}

خروجي حاصل از اجراي برنامه مثال 8: 1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3

در دو مثال 7و8و دوحلقه تكرار وجوددارد كه حلقه داخلي يك حلقه بينهايت است .
در اين حلقه ر گاه مقدار countبه 4 برسد ، كنترل اجراي برنامه از اين حلقه
خارج مي شود .

دستور continue
دستور continue در يك حلقه تكرار ، موجب انتقال كنترل به ابتداي حلقه تكرار
شده ، بصورت زير استفاده مي شود : continue;

پس از اجراي اين دستور كنترل به ابتداي حلقه برگشته و شرط حلقه تست مي گردد
كه در صورت برقرار بودن شرط ، مجموعه دستورات داخل حلقه تكرار مجددا" اجرا
مي شوند وگرنه كنترل از حلقه تكرار خارج خواهد شد .

مثال 9: برنامه اي كه كاراكتري را از ورودي دريافت كرده و اين كاراكتر و
كاراكتر بعد از آن را به خروجي مي برد . main)(
{
char done=0 / ch ;
while(!done)
{
printf("\n type a character / ");
printf("& for exit :");
ch=getch)(;
printf("\n you typed the");
printf("character: %c"/ch);
if(ch=='&')
{
done=1 ;
continue ;
}
printf("\nthe next character is:");
printf("%c"/ch+1 );
}
}

به نمونه اي از خروجي برنامه مثال 9 توجه نماييد : type a character /& for exit:
you typed the character: a
the next character is:b
type a character /& for exit:
you typed the character: b
the next character is:c
type a character /& for exit:
you typed the character: &

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 21:53
کامپیوتر و اینترنت
آموزش زبان C بخش یازدهم
قسمت اول
ساختارهاي تصميم

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

ساختار تصميم if
ساختار if ( كه ساختار انتقال كنترل شرطي نيز نامگذاري ميشود ) موجب ميگردد
تا تحت شرايطي ، مجموعه اي از دستورات اجرا شده و يااز اجراي اين مجموعه دستورات
صرفنظر گردد . اين ساختار بصورت هاي زير مورد استفاده قرار مي گيرد .
(َ1) ;دستور (شرط) if
(َ2) (شرط) if {

مجموعه دستورات 1 }
else
{

مجموعه دستورات 2 }

در روش (1) ، شرط ذكر شده بررسي مي شود و در صورت برقرار بودن ، دستور بعد
از آن اجرا مي شود و در غير اينصورت كنترل اجراي برنامه به دستور بعد از if
منتقل مي گردد .
در روش (2) ، شرط ذكر شده بررسي مي شود و در صورت برقرار بودن ، مجموعه
دستورات (1) اجرا ميشوند و در غير اينصورت مجموعه دستورات (2) اجرا خواهند شد.
لازم به ذكر است كه وجود else در ساختار if اختياري است . يعني ساختار if را
بصورت زير نيز مي توان بكار برد :
(شرط) if {

مجموعه دستورات }

در روش فوق پس از اين كه كنترل اجراي برنامه به if رسيد شرط مورد نظر بررسي
مي شود . چنانچه اين شرط برقرار باشد ، مجموعه دستورات داخل {و }و ( كه يك بلاك
ناميده مي شود ) اجرا مي گردد وگرنه كنترل اجراي برنامه به اولين دستور بعد از
بلاك if منتقل خواهد شد . استفاده از ساختار if بصورت لانه اي ( تو در تو ) نيز
امكان پذير است كه در اينصورت اولين else به آخرين if بر مي گردد .

مثال 1: برنامه اي كه با خواندن يك جمله از ورودي ، تعداد كاراكترها و كلمات
موجود در جمله را محاسبه مي كند . كلمات با فاصله (blank) از يكديگر جدا شده و
انتهاي جمله به كليد enter ختم مي گردد . main)(
{
int charcount=0 ;
int wordcount=0 ;
char ch ;
printf("type a statement:\n" );
while((ch=getche))(!='\r')
{
charcount ++ ;
if(ch==' ')
wordcount ++ ;
}
printf("\n character count is:");
printf("%d"/charcount );
printf("\n word count is:");
printf("%d"/wordcount );
}

به نمونه اي از خروجي برنامه مثال 1 توجه نماييد : type a statement:
this book is my fifth book.
character count is:27
word count is:6


مثال 2: برنامه اي كه بااستفاده از ساختار تصميم if يك شكل گرافيكي را به كمك
كدهاي اسكي DBو BOو رسم مي كند . main)(
{
int x/y ;
for(y=1 ; y<11 ; y++)
{
for(x=1 ; x<11 ; x++)
{
if(x==y)
printf("\xDB" );
else
if(x==11-y)
printf("\xDB" );
else
printf("\xBO" );
}
printf("\n" );
}
}


مثال 3: برنامه اي كه تعداد كل كاراكترهاي يك جمله و همچنين تعداد ارقام
موجود در آن را شمارش مي كند . main)(
{
int charcnt=0 ;
int wordcnt=0 ;
char ch ;
printf("\n enter a statement: \n" );
while((ch=getche))(!='\r')
{
charcnt++ ;
if(ch>=47 && ch<=58)
digthcnt++ ;
}
printf("\n character count is:" );
printf("%d"/charcnt );
printf("\ndigit count is:");
printf("%d"/digtcnt);
}

به نمونه اي از خروجي برنامه مثال 3 توجه نماييد : type a statement:
my telephone number is 817694.
character count is:31
digit count is:6

نكته اي كه بايد در مورد برنامه مثال 3 توضيح داد اين است كه در دستور if
جهت تشخيص اين كه ، آيا كاراكتر وارد شده ، يكي از ارقام 0تا 9ا است يا خير
از اعداد 47 و 58 استفاده شده است . زيرا كدهاي اسكي ارقام 0تا 9ا در بين اين
دو عدد ( از 48 تا 57 ) مي باشند .

ساختار تصميم else if
تاكنون ساختار if را مطالعه نموديم و مثال هايي را در اين زمينه مشاهده
كرديم . نكته اي بايد به آن توجه داشت اين است كه اگر در ساختارif خواسته باشيم
چندين شرط را مورد بررسي قرار دهيم ، بايد ساختار if را به صورت تودرتو بكار
ببريم كه نه تنها موجب طولاني شدن برنامه مي گردد ، بلكه خوانايي آن را نيز
پايين مي آورد . ساختار else if كه يك ساختار انتقال كنترل شرطي است مي تواند
در اين زمينه به ما كمك كرده تا بتوانيم از افزايش بي رويه طول برنامه جلوگيري
كنيم .
جهت روشن شدن مطلب به دو برنامه بعدي ( مثالهاي 4، 5 ) كه يكي با ساختار if
و ديگري با ساختار else if براي حل يك مساله نوشته شده اند توجه كنيد . اين
برنامه ها دو عدد و يكي از عملگرهاي چهار عمل اصلي را از ورودي خوانده و عملگر
را بر روي دو عدد اجرا مي كنند .

مثال 4: main)(
{
int num1 / num2 ;
char op ;
while(1)
{
printf("type number/operator/");
printf("number \n" );
scanf("%d%c%d"/&num1/&op/&num2);
if(op=='+')
printf("\n sum=%d"/num1+num2);
else
if(op=='-')
printf("\nsubtract=%d"/num1-num2);
else
if(op=='*')
printf("\nmultiple=%d"/num1*num2);
else
if(op=='/')
printf("\ndivition=%d"/num1+num2);
else
printf("\n operator is illegal");
printf("\n\n" );
}
}

به نمونه اي از خروجي برنامه مثال 4 توجه نماييد : type number/operator/number
12 + 23
sum=35

type number/operator/number
2*26
multiple=52

type number/operator/number
4%2
operator is illegal

type number/operator/number

^c


خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 21:52
کامپیوتر و اینترنت
آموزش زبان C بخش دهم
قسمت دوم

مثال 3: برنامه اي كه جدول ضرب اعداد از 1 تا 10 را درصفحه نمايش چاپ ميكند. main)(
{
int i/j ;
for(i=1 ; i<=10 ; i++)
{
for(j=1 ; j<=10 ; j++)
printf("%3d "/i*j );
printf("\n" );
}
}

خروجي حاصل از برنامه فوق : 1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100


مثال 4: برنامه اي كه تعداد حروف يك جمله را شمارش مي كند ( انتهاي جمله با
نقطه مشخص شده است ) . در اين برنامه از دستور # include استفاده شده است . #include "stdio.h"
main)(
{
char ch ;
int count ;
for(count=0;(ch=getchar))(!='.'
; count++ );
printf("\n length of statement");
printf(" is:%d"/count );
}

به نمونه اي از خروجي برنامه مثال 4 توجه نماييد : i like C very much.
length of statement is:18

از نحوه كاربرد سوم for براي ساخت حلقه هاي تكرار بينهايت استفاده مي شود .

ساختار تكرار while while
( يكي از ساختارهاي تكرار در زمان C ) در مواقعي مورد استفاده قرار
مي گيرد كه تعداد دفعات تكرار مجموعه دستورات مورد نظر مشخص نباشد .
ساختار while بصورت هاي زير استفاده مي شود : ;
دستور (شرط) while(1(
(شرط) while(2( {

مجموعه اي از دستورات }

وقتي كه كنترل اجراي برنامه به ساختار while رسيد ، شرطي كه در آن ذكر شده
است تست مي شود . اگر اين شرط داراي ارزش منطقي " درست " باشد ، دستور يا
دستورات داخل حلقه تكرار اجرا ميشوند واجراي اين دستورات تا برقراري شرط مذكور
ادامه مي يابد. لذا بايد توجه داشت كه در داخل بدنه حلقه تكرار ، شرط حلقه نقض
شود ، وگرنه دستورات داخل حلقه ، بينهايت بار اجرا خواهند شد .

مثال 5: برنامه اي كه يك جمله رااز ورودي خوانده و تعداد كاراكترهاي آن جمله
را شمارش مي كند ( انتهاي جمله به كليد enter ختم مي شود ) . main)(
{
int count=0 ;
printf("type a statement and ENTER");
printf(" to end.");
while(getche )(!='\r')
count ++ ;
printf("\n length of statement is:");
printf("%d/count );
}


حلقه هاي تكرار بينهايت
با استفاده از ساختارهاي تكرار forو whileو مي توانيم حلقه هاي تكراري درست
كنيم كه جهت ختم آنها بايد از كليد CTL+BREAK استفاده كرد . به اين حلقه هاي
حلقه هاي بينهايت گفته مي شود . براي ساختن حلقه تكرار از while مي توانيم بجاي
شرط از يك (1) به معني ارزش درستي ، استفاده كنيم .

مثال 6: برنامه اي كه تعداد نامحدودي عدد رااز ورودي خوانده و فاكتوريل آنها
را محاسبه مي كند :
جهت ختم اجراي برنامه بايد از CTL+BREAK استفاده نمود . main)(
{
long int answer ;
int number ;
while(1)
{
printf("\n type number: " );
scanf("%d/&number );
answer=1 ;
while(number>1)
answer*=number --;
printf("\n factorial is: " );
printf("%1d\n"/answer );
}
}

به نمونه اي از خروجي برنامه مثال 6 توجه نماييد : type number: 5
factorial is: 120

type number: 4
factorial is: 24
type number: 6
factorial is: 720

type number: ^c

همانطور كه قبلا" گفته شد براي ساختن حلقه تكرار بينهايت از ساختار for كافي
است كه اين ساختار را بصورت (;;)for بكار ببريم ( مثال 7 ) .

مثال 7: مساله محاسبه فاكتوريل ( مثال 6 ) با استفاده از حلقه for : main)(
{
long int answer ;
int number ;
for(;;)
{
printf("\n type number: " );
scanf("%d/&number );
answer=1 ;
while(number>1)
answer*=number --;
printf("\n factorial is: " );
printf("%1d\n"/answer );
}
}


ساختار تكرار do
ساختار تكرار do مشابه ساختار تكرار while است . با اين تفاوت كه در ساختار while
شرط حلقه در ابتداي حلقه تست ميشود ولي در ساختار do شرط حلقه در انتهاي
حلقه تكرار تست خواهد شد. لذا در ساختار do مجموعه دستورات داخل ساختار، حداقل
يكبار انجام مي شوند . اين ساختار بصورت زير استفاده مي شود : do
{
;
مجموعه دستورات ;
(شرط) } wwhile
وقتي كنترل اجراي برنامه به ساختار do رسيد مجموعه دستورات داخل حلقه تكرار
اجرا مي شوند و سپس شرط ذكر شده در اين ساختار تست مي گردد . چنانچه اين شرط
برقرار باشد مجموعه دستورات داخل حلقه تكرار مجددا" اجرا مي شود ، وگرنه كنترل
اجراي برنامه از حلقه تكرار خارج مي گردد .

مثال 8: برنامه اي كه عددي را از ورودي خوانده و سپس آنرا بصورت معكوس در
خروجي چاپ مي كند .
مثلا" عدد 2153 را بصورت 3512 چاپ مي نمايد . main)(
{
int number / digit ;
printf("enter a number: " );
scanf("%d/&number );
do {
digit=number%10 ;
printf("%d/digit );
number/=10 ;
}while(number!=0 );
}

نمونه اي از خروجي حاصل از اجراي برنامه مثال 8 : enter a number:2153
3512

ساخت حلقه هاي تكرار بينهايت با استفاده از ساختار do نيز امكان پذير است . استفاده گردد .


خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 21:52
مورد توجه ترین های هفته اخیر
فعالترین ها در ماه گذشته
(0)فعالان 24 ساعت گذشته