تحقیق درباره زبان سی

راهنمای سایت

سایت اقدام پژوهی -  گزارش تخصصی و فایل های مورد نیاز فرهنگیان

1 -با اطمینان خرید کنید ، پشتیبان سایت همیشه در خدمت شما می باشد .فایل ها بعد از خرید بصورت ورد و قابل ویرایش به دست شما خواهد رسید. پشتیبانی : بااسمس و واتساپ: 09159886819  -  صارمی

2- شما با هر کارت بانکی عضو شتاب (همه کارت های عضو شتاب ) و داشتن رمز دوم کارت خود و cvv2  و تاریخ انقاضاکارت ، می توانید بصورت آنلاین از سامانه پرداخت بانکی  (که کاملا مطمئن و محافظت شده می باشد ) خرید نمائید .

3 - درهنگام خرید اگر ایمیل ندارید ، در قسمت ایمیل ، ایمیل http://up.asemankafinet.ir/view/2488784/email.png  را بنویسید.

http://up.asemankafinet.ir/view/2518890/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C%20%D8%AE%D8%B1%DB%8C%D8%AF%20%D8%A2%D9%86%D9%84%D8%A7%DB%8C%D9%86.jpghttp://up.asemankafinet.ir/view/2518891/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C%20%D8%AE%D8%B1%DB%8C%D8%AF%20%DA%A9%D8%A7%D8%B1%D8%AA%20%D8%A8%D9%87%20%DA%A9%D8%A7%D8%B1%D8%AA.jpg

لیست گزارش تخصصی   لیست اقدام پژوهی     لیست کلیه طرح درس ها

پشتیبانی سایت

در صورت هر گونه مشکل در دریافت فایل بعد از خرید به شماره 09159886819 در شاد ، تلگرام و یا نرم افزار ایتا  پیام بدهید
آیدی ما در نرم افزار شاد : @asemankafinet

تحقیق درباره زبان c

بازديد: 645

 

بخش اول

   ·          زبان c  يك زبان سطح مياني است .

كلمات كليدي شاخص در اين زبان عبارتند از :

auto

do

goto

signed

void

break

double

if

sizeof

while

case

else

int

static

 

char

enum

long

switch

 

const

extem

register

typedef

 

continue

float

returm

union

 

default

for

short

unsigned

 

انواع داده در c  :

   ·          زبان c  شامل شش نوع اصلي مي باشد كه عبارتند از void ,enum double , float , int , char.

   ·          در زبان c  برخي از انواع داده ها مي توانند با عباراتي نظير long  short , unsigned , signed تركيب شده ونوع داده أي ديگري را بوجود آورند.

   ·          هيچكدام از اين عبارات نمي توانند با نوع داده أي void  تركيب شوند.

   ·          نوع داده أي void  يك نوع داده تهي است يا به عبارت ديگر هيچ نوعي ندارد .

جدول زير انواع داده ها و حالات مختلف تركيب اين عبارات ذكر شده با انواع داده ها را نشان مي دهد .

بازه

طول

نوع داده

128- تا 127

1 بايت

char

0 تا 255

1 بايت

unsigned char

32768- تا 32767

2 بايت

enum

32768- تا 32767

2 بايت

int

0 تا65535

2 بايت

unsigned int

32768- تا 32767

2 بايت

short int

2147483648- تا 2147483648

4 بايت

long

0تا4294967295

4 بايت

unsigned long

 

4 بايت

float

 

8 بايت

double

 

10بايت

long double

   ·          نوع داده أي long با long int‌ يكي است.

قوانين تعريف متغيرها

   ·          نام متغير شامل حروف a  تا z  بزرگ يا كوچك ، a  تا z  ،‌ارقام 0 تا 9 و خط ربط (ـ) است .

   ·          كاراكتر شروع نام متغير نبايد يك عدد باشد .

   ·          حداكثر تعداد كاراكتر هاي نام متغير 32 كاراكتر است.

int var 1 , var2;

char ch;

unsigned int i;

مقدار دهي به متغيرها

1-     به هنگام تعريف متغير

int b,c,d=4,e;

char ch=’a’;

2-     پس از تعريف

b=0;

c=d=2;

   ·          در c   مقدار دهي اوليه به متغيرها توسط كامپايلر انجام نمي گيرد .

   ·          با استفاده از كلمه كليدي const   مي توانيم ثابتهايي تعريف كنيم كه مقدار آنها در طول اجراي برنامه ثابت است . نحوه تعريف اين متغير ها بصورت زير است :

ليست متغيرها نوع const

const int a=10, b=20;

   ·          اگر const ها را مقداردهي اوليه نكنيم از سوي كامپايلر پيغام خطا صادر  مي شود .

عملگر ها

   ·          نمادهاي هستند كه براي انجام اعمال خاصي مورد استفاده قرار مي گيرند .

   ·          عملگرها به چهار دسته محاسباتي ، رابطه أي ، منطقي و بيتي تقسيم مي شوند .

عملگر هاي محاسباتي

عملگر

نام

مثال

+

جمع و مثبت يكاني

x+y , +x

-

تفريق و منهاي يكاني

x-y, -x

*

ضرب

x*y

/

تقسيم

x/y

%

باقيمانده تقسيم

x%y

--

كاهش يك واحد

x--,--x

++

افزايش يك واحد

x++,++x

 

   ·          دستور ++x  يا x++ معادل دستور x=x+1 است

   ·          دستور x-- يا –x معادل دستور x=x-1  است

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

   ·          اگر عمگرهاي ++ و -- نظير بعد از عملوند قرار گيرند مقدار فعلي عملوند مورد استفاده قرار گرفته و سپس عملگرها بر روي آن عمل مي كنند

a=4;

b=a++;

   ·          ابتدا مقدار 4  به متغير b   نسبت داده ميشود و سپس مقدار a   يك واحد افزايش يافته و 5   مي شود .

   ·          اگر عملگرهاي ++و -- قبل از عملوند مربوطه قرار گيرند پس از افزايش يا كاهش يك واحد به آنها مقدار جديد در عبارات مورد استفاده قرار مي گيرند.

a=5;

b=++a;

   ·          ابتدا مقدارa يك واحد افزايش يافته و سپس بهb  نسبت داده مي شود.

 

تقدم عملگرهاي محاسباتي

نام

عملگر

كاهش و افزايش واحد

-- ++

منفي و مثبت يكاني

- +

باقيمانده تقسيم ، تقسيم ،‌ضرب

% / *

تفريق و جمع

- +

 

عملگرهاي محاسباتي – انتسابي

عملگر 

نام

مثال

معادل

=+

انتساب جمع

x+=y;

x=x+y;

=-

انتساب تفريق

x-=y;

x=x-y;

=*

انتساب ضرب

x*=y;

x=x*y;

/=

انتساب تقسيم

x/=y;

x=x/y;

=%

انتساب باقيمانده

x%=y;

x=x%y;

 

عملگر هاي رابطه أي

عملگر

نام

مثال

> 

بزرگتر

x>y

>=

بزرگتر مساوي

x>=y

< 

كوچكتر

x<y

=<

كوچكتر مساوي

x<=y

==

مساوي

x= =y

=!

نامساوي

x!=y

 

عملگر هاي منطقي

بر روي عملوند هاي منطقي عمل مي كنند .

عملگر

نام

مثال

&&

و (and)

x>y && y<z

 ||

يا (or)

x>y || y<z

!

نقيض (not)

!x

 

   ·          در زبان c  ارزش نادرستي (false) با مقدار صفر و ارزش درستي (true) با مقدار غير صفر مشخص مي شود .

