C語言程序設(shè)計(jì)基礎(chǔ)課件 第11章自定義類型_第1頁
C語言程序設(shè)計(jì)基礎(chǔ)課件 第11章自定義類型_第2頁
C語言程序設(shè)計(jì)基礎(chǔ)課件 第11章自定義類型_第3頁
C語言程序設(shè)計(jì)基礎(chǔ)課件 第11章自定義類型_第4頁
C語言程序設(shè)計(jì)基礎(chǔ)課件 第11章自定義類型_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計(jì)

第11章自定義類型2num:num[0]num[1]num[2]num[3]num[4]10011002100310041005sex:sex[0]sex[1]sex[2]sex[3]sex[4]'M''F''M''F''F'score:score[0]score[1]score[2]score[3]score[4]85.090.092.070.079.00'Z''h''a''o''\0''\0''\0''\0''\0''\0'1'Q''i''a''n''\0''\0''\0''\0''\0''\0'2'S''u''n''\0''\0''\0''\0''\0''\0''\0'3'L''i''\0''\0''\0''\0''\0''\0''\0''\0'4'Z''h''o''u''\0''\0''\0''\0''\0''\0'name:管理學(xué)生成績constintN=5;intnum[N]; //學(xué)號(hào)charname[N][10]; //姓名charsex[N]; //性別floatscore[N]; //分?jǐn)?shù)不同信息分散在不同變量,不便操作,且容易出錯(cuò)。概述?能否用一個(gè)變量來保存一個(gè)學(xué)生的學(xué)號(hào)、姓名、性別、分?jǐn)?shù)的所有信息呢?結(jié)構(gòu)體自定義類型——結(jié)構(gòu)體intfloatdoublechar自定義類型允許自己設(shè)計(jì)新的數(shù)據(jù)類型,定義了新類型后,就能用新類型定義變量。structstu{

intnum;

charname[10];

charsex;

floatscore;};定義一種自定義數(shù)據(jù)類型類型沒有內(nèi)存空間,不能保存數(shù)據(jù)structstuboy1;intfloatdoublecharstructstu

這是一個(gè)變量不是定義變量!不是定義變量,而是設(shè)計(jì)成員(各成員的類型可以不同)定義新類型的變量,開辟內(nèi)存空間numnamesexscoreboy1:stuboy1;使用結(jié)構(gòu)體變量structstu{

intnum;

charname[10];

charsex;

floatscore;};structstuboy1;numnamesexscoreboy1:boy1=1001;scanf(%d",&boy1);printf("%d",boy1);boy1.num=1001;boy1.sex='M';boy1.score=85.0;="Zhao";strcpy(,"Zhao");printf("%d\n",boy1.num);printf("%f\n",boy1.score);printf("%s\n",);printf("%c\n",[1]);結(jié)構(gòu)體變量名.成員名numnamesexscore1001numnamesexscore1001'M'numnamesexscore1001'M'85.0name是數(shù)組名,是假想的指針變量,值不能改1001

100185.000000

100185.000000zhao100185.000000zhaoh?????\0oahz結(jié)構(gòu)體類型和結(jié)構(gòu)體變量的區(qū)別結(jié)構(gòu)體類型boy1:numnamesexscorestructstu{

intnum;

charname[10];

charsex;

floatscore;};boy2:numnamesexscoreprintf("%d",sizeof(boy1));printf("%d",sizeof(boy2));printf("%d",sizeof(structstu));printf("%d",sizeof(stu));202020特殊地,sizeof對類型和變量均可使用stu.num=1001;printf("%f",stu.score);boy1.num=1001;printf("%f",boy2.score);結(jié)構(gòu)體類型的變量產(chǎn)品有內(nèi)存空間,可以保存數(shù)據(jù)類型叫structstu,不叫stustructstu{

intnum;

charname[10];

charsex;

floatscore;};圖紙不占內(nèi)存,不能保存數(shù)據(jù)先定義類型,然后才能定義變量結(jié)構(gòu)體類型變量的定義方式①先定義類型,再定義變量structstu{

intnum;

charname[10];

charsex;

floatscore;};structstuboy1,boy2;structstu{

intnum;

charname[10];

charsex;

floatscore;}boy1,boy2;②定義類型的同時(shí),定義變量③定義類型的同時(shí)定義變量,但省略類型名

struct{

intnum;

charname[10];

charsex;

floatscore;}boy1,boy2;structstuboy3;無法再定義其他變量如boy3,因類型無名結(jié)構(gòu)體類型變量的初始化在定義結(jié)構(gòu)體變量時(shí)也可對結(jié)構(gòu)體變量賦初值,方法是將各成員的值按類型定義時(shí)的各成員順序,依次放在一對{}內(nèi)。structstuboy2,boy1={1001,"zhao",'M',85.0};numnamesexscoreboy1:numnamesexscore1001numnamesexscorenumnamesexscore1001'M'85.0boy2:scoresexnamenum??????????????????\0oahzstructstu{

intnum;

charname[10];

charsex;

floatscore;};結(jié)構(gòu)體變量之間的賦值structstu{

intnum;

charname[10];

charsex;

floatscore;};numnamesexscoreboy1:numnamesexscore1001numnamesexscore1001'M'numnamesexscore1001'M'85.0?????\0oahzboy2=boy1;可以整體賦值:所有成員一次性全部賦值,因?yàn)槭?個(gè)變量boy2:scoresexnamenum?????????????85.0'M'1001?????\0oahz結(jié)構(gòu)體類型的數(shù)組數(shù)組的元素也可以是結(jié)構(gòu)體類型的,稱為結(jié)構(gòu)體數(shù)組。每個(gè)元素都是相同結(jié)構(gòu)體類型的變量。一本通訊錄,每一頁是一個(gè)結(jié)構(gòu)體變量,一本就是一個(gè)結(jié)構(gòu)體數(shù)組。structstuss[3];ss:numnamesexscore????numnamesexscore????numnamesexscore????ss[0]ss[1]ss[2]ss[0].num=1001;strcpy(ss[1].name,"Qian");ss[2].score=92.0;1001Qian\092.0結(jié)構(gòu)指針變量一個(gè)指針變量當(dāng)用來指向一個(gè)結(jié)構(gòu)體類型的變量時(shí),稱結(jié)構(gòu)指針變量。structstuboy1;structstu*p;p=&boy1;p=&stu;stu是類型,不是變量,沒有內(nèi)存空間,更無地址p=&boy1.num;boy1.num是int,p基類型是stu不是int,不能指向int

