C語言程序設(shè)計 課件 于紅 模塊四 編程高級應(yīng)用_第1頁
C語言程序設(shè)計 課件 于紅 模塊四 編程高級應(yīng)用_第2頁
C語言程序設(shè)計 課件 于紅 模塊四 編程高級應(yīng)用_第3頁
C語言程序設(shè)計 課件 于紅 模塊四 編程高級應(yīng)用_第4頁
C語言程序設(shè)計 課件 于紅 模塊四 編程高級應(yīng)用_第5頁
已閱讀5頁,還剩88頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計基礎(chǔ)與實踐模塊四編程高級應(yīng)用任務(wù)4.1數(shù)組C語言程序設(shè)計基礎(chǔ)與實踐課程組04技能點拓展03技能點詳解02技能點分析目錄CONTENTS任務(wù)4.1數(shù)組01問題引入05技能點檢測一問題引入足球場上,雙方球員在快速奔跑,搶斷,為了團隊的榮譽拼搏。作為觀眾的我們,無法看見球員的面孔,我們通過球衣的顏色和圖案區(qū)別球隊。但是,如何區(qū)別哪一位球員呢?有的時候解說員在解說比較激烈的場面的時候,通常喊的是球員身后的號碼,當我們看到號碼的時候,就知道是哪位球員,比如C羅的7號,馬拉多拉的10號。這種用球隊多少號球員的命名方式,在C語言中就是數(shù)組的命名方式。那么數(shù)組在使用時我們應(yīng)該注意哪些事項呢?04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.1數(shù)組二技能點分析1.掌握一維數(shù)組的應(yīng)用2.掌握多維數(shù)組初始化的3.掌握訪問數(shù)組元素的方法學習目標1.什么是數(shù)組?2.如何聲明一維數(shù)組和二維數(shù)組?3.數(shù)組如何被初始化?4.如何訪問數(shù)組元素?元素的索引是什么?學期預(yù)習04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.1數(shù)組數(shù)組是一組具有相同數(shù)據(jù)類型的變量集合,它是一系列相同類型的變量。一維數(shù)組的定義typename[size1];C語言支持多維數(shù)組。多維數(shù)組聲明的一般形式如下:typename[size1][size2]...[sizeN];數(shù)組中的每一項稱為數(shù)組的元素,每個元素都有對應(yīng)的下標(n),用于表示元素在數(shù)組中的位置序號,下標從0開始。數(shù)組的聲明是聲明一個數(shù)組變量,有一個統(tǒng)一的名稱,比如定義一個數(shù)組name,然后用name[n]的形式訪問其中的每一個變量,稱為數(shù)組元素。三技能點詳解——數(shù)組數(shù)組中的每一項稱為數(shù)組的元素,每個元素都有對應(yīng)的下標(n),用于表示元素在數(shù)組中的位置序號,下標從0開始。數(shù)組的聲明是聲明一個數(shù)組變量,有一個統(tǒng)一的名稱,比如定義一個數(shù)組name,然后用name[n]的形式訪問其中的每一個變量,稱為數(shù)組元素。三技能點詳解——數(shù)組1)聲明數(shù)組在C中要聲明一個數(shù)組,需要指定元素的類型和元素的數(shù)量,如下所示:typearrayName[arraySize];這叫做一維數(shù)組。[]中的arraySize必須是一個大于零的整數(shù)常量,type可以是任意有效的C數(shù)據(jù)類型。要聲明一個類型為float的包含6個元素的數(shù)組b,聲明語句如下:floatb[6];現(xiàn)在b是一個可用的數(shù)組,可以容納6個類型為float的數(shù)字。三技能點詳解——1一維數(shù)組三技能點詳解——1一維數(shù)組2)初始化數(shù)組(1)直接對數(shù)組中的所有元素賦值。需要注意的是:大括號{}中的值的數(shù)目不能大于我們在數(shù)組聲明時在方括號[]中指定的元素數(shù)目。比如下例中定義的數(shù)組b長度是5,那么初始化的值的數(shù)目最多也只能是5個。floatb[5]={9990.0,1.0,5.0,7.0,56.0};(2)只對數(shù)組中的一部分元素賦值。

結(jié)果是給b[0],b[1]賦了初始值,其他元素沒有初始值(也可以理解為是個隨機數(shù)值)floatb[5]={9990.0,1.0};(3)對數(shù)組全部元素賦值,但不指定長度。如果省略掉了數(shù)組的大小,這時數(shù)組的長度等于初始化時元素的個數(shù)。floatb[]={9990.0,1.0,5.0,7.0,56.0};這將創(chuàng)建一個數(shù)組,雖然沒有指定數(shù)組長度,它與前一個實例中所創(chuàng)建的數(shù)組是完全相同的,也是5個數(shù)組元素。3)訪問數(shù)組元素

