C-C++語言程序設(shè)計基礎(chǔ)-第9章-課件1_第1頁
C-C++語言程序設(shè)計基礎(chǔ)-第9章-課件1_第2頁
C-C++語言程序設(shè)計基礎(chǔ)-第9章-課件1_第3頁
C-C++語言程序設(shè)計基礎(chǔ)-第9章-課件1_第4頁
C-C++語言程序設(shè)計基礎(chǔ)-第9章-課件1_第5頁
已閱讀5頁,還剩145頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第9章構(gòu)造數(shù)據(jù)類型9.1結(jié)構(gòu)體9.2共用體9.3枚舉9.4自定義數(shù)據(jù)類型第9章構(gòu)造數(shù)據(jù)類型9.19.1結(jié)構(gòu)體9.1.1結(jié)構(gòu)體的定義 9.1.2結(jié)構(gòu)體變量說明 9.1.3結(jié)構(gòu)體變量的引用9.1.4結(jié)構(gòu)體數(shù)組 9.1.5結(jié)構(gòu)體與函數(shù)9.1.6指向結(jié)構(gòu)體變量的指針 9.1.7動態(tài)存儲分配 9.1.8結(jié)構(gòu)體與鏈表 9.1.1結(jié)構(gòu)體的定義 9.1結(jié)構(gòu)體概述

在前面章節(jié)所見到的程序中,大多數(shù)的數(shù)據(jù)都是獨立的,沒有內(nèi)在聯(lián)系的 。比如:int

a,b;floatc,d;charname[20];但在實際生活和工作中,很多不同類型的數(shù)據(jù)是存在內(nèi)在聯(lián)系的。比如學生基本信息。9.1結(jié)構(gòu)體概述 在前面章節(jié)所見到的程序中,大多數(shù)學號num姓名name性別sex年齡age成績score家庭住址addr1001LiXiaoM1989.0hunan1002JinF1890.0beijing1003FengF1960.5guangxi1004RongM1874.5qinghai提問:輸出分數(shù)最高的學生的成績?學號姓名性別年齡成績家庭住址1001LiXiaoM1989.main(){inti,num,age;floatscore;charsex,name[20],addr[30];intmax=0;for(i=1;i<=4;i++){scanf(“%d%d%f”,&num,&age,&score);scanf(“%c”,&sex);gets(name);gets(addr);if(max<score)max=score;}printf(“%f\n”,max);}main()缺點:1.變量過多,同一學生的各個數(shù)據(jù)無聯(lián)系,沒有整體概念,不便管理;2.操作不便(如更新數(shù)據(jù))很明顯,我們需要一種能把一個學生的各種信息構(gòu)成一個整體的構(gòu)造性數(shù)據(jù)結(jié)構(gòu)。

但目前學過的數(shù)組、指針都不合適。使用結(jié)構(gòu)體類型可以處理組合數(shù)據(jù)缺點:使用結(jié)構(gòu)體類型可以處理組合數(shù)據(jù)結(jié)構(gòu)體類型

“結(jié)構(gòu)體”是一種構(gòu)造類型,它是由若干“成員”組成的。每一個成員可以是基本數(shù)據(jù)類型或者構(gòu)造類型。struct

[結(jié)構(gòu)體名]{

類型標識符成員名;類型標識符成員名;

…………….};成員類型可以是基本型或構(gòu)造型struct是關(guān)鍵字,不能省略合法標識符可省:無名結(jié)構(gòu)體一、結(jié)構(gòu)的定義

結(jié)構(gòu)體類型

“結(jié)構(gòu)體”是一種構(gòu)造類型,它是由若干“structstudent{ intnum;charname[20];charsex;intage;floatscore;charaddr[30]; };學號num姓名name性別sex年齡age成績score家庭住址addr1001LiXiaoM1989.0hunan1002JinF1890.0beijing1003FengF1960.5guangxi1004RongM1874.5qinghaistructstudent為構(gòu)造的結(jié)構(gòu)體structstudent{學號姓名性別年齡成績家庭住9.1.2結(jié)構(gòu)體變量說明例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};

structstudentstu1,stu2;

1.先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量一般形式:struct結(jié)構(gòu)體名{

類型標識符成員名;類型標識符成員名;

…………….};struct結(jié)構(gòu)體名變量名表列;stu1,stu2為結(jié)構(gòu)體變量9.1.2結(jié)構(gòu)體變量說明例structst2.定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量一般形式:struct結(jié)構(gòu)體名{

類型標識符成員名;類型標識符成員名;

…………….}變量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;2.定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量struct3.直接定義結(jié)構(gòu)體變量一般形式:struct{

類型標識符成員名;類型標識符成員名;

…………….}變量名表列;例struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;

用無名結(jié)構(gòu)體直接定義變量只能一次3.直接定義結(jié)構(gòu)體變量struct例struct用例:結(jié)構(gòu)體變量存儲。

structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};

structstudentstu1;

