Upload
avi
View
67
Download
8
Embed Size (px)
DESCRIPTION
مبانی کامپیوتر و برنامه سازی. مدرس: سید حسین خواسته. فصل نهم. برخی ساختارها در زبان C. ساختارها( Structures ) یونیونها( Unions ) ساختارهای بیتی( Bit fields Structures ) شمارشها ( Enumerations ). فهرست مطالب فصل نهم. نوع داده های تعریف شده بوسیله کاربر. - PowerPoint PPT Presentation
Citation preview
مبانی کامپیوتر و برنامه سازیمبانی کامپیوتر و برنامه سازی
مدرس: سید حسین خواستهمدرس: سید حسین خواسته
فصل نهمفصل نهم
CCبرخی ساختارها در زبان برخی ساختارها در زبان
3
فهرست مطالب فصل نهمفهرست مطالب فصل نهم
(Structures)ساختارها•
(Unions)یونیونها•
)ساختارهای بیتی•Bit fields Structures)
(Enumerations) شمارشها•
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;
5
ساختارهاساختارها
مجموعه ای از متغیرهای مرتبط با یک نام واحد هستند•
ساختارها می توانند برخالف آرایه ها شامل متغیرهایی از انواع مختلف باشند •
L از ساختارها برای تعریف مواردی که در فایلها ذخیره می شوند استفاده • معموالمی شود
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; ;
7
تعریف ساختارهاتعریف ساختارها
L از • به همراه ساختارها استفاده می typedefمعموالشود تا یک معادل برای ساختار تعریف شود
typedef structtypedef struct {
char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary;
} employee;; //معادل
employeeemployee Ali; /* یک متغیر از نوع ساختار /* ایجاد می کند
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];
9
تعریف ساختارهاتعریف ساختارها
یک ساختار نمی تواند شامل متغیری از نوع همان •ساختار باشد، ولی متغیری از نوع اشاره گر به
همان ساختار مجاز است
struct employee2 { // … double hourlySalary; struct employee2 person; struct employee2 person; /* ERROR *//* ERROR */ struct employee2 *ePtr; struct employee2 *ePtr; /* pointer *//* pointer */};
10
تعریف ساختارهاتعریف ساختارهامی توان یک نام به عنوان نشانه ساختار درنظر نگرفت•
در اینصورت متغیرهای از نوع این ساختار را فقط می توان در کنار تعریف خود ساختار تعریف نمود و در سایر •مکانهای برنامه نمی توان این نوع متغیرها را تعریف نمود
struct {
char firstName[ 20 ]; char lastName[ 20 ]; int age; char gender; double hourlySalary;
} Ali;
11
دسترسی به اعضای یک ساختاردسترسی به اعضای یک ساختار قابل دسترسی هستند“.”اعضای یک ساختار با استفاده از عملگر •
myEmp.firstName ;employee. firstNameemployee. firstName; // Error// Error
اگر یک اشاره گر به ساختار تعریف شده باشد•– employee *emp = &myEmp ;
نیز می توان به اعضای ساختار دسترسی داشت“-<”با استفاده از عملگر –
– emp ->-> firstName; // arrow operatorarrow operatorمی توان به صورت زیر نیز به اعضای ساختار دسترسی داشت–
– (*(* emp).).firstName;
struct employee { char firstName[ 20 ]; // …
} myEmpmyEmp;
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");
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) ;
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;
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){ //…}
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);
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
18
اشاره گر به ساختارهااشاره گر به ساختارها
Date * create_date3(int month,
int day,
int year)
{
Date *d;
d->month = month;
d->day = day;
d->year = year;
return (d);
}
dبه چه چیزی اشاره می کند؟!؟!؟
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
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
21
((UnionsUnionsیونیونها)یونیونها)یک یونیون مشابه یک ساختار است که اعضای آن در یک فضای مشترک در حافظه تعریف می شوند•
به دالیلی ممکن است در یک برنامه در عمل فقط یکی از چند متغیر موردنیاز باشد و بنابراین لزومی ندارد که فضای حافظه با درنظر گرفتن •فضای جداگانه برای همه آنها هدر دهیم
اعضای یونیون می توانند از هر نوعی باشند•
فضای حافظه درنظر گرفته شده برای یونیون به اندازه فضای موردنیاز برای ذخیره عضوی از آن است که بیشترین فضای حافظه را نیاز دارد•
فقط یک عنصر (و در نتیجه یک نوع داده) در هر زمان می تواند مورد رجوع قرار گیرد•
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
23
((UnionsUnionsیونیونها)یونیونها)عملگرهای قابل استفاده برروی یونیونها عبارتند از:•
نسبت دهی یک یونیون از یک نوع به یک یونیون دیگر از همان نوع–&بدست آوردن آدرس با استفاده از – “-<” و “.”دسترسی به عناصر یونیون با استفاده از –
مورد مقایسه قرا گیرند (به != و ==یونیونها نمی توانند با استفاده از عملگرهای •دلیل مشابه دلیل ذکر شده برای ساختارها)
24
((UnionsUnionsیونیونها)یونیونها)
یک یونیون می تواند بوسیله یک مقدار از نوع داده •اولین عضو خود مقداردهی اولیه شود
union a { int a; // OK// OK char b[4];};
union a b = {10};printf("%d", b.a);
25
ساختارهای بیتیساختارهای بیتیunsigned int L یا int می توان مشخص کرد که یک متغیر از نوع Cدر زبان • در یک ساختار یا یونیون دقیقا
در چند بیت ذخیره شود.
) می گویندBit fieldبه این موارد بخش بیتی (•
و سپس تعدا بیتهای موردنیاز آورده می شود“:”برای تعریف یک بخش بیتی یک •
بخشهای بیتی مشابه عناصر دیگر ساختارها قابل دسترسی هستند•
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
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 سه مقدار ثابت ایجاد می شود و به ترتیب مقادیر •داده می شود
28
((EnumerationsEnumerationsشمارشها )شمارشها )اسامی شناسه ها در یک شمارش می باید یکتا باشند•
شروع می شوند، مگر اینکه مقدار دیگری مشخص شود0مقادیر ثابتها در یک شمارش از •
مقدار هر ثابت در شمارش می تواند به صورت دقیق در هنگام تعریف شمارش معین شود•
چند عضو یک شمارش می توانند مقدار یکسان داشته باشند•
بعد از تعریف یک شمارش نمی توان مقادیر ثابتهای آنرا تغییر داد•
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] );
}
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] );}