數(shù)組元素可以通過數(shù)組名稱加索引進行訪問。元素的索引是放在方括號內(nèi),跟在數(shù)組名稱的后邊。b[4]=56.0;這個語句把數(shù)組中第五個元素的值賦為56.0,b[4]可以看作是一個獨立的變量,我們可以通過這個變量直接修改數(shù)組中的元素值或者引用其中的值。三技能點詳解——1一維數(shù)組1)聲明二維數(shù)組聲明一個x行y列的二維整型數(shù)組,形式如下:typearrayName[m][n];其中,type可以是任意有效的C數(shù)據(jù)類型,arrayName

是一個有效的C標識符。一個二維數(shù)組在邏輯上就是一個m行和n列的表格。下面是一個二維數(shù)組,包含4行和3列:inta[4][3];因此,數(shù)組中的每個元素是使用形式為a[m][n]的元素名稱來標識的,其中a是數(shù)組名稱,m和n是唯一標識數(shù)組a中每個元素的下標。三技能點詳解——2二維數(shù)組2)初始化二維數(shù)組inta[3][4]={{0,1,2,3},//初始化索引號為0的行 {4,5,6,7},//初始化索引號為1的行 {8,9,10,11}//初始化索引號為2的行 };多維數(shù)組可以通過在括號內(nèi)為每行指定值來進行初始化。下面是一個帶有3行4列的數(shù)組。內(nèi)部嵌套的括號是可選的,下面的初始化與上面是等同的:之所以可以這樣初始化,是因為數(shù)組的物理結(jié)構(gòu)還是一個數(shù)據(jù)列表,數(shù)組中的數(shù)據(jù)存放在內(nèi)存中時還是按照線性結(jié)構(gòu)順序存儲在內(nèi)存空間中的。例如上例中的a數(shù)組在內(nèi)存中的結(jié)構(gòu)實際是這樣的:三技能點詳解——2二維數(shù)組二維數(shù)組中的元素是通過使用下標(即數(shù)組的行索引和列索引)來訪問的。例如:int

val=a[2][3];上面的語句將獲取數(shù)組中第3行第4個元素賦值給變量val。3)訪問二維數(shù)組元素三技能點詳解——2二維數(shù)組三技能點詳解——1訪問二維數(shù)組元素二維數(shù)組中的元素是通過使用下標(即數(shù)組的行索引和列索引)來訪問的。例如:intval=a[2][3];上面的語句將獲取數(shù)組中第3行第4個元素賦值給變量val。案例4.1.1讀寫一維數(shù)組/****************************************************內(nèi)容簡述:一位數(shù)組初始化和輸出***************************************************/#include

<stdio.h>

//頭文件

intmain(void){

intn[10]; //n是一個包含10個整數(shù)的數(shù)組

int

i,j;

for(i=0;i<10;i++) //初始化數(shù)組元素 { n[i]=i+100; //設(shè)置元素

i

i+100 }

for(j=0;j<10;j++) //輸出數(shù)組中每個元素的值 {

printf("Element[%d]=%d\n",j,n[j]); }

return0;}三技能點詳解——案例三技能點詳解——案例實例4.1.2讀寫二維數(shù)組/****************************************************內(nèi)容簡述:二維數(shù)組初始化和輸出***************************************************/#include

<stdio.h>

intmain(void){

/*一個帶有5行2列的數(shù)組*/

inta[5][2]={{0,0},{1,2},{2,4},{3,6},{4,8}};

inti,j;

for(i=0;i<5;i++)//輸出數(shù)組中每個元素的值{

for(j=0;j<2;j++){printf("a[%d][%d]=%d\n",i,j,a[i][j]);}}

return0;}三技能點詳解——案例04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.1數(shù)組四技能點拓展——1數(shù)組越界數(shù)組的下標都有一個范圍,即“0~[數(shù)組長度-1]”,假設(shè)數(shù)組的長度為:5,其下標范圍為0~4。當訪問數(shù)組中的元素時,下標不能超出這個范圍,否則程序會出錯。/****************************************************內(nèi)容簡述:數(shù)組越界顯示問題***************************************************/#include

<stdio.h>

//頭文件intmain(void){

inta[5]={1,2,3,4,5};//一維數(shù)組的5個元素

int

i;

for(i=0;i<6;i++)//輸出5個數(shù)值 {

printf("a[%d]=%d\n",i,a[i]); }