structstudent結(jié)構(gòu)體類型定義描述結(jié)構(gòu)的組織形式,不分配內(nèi)存;結(jié)構(gòu)體變量stu1分配內(nèi)存,占63個字節(jié)namenumsexscoreaddr4字節(jié)4字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié)……..age例:結(jié)構(gòu)體變量存儲。structstudent結(jié)構(gòu)體類4.結(jié)構(gòu)體可嵌套。比如下列數(shù)據(jù):學號num姓名name出生年月日birthday1001LiXiao1989.12.11002Jin1989.11.121003Feng1989.2.11004Rong1990.5.7用什么類型表示合適?4.結(jié)構(gòu)體可嵌套。學號姓名出生年月日1001LiXiao1structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];

structdatebirthday;}stu;numnamebirthdaymonthdayyearstructstudent{intnum;charname[20];

structdate{intmonth;intday;intyear;}birthday;}stu;numnamebirthdaymonthdayyearstructdatenumnamebirthdaymon結(jié)構(gòu)體課堂練習1:1.當定義一個結(jié)構(gòu)變量時,系統(tǒng)分配給它的內(nèi)存是

)。A.各成員所需內(nèi)存量的總和

B.結(jié)構(gòu)中第一個成員所需內(nèi)存量C.成員中占內(nèi)存量最大的容量

D.結(jié)構(gòu)中最后一個成員所需內(nèi)存量2.已知:struct{intk;charc;floata;}test;則sizeof(test)的值是(

)。A.6 B.7 C.8 D.9DA結(jié)構(gòu)體課堂練習1:DA3.如下說明語句,則下面敘述不正確的是(

)。structstu{inta;floatb;}stutype;A)struct是結(jié)構(gòu)類型的關(guān)鍵字B)structstu是用戶定義的結(jié)構(gòu)類型C)stutype是用戶定義的結(jié)構(gòu)類型名D)a和b都是結(jié)構(gòu)成員名C3.如下說明語句,則下面敘述不正確的是(成員(分量)運算符優(yōu)先級:1結(jié)合性:從左向右引用方式:

結(jié)構(gòu)體變量名.成員名例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;

stu1.num=10;stu1.sex=‘M’;stu1.score+=stu2.score;stu1.age++;9.1.3結(jié)構(gòu)體變量的引用引用規(guī)則結(jié)構(gòu)體變量不能整體引用,只能引用變量成員成員(分量)運算符引用方式:結(jié)構(gòu)體變量名.成員名例可以將一個結(jié)構(gòu)體變量賦值給另一個結(jié)構(gòu)體變量結(jié)構(gòu)體嵌套時逐級引用例structstudent{intnum;charname[20];

structdate{intmonth;intday;intyear;}birthday;}stu1,stu2;stu1.birthday.year=2010stu1=stu2;9.1.3結(jié)構(gòu)體變量的引用引用規(guī)則可以將一個結(jié)構(gòu)體變量賦值給另一個結(jié)構(gòu)體變量例struct4.已知學生記錄描述為:structstudent{intno;charname[20];charsex;struct{intyear;intmonth;intday;}birth;}s;設(shè)結(jié)構(gòu)變量s中的“birth”應是“1985年10月1日”,則下面正確的賦值方式是(

)。A)year=1985B)birth.year=1985month=10birth.month=10day=1birth.day=1C)s.year=1985D)s.birth.year=1985s.month=10s.birth.month=10s.day=1s.birth.day=1D4.已知學生記錄描述為:D學號num姓名name性別sex年齡age成績score家庭住址addr1001LiXiaoM1989.0hunan1002JinF1890.0beijing1003FengF1960.5guangxi1004RongM1874.5qinghai結(jié)構(gòu)體例1:輸出下面數(shù)據(jù)中分數(shù)最高的學生姓名與分數(shù)?第一步:如何輸入每個學生的信息?方式二:初始化方式一:賦值學號姓名性別年齡成績家庭住址1001LiXiaoM1989.structstu{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;main(

){stu1.num=1001;strcpy(,"LiXiao");scanf("%c%d%f",&stu1.sex,&stu1.age,&stut1.score);strcpy(stu1.addr,"hunan");}方式一、結(jié)構(gòu)體變量的賦值

structstu方式一、結(jié)構(gòu)體變量的賦值structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};structstudentstu1={1001,"LiXiao",‘M’,19,89.0,“hunan”};structstudent{intnum;charname[20];charsex;intage;floatscore;

charaddr[30];}stu1={1001,"LiXiao",‘M’,19,89.0,“hunan”};方式二、初始化structstudentstructstudent學號num姓名name性別sex年齡age成績score家庭住址addr1001LiXiaoM1989.0hunan1002JinF1890.0beijing1003FengF1960.5guangxi1004RongM1874.5qinghai結(jié)構(gòu)體例1:輸出下面數(shù)據(jù)中分數(shù)最高的學生姓名與分數(shù)?程序如下:學號姓名性別年齡成績家庭住址1001LiXiaoM1989.#include<stdio.h>#include<string.h>structstu{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1={1001,"LiXiao",'M',19,89.00,"hunan"},stu2={1002,"Jin",'F',18,90.00,"beijing"},stu3={1003,"Feng",'F',19,60.50,"guangxi"},stu4={1004,"Rong",'M',18,74.50,"qinghai"};初始化數(shù)據(jù)main(){floatmaxscore=0;charmaxname[30];if(maxscore<stu1.score){maxscore=stu1.score;strcpy(maxname,);}if(maxscore<stu2.score){maxscore=stu2.score;strcpy(maxname,);}if(maxscore<stu3.score){maxscore=stu3.score;strcpy(maxname,);}if(maxscore<stu4.score){maxscore=stu4.score;strcpy(maxname,);}printf("姓名:%s最高分:%f\n",maxname,maxscore);}

