C語言程序設(shè)計(jì)項(xiàng)目式教程:用戶自定義數(shù)據(jù)類型_第1頁
C語言程序設(shè)計(jì)項(xiàng)目式教程:用戶自定義數(shù)據(jù)類型_第2頁
C語言程序設(shè)計(jì)項(xiàng)目式教程:用戶自定義數(shù)據(jù)類型_第3頁
C語言程序設(shè)計(jì)項(xiàng)目式教程:用戶自定義數(shù)據(jù)類型_第4頁
C語言程序設(shè)計(jì)項(xiàng)目式教程:用戶自定義數(shù)據(jù)類型_第5頁
已閱讀5頁,還剩99頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

用戶自定義數(shù)據(jù)類型C語言程序設(shè)計(jì)任務(wù)驅(qū)動(dòng)式教程導(dǎo)學(xué)對(duì)于結(jié)構(gòu)體變量,應(yīng)該怎樣賦初值呢??結(jié)構(gòu)體類型的基本使用任務(wù)一結(jié)構(gòu)體變量初始化就是定義結(jié)構(gòu)體變量的同時(shí),對(duì)變量賦初值。例如:1、結(jié)構(gòu)體變量的初始化structstudent{ intnum;

/*學(xué)號(hào)為整型*/ charname[20]; /*姓名為字符串*/ charsex;

/*性別為字符型*/ intage; /*年齡為整型*/ floatscore; /*成績(jī)?yōu)閷?shí)型*/}stu1={2012001,”張曉霞”,’W’,21,67},*stu2;2012001張曉霞W2167stu1結(jié)構(gòu)體類型的基本使用任務(wù)一結(jié)構(gòu)體類型是嵌套定義的,則初始化形式如下:1、結(jié)構(gòu)體變量的初始化structdate{

intyear;

intmonth;

int

day;

};structstudent{intnum;

charname[20];

charsex;

intage;

structdatebirthday;floatscore;

}stu1={1018,”mali”,’W’,20,{1999,5,18},86};1018maliW20199951886stu1結(jié)構(gòu)體類型的基本使用任務(wù)一2、結(jié)構(gòu)體變量的引用structstudent{intnum;

charname[20];

charsex;

intage;

structdate{intyear;

intmonth;

int

day; }birthday;

floatscore;

}stu1,*stu2;結(jié)構(gòu)體變量的使用是通過對(duì)其每個(gè)成員的引用來實(shí)現(xiàn)的,一般形式如下:

結(jié)構(gòu)體變量名.成員名其中,“.”是結(jié)構(gòu)體的成員運(yùn)算符,它在所有運(yùn)算符中優(yōu)先級(jí)最高,因此,上述引用結(jié)構(gòu)體成員的寫法可以作為一個(gè)整體看待。結(jié)構(gòu)體變量中的每個(gè)成員都可以象同類型的普通變量一樣進(jìn)行各種運(yùn)算。例如:stu1.age;stu1.birthday.day

指向結(jié)構(gòu)體的指針變量,則指針變量的成員項(xiàng)的表示形式為:

結(jié)構(gòu)體指針變量->成員名。

例如:stu2->score;等價(jià)(*stu2).score;

(*stu2).birthday.day,stu2->birthday.day結(jié)構(gòu)體類型的基本使用任務(wù)一#include<stdio.h>#include<string.h>main()

{structstudent{intnum;

charname[20];

charsex;

intage;

floatscore;

}stu1,stu2;結(jié)構(gòu)體變量的賦值就是給各成員項(xiàng)的賦值??捎幂斎胝Z句或賦值語句來實(shí)現(xiàn)。3、結(jié)構(gòu)體變量的輸入輸出stu1.num=1108;

strcpy(,”wangling”);scanf(“%c%d%f”,&stu1.sex,&stu1.age,&stu1.score);stu2=stu1;

printf(“num=%d\nname=%s\n”,stu2.num,);printf(“sex=%c\nage=%d\n

score=%f\n”,

stu2.sex,stu2.age,

stu2.score);注:相同結(jié)構(gòu)體類型變量允許相互整體賦值,而不允許結(jié)構(gòu)體變量對(duì)輸入、輸出等其他運(yùn)算進(jìn)行整體操作,只能對(duì)其成員項(xiàng)進(jìn)行操作。結(jié)構(gòu)體類型的基本使用任務(wù)一結(jié)構(gòu)體類型內(nèi)存空間大小取決于所有成員項(xiàng)所占內(nèi)存的大小總和。

內(nèi)存對(duì)齊原則,導(dǎo)致系統(tǒng)分配的空間可能大于實(shí)際計(jì)算的字節(jié)數(shù)。

系統(tǒng)和編譯器的不同計(jì)算的字節(jié)數(shù)也不同。

結(jié)構(gòu)體類型內(nèi)存空間大小需要用sizeof(結(jié)構(gòu)體名)或sizeof(結(jié)構(gòu)體變量名)來得到所需內(nèi)存的字節(jié)數(shù)。

所有的數(shù)據(jù)類型是不分配空間的,只有當(dāng)程序中定義了結(jié)構(gòu)體類型的變量后,編譯系統(tǒng)才會(huì)按照該結(jié)構(gòu)體的內(nèi)存大小為其變量安排一片連續(xù)的存儲(chǔ)單元。4、結(jié)構(gòu)體變量的內(nèi)存分配結(jié)構(gòu)體類型的基本使用任務(wù)一例如:structstudent{ intnum;

/*學(xué)號(hào)為整型*/ charname[10]; /*姓名為字符串*/ charsex;

/*性別為字符型*/ intage; /*年齡為整型*/

structdatebirthday;/*嵌套date結(jié)構(gòu)體*/ floatscore; /*成績(jī)?yōu)閷?shí)型*/}stu1;則sizeof(structstudent)或sizeof(stu1)的值均為24。4、結(jié)構(gòu)體變量的內(nèi)存分配numnamesexagescorex4字節(jié)10字節(jié)2字節(jié)4字節(jié)4字節(jié)技能實(shí)訓(xùn)練一練技能實(shí)訓(xùn)任務(wù)一1.根據(jù)某單位招聘考試結(jié)果信息。利用所學(xué)知識(shí)完成下表中數(shù)據(jù)的結(jié)構(gòu)體輸入和輸出。編號(hào)姓名筆試成績(jī)面試成績(jī)總成績(jī)1501王虎89921811502李雪87961831503張揚(yáng)8285167...............#include<stdio.h>voidmain(){structjob_exam{unsignednum;charname[10];intexama;intexamb;inttotal;}a={1501,"王虎",89,92};a.total=a.exama+a.examb;printf("編號(hào)姓名筆試面試總成績(jī)\n");printf("%4u%8s%6d%6d%8d\n",a.num,,a.exama,a.examb,a.total);}#include<stdio.h>voidmain(){structjob_exam{unsignednum;char

name[10];int

exama;int

examb;int

total;}*p,s[3]={{1501,"王虎",89,92},{1502,"李雪",87,96},{1503,"張揚(yáng)",82,85}};p=s;printf("編號(hào)姓名筆試面試總成績(jī)\n");

