C語言程序設(shè)計課件:結(jié)構(gòu)體、共同體與位運算_第1頁
C語言程序設(shè)計課件:結(jié)構(gòu)體、共同體與位運算_第2頁
C語言程序設(shè)計課件:結(jié)構(gòu)體、共同體與位運算_第3頁
C語言程序設(shè)計課件:結(jié)構(gòu)體、共同體與位運算_第4頁
C語言程序設(shè)計課件:結(jié)構(gòu)體、共同體與位運算_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

結(jié)構(gòu)體、共同體與位運算第一節(jié)結(jié)構(gòu)體類型概述第二節(jié)結(jié)構(gòu)體數(shù)組概述第三節(jié)共用體第四節(jié)位運算第五節(jié)項目任務(wù):利用結(jié)構(gòu)體類型改寫輸入輸出子模塊第一節(jié)結(jié)構(gòu)體類型概述在前面幾章中,我們已經(jīng)介紹了基本類型的變量,如整型、實型、字符型變量等,也介紹了一種構(gòu)造類型的數(shù)據(jù)----數(shù)組,它的特點是數(shù)組中各元素的類型和長度都必須一致,以便于系統(tǒng)處理。但是只有這些數(shù)據(jù)類型是不夠的。有時需要將不同類型的數(shù)據(jù)組合成一個有機的整體,以便于引用。這些組合在一個整體中的數(shù)據(jù)是相互聯(lián)系的。例如,一個學生的姓名、性別、籍貫、學號、成績等項目,這些項目都與一個學生相聯(lián)系。但它們的數(shù)據(jù)類型卻各不相同,如姓名、性別、籍貫、學號的數(shù)據(jù)類型可以為字符型數(shù)據(jù),成績?yōu)閷嵭蛿?shù)據(jù),如果將它們分別定義為互相獨立的簡單變量,難以反映它們之間的內(nèi)在聯(lián)系。應(yīng)當把它們組織成一個組合項,在一個組合項中包含若干個類型不同的數(shù)據(jù)項,在C語言中就引入了一種數(shù)據(jù)類型----結(jié)構(gòu)體類型。這種類型的變量可以擁有不同數(shù)據(jù)類型的成員。一、結(jié)構(gòu)體類型的定義定義結(jié)構(gòu)體類型的格式為:struct

<結(jié)構(gòu)體類型名>{<成員類型1><成員名1>;<成員類型2><成員名2>;…<成員類型n><成員名n>;

};說明:(1)struct是定義結(jié)構(gòu)體類型的關(guān)鍵字,不能省略。(2)結(jié)構(gòu)體類型名由用戶命名,命名規(guī)則與標識符命名規(guī)則相同。(3)花括號{}內(nèi)的部分稱為結(jié)構(gòu)體。結(jié)構(gòu)體是由若干結(jié)構(gòu)成員組成的。每個結(jié)構(gòu)成員有自己的名稱和數(shù)據(jù)類型,<成員名>是用戶自己定義的標識符,<成員類型>既可以是基本數(shù)據(jù)類型,也可以是已定義過的某種數(shù)據(jù)類型(如:數(shù)組類型、結(jié)構(gòu)體類型等)。若幾個結(jié)構(gòu)成員具有相同的數(shù)據(jù)類型,可將它們定義在同一種成員類型之后,各成員名之間用逗號隔開。(4)結(jié)構(gòu)體類型的定義應(yīng)視為一個完整的語句,用一對花括號{}括起來。例如:定義一個學生信息的結(jié)構(gòu)體類型,包括:學生學號、姓名、性別、年齡、地址和學生成績。structstudent//定義學生信息結(jié)構(gòu)體類型{intnum;;/*學生學號*/charname[20];/*姓名*/charsex;/*性別*/intage;/*年齡*/charaddress[30];/*地址*/floatscore;/*分數(shù)*/};說明:(1)structstudent是用戶自己定義的一個結(jié)構(gòu)體類型,它和系統(tǒng)已經(jīng)定義了的標準類型如int,char等一樣可以用來作為定義變量的類型;(2)定義一個結(jié)構(gòu)體類型并不分配內(nèi)存,只有定義這個結(jié)構(gòu)體類型的變量時,才分配內(nèi)存。二、結(jié)構(gòu)體類型變量的定義結(jié)構(gòu)體類型定義之后只是說明了一個構(gòu)造型數(shù)據(jù)類型,系統(tǒng)并不為其分配內(nèi)存,也就無法存儲數(shù)據(jù),只有在程序中定義了結(jié)構(gòu)體類型變量之后才能存儲數(shù)據(jù)。說明結(jié)構(gòu)體變量有以下幾種方法:1、先定義結(jié)構(gòu)體類型,再說明結(jié)構(gòu)體變量。