每個學生信息雖然包含不同類型數(shù)據(jù),但每個學生的屬性都是一樣的??梢杂脭?shù)組表示。#include<stdio.h>初始化數(shù)據(jù)main()每個

9.1.4結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組的定義三種形式:形式一:

structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];形式二:structstudent{intnum;charname[20];charsex;intage;}stu[2];形式三:struct{intnum;charname[20];charsex;intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]25B9.1.4結(jié)構(gòu)體數(shù)組形式一:形式二:形式三:n結(jié)構(gòu)體數(shù)組初始化順序初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={100,“WangLin”,‘M’,20,101,“LiGang”,‘M’,19,110,“LiuYan”,‘F’,19};分行初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={{100,“WangLin”,‘M’,20},{101,“LiGang”,‘M’,19},{110,“LiuYan”,‘F’,19}};全部初始化時維數(shù)可省結(jié)構(gòu)體數(shù)組引用引用方式:結(jié)構(gòu)體數(shù)組名[下標].成員名stu[0].numstu[1].name結(jié)構(gòu)體數(shù)組初始化順序初始化:分行初始化:全部初始化時維數(shù)可省學號num姓名name性別sex年齡age成績score家庭住址addr1001LiXiaoM1989.0hunan1002JinF1890.0beijing1003FengF1960.5guangxi1004RongM1874.5qinghai結(jié)構(gòu)體例1:輸出下面數(shù)據(jù)中分數(shù)最高的學生姓名與分數(shù)?程序修改如下:學號姓名性別年齡成績家庭住址1001LiXiaoM1989.#include<stdio.h>#include<string.h>structstu{intnum;charname[20];charsex;intage;floatscore; charaddr[30];}stu[4]={{1001,"LiXiao",'M',19,89.00,"hunan"},{1002,"Jin",'F',18,98.00,"beijing"},{1003,"Feng",'F',19,60.50,"guangxi"},{1004,"Rong",'M',18,74.50,"qinghai"}};數(shù)組初始化main(){floatmaxscore=0;charmaxname[30];inti;for(i=0;i<4;i++)if(maxscore<stu[i].score){maxscore=stu[i].score;strcpy(maxname,stu[i].name);}printf("姓名:%s最高分:%f\n",maxname,maxscore);}#include<stdio.h>數(shù)組初始化main()姓名name選票countLi0Zhang0Wang0結(jié)構(gòu)體例2:10人投票,請統(tǒng)計3個候選人的選票情況。程序如下:姓名選票Li0Zhang0Wang0結(jié)構(gòu)體例2:10人投票#include<stdio.h>#include<string.h>structperson{charname[20];intcount;}leader[3]={"li",0,"zhang",0,"wang",0};數(shù)組初始化voidmain(){ inti,j;charleader_name[20]; for(i=1;i<=10;i++) {scanf("%s",leader_name);//投票人所投的候選人的姓 for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++; } printf("\n"); for(i=0;i<3;i++) printf("%5s:%d\n",leader[i].name,leader[i].count);}#include<stdio.h>數(shù)組初始化voidma結(jié)構(gòu)體課堂練習2:1.有如下定義:structperson{charname[9];intage;};structpersonclass[10]={"Johu",17,"Paul",19,"Mary",18,"Adam",16};根據(jù)上述定義,能輸出字母M的語句是(

)。A、printf("%c\n",class[3].name);B、printf("%c\n",class[3].name[1]);C、printf("%c\n",class[2].name[1]);D、printf("%c\n",class[2].name[0]);D結(jié)構(gòu)體課堂練習2:D2.下面程序的運行結(jié)果是()。#include"stdio.h"main(){structcmplx{intx;inty;}cnum[2]={1,3,2,7};printf("%d\n",cnum[0].y/cnum[0].xcnum[1].x);}A.0 B.1 C.3 D.6DD9.1.5結(jié)構(gòu)體與函數(shù)

1.結(jié)構(gòu)體變量作為函數(shù)的參數(shù)