for(inti=0;i<3;i++)

{(*p).total=(*p).exama+(*p).examb;//等價(jià)于p->total=p->exama+p->examb;printf("%4u%8s%6d%6d%8d\n",p->num,p->name,p->exama,p->examb,p->total);

/*等價(jià)于printf("%4u%8s%6d%6d%8d\n",(*p).num,(*p).name,(*p).exama,(*p).examb,(*p).total);*/p++;

}}編號(hào)姓名筆試成績(jī)面試成績(jī)總成績(jī)1501王虎89921811502李雪87961831503張揚(yáng)8285167...............某單位招聘考試結(jié)果學(xué)習(xí)總結(jié)答一答1、結(jié)構(gòu)體變量的初始化?2、結(jié)構(gòu)體變量的引用?3、結(jié)構(gòu)體變量的輸入輸出?4、結(jié)構(gòu)體變量的內(nèi)存分配?任務(wù)一用字符指針引用字符串感謝觀看!用戶自定義數(shù)據(jù)類型C語言程序設(shè)計(jì)任務(wù)驅(qū)動(dòng)式教程導(dǎo)學(xué)在前面的學(xué)習(xí)中,我們使用的是基本數(shù)據(jù)類型去定義變量,那么可以自定義數(shù)據(jù)類型嗎??導(dǎo)學(xué)結(jié)構(gòu)體數(shù)據(jù)特點(diǎn):1.各行內(nèi)數(shù)據(jù)不盡相同;2.各行間數(shù)據(jù)情況相同;3.以行為單位處理數(shù)據(jù).為什么要定義結(jié)構(gòu)體類型呢?結(jié)構(gòu)體類型的基本使用任務(wù)一結(jié)構(gòu)體是一種構(gòu)造類型(自定義數(shù)據(jù)類型),除了結(jié)構(gòu)體變量需要定義后才能使用外,結(jié)數(shù)據(jù)構(gòu)體的類型本身也需要定義。結(jié)構(gòu)體由若干“成員”組成,每個(gè)成員可以是一個(gè)基本的數(shù)據(jù)類型,也可以是一個(gè)已經(jīng)定義的構(gòu)造類型。1、結(jié)構(gòu)體的概念結(jié)構(gòu)體類型的基本使用任務(wù)一2、基本思路繪制二維表格第一步:制作表頭第二步:畫出各行第三步:編輯各行數(shù)據(jù)使用結(jié)構(gòu)體類型第一步:結(jié)構(gòu)體類型說明第二步:結(jié)構(gòu)體變量定義第三步:結(jié)構(gòu)體變量引用如何轉(zhuǎn)換成C語言描述?結(jié)構(gòu)體類型的基本使用任務(wù)一3、結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型說明的一般格式:struct<結(jié)構(gòu)體類型名> {<類型名1><成員變量名1>;

<類型名2><成員變量名2>;......

<類型名n><成員變量名n>;};結(jié)構(gòu)體類型關(guān)鍵字自定義的結(jié)構(gòu)體類型標(biāo)識(shí)符結(jié)構(gòu)體類型成員列表結(jié)構(gòu)體類型的基本使用任務(wù)一示例:structstudent{ intnum;

/*學(xué)號(hào)為整型*/ charname[20]; /*姓名為字符串*/ charsex;

/*性別為字符型*/ intage; /*年齡為整型*/ floatscore; /*成績(jī)?yōu)閷?shí)型*/};完成下列學(xué)生信息表的結(jié)構(gòu)體定義結(jié)構(gòu)體類型定義描述結(jié)構(gòu)的組織形式,不分配內(nèi)存。結(jié)構(gòu)體類型的基本使用任務(wù)一3、結(jié)構(gòu)體類型的嵌套定義嵌套結(jié)構(gòu)體類型就是一個(gè)結(jié)構(gòu)體類型中包含結(jié)構(gòu)體類型的成員項(xiàng)。一種表示方式:structdate{ intyear;

intmonth;

int

day;

};structstudent{ intnum;

/*學(xué)號(hào)為整型*/ charname[20]; /*姓名為字符串*/ charsex;

/*性別為字符型*/ intage; /*年齡為整型*/

structdatebirthday;/*嵌套date結(jié)構(gòu)體*/ floatscore; /*成績(jī)?yōu)閷?shí)型*/};結(jié)構(gòu)體類型的基本使用任務(wù)一3、結(jié)構(gòu)體類型的嵌套定義另一種表示方式:structstudent{ intnum;

/*學(xué)號(hào)為整型*/ charname[20]; /*姓名為字符串*/ charsex;

/*性別為字符型*/ intage; /*年齡為整型*/

structdate{

intyear;

intmonth;

int

day; }birthday;/*嵌套date結(jié)構(gòu)體*/ floatscore; /*成績(jī)?yōu)閷?shí)型*/};結(jié)構(gòu)體類型的基本使用任務(wù)一4、結(jié)構(gòu)體類型的遞歸定義結(jié)構(gòu)體遞歸定義就是在一個(gè)結(jié)構(gòu)體類型內(nèi)部包含具有自身結(jié)構(gòu)體類型的成員項(xiàng)。structnode{ intdata;

structnode*next;};例如:注意:結(jié)構(gòu)體遞歸定義中必須使用結(jié)構(gòu)體類型的指針成員項(xiàng),不能使用本結(jié)構(gòu)體類型的普通成員項(xiàng)。結(jié)構(gòu)體類型的基本使用任務(wù)一第一種形式:先定義結(jié)構(gòu)體類型,之后定義結(jié)構(gòu)體變量。例如:5、結(jié)構(gòu)體變量的定義structstudent{ intnum;

charname[20];

charsex;

intage;

floatscore;

};structstudent