return0;}四技能點拓展——2字符數(shù)組字符數(shù)組是由字符類型的元素所組成的數(shù)組,字符串就存儲在字符數(shù)組中,在訪問字符數(shù)組時,可使用下標法讀取指定位置的字符。字符數(shù)組定義方式與整型數(shù)組類似:chararrname[size];//一維字符數(shù)組定義字符數(shù)組:charcha[6];charchb[5]={'a','b','c','d','e'};//定義一個字符數(shù)組并初始化數(shù)組元素四技能點拓展——3字符串數(shù)組字符串是由數(shù)字、字母、下劃線、空格等各種字符組成的一串字符,由一對英文半角狀態(tài)下的雙引號(“”)括起來,例如”abcde”。字符串在C語言中,字符串的存儲和處理都是通過字符數(shù)組來實現(xiàn)的,存儲字符串的字符數(shù)組必須以空字符’\0’(空字符)結(jié)尾。當把一個字符串存入一個字符數(shù)組時,也把結(jié)束符’\0’存入數(shù)組,因此該字符數(shù)組的長度是字符串實際字符數(shù)加1。字符串由字符數(shù)組進行存儲,那么可以直接使用一個字符串常量來為一個字符數(shù)組賦值。charcha[11]={"helloworld"};charchb[]={"helloworld"};上述兩個字符數(shù)組的大小都是11,這是因為字符串末尾有一個’\0’結(jié)束符。04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.1數(shù)組五技能點檢測完成課堂任務(wù),在線提交;完成技能檢測,在線提交;C語言程序設(shè)計基礎(chǔ)與實踐模塊四編程高級應(yīng)用任務(wù)4.2指針C語言程序設(shè)計基礎(chǔ)與實踐課程組04技能點拓展03技能點詳解02技能點分析目錄CONTENTS任務(wù)4.2指針01問題引入05技能點檢測一問題引入現(xiàn)實生活中,我們總會碰到很多指示牌,它們的作用是告訴尋路者要找到一個地方應(yīng)該怎么走,以便我們找到自己的目的地或者所需的東西,比如車站出口、物品擺放地等等。在程序設(shè)計中,有時也需要“指示牌”,告訴程序所需要的數(shù)據(jù)、代碼在哪,以便于更好的調(diào)用數(shù)據(jù)、代碼。那么指針在使用時我們應(yīng)該注意哪些事項呢?04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.2指針二技能點分析1.指針概念2.指針運算3.指針與數(shù)組學習目標1.什么是指針?2.如何聲明指針?3.指針的算術(shù)運算有哪些?4.什么是指針數(shù)字?如何定義一維指針數(shù)組?學期預(yù)習04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.2指針指針也就是內(nèi)存地址,指針變量是用來存放內(nèi)存地址的變量。就像其他變量或常量一樣,您必須在使用指針存儲其他變量地址之前,對其進行聲明。指針變量聲明的一般形式為:type*v_name;type是指針的基類型,它必須是一個有效的C數(shù)據(jù)類型,v_name是指針變量的名稱。用來聲明指針的星號*與乘法中使用的星號是相同的。但是,在這個語句中,星號是用來指定一個變量是指針。int*intp;/*一個整型的指針*/double*doup;/*一個double型的指針*/float*flop;/*一個浮點型的指針*/char*chp;/*一個字符型的指針*/三技能點詳解——指針不同數(shù)據(jù)類型的指針之間唯一的不同是,指針所指向的變量或常量的數(shù)據(jù)類型不同。例如一個int型變量inta:編譯器會根據(jù)變量inta的類型int,為其分配4個字節(jié)地址連續(xù)的存儲空間。假如這塊連續(xù)空間的首地址為0x0048EFAA,那么這個變量占據(jù)0x0048EFAA~0x0048EFAD這四個字節(jié)的空間,0x0048EFAA就是變量inta的地址。三技能點詳解——指針三技能點詳解——1指針的算術(shù)運算1)取址運算符在程序中定義變量時系統(tǒng)會為變量在內(nèi)存中開辟一段空間,用于存儲該變量的值,每個變量的存儲空間都有唯一的編號,這個編號就是變量的內(nèi)存地址。C語言支持以取址運算符“&”獲得變量的地址。&符號的使用方法:&vary_name;intinta=99;//定義變量intaint*intp=&inta;//定義int類型的指針intp,并取變量inta的地址賦值給intp三技能點詳解——1指針的算術(shù)運算2)取值運算符指針變量存儲的數(shù)值是一個地址,直接對地址操作容易出錯,針對指針變量的取值并非取出它所存儲的地址,而是間接取得該地址中存儲的值。C語言支持通過使用一元運算符*來返回位于操作數(shù)所指定地址的變量的值。*符號使用方法:*指針表達式。案例如下:通過上述代碼,最終實現(xiàn)變量intb的值也是99。其效果等同于intb=inta。intinta=99;//定義變量intaint*intp=&inta;//定義int類型的指針intp,并取變量inta的地址賦值給intpintintb=*intp;//定義int型變量intb,并取指針變量p中存儲的變量值賦給intb三技能點詳解——1指針的算術(shù)運算3)指針的算術(shù)運算C指針是一個用數(shù)值表示的地址。因此,您可以對指針執(zhí)行算術(shù)運算??梢詫χ羔樳M行四種算術(shù)運算:++、--、+、-。指針的每一次遞增,它其實會指向下一個元素的存儲單元。指針的每一次遞減,它都會指向前一個元素的存儲單元。指針在遞增和遞減時跳躍的字節(jié)數(shù)取決于指針所指向變量數(shù)據(jù)類型長度,比如int型就是4個字節(jié),char型就移動1個字節(jié)。3)指針的比較指針可以用關(guān)系運算符進行比較,如==、<和>。如果intp1和intp2指向兩個相關(guān)的變量,比如同一個數(shù)組中的不同元素,則可對intp1和intp2進行大小比較。三技能點詳解——1指針的算術(shù)運算1)指針與一維數(shù)組定義了指向數(shù)組的指針,則指針可以像使用數(shù)組名一樣,使用下標取值法對數(shù)組中的元素進行訪問,指針還可以通過“*”符號訪問數(shù)組元素,還可以直接移動指針訪問數(shù)組中的數(shù)據(jù)。三技能點詳解——2指針與數(shù)組charcha1[6]="hello";//定義一個字符數(shù)組,長度為6,hello后還要有一個/0字符char*chp,t; //定義一個chp字符指針和字符型變量tchp=cha1; //將數(shù)組地址賦值給指針chpt=chp[4]; //通過下標訪問字符數(shù)組中的’o’字符,賦值給字符變量tt=*(p+4)//不移動指針,通過指針運算訪問數(shù)組元素’o’字符