結(jié)構(gòu)體變量作為函數(shù)參數(shù)時,形參與實參的結(jié)構(gòu)體變量類型應當完全一致,函數(shù)調(diào)用時直接將實參結(jié)構(gòu)體變量的各個成員的值全部傳遞給形參結(jié)構(gòu)體變量。9.1.5結(jié)構(gòu)體與函數(shù)1.結(jié)構(gòu)體變量作為函數(shù)的參數(shù)【例9.7】用函數(shù)實現(xiàn)數(shù)組元素輸出。#include"stdio.h”structstu{intnum;charname[20];charsex;floatscore;}student[5]={{1001,"LiXiao",'M',89.00},{1002,"Jin",'F

',90.00},{1003,"Feng",'F

',60.50},{1004,"Rong",'M

',74.50},{1005,"ZhuJi",'F

',55.00}};voidprint(structstus) //定義print函數(shù){printf("%d%s%c%f\n",s.num,,s.sex,s.score);}voidmain(){inti;for(i=0;i<5;i++)print(student[i]); //調(diào)用print函數(shù)輸出結(jié)構(gòu)體變量}【例9.7】用函數(shù)實現(xiàn)數(shù)組元素輸出。#include"s9.1.6指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針定義形式:struct結(jié)構(gòu)體名*結(jié)構(gòu)體指針名;例structstudent*p;使用結(jié)構(gòu)體指針變量引用成員形式存放結(jié)構(gòu)體變量在內(nèi)存的起始地址numnamesexagestupstructstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;(*結(jié)構(gòu)體指針名).成員名結(jié)構(gòu)體指針名->成員名結(jié)構(gòu)體變量名.成員名指向運算符優(yōu)先級:1結(jié)合方向:從左向右例指向結(jié)構(gòu)體的指針變量例intn;int*p=&n;

*p=10;n=109.1.6指向結(jié)構(gòu)體變量的指針使用結(jié)構(gòu)體指針變量引用成員#include<stdio.h>structstu{ intnum; charname[20]; charsex; floatscore; }student1={1001,"LiXiao",'M',89.00},*pstu;voidmain(

){pstu=&student1;

printf(“%d\n%s\n",(*pstu).num,(*pstu).name);printf(“%c\n%.2f\n\n",(*pstu).sex,(*pstu).score);

printf(“%d\n%s\n",pstu->num,pstu->name);printf(“%c\n%.2f\n\n",pstu->sex,pstu->score);}

structstu{ intnum; charname[20]; charsex; floatscore; }stu1,stu2,*pstu1=&stu1;structstu*pstu2;

pstu2=&stu2;//指針變量pstu2指向stu2