stu1,stu2;

#defineSTUDENTstructstudentSTUDENT{ intnum;

charname[20];

charsex;

intage;

floatscore;

};

STUDENTstu1,stu2;也可以使用宏定義的方式來定義結(jié)構(gòu)體。宏定義結(jié)構(gòu)體類型的基本使用任務(wù)一第二種形式:在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量。例如:5、結(jié)構(gòu)體變量的定義structstudent{ intnum;

charname[20];

charsex;

intage;

floatscore;

}stu1,stu2;struct{ intnum;

charname[20];

charsex;

intage;

floatscore;

}stu1,stu2;第三種形式:直接定義結(jié)構(gòu)體變量。類型名可以省略。例如:結(jié)構(gòu)體類型的基本使用任務(wù)一類型重命名的一般格式如下:6、typedef類型重命名例如:typedefintINTEGER;

typedeffloatREAL;

例如:INTEGERa,b;等價(jià)inta,b;

REALx,y,z;等價(jià)floatx,y,z;

typedef

structstudent{ intnum;

charname[20];

charsex;

intage;

floatscore;

}STUDENT;

STUDENTstu1,stu2;

等價(jià):structstudentstu1,stu2;typedef類型名別名;typedef除了給簡(jiǎn)單的數(shù)據(jù)類型重命名之外,也可以給復(fù)雜的結(jié)構(gòu)體重命名。結(jié)構(gòu)體類型的基本使用任務(wù)一6、typedef類型重命名structstudent{ intnum;

charname[20];

charsex;

intage;

floatscore;

};

typedefstructstudentSTUDENT;STUDENTstu1,stu2;typedef只是對(duì)已有的類型名增加一個(gè)新的替換名,并不是定義新的類型,也不是取代現(xiàn)有的類型名。技能實(shí)訓(xùn)練一練技能實(shí)訓(xùn)任務(wù)一1.根據(jù)某單位招聘考試結(jié)果信息。利用所學(xué)知識(shí)完成下表中數(shù)據(jù)的結(jié)構(gòu)體定義。編號(hào)姓名筆試成績(jī)面試成績(jī)總成績(jī)1501王虎89921811502李雪87961831503張揚(yáng)8285167unsignednum;charname[10];intexama;intexamb;inttotal;{};structjob_exam編號(hào)姓名筆試成績(jī)面試成績(jī)總成績(jī)1501王虎89921811502李雪87961831503張揚(yáng)8285167某單位招聘考試結(jié)果學(xué)習(xí)總結(jié)答一答1、結(jié)構(gòu)體類型說明的一般格式?2、結(jié)構(gòu)體類型的嵌套定義、結(jié)構(gòu)體類型的遞歸定義?3、結(jié)構(gòu)體變量的定義?4、typedef類型重命名?任務(wù)一結(jié)構(gòu)體類型的基本使用感謝觀看!用戶自定義數(shù)據(jù)類型C語言程序設(shè)計(jì)任務(wù)驅(qū)動(dòng)式教程導(dǎo)學(xué)數(shù)組的元素類型可以是任意類型,只要所有元素的類型相同即可。顯然,數(shù)組元素的類型也可以是結(jié)構(gòu)體類型,這樣的數(shù)組就是結(jié)構(gòu)體數(shù)組。前面定義的結(jié)構(gòu)體變量stu1、stu2描述了兩個(gè)學(xué)生的信息,如果我們想描述80個(gè)學(xué)生的信息,顯然,定義一個(gè)長(zhǎng)度為80的結(jié)構(gòu)體數(shù)組是更合適的選擇。?結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量任務(wù)二當(dāng)數(shù)組數(shù)據(jù)元素的類型為結(jié)構(gòu)體類型時(shí),數(shù)組就是結(jié)構(gòu)體類型的數(shù)組。結(jié)構(gòu)體數(shù)組的每一個(gè)數(shù)據(jù)元素都是具有相同結(jié)構(gòu)體類型的下標(biāo)結(jié)構(gòu)體變量。定義結(jié)構(gòu)體數(shù)組的一般形式為:

