30
ی ه ساز م ا رن ب ر و ب و ی پ م ی کا ن ا ب م ی ه ساز م ا رن ب ر و ب و ی پ م ی کا ن ا ب م ه ت س وا خ! ن ی س ح د ب س مدزس: ه ت س وا خ! ن ی س ح د ب س مدزس:

مبانی کامپیوتر و برنامه سازی

  • Upload
    avi

  • View
    67

  • Download
    8

Embed Size (px)

DESCRIPTION

مبانی کامپیوتر و برنامه سازی. مدرس: سید حسین خواسته. فصل نهم. برخی ساختارها در زبان C. ساختارها( Structures ) یونیونها( Unions ) ساختارهای بیتی( Bit fields Structures ) شمارشها ( Enumerations ). فهرست مطالب فصل نهم. نوع داده های تعریف شده بوسیله کاربر. - PowerPoint PPT Presentation

Citation preview

Page 1: مبانی کامپیوتر و برنامه سازی

مبانی کامپیوتر و برنامه سازیمبانی کامپیوتر و برنامه سازی

مدرس: سید حسین خواستهمدرس: سید حسین خواسته

Page 2: مبانی کامپیوتر و برنامه سازی

فصل نهمفصل نهم

CCبرخی ساختارها در زبان برخی ساختارها در زبان

Page 3: مبانی کامپیوتر و برنامه سازی

3

فهرست مطالب فصل نهمفهرست مطالب فصل نهم

(Structures)ساختارها•

(Unions)یونیونها•

)ساختارهای بیتی•Bit fields Structures)

(Enumerations) شمارشها•

Page 4: مبانی کامپیوتر و برنامه سازی

4

نوع داده های تعریف شده بوسیله نوع داده های تعریف شده بوسیله کاربرکاربر

می توان معادلهایی برای نوع داده های استاندارد موجود تعریف نمودtypedefبا استفاده از •• typedeftypedef int Lengthint Length;;

می شود و می توان از آن برای تعریف متغیرها استفاده نمودint معادل Length با تعریف باال •LengthLength a, b, len ;LengthLength numbers[10] ;

typedeftypedef char String[50];typedef typedef int Array[10];StringString name;ArrayArray ages;

Page 5: مبانی کامپیوتر و برنامه سازی

5

ساختارهاساختارها

مجموعه ای از متغیرهای مرتبط با یک نام واحد هستند•

ساختارها می توانند برخالف آرایه ها شامل متغیرهایی از انواع مختلف باشند •

L از ساختارها برای تعریف مواردی که در فایلها ذخیره می شوند استفاده • معموالمی شود

Page 6: مبانی کامپیوتر و برنامه سازی

6

تعریف ساختارهاتعریف ساختارها

نشانه ساختار نامیده می شودemployeeنام • تعریف می شوند، اعضای }{متغیرهایی که بین •

ساختار هستندstruct employeestruct employee {

char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary;

} Ali, Sara, empDTS[20]; ;

struct employee Reza, *emp;

structstruct employeeemployee {

char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary;

};;struct employee Ali,

emp[10];

structstruct {

char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary;

} Ali; ;

Page 7: مبانی کامپیوتر و برنامه سازی

7

تعریف ساختارهاتعریف ساختارها

L از • به همراه ساختارها استفاده می typedefمعموالشود تا یک معادل برای ساختار تعریف شود

typedef structtypedef struct {

char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary;

} employee;; //معادل

employeeemployee Ali; /* یک متغیر از نوع ساختار /* ایجاد می کند

Page 8: مبانی کامپیوتر و برنامه سازی

8

تعریف ساختارهاتعریف ساختارهامتغیرهای عضو یک ساختار می باید اسامی یکتایی داشته باشند ولی متغیرهای عضو ساختارهای مختلف می توانند نامهای •

یکسانی داشته باشند.

قرار می گیرد“;”در انتهای تعریف هر ساختار یک •

struct employee {

char Name[ 20 ]; char Name[ 20 ]; // Error!!!// Error!!! int age; char gender; double hourlySalary;

} Ali, Sara, empDTS[20]; struct employee Reza, *emp;

struct Student {

char Name[ 20 ]; // OK// OK int age; char gender;

}; struct Student KNTU_92[80];

Page 9: مبانی کامپیوتر و برنامه سازی

9

تعریف ساختارهاتعریف ساختارها

یک ساختار نمی تواند شامل متغیری از نوع همان •ساختار باشد، ولی متغیری از نوع اشاره گر به

همان ساختار مجاز است

struct employee2 { // … double hourlySalary; struct employee2 person; struct employee2 person; /* ERROR *//* ERROR */ struct employee2 *ePtr; struct employee2 *ePtr; /* pointer *//* pointer */};