若:int*q;

q=&boy1.num;正確1000p:[]2000numnamesexscoreboy1:p:[1000]2000通過結(jié)構(gòu)指針變量訪問結(jié)構(gòu)體變量p->num=1001;boy1.num=1001;strcpy(p->name,"Zhang");strcpy(boy1.name,"Zhang");(*p).score=92.0;boy1.score=92.0;結(jié)構(gòu)體變量用

.結(jié)構(gòu)體指針變量用->(*結(jié)構(gòu)體指針變量)

.*p.score.

和->

的優(yōu)先級(jí)都最高(與()相當(dāng)),這相當(dāng)于*92.0,故錯(cuò)誤1000numnamesexscoreboy1:p:[1000]2000structstuboy1;structstu*p;p=&boy1;一個(gè)指針變量當(dāng)用來指向一個(gè)結(jié)構(gòu)體類型的變量時(shí),稱結(jié)構(gòu)指針變量。100192.0\0????gnahz結(jié)構(gòu)體指針指向結(jié)構(gòu)體數(shù)組結(jié)構(gòu)指針變量也可以指向一個(gè)結(jié)構(gòu)體數(shù)組。ps+1或ps-1會(huì)移動(dòng)一個(gè)元素(一個(gè)“結(jié)構(gòu)體變量”)所占字節(jié)數(shù),與普通數(shù)組的一致。structstux[3];structstu*ps=x;ps++;100010201040x:numnameage1Zhang\020numnameage2Wang\019numnameage3Zhao\018x[0]x[1]x[2]x:[1000]1000

ps:[1000]2000

[1020]

ps++;[1040]

x+2的值為:1040結(jié)構(gòu)體類型數(shù)據(jù)做函數(shù)參數(shù)1)重口味:結(jié)構(gòu)體類型變量作函數(shù)參數(shù)fun(structstua){…}2)輕口味:結(jié)構(gòu)體指針作函數(shù)參數(shù)fun(structstu*p){…}全部成員整體傳送fun的空間main的空間numnamesexscore1001Zhao\0'M'85.0numnamesexscore1001Zhao\0'M'85.0形參:實(shí)參:fun的空間main的空間numnamesexscore1001Zhao\0'M'85.0形參:實(shí)參:[1000]20001000只傳送一個(gè)地址(4字節(jié))時(shí)間和空間開銷都很大;但在函數(shù)中如果改變了形參的某個(gè)成員的值,不影響實(shí)參。無論成員多少,只傳4字節(jié),提高了效率;但在函數(shù)中如果改變了形參所存地址所對應(yīng)空間的值,實(shí)參變量的值就被改變。結(jié)構(gòu)體變量作函數(shù)參數(shù)fun的空間