struct結(jié)構(gòu)體類型名結(jié)構(gòu)體數(shù)組名[數(shù)組長(zhǎng)度];例:structstudentstu[80];

功能:定義一個(gè)元素類型為“結(jié)構(gòu)體類型名”的結(jié)構(gòu)體數(shù)組,它的長(zhǎng)度是“數(shù)組長(zhǎng)度”。1、結(jié)構(gòu)體數(shù)組(1)結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量任務(wù)二說明:定義后,系統(tǒng)為這個(gè)結(jié)構(gòu)體數(shù)組分配一塊連續(xù)的空間。例如,上面定義的結(jié)構(gòu)體數(shù)組stu內(nèi)存分配情況如圖所示;

stu[0]1101ZhangYuM85.2stu[1]1102WangHuaM90.1stu[2]1103ChenYuanyuanF75.0……………stu[79]1180LiMinLiF82.9(1)結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量任務(wù)二(1)結(jié)構(gòu)體數(shù)組的定義structstudent{intnum;charname[20];charsex;floatscore;};structstudentstu[80];structstudent{intnum;charname[20];

charsex;

floatscore;}stu[80];struct{intnum;charname[20];

charsex;

floatscore;}stu[80];和定義結(jié)構(gòu)體變量一樣,定義結(jié)構(gòu)體數(shù)組也有三種方式,效果均相同。以定義數(shù)組stu[80]為例,三種方式如下:結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量任務(wù)二structstudent{ intnum;

/*學(xué)號(hào)為整型*/ charname[10]; /*姓名為字符串*/ charsex;

/*性別為字符型*/ intage; /*年齡為整型*/ floatscore; /*成績(jī)?yōu)閷?shí)型*/}stu[5];示例:根據(jù)學(xué)生信息表,定義一個(gè)結(jié)構(gòu)體數(shù)組。(1)結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量任務(wù)二(2)結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組初始化的方法與其它類型數(shù)組初始化的方法相同,只是數(shù)組中的每個(gè)元素都是結(jié)構(gòu)體變量。定義數(shù)組的時(shí)候,數(shù)組長(zhǎng)度可以不指定。編譯時(shí),系統(tǒng)根據(jù)給出初值的結(jié)構(gòu)體常量的個(gè)數(shù)來確定數(shù)組元素的個(gè)數(shù)。一個(gè)結(jié)構(gòu)體常量應(yīng)包括結(jié)構(gòu)體中全部成員的值。

在定義結(jié)構(gòu)體數(shù)組時(shí),也可以對(duì)其進(jìn)行初始化賦值,例如:structstudent{intnum;

charname[10];

charsex;

intage;

floatscore;

};structstudentstu[5]={{1201,”Liling”,’W’,21,85},{1202,”Zhangxing”,’M’,21,92.5},{1203,”Zhangfang”,’W’,20,62},{1204,”Chenhui”,’M’,21,78},{1205,”Wangmin”,’W’,19,47},

};對(duì)數(shù)組中全部元素進(jìn)行初始化賦值,數(shù)組長(zhǎng)度是可以省略的。結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量任務(wù)二(3)結(jié)構(gòu)體數(shù)組的引用對(duì)結(jié)構(gòu)體數(shù)組的引用通過逐個(gè)引用數(shù)組元素來實(shí)現(xiàn)。因?yàn)槊總€(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)體變量,所以前述對(duì)結(jié)構(gòu)體變量的引用方法都適用于結(jié)構(gòu)體數(shù)組元素。例如,上例定義的結(jié)構(gòu)體數(shù)組stu[80],可以采用如下形式引用該數(shù)組中元素的任一成員:strcpy(stu[1].name,“ZhangYu”);printf("%d,%s,%c,%.2f",stu[1].num,stu[1].name,stu[1].sex,stu[1].score);sum=sum+stu[i].score;

另外,結(jié)構(gòu)體數(shù)組元素同樣可以整體被賦值。例如,以下語句是合法的:

stu[1]=stu[2];結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量任務(wù)二示例:輸出成績(jī)大于60分的學(xué)生信息及成績(jī)。(3)結(jié)構(gòu)體數(shù)組的引用#include<stdio.h>structstudent{intnum;

charname[10];

charsex;

intage;

floatscore;

}