例如:

struct

student/*定義學生信息結(jié)構(gòu)體類型*/{intnum;;/*學生學號*/char

name[20];/*姓名*/char

sex;/*性別*/int

age;/*年齡*/charaddress[30];/*地址*/floatscore;/*分數(shù)*/};

struct

student

student1;/*定義了1個結(jié)構(gòu)體變量

student1*/2、在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量。例如:

struct

student/*定義學生信息結(jié)構(gòu)體類型*/{intnum;/*學生學號*/char

name[20];/*姓名*/char

sex;/*性別*/int

age;/*年齡*/charaddress[30];/*地址*/floatscore;/*分數(shù)*/}student1,student2;/*定義2個結(jié)構(gòu)體變量student1,student2*/3、說明一個無名結(jié)構(gòu)體類型,直接說明結(jié)構(gòu)體變量。例如:

struct

/*定義學生信息結(jié)構(gòu)體類型*/{intnum;/*學生學號*/char

name[20];/*姓名*/char

sex;/*性別*/int

age;/*年齡*/charaddress[30];/*地址*/floatscore;/*分數(shù)*/}student1,student2;/*定義2個結(jié)構(gòu)體變量student1,student2*/

由于這種定義方法不定義結(jié)構(gòu)體類型名,無法記錄該結(jié)構(gòu)體類型,所以只能用來聲明結(jié)構(gòu)體變量,而且以后也不能用它聲明變量或函數(shù)等。三、結(jié)構(gòu)體類型變量的初始化和引用(一)、結(jié)構(gòu)體類型變量的初始化

所謂結(jié)構(gòu)體變量的初始化是指在定義結(jié)構(gòu)體變量的同時給結(jié)構(gòu)體變量賦初值。其初始化的方式有兩種:1、是用花括號{}括起來的若干成員值對結(jié)構(gòu)體變量初始化;二是用同類型的變量對結(jié)構(gòu)體變量初始化。例如:

struct

student/*定義學生信息結(jié)構(gòu)體類型*/{intnum;/*學生學號*/char

name[20];/*姓名*/char

sex;/*性別*/int

age;/*年齡*/charaddress[30];/*地址*/floatscore;/*分數(shù)*/}

struct

student