main的空間numnamesexscore1003Sun\0'M'92.0s:numnamesexscore1003Sun\0'M'92.0t:1003SunM921003SunM921003SunM92102Zhang\0'F'90.0#include<string.h>structperson{ intnum;

charname[10];

charsex;

floatscore;};voidfun(structpersont)//傳遞變量{ t.num=102; strcpy(,"Zhang"); t.sex='F'; t.score=90;}main(){ structpersons={101,"Li",'M',75};

printf("(1)S:%d%s%c%f\n", s.num,,s.sex,s.score); fun(s);

printf("(2)S:%d%s%c%f\n", s.num,,s.sex,s.score);}結(jié)構(gòu)體指針作函數(shù)參數(shù)#include<string.h>structperson{ intnum;

charname[10];

charsex;

floatscore;};voidfun(structperson*ps)/*傳遞指針*/{ ps->num=102; strcpy(ps->name,"Zhang");

ps->sex='F';ps->score=90;}main(){ structpersons={101,"Li",'M',75};

printf("(1)S:%d%s%c%f\n", s.num,,s.sex,s.score);

fun(&s);

printf("(2)S:%d%s%c%f\n", s.num,,s.sex,s.score);}main的空間

numnamesexscore101Li\0'M'75.0s:fun的空間

ps:[1000]20001000102Zhang\0'F'90.0(1)S:101LiM75.000000(1)S:101LiM75.000000(2)S:102ZhangF90.000000#include<stdio.h>#include<string.h>structA{inta;charb[10];doublec;};structAf(structAt);main(){structAa={1001,"Zhang",1098.0};a=f(a);printf("%d,%s,%6.1f\n",a.a,a.b,a.c);}structAf(structAt){t.a=1002;strcpy(t.b,"Chang");t.c=1202.0;returnt;}main的空間

F1的空間

結(jié)構(gòu)體類型的變量作為返回值a:abc10011098.01000Zhang\0\0\0\0\0t:abc10011098.02000Zhang\0\0\0\0\01002,Chang,1202.01002Chang\01202.010021202.0Chang\0\0\0\0\01002Chang\01202.0structstu{ intnum;

charname[10];

charsex;

struct { intyear; intmonth; intday; }birthday;

floatscore;};structstu{ intnum;

charname[10];

charsex;

structdate { intyear; intmonth; intday; }birthday;

floatscore;};結(jié)構(gòu)體類型的嵌套structdate{ intyear; intmonth; intday;};structstu{ intnum; charname[10];

charsex; structdatebirthday;

floatscore;};可省略“日期”結(jié)構(gòu)體名date或:structstua,*p=&a;a.birthday.year=2002;p->birthday.month=12;(*p).birthday.day=21;numnamesexbirthdayscoreyearmonthdaya:p:[1000]2000100020022112類型定義符typedef類型定義語句typedeftypedef為類型起“綽號(hào)”typedefint

INTEGER;這以后就可用INTEGER來代替int作類型說明了INTEGERa,b;inta,b;typedef

某類型“變量”定義形式;并不產(chǎn)生新的數(shù)據(jù)類型,只是給已有的類型增加新名;“變量”相當(dāng)?shù)奈恢脼樾骂愋兔?。typedefdouble

real;reala,b;doublea,b;typedefint*

INTPTR;INTPTRp;int*p;typedefunsignedlongUINT32;UINT32x,y;unsignedlongx,y;這以后就可用real來代替double作類型說明了這以后就可用INTPTR來代替int*作類型說明了

這以后就可用UINT32來代替unsignedlong作類型說明了用typedef為結(jié)構(gòu)體類型起別名typedefstructstu{intnum;charname[10];charsex;floatscore;}

ST;ST

boy1,boy2;structstugirl1,girl2;ST

boy1,boy2;STgirl1,girl2;動(dòng)態(tài)存儲(chǔ)分配C語言常用內(nèi)存管理庫函數(shù)(包含stdlib.h)