stu[5]={{1201,"Liling",'W',21,85},{1202,"Zhangxing",'M',21,92.5},{1203,"Zhangfang",'W',20,62},{1204,"Chenhui",'M',21,78},{1205,"Wangmin",'W',19,47}};voidmain(){inti;for(i=0;i<3;i++){if(stu[i].score>60)printf("num=%d,name=%s,sex=%c,age=%d,score=%f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].score);}}結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量任務(wù)二2、結(jié)構(gòu)體指針變量結(jié)構(gòu)體指針變量就是指向結(jié)構(gòu)體變量的指針變量。同其它類型一樣,指針同樣可以指向一個(gè)結(jié)構(gòu)體類型變量,此時(shí),指針變量的值就等于該結(jié)構(gòu)體變量的首地址。指針變量也可以指向結(jié)構(gòu)體數(shù)組中的元素。定義指向結(jié)構(gòu)體變量指針的一般形式為:

struct

結(jié)構(gòu)體名稱*結(jié)構(gòu)體指針變量名稱;

例如:structstudent*pstu.stu;

功能:定義了一個(gè)指向“結(jié)構(gòu)體名稱”的指針,該指針將來用于存儲(chǔ)某一結(jié)構(gòu)體變量的首地址。

結(jié)構(gòu)體指針變量也必須先賦值后使用。賦值就是把結(jié)構(gòu)體變量的首地址賦值給該指針變量,如pstu=&stu。結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量任務(wù)二3、結(jié)構(gòu)體類型的嵌套定義有了結(jié)構(gòu)體指針變量,就能更方便地訪問結(jié)構(gòu)體變量的各個(gè)成員項(xiàng)其訪問成員項(xiàng)的一般形式為:(*指針).成員名或指針->成員名

例如:(*pstu).num或pstu->num需要注意的是(*pstu)兩側(cè)的括號(hào)是不可以少的,因?yàn)槌蓡T運(yùn)算符“.”的優(yōu)先級(jí)高于間接尋址運(yùn)算符“*”。結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量任務(wù)二讀程序3、結(jié)構(gòu)體類型的嵌套定義#include<stdio.h>#include<string.h>voidmain(){structSTU

{charname[10];

intnum;

}b={"LiSiGuo",2042},*a;

a=&b;

strcpy(a->name,"YangSan");

a->num=2012;printf("name=%s\nnum=%d\n",,b.num);printf("name=%s\nnum=%d\n",a->name,a->num);}YangSan2012ab&bnamenum結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量任務(wù)二對(duì)于已定義結(jié)構(gòu)體數(shù)組,若用一個(gè)變量來存放該結(jié)構(gòu)體數(shù)組在內(nèi)存中的首地址,則該變量為指向結(jié)構(gòu)體數(shù)組指針變量。例如:定義結(jié)構(gòu)體類型person和結(jié)構(gòu)體指針變量為p。4、指向結(jié)構(gòu)體數(shù)組的指針structperson{

charname[10];intage;

};

structperson*p,stu[3]={“zhang”,18,”wang”,20,”li”,17};p=stu;或p=&stu[0];

結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量任務(wù)二示例:用指針變量輸出結(jié)構(gòu)體數(shù)組元素。

#include<stdio.h>structstudent{ intnum; charname[20]; charsex; floatscore; }stu[5]={{101,"Zhouping",'M',45},{102,"Zhangping",'M',62.5},{103,"Lioufang",'W',92.5},{104,"Chengling",'M',87},{105,"Wangming",'M',58}};voidmain(){structstudent*ps;printf("No\tName\t\t\tSex\tScore\t\n");for(ps=stu;ps<stu+5;ps++)printf(“%d\t%s\t\t%c\t%f\t\n”,(*ps).num,(*ps).name,(*ps).sex,(*ps).score);}

/*等價(jià)于:

printf(“%d\t%s\t\t%c\t%f\t\n”,ps->num,ps->name,ps->sex,ps->score);}*/技能實(shí)訓(xùn)練一練技能實(shí)訓(xùn)任務(wù)二1.編寫程序:查看下列3個(gè)學(xué)生的信息,包括學(xué)號(hào)、姓名、性別和成績(jī)。技能實(shí)訓(xùn)任務(wù)二

#include<stdio.h>#include<string.h>voidmain(){structstudent{intnum;charname[20];charsex;doublescore; }stu[3]={{1101,"ZhangYu",'M',85.2},{1102,"WangHua",'M',90.1},{1103,"ChenYuanyuan",'F',75.0}},*p;printf("Thestudentsare:\n");printf("No\tName\t\tSex\tScore\t\n");for(p=stu;p<=stu+2;p++)/*使用指針變量p逐個(gè)引用結(jié)構(gòu)體數(shù)組元素*/printf("%-6d%-20s%-2c%9.2f\n",p->num,p->name,p->sex,p->score);}學(xué)習(xí)總結(jié)答一答1、結(jié)構(gòu)體數(shù)組2、結(jié)構(gòu)體指針變量3、指向結(jié)構(gòu)體數(shù)組的指針任務(wù)二結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量感謝觀看!用戶自定義數(shù)據(jù)類型C語言程序設(shè)計(jì)任務(wù)驅(qū)動(dòng)式教程導(dǎo)學(xué)同其它類型數(shù)據(jù)一樣,結(jié)構(gòu)體類型數(shù)據(jù)也可以作函數(shù)參數(shù)。函數(shù)之間結(jié)構(gòu)體類型數(shù)據(jù)的傳遞和其它類型數(shù)據(jù)一樣,是單向的“值傳遞”方式。同樣,指向結(jié)構(gòu)體類型數(shù)據(jù)的指針也可以作函數(shù)參數(shù),這時(shí),被調(diào)用函數(shù)對(duì)數(shù)據(jù)的修改可以體現(xiàn)在調(diào)用函數(shù)中。?結(jié)構(gòu)體與函數(shù)任務(wù)三函數(shù)的返回值除了可以是基本數(shù)據(jù)類型的數(shù)據(jù)外,還可以是結(jié)構(gòu)體類型的數(shù)據(jù),若函數(shù)返回值的類型是結(jié)構(gòu)體類型則稱該函數(shù)為結(jié)構(gòu)體類型函數(shù)。其一般定義形式:1、結(jié)構(gòu)體類型的函數(shù)struct結(jié)構(gòu)體類型名函數(shù)名(形參列表){

函數(shù)體}