stu1.num=101;(*pstu1).num=101#include<stdio.h>structstu{結(jié)構(gòu)體課堂練習3:1.有定義如下:structsk{inta;floatb;}data,*p;如果p=&data;則對于結(jié)構(gòu)變量data的成員a的正確引用是(

)。A.(*).data.a B.(*p).a C.p->data.a D.p.data.aB結(jié)構(gòu)體課堂練習3:B2.已知:structst{intn;structstnext;};staticstructsta[3]={1,&a[1],3,&a[2],5,&a[0]},p;如果下述語句的顯示是4,則對指針p的賦值是()。printf(“%d”,++(p->next->n);A.p=&a[0]; B.p=&a[1]; C.p=&a[2]; D.p=&a[3];A2.已知:A3.若有以下定義和語句:structstudent{intage;intnum;};structstudentstu[3]={{1001,20},{1002,19},{1003,21}};voidmain(

){structstudent*p;p=stu;…}則以下不正確的引用是(

)。A.(p++)->num B.p++ C.(*p).num D.p=&stu.ageDD4.有以下程序:#include<stdio.h>structstu{intnum;charname[10];intage;};voidfun(structstu*p){ printf("%s\n",(*p).name);}main(){ structstustudents[3]={{9801,"Zhang",20},{9802,"Wang",19},{9803,"Zhao",18}}; fun(students+2);}輸出結(jié)果是。A、ZhangB、ZhaoC、WangD、18B4.有以下程序:B9.1.7動態(tài)存儲分配

下列數(shù)組定義正確嗎?intn=10;inta[n];錯,不允許用變量表示數(shù)組長度但是在實際的編程中,經(jīng)??赡艹霈F(xiàn)所需的內(nèi)存空間取決于實際輸入的數(shù)據(jù)的情況。也就是需要動態(tài)地分配內(nèi)存空間。C語言提供動態(tài)內(nèi)存管理函數(shù)9.1.7動態(tài)存儲分配下列數(shù)組定義正確嗎?錯,不函數(shù)形式:(類型說明符*)malloc(size)功能:在內(nèi)存的動態(tài)存儲區(qū)中分配一塊長度為“size”字節(jié)的連續(xù)區(qū)域。(類型說明符*)用于強制類型轉(zhuǎn)換。函數(shù)的返回值為該區(qū)域的首地址(指針形式)。1.分配內(nèi)存空間函數(shù)mallocpc=(char*)malloc(100);

分配100個字節(jié)的內(nèi)存空間,并強制轉(zhuǎn)換為字符數(shù)組類型,函數(shù)的返回值為指向該字符數(shù)組的指針,把該指針賦予指針變量pc。函數(shù)形式:1.分配內(nèi)存空間函數(shù)mallocpc=(char函數(shù)形式:(類型說明符*)calloc(n,size)

功能:在內(nèi)存動態(tài)存儲區(qū)中分配n塊長度為“size”字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。2.分配內(nèi)存空間函數(shù)calloc

ps=(structstu*)calloc(2,sizeof(structstu));

其中的sizeof(structstu)是求stu的結(jié)構(gòu)長度。因此該語句的意思是:按stu的長度分配2塊連續(xù)區(qū)域,強制轉(zhuǎn)換為stu類型,并把其首地址賦予指針變量ps。函數(shù)形式:2.分配內(nèi)存空間函數(shù)callocps=函數(shù)形式:

free(void

*ptr);功能:釋放指針ptr所指向的內(nèi)存空間。

如:free(pc);free(ps);3.釋放內(nèi)存空間函數(shù)free以上3個函數(shù)均包含在頭文件stdlib.h中#include<stdlib.h>函數(shù)形式:3.釋放內(nèi)存空間函數(shù)free以上3個函數(shù)均包含在頭9.1.8結(jié)構(gòu)體與鏈表鏈表是指將若干個數(shù)據(jù)項按一定的原則連接起來的表。其中每一個數(shù)據(jù)稱為節(jié)點。鏈表連接的原則是:前一個節(jié)點指向下一個節(jié)點;那么結(jié)構(gòu)體與鏈表有什么關(guān)系呢?9.1.8結(jié)構(gòu)體與鏈表鏈表是指將若干個數(shù)據(jù)項按一structentry{intvalue;//存放整數(shù)

structentry*next;//指向entry結(jié)構(gòu)的; };100200300節(jié)點一節(jié)點二節(jié)點三怎樣表示節(jié)點以及節(jié)點之間的關(guān)系?structentry100200300節(jié)創(chuàng)建鏈表

structentryn1,n2,n3;執(zhí)行下列語句可使n1結(jié)構(gòu)的next指針指向n2結(jié)構(gòu)。n1.next=&n2;下列語句可加入n3節(jié)點。

n2.next=&n3;n1.valuen1.nextn2.valuen2.next100200n1.valuen1.nextn2.valuen2.nextn3.valuen3.next100200300創(chuàng)建鏈表下列語句可加入n3節(jié)點。n1.valuen2.val【例9.7】#include<stdio.h>main(){structentry { intvalue;

structentry*next; };

structentryn1,n2,n3; inti; n1.value=100; n2.value=200; n3.value=300; n1.next=&n2; n2.next=&n3; i=n1.next->value; printf("%d\n",i); printf("%d\n",n2.next->value);

}結(jié)果輸出:200

300【例9.7】結(jié)果輸出:n1.valuen1.nextn2.valuen2.nextn3.valuen3.next鏈表結(jié)點的刪除語句:n1.next=n2.next;或n1.next=&n3;鏈表結(jié)點的插入n1.valuen1.nextn2.valuen2.nextn3.valuen3.nextn2_3.valuen2_3.next語句:n2_3.next=&n3;n2.next=&n2_3n1.valuen2.valuen3.value鏈表結(jié)點的刪鏈表練習:1、設(shè)有以下語句:structst{ intn; structst*next;};staticstructsta[3]={5,&a[1],7,&a[2],9,'\0'},*p;p=&a[0];則表達式()的值是6。A、p++->nB、p->n++C、(*p).n++D、++p->nD鏈表練習:D9.有以下結(jié)構(gòu)體變量的定義,如圖所示,指針p指向變量a,指針q指向變量b,則不能把節(jié)點b鏈接到節(jié)點a之后的語句是()。structnode{chardata;structnode*next;}a,b,*p=&a,*q=&b;A.a(chǎn).next=q; B.p.next=&b; C.p->next=&b; D.(*p).next=q;B9.有以下結(jié)構(gòu)體變量的定義,如圖所示,指針p指向變量a,指針2、分析以下程序的輸出結(jié)果。#include<stdio.h>#include<string.h>#include<malloc.h>structSTUD{ intno; char*name; intscore;};main(){ structSTUDst1={1,"Mary",85},st2; st2.no=2;=(char*)malloc(sizeof(10)); strcpy(,"Smith"); st2.score=78; printf("%s\n",(st1.score>st2.score?:));}Mary2、分析以下程序的輸出結(jié)果。Mary3、分析以下程序的輸出結(jié)果。#include<stdio.h>#include<stdlib.h>structSTUD{intno;structSTUD*next;};main(){ structSTUD*p,*q;inti;p=q=(structSTUD*)calloc(3,sizeof(structSTUD)); for(i=1;i<=3;i++)(p++)->no=i*100; for(i=1;i<=3;i++) printf("%d\n",(q++)->no);printf("\n");}1002003003、分析以下程序的輸出結(jié)果。1009.3共用體