/***************************************移動指針,通過指針p+4后指向數(shù)組元素’o’字符,*然后通過*取值運算符訪問字符****************************************/p=p+4;t=*p;2)指針與二維數(shù)組在二維數(shù)組arr中,arr[0]就表示第一行數(shù)據(jù),arr[1]表示第二行數(shù)據(jù)。arr[0]、arr[1]相當于二維數(shù)組中一維數(shù)組的數(shù)組名,指向二維數(shù)組對應(yīng)行的第一個元素,arr[0]=&arr[0][0],arr[1]=&arr[1][0]。在二維數(shù)組中,arr+i雖然指向的是該行元素的首地址,但它代表的是整行數(shù)據(jù)元素,只是一個地址,并不表示某一元素的值。*(arr+i)仍然表示一個地址,與arr[i]等價。*(arr+i)+j表示二維數(shù)組元素arr[i][j]的地址,等價于&arr[i][j],也等價于arr[i]+j。三技能點詳解——2指針與數(shù)組通過ptr訪問二維數(shù)組arr中的第2行第2列的元素:ptr[1][1]*(ptr[1]+1)*(*(ptr+1)+1)案例4.1.1一維數(shù)組指針/*******************************************內(nèi)容簡述:在程序中經(jīng)??吹绞褂弥羔槾鏀?shù)組,*因為變量指針可以遞增,而數(shù)組不能遞增,數(shù)組*可以看成一個指針常量。下面的程序遞增變量指*針,以便順序訪問數(shù)組中的每一個元素******************************************/#include

<stdio.h>intmain(){

int

arr[]={100,200,300};

int

i,*ptr;

ptr=arr; /*指針中的數(shù)組地址*/

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

printf("地址值:arr[%d]=%p\n",i,ptr);

printf("存儲值:arr[%d]=%d\n",i,*ptr);

ptr++; /*通過自增運算讓指針指向下一個位置*/}

return0;}三技能點詳解——案例實例4.1.2二維數(shù)組指針通過指針數(shù)組p和一維數(shù)組a構(gòu)成一個3×2的二維數(shù)組,并為a數(shù)組賦初值2、4、6、8、…。要求先按行的順序輸出此“二維數(shù)組”,然后再按列的順序輸出它。/****************************************內(nèi)容簡述:利用數(shù)組指針訪問二維數(shù)組**************************************/#include