函數(shù)功能用法malloc分配1塊長度為size字節(jié)的連續(xù)內(nèi)存空間(不清零),函數(shù)返回該空間的首地址;如分配失敗函數(shù)返回0(類型說明符*)malloc(size)calloc分配n塊、每塊長度為size字節(jié)的連續(xù)內(nèi)存空間(共size×n字節(jié)),并將該空間中的內(nèi)容全部清零,函數(shù)返回該空間的首地址;如分配失敗函數(shù)返回0(類型說明符*)calloc(n,size)free釋放ptr所指向的一塊內(nèi)存空間,ptr是由malloc或calloc函數(shù)所分配空間的地址,即是這兩個(gè)函數(shù)的返回值(或類型轉(zhuǎn)換后的返回值)free(ptr)(ptr為任意基類型的指針)動(dòng)態(tài)存儲(chǔ)分配例float*q,*r;char*pc;structstudent*ps;q=(float

*)malloc(4);

/*分配4字節(jié)的空間,用于保存float型數(shù)據(jù)*/pc=(char

*)malloc(100);

/*分配100字節(jié)的空間,用于保存char型數(shù)組*/r=(float

*)calloc(5,4); /*分配5塊每塊4字節(jié)的空間,共20字節(jié)

用于保存含5個(gè)元素的float型數(shù)組*/ps=(structstudent*)calloc(10,

sizeof(structstudent)); /*分配10塊每塊為一個(gè)structstudent類型數(shù)據(jù)大小的空間,用于保存10個(gè)元素的structstudent型數(shù)組*/練習(xí)#include<stdio.h>#include<string.h>#include<stdlib.h>main(){ char*p;inti; p=(char*)malloc(sizeof(char)*20);

strcpy(p,"welcome");

for(i=6;i>=0;i--) putchar(*(p+i)); printf("\n");

free(p);}1000...'w''e''l''c''o''m''\0''e'p:[1000]2000

100610071001eememoemoclew鏈表鏈表18[0]200019[4000]500015[]400012[2000]1000datanextdatanextdatanext1000

datanext鏈表各元素的邏輯結(jié)構(gòu)與存儲(chǔ)結(jié)構(gòu)一般不一致。以鏈接方式存儲(chǔ)的線性表structnode{ intdata;

structnode*next;};datanextX[5000]頭結(jié)點(diǎn)一般增加頭結(jié)點(diǎn)以方便編程3000鏈表處理編程套路鏈表處理編程套路(設(shè)結(jié)點(diǎn)結(jié)構(gòu)體類型別名為SNODE,成員為data和next;頭結(jié)點(diǎn)指針為h):

SNODE*p;

/*有時(shí)類型別名為:NODE、SLIST、STYPE等,視題目而定*/

p=h->next;while(p) /*或?qū)憺椋簑hile(p!=0)注意不是

while(*p)*/{

處理p->data;/*有時(shí)數(shù)據(jù)成員名為:s,視題目而定*/ p=p->next; }鏈表的遍歷/*依次輸出鏈表中的數(shù)據(jù),h是頭結(jié)點(diǎn)的地址*/voidoutlist(SNODE*h){ SNODE*p; p=h->next;

while(p) /*也可寫為while(p!=0)*/ { printf("%d",p->data); p=p->next; }}main(){ inta[N]={19,15,12,18,11};

SNODE*head;/*head保存頭結(jié)點(diǎn)的地址*/ head=createlist(a); /*建立鏈表*/ outlist(head); /*輸出鏈表*/ destroylist(head); /*銷毀鏈表*/}習(xí)題請編寫函數(shù)sumlist,其原型如下:intsumlist(SNODE*h)函數(shù)的功能是求上例建立的鏈表中各結(jié)點(diǎn)數(shù)據(jù)域之和,并由函數(shù)返回,形參h指向鏈表的頭結(jié)點(diǎn)。使main函數(shù)對此函數(shù)的調(diào)用為printf("%d",sumlist(head));則能輸出和。

intsumlist(SNODE*h){ SNODE*p;ints=0; p=h->next;

while(p) { s+=p->data; p=p->next; }

returns;}習(xí)題2請編寫函數(shù)maxlist,其原型如下:intmaxlist(SNODE*h)函數(shù)的功能是求上例建立的鏈表中各結(jié)點(diǎn)數(shù)據(jù)域中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論