Page 10: مبانی کامپیوتر و برنامه سازی

10

تعریف ساختارهاتعریف ساختارهامی توان یک نام به عنوان نشانه ساختار درنظر نگرفت•

در اینصورت متغیرهای از نوع این ساختار را فقط می توان در کنار تعریف خود ساختار تعریف نمود و در سایر •مکانهای برنامه نمی توان این نوع متغیرها را تعریف نمود

struct {

char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary;

} Ali;

Page 11: مبانی کامپیوتر و برنامه سازی

11

دسترسی به اعضای یک ساختاردسترسی به اعضای یک ساختار قابل دسترسی هستند“.”اعضای یک ساختار با استفاده از عملگر •

myEmp.firstName ;employee. firstNameemployee. firstName; // Error// Error

اگر یک اشاره گر به ساختار تعریف شده باشد•– employee *emp = &myEmp ;

نیز می توان به اعضای ساختار دسترسی داشت“-<”با استفاده از عملگر –

– emp ->-> firstName; // arrow operatorarrow operatorمی توان به صورت زیر نیز به اعضای ساختار دسترسی داشت–

– (*(* emp).).firstName;

struct employee { char firstName[ 20 ]; // …

} myEmpmyEmp;

Page 12: مبانی کامپیوتر و برنامه سازی

12

مقداردهی اولیه ساختارمقداردهی اولیه ساختار

struct identity js = {"Joe", "Smith", 25}js = {"Joe", "Smith", 25}, *ptr = &js ;js.person.id = 123456789 ;js.person.gpa = 3.4 ;

printf ("%s %s %d %ld %f\n", js.FirstName, js.LastName, js.age, js.person.id, js.person.gpa) ;printf ("%s %s %d %ld %f\n", ptr->FirstName, ptr->LastName,ptr->age, ptr->person.id,

ptr->person.gpa) ;

struct identity{ char FirstName[30]; char LastName[30]; unsigned age; struct personal person;};

یک ساختار تعریف می شود ولی فضایی //برایش در نظر نمی شودstruct personal{

long id; // student ID float gpa; // grade point average};

js = {"Joe", "Smith", 25, 9, 10}js = {"Joe", "Smith", 25, 9, 10}js.personalpersonal.id ErrorErrorstrcpy(strcpy(js.FirstName, "Joe");"Joe");

Page 13: مبانی کامپیوتر و برنامه سازی

13

مقداردهی اولیه ساختارمقداردهی اولیه ساختار

struct identity{ char FirstName[30]; char LastName[30]; unsigned age; struct personal person;};

یک ساختار تعریف می شود ولی فضایی //برایش در نظر نمی شودstruct personal{

long id; // student ID float gpa; // grade point average};

struct identity js = {"Joe", "Smith", 25}js = {"Joe", "Smith", 25}, oj ;js.person.id = 123456789 ;js.person.gpa = 3.4 ;

oj = js;oj = js;

printf ("%s %s %d %ld %f\n", oj.FirstName, oj.LastName, oj.age, oj.person.id, oj.person.gpa) ;

Page 14: مبانی کامپیوتر و برنامه سازی

14

آرایه ای از ساختارهاآرایه ای از ساختارها

struct identity{ char FirstName[30]; char LastName[30]; unsigned age; struct personal person;} students[4];

//Create a struct but don’t reserve spacestruct personal{

long id; // student ID float gpa; // grade point average};

struct identity KNTU_Mabani[80] = {"omid", “Vatandoust", 14, 9140153, 20,KNTU_Mabani[80] = {"omid", “Vatandoust", 14, 9140153, 20, "Samad", "Shekarestani", 90, 2222222, 20}"Samad", "Shekarestani", 90, 2222222, 20} ;