student1={001","LiYan","female",18,”cd”,90.5};2、是用同類型的變量對結(jié)構(gòu)體變量初始化。例如:struct

student

student2=student1;

上述語句是用同類型的變量student1對student2初始化,這種方式是將變量student1拷貝到student2中。(二)、結(jié)構(gòu)體類型變量的引用

在定義了結(jié)構(gòu)體變量以后,當然可以應(yīng)用這個變量,但應(yīng)遵循以下規(guī)則:對結(jié)構(gòu)體變量的引用不能整體應(yīng)用,只能應(yīng)用結(jié)構(gòu)體成員。可以使用結(jié)構(gòu)成員操作符“.”(或稱為點操作符)對其成員進行訪問。使用結(jié)構(gòu)體成員的格式為:<結(jié)構(gòu)體變量>.<成員名>成員運算符的作用是引用結(jié)構(gòu)體變量中的某個成員。點運算符的的優(yōu)先級與下標運算符的優(yōu)先級相同,是C語言中所有運算符優(yōu)先級中最高的。例如:對于如下結(jié)構(gòu)體:

struct

date/*定義日期信息結(jié)構(gòu)體類型*/{int

year;int

month;int

day;}date1;要給結(jié)構(gòu)體變量中的year賦值10,其引用的方式為:date1.year=10;【案例7-1】結(jié)構(gòu)體類型變量的引用。分析:定義一個教師結(jié)構(gòu)體類型,教師的數(shù)據(jù)包括職工號,姓名、性別和年齡。從鍵盤上輸入每個教師的信息,然后輸出結(jié)構(gòu)體成員的數(shù)據(jù)。voidmain(){structteacher/*定義教師信息結(jié)構(gòu)體類型*/{charnumber[12];charname[10];charsex[6];intage;}teacher1;printf("\n請輸入職工號:");scanf("%s",teacher1.number);printf("請輸入姓名:");scanf("%s",);printf("請輸入性別:");scanf("%s",teacher1.sex);printf("請輸入年齡:");scanf("%d",&teacher1.age);printf("\n職工號是:%s",teacher1.number);printf("\n姓名是:%s",);printf("\n性別是:%s",teacher1.sex);printf("\n年齡是:%d",teacher1.age);}【注意】不能將結(jié)構(gòu)體變量作為一個整體進行輸入和輸出,只能通過引用其成員依次將數(shù)據(jù)進行輸入和輸出。第二節(jié)結(jié)構(gòu)體數(shù)組概述一、結(jié)構(gòu)體數(shù)組的定義一個結(jié)構(gòu)體變量中可以存放一組數(shù)據(jù)(如一個學生的學號、姓名,成績的),如果有20個學生的數(shù)據(jù)需要參與運算,顯然應(yīng)該使用數(shù)組,這就是結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組與以前介紹過的數(shù)值型數(shù)組的不同之處在于每個數(shù)組元素都是一個結(jié)構(gòu)體類型的數(shù)據(jù)。結(jié)構(gòu)體數(shù)組的使用與普通數(shù)組的使用一樣,也是通過下標來訪問數(shù)組元素的。結(jié)構(gòu)體數(shù)組的定義方式和定義結(jié)構(gòu)體變量相似,只需說明其為數(shù)組即可。例如:

struct

/*先定義學生信息結(jié)構(gòu)體類型,再定義結(jié)構(gòu)型數(shù)組*/{intnum;/*學生學號*/char

name[20];/*姓名*/char

sex;/*性別*/int

age;/*年齡*/charaddress[30];/*地址*/floatscore;/*分數(shù)*/}structstudentstu[3];以上代碼定義了一個結(jié)構(gòu)體數(shù)組stu,其元素為structstudent類型數(shù)據(jù),數(shù)組有3個元素。也可以采取以下的方式來定義:

struct

/*先定義學生信息結(jié)構(gòu)體類型,再定義結(jié)構(gòu)型數(shù)組*/{intnum;/*學生學號*/char

name[20];/*姓名*/char

sex;/*性別*/int

age;/*年齡*/charaddress[30];/*地址*/floatscore;/*分數(shù)*/}stu[3];二、結(jié)構(gòu)體數(shù)組的初始化(一)、結(jié)構(gòu)體數(shù)組的初始化與其他類型的數(shù)組一樣,在定義數(shù)組的同時,對其中的每一個元素進行初始化。

例如:structstudent{intnum;;/*學生學號*/charname[20];/*姓名*/charsex;/*性別*/intage;/*年齡*/charaddress[30];/*地址*/floatscore;/*分數(shù)*/}stu[2]

={{10000,"LiHua","female",21,”BJ”,88.6},{10002,"WenMing","male",22,”CD”,76.8};/*對結(jié)構(gòu)體數(shù)組進行初始化*/(二)、結(jié)構(gòu)體數(shù)組的使用結(jié)構(gòu)體數(shù)組的使用即數(shù)組元素的使用,是通過下標變量實現(xiàn)的。對于結(jié)構(gòu)體數(shù)組需要用下標變量引用結(jié)構(gòu)體成員。引用方式:結(jié)構(gòu)體數(shù)組名[下標].成員名。下面通過兩個例子說明結(jié)構(gòu)體數(shù)組的使用?!景咐?-2】有3個候選人,每次輸入一個得票的候選人的名字,對他們的得票結(jié)果進行統(tǒng)計,并將這些信息顯示在屏幕上。分析:在主函數(shù)中定義一個字符數(shù)組,它代表被選人的姓名。在10次循環(huán)中每次先輸入一個候選人的名字,然后把它與3個候選人人姓名相比,然后將相符合的候選人的票數(shù)加1,在輸入和統(tǒng)計結(jié)束之后,將3人的名字和得票數(shù)輸出。#include<stdio.h>#include<string.h>structperson/*定義候選人信息結(jié)構(gòu)體類型*/{charname[10];intcount;}person1[3]={"YangLin",0,"ZhangHua",0,"LiPin",0};voidmain(){inti,j;charpersonname[10];for(i=0;i<6;i++){printf("\n請輸入第%d個候選人姓名:\n",i+1);scanf("%s",personname);for(j=0;j<3;j++)if(strcmp(personname,person1[j].name)==0)/*將選票上的姓名與候選人的姓名進行比較*/person1[j].count++;/*將候選人的得票數(shù)加1*/}printf("------------統(tǒng)計結(jié)果--------------");printf("\n");for(i=0;i<3;i++)printf("%s:%d\n",person1[i].name,person1[i].count);}第三節(jié)共用體共用體類型也是用來描述類型不相同的數(shù)據(jù),但與結(jié)構(gòu)體類型不同,共用體數(shù)據(jù)成員存儲時采用覆蓋技術(shù),共享(部分)存儲空間。因此,共用體變量所占的存儲空間不是各成員所需存儲空間字節(jié)數(shù)的總和,而是共用體成員中需要空間最大的哪個成員所需的字節(jié)數(shù)。一、共用體類型的定義定義一個共用體的語法形式為:union共用體類型名{<成員類型1>

<成員名1>;<成員類型2>

<成員名2>;…<成員類型2>

<成員名n>;};其中union為系統(tǒng)的關(guān)鍵字,其作用是通知系統(tǒng),目前定義了一個為名為“共用體類型名”的共用體。成員變量可以是任何類型的變量。例如:unionstudent{char

number[10];char

name[10];char

sex[8];int

age;};二、共用體變量的定義共用體變量的定義方式與結(jié)構(gòu)體變量相同,也有三種方式,下面介紹常用的兩種。1、先定義共用體類型,再定義共用體變量。例如:uniondata{inti;char

ch;floatf;};uniondataa,b,c;2、在定義共用體的同時定義變量。例如:uniondata{intI;char

ch;floatf;}a,b,c;共用體和結(jié)構(gòu)體的比較:1、結(jié)構(gòu)體變量所占內(nèi)存長度是各成員所占的內(nèi)存長度之和,每個成員分別占有其自己的內(nèi)存單元。2、共用體變量所占的內(nèi)存長度等于最長的成員所占的內(nèi)存長度。例如:上面定義的共用體變量a,b,c占用4個字節(jié),而不是各占2+1+4=7個字節(jié)。三、共用體變量的引用對共用體變量的賦值、使用都只能是對變量的成員進行。共用體變量的成員表示為:共用體變量名.成員名【案例7-3】利用共用體的特點分別取出int變量中高字節(jié)和低字節(jié)中的兩個數(shù)。#include<stdio.h>main(){unionic{inti;charch[2];}x;x.i=24897;printf("i=%o\n",x.i);/*用8進制形式輸出x.i*/printf("ch0=%o,ch1=%o\nch0=%c,ch1=%c\n",x.ch[0],x.ch[1],x.ch[0],x.ch[1]);}/*用8進制形式輸出ch[0],ch[1],用字符形式輸出ch[0],ch[1];*/【說明】本例程序中的共用體類型變量x中有兩個成員,一個是整型變量n,一個是字符串ch,它們在內(nèi)存中共占用2個字節(jié)。ch[0]存放的是整數(shù)的低字節(jié)01000001,ch[1]存放的是整數(shù)的高字節(jié)01100001。第四節(jié)位運算C語言兼具高級語言與低級語言的特性,因此適合編寫系統(tǒng)軟件,C語言具備低級語言的特性就在于它能直接對硬件進行操作,即位運算。所謂位運算是指按二進制位進行的運算。一、位邏輯運算(一)、按位與按位與的運算符“&”是雙目運算符,參加運算的兩個數(shù)據(jù),按各對應(yīng)的二進位進行“與”運算。運算規(guī)則:0&0=0;0&1=0;1&0=0;1&1=1;例如:有兩個整數(shù)i=7,j=3,求i&j運算過程示意如下:i=0000000000000111j=0000000000000011i&j=0000000000000011因此,i&j的值得3(注意不是10)。用途:可以判斷一個數(shù)據(jù)的某一位是否是1;可以保留一個數(shù)據(jù)中的某些位,屏蔽掉其它位。(二)、按位或按位或運算符為“|”,參加運算的兩個對象,按相應(yīng)的二進位中進行“或”運算。運算規(guī)則0|0=0;0|1=1;1|0=1;1|1=1。例如:有兩個整數(shù)i=3,=5,求i|j運算過程示意如下:i=0000000000000011j=0000000000000101i&j=0000000000000111因此,i&j的值得7用途:可以將一個數(shù)據(jù)的某些位置為1,其它位不變。(三)、按位異或按位異或的運算符“∧”也稱XOR運算符。運算規(guī)則:0∧0=0;0∧1=1;1∧0=1;1∧1=0;例如:有兩個整數(shù)i=47,j=32,求i∧j運算過程示意如下:i=0000000000101101j=0000000000100101i&j=0000000000001101因此,i&j的值得13用途:(1)對某些位取反在異或運算中,使用1與某一位進行異或可以達到取反的功能。(2)保留某些位在異或運算中,使用0與某一位進行異或可以保持該位不變。(3)交換兩個值,不用臨時變量。假如a=3,b=4。想將a和b的值互換,可以用以下賦值語句實現(xiàn):a=a∧b;b=b∧a;a=a∧b;(四)、按位取反按位取反的運算符為“~”?!啊笔且粋€單目(元)運算符,用來對一個二進制數(shù)按位取反。運算規(guī)則:將0變1,1變0。例如:~9的結(jié)果為-10。運算過程示意如下:

i=0000000000001001~j=1111111111110110因此,~i的值得-10。二、移位運算(一)、左移位左移運算符為“<<”。用來將一個數(shù)的各二進位全部左移若干位,左邊的二進制丟棄,右邊補0。例如:a=a<<2;(左移二位)若a=15,a的二進制數(shù)為00001111,a左移2位后為00111100,其值為60。從上面我們可以看出左移1位相當于該數(shù)乘以2,左移2位相當于該數(shù)乘以4,但此結(jié)論只適用于該數(shù)左移時被溢出舍棄的高位中不包含1的情況。左移比乘法運算速度快得多,因此,有些C編譯程序自動將乘2的運算用左移一位來實現(xiàn),將乘2n的冪運算處理為左移n位。(二)、右移位右移運算符為“>>”。用來將一個數(shù)的各二進位全部右移若干位,從右邊移出去的低位部分被丟棄。對無符號數(shù)來講,高位部分補0,對有符號數(shù)來講,正數(shù)(符號位為0),則右移時左端補0,負數(shù)(符號位為1),則右移時左端是補0還是補1,取決于所用的計算機系統(tǒng)。例如:a=a>>2;(右移2位)。若a=016,a的二進制數(shù)為00001110,a右移2位為00000011由上述運算結(jié)果可以看出,在進行“右移運算時,如果移出去的低位部分不包含1,則右移1位相當于除以2,右移2位相當于除以4,右移3位相當于除以8,依次類推,因此,在實際應(yīng)用中,經(jīng)常利用”右移“運算來進行除以2的方冪的操作?!景咐?-4】采用位運算中的移位運算,輸出一個整數(shù)的二進制形式。分析:輸出的整數(shù)num一般為2個字節(jié)的16位整型數(shù)據(jù),那么可以把num中16個位的每一位看成是一個整數(shù)bit,其值當然只能為0或者為1。從高位開始,逐位判斷num的每一位是0還是1,然后把該位的值賦給bit,并輸出bit的值。此判斷輸出要循環(huán)16次。程序如下:/*輸出一個整數(shù)的二進制形式*/#include<stdio.h>main(){intnum,bit,i;unsignedtest=0x8000;/*test用二進制表示是1000000000000000*/printf("請輸入一個任意整數(shù):");scanf("%d",&num);printf("%d整數(shù)的十六進制形式是:0x%x,二進制形式是:",num);for(i=1;i<=16;i++){bit=((num&test)==0)?0:1;/*逐位判斷num的每一位是0還是1*/printf("%d",bit);test>>=1;/*將test右移1位*/}}第五節(jié)項目任務(wù):利用結(jié)構(gòu)體類型改寫輸入輸出子模塊【項目案例】利用結(jié)構(gòu)體類型改寫輸入輸出子模塊分析:在本次項目任務(wù)中,我們將學生信息、成績等數(shù)據(jù)存儲在結(jié)構(gòu)體類型變量中,并對它們進行處理。#defineN30#include<stdio.h>structscore/*定義包含學生信息的結(jié)構(gòu)體類型

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論