其中,結(jié)構(gòu)體類型必須是已定義的。結(jié)構(gòu)體與函數(shù)任務(wù)三2、定義一個(gè)函數(shù),利用循環(huán)執(zhí)行3門課程的輸入、分別存放到結(jié)構(gòu)體成員項(xiàng)的score數(shù)組中,最后計(jì)算出average的值;3、輸入3個(gè)同學(xué)的其他成員項(xiàng)的值,其實(shí)也就是給學(xué)生姓名成員項(xiàng)輸入值;4、利用循環(huán)輸出3個(gè)同學(xué)的姓名和平均成績(jī)。示例:每個(gè)學(xué)生有3門課成績(jī),用函數(shù)輸入學(xué)生的成績(jī),并求出每個(gè)學(xué)生的平均成績(jī)。structstudent{charname[10]; floatscore[3];

floataverage;};問題分析:1、要定義一個(gè)學(xué)生結(jié)構(gòu)體類型:結(jié)構(gòu)體與函數(shù)任務(wù)三示例:每個(gè)學(xué)生有3門課成績(jī),用函數(shù)輸入學(xué)生的成績(jī),并求出每個(gè)學(xué)生的平均成績(jī)。#include<stdio.h>structstudent{charname[10]; floatscore[3];floataverage;};structstudentinput(){structstudents;inti;floatsum=0;printf("enter3score:");for(i=0;i<3;i++){scanf("%f",&s.score[i]);sum=sum+s.score[i];}s.average=sum/3;returns;}voidmain(){structstudentstu[3];inti;for(i=0;i<3;i++){stu[i]=input();printf("entername:");scanf("%s",stu[i].name);}for(i=0;i<3;i++)printf("%10s%10.1f\n",stu[i].name,stu[i].average);}結(jié)構(gòu)體與函數(shù)任務(wù)三2、結(jié)構(gòu)體變量作函數(shù)參數(shù)#include<stdio.h>structstudent{intnum;char*name; charsex;floatscore;};voidmain(){structstudentstu1={1011,"zhangping",'M',41};voidprint(structstudentb);print(stu1);printf("num=%d\nname=%s\nsex=%c\nscore=%f\n",stu1.num,,stu1.sex,stu1.score);}voidprint(structstudentb){printf("num=%d\nname=%s\nsex=%c\nscore=%f\n",b.num,,b.sex,b.score);}結(jié)構(gòu)體變量作函數(shù)參數(shù)進(jìn)行整體傳送。讀程序,給出程序運(yùn)行結(jié)果。結(jié)構(gòu)體與函數(shù)任務(wù)三2、結(jié)構(gòu)體變量作函數(shù)參數(shù)在C語言中允許用結(jié)構(gòu)體變量作函數(shù)參數(shù)進(jìn)行整體傳送。但是這種傳送要將全部成員逐個(gè)傳送,特別是成員為數(shù)組時(shí)將會(huì)使得傳送的時(shí)間和空間開銷很大,嚴(yán)重地降低了程序的效率。因此最好的辦法就是使用指針,即用指針變量作函數(shù)參數(shù)進(jìn)行傳送。這時(shí)由實(shí)參傳向形參的只是地址,從而減少了時(shí)間和空間的開銷。結(jié)構(gòu)體與函數(shù)任務(wù)三示例:計(jì)算一組學(xué)生的平均成績(jī)和不及格人數(shù)。3、結(jié)構(gòu)體指針變量作函數(shù)參數(shù)#include<stdio.h>structstudent{intnum; char*name; charsex; floatscore; }stu[5]={{1011,"Liling",'M',41},{1012,"Zhangxing",'W',68},{1013,"Zhangfang",'W',97},{1014,"Chenhui",'W',83},{1015,"Wangmin",'M',78}};voidmain(){structstudent*ps;voidave(structstudent*ps);ps=stu;ave(ps);}voidave(structstudent*ps){intc=0,i;floatave,s=0;for(i=0;i<5;i++,ps++){s+=ps->score;if(ps->score<60)c+=1;}printf("s=%f\n",s);ave=s/5;printf("average=%f\ncount=%d\n",ave,c);}技能實(shí)訓(xùn)練一練技能實(shí)訓(xùn)任務(wù)三1.查看3個(gè)學(xué)生的信息,包括學(xué)號(hào)、姓名、性別和成績(jī)。要求調(diào)用子函數(shù)display()實(shí)現(xiàn)顯示功能,用指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)。請(qǐng)參照下面的運(yùn)行結(jié)果編寫程序:#include<stdio.h>structstudent{intnum;charname[20];charsex;floatscore;};display(structstudent*s)/*指向結(jié)構(gòu)體變量的指針做形參*/{structstudent*p;for(p=s;p<=s+2;p++)printf("%-6d,%-20s,%-2c,%-6.2f\n",p->num,p->name,p->sex,p->score);}voidmain(){structstudentstu[3]={{1101,"ZhangYu",'M',85.2},{1102,"WangHua",'M',90.1},{1103,"ChenYuanyuan",'F',75.0}};display(stu);/*結(jié)構(gòu)體數(shù)組名做實(shí)參*/}學(xué)習(xí)總結(jié)答一答1、結(jié)構(gòu)體類型的函數(shù)的一般定義形式。2、結(jié)構(gòu)體變量作函數(shù)參數(shù)3、結(jié)構(gòu)體指針變量作函數(shù)參數(shù)任務(wù)三用字符指針引用字符串感謝觀看!用戶自定義數(shù)據(jù)類型C語言程序設(shè)計(jì)任務(wù)驅(qū)動(dòng)式教程導(dǎo)學(xué)為什么要分配動(dòng)態(tài)內(nèi)存?數(shù)組的長(zhǎng)度固定不變。所需的內(nèi)存空間取決于實(shí)際輸入的數(shù)據(jù)多少。?單鏈表的建立任務(wù)四(1)分配內(nèi)存空間函數(shù)malloc()調(diào)用形式:(類型說明符*)(size)類型說明符:表示把該區(qū)域用于何種類型。(類型說明符*):表示把返回值強(qiáng)制轉(zhuǎn)換為類型說明符的指針。size:是一個(gè)無符號(hào)整數(shù)。功能:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一塊長(zhǎng)度為“size”字節(jié)的連續(xù)區(qū)域。函數(shù)返回值為該區(qū)域的首地址。例如:pc=(char*)malloc(100);//表示分配100個(gè)字節(jié)的內(nèi)存空間,并強(qiáng)制轉(zhuǎn)換為指向字符數(shù)組的指針類型,并且把該指針賦值給指針變量pc.1、動(dòng)態(tài)內(nèi)存分配和釋放單鏈表的建立任務(wù)四(2)分配內(nèi)存空間函數(shù)calloc()調(diào)用形式:(類型說明符*)calloc(n,size)功能:在內(nèi)存動(dòng)態(tài)存儲(chǔ)區(qū)中分配n塊長(zhǎng)度為“size”字節(jié)的連續(xù)區(qū)域。函數(shù)返回值為該區(qū)域的首地址。(類型說明符*):表示把返回值強(qiáng)制轉(zhuǎn)換為類型說明符的指針。calloc(n,size):表示在內(nèi)存動(dòng)態(tài)存儲(chǔ)區(qū)中分配n塊長(zhǎng)度為“size”字節(jié)的連續(xù)區(qū)域。例如:ps=(structstu*)