<stdio.h>intmain(){int

i,j,a[3][2]={2,4,6,8,10,12},*p[3];//定義一個指針數(shù)組*p[]

for(i=0;i<3;i++) p[i]=a[i];//利用指針p[i]獲取每行數(shù)組a[i]的地址

for(i=0;i<3;i++){for(j=0;j<2;j++)

printf("%4d",p[i][j]);

printf("\n");}

for(i=0;i<2;i++){for(j=0;j<3;j++)

printf("%4d",p[j][i]);

printf("\n");}}三技能點詳解——案例04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.2指針四技能點拓展——1NULL指針在變量聲明的時候,如果沒有確切的地址可以賦值,為指針變量賦一個NULL值是一個良好的編程習慣。賦為NULL值的指針被稱為空指針。NULL指針是一個定義在標準庫中的值為零的常量。在大多數(shù)的操作系統(tǒng)上,程序不允許訪問地址為0的內(nèi)存,因為該內(nèi)存是操作系統(tǒng)保留的。然而,內(nèi)存地址0有特別重要的意義,它表明該指針不指向一個可訪問的內(nèi)存位置。但按照慣例,如果指針包含空值(零值),則假定它不指向任何東西。如需檢查一個空指針,您可以使用if語句,如下所示:if(ptr)/*如果ptr非空,則完成后續(xù)操作*/if(!ptr)/*如果ptr為空,則完成后續(xù)操作*/四技能點拓展——2指向指針的指針指向指針的指針是一種多級間接尋址的形式,或者說是一個指針鏈。通常,一個指針包含一個變量的地址。當我們定義一個指向指針的指針時,第一個指針包含了第二個指針的地址,第二個指針指向包含實際值的位置。一個指向指針的指針變量必須如下聲明,即在變量名前放置兩個星號。例如,下面聲明了一個指向int類型指針的指針:int**vptr;四技能點拓展——3

無類型指針使用void*修飾的指針。無類型指針指向一塊內(nèi)存,但其類型不定,程序無法根據(jù)這種定義確定為該指針指向的變量分配多少存儲空間,所以若要使用該指針為其他基類指針賦值,必須先轉(zhuǎn)換成其他類型的指針。void *p1=NULL,*q1;//定義一個無類型的指針變量int *m1=(int*)p1;//將無類型的指針變量p強制轉(zhuǎn)換為int*型再賦值四技能點拓展——3

案例1

/****************************************在程序中經(jīng)??吹绞褂弥羔槾鏀?shù)組,因為變量*指針可以遞增,而數(shù)組不能遞增,數(shù)組可以看成*一個指針常量。下面的程序遞增變量指針,以便*順序訪問數(shù)組中的每一個元素***************************************/#include

<stdio.h>intmain(){

intarr[]={100,200,300};

inti,*ptr;ptr=arr; /*指針中的數(shù)組地址*/

for(i=0;i<3;i++){printf("地址值:arr[%d]=%p\n",i,ptr);printf("存儲值:arr[%d]=%d\n",i,*ptr);ptr++; /*通過自增運算讓指針指向下一個位置*/}

return0;}四技能點拓展——3

案例2

/****************************************利用數(shù)組指針訪問二維數(shù)組**************************************/#include