عملگرهاي بيتي

   ·          اين عملگر ها فقط بر روي متغير هاي نوع int , char   عمل مي كنند و روي متغيرهايي از ساير نوعها مانند double , float و . . . . قابل اجرا نيستند .

عملگر

نوع عمل

&

and (و)

|

or (يا )

^

xor (يا انحصاري )

~

not (نقيض يا متمم 1)

>> 

انتقال به سمت راست

<<

انتقال به سمت چپ

نحوه كاربرد عملگر هاي شيفت به صورت زير است :

تعداد انتقال >> متغير

تعداد انتقال <<  متغير

   ·          هر انتقال معادل راست به تقسيم كردن مقدار متغير به 2 و هر انتقال به چپ معادل ضرب كردن در 2 است .

   ·          در صورت از دست دادن اطلاعات واقعي در شيفت به چپ  يا راست مساله ضرب در 2 شدن با تقسيم بر 2 شدن صدق نمي كند.

   ·          عملگر ~   در متغير كليه بيتها را نقيض مي كند يعني بيت صفر را تبديل به يك كرده و بيت يك را تبديل به صفر مي نمايد .

عملگر ?:
نحوه كاربرد:

exp1? exp2: exp3: = متغير

   ·          ابتدا exp 1  ارزيابي مي شود اگر داراي ارزش true   باشد مقدار exp2   پس از ارزيابي در متغير قرار مي گيرد و گرنه مقدار exp3   ارزيابي مي شود و نتيجه به متغير منتقل مي شود .

x=(a>b)?5:10;

در مثال فوق چنانچه a ‌ از b   بزرگتر باش مقدار 5 ‌ و در غير اينصورت مقدار 10 ‌ به x ‌ نسبت داده مي شود .

عملگر هاي *,&

   ·          عملگر & يك عملگر يكاني است كه آدرس عملوند خود را مشخص مي كند نحوه كاربرد به صورت زير است .

نام عملوند &

int *p, num ,m ;

p=&num;

   ·          عملگر *  يك عملگر يكاني است كه محتويات يك آدرس حافظه را مشخص مي كند

p=&num; m=*p;

عملگر  sizeof

   ·          جهت محاسبه طول يك نوع و يا يك متغير به كار مي رود .

نحوه كاربرد .

);متغير يا نوع ) sizeof

;متغير sizeof

int a,b,c;

a=sizeof (int);

b=sizeof c ;

تقدم عملگر ها در حالت كلي

[]  ()

!  ~  ++  --  *  &  sizeof

*  /  %

+  -

<<  >>

<   <=  >  >=

= =  !=

&

^

|

&&

||

?:

=  +=  -=  *=  /=  %=

 

int x=5 , y=10 , k=4,s=2

s+=  ++ x << y % x / 2 ! = k<y

 

تبديل انواع داده أي به يكديگر

معمولاً در دو حالت انجام مي شود 1- در عبارات 2- در حكم انتساب

   ·          وقتيكه متغيرها با نوع هاي مختلف در يك عبارت با يكديگر تركيب مي شوند با تبديل نوع صورت مي گيرد

   ·          نوعهاي با طول كوچكتر به نوعهاي با طول بزرگتر تبديل مي شود

char ch;

int i ;

floate f;

double d;

result  =  (ch   /   i) + (f    *    d) – (f    +    i)

 

 

 

 

 

 

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

   ·          در c  چنانچه انواع گوناگون (به غير از اشاره گرها) را به يكديگر نسبت دهيم پيغام خطايي صادر نمي شود.

نوع مبدا

نوع مقصد

اطلاعاتي كه از بين مي رود

char

unsined char

اگر عدد بزرگتر از 127 باشد مقصد منفي شد

short int

char

8 بيت با ارزش

long int

char

24 بيت با ارزش

long int

int

16 بيت با ارزش

float

int

قسمت كسري يابيشترو نتيجه حاصل گردميشود

double

float

قسمت كسري يا بيشترونتيجه حاصل گردميشود

   ·          وقتي نوع بزرگتري به نوع كوچكتر انتساب داده مي شود قسمتي از اطلاعات از بين مي رود .

 

ساختار برنامه هاي c

   ·          هر برنامه در زبان c   داراي يك تابع به نام main()‌ است .

   ·          در زبان c ‌ توابع را به دو صورت مي توان تعريف نمود .

حالت اول : توابع قبل از تابع main()‌ تعريف شوند .

func() {

.

.

.

}

.

.

.

main(){

.

.

.

}

حالت دوم : عنوان (header)‌ توابع را قبل از تابع main()‌ تعريف كنيم و خود توابع را بعد از تابع main ()‌ قرار دهيم

func();

.

main(){

.

.

.

}