strcpy(strcpy(KNTU_MabaniKNTU_Mabani[2].[2].FirstName, "Khaje Nasir""Khaje Nasir");strcpy(strcpy(KNTU_MabaniKNTU_Mabani[2].[2].LastName, "Shekarestani""Shekarestani");KNTU_MabaniKNTU_Mabani[2].[2]. age = 100;KNTU_MabaniKNTU_Mabani[2].[2]. person.id = 11111111;KNTU_MabaniKNTU_Mabani[2].[2]. person. gpa = 20;

Page 15: مبانی کامپیوتر و برنامه سازی

15

مثالمثال

bool check_birthday(struct Date today, struct Date myFriend){ if ((today.month == myFriend.month) && (today.day == myFriend.day)) return (true); return (false);}int main(){ struct Friend friends[NFRIENDS]; struct Date today = {2012, 3, 11}; // ... for (i = 0; i < NFRIENDS; i++) { if(check_birthday(todaytoday, friends[i].Birthdayfriends[i].Birthday)) printf ("%s %s\n", friends[i].FirstName, oj.LastName) ; } // …

#define NFRIENDS 10struct Date{ unsigned year; unsigned month; unsigned day;};struct Friend { char FirstName[30]; char LastName[30]; struct Date Birthday;};

typedef struct{ unsigned year; unsigned month; unsigned day;} Date;bool check_birthday(Date today, Date myFriend){ //…}

Page 16: مبانی کامپیوتر و برنامه سازی

16

اشاره گر به ساختارهااشاره گر به ساختارهاDate create_date1(int month,

int day,

int year)

{

Date d;

d.month = month;

d.day = day;

d.year = year;

return (d);

}

void create_date2(Date *d,

int month,

int day,

int year)

{

d->month = month;

d->day = day;

d->year = year;

}

Copies date

Pass-by-reference

Date today;

today = create_date1(9, 4, 2008);

create_date2(&today, 9, 4, 2008);

Page 17: مبانی کامپیوتر و برنامه سازی

17

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

void create_date2(Date *d,

int month,

int day,

int year)

{

d->month = month;

d->day = day;

d->year = year;

}

void foo(void)

{

Date today;

create_date2(&today, 9, 4, 2008);

} today.month:

today.day:

today.year:

0x1000

0x1004

0x1008

month: 9

day: 4

year: 2008

0x30A0

0x30A4

0x30A8

d: 0x10000x3098

9

4

2008

Page 18: مبانی کامپیوتر و برنامه سازی

18

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

Date * create_date3(int month,

int day,

int year)

{

Date *d;

d->month = month;

d->day = day;

d->year = year;

return (d);

}

dبه چه چیزی اشاره می کند؟!؟!؟

Page 19: مبانی کامپیوتر و برنامه سازی

19

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

void changeByValue(Date date){ date.day ++;}void changeByRef(Date *date){ date->day++;}void printDate(const Date date){ printf("today(d/m/y) is : \n"); printf("%d/%d/%d\n", date.day, date.month,

date.year);}

Date today = {2012, 3, 11};printDate(today);changeByValue(today);printDate(today);changeByRef(&today);printDate(today);

today(d/m/y) is :11/3/2012today(d/m/y) is :11/3/2012today(d/m/y) is :12/3/2012

Page 20: مبانی کامپیوتر و برنامه سازی

20

مقایسه ساختارهامقایسه ساختارها

!= و ==ساختارها نباید با استفاده از عملگرهای •مورد مقایسه قرار گیرند زیرا اعضای ساختارها

L در بایتهای متوالی حافظه ذخیره نمی شوند لزوما

struct a { int a; int b;}; struct a b, c; b.a = 10; b.b = 30; c = b; if(c == b) // Error// Error

Page 21: مبانی کامپیوتر و برنامه سازی

21

((UnionsUnionsیونیونها)یونیونها)یک یونیون مشابه یک ساختار است که اعضای آن در یک فضای مشترک در حافظه تعریف می شوند•

به دالیلی ممکن است در یک برنامه در عمل فقط یکی از چند متغیر موردنیاز باشد و بنابراین لزومی ندارد که فضای حافظه با درنظر گرفتن •فضای جداگانه برای همه آنها هدر دهیم

اعضای یونیون می توانند از هر نوعی باشند•

فضای حافظه درنظر گرفته شده برای یونیون به اندازه فضای موردنیاز برای ذخیره عضوی از آن است که بیشترین فضای حافظه را نیاز دارد•

فقط یک عنصر (و در نتیجه یک نوع داده) در هر زمان می تواند مورد رجوع قرار گیرد•

Page 22: مبانی کامپیوتر و برنامه سازی

22

نمایش یونیونهانمایش یونیونها

union myDataUnion {

int i;

char c;

float f;

} u1, u2;

union myDataUnion u3;

u1.i = 4;

u1.c = ’a’;

u2.i = 0xDEADBEEF;

c

i

f

Page 23: مبانی کامپیوتر و برنامه سازی

23

((UnionsUnionsیونیونها)یونیونها)عملگرهای قابل استفاده برروی یونیونها عبارتند از:•

نسبت دهی یک یونیون از یک نوع به یک یونیون دیگر از همان نوع–&بدست آوردن آدرس با استفاده از – “-<” و “.”دسترسی به عناصر یونیون با استفاده از –

مورد مقایسه قرا گیرند (به != و ==یونیونها نمی توانند با استفاده از عملگرهای •دلیل مشابه دلیل ذکر شده برای ساختارها)

Page 24: مبانی کامپیوتر و برنامه سازی

24

((UnionsUnionsیونیونها)یونیونها)

یک یونیون می تواند بوسیله یک مقدار از نوع داده •اولین عضو خود مقداردهی اولیه شود

union a { int a; // OK// OK char b[4];};

union a b = {10};printf("%d", b.a);

Page 25: مبانی کامپیوتر و برنامه سازی

25

ساختارهای بیتیساختارهای بیتیunsigned int L یا int می توان مشخص کرد که یک متغیر از نوع Cدر زبان • در یک ساختار یا یونیون دقیقا

در چند بیت ذخیره شود.

) می گویندBit fieldبه این موارد بخش بیتی (•

و سپس تعدا بیتهای موردنیاز آورده می شود“:”برای تعریف یک بخش بیتی یک •

بخشهای بیتی مشابه عناصر دیگر ساختارها قابل دسترسی هستند•

Page 26: مبانی کامپیوتر و برنامه سازی

26

ساختارهای بیتیساختارهای بیتی

struct Flags

{

int f1:3;

unsigned int f2:1;

unsigned int f3:2;

} foo;

foo.f1 = -2;

foo.f2 = 1;

foo.f3 = 2;

1 1 0 1 1 0 … …

f1 f2 f3

Page 27: مبانی کامپیوتر و برنامه سازی

27

((EnumerationsEnumerationsشمارشها )شمارشها )•Enumeration یک نوع داده تعریف شده بوسیله کاربر است و با استفاده از کلمه کلیدی enum

تعریف می شود– enumenum tag_name {name_0, …, name_n} ;{name_0, …, name_n} ;

• tag_name به صورت مستقیم استفاده نمی شود، اسامی قرار گرفته بین }{ ثابتهای نمادینی به آنها اختصاص می یابد، به عنوان مثال:n تا 0هستند که مقادیر بین

– enum colors { red, yellow, green } ;enum colors { red, yellow, green } ;

نسبت green به 2 و yellow به red، 1 به 0 سه مقدار ثابت ایجاد می شود و به ترتیب مقادیر •داده می شود

Page 28: مبانی کامپیوتر و برنامه سازی

28

((EnumerationsEnumerationsشمارشها )شمارشها )اسامی شناسه ها در یک شمارش می باید یکتا باشند•

شروع می شوند، مگر اینکه مقدار دیگری مشخص شود0مقادیر ثابتها در یک شمارش از •

مقدار هر ثابت در شمارش می تواند به صورت دقیق در هنگام تعریف شمارش معین شود•

چند عضو یک شمارش می توانند مقدار یکسان داشته باشند•

بعد از تعریف یک شمارش نمی توان مقادیر ثابتهای آنرا تغییر داد•

Page 29: مبانی کامپیوتر و برنامه سازی

29

مثالمثال/*این برنامه از شمارشها برای دسترسی به عناصر یک آرایه استفاده می کند */#include <stdio.h>

int main( )

{

int March[5][7]={{0,0,1,2,3,4,5},

{6,7,8,9,10,11,12},

{13,14,15,16,17,18,19},

{20,21,22,23,24,25,26},

{27,28,29,30,31,0,0}};

enum days {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};

enum week {week_one, week_two, week_three, week_four, week_five};

printf ("Monday the third week of March is March %d\n",

March [week_three] [Monday] );

}

Page 30: مبانی کامپیوتر و برنامه سازی

30

مثالمثال

/*ثابتهای شمارش ماههای سال را نمایش می دهند */enum months {JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };

enum months month;

/*مقداردهی اولیه */const char *monthName[] = { "", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October“, “November”, “December”/*حلقه بر روی ماهها */for (month = JAN; month <= DEC; month++ ) { printf( "%2d%11s\n", month, monthName[month] );}