calloc(2,sizeof(structstu));/*sizeof(structstu):是用來求stu結(jié)構(gòu)體的長(zhǎng)度。整個(gè)語句的意思是按照stu的長(zhǎng)度分配2塊連續(xù)的區(qū)域,并且強(qiáng)制轉(zhuǎn)換為指向stu類型的指針類型,并把其首地址賦值給指針變量ps*/單鏈表的建立任務(wù)四(3)釋放內(nèi)存空間函數(shù)free()調(diào)用形式:free(void*ptr);功能:釋放ptr所指向的一塊內(nèi)存空間,pir是一個(gè)任意類型的指針變量,它指向被釋放區(qū)域的首地址。單鏈表的建立任務(wù)四示例:分配一塊區(qū)域,輸入一個(gè)學(xué)生數(shù)據(jù)并輸出。#include<string.h>#include<stdlib.h>#include<stdio.h>voidmain(){structstudent{intnum;char*name; charsex;floatscore;}*ps;1、動(dòng)態(tài)內(nèi)存分配和釋放ps=(structstudent*)malloc(sizeof(structstudent));if(ps!=NULL){ps->num=102;strcpy(ps->name,"zhangping");ps->sex='M';ps->score=62.5;printf("number=%d\nname=%s\n",ps->num,ps->name);printf("sex=%c\nscore=%f\n",ps->sex,ps->score);free(ps);}}單鏈表的建立任務(wù)四2、單鏈表的建立數(shù)組屬于靜態(tài)內(nèi)存分配,特點(diǎn)是邏輯關(guān)系上相鄰的兩個(gè)元素在物理存儲(chǔ)位置上也相鄰;優(yōu)點(diǎn):可以隨機(jī)存取表中任一元素,方便快捷;缺點(diǎn):在插入或刪除某一元素時(shí),需要移動(dòng)大量元素。解決問題的思路:利用動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),它主要利用動(dòng)態(tài)內(nèi)存分配,使用結(jié)構(gòu)體和指針來實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)。也就是我們?cè)诮Y(jié)構(gòu)體定義中學(xué)習(xí)的結(jié)構(gòu)體的遞歸定義。單鏈表的建立任務(wù)四(1)單鏈表特點(diǎn)結(jié)點(diǎn)在存儲(chǔ)器中的位置是隨意的,即邏輯上相鄰的數(shù)據(jù)元素在物理上不一定相鄰。如何實(shí)現(xiàn)?通過指針來實(shí)現(xiàn)!每個(gè)結(jié)點(diǎn)至少包含兩部分:數(shù)據(jù)域和指針域2、單鏈表的建立單鏈表的建立任務(wù)四(1)單鏈表特點(diǎn)結(jié)點(diǎn):數(shù)據(jù)元素的存儲(chǔ)表示。由數(shù)據(jù)域和指針域兩部分組成;2、單鏈表的建立數(shù)據(jù)指針指針數(shù)據(jù)指針樣式:或數(shù)據(jù)域:存儲(chǔ)元素?cái)?shù)據(jù)。指針域:存儲(chǔ)直接后繼或者直接前驅(qū)的存儲(chǔ)位置。單鏈表的建立任務(wù)四單鏈表存放示意圖如下:2、單鏈表的建立heada1a2……an∧頭指針首結(jié)點(diǎn)內(nèi)部結(jié)點(diǎn)末尾結(jié)點(diǎn)nextdata單鏈表的建立任務(wù)四頭指針是指向鏈表中首結(jié)點(diǎn)的指針;首結(jié)點(diǎn)是指鏈表中的第一個(gè)數(shù)據(jù)元素a1的結(jié)點(diǎn)。內(nèi)部結(jié)點(diǎn)是指首元結(jié)點(diǎn)之后,末尾結(jié)點(diǎn)之前的所以結(jié)點(diǎn)。尾結(jié)點(diǎn)是指鏈表的最后一個(gè)結(jié)點(diǎn)。2、單鏈表的建立單鏈表的建立任務(wù)四例如:類型定義為:typedefstructnodel{chardata;

structnodel*next;

}node,*pointer;2、單鏈表的建立單鏈表的建立任務(wù)四2、單鏈表的建立例如:用單鏈表結(jié)構(gòu)來存放26個(gè)英文字母組成的線性表(a,b,c,……,z),請(qǐng)寫出c語言程序。實(shí)現(xiàn)思路:先開辟頭指針,然后陸續(xù)為每個(gè)結(jié)點(diǎn)開辟存儲(chǔ)空間并及時(shí)賦值,后繼結(jié)點(diǎn)的地址要提前送給前面的指針。