func(){

.

.

.

}

   ·          تعريف يك تابع در داخل تابع ديگر امكان پذير نيست ولي هر تابع مي تواند يك يا چند تابع ديگر را فراخواني كند.

   ·          در زبان c ‌ در هر جاي برنامه مي توان متغير ها را تعريف كرد هر بلاك برنامه با علامت }‌شروع و با علامت { ‌ پايان مي يابد.

   ·          جدا كننده دستورات  ;  است .

   ·          مي توان چند دستور را در يك سطر نوشت.

   ·          مي توان يك دستور را در چند سطر ادامه داد .

   ·          چنانچه نوع خروجي يك تابع تعيين نشود به طور پيش فرض از نوع int   در نظر گرفته مي شود.

چند تابع ورودي و خروجي

تابع printf

شكل كلي :

“,   رشته هاي ثابت ، كاراكترهاي كنترلي و فرمت هاي خروجيprintf(“

;(اطلاعات خروجي

 

   ·          اطلاعات خروجي با فرمت مشخص شده در قسمت فرمت به خروجي منتقل مي شوند.

   ·          كاراكترهاي كه براي تعيين فرمت خروجي مورد استفاده قرار مي گيرند با كاراكتر %‌ شروع مي شوند وكاراكترهاي كنترلي با كاراكتر 1 شروع مي شوند .

   ·          خروجي تابع  printf  تعداد كاراكترهايي است كه توانسته است بر روي خروجي ارسال كند.

برخي از كاراكترهاي فرمت

كاراكتر

نوع اطلاعات خروجي

%c

يك كاراكتر

%d

اعداد صحيح دهدهي مثبت و منفي

%e

نمايش علمي عدد همراه با حرف e

%e

نمايش علمي عدد همراه با حرف e

%f

عدد اعشاري مميز شناور

%o

اعداد مبناي 8 مثبت

%s

رشته ها

%x

اعداد مبناي 16 مثبت با حروف كوچك

%u

نمايش اعداد صحيح مثبت

%x

اعداد مبناي 16 مثبت با حروف بزرگ

%p

نمايش اشاره گرها ، اعدادي كه با اين كاراكتر نمايش داده مي شوند در مبناي 16 مي باشد

%%

نمايش علامت %

برخي از كاراكترهاي كنترلي

كاراكتر

عملي كه انجام مي شود

\f

انتقال كنترل به صفحه جديد

\n

انتقال كنترل به خط جديد

\t

انتقال به 8 محل بعدي صفحه نمايش

\”

چاپ كاراكتر

\’

چاپ كاراكتر

\0

رشته تهي يا null

\\

چاپ \

\n

ثابتهاي مبناي 8(n ‌ عدد مبناي 8)

\xn

ثابتهاي مبناي 16 (n عدد مبناي است )

\r

به ابتداي سطر برمي گردد

 

تعيين طول ميدان در تابع printf()

   ·          طول ميدان به صورت n.d  است كه بعد از علامت %‌ و قبل از كاراكتر فرمت ذكر مي شود.

   ·          در اعداد اعشاري مميز شناور ،  طول ميدان (حداكثر تعداد ارقام با  در نظر گرفته نقطه اعشار)و d  تعداد ارقام اعشاري را مشخص مي كند.

printf(“\n%8.1f%16.4f,”,3.0,123.1234567);

bbbbb3.0bbbbbbbb123.1235

   ·          چنانچه n‌ ( حداكثر طول رقم ) از مجموع عدد تعيين شده براي d ‌ ،‌ تعداد ارقام صحيح خود عدد و يك كاراكتر  نقطه اعشار كمتر باشد در نظر گرفته نمي شود . به مثال زير توجه كنيد .

printf(“%4.4f” , 123.957);

123.9570

اگر براي اعداد اعشاري قسمت d  حذف گردد و يا اينكه كلاً طول ميدان را مشخص نكنيم عدد مورد نظر با شش رقم اعشار چاپ مي شود

printf (“%5f”,123.957) ;  يا printf (“%f”, 123.957);

123.957000

گرد كردن عدد

   ·          اگر تعداد ارقام قسمت اعشار بيشتر از عدد مشخص شده در قسمت d ‌باشد قسمت اعشار گرد مي شود و تبعاً ممكن است بر روي قسمت صحيح نيز تاثير گذار باشد . به مثال هاي زير توجه كنيد :

printf (“%5.2f”,12.957);

12.96

printf(“%5.0f” , 12.54);

13

   ·          اگر طول ميدان عددي مثبت باشد مكان عددي كه بايد چاپ شود از سمت راست تنظيم ميشود و اگر طول ميدان عددي منفي باشد مكان عدد از سمت چپ تنظيم خواهد شد . مثالهاي زير اين نكته را نشان مي دهند .

printf(“%7.2f”,12.5);

bb12.50

printf(“%-7.2f”,12.5);

12.50bb

   ·          در چاپ اعداد صحيح چنانچه در قسمت d ‌ نيز عددي قرار دهيم از بين d,n ‌ هر كدام كه بزرگتر باشند براي طول ميدان درنظر گرفته ميشوند . به مثال زير توجه كنيد :

printf(“%6.3d”,1451);

b1451

   ·          اگر d  از n  بزرگتر باشد به جاي فضاي خالي كاراكتر صفر چاپ مي شود.

printf(“%3.6d”,1451);

001451

   ·          در مورد رشته ها n  حداقل طول ميدان و d   حداكثر كاراكتر هاي قابل چاپ مي باشد .

printf(“%7.3s”,”hello”);

bbbbhel

   ·          چنانچه n ‌ از d   كوچكتر باشد هيچكدام در نظر گرفته نمي شوند و تمام رشته چاپ مي شود .

printf(“%1.3s”,”hello”);

hello

   ·          در تنظيم مكان مقداري كه قرار است چاپ شود منفي يا مثبت بودن طول ميدان همانطور كه گفته شد تاثير گذار است

تابع scanf()

   ·          جهت خواندن اطلاعات از ورودي استاندارد مورد استفاده قرار مي گيرد .

شكل كلي :

scanf(“كاراكتر هاي فرمت “ , آدرس متغيرها);

   ·          كاراكترهاي فرمت نوع اطلاعاتي را كه بايد خوانده شوند را مشخص مي كند .

   ·          آدرس متغير ها مشخص كنند هاي محل هايي از حافظه هستند كه اطلاعات ورودي بايد در آن محلها بايد قرار گيرند

   ·          آدرس متغير ها را با عملگر &‌ مشخص مي كنيم

   ·          كاراكتر هاي فرمت در تابع scanf‌ همانند تابع printf  مي باشد .

   ·          در ورود اطلاعات مي توانيم آنها را با فاصله (blank)‌ ، كليد enter‌ يا  tab  جدا كنيم خروجي اين تابع تعداد مقاديري است كه از ورودي خوانده است .

int year;

scanf(“%d” , & year);

فرمان cout

   ·          از cout مي توانيم جهت چاپ در خروجي استفاده مي كنيم.

شكل كلي :

 متغير يا رشته هاي ثابت ، كاراكترهاي كنترلي cout <<

int i=3;

cout << i << “max” ;

 

فرمان cin

   ·          از cin  نيز جهت دريافت مقدار از ورودي استفاده مي شود..

شكل كلي :

cin <<  متغير

   ·          از كاراكترهاي كنترلي و كاراكترهاي فرمت نمي توان در اين فرمان استفاده كرد .

int i;

float f;

cin << i<< f;

   ·          جهت استفاده از فرامين cin , cout‌ بايد فايل h.iostream  در ابتداي برنامه include شود.

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

تابع getch()

شكل كلي :

=getch();‌ متغير

   ·          پس از آن كه كنترل اجراي برنامه به تابع getch()  رسيد برنامه منتظر فشار دادن كليدي از صفحه كليد مي شود .

   ·          تابع getche()‌ مانند تابع getch()‌ مي باشد با اين تفاوت كه در اين تابع پس از اخذ ورودي آ‌ن را روي صفحه نمايش چاپ مي كند

شكل كلي :

()=getche متغير

تابع getchar()

   ·          عمل اين تابع مانند دو تابع قبل است با اين تفاوت كه در اين تابع پس از وارد نمودن كليد مورد نظر بايد enter ‌ زده شود .

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

   ·          علاوه بر printf()‌ دو تابع ديگر نيز بكار مي رود كه عبارتند از putchar() putch()

شكل كلي

putch(متغير);

putchar(متغير);

 

بخش دوم

ساختارهاي كنترلي و حلقه هاي تكرار

اگر بخواهيم بعضي از دستورات تحت شرايط خاصي اجرا شوند و يا تعدادي از دستورات چندين مرتبه اجرا شوند و يا در شرايط خاصي تكرار شوند ، از ساختارهاي تكرار و تصميم استفاده مي كنيم

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

تحت شرايط خاصي امكان اجراي مكرر دستور يا مجموعه أي از دستورات را فراهم مي كنند

ساختار for

   ·          در مواردي مفيد است كه تعداد دفعات تكرار دستورات معلوم باشد

داراي يك شمارنده است كه تعداد دفعات اجراي دستورات داخل حلقه را شمارش مي كند

   ·          شمارنده حلقه مي تواند داراي مقادير مثبت ، منفي ، صحيح و يا اعشاري باشد .

شكل كلي :

for (مقدار اوليه = شمارنده  ; شرط حلقه ; گام حركت شمارنده )دستور;

   ·          مقدار اوليه مشخص مي كند كه شمارنده ، از چه مقداري شروع مي شود .

   ·          شرط حلقه مشخص مي كند كه مجموع دستورات داخل حلقه تكرار ، تحت چه شرايطي اجرا شوند.

   ·          گام حركت شمارنده حلقه مشخص مي كند كه در هر بار اجراي دستورات داخل حلقه، چه مقداري به شمارنده حلقه اضافه شود.

   ·          گام حركت مي تواند مثبت ، منفي ، صحيح يا اعشاري باشد.

   ·          دربين هر يك از پارامترها در حلقه for  ، علامت ;   قرار مي گيرد

   ·          هر كدام از پارامترها مي توانند وجود نداشته باشند و مي توان حلقه هاي تكرار بينهايت توليد نمود

for(i = 0; i < 5; i++)

   printf(“\n the value of i is : %d: , i);

j=11;

for (;j;) {

   j%=2;

   j--;

}

ساختار while

   ·          در مواقعي كه تكرار انجام دستورات به شرط خاصي وابسته است كاربرد دارد .

while (شرط ) دستور ;

   ·          دستور مي تواند مركب باشد يعني بين }و{ قرار بگيرد

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

   ·          چنانچه شرط حلقه در داخل حلقه نقض نشود دستورات حلقه بينهايت بار اجرا مي شوند.

 

ساختار do..while  

   ·          براي تكرار اجراي مجموعه دستورات در شرايط خاص كاربرد دارد .

شكل كلي :

do

{

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

}while (شرط );

   ·          شرط حلقه در انتها تست مي شود

   ·          وقتي كنترل اجرا به ساختار do while   رسيد دستورات داخل حلقه اجرا مي شوند و سپس شرط ذكر شده تست مي گردد ،‌چنانچه اين شرط برقرار باشد مجموعه دستورات داخل حلقه مجددا اجرامي شوند و گرنه كنترل اجرا از حلقه خارج مي شود

   ·          در ساختار حلقه do..while   مجموعه دستورات حداقل يكبار اجرامي گردند .

   ·          چنانچه بدنه do..while  تنها شامل يك دستور باشد ميتوانيم }و{  را حذف كنيم ولي در بقيه شرايط وجود آنها ضرورت دارد .

حلقه هاي تكرار بينهايت

   ·          با هر يك از ساختارهاي تكرار do..while , while , for  ميتوان حلقه هاي بينهايت ايجاد كرد .

   ·          در ساختارهاي do..while , while   مي توان بجاي شرط حلقه از 1 به معني ارزش درستي ، استفاده كنيم و يا از شرطي استفاده كنيم كه در تمام شرايط ارزش آن درست باشد(به عنوان مثال 2 < 5 )

   ·          جهت خروج از حلقه بينهايت در حين اجرا بايد از كليد ctrl+ break  استفاده كنيم

دستور break   

   ·          در ساختارهاي تكرار اين دستور كنترل اجراي برنامه را به اولين دستور پس از حلقه تكرار منتقل مي كند

دستور continue

   ·          در حلقه هاي تكرار موجب انتقال كنترل به ابتداي حلقه تكرار مي شود.

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

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

   ·          اگر بخواهيم تحت شرايط خاصي در برنامه تصميمي را اتخاذ كنيم بطوري كه تحت شرايطي ، مجموعه دستوراتي اجرا شوند و مجموعه أي ديگر اجرا نشوند ، از ساختار هاي تصميم استفاده مي كنيم

ساختار if/ else  (ساختار شرطي انتقال كنترل )

موجب مي گردد تا تحت شرايطي ، مجموعه أي از دستورات اجرا شده و يا از اجراي اين مجموعه دستورات صرفنظر شود .

شكل كلي :

if (شرط) دستور ;

if (شرط )

   دستور 1 ;

else

    دستور 2;

   ·          دستورات مي توانند مركب باشند .

   ·          وجود else  در ساختار if   اختياري است .

   ·          وقتي كنترل اجرا به ساختار if  رسيد شرط تست مي شود و در صورت برقرار بودن ، دستور بعد از آن اجرا مي شود  و در غير اينصورت در صورت وجود بخش else  دستورات اين بخش اجرا مي شود

   ·          استفاده از ساختار if  بصورت لانه أي (تو در تو ) نيز امكان پذير است كه در اين صورت اولين else  به آخرين if مربوط مي شود.

ساختار else if

   ·          اگر بخش else   مربوط به ساختار if   خود يك ساختار if   باشد مي توان جهت كوتاهتر كردن برنامه و خوانايي بهتر آن را ساختار else if   استفاده كرد.

ساختار goto   ( انتقال غير شرطي كنترل )

   ·          سبب انتقال كنترل برنامه ، از نقطه أي به نقطه ديگر مي گردد .

شكل كلي :

goto برچسب;

   ·          برچسب همانند يك متغير نامگذاري ميشود و به : ختم مي گردد

   ·          استفاده از goto   خوانايي و ساخت يافتگي برنامه را كاهش ميدهد

labl : ch = getch();

putch(ch);

goto labl;

ساختار switch

زماني كه بر اساس مقادير مختلفي براي يك عبارت مي خواهيم مجموعه دستورات خاصي انجام گردد از اين ساختار استفاده مي كنيم .

نحوه كاربرد :

switch (عبارت )

{

case  :مقدار1

مجموعه دستورات 1;

break;

case : مقدار 2

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

break;

default:

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

}

   ·          نحوه عمل بدين صورت است كه عبارت ذكر شده ارزيابي مي شود ، سپس نتيجه از بالا به پائين با مقادير ذكر شده مقايسه مي شود و در صورتي كه با يكي از مقادير ذكر شده برابر بود مجموعه دستورات متناظر با آن case ‌ اجرا مي شود و سپس با رسيدن به break  كنترل از اين ساختار خارج مي شود.

   ·          اگر مقدار عبارت با هيچكدام از مقادير ذكر شده برابر نبود ، مجموعه دستورات پس از default  اجرا مي شود . وجود default اختياري است .

   ·          مقادير و حاصل عبارت در ساختار switch  بايد نوع صحيح باشند

   ·          مقادير تكراري در ساختار switch  نمي توان استفاده كرد .يعني مقدار 1 و مقدار 2 و . . . نمي توانند برابر باشند.

   ·          هر case در ساختار switch بايد حداقل داراي يك دستور باشد.

   ·          اگر ثابتهاي كاراكتري در ساختار switch  بكار گرفته شوند ، به مقادير صحيح تبديل مي شوند.

   ·          اگر در يك case  از دستور break  استفاده نشود پس از اجراي مجموعه دستورات مر بوط به اين case ‌ مجموعه دستورات مربوط به case  بعدي نيز اجرا مي شوند .

   ·          دو يا چند شرط را مي توان درساختار  switch  با هم or   نمود كه براي اينكار كافي است چند case ‌ را با مقاديري كه مي خواهيم با هم or   شوند پشت سر هم قرار دهيم.

switch (i) {

case 0 :

case 1 : i++; break;

case 2 : i++;

}

تفاوت ساختار if  و switch

   ·          در ساختار switch فقط مساله مساوي بودن مطرح است اما در ساختار if   مي توان يك عبارت منطقي و يا رابطه أي را بررسي كرد .

   ·          استفاده از switch   درصورت امكان باعث خوانا تر شدن و بالا رفتن سرعت برنامه مي شود.

توابع

   ·          درزبان c   فقط زير برنامه نوع تابع وجود دارد.

نحوه تعريف تابع :

(اسامي پارامترها و نوع آنها ) نام تابع     نوع تابع

{

بدنه تابع

}

   ·          منظور از نوع تابع يكي از انواع داده أي در زبان c  يا ساختارها وانواع داده ها تعريف شده توسط كاربر است.

   ·          تعيين نوع تابع اختياري است و اگر نوعي تعيين نگردد كامپايلر زبان c  فرض مي كند كه نوع تابع int  است.

   ·          نام تابع از قانون نامگذاري براي متغيرها تبعيت مي كند.

   ·          اسامي پارامترها شامل متغيرهايي است كه بايد به تابع منتقل شوند

   ·          نوع پارامترها مي تواند در همان ليست پارامترها يا قبل از {  ذكر شود.

int func(int i , char c){

.

.

.

}

 

int func(i,c)

   int i;

   char c;

{

.

.

.

}

   ·          پارامتر ها با كاما جدا مي شوند .

   ·          فراخواني تابع بوسيله نام آن به همراه آرگومانهاي واقعي انجام مي شود.

   ·          اگر تابعي حتي هيچ پارامتر نداشته باشد بعد از نام آن () قرار مي گيرد .

   ·          تعريف يك تابع در داخل  تابع ديگر امكان پذير نيست ولي فراخواني سطوح مختلف توابع ممكن است .

   ·          در موقع فراخواني توابع بايد تعداد و نوع آرگومانها با تعداد و نوع پارامترها يكسان باشند.

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

1-     توابعي كه هيچ مقداري را بر نمي گردانند : به اين توابع توابع نوع void گفته مي شود

2-     توابعي كه فقط يك مقدار را بر مي گردانند .

3-     توابعي كه چند مقدار را بر مي گردانند .

انواع فراخواني

1-    فراخواني توسط ارزش (call by value)

   ·          در اين روش مقدار آرگومان تابع،در پارامتر متناظر با آن كپي ميشود لذا هرگونه تغييري در پارامترها هيچگونه تاثيري در مقدار آرگومانها نخواهد داشت. بنابراين در اين روش هيچ مقداري توسط پارامترها و آرگومانها به تابع فراخواننده ، برگرداننده نمي شودو فقط مي توان يك مقدار را با استفاده از دستور return   به برنامه فراخواننده بر گرداند.

int add (int &i) {

   i++;

}

.

.

.

add(i);

 

2-    فراخواني توسط ارجاع (call by reference)

   ·          در اين روش ، آدرس آرگومان بجاي مقدار آرگومان در پارامتر كپي مي شود و اين بدان معني است كه در فراخواني توسط ارجاع ، پارامتر حاوي آدرسهاي آرگومانها هستند . لذا تغييرات در محتويات اين آدرسها به تابع فراخواننده بر مي گردد.

int add (int *i)  {

   i++;

}

.

.

.

add (&i);

 

بخش سوم

آرايه ها

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

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

   ·          نامگذاري آرايه ها از قانون نامگذاري متغيرها تبعيت مي كند..

   ·          انديس آرايه ها در c  از صفر شروع مي شود.

int temp [5];

temp

 

 

 

 

 

 

temp[0]

temp[1]

temp[2]

temp[3]

temp[4]

آرايه هاي يك بعدي

نحوه تعريف :

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

   ·          طول آرايه،عددي صحيح است كه تعدادعناصر آنرا مشخص ميكند.

محاسبه حافظه مورد نياز آرايه :

مقدار حافظه = sizeof(نوع آرايه ) *تعداد عناصر آرايه

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

   ·          نام آرايه در c  بعنوان اشاره گري به ابتداي آرايه مي باشد كه آدرس مي باشد كه آدرس شروع آرايه را دارد . لذا در دستور scanf() چنانچه بخواهيم مقداري براي عنصر خانه صفر بخوانيم نيازي به علامت &  نيست.

scanf(“%d” , list);

 

آرايه هاي چند بعدي

نحوه تعريف :

نام آرايه    نوع آرايه [طول بعد 1] [طول بعد 2] . . .[nطول بعد];

   ·          عناصر آرايه در محلهاي متوالي حافظه و بصورت سطري ذخيره مي گردند .

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

نحوه تعريف :

نام آرايه    نوع آرايه [طول بعد 1][طول بعد 2]…[nطول بعد]={مقادير};

   ·          مقاديري كه در داخل {} قرار مي گيرند به ترتيب به عناصر آرايه نسبت داده مي شوند.

int array[2][3]={1,2,3,4,5,6};

int table[2][3]={3,4};

int array2[2][3]={{1,2,3},{4,5,6}};

int three_d[3][2][3]= {{{1,2,3},{5,6,7}},{{7,9,3},{4,6,8}},{{7,2,6},{0,1,9}}};

   ·          اگر در هنگام مقدار دهي اوليه آرايه مقاديري بيشتر از ابعاد آرايه به عناصر آن نسبت دهيم با خطا مواجه مي شويم.

   ·          چنانچه به حداقل يكي از عناصر آرايه هاي عددي مقدار صفر(يا هر مقدار ديگري) را اختصاص دهيم مقادير بقيه عناصر به طور خودكار صفر مي شود و اگر به حداقل يكي از عناصر آرايه هاي كاراكتري,كاراكتر و يا ‘\0’ را نسبت دهيم مقادير ديگر عناصر نيز ‘\0’ خواهد شد. اين مطلب در صورتي صادق است كه تمام عناصر آرايه رامقدار دهي نكنيم.

int i[5][10] = {0};

 

آرايه ها بعنوان آرگومان تابع

   ·          اگر آرگومان تابع يك آرايه باشد در حين انتقال با تابع فقط بايد اسم آن را بدون انديس ذكر كرد.

   ·          اگر بخواهيم آرايه را به عنوان پارامتر تابع تعريف كنيم به سه طريق مي توان اينكار را انجام داد:

1-     بوسيله اشاره گر

2-     بوسيله آرايه اي با طول مشخص

3-     بوسيله آرايه اي با طول نا مشخص

func1(int * list)

{بدنه تابع 1}

func2(int list[10])

{بدنه تابع 2}

func3(int list[ ])

{بدنه تابع 3}

main ()

{

   int arr[10];

   func1(arr);

   func2(arr);

   func3(arr);

}

 

   ·          اگر آرايه اي كه بعنوان آرگومان تابع ذكر مي شود دو بعدي باشد در موارد 1و2 مشكلي نخواهد بود , اما در مورد سوم كه پارامتر آرايه بدون طول مي باشد بايد تعداد ستونهاي آرايه حتماً مشخص گردد. بطور كلي درآرايه هاي n  بعدي بايد طول ابعاد دوم به بعد مشخص گردد.

func4(int templist[ ][4])

{بدنه تابع}

main ()

{

   int myarr[8][4];

   func4(myarr);

}

 

رشته ها

   ·          در c  رشته ها بصورت آرايه اي از كاراكتر ها (نوع char) هستند كه به null ختم مي شوند .

   ·          براي نمايش null از ‘\0’  استفاده مي شود .

   ·          معمولا به دليل اينكه رشته بايد به ‘\0’  ختم شود طول رشته ها را يكي بيشتر طول مورد نياز مي گيريم .

   ·          در صورت استفاده از توابع  c كامپايلر كاراكتر null  را به انتهاي رشته ها اضافه مي كند و نيازي نيست كه برنامه نويس آنرا قرار دهد.

char name [6];

strcpy (name , “abc”);

 

A

b

c

\0

 

 

0

1

2

3

4

5

 

مقدار دهي اوليه به رشته ها

براي اينكار دو روش وجود دارد:

1-     روش اول مشابه با مقدار دهي اوليه به آرايه ها است . چون رشته آرايه اي از كاراكتر ها مي باشد در اين روش بصورت كاراكتر مقدار دهي مي كنيم و در انتها نيز بايد كاراكتر ‘\’\0’را قرار دهيم..

char string[] = {‘c’, ‘a’ , ‘r’ , ‘\0’};

2-     در اين روش متن در بين دو علامت كوتيشن “ “”  قرار مي گيرد و  نياز به گذاشتن كاراكتر ‘\0’  در انتهاي رشته نيست چون كامپايلر اين عمل را انجام مي دهد .

char string[] = ”car”;  يا                      char string[] = {“car”};

   ·          در مقدار دهي اوليه به رشته ها اگر طول رشته مشخص نگردد, به تعداد كاراكتر هايي كه به آن نسبت داده مي شود به اضافه كاراكتر null عنصر منظور خواهد شد.(در دو مثال بالا طول رشته 4 در نظر گرفته مي شود)

 

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

   ·          هر گاه خواسته باشيم تعدادي رشته را در آرايه اي نگهداري كنيم , چون رشته ها خود از نوع آرايه هستند بايد آرايه اي از آرايه ها را تعريف كنيم

char list [4][21]= {“ali“ , “taha” , “ parsa” , “siavash”};

 

 

توابع رشته اي

gets()

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

شكل كلي :

gets(متغير رشته اي );

   ·          تفاوت gets() و scanf() در ورودي رشته ها اين است كه scanf()  رشته ها را پيوسته در نظر مي گيرد يعني اگر دربين رشته از فاصله استفاده شود و يا tab  استفاده شود از اين كاراكتر به بعد بعنوان رشته ديگري در نظر گرفته مي شود ولي در gets()  اينطور نيست و تا زماني كه كليد enter  فشرده نشود رشته پايان نمي يابد .

puts()

اين تابع براي انتقال يك رشته به خروجي بكار مي رود .

شكل كلي :

puts(عبارت رشته اي );

   ·          تفاوت pust() و printf()  در خروجي رشته در اين است كه puts()  در هر زمان فقط مي تواند يك رشته رابه خروجي ببرد و همچنين استفاده از puts  ساده از printf() مي باشد .

 

توابع دستكاري رشته ها

strcpy()

براي قرار دادن رشته اي در رشته ديگر كاربرد دارد .

شكل كلي :

strcpy(رشته ثابت يا متغير رشته اي , متغير رشته اي  ) ;

char name [11];

strcpy(name , “ali”);

   ·          نكته قابل توجه اين است كه عمليات انتساب مقدار به رشته از طريق اين تابع انجام مي گيرد و استفاده از = امكانپذير نيست .

strncpy()

   ·          n  كاراكتر اول از رشته مبدأ را در رشته مقصد كپي مي كند .

n كاراكتر از رشته  s2 را در متغير S1 قرار مي دهد

strncpy(s1, s2, n)

 

strcat()

   ·          براي الحاق دو رشته بكار مي رود .

رشته s2 را به انتهاي s1 مي چسباند

strcat(s1, s2);

strlen()

   ·          براي تعيين طول يك رشته بكار مي رود.

طول رشته s  را بر مي گرداند

strlen(s);

strcmp()

   ·          براي مقايسه دو رشته بكار مي رود و نحوه كاربرد و نتيجه بصورت زير است :

نتيجه

Strcmp(s1 , s2);

0

s1 == s2

مثبت

s1 > s2

منفي

s1 < s2

strchr()

   ·          جهت جستجوي يك كاراكتر در يك رشته بكار مي رود و محل اولين وقوع آن را بر مي گرداند . اگر كاراكتر مورد نظر وجود نداشته باشد , مقدار صفر (يا null) را بر مي گرداند .

كاراكتر ch  را در رشته s  جستجو مي كند

strchr(s , ch);

   ·          خروجي اين تابع اشاره گري به اولين محل وقوع كاراكتر در رشته است.

strstr()

   ·          براي جستجوي زير رشته اي در يك رشته بكار مي رود . اگر زير رشته مذكور پيدا شود محل اولين وقوع آنرا بر مي گرداند و در غير اينصورت مقدار صفر (يا همان مقدار null) را برمي گرداند.

رشته s2  را در رشته s1  جستجو مي كند

strstr(s1, s2);

 

اشاره گر ها

   ·          اشاره گر (pointer)  متغيري است كه يك آدرس حافظه را در خود نگهداري مي كند.

مزاياي اشاره گر ها

1-     عمل تخصيص حافظه پويا را امكان پذير مي سازد..

2-     كار با رشته ها و آرايه ها را آسانتر مي كند .

3-     فراخواني با ارجاع در توابع . با اشاره گر انجام مي گيرد .

نحوه تعريف :

نوع    * نام متغير اشاره گر ;

   ·          نوع مشخص مي كند كه اين اشاره گر به چه نوعي اشاره مي كند .

   ·          اشاره گر از هر نوعي بايد به متغيري از همان نوع اشاره كند. در غير اينصورت از طرف كامپايلر خطا صادر مي شود , به عنوان مثال اختصاص دهي مقدار بصورت زير اشتباه است :

int *I;

char *j;

I = j;

   ·          عملگر يكاني &  آدرس عملوند خود را بر مي گرداند.

   ·          عملگر يكاني * محتويات يك آدرس حافظه را مشخص مي كند .

   ·          يك اشاره گر معمولاً به ناحيه اي در فضاي heap  اشاره مي كند وخود شامل آدرس آن ناحيه است .

   ·          در c  چنانچه اشاره گري بصورت near  تعريف شود 2 بايت براي نگهداري آدرس محلي كه به آن اشاره مي كند , در نظر گرفته مي شود . پيش فرض تعريف اشاره گرها near  مي باشد .

   ·          اگر در c  اشاره گري بصورت far   تعريف شود 40 بايت براي نگهداري آدرس محلي كه به آن اشاره مي كند , اختصاص داده مي شود .

int near *i;

sizeof(i) = 2

char far *j

sizeof  j=4

 

اعمال روي اشاره گر ها

   ·          مي توان مقداري را به يك اشاره گر نسبت داد .

   ·          مي توان دو اشاره گر ممنوع را به يكديگر نسبت داد كه در اين صورت هر دو به يك مكان اشاره خواهند كرد.

int x;

int *p1 , *p2;

p1=&x;

p2=p1;

 

عمل جمع و تفريق آدرس

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

int *p,x=3;

p=&x;

p++;

   ·          در اين مثال اگر مثلاً p  به آدرس 2000 حافظه اشاره مي كرد حالا با اين افزايش به مكان 2002 حافظه اشاره مي كند .

   ·          اعمال ضرب و تقسيم بر روي اشاره گر ها تعريف نشده است .

 

عمل مقايسه اشاره گر ها

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

int x=3,y=5;

int *p1, *p2;

p1=&y;

p2=&x;

if (p1<p2) then printf(“true”);

 

اشاره گر و آرايه

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

   ·          براي دسترسي به عناصر آرايه علاوه بر انديس مي توان از اشاره گر نيز استفاده كرد.

int temp [5];

 

0

1

2

3

4

temp

 

 

 

 

 

 

*temp

*(temp+1)

*(temp+2)

*(temp+3)

*(temp+4)

 

temp[0]

temp[1]

temp[2]

Temp[3]

temp[4]

 

اشاره گر هاي رشته اي

   ·          گفته شد كه رشته ها در حقيقت بصورت آرايه اي از كاراكتر ها تعريف مي شوند و چون به آرايه ها از طريق اشاره گر مي توان دسترسي داشت , رشته ها را نيز مي توان بصورت اشاره گر تعريف نمود.

char _ count (char *s, char letter)

{

   int count=0;

   while (*s)

      if (*s++ = = letter ) count++;

   return (count);

}

 

مقدار دهي اوليه به رشته ها به عنوان اشاره گر

   ·          اين مقدار دهي اوليه مشابه مقدار دهي اوليه به رشته هاي آرايه اي است .

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

char lisr [3][8]={“ali “ , “ reza” , “ behnam”};

انديس

 

 

 

 

 

 

 

List[0]

a

l

i

\0

 

 

 

List[1]

r

e

z

a

\0

 

 

Lilst[2]

b

e

h

n

a

m

\0

 

char *list[3]={“ali”, “reza” , “behnam”};

انديس

 

 

 

 

 

 

 

list[0]

a

l

i

\0

 

 

 

list[1]

r

e

z

a

\0

 

 

lilst[2]

b

e

h

n

a

m

\0

 

اشاره گر به اشاره گر

   ·          اگر متغيري آدرس يك اشاره گر ديگر را داشته باشد , اشاره گر به اشاره گر است .

براي تعريف متغيرهاي اشاره گر به اشاره گر مي توانيم از به دنبال هم قرار دادن چنين علامت *  استفاده كنيم.

 

int x, *p, **q;

x=10;

p=&x;

q=&p;

printf(“%d” , **q);

   ·          اگر آرايه اي از اشاره گرها تعريف كنيم در حقيقت يك اشاره گر به اشاره گر تعريف كرده ايم .

 

بخش چهارم

ساختمان (structure)

   ·          ساختمان مجموعه اي از متغيرها است كه مي توانند غير هم نوع نيز باشد.

Struct    نام ساختمان {

                          اجزاي ساختمان  

};

   ·          نام ساختمان از قانون نام گذاري متغير ها تبعيت مي كند.

   ·          اجزاي ساختمان همانند يك متغير معمولي يا آرايه تعريف شود و نوع آن مشخص مي شود .

   ·          دستور   structبه ; ختم مي شود

   ·          پس از تعريف سا ختمان جهت استفاده از آن بايد متغيرهاي از اين نوع تعريف كرد و سپس از اين متغيرها استفاده نمود تعريف متغيرها از نوع يك ساختمان به سه صورت زير ممكن است.

Struct  اسامي متغيرها    نام ساختمان  ;

struct   نام ساختمان  {

اجزاي ساختمان  

} اسامي متغيرها  ;

 

struct my_ struct {

   char  name [80], phone_number[80]

   int age,height;

} my_friend;

struct  my_strduct mf1;

my_strduct mf2;

   ·          جهت دسترسي به هريك از اجزاي ساختمان مي توانيم از دو عملگر نقطه(.)براي اجزاي معمولي  عملگرà  براي اجزاي اشاره گري استفاده نمود.

strcpy (mf1.name , "ali”);

mf1.aGE=15;

مقدار دهي اوليه به ساختمان

   ·          به متغيرهاي نوع ساختمان مي توان همانند آرايه مقدار دهي اوليه داد .كه براي اين منظور مقدار اوليه در بين علامتهاي } و { قرار مي گيرد و با كاما از يك از هم جدا مي شود.

   ·          اين مقادير بترتيب به اجزاي ساختمان نسبت داده مي شود اولين مقدار به اولين جز, دومين مقداربه دومين جزnمقدار به n ام جز نسبت داده مي شود.

   ·          اگر تعداد مغادير از تعداد اجزاي ساختمان كمتر باشد مقدار بقيه اجزا صفر واجزاي رشته اي برابر null خواهد شد.

structstudent{

   char name[21];

   char address[30];

   intgread[10];

   int id;

};

struct student st1 = {“ali” , “mashhd”, {10, 15}, 100};

struct student st2 = {“ahmad” , '\0' , {15, 20},101};

struct student st3 = {“reza”};

struct student st4 = {0};

انتساب ساختمانها به يكديگر

   ·          انتساب ساختمانها از يك نوع به يك ديگرامكان پذير است .

   ·          اگر يك جز ساختمان خود ساختمان باشد براي دسترسي به اجزاي آن بايد اسامي ساختمانهااز بالاترين به داخلي ترين ذكر كنيم.

struct student s1 , st;

gets(s1.name);

gets (s1.address);

for (int i=0; i<10; i++) scanf(“%d”, s1.gread[i]);

scanf(“%d”, s1.id);

s2 = s1;

printf("%-2.5s%-3.5s%-4d",s2.name,s2.address,s2.id);

تعريف ساختمان بصورت تو در تو

   ·          اجزاي يك ساختمان مي تواند يك متغير معمولي آرايه و يا يك ساختمان باشد.

struct date{

  int year;

  int month;

  int day; };

struct person {

   char name [15];

   struct date b_date; } p1;

p1.b-date .yer=1356;

p1.b-date .month=2;

p1.b-date .DAY=22;

انتقال ساختمان به تابع

   ·          براي انتقال اجزا به تابع همانند يك متغير معمولي عمل مي شود(البته با رعايت نحوه دسترسي )

   ·          براي انتقال كامل متغيرهاي ساختمان اين متغيزها مي توانند بعنوان پارامتر واقعي متناظر با پارامتر مجازي همنوع به تابع ارسال شوند

(فراخواهي توسط ارزش)همچنين مي توان أدرس يك ساختمان ارسال نمود (فراخواني توسط ارجاع)

main() {

   void list(struct person x);

   struct person p1  = {“hosin”, {2001, 10, 30}};

   list(p1);

}

void list(struct person x) {

   printf(“\nPerson information");

   printf(“\nname:%s",x.name);

   printf(“\nbirth day : %d / %d / %d”,

             b_date.yare,x.b_date.month,x.b_date.day);

اشاره گر به ساختمان

موارداستفاده :

      1.         امكان فراخواني به روش ارجاع در توابع را ميسر مي سازد

      2.         براي ايجاد ليست هاي پيوندي و ساير ساختمانهاي داده پوياكاربرد دارد

   ·          براي دسترسي به اجزاي ساختماني كه يك اشاره گر به آن اشاره مي كند به دو روش مي توان عمل كرد :

      1.         دسترسي به ساختمان از طريق محتويات  آدرس و سپس نام جز كه با نقطه از هم جدا شده اند

streuct person*q;

strcpy((*q).name,”hosein”);

(*q).b_date.day=22;

      2.         استفاده از عملگر à كه روش متداول تري است.

strcpy(q->name, “hosein”);

q->b_date.day=22;

ساختمان هاي بيتي

   ·          با استفاده از اين ساختار مي توان به بيتهاي خاص از يك بايت دسترسي داشت و ساختارهايي راكه شامل بيت ها هستند توليد نمود.

دلايل استفاده :

   ·          اگر محدوديت حافظه وجود داشته باشد

   ·          در حين ارتباط با دستگا هاي خارجي

   ·          ارتباط با زير برنامه هاي سيستم

شكل كلي :

structنام ساختمان بيتي    {

   طول فيلد 1 : نام فيلد 1  نوع فيلد يك 

   طول فيلد 2 : نام فيلد 2  نوع فيلد دو

  

};

   ·          نام ساختمان از قانون نامگذاري متغيرها تبعيت مي كند

   ·          طول فيلدها بر حسب بيت است

   ·          هر يك از فيلدها مي توانند از نوع unsignedint int و يا signed int باشند فيلد هايي كه طول آن ها يك است بايد از نوع unsigned  انتخاب شوند  زيرا بيت 1  نميتواند شامل علامت هم باشد.

   ·          براي دسترسي به اجزا ساختمان از نقطه استفاده مي شود.

   ·          جهت تخصيص به تعداد بايتي كه مجموع طول فيلدها را در بر بگيرد حافظه مي گيرد.

   ·          طول يك فيلد ساختمان بيتي مي تواند بين يك تا شانزده باشد وبيشنر از شانزده بيت قابل تعريف نيست و خطا دارد.

   ·          يك فيلد در ساختمان بيتي نمي تواند بصورت ارايه باشد

struct device {

   unsigned int status : 1;

   unsigned int is_actios : 1;

   int counter : 3 };

شماره بيت

0

1

2

3

4

5

6

7

 

   ·          مي توان تر كيب از ساختمان معمولي و ساختمان بيتي تعريف نمود.

struct emp{

   struct date b_date;

   float pay;

   unsigned hourly:1;

   unsignedshifted:1;

int r_age:2; };

 

ساختمان union

   ·          محلي از حافظه است كه توسط دو يا چند متغير بصورت اشتراكي مورد استفاده قرار مي گيرد.

   ·           متغير هاي اتحاد به صورت همزمان نمي توانند از اين محل استفاده كنند.

نحوه تعريف

union نام ساختار   {

   اجزاي ساختار

};

   ·          نام union از قانون نام گداري متغيرها تبعيت مي كند

   ·          نحوه تعريف اجز ا unionو متغير هاي نوع union مثل تعريف اجزا و متغير هاي نوع ساختمان است

   ·          طول يك union به اندازه طول فيلدي است كه بيشترين طول دارد

   ·          به عنوان مثال union  زير چهار بايت فضا اشغال مي كند.

union u_type{

   int i;

   char ch;

   float f };

شماره بايت

0

1

2

3

 

بررسي چند ساختار داده اي

ساختار ليست پيوندي

يك ليست پيوندي يك طرفه در c بصورت زير تعريف ميشود

struct link_list {

   int date;

   link_list *next; } *list;

ساختار درخت دودويي

struct b_tree {

   int date;

   b_tree *lchild, *rchild;

} *root;

 

تغير نام داده ها با typedef

   ·          با استفاده از اين دستور مي توان براي نوعهاي ابتداي مثل char , int,..... و همچنين نوع هاي ساحت يافته تعريف شده در برنامه اسم ديگري انتخاب نمود

مزايا

      1.         موجب قابل حمل بودن زبان c مي شود.

      2.         موجب مي شود تا نوع داده ها ي طولاني اسم ساده تري انتخاب نمود.

نحوه كاربرد :

typedefاسم جديد   نوع موجود      ;

typedf unsigned int subint;

subint var 1 , var2;

نوع داده ها شمارشي

   ·          بوسيله اين نوع مي توان عناصر يك مجموعه متناهي را نام گذاري كرده و سپس متغير هاي را تنعريف نمود تا مقادير آن مجموعه را بپذيرند.

نحوه تعريف:

enum نام شاخص {،عنصر 2، عنصر 1 …. } نام متغير ;

enum color{red, blue, green, yellow, brown} color1;

enum color color2;

color1=blue;

color2=yellow;

        ·          به هريك از عناصر نوع مقدار عددي صحيح نسبت داده مي شود به اولين عنصر مقدار صفر و به دومين مقدار يك و به nام مقدار n-1 داده مي شود

        ·          برنامه نويس مي تواند مقادير داده شده به عناصر را تغير دهد كه براي اين منظور مقدار مورد نظر براي عنصر را بوسيله علامت مساوي قرار مي دهيم

enum sample{a,b=5,c,d}

در اين دستور مقدارصفر به aو مقدارپنچ به b و مقدارشش به cو مقدار هفت به d نسبت داده مي شود

        ·          نبايد متغيرهاي هم نام با عناصر نوع شمارشي در برنامه وجود داشته باشد در غير اين صورت خطا گرفته مي شو د بديهي است كه عناصر نوع شمارشي نبايد تكراري باشد

        ·          عناصر نوع شمارشي را فقط مي توان در خروجي نوشت

 

enum {a,b,c = 3,d}

printf("%d",c);

        ·          بازده عددي كه مي توان به عناصر نوع شمارشي نسبت  داد همان بازده اعداد صحيح علامت دار است در صورت نسبت دادن خارج از بازده عددي خطا گرفته مي شود

تحصيص حافظه پويا

در بعضي ارمواقع در هنگام اجراي برنامه لازم است قسمتي از حافظه اشغال شود  ويا به عبارتي ديگر به متغيرهااختصاص داده شود به چنين تخصيص حافظه ,تخصيص حافظه اي پويا گويند

تابع malloc()

        ·          ازاين تابع جهت تخصيص حافظه به اندازه دلخواه استفاده ميشود

شكل كلي

void *malloc(unsigned int size)

        ·          در صورت موفقيت اخذ حافظه از سيستم malloc يك اشاره گر به مكان جديد اختصاص داده شد ه بر مي گرداند

        ·          در صورت بروز خطا (به عنوان مثال وجود نداشتن فضاي خالي ) mulloc مقدار null را بر مي گرداند و محتويات اشاره گركه قراربوده است حافظه به ان اختصاص داده شو د بدون تغيير باقي خواهد ماند

        ·          چنانچه پارامتر size برابر 0 باشد mallocمقدار null را بر مي گرداند

struct link_list *list;

list = (link_list *)malloc(sizeof(link-list));

تابع calloc

اين تابع نيز جهت تخصيص حافظه پويا مورد استفاده قرار مي گيرد

شكل كلي

void*calloc(unsiged nitems , unsigmed size)

        ·          calloc دسترسي به حافظهheap امكان پذير مينمايد اين تابع به ميزانnitems*size (به بايت) حافظه اشغال مي كند

تابع realloc()

اين تابع جهت تغير ميزان حافظه احختصاص داده شده به يك اشاره گر مورد استفاده قرار مي گيرد

شكل كلي

void *realloc(vaid*ptr,unsigned size);

        ·          اين تابع براي اشاره گر ptr  مجددا به اندازه size حافظه اشغال مي كند و محتويات اشاره گر قبلي را به مكان جديد كپي مي كند

تابع free()

اين تابع فضاي تخصيص داده شده به يك اشاره گر را آزاد مي كند

شكل كلي :

void free(vaid*block);

 

 

 

منبع : سايت علمی و پژوهشي آسمان--صفحه اینستاگرام ما را دنبال کنید
اين مطلب در تاريخ: شنبه 23 اسفند 1393 ساعت: 23:10 منتشر شده است
برچسب ها : ,,,
نظرات(0)

شبکه اجتماعی ما

   
     

موضوعات

پيوندهاي روزانه

تبلیغات در سایت

پیج اینستاگرام ما را دنبال کنید :

فرم های  ارزشیابی معلمان ۱۴۰۲

با اطمینان خرید کنید

پشتیبان سایت همیشه در خدمت شماست.

 سامانه خرید و امن این سایت از همه  لحاظ مطمئن می باشد . یکی از مزیت های این سایت دیدن بیشتر فایل های پی دی اف قبل از خرید می باشد که شما می توانید در صورت پسندیدن فایل را خریداری نمائید .تمامی فایل ها بعد از خرید مستقیما دانلود می شوند و همچنین به ایمیل شما نیز فرستاده می شود . و شما با هرکارت بانکی که رمز دوم داشته باشید می توانید از سامانه بانک سامان یا ملت خرید نمائید . و بازهم اگر بعد از خرید موفق به هردلیلی نتوانستیدفایل را دریافت کنید نام فایل را به شماره همراه   09159886819  در تلگرام ، شاد ، ایتا و یا واتساپ ارسال نمائید، در سریعترین زمان فایل برای شما  فرستاده می شود .

درباره ما

آدرس خراسان شمالی - اسفراین - سایت علمی و پژوهشی آسمان -کافی نت آسمان - هدف از راه اندازی این سایت ارائه خدمات مناسب علمی و پژوهشی و با قیمت های مناسب به فرهنگیان و دانشجویان و دانش آموزان گرامی می باشد .این سایت دارای بیشتر از 12000 تحقیق رایگان نیز می باشد .که براحتی مورد استفاده قرار می گیرد .پشتیبانی سایت : 09159886819-09338737025 - صارمی سایت علمی و پژوهشی آسمان , اقدام پژوهی, گزارش تخصصی درس پژوهی , تحقیق تجربیات دبیران , پروژه آماری و spss , طرح درس