編號no姓名name性別sex職業(yè)prof學號num職務(wù)title1LiXiaoM學生201701012JinF學生201701023FengF教師講師4RongM教師副教授設(shè)有下列若干人員的數(shù)據(jù),請用相應數(shù)據(jù)結(jié)構(gòu)表示:可以看出,學生和教師所包含的最后一列數(shù)據(jù)是不同的,怎樣表示這樣的數(shù)據(jù)結(jié)構(gòu)?共用體9.3共用體編號姓名性別職業(yè)學號nu共用體(union)把幾種不同類型的值存放在同一內(nèi)存區(qū)域中,例如,把一個整型值和字符值放在同一區(qū)域中,既能以整數(shù)存取,又能以字符存取。共用體(union)把幾種不同類型的值存放在同一內(nèi)定義一個共用體類型的一般形式為:union共用體名{成員列表;};成員表中含有若干成員,成員的一般形式為:

類型說明符

成員名例2:uniondata{inti;charch;floatf;};

一、共用體的定義例1:unionprof{inti;chartitle[10];};

定義一個共用體類型的一般形式為:例2:一、共用體的定義例1:二、共用體變量的說明

共用體變量的說明和結(jié)構(gòu)變量的說明方式相同,也有三種形式。先定義,再說明定義同時說明直接說明

uniondata{inti;charch;floatf;};uniondataa,b;union{inti;charch;floatf;}a,b;uniondata{inti;charch;floatf;}a,b;二、共用體變量的說明共用體變量的說明和結(jié)構(gòu)變量的說明方式相uniondata{inti;charch;floatf;}a,b;

圖9.11共用體存儲結(jié)構(gòu)三、共用體的存儲結(jié)構(gòu)共用體變量的占用內(nèi)存空間的大小等于成員中最長的成員所占用的內(nèi)存的長度。uniondata三、共用體的存儲結(jié)構(gòu)共用體變量的占結(jié)構(gòu)體與共用體區(qū)別:存儲方式不同structnode{charch[2];intk;}a;unionnode{charch[2];intk;}b;achkbchk變量的各成員同時存在任一時刻只有一個成員存在聯(lián)系:兩者可相互嵌套結(jié)構(gòu)體與共用體structnodeunionno三、共用體變量的賦值和使用對共用體變量的賦值,使用都只能是對變量的成員進行。共用體變量的成員表示為:共用體變量名.成員名

#include"stdio.h"voidmain(){inti; unionab {inta; charb; charc[4]; }c; c.a=0x12345678;printf("a:%x\nch:%x\n",c.a,c.b); for(i=0;i<=3;i++)printf("ch[%d]=%x\n",i,c.c[i]);}運行結(jié)果:a:12345678b:78c[0]=78c[1]=56c[2]=34c[3]=12三、共用體變量的賦值和使用對共用體變量的賦值,使用都只能是對共用體類型數(shù)據(jù)的特點:(1)同一個內(nèi)存段可以用來存放幾種不同類型的數(shù)據(jù),但在某一時刻只能存放其中一種;(2)共用體變量中起作用的成員是最后一次存放的成員,在存入一個新的成員后原有的成員就失去作用。

如:c.a=200;c.b=‘a(chǎn)’;

此時printf(“%d”,c.a);輸出:97共用體類型數(shù)據(jù)的特點:(3)初始化共用體變量時只能賦一個初值;unionab {inta; charb; charc[4]; }c={200,'a',"abc"};上述賦值是錯誤的正確的初始化為:

unionab {inta; charb; charc[4]; }c={'a'};(3)初始化共用體變量時只能賦一個初值;9.4枚舉

枚舉是一個被命名的整型常數(shù)的集合,枚舉在日常生活中很常見。例如表示星期的SUN,MON,TUE,WED,THU,FRI,SAT枚舉的說明形式為:enum

枚舉名標識符{常量標識符[=整型常數(shù)],常量標識符[=整型常數(shù)],...常量標識符[=整型常數(shù)],}枚舉變量;9.4枚舉枚舉是一個被命名的整型常數(shù)的集合,枚舉如果枚舉沒有初始化,即省略"=整型常數(shù)"時,則從第一個標識符開始,順序給每個標識符一個序列號0,1,2,...。但當枚舉中的某個成員賦值后,其后的成員則按此數(shù)值依次加1作為其序列號。

例如:enumstring{x1,x2,x3,x4}x;x1,x2,x3,x4的值分別為0,1,2,3。當定義改變成:enumstring{x1,x2=0,x3=50,x4,}x;則x1=0,x2=0,x3=50,x4=51

如果枚舉沒有初始化,即省略"=整型常數(shù)"時,則從注意:

1.

枚舉中每個成員(標識符)結(jié)束符是",",

不是";",最后一個成員可省略","。2.

