تبليغاتX
.:: لوتوس دنیای موبایل ::.
.:: لوتوس دنیای موبایل ::.
دانلود برنامه موبایل - ترفندهای موبایل - دانلود نرم افزار کامپیوتر)نظر یادتون نره(
قال رسول الله (ص) : ايها الناس ! انه قد اقبل اليكم شهر الله بالبركة و الرحمة و المغفرة
بعضي از توابع رشته اي

دسته بندی : / لینک ثابت

بعضي از توابع بر روي رشته ها عمل كرده و دستكاري رشته ها را آسان مي كنند .
كه مي توان از مقايسه رشته ها ، تعيين طول رشته ها، الحاق كردن رشته ها به يكديگر
و ... نام برد .

تابع ()strcpy
تابع ()strcpy براي قرار دادن رشته اي در رشته ديگر مورد استفاده قرار گرفته
و بصورت زير استفاده مي شود : ;
("رشته " و متغير رشته اي )strcpy
اهميت اين تابع وقتي مشخص مي شود كه بدانيم ، مقدار دادن به متغير رشته اي
بطور مستقيم امكان پذير نيست بلكه فقط از طريق اين تابع صورت پذيرد . مثلا" اگر
داشته باشيم : char name[11];

دستور انتساب زير غلط خواهد بود : name="ALI";

با استفاده از تابع ()strcpy عمل فوق را مي توان بصورت زير انجام داد : strcpy(name/"ALI");

اين مساله بدين علت است : " همانطور كه در C نمي توان دو آرايه را با حكم
انتساب (=) به يكديگر نسبت داد ، دو رشته نيز نمي توانند با حكم انتساب ، به
يكديگر نسبت داده شوند .

مثال 1: برنامه اي كه يك رشته و يك عدد( كه بيانگر موقعيتي ازاين رشته است )
را از ورودي خوانده و موجب حذف كاراكتر موجود در آن محل مي شود . main)(
{
char string[81] ;
int position ;
printf("\n type a string: " );
gets(string );
printf("\n enter position for " );
printf("delete character: " );
scanf("%d"/&position );
strcpy(&string[position]/
&string[position+1] );
puts(" the result string is :" );
puts(string );
}

نمونه اي از خروجي برنامه مثال 1: type a string: in thee name of allah.
enter position for delete character:5
the result string is:
in the name of allah.

در مثال 1 متغير position به موقعيتي از رشته اشاره ميكند كه كاراكتر موجود
در آن بايد حذف شود . با استفاده از تابع ()strcpy قسمتي از رشته string را با
شروع از position + 1 ، در همين رشته با شروع از موقعيت position كپي كرده ايم .
اين عمل موجب حذف كاراكتري كه در موقعيت position قرار داشته است مي گردد . با
فرض اين كه رشته ورودي برابر با "cart" و موقعيت كاراكتري كه بايد حذف شود 2
فرض گردد خروجي حاصل از اجراي برنامه مثال 1 بصورت زير خواهد بود : type a string: cart.
enter position for delete character:2
the result string is:cat


تابع ()strcat
اين تابع براي الحاق كردن ( به دنبال هم قرار دادن ) دو رشته استفاده ميشود
و بصورت زير به كار مي رود : strcat(s1/s2)
s1
و s2و دو رشته اي هستند كه بايد با هم الحاق شوند . s2 در انتهاي رشته s1
قرار خواهد گرفت .

مثال 2: main)(
{
char s1[21] / s2[21] ;
puts("enter string : " );
gets(s1 );
puts("enter string : " );
gets(s2 );
strcat(s1/s2 );
puts("result string is: " );
puts(s1 );
}

درپاسخ به درخواست برنامه ، اگر بجاي s1 عبارت good وبجاي s2 عبارت moorning
را وارد كنيم ، خروجي بدين صورت است : enter string :
good

enter string :
moorning.

result string is:
goodmoorning.

براي تمرين ميتوانيد برنامه را طوري تغيير دهيد كه بين دو عبارت ، يك فاصله
(blank) باشد .

تابع ()strlen
تابع ()strlen براي تعيين طول يك رشته مورد استفاده قرار گرفته و بصورت زير
به كار مي رود : strlen(s)
s
رشته اي است كه طول آن بايد تعيين شود .

مثال 3: main)(
{
char name[31] ;
puts(" enter a string: " );
gets(name );
printf("\n string length is:");
printf("%d"/strlen(name ));
}

نمونه اي از خروجي برنامه مثال 3 : enter a string:
the c language is very quick.

string length is:29

روش ديگر براي پيدا كردن طول يك رشته ، استفاده از تابع ()scanf با پارامتر
كنترلي %n است . با استفاده از تابع ()scanf و پارامتر %n ، مثال 3 را مي توان
بصورت زير نوشت : main)(
{
char name[31] ;
int count ;
scanf("%s%n"/name/&count);
printf("\n string length is:");
printf("%d"/count );
}


تابع ()strcmp
تابع ()strcmp براي مقايسه كاراكتري دو رشته مورد استفاده قرار ميگيرد و به
اين صورت بكار مي رود : strcmp(s1/s2)
s2
و s1و دو رشته اي هستند كه بايد با يكديگر مقايسه شوند . اين تابع نتيجه
مقايسه دو رشته را بصورت صفر ، منفي و يا مثبت مشخص مي كند :
نتيجه |(s1/s2()strcmp
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ s1=s2 | 0

منفي | s2 <َs1
مثبت | s2 >َs1

تابع ()strchr
تابع ()strchr براي جستجوي يك كاراكتر در يك رشته بكار مي رود و محل وجود
اولين وقوع آن را مشخص مي كند. اگر كاراكتر مورد نظر در رشته وجود نداشته باشد
مقداري كه توسط اين تابع برگردانده مي شود برابر با صفر است . اين تابع بصورت
زير استفاده مي شود : strchr(s/ ch)
ch
كاراكتري است كه بايد در رشته s جستجو شود. بعنوان مثال ، بااجراي دستور: if( strchr( "hello"/'e'))printf( "e is in hello");

چون حرف e در عبارت hello وجود دارد پيام مناسبي چاپ مي شود .

تابع ()strstr
تابع ()strstr براي جستجو زير رشته اي در يك رشته مورد استفاده قرار گرفته و
بصورت زير بكار مي رود : strstr(s1/s2)
s2
رشته اي است كه بايد در رشته s1 جستجو شود . اگر s2در s1ر پيدا شود محل
اولين وقوع آن توسط تابع برگردانده مي شود ولي اگر s2در s1ر وجود نداشته باشد
مقدار صفر برگردانده خواهد شد . بعنوان مثال ، با اجراي دستور : if( strstr( "this is"/"hi"))printf( "hi found");

بعلت وجود رشته hi در رشته this is ، پيام مناسبي صادر مي شود .

مثال 4: main)(
{
char s1[80] / s2[80] ;
char ch ;
puts(" enter string : " );
gets(s1 );
puts(" enter string : " );
gets(s2 );
puts("enter character for search");
printf(" in s1: " );
ch=getche )(;
printf("\n length of s1 is:");
printf("%d"/strlen(s1 ));
printf("\n length of s2 is:");
printf("%d" /strlen(s2 ));
if(!strcmp(s1/s2))
printf("\n string are equal. ");
if(strstr(s1/s2))
printf("\n is in . " );
else
printf("\n is not in .");
if(strstr(s1/ch))
printf("\ncharacter<%c>is in.");
else
{
printf("\ncharacter<%c>is");
printf(" not in .");
}
}

نمونه اي از خروجي برنامه مثال 4 : enter string :
this is a sample statement.
enter string :
sample
enter character for search in : m
length of is:28
length of is:6
is in .
character is


نویسنده مطلب : لوتوس   \  تاریخ درج : یکشنبه 29 خرداد1384   9:36 \

آرايه اي از رشته ها

دسته بندی : / لینک ثابت

گاهي ممكن است ، به عنوان مثال بخواهيم تعدادي از نام افراد را در آرايه اي
نگهداري كنيم : ولي با اطلاعاتي كه تاكنون از رشته ها داريم شايد نتوانيم چنين
كاري را انجام دهيم . براي اين كار بايد آرايه اي از رشته ها داشته باشيم . چون
رشته ها خود ازنوع آرايه هستند بايد آرايه اي ازآرايه ها را تعريف كنيم ( آرايه اي
از آرايه ها همان آرايه دوبعدي است ). براي توضيح بيشتر به مثال 1 توجه نماييد.

مثال : برنامه اي كه با تعريف آرايه اي از رشته ها ، 5 نام را در آن قرار
مي دهد و سپس با خواندن نامي از ورودي آنرا در آرايه جستجو مي كند . main)(
{
int dex/exist ;
int k ;
char name[21] ;
static char list [5][21]=
{ "ali" /
"ahmad" /
"alireza" /
"jalal" /
"mohammad"
} ;
printf("\nenter one name for");
printf(" search:");
gets(name );
for(dex=0 ; dex<5;dex++)
if(strcmp(list[dex]/name)==0)
{
exist=1 ;
break ;
}
if( exist==1)
{
printf("\nname ");
printf("<%s> exist in table."/name);
}
else
{
printf("\nname ");
printf("<%s> not exist. "/name);
}
}

دو نمونه از خروجي برنامه مثال بالا :
( الف ) enter one name for search:reza
name not exist.


( ب ) enter one name for search:ali
name exist in table.
ال بالا از تابع ()strcmp استفاده شده كه كارش مقايسه دو رشته مي باشد.


نویسنده مطلب : لوتوس   \  تاریخ درج : یکشنبه 29 خرداد1384   9:33 \

توابع ورودي خروجي رشته ها

دسته بندی : / لینک ثابت

در زبان C توابع متعددي وجود دارند كه در مورد رشته ها استفاده مي شوند .
اكثر اين توابع براي خواندن رشته ها از صفحه كليد و يا چاپ آنها در صفحه نمايش
بكار مي روند .

تابع ()gets
تابع ()gets براي خواندن رشته هااز صفحه كليد بكارميرود و بصورت زير استفاده
مي شود :
(متغير رشته اي )gets

مثال 1: main)(
{
char fname[21] ;
printf("enter your name: " );
gets(fname );
printf("\nyour name is : %s"/fname);
}

نمونه اي از خروجي برنامه مثال 1 : enter your name : bahrami
your name is : bahrami

شايد اين پرسش مطرح شود " با وجود تابع ()scanf كه مي تواند براي رشته ها و
متغيرهاي عددي استفاده شود چه لزومي دارد از تابع ()gets استفاده گردد " ? در
پاسخ به اين پرسش بايد گفت كه تابع ()scanf رشته ها را پيوسته در نظر مي گيرد .
يعني اگر در بين يك رشته ، از فاصله (blank) و يا tab استفاده شود ، از اين
كاراكترها ( فاصله و يا tab ) به بعد ، بعنوان رشته ديگري منظور ميشوند ( مثال 2
) . براي رفع اين اشكال مي توان از تابع ()gets استفاده نمود .

مثال 2: main)(
{
char name[21] ;
printf("enter your name family:");
scanf("%s"/gets(name );
printf("\n your name is : %s"/name );
}

نمونه اي از خروجي برنامه مثال 2 : enter your name : einollah jafarnezhad
your name is : einollah

همانطوري كه از خروجي برنامه پيداست ، در پاسخ به درخواست برنامه نام و نام
خانوادگي Einollah jafarnezhad را وارد نموده ايم كه چون بين نام و نام خانوادگي
فاصله افتاده است فقط نام (Einollah) در متغير name قرار گرفته و در خروجي چاپ
شده است ولي نام خانوادگي از دست رفته است . اگر بجاي scanf از تابع gets
استفاده شود اين مشكل پيش نخواهد آمد ، زيرا در ()gets فقط كليد enter ، جدا
كننده است .

تابع ()puts
اين تابع براي انتقال يك رشته به خروجي بكار مي رود و بصورت زير استفاده
مي شود .
(عبارت رشته اي )puts
هنگام استفاده از تابع puts، مي توان از يك متغير رشته اي و يا يك رشته ( كه
در داخل نقل قول (") باشد ) بجاي عبارت رشته اي استفاده كرد .

مثال 3: برنامه اي كه دو رشته را از ورودي خوانده و سپس محتويات يك رشته را
به رشته ديگر منتقل مي كند . طول هاي دو رشته ورودي مي توانند با يكديگر برابر
نباشند .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ main)(
{
char s1[81]/ s2[81] ;
int i / j ;
char temp ;
puts("enter string : " );
gets(s1 );
puts("enter string : " );
gets(s2 );
for(i=0 ; s1[i] && s2[i] ; i++)
{
temp=s1[i] ;
s1[i]=s2[i] ;
s2[i]=temp ;
}
if(s1[i])
{
j=i ;
while(s1[i])
s2[i]=s1[i++] ;
s2[i]\'\0' ;
s1[i]\'\0' ;
}
else if( s2[i])
{
j=i ;
while(s2[i])
s1[i]=s2[i++] ;
s2[i]\'\0' ;
s1[i]\'\0' ;
}

puts("new content of s1 is:" );
puts(s1 );
puts("new content of s2 is:" );
puts(s2 );
}

نمونه اي از خروجي برنامه مثال 3 : enter string :
first string
enter string :
second string
new content of s1 is:
second string
new content of s2 is:
first string


مثال 4: برنامه اي كه با خواندن يك رشته و دو كاراكتر از ورودي ، كاراكتر اول
را با كاراكتر دوم در سرتاسر رشته جايگزين مي كند . main)(
{
char string[50] ;
char source_letter/target_letter ;
int i ;
printf("\n enter the string :" );
gets(string );
printf("\n enter source character:" );
source_lette=getche )(;
printf("\n enter target character:" );
target_letter=getche )(;
if(source_letter != target_letter)
for(i=0 ; string[i] ; i++)
if(string[i]==source_letter)
string[i]=target_letter ;
printf("\n result string is:\n");
puts(string );
}

نمونه اي از خروجي برنامه مثال 4 : enter the string : in the name of allah.

enter source character: a
enter target character: A

result string is:in th


نویسنده مطلب : لوتوس   \  تاریخ درج : یکشنبه 29 خرداد1384   9:32 \

رشته ها

دسته بندی : / لینک ثابت

رشته ها معمولا" نوعي داده هستند كه در زبانهاي برنامه سازي به اشكال متفاوتي
مورد استفاده قرار گرفته و براي ذخيره كردن و دستكاري متن ها ، ( مثل كلمات
اسامي افراد ، جملات و غيره ) به كار مي روند . اما در زبان C رشته ها نوعي داده
نيستند بلكه به صورت آرايه اي از كاراكترها ( از نوع char ) هستند كه به NULL
( رشته تهي ) كه داراي ارزش عددي صفر است ختم ميشوند. براي نمايش NULL از '\0'
استفاده مي شود . بنابراين طول رشته ها را كه بصورت آرايه تعريف مي شوند ، بايد
به اندازه يك واحد بيش از مقدار لازم در نظر بگيريم . مثلا" اگر بخواهيم رشته اي
را كه طولاني ترين اسم آن داراي 30 حرف باشد ، براي ذخيره كردن اسامي افراد
تعريف كنيم بايد آرايه اي به طول 31 را در نظر بگيريم . كامپايلر زبان C كاراكتر NULL
را به انتهاي رشته ها اضافه مي كند و نيازي نيست كه برنامه نويس آن را در
انتهاي رشته ها قرار دهد .

مثال 1: main)(
{
char fname[21] ;
printf("enter your name: " );
scanf("%d"/fname );
printf("\nyour name is : %s"/fname);
}

نمونه اي از خروجي برنامه مثال 1 : enter your name : ali
your name is : ali

رشته Ali در متغير fname بصورت زير قرار مي گيرد :
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | a | l | i |\0 | | | | | | | | | | | | | | |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17


نكته اي كه در مورد مثال 1 بايد روشن شود اين است كه تاكنون براي خواندن
مقادير متغيرها از ورودي توسط تابع ()scanf ، اسم متغير را با & ذكر مي كرديم .
اما دليلي كه در اين مثال براي خواندن محتويات رشته fnameاز &ز استفاده نشده
اين است كه fname نام يك آرايه است و نام آرايه بعنوان يك آدرس به اولين عنصر


نویسنده مطلب : لوتوس   \  تاریخ درج : پنجشنبه 19 خرداد1384   23:5 \

ارزش دهي اوليه به آرايه ها

دسته بندی : / لینک ثابت

گاهي ممكن است در هنگام تعريف آرايه ها خواسته باشيم مقاديري را نيز به آنها
نسبت بدهيم . به اين مقادير ارزش هاي اوليه آرايه مي گوييم . بايد توجه داشت
كه فقط آرايه هاي داراي كلاس هاي حافظه 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 خرداد1384   22:56 \

آرايه ها

دسته بندی : / لینک ثابت

آرايه ، اسمي براي چند متغير همنوع است و يا بعبارت ديگر مجموعه اي است از
چند كميت كه داراي يك اسم باشند . به هر يك از اين كميت ها يك عنصر آرايه گفته
مي شود . دسترسي به هر يك از عناصر آرايه توسط نام آرايه و محل قرار گرفتن اين
عنصر در آرايه مشخص مي شود . نامگذاري براي آرايه ها از قانون نامگذاري براي
متغيرها تبعيت مي كند. بعنوان مثال ك مجموعه اي از دانشجويان يك كلاس مي توانند
تشكيل يك آرايه بدهند . اگر نام اين آرايه را 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 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 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 scanf("%d"/&list[i] );
m=(n+1)/2-1 ;
k=list[m] ;
if(k==0)
{
j=1 ;
sign=1 ;
while(j {
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.


آرايه هاي چند بعدي
تاكنون نحوه تعريف و استفاده از آرايه هاي يك بعدي را مورد بررسي قرار
داده ايم . اكنون مي خواهيم ببينيم كه " چگونه مي توان آرايه بيش از يك بعدي را
تعريف كرده و به عناصر آن دسترسي پيدا كرد " . در تعريف آرايه دو بعدي بايد 2
انديس و در تعريف آرايه سه بعدي بايد 3 انديس و در تعريف آرايه n بعدي بايد n
انديس را ذكر كرد . بعنوان مثال ، دستور : int table [10] [10];

يك آرايه دو بعدي بنام table را تعريف ميكند كه داراي 10 سطر و 10 ستون است
و نوع عناصر آن int است . دستور : int k[5] [10] [15];

آرايه اي سه بعدي بنام k را تعريف مي كند كه داراي 5 سطر ، 10 ستون و 15
ارتفاع است و نوع عناصر آن int مي باشد .
به دو نكته در مورد آرايه توجه كنيد : 1
عناصر آرايه در محل هاي متوالي حافظه ذخيره مي شوند . 2
عناصر آرايه به صورت سطر ذخيره مي شوند . بعنوان مثال اگر آرايه اي بصورت [4]
table [3] داشته باشيم مشابه شكل (2) در حافظه ذخيره مي شوند .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | table [0] [0] |
| table [0] [0] |
| table [0] [1] |
| table [0] [2] |
| table [0] [3] |
| table [1] [0] |
| table [1] [1] |
| table [1] [2] |
| table [1] [3] |
| table [2] [0] |
| table [2] [1] |
| table [2] [2] |
| table [2] [3] |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
شكل (2) . نحوه ذخيره شدن آرايه در حافظه

مثال 5: برنامه اي كه با محاسبه جدول ضرب اعداد 1 تا 10، ضمن قرار دادن آنها
در يك آرايه به خروجي نيز منتقل مي كند . main)(
{
int table[10] [10] ;
int i / j ;
for(i=0;i<10 ; i++)
for(i=0;i<10;i++)
table[i][j]=(i+1)*(j+1 );
for(i=0;i<10;i++)
{
for(i=0;i<10;i++)
printf("%4d"/table[i] [j] );
printf("\n" );
}
}

خروجي حاصل از مثال 5 : 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


مثال 6: برنامه اي كه دو ماتريس را از ورودي خوانده و با حاصل ضرب آنها ، به
خروجي منتقل مي كند . main)(
{
int mat1[2][3]/mat2[3][4] ;
static int mat3[2][4]={0} ;
int i/j/k/l ;
for(i=0 ; i<2 ; i++)
{
for(i=0 ; i<3 ; i++)
{
printf("\n\tenter");
printf(" mat1[%d][%d] :"/i/j);
scanf("%d"/&mat1[i][j] );
}
for(i=0 ; i<3 ; i++)
{
for(i=0 ; i<4 ; i++)
{
printf("\n\tenter");
printf(" mat2[%d][%d] :"/i/j);
scanf("%d"/&mat2[i][j] );
}
}
for(i=0 ; i<2 ; i++)
{
for(i=0 ; i<4 ; i++)
{
mat3[i][j]=0 ;
for(k=0 ;k<3 ; k++)
mat3[i][j]=mat3[i][j]+mat1[i][k]*
mat2[k][j];
}
}
printf("\nthe product of mat1 & ");
printf("mat2 is: \n\n" );
for(i=0 ;i<2 ;i++)
{
for(i=0 ; i<4 ; i++)
printf("%5d"/mat3[i][j] );
printf("\n\n" );
}
}

نمونه اي از خروجي برنامه مثال 6 : enter mat1[0][0]:1
enter mat1[0][1]:2
enter mat1[0][2]:3
enter mat1[1][0]:5
enter mat1[1][1]:4
enter mat1[1][2]:7
enter mat2[0][0]:8
enter mat2[0][1]:9
enter mat2[0][2]:5
enter mat2[0][3]:8
enter mat2[1][0]:10
enter mat2[1][1]:0
enter mat2[1][2]:12
enter mat2[1][3]:21
enter mat2[2][0]:0
enter mat2[2][1]:5
enter mat2[2][2]:9
enter mat2[2][3]:12

the product of mat1

نویسنده مطلب : لوتوس   \  تاریخ درج : پنجشنبه 19 خرداد1384   22:52 \

كلاسهاي حافظه

دسته بندی : / لینک ثابت

تاكنون برنامه هايي را نوشته ايم كه در بعضي از آنها از چند تابع نيز استفاده
شده است . در اين برنامه ها متغيرهاي مورد نياز هر تابع را در همان تابع تعريف
كرده ايم . متغيرهايي كه در يك تابع تعريف مي شوند در موقع انتقال كنترل اجراي
برنامه به آن تابع ايجاد شده ( حافظه به آنها تخصيص داده مي شود ) و در موقع
برگشت كنترل اجراي برنامه از آن تابع ، حافظه تخصيص يافته به متغيرهاي آن تابع
از آنها اخذ ميشود و به سيستم عامل برگردانده خواهد شد. يعني اين گونه متغيرها
فقط در همان تابعي كه تعريف يم شوند اعتبار دارند و در تابع ديگر قابل استفاده
نيستند . اين مساله حتي در مورد متغيرهاي همنام نيز صادق است . بدين معني كه
اگر به عنوان مثال متغيري به نام 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 بدون تعريف اين متغيرها از آنها استفاده شده است .
اگر توابع تعريف شده در يك برنامه علاوه بر متغيرهاي عمومي از متغيرهاي محلي
نيز استفاده نمايند و يك يا چند متغير محلي توابع ، با يك يا چند متغير عمومي
مراجعه داشته باشد ( مقدار آنرا تغيير دهد و يا مقدار آن متغير را مورداستفاده
قرار دهد ) تاثيري در متغير عمومي همنام با اين متغير محلي نخواهد داشت .

مثال 5: برنامه اي كه توابع موجود در آن علاوه بر استفاده از متغيرهاي عمومي
از متغيرهاي محلي همنام با متغيرهاي عمومي نيز استفاده مي كنند . int count ;
main)(
{
count=100 ;
func1 )(;
}

func1)(
{
int temp ;
temp=count ;
func2 )(;
printf("\n count is:%d"/count );
}

func2)(
{
int count ;
for(count=1/count<6;count++)
printf(" %c "/'*'
}

خروجي حاصل از اجراي برنامه مثال 5 : * * * * *
count is :100

در مثال 5 متغير count كه قبل از تابع ()main تعريف شد، يك متغير عمومي است
و متغير count كه در تابع ()func1 بكار رفته است ، همين متغير ميباشد. در تابع
()func2 متغيري به نام count تعريف شد كه محلي اين تابع مي باشد . لذا در اين
تابع هر مراجعه به متغير count مراجعه به متغيري است كه در اين تابع تعريف شده
است .
درشروع اجراي برنامه براي متغيرهاي عمومي ، حافظه اختصاص مي يابد و درپايان
اجراي برنامه ، اين حافظه از متغيرها اخذ مي گردد. بنابراين اگر تعداد متغيرهاي
عمومي زياد باشد تاثير بسزايي در ميزان حافظه مصرفي دارد . بهر حال در مواقعي
كه توابع موجود در برنامه به متغيرهاي مشتركي نياز داشته باشند ، خوب است از
متغيرهاي عمومي استفاده گردد. ولي بايد توجه داشت متغيرهايي كه بندرت در سراسر
برنامه مورد استفاده قرار مي گيرند ، بصورت متغيرهاي عمومي تعريف نگردند .
اگر برنامه هايي كه به زبان C نوشته مي شود طولاني باشد ، مي توان آن برنامه
را به قسمت هاي منطقي كوچكتري تقسيم كرده ، سپس هر قسمت را در يك فايل قرار
داده و پس از كامپايل كردن آنها به طور مجزا ، همه قسمت ها را با يكديگر اجرا
نمود . به هر يك از اين قسمت هاي مجزا ، يك واحد (unit) گفته مي شود . اگر
متغيرهايي در واحد اصلي تعريف شوند و بخواهيم از آنها در واحدهاي فرعي ديگر
استفاده كنيم ( بدون اين كه در واحدهاي فرعي به آنها حافظه اي اختصاص يابد )
بايد در واحدهاي فرعي توسط كلمه كليدي extern به كامپايلر گفته شود كه اين
متغيرها در جاي ديگري ( در واحد اصلي ) تعريف شده اند. در غير اين صورت استفاده
از متغيرهاي مورد نظر در واحدهاي ديگر ممكن نيست ( جدول 1 ) .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | file1 file2 |
| int s/y; extern int x/ y; |
| char ch; extern char ch; |
| main )(func 22 )(|
| { { |
| x=y/10; |
| } } |
| func 1 )(func 23 )(|
| { { |
| x=123; y=10; |
| } } |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
جدول (1) . كاربرد extern در واحدهاي مختلف يك برنامه

در جدول 1 كلمه كليدي extern به كامپايلر مي گويد كه متغيرهاي x، y،و chو
قبلا" در جاي ديگري تعريف شده اند ، لذا در برنامه file2 حافظه جديدي به آنها
اختصاص نمي يابد .
استفاده از كلمه كليدي extern درتوابع موجود در يك فايل نيز امكان پذير است
كه البته نيازي به آن نيست ( كاربرد extern در اين گونه موارد اختياري است ) .

مثال 6: برنامه اي كه كاربرد كلمه كليدي extern را در يك فايل نشان مي دهد . int first/second ;
main)(
{
extern int first/second ;
printf("\n enter two number: " );
scanf("%d%d"/&first/&second );
printf("\nsum is :%d"/first+second);
}

به نمونه اي از خروجي برنامه مثال 6 توجه نماييد : enter two number: 15 30
sum is:45

در برنامه مثال 6 دو متغير firstو secondو در خارج از تابع ()main تعريف
شده اند . دستور extern در تابع ()main به كامپايلر مي گويد كه اين متغيرها در
جاي ديگري ( در خارج از تابع اصلي ) تعريف شده اند . البته همانطور كه گفته شد
توابعي كه در يك فايل وجود دارند مي توانند از متغيرهاي عمومي استفاده كنند و
نياز به معرفي آنها توسط extern نيست .
متغيرهاي عمومي ، داراي كلاس حافظه خارجي (extern) هستند و داراي دو خصيصه
زير مي باشند : 1
طول عمر اين متغيرها ، از بدو اجراي برنامه تا خاتمه اجراي آن است . 2
محدوده حضور آنها در سراسر يك برنامه است .

كلاس حافظه استاتيك
متغيرهايي كه داراي كلاس حافظه استاتيك هستند مي توانند به دو دسته تقسيم
شوند :
الف ) متغيرهاي استاتيك محلي
ب ) متغيرهاي استاتيك عمومي

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

مثال 7: main)(
{
int i ;
void subroutine )(;
for(i=0 ; i<5 ; i++)
subroutine )(;
}

void subroutine)(
{
static int static_var=0 ;
int auto_var=0 ;
printf("\nautomatic=%d/"/auto_var);
printf("static=%d"'static_var );
auto_var ++;
static_var ++ ;
}

خروجي حاصل از اجراي برنامه مثال 7 : automatic=0/static=0
automatic=0/static=1
automatic=0/static=2
automatic=0/static=3
automatic=0/static=4

متغيرهاي استاتيك عمومي فقط در يك فايل ( در يك واحد ) از برنامه ، از جايي
كه تعريف مي شوند به بعد قابل دسترسي اند ( برخلاف متغيرهاي عمومي غير استاتيك
كه در همه واحدهاي يك برنامه قابل دسترسي اند ) . مثال هاي 8و 9و .

مثال 8: static int i/j ;
main)(
{
.
.
.
}

f1)(
{
.
.
.
}

f2)(
{
.
.
.
}

در مثال 8 متغيرهاي xو yو در تابع ()main و كليه توابعي كه بعد از آن تعريف
مي شوند قابل استفاده اند .

مثال 9: main)(
{
.
.
.
}

f1)(
{
.
.
.
}

static x/y ;
f2)(
{
.
.
.
}

f3)(
{
.
.
.
}

در مثال 9 ، متغيرهاي xو yو در توابع ()main و ()f1 قابل دسترسي نيستند ولي
در دو تابع ()f2 و ()f3 و كليه توابعي كه بعداز آن تعريف ميشوند، قابل استفاده
هستند .
استفاده كلاس حافظه استاتيك درپنهان سازي اطلاعات (information hide) ميباشد.

كلاس حافظه ثبات
ذخيره هايي كه داراي كلاس حافظه هستند در صورت امكان در يكي از ثبات هاي CPU
قرار مي گيرند . لذا سرعت انجام عمليات با آنها بسيار بالا است و موجب افزايش
سرعت اجراي برنامه مي شود . كليه متغيرهاي اتوماتيك و آرگومان هاي توابع
مي توانند داراي كلاس حافظه ثبات باشند .
در مورد كلاس حافظه ثبات محدوديتهاي زير را داريم : 1
از آنجايي كه تعداد ثباتهاي CPU محدود است ، تعداد كمي از متغيرها را
مي توان با كلاس حافظه ثبات تعريف كرد . اگر تعداد متغيرهاي با كلاس حافظه ثبات
زياد باشد كامپايلر كلاس حافظه ثبات را از متغيرها حذف مي كند . 2
انواع متغيرهايي كه ميتوانند داراي كلاس حافظه ثبات باشند، دركامپيوترهاي
مختلف متفاوت است و معمولا" نوع هاي int، char،و pointerو مي توانند داراي كلاس
حافظه ثبات باشند . 3
آدرس متغيري كه داراي كلاس حافظه ثبات باشد، عملا" مفهوم نخواهد داشت و يا
به عبارت ديگر، عملگر & را نميتوان براي متغيرهاي با كلاس حافظه ثبات بكار گرفت
( چون اين متغيرها در ثبات CPU قرار دارند ) .

مثال 10: int n/fact=1 ;
main)(
{
printf("\n enter a number(1-9: )");
scanf("%d/&n );
factolial )(;
printf("\nfactolial of number:%d"/n);
printf(" is :%d"/fact );
}

factorial)(
{
register int i ;
for(i=2 ; i<=n ; i++)
fact *=i ;
}
.


نویسنده مطلب : لوتوس   \  تاریخ درج : سه شنبه 17 خرداد1384   1:28 \

تعيين نوع تابع

دسته بندی : / لینک ثابت

همانطور كه قبلا" گفته شد اگر در حين تعريف تابع از ذكر نوع آن خودداري شود
كامپايلر فرض مي كند مقداري كه توسط اين تابع برگردانده مي شود ( توسط دستور 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

نویسنده مطلب : لوتوس   \  تاریخ درج : سه شنبه 17 خرداد1384   1:7 \

انواع فراخواني و مقاديري كه توابع برمي گردانند

دسته بندی : / لینک ثابت

همانطوريكه قبلا" گفتيم ، توابع از نظر تعداد مقاديري كه به تابع فراخواننده
برمي گردانند به سه دسته تقسيم مي شوند كه يك دسته از آنها ( توابعي كه هيچ
مقداري را برنمي گردانند ) را مورد بررسي قرار داده ايم .
توابع در زبان 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و هستند ، محاسبه مي كند و به گرداند .

نویسنده مطلب : لوتوس   \  تاریخ درج : سه شنبه 17 خرداد1384   1:4 \

FileZilla Server 0.9.8

دسته بندی : / لینک ثابت

 

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





حجم : تقریبا 2 مگابایت
Program is full
Download


نویسنده مطلب : لوتوس   \  تاریخ درج : پنجشنبه 12 خرداد1384   10:19 \

eDonkey 2000 1.1.13 Beta

دسته بندی : / لینک ثابت

 

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




حجم : 3.38 مگابايت
Download


نویسنده مطلب : لوتوس   \  تاریخ درج : پنجشنبه 12 خرداد1384   10:17 \

انواع فراخواني و مقاديري كه توابع برمي گردانند

دسته بندی : / لینک ثابت

همانطوريكه قبلا" گفتيم ، توابع از نظر تعداد مقاديري كه به تابع فراخواننده
برمي گردانند به سه دسته تقسيم مي شوند كه يك دسته از آنها ( توابعي كه هيچ
مقداري را برنمي گردانند ) را مورد بررسي قرار داده ايم .
توابع در زبان 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و هستند ، محاسبه مي كند و به گرداند .


نویسنده مطلب : لوتوس   \  تاریخ درج : پنجشنبه 12 خرداد1384   10:14 \

توابعی که هیچ مقداری را برنمیگردانند.

دسته بندی : / لینک ثابت

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

مثال 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


نویسنده مطلب : لوتوس   \  تاریخ درج : پنجشنبه 12 خرداد1384   10:13 \

توابع و كلاسهاي حافظه

دسته بندی : / لینک ثابت

در مورد برنامه هاي طولاني و پيچيده كه شامل چندين قسمت منطقي تقريبا" مستقلي
هستند بهتر است براي هر قسمت منطقي ، برنامه اي نوشته و سپس آنها را به يكديگر
متصل (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 آمده اند پارامتر تابع مي گوييم . همانطور كه ملاحظه وانند هم نام نباشند .


نویسنده مطلب : لوتوس   \  تاریخ درج : پنجشنبه 12 خرداد1384   10:12 \

ساختارهاي تصميم

دسته بندی : / لینک ثابت

ساختارهاي تكرار،امكانات خوبي براي تكرار اجراي مجموعه اي از دستورات برنامه
مي باشند . اما اگر بخواهيم تحت شرايطي كه در برنامه اتفاق مي افتد تصميم گيري
لازم را داشته باشيم بطوري كه تحت شرايطي ، مجموعه اي از دستورات اجرا شوند و
مجموعه اي ديگر از دستورات اجرا نشده وكنترل اجراي برنامه بجاي ديگر منتقل شود
به ابزار ديگري بنام ساختارهاي تصميم نياز داريم . اين ساختارها در زبان هاي
برنامه سازي مختلف به اشكال متفاوتي وجود دارند كه انواع مختلف آن را در زبان 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


مثال 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: &


ساختار switch
ساختار switch كه يكي از ساختارهاي جالب جهت بالا بردن توانايي برنامه است
بصورت زير استفاده مي شود :
( عبارت ) switch {

:مقدار case 1
مجموعه دستورات 1 break;

:مقدار case 2
مجموعه دستورات 2 break;
.
.
.
default:

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

نحوه عمل ساختار switch بدين صورت است كه : عبارت ذكر شده در switch ارزيابي
مي شود ، سپس نتيجه ارزيابي از بالا به پايين با مقادير ذكر شده ( مقدار 1
مقدار 2 و ... ) مقايسه مي شود ( ابتدا با " مقدار " 1 مقايسه مي گردد ) اگر
نتيجه ارزيابي بااين مقدار برابر باشد مجموعه دستورات داخل آن case اجرا ميشود
و با دستور break كنترل اجراي برنامه از اين ساختار خارج مي شود . اگر نتيجه
ارزيابي با " مقدار " 1 برابر نباشد ، مقايسه با " مقدار " 2 انجام مي شود و
اين روند تا انتهاي اين ساختار ادامه پيدا مي كند . اگر هيچكدام از مقاديري كه
در case ذكر شده اند با نتيجه ارزيابي " عبارت " برابر نباشند ، مجموعه دستورات
پس از defaule اجرا مي شود . defaule اختياري است و ممكن است در ساختار switch
استفاده نگردد. در اين صورت اگر هيچكدام از مقادير 1، 2 و... با نتيجه ارزيابي "
عبارت " برابر نباشند ، كنترل به بعد از ساختار switch برخواهد گشت .
حداكثر تعداد case كه در يك ساختار switch مي تواند قرار گيرد برابر با 257
است .
نكاتي كه در مورد ساختار switch بايد در نظر داشت عبارتند از : 1
اين ساختار با ساختار if از اين جهت متفاوت است كه در ساختار switch فقط
مساله " مساوي بودن "(equality() مطرح است اما در ساختار if مي توان يك عبارت
منطقي و يا رابطه اي را مورد بررسي قرار داد . 2
دو يا چند case در ساختار switch نمي توانند يك مقدار مساوي را مورد تست
قرار دهند . بعضي در نحوه كاربرد ساختار switch ، مقدار 1 ، مقدار 2 و ...
نمي توانند با يكديگر برابر باشند . 3
اگر ثابت هاي كاراكتري در ساختارswitch بكار گرفته شوند، آنها به مقادير "
صحيح " تبديل مي شوند . 4
اگر در يك case از دستور break استفاده نشود پس از اجراي مجموعه دستورات
مربوط بخ اين case مجموعه دستورات موجود در case بعدي نيز اجرا مي شوند . 5
دو يا چند شرط را مي توان در ساختار switch با يكديگر OR نمود كه براي
اين منظور كافي است چند case را با مقاديري كه مي خواهيم با هم OR شوند پشت سر
هم ذكر كنيم ( مثال 11 ) .

مثال 10: برنامه اي كه دو عدد و يكي از عملگرهاي چهار عمل اصلي را از ورودي
خوانده و عملگر را بر روي دو عدد عمل مي كند . main)(
{
int num1 / num2 ;
char op ;
while(1)
{
printf("type number/operator/");
printf("number \n" );
scanf("%d%c%d"/&num1/&op/&num2);
switch(op)
{
case '+':
printf("\nsum=%d"/num1+num2);
break ;
case '-':
printf("\nsubtract=%d"/num1-num2);
break ;
case '*':
printf("\nmultiple=%d"/num1*num2);
break ;
case '/':
printf("\ndivition=%d"/num1+num2);
break ;
default:
printf("\n operator is illegal");
printf("\n\n" );
}
}

به نمونه اي از خروجي حاصل از اجراي برنامه مثال 10 توجه نماييد : 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

اگر بجاي علامت *از 'x'ز و يا بجاي '/'از '\'ز استفاده گردد، اين برنامه عمل
نخواهد كرد . اما برنامه ذيل ( مثال 11 ) طوري طراحي شده است كه با استفاده از
امكان تركيب شرطهاي مختلف در ساختار switch ، به اين دو مورد نيز پاسخ دهد .

مثال 11: برنامه اي كه دو عدد و يكي از عملگرهاي چهار عمل اصلي را از ورودي
خوانده و آن عملگر را بر روي آن دو عدد عمل مي كند . main)(
{
int num1 / num2 ;
char op ;
while(1)
{
printf("type number/operator/");
printf("number \n" );
scanf("%d%c%d"/&num1/&op/&num2);
switch(op)
{
case '+':
printf("\nsum=%d"/num1+num2);
break ;
case '-':
printf("\nsubtract=%d"/num1-num2);
break ;
case '*':
case 'x':
printf("\nmultiple=%d"/num1*num2);
break ;
case '/':
case '\\':
printf("\ndivition=%d"/num1+num2);
break ;
default:
printf("\noperator is illegal");
}
printf("\n\n" );
}
}

نمونه اي از خروجي حاصل از اجراي برنامه مثال 11 : type number/operator/number
20 x 4
multiple=80

type number/operator/number
60 \ 3
division=2o

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

type number/operator/number
12 + 23
sum=35

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

type number/operator/number

^c


مثال 12: برنامه اي كه اطلاعات تعدادي از ورودي خوانده و سپس معدل هر دانشجو
را محاسبه مي نمايد. پس از محاسبه معدل ، دانشجويان ممتاز ( معدل بيشتر از 17 )
و دانشجويان مشروط ( معدل كمتر از 12 ) را مشخص و در خروجي چاپ مي كند . main)(
{
int sumgrad/sumunit/number ;
int cours/unit/grad/aver/j/n=0 ;
char name[20] ;
printf("enter number of student:\t");
scanf("%d"/&number);
while(n!=number)
{
n++ ;
sumunit=sumgrad=j=0 ;
printf("\n enter name of student ");
printf("%d:"/n );
scanf("%s"/&name );
printf("\n enter number of cours ");
printf("of this st:.");
scanf("%d"/&cours );
while(j!=cours)
{
printf("\n enter unit of cours");
printf(" %d:"/j+1 );
scanf("%d"/&unit );
printf("\n enter grade of cours");
printf(" %d:"/j+1 );
scanf("%d"/&grad );
sumunit=sumunit+unit ;
sumgrad=sumgrad+grad*unit ;
j++ ;
}
aver=sumgrad/sumunit ;
printf("\n average is:\t" );
printf("%d"/aver );
if(aver<12)
{
printf("\n student is probation");
printf("... ");
}
else if(aver>17)
{
printf("\n student is exelent");
printf("... ");
}
}
}

به نمونه اي ازخروجي مثال 12 كه براي دو نفر ازدانشجويان عمل نموده است توجه
نماييد . enter number of students :2
enter name of student 1: ali
enter number of cours of this st:.2
enter unit of cours 1:2
enter grade of cours 1:19
enter unit of cours 2:3
enter grade of cours 2:20
aver is : 19
studnt is exelent...

enter name of student 2: reza

enter number of cours of this st:.3
enter unit of cours 1:2
enter grade of cours 1:12
enter unit of


نویسنده مطلب : لوتوس   \  تاریخ درج : پنجشنبه 12 خرداد1384   10:11 \

ساختارهاي تكرار

دسته بندی : / لینک ثابت

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

ساختار تكرار for
ساختار for يكي ازامكانات ايجاد حلقه تكرار ميباشد كه بصورتهاي زير استفاده
مي شود :
(َ1) ;دستور(گام حركت ;شرط حلقه ;مقدار اوليه انديس حلقه ) for
(َ2) (گام حركت ;شرط حلقه ;مقدار اوليه انديس حلقه ) for {

مجموعه دستورات }
for(;;( )3)
{

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

نكاتي كه بايد در مورد نحوه كاربرد ساختار تكرار for در نظر داشت عبارتند
از : 1
دستوري كه بعد از ساختار for آمده است مي تواند در خط ديگري تايپ شود . 2
ساختار forبه ; ختم نمي شود . زيرا در غير اين صوتر مجموعه دستوراتي كه
اجراي آنها بايد تكرار شود ، فقط يك بار اجرا خواهند شد . 3
علامت { در نحوه كاربرد دوم و سوم ، مي توانند در همان خطي كه ساختار for
آمده است قرار گيرند . 4
بعد از اولين مقدار انديس حلقه و شرط حلقه ; قرار مي گيرد .
ساختار for در مواردي مفيد است كه تعداد دفعات تكرار مجموعه اي از دستورات
معلوم باشد ، هر حلقه تكرار داراي يك شمارنده است كه تعداد دفعات تكرار اجراي
دستورات داخل حلقه را مشخص مي كند. اين شمارنده ، انديس حلقه نامگذاري مي شود.
انديس حلقه مي تواند مثبت ، منفي ، صحيح و يا اعشاري باشد . مقدار اوليه انديس
حلقه مشخص مي كند كه شمارنده ، از چه مقداري شروع مي شود. شرط حلقه مشخص ميكند
كه مجموعه دستورات داخل حلقه تكرار ، تحت چه شرايطي اجرا مي شوند . گام حركت
مشخص مي كند كه در هر بار اجراي مجموعه دستورات داخل تكرار ، چه مقداري به
شمارنده حلقه اضافه مي شود . گام حركت مي تواند مثبت منفي ، صحيح و يا اعشاري
باشد . بعنوان مثال در دستور : for( i=0;i<5;i++)
printf("\n the value of i is:%d / i);
i
انديس حلقه تكرار است كه مقدار اوليه آن برابر با صفر است . شرط حلقه
تكرار اين است كه i كوچكتر از 5 باشد و گام حركت نيز 1 است كه با i++ مشخص شده
است . خروجي حاصل از اجراي اين دستور بصورت زير است : 0
1
2
3
4

مثال 1: برنامه اي كه تعداد 10 عدد را از ورودي خوانده ، ميانگين آنها را
محاسبه كرده و به خروجي مي برد : main)(
{
int i / sum=0 / num ;
float ave ;
for(i=1 ; i<=10 ; i++)
{
printf("enter number %d: "/i );
scanf("%d"/&num );
sum+=num ;
printf("\n" );
}
ave-sum/10 ;
printf("\n the average is:%f "/ave);
}

خروجي حاصل از اجراي برنامه مثال 1 : enter number 1 : 12
enter number 2 : 13
enter number 3 : 17
enter number 4 : 18
enter number 5 : 16
enter number 6 : 20
enter number 7 : 23
enter number 8 : 28
enter number 9 : 31
enter number 10 : 14

the average is:19.000000


مثال 2: برنامه زير جدول كدهاي اسكي را در خروجي چاپ مي كند : main)(
{
int i ;
for(i=41 ; i<=120 ; i++)
{
printf("%3d=%c\t"/i/i );
if(i%5==0 )printf("\n" );
}
}

برنامه فوق با چند دستور ساده توانسته است جدول زير را در خروجي چاپ كند . 41= )42=* 43=+ 44=/ 45=-
46= .47=/ 48=0 49=1 50=2
51=3 52=4 53=5 54=6 55=7
56=8 57=9 58= :59=; 60=<
61== 62=> 63=? 64=@ 65=A
66=B 67=C 68=D 69=E 70=F
71=G 72=H 73=I 74=J 75=K
76=L 77=M 78=N 79=O 80=P
81=Q 82=R 83=S 84=T 85=U
86=V 87=W 88=X 89=Y 90=Z
91=[ 92=\ 93=] 94=^ 95=_
96=` 97=a 98=b 99=c 100=d
101=e 102=f 103=g 104=h 105=i
106=j 107=k 108=l 109=m 110=n
111=o 112=p 113=q 114=r 115=s
116=t 117=u 118=v 119=w 120=x

اگر بخواهيم اين برنامه را در زبانهاي ديگر بنويسيم ، برنامه طولاني تري به
دست مي آيد .

مثال 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 نيز امكان پذير است . استفاده گردد .


نویسنده مطلب : لوتوس   \  تاریخ درج : پنجشنبه 12 خرداد1384   10:8 \

نوشتن يك كاراكتر در خروجي

دسته بندی : / لینک ثابت

براي نوشتن يك كاراكتر در خروجي علاوه بر تابع ()printf ، دو تابع ديگر نيز
معمولا" مورد استفاده قرار ميگيرند. قبل از بررسي آنها به مثالي درمورد ()print
كه منجر به چاپ يك كاراكتر در خروجي مي گردد . مي پردازيم . main)(
{
printf("example for character");
printf(": %c"/'a' );
}

خروجي حاصل از اجراي برنامه فوق ، حرف a است . example for character :a


تابع ()putch
اين تابع براي نوشتن يك كاراكتر در صفحه نمايش مورد استفاده قرار گرفته و
بدين صورت استفاده مي شود : ;
( متغير ) putch

مثال 1: main)(
{
char ch ;
printf("\n enter a character: ");
ch=getch )(;
printf("you typed the character:");
putch(ch );
}

خروجي حاصل بصورت زير است : enter a character:
you typed the character : s

براي نوشتن يك كاراكتر توسط تابع ()putch اين تابع را بصورت زير هم مي توان
بكار برد : putch('a');

دستور فوق موجب چاپ كاراكتر a در خروجي مي شود .

تابع ()putchar
اين تابع همانند تابع ()putch براي نوشتن يك كاراكتر در صفحه نمايش به كار
مي رود و بصورت زير استفاده مي شود : ;
( متغير )putchar

مثال 2: #include "stdio.h"
main)(
{
char ch ;
printf("enter a character :" );
ch=getch )(;
printf("\n you typed: " );
putchar(ch );
}

به نمونه اي از خروجي برنامه مثال 2 كه در زير آمده است توجه كنيد : enter a character:
you typed : s
براي نوشتن حرف a در خروجي تابع ()putchar بصورت ;('a')putch بكار مي رود .

نویسنده مطلب : لوتوس   \  تاریخ درج : دوشنبه 9 خرداد1384   20:2 \

خواندن يك كاراكتر از ورودي

دسته بندی : / لینک ثابت

براي خواندن يك كاراكتر از ورودي ، علاوه بر تابع ()scanf از