<stdio.h>intmain(){inti,j,a[3][2]={2,4,6,8,10,12},*p[3];//定義一個指針數(shù)組*p[]

for(i=0;i<3;i++) p[i]=a[i];//利用指針

p[i]獲取每行數(shù)組a[i]的地址

for(i=0;i<3;i++){for(j=0;j<2;j++) printf("%4d",p[i][j]);printf("\n");}

for(i=0;i<2;i++){for(j=0;j<3;j++) printf("%4d",p[j][i]);printf("\n");}}04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.2指針五技能點檢測完成課堂任務(wù),在線提交;完成技能檢測,在線提交;C語言程序設(shè)計基礎(chǔ)與實踐模塊四編程高級應(yīng)用任務(wù)4.3結(jié)構(gòu)體C語言程序設(shè)計基礎(chǔ)與實踐課程組04技能點拓展03技能點詳解02技能點分析目錄CONTENTS任務(wù)4.3結(jié)構(gòu)體01問題引入05技能點檢測一問題引入現(xiàn)實生活中,我們對某一個物體的描述往往都是通過多個信息的組合來完成,比如一個人,他要有姓名、性別、身高、體重等等基本信息,否則無法完整描述一個人的所有特征。再比如描述書本的信息、動物的信息等等,也是如此。為了描述這類數(shù)據(jù),在C語言中設(shè)計了一類數(shù)據(jù),它描述的是一個對象的信息,但是是通過多種基本類型信息組合來完成,這種數(shù)據(jù)我們稱之為“結(jié)構(gòu)體”,那么結(jié)構(gòu)體在使用時我們應(yīng)該注意哪些事項呢?04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.3結(jié)構(gòu)體二技能點分析1.結(jié)構(gòu)體類型2.結(jié)構(gòu)體與函數(shù)3.結(jié)構(gòu)體數(shù)組學習目標1.什么是結(jié)構(gòu)體?2.如何聲明結(jié)構(gòu)體?3.結(jié)構(gòu)體變量訪問有哪些方式?4.如何定義結(jié)構(gòu)體數(shù)組?學期預(yù)習04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.3結(jié)構(gòu)體C數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結(jié)構(gòu)是C編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許您存儲不同類型的數(shù)據(jù)項。結(jié)構(gòu)用于表示一條記錄,假設(shè)您想要跟蹤圖書館中書本的動態(tài),您可能需要跟蹤每本書的下列屬性:標題作者小標題出版號……struct結(jié)構(gòu)體類型名稱{

數(shù)據(jù)類型

成員1;

數(shù)據(jù)類型

成員2;

數(shù)據(jù)類型

成員n;}變量1,…變量n;三技能點詳解——結(jié)構(gòu)體三技能點詳解——1結(jié)構(gòu)體類型聲明(1)結(jié)構(gòu)體類型聲明以關(guān)鍵字struct開頭,后面跟的是結(jié)構(gòu)體類型的名稱,該名稱的命名規(guī)則與變量名相同;(2)結(jié)構(gòu)體類型與整型、浮點型、字符型等類似,只是數(shù)據(jù)類型,而非變量。(3)聲明好一個結(jié)構(gòu)體類型后,編譯器并不為其分配內(nèi)存。structBook{

chartitle[250]; //書的標題

charauthor[250]; //書的作者

charsubject[200]; //書的主題

int

bookid; //書的出版號}三技能點詳解——2結(jié)構(gòu)體變量定義1)先聲明結(jié)構(gòu)體類型,再聲明結(jié)構(gòu)體變量,例如:structBookbk1={“C語言編程”,“王教授”,“入門技術(shù)”,20220001},bk2={“BASIC語言編程”,“張教授”,“高級技術(shù)”,20220002};三技能點詳解——2結(jié)構(gòu)體變量定義2)在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量structBook{

chartitle[250]; //書的標題

charauthor[250]; //書的作者

charsubject[200]; //書的主題

int

bookid; //書的出版號}bk1,bk2; //Book類型變量bk1,bk2三技能點詳解——2結(jié)構(gòu)體變量定義3)結(jié)構(gòu)體變量初始化結(jié)構(gòu)體變量初始化的方式和其他類型變量沒有太多區(qū)別,主要有兩種,就是先聲明后初始化和定義事同時初始化兩種形式/*聲明結(jié)構(gòu)體變量的同時對其進行初始化*/structBook{

chartitle[250];

charauthor[250];

charsubject[200];

int

bookid;

}bk1={“c語言編程”,”王教授”,”入門技術(shù)”,20220001};/*使用聲明后的結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量并對結(jié)構(gòu)體變量初始化*/structBookbk2={“BASIC語言編程”,”張教授”,”高級技術(shù)”,202200022};三技能點詳解——2結(jié)構(gòu)體變量定義4)結(jié)構(gòu)體數(shù)組的訪問定義并初始化結(jié)構(gòu)體變量的目的是使用結(jié)構(gòu)體變量中的成員。在C語言中,訪問結(jié)構(gòu)體變量中成員的方式如下所示:結(jié)構(gòu)體變量名.成員名例如訪問上述定義的structstudentstu變量中的成員:/*聲明結(jié)構(gòu)體變量bk1,bk2,并對bk2初始化*/structBookbk1,bk2={“BASIC語言編程”,”張教授”,”高級技術(shù)”,202200022};/*通過bk1.titlel訪問結(jié)構(gòu)體的成員值賦值給bk1.title*/bk1.title=bk1.titlel;

三技能點詳解——案例1/***************************************利用結(jié)構(gòu)體類型編制一程序,實現(xiàn)輸入一個學生*的數(shù)學期中和期末成績。**************************************/#include

<stdio.h>voidmain(){structstudy{intmid;

intend;

intaverage; }math; printf("%s","請輸入學生的期中和期末數(shù)學成績:"); scanf("%d%d",&math.mid,&math.end); math.average=(math.mid+math.end)/2; printf("學生的期中和期末數(shù)學平均成績是=%d\n",math.average);}三技能點詳解——案例2

實例4.3.2

/*******************************************建立一個帶有頭結(jié)點的單向鏈表,鏈表結(jié)點中的數(shù)據(jù)*通過鍵盤輸入,當輸入數(shù)據(jù)為-1時,表示輸入結(jié)束。*鏈表表空的條件是ph->next=’\0’)。******************************************/#include

<stdio.h>#include

<stdlib.h>//定義一個單向鏈表類型結(jié)構(gòu)體,其中一個是int數(shù)值成員,另一個next是指針,用于指向下一個結(jié)點元素