初始化時可以賦負數(shù),其后的標識符仍依次加1。3.

枚舉變量只能取枚舉說明結(jié)構(gòu)中的某個標識符常量。例如:enumstring{x1=5,x2,x3,x4,};enumstrigx=x3;此時,枚舉變量x實際上是7。但不能直接賦值為整數(shù)常量:enumstrigx=7;錯誤

注意:enumstrigx=7;錯誤9.5自定義數(shù)據(jù)類型功能:用自定義名字為已有數(shù)據(jù)類型命名類型定義簡單形式:typedeftype

name;例typedefintINTEGER;類型定義語句關(guān)鍵字已有數(shù)據(jù)類型名用戶定義的類型名例typedeffloatREAL;類型定義后,與已有類型一樣使用例INTEGERa,b,c;REALf1,f2;

inta,b,c;floatf1,f2;說明:1.typedef沒有創(chuàng)造新數(shù)據(jù)類型2.typedef是定義類型,不能定義變量9.5自定義數(shù)據(jù)類型例typedefintINT常用typedef定義結(jié)構(gòu)體類型例:typedefstructclub{charname[20];intsize;intyear;}GROUP;GROUP*p;structclubs[4];

常用typedef定義結(jié)構(gòu)體類型例:typedef練習題4:1、以下敘述正確的是()。A、一旦定義了一個共用體變量,即可引用該變量或該變量中的任意成員B、一個共用體變量中可以同時存放其所有成員C、一個共用體變量中不能同時存放其所有成員D、共用體類型數(shù)據(jù)可以出現(xiàn)在結(jié)構(gòu)體類型定義中,但結(jié)構(gòu)體類型數(shù)據(jù)不能出現(xiàn)在共用體類型定義中C練習題4:C2、若有下面的說明和定義,輸出結(jié)果為():structtest{ floatm3; unionuu { charu1[5]; intu2[2]; }ua;}myaa;main(){printf("%d",sizeof(structtest)); }A、12B、8C、14D、9A2、若有下面的說明和定義,輸出結(jié)果為():A3.若有以下定義和語句:uniondata{intk;charc;floatf;}a;intn;則以下語句正確的是()。

A.a(chǎn)=5 B.a(chǎn)={2,'a',1.2}C.printf("%d\n",a); D.n=a.k;D3.若有以下定義和語句:D4、設(shè)有如下枚舉類型定義:enumlanguage{Basic=3,Assembly,Ada=100,COBOL,Fortran};枚舉量Fortran的值為()。A、4 B、7C、102 D、1035.已知enumweek{sun,mon,tue,wed,thu,fri,sat}day;則正確的賦值語句是()。

A.sun=0; B.sun=day;C.sun=mon; D.day=sun;CD4、設(shè)有如下枚舉類型定義:CD6、下列程序輸出結(jié)果為()#include"stdio.h"voidmain(){inti; enums{x1,x2=3,x3,x4=x3*20};printf("%d,%d,%d,%d,\n",x1,x2,x3,x4);}A、0,1,2,3 B、0,3,2,40C、1,3,4,80 D、0,3,4,80D6、下列程序輸出結(jié)果為()D7、設(shè)有以下說明語句:typedefstruct{ intn; charch[8];}PER;則下面敘述中正確的是()。A、PER是結(jié)構(gòu)體變量名B、PER是結(jié)構(gòu)體類型名C、typedefstruct是結(jié)構(gòu)體類型D、struct是結(jié)構(gòu)體類型名B7、設(shè)有以下說明語句:B10.若已建立如圖所示的單向鏈表結(jié)構(gòu),在該鏈表結(jié)構(gòu)中,指針p、s分別指向圖中所示節(jié)點,則不能將s所指的節(jié)點插入到鏈表末尾的語句組是()

A.p=p->next;s->next=p;p->next=s;

B.p=p->next;s->next=p->next;p->next=s;C.s->next=NULL;p=p->next;p->next=s;D.p=(*p).next;(*s).next=(*p).next;(*p).next=s;A10.若已建立如圖所示的單向鏈表結(jié)構(gòu),在該鏈表結(jié)構(gòu)中,指針p11.以下scanf函數(shù)調(diào)用語句中對結(jié)構(gòu)體變量成員的不正確引用是()。structpupil{charname[20];intage;intsex;}pup[5],p;p=pup;A.scanf("%s",pup[0].name); B.scanf("%d",&pup[0].age);C.scanf(“%d”,&(p->sex)); D.scanf("%d",p->age);D11.以下scanf函數(shù)調(diào)用語句中對結(jié)構(gòu)體變量成員的不正確引第9章構(gòu)造數(shù)據(jù)類型9.1結(jié)構(gòu)體9.2共用體9.3枚舉9.4自定義數(shù)據(jù)類型第9章構(gòu)造數(shù)據(jù)類型9.19.1結(jié)構(gòu)體9.1.1結(jié)構(gòu)體的定義 9.1.2結(jié)構(gòu)體變量說明 9.1.3結(jié)構(gòu)體變量的引用9.1.4結(jié)構(gòu)體數(shù)組 9.1.5結(jié)構(gòu)體與函數(shù)9.1.6指向結(jié)構(gòu)體變量的指針 9.1.7動態(tài)存儲分配 9.1.8結(jié)構(gòu)體與鏈表 9.1.1結(jié)構(gòu)體的定義 9.1結(jié)構(gòu)體概述