#include<string.h>#include<stdlib.h>#include<stdio.h>typedefstructnode{chardata;structnode*next;}node;node*p,*head;intn;voidbuild(){inti;head=(node*)malloc(sizeof(node));p=head;for(i=1;i<26;i++){p->data=i+'a'-1;p->next=(node*)malloc(sizeof(node));p=p->next;}p->data=i+'a'-1;p->next=NULL;}voiddisplay(){p=head;while(p){printf("%c",p->data);p=p->next;}}voidmain(){build();display();}學(xué)習(xí)總結(jié)答一答1、動(dòng)態(tài)內(nèi)存分配和釋放?2、單鏈表的建立?任務(wù)四單鏈表的建立感謝觀看!用戶自定義數(shù)據(jù)類型C語言程序設(shè)計(jì)任務(wù)驅(qū)動(dòng)式教程導(dǎo)學(xué)單鏈表有哪些基本操作呢??單鏈表的基本操作任務(wù)五

在單鏈表中進(jìn)行查找操作,就是根據(jù)給定的關(guān)鍵字的值,從頭指針?biāo)赶虻慕Y(jié)點(diǎn)開始,找結(jié)點(diǎn)的值和給定的關(guān)鍵字值是否相等,如果相等則查找成功,否則繼續(xù)判斷下一結(jié)點(diǎn)是否相等,重復(fù)以上操作,直到鏈表結(jié)束,查找失敗。

structnode

{chardata;

structnode*next;

};1、單鏈表的查找單鏈表的基本操作任務(wù)五1、單鏈表的查找wP!=NULL&&p->data!=x

p=p->next;xP=h;habwz∧phabwz∧p

頭指針單鏈表的基本操作任務(wù)五p=q->next;//首先保存b的指針,靠它才能找到c;q->next=p->next;//將a,c兩結(jié)點(diǎn)相連,淘汰b結(jié)點(diǎn);free(p);//徹底釋放b結(jié)點(diǎn)空間2、單鏈表的刪除在單鏈表中刪除某元素b的示意圖如下:abwppq->next

q->next->nextp->next;刪除動(dòng)作的核心語句(要借助輔助指針變量p):單鏈表的基本操作任務(wù)五

del(structnode*h,charx){structnode*p,*q;

if(h==NULL)

{printf("Listisnull.\n");

return0;}

q=h;

p=h->next;

while(p!=NULL&&x!=p->data)

{q=p;p=p->next;}

if(p!=NLILL)

{q->next=p->next;free(p);

return1;}

elsereturn0;}單鏈表的基本操作任務(wù)五3、單鏈表的插入在單鏈表中插入一個(gè)元素X=b的示意圖如下:acppq->next

s->nextacppbs插入x單鏈表插入的核心語句:

step1:s->next=p;

step2:q->next=s;單鏈表的基本操作任務(wù)五insert(structnode*h,char

x){structnode*p,*q,*s;s=(structnode*)malloc(sizeof(structnode));s->data=x;

q=h;

p=h->next;while(p!=NULL&&x>p->data)

{q=p;

p=p->next;}s->next=p;q->next=s;}學(xué)習(xí)總結(jié)答一答1、單鏈表的查找?2、單鏈表的插入?3、單鏈表的刪除?任務(wù)五單鏈表的基本操作感謝觀看!用戶自定義數(shù)據(jù)類型C語言程序設(shè)計(jì)任務(wù)驅(qū)動(dòng)式教程導(dǎo)學(xué)什么是共用體類型??共用體和枚舉類型任務(wù)六在“共用體”中,各成員共享一段內(nèi)存空間,一個(gè)共用體變量的長(zhǎng)度等于各成員中最長(zhǎng)的長(zhǎng)度。共用體變量可被賦予任一成員值,但每次只能賦一種值。共用體類型的定義和共用體變量的說明一個(gè)共用體類型必須過定義之后,才能把變量說明為該共用體類型。共用體類型是一種特殊的構(gòu)造類型,它的最大特點(diǎn)是所有成員共享同一存儲(chǔ)單元。1、共用體類型與結(jié)構(gòu)體類型的區(qū)別共用體和枚舉類型任務(wù)六2、共用體類型與共用體變量(1)共用體類型的定義一般形式:union共用體類型名{類型名成員項(xiàng)1名稱;類型名成員項(xiàng)2名稱;類型名成員項(xiàng)3名稱;……};例如:

uniondata

{shorti;

charch;

floatf;

};ichf注:sizeof(uniondata)取決于占空間最多的那個(gè)成員變量。共用體和枚舉類型任務(wù)六1、共用體類型與共用體變量(2)

共用體類型變量定義的三種方式。

先定義共用體類型,再定義共用體類型變量。

例如:

uniondata

{shorti;

charch;

floatf;

};共用體和枚舉類型任務(wù)六1、共用體類型與共用體變量(2)共用體類型變量定義的三種方式。

在定義共用體類型的同時(shí)定義共用體類型變量。例如:uniondata

{shorti;

charch;

floatf;

}a,b,c;共用體和枚舉類型任務(wù)六1、共用體類型與共用體變量(2)共用體類型變量定義的三種方式。

在定義共用體類型時(shí),省略共用體類型名,同時(shí)定義共用體類型變量。例如:union

{shorti;

charch;

floatf;

}a,b,c;共用體和枚舉類型任務(wù)六1、共用體類型與共用體變量(3)共用體變量的引用

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論