structlist{

intdata; //儲存數(shù)據(jù)的字段

structlist*next; //指向下一個structlist類型數(shù)據(jù)的指針

};

structlist*creatlist() /定義一個

structlist型指針函數(shù)creatlist(){structlist*p,*q,*ph;

inta;

/************************************************malloc()用于分配一個structlist類型存儲空間,并*返回空間的地址存儲在ph中********************************************/ph=(structlist*)malloc(sizeof(structlist));/********************************************創(chuàng)建單向鏈表,ph記錄頭指針,p記錄新創(chuàng)建的節(jié)點,*q記錄尾部節(jié)點*******************************************/p=q=ph; printf("輸入整數(shù),輸入–1結(jié)束輸入

:\n");scanf("%d",&a); //輸入一個數(shù)據(jù)存儲在a中

if(a!=-1) //如果第一個數(shù)不是-1,開始創(chuàng)建鏈表

{ph->data=a; //輸入數(shù)據(jù)存儲在a中

ph->next='\0'; //節(jié)點的next指針置為空'\0'三技能點詳解——案例2

scanf("%d",&a);

while(a!=-1) //如果輸入的數(shù)不是-1,繼續(xù)創(chuàng)建鏈表 /*malloc()分配一個structlist類型存儲空間作為新節(jié)點,地址存儲在p中*/{p=(structlist*)malloc(sizeof(structlist)); p->data=a; //a賦值給新創(chuàng)建的鏈表節(jié)點的data成員中

q->next=p; //q節(jié)點的next指針指向新創(chuàng)建的節(jié)點

q=p; //q指針移動新創(chuàng)建的節(jié)點上,作為新的尾部節(jié)點

scanf("%d",&a); } p->next='\0'; //最后一個節(jié)點的next指針置為空'\0'

}

return(ph); //返回ph中的地址作為函數(shù)的返回值

}voidmain(){structlist*head,*p;head=creatlist(); p=head;

while(p!='\0') //通過p指針的移動訪問、輸出列表中的數(shù)據(jù)成員的值

{ printf("%d",p->data); p=p->next; //p指針的移動到下一個節(jié)點

};}04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.2指針四技能點拓展——1結(jié)構(gòu)體與函數(shù)在函數(shù)間不僅可以傳遞簡單的變量、數(shù)組、指針等類型的數(shù)據(jù),還可以傳遞結(jié)構(gòu)體類型的數(shù)據(jù)。結(jié)構(gòu)體變量作為函數(shù)參數(shù)的用法與普通變量類似,都需要保證調(diào)用函數(shù)的實參類型和被調(diào)用函數(shù)的形參類型相同??梢园呀Y(jié)構(gòu)作為函數(shù)參數(shù),傳參方式與其他類型的變量或指針類似。函數(shù)間不僅可以傳遞一般的結(jié)構(gòu)體變量,還可以傳遞結(jié)構(gòu)體數(shù)組。使用結(jié)構(gòu)體數(shù)組作為函數(shù)參數(shù)傳遞數(shù)據(jù)。四技能點拓展——2

typedef的使用C語言提供了typedef關(guān)鍵字,您可以使用它來為類型取一個新的名字。例如前面所學過的結(jié)構(gòu)體、指針、數(shù)組、int、double等都可以使用typedef關(guān)鍵字為它們另取一個名字。使用typedef關(guān)鍵字可以方便程序的移植,減少對硬件的依賴性?;居梅ㄈ缦聇ypedef數(shù)據(jù)類型別名;四技能點拓展——3