在前面章節(jié)所見到的程序中,大多數(shù)的數(shù)據(jù)都是獨立的,沒有內(nèi)在聯(lián)系的 。比如:int

a,b;floatc,d;charname[20];但在實際生活和工作中,很多不同類型的數(shù)據(jù)是存在內(nèi)在聯(lián)系的。比如學生基本信息。9.1結(jié)構(gòu)體概述 在前面章節(jié)所見到的程序中,大多數(shù)學號num姓名name性別sex年齡age成績score家庭住址addr1001LiXiaoM1989.0hunan1002JinF1890.0beijing1003FengF1960.5guangxi1004RongM1874.5qinghai提問:輸出分數(shù)最高的學生的成績?學號姓名性別年齡成績家庭住址1001LiXiaoM1989.main(){inti,num,age;floatscore;charsex,name[20],addr[30];intmax=0;for(i=1;i<=4;i++){scanf(“%d%d%f”,&num,&age,&score);scanf(“%c”,&sex);gets(name);gets(addr);if(max<score)max=score;}printf(“%f\n”,max);}main()缺點:1.變量過多,同一學生的各個數(shù)據(jù)無聯(lián)系,沒有整體概念,不便管理;2.操作不便(如更新數(shù)據(jù))很明顯,我們需要一種能把一個學生的各種信息構(gòu)成一個整體的構(gòu)造性數(shù)據(jù)結(jié)構(gòu)。

但目前學過的數(shù)組、指針都不合適。使用結(jié)構(gòu)體類型可以處理組合數(shù)據(jù)缺點:使用結(jié)構(gòu)體類型可以處理組合數(shù)據(jù)結(jié)構(gòu)體類型

“結(jié)構(gòu)體”是一種構(gòu)造類型,它是由若干“成員”組成的。每一個成員可以是基本數(shù)據(jù)類型或者構(gòu)造類型。struct

[結(jié)構(gòu)體名]{

類型標識符成員名;類型標識符成員名;

…………….};成員類型可以是基本型或構(gòu)造型struct是關(guān)鍵字,不能省略合法標識符可省:無名結(jié)構(gòu)體一、結(jié)構(gòu)的定義

結(jié)構(gòu)體類型

“結(jié)構(gòu)體”是一種構(gòu)造類型,它是由若干“structstudent{ intnum;charname[20];charsex;intage;floatscore;charaddr[30]; };學號num姓名name性別sex年齡age成績score家庭住址addr1001LiXiaoM1989.0hunan1002JinF1890.0beijing1003FengF1960.5guangxi1004RongM1874.5qinghaistructstudent為構(gòu)造的結(jié)構(gòu)體structstudent{學號姓名性別年齡成績家庭住9.1.2結(jié)構(gòu)體變量說明例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};

structstudentstu1,stu2;

1.先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量一般形式:struct結(jié)構(gòu)體名{

類型標識符成員名;類型標識符成員名;

…………….};struct結(jié)構(gòu)體名變量名表列;stu1,stu2為結(jié)構(gòu)體變量9.1.2結(jié)構(gòu)體變量說明例structst2.定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量一般形式:struct結(jié)構(gòu)體名{

類型標識符成員名;類型標識符成員名;

…………….}變量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;2.定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量struct3.直接定義結(jié)構(gòu)體變量一般形式:struct{

類型標識符成員名;類型標識符成員名;

…………….}變量名表列;例struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;

用無名結(jié)構(gòu)體直接定義變量只能一次3.直接定義結(jié)構(gòu)體變量struct例struct用例:結(jié)構(gòu)體變量存儲。

structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};

structstudentstu1;

structstudent結(jié)構(gòu)體類型定義描述結(jié)構(gòu)的組織形式,不分配內(nèi)存;結(jié)構(gòu)體變量stu1分配內(nèi)存,占63個字節(jié)namenumsexscoreaddr4字節(jié)4字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié)……..age例:結(jié)構(gòu)體變量存儲。structstudent結(jié)構(gòu)體類4.結(jié)構(gòu)體可嵌套。比如下列數(shù)據(jù):學號num姓名name出生年月日birthday1001LiXiao1989.12.11002Jin1989.11.121003Feng1989.2.11004Rong1990.5.7用什么類型表示合適?4.結(jié)構(gòu)體可嵌套。學號姓名出生年月日1001LiXiao1structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];

structdatebirthday;}stu;numnamebirthdaymonthdayyearstruct

溫馨提示

  • 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

提交評論