指向結(jié)構(gòu)的指針結(jié)構(gòu)體指針變量用于存放結(jié)構(gòu)體變量的首地址,所以將指針作為函數(shù)參數(shù)傳遞時,其實就是傳遞結(jié)構(gòu)體變量的首地址。案例4.3.2的creatlist()函數(shù)設(shè)計中,就利用函數(shù)傳遞了structlist*類型的指針數(shù)據(jù)。04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.2指針五技能點檢測完成課堂任務(wù),在線提交;完成技能檢測,在線提交;C語言程序設(shè)計基礎(chǔ)與實踐模塊四編程高級應(yīng)用任務(wù)4.4枚舉和共用體C語言程序設(shè)計基礎(chǔ)與實踐課程組04技能點拓展03技能點詳解02技能點分析目錄CONTENTS任務(wù)4.4枚舉和共用體01問題引入05技能點檢測一問題引入有一類團體型的數(shù)據(jù)集合,比如一周7天的名稱,天干地支名稱,這些名稱往往是組團使用的,或者有些特殊使用場合的信息。這類信息在C語言里可以使用自定義的枚舉型來進行組織設(shè)計。此外,現(xiàn)實生活中,我們裝很多東西時,一般是用大箱子裝大東西,小箱子裝小東西,但是也有些時候我們只需要裝一個東西,但是不確定要裝的東西是多大,我們就準備一個大箱子,小的可以裝,大的也可以裝,這樣就不必準備大大小小的多個箱子。這類信息在C語言里可以使用共用體來進行組織設(shè)計。那么枚舉和共用體在使用時有哪些注意事項呢?04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.4枚舉和共用體二技能點分析1.枚舉和共用體類型2.枚舉的遍歷3.共用體的定義與使用4.訪問共用體成員學習目標1.什么是枚舉?2.枚舉可以遍歷么?3.什么是共用體?4.結(jié)構(gòu)體和共用體的區(qū)別?學期預(yù)習04技能點拓展03技能點詳解02技能點分析目錄CONTENTS01問題引入05技能點檢測任務(wù)4.4枚舉和共用體枚舉是C語言中的一種基本數(shù)據(jù)類型,它可以讓數(shù)據(jù)更簡潔,更易讀。第一個枚舉成員的默認值為整型的0,后續(xù)枚舉成員的值在前一個成員上加1。共用體是一種特殊的數(shù)據(jù)類型,允許您在相同的內(nèi)存位置存儲不同的數(shù)據(jù)類型。您可以定義一個帶有多成員的共用體,但是任何時候只能有一個成員帶有值。共用體提供了一種使用相同的內(nèi)存位置的有效方式。三技能點詳解——1枚舉類型定義與使用枚舉語法定義格式為:enum枚舉名{枚舉元素1,枚舉元素2,……};enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};第一個枚舉成員的默認值為整型的0,后續(xù)枚舉成員的值在前一個成員上加1。我們在這個實例中把第一個枚舉成員的值定義為1,第二個就為2,enumDAY{MON,TUE,WED=7,THU,FRI,SAT,SUN};前面我們只是聲明了枚舉類型,接下來我們看看如何定義枚舉變量。我們可以通過以下三種方式來定義枚舉變量。(1)先定義枚舉類型,再定義枚舉變量enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN};enumDAYday;(2)定義枚舉類型的同時定義枚舉變量enumDAY{MON=1,TUE,WED,THU,FRI,SAT,SUN}day;(3)省略枚舉名稱,直接定義枚舉變量enum

{MON=1,TUE,WED,THU,FRI,SAT,SUN}day1;三技能點詳解——2共用體類型定義1)先聲明公用體類型,再聲明公用體變量定了定義共用體,您必須使用union語句,方式與定義結(jié)構(gòu)類似。union語句定義了一個新的數(shù)據(jù)類型,帶有多個成員。union語句的格式如下:union

共用體類型名稱{

數(shù)據(jù)類型

成員名1;

數(shù)據(jù)類型

成員名2;……

數(shù)據(jù)類型

成員名n;};unionData{int

i;floatf;charstr[20];}; //定義共用體DataunionDatad1; //定義一個unionData類型變量d1三技能點詳解——2共用體類型定義2)在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量unionData{int

i;floatf;charstr[20];}d1; //定義共用體unionData同時定義變量d13)共用體成員的訪問與使用為了訪問共用體的成員,我們使用成員訪問運算符(.)。成員訪問運算符是共用體變量名稱和我們要訪問的共用體成員之間的一個句號。共用體變量名.成員名三技能點詳解——2共用體類型定義在下面的例子中,我們會發(fā)現(xiàn)最先被訪問和賦值的d1.i和d1.f是無法打印出來的,因為我們最后訪問和賦值的d1.str把之前訪問并賦值的成員數(shù)據(jù)都給覆蓋了。#include

"stdio.h"#include

"string.h"unionData{

int

i;

floatf;

chars[100];};intmain(){unionDatad1; //定義共用體unionData變量datad1.i=10; //訪問成員i并賦值d1.f=100.0; //訪問成員f并賦值

strcpy(d1.s,"C程序設(shè)計"); //訪問成員str

printf("d1.i:%d\n",d1.i);

printf("d1.f:%f\n",d1.f);

printf("d1.s:%s\n",d1.str);

return0;}三技能點詳解——案例圖4.4.1共用體變量d1的內(nèi)部結(jié)構(gòu)

#include

<stdio.h>#include

<stdlib.h>intmain(){/*聲明一個包括3個英文顏色的enumcolor數(shù)據(jù)類型*/enumcolor{red=1,green,blue};

enumcoloruser_color; printf("請輸入你喜歡的顏色:(1.red,2.green,3.blue):");scanf("%u",&user_color);

switch(user_color)

{

casered: //此處red=1printf("OK!喜歡的顏色是:紅色");

break;

casegreen: //此處green=2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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

提交評論