C語言程序設計 第3版 課件 丁紅 第8、9章 數(shù)組、指針_第1頁
C語言程序設計 第3版 課件 丁紅 第8、9章 數(shù)組、指針_第2頁
C語言程序設計 第3版 課件 丁紅 第8、9章 數(shù)組、指針_第3頁
C語言程序設計 第3版 課件 丁紅 第8、9章 數(shù)組、指針_第4頁
C語言程序設計 第3版 課件 丁紅 第8、9章 數(shù)組、指針_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

一維數(shù)組二維數(shù)組字符數(shù)組第八章數(shù)組具有相同數(shù)據(jù)類型的若干個有序數(shù)據(jù)的集合1、數(shù)組的概念2、數(shù)組的分類8.1一維數(shù)組實例導入從鍵盤輸入10個學生的成績,要求能夠求出總分和平均分。解析:1、定義一個一維數(shù)組score[10];2、定義總分sum,平均分average;3、向一維數(shù)組score[10]中輸入數(shù)據(jù);4、求出sum和average;5、輸出sum和average.一、一維數(shù)組的定義一維數(shù)組定義的一般形式:類型說明符數(shù)組名[常量表達式];

例:floats[8];longt[10];S[0]S[1]S[2]S[3]S[4]S[5]S[6]S[7]t[0]t[1]t[2]t[3]t[4]t[5]t[6]t[7]t[8]t[9]二、一維數(shù)組的初始化例:floats[6];S[0]S[1]S[2]S[3]S[4]S[5]如何給數(shù)組s賦一組初始值{65.5,89.2,90,89.8,45.5,60}1、依次賦值。s[0]=65.5;s[1]=89.2;s[2]=90;s[3]=89.8;s[4]=45.5;s[5]=60;2、全體賦值。s[6]={65.5,89.2,90,89.8,45.5,60}3、定義時賦值s[]={65.5,89.2,90,89.8,45.5,60}4、省略型賦值s[6]={65.5,89.2,0,0,0,0}s[6]={65.5,89.2}三、一維數(shù)組元素的引用例:floats[6];658990894560S[0]S[1]S[2]S[3]S[4]S[5]一維數(shù)組元素引用的一般形式:數(shù)組名[下標]四、一維數(shù)組實訓實訓1:有8個整數(shù){89,88,67,23,45,54,0,0},要求編程求出這8個整數(shù)的和、平均值、最大值和最小值。floatnum[8];num[8]={89,88,67,23,45,54,0,0};sum=0;sum=sum+num[0];sum=sum+num[1];sum=sum+num[2];sum=sum+num[3];sum=sum+num[4];sum=sum+num[5];sum=sum+num[6];sum=sum+num[7];for(i=0;i<8;i++)sum=sum+num[i];average=sum/8;max=num[0];min=num[0];for(i=0;i<8;i++)If(num[i]>max)max=num[i];If(num[i]<min)min=num[i];for(i=0;i<8;i++)sum=sum+num[i];average=sum/8;printf(“sum=%f,average=%.1f,max=%.1f,min=%.1f”,sum,average,max,min);},sum,max,min,average;main(){}例1:一維數(shù)組的輸入和輸出定義一個整型數(shù)組arr[10],向其中輸入10個數(shù)據(jù)并依次輸出main(){intarr[10];inti;for(i=0;i<10;i++)scanf(“%d”,&arr[i]);printf(“\n該一維數(shù)組為”:);for(i=0;i<10;i++)printf(“%5d”,arr[i]);}循環(huán)實現(xiàn)一維數(shù)組的輸入循環(huán)實現(xiàn)一維數(shù)組的輸出例2:一維數(shù)組的排序定義一個整型數(shù)組arr[10],向其中輸入10個數(shù)據(jù)并按照從小到大的順序依次輸出main(){intarr[10];inti;for(i=0;i<10;i++)scanf(“%d”,&arr[i]);for(i=0;i<10;i++)for(j=i+1;j<10;j++)if(arr[j]<arr[i]){t=arr[j];arr[j]=arr[i];arr[i]=t;}printf(“排序后的數(shù)組為:\n”);for(i=0;i<10;i++)printf(“%5d”,arr[i]);}冒泡排序main(){intarr[10];inti;for(i=0;i<10;i++)scanf(“%d”,&arr[i]);for(i=0;i<10;i++)for(j=i+1;j<10;j++)if(arr[j]<arr[i]){t=arr[j];arr[j]=arr[i];arr[i]=t;}printf(“排序后的數(shù)組為:\n”);for(i=0;i<10;i++)printf(“%5d”,arr[i]);}插入排序8.2二維數(shù)組一、二維數(shù)組的定義floatscore[2][10];上一頁010123456789score[0][0]score[1][3]score[0][6]二維數(shù)組定義的一般形式:類型說明符數(shù)組名[常量表達式][常量表達式];二、二維數(shù)組元素的初始化例:現(xiàn)有一個二維數(shù)組s[3][4],如何實現(xiàn)將以下數(shù)據(jù)賦給s:1120580034558901、按行賦值score[3][4]={{1,1,2,0},{5,8,0,0},{34,55,89,0}};score[][4]={{1,1,2},{5,8},{34,55,89}};2、全部賦值score[3][4]={1,1,2,0,5,8,0,0,34,55,89,0};score[3][4]={1,1,2,0,5,8,0,0,34,55,89};3、數(shù)組元素的引用上一頁二維數(shù)組元素的引用形式為:數(shù)組名[下標][小標];二維數(shù)組使用實訓實訓1:

定義一個5行6列的二維整型數(shù)組s,向其中輸入數(shù)據(jù),并按行輸出.解析:1、定義一個二維數(shù)組s;2、向其中輸入5行6列30個數(shù)據(jù)3、輸出這5行6列30個數(shù)據(jù)main(){ints[5][6];inti,j;for(i=0;i<5;i++)for(j=0;j<6;j++)scanf("%d",&s[i][j]);for(i=0;i<5;i++)for(j=0;j<6;j++)printf("%4d",s[i][j]);

}printf(“\n”);printf(“請輸入第%d行數(shù)據(jù):\n”,i);實訓2:數(shù)據(jù)的查找現(xiàn)有一個二維數(shù)組num,其初始值如下num[3][6]={{3,4,11,12,14,19},{21,20,14,18,30,23},{43,2,23,45,42,1}};要求從鍵盤輸入一個數(shù)據(jù)number,在數(shù)組num中進行查找,假如該數(shù)存在,就輸出該數(shù)和其所在的行數(shù)和列數(shù);假如不存在,就輸出”Nothisnumber!”floatnum[3][6],number;inti,j;scanf(“%d”,&number);for(i=0;i<3;i++)for(j=0;j<6;j++)If(num[i][j]==number){printf("%d,%d,%d\n",number,i,j);break;}If(i>3)printf(“Nothisnumber!”);

}main(){

有一個二維數(shù)組,編寫一程序,求該二維數(shù)組兩對角線的和,并找出該二維數(shù)組中的最大值和最小值及其所在位置。

如該二維數(shù)組為:

34121510

789087

801910021

45233543

則程序運行結果為:和為260,最大值為100,位于第2行第2列。最小值為0,位于第1行第2列。實訓3思考1:編寫一個程序,實現(xiàn)這樣的功能,從鍵盤輸入一個二維數(shù)組S[3][4]后,可以實現(xiàn)將該二維數(shù)組中的每個數(shù)組元素的值加5。比如當輸入的二維數(shù)組如下:

123456789101112

則轉換后輸出的二維數(shù)組為:

67891011121314151617算法描述:1、定義二維數(shù)組S[3][4];2、向二維數(shù)組中輸入數(shù)值3、將轉換前的二維數(shù)組輸出來4、使每個數(shù)組元素的值增55、將轉換后的二維數(shù)組輸出來ints[3][4];for(i=0;i<3;i++)for(j=0;j<4;j++)scanf(“%d”,&s[i][j]);for(i=0;i<3;i++){for(j=0;j<4;j++)printf(“%5d”,s[i])[j]);s[i][j]=s[i][j]+5;printf(“\n”);}for(i=0;i<3;i++){for(j=0;j<4;j++)printf(“%5d”,s[i][j]);printf(“\n”);}main(){}ints[3][4];for(i=0;i<3;i++)for(j=0;j<4;j++)scanf(“%d”,&s[i][j]);for(i=0;i<3;i++){for(j=0;j<4;j++)printf(“%5d”,s[i])[j]);printf(“\n”);}for(i=0;i<3;i++)for(j=0;j<4;j++)s[i][j]=s[i][j]+5;for(i=0;i<3;i++){for(j=0;j<4;j++)printf(“%5d”,s[i][j]);printf(“\n”);}inti,j;main(){}上一頁inti,j;

編寫一個程序,實現(xiàn)這樣的功能,從鍵盤輸入一串字符信息后,可以實現(xiàn)將該串字符信息按照一定的方式轉換為密文。比如當輸入“Meet”

如果轉換密鑰為5,則字符串中的每個字符都轉換為其后面的第5個字符.

轉換后的字符串為:Rjjy

編程實現(xiàn)當輸入一段字符后,并輸入密鑰,則按照密鑰將所輸入的字符串轉化為一段密文并輸出.思考2:跳轉8.3字符數(shù)組一、字符數(shù)組的定義charmingwen[500],miwen[500];字符數(shù)組定義的一般形式:char數(shù)組名[常量表達式];二、字符數(shù)組元素的引用第i個元素的引用形式:數(shù)組名[i];三、字符數(shù)組的初始化1、逐個字符賦值例:charname[20];name[20]={‘Z’,’h’,’a’,’n’,’g’,’L’,’e’,’i’‘};2、以字符串方式賦值例:charname[20];name[20]={“ZhangLei”};name[20]=“ZhangLei”;注意:存儲時,在末尾自動填‘\0’作為字符串結束標志.四、字符數(shù)組的輸入和輸出1、輸入1)逐個字符輸入例:現(xiàn)在需要向字符數(shù)組score[10]中輸入內容,并將內容輸出來.該如何實現(xiàn).for(i=0;i<10;i++)scanf(“%c”,&score[i]);2)一次性輸入scanf(“%s”,score);2、輸出1)逐個字符輸出for(i=0;i<10;i++)printf(“%c”,score[i]);2)一次性輸出printf(“%s”,score);返回思考思考:從鍵盤輸入一段字符,并能夠統(tǒng)計出這段字符的個數(shù)。main(){charstr[200],len,i;printf(“請輸入一段英文字符:”);scanf(“%s”,str);len=0;i=0;while(str[i]!=‘\0’)len++;printf(“該段字符所包含的字符個數(shù)為:%d”,len);}gets(str);五、常用的字符串處理函數(shù)1、puts函數(shù):字符串輸出函數(shù)一般使用形式:puts(字符數(shù)組);例:charname[]=“Liu’an”;puts(name);

2、gets函數(shù):字符串輸入函數(shù)一般使用形式:gets(字符數(shù)組);例:charname[15];gets(name);3、strcat函數(shù)一般使用形式:strcat(數(shù)組1,數(shù)組2);charsurname[15]=“Zhang”;

charfirstname[]=“Lin”;Zhang

Lin\0\0\0\0\0\0連接后的結果strcat(surname,firstname);4、strcpy函數(shù)一般使用形式:strcpy(數(shù)組1,數(shù)組2);charsurname[15]=“Zhang”;

charfirstname[]=“Lin”;Lin\0g\0\0\0\0\0\0\0\0\0\0連接后的結果strcpy(surname,firstname);5、strcmp函數(shù)一般使用形式:strcmp(數(shù)組1,數(shù)組2);charsurname[15]=“Zhang”;

charfirstname[]=“Lin”;比較的結果大于0strcmp(surname,firstname);6、strlen函數(shù)一般使用形式:strlen(數(shù)組);charsurname[15]=“Zhang”;測量的是字符串所占的實際長度,為5.strlen(surname);7、strlwr函數(shù)一般使用形式:strlwr(數(shù)組1);用于把字符串中的大寫形式轉換為小寫8、strupr函數(shù)一般使用形式:strupr(數(shù)組1);用于把字符串中的小寫形式轉換為大寫注意:當使用到字符串處理函數(shù)時,需要在函數(shù)前加

#include”string.h”;

當使用到字符串輸入/輸出函數(shù)時,加

#include”stdio.h”綜合練習

有5個字符串,編寫一個程序,可以實現(xiàn)對這5個字符串進行從大到小的排序。字符串由鍵盤輸入。第九章指針下一頁長度為8個比特的存儲空間1、存儲單元2、地址每個存儲單元的地址編號

注意:變量名、變量值、變量地址的區(qū)別。例:inta=3;3、指針就是地址4、變量的指針就是變量的地址5、指針變量用來存放其他變量地址(指針)的變量返回9.1變量的定義和使用實例:

定義一個指針變量,該指針變量用來存放整型變量a的地址。向變量a中輸入數(shù)據(jù)并將數(shù)據(jù)輸出來。跳轉問題1:如何定義一個指針變量?問題2:如何將整型變量a的地址賦給指針變量p呢?問題3:如何向指針變量p所指向的變量a中輸入和輸出數(shù)據(jù)呢?一、指針變量的定義指針變量定義的一般形式:基類型*指針變量名int*p;p例如:float*p;char*p;上一頁二、指針變量的初始化int*p;pinta;aint*p=&a;或p=&a;&ap和a的關系:

指針變量p指向變量a;注意:

賦值時,只能將地址值賦給指針變量;而且指針變量和它所指向的變量的類型應該一致.上一頁三、指針變量的使用方法1:直接使用變量a的方法scanf(“%d”,&a);方法2:

間接使用指針變量p的方法scanf(“%d”,p);輸入方法1:

直接使用變量a的方法printf(“%d”,a);方法2:

間接使用指針變量p的方法printf(“%d”,*p);輸出返回上一頁main(){inta;int*p;p=&a;scanf(“%d”,p);printf(“%d”,*p);int*p=&a;或int*p;*p=a;scanf(“%d”,&a);或scanf(“%d”,a);或注意:1、&是地址運算符,取變量的地址;*是指針運算符,取地址單元中的值。

2、如果指針變量p指向普通變量a,則*p等價于a;p等價于&a;實訓1下面程序的結果是什么?main(){inta,b;int*p,*q;p=&a;q=&b;*p=3;*&b=4;printf("%d,%d,%d,%d",a,b,*p,*q);}結論:

&和*運算符的優(yōu)先級相同,結合方向為自右而左。實訓2如果從鍵盤輸入34和54,下面這個程序的輸出結果是什么?main(){int*p1,*p2,*p;inta,b;p1=&a;p2=&b;scanf("%d%d",p1,p2);if(a<b){p=p1;p1=p2;p2=p;}printf("a=%d,b=%d\n",a,b);printf("*p1=%d,*p2=%d\n",*p1,*p2);}關于指針的幾個思考1、*p1+1和p1+1的區(qū)別是什么?2、*p1-*p2和p1-p2的區(qū)別是什么?int*p1,*p2;3、p1>p2和*p1>*p2的區(qū)別是什么?四、指針變量作為函數(shù)參數(shù)從一個例子開始:判斷下面程序的結果是什么?swap(int*p,int*q)/*交換功能函數(shù)swap*/{ints;s=*p;*p=*q;*q=s;}main()/*主函數(shù)main*/{int*p1,*p2;inta,b;p1=&a;p2=&b;scanf("%d%d",p1,p2);if(a<b)swap(p1,p2);/*調用函數(shù)swap*/printf("%d,%d\n",a,b);printf("%d,%d\n",*p1,*p2);}結論:

當實參和形參是指針變量時,在函數(shù)的調用中,實參傳遞給形參的是地址,在子函數(shù)中,使形參所指向的變量的值發(fā)生了變化,函數(shù)調用結束后,這些變化了的變量值依然保留了下來,從而在main中使用的就是這些已經(jīng)改變了的變量值。swap(int*p,int*q){int*s;s=p;p=q;q=s;}

main(){int*p1,*p2;inta,b;p1=&a;p2=&b;scanf("%d%d",p1,p2);if(a<b)swap(p1,p2);printf("%d,%d\n",a,b);printf("%d,%d\n",*p1,*p2);}p1p2ab&a&b當輸入98和109時,輸出結果為什么?98109pq&a&bs&a&b&a復習9.2指針和一維數(shù)組例:int*p;inta;p=&a;paintnum[8];int*p;num[0]num[1]num[2]num[3]num[4]num[5]num[6]num[7]p如何使指針p指向數(shù)組num呢?一、指向數(shù)組元素的指針intnum[8];int*p;pnum[0]num[1]num[2]num[3]num[4]num[5]num[6]num[7]1、使指針指向數(shù)組元素num[0]p=&num[0];2、使指針指向數(shù)組元素num[1]p=&num[1];3、使指針指向數(shù)組元素num[i]p=&num[i];p=num;二、通過指針引用數(shù)組元素pnum[0]num[1]num[2]num[3]num[4]num[5]num[6]num[7]已知p=num;1、p+1表示使指針指向num[1],則*(p+1)表示數(shù)組元素num[1]的值2、p+i表示使指針指向num[i],則*(p+i)表示數(shù)組元素num[i]的值3、p+i等價于num+i、&num[i]、&p[i];4、*(p+i)等價于*(num+i)、num[i]、p[i];p三、數(shù)組和指針使用實訓實訓1下面這個程序的功能是使用指針來實現(xiàn)數(shù)組的輸入和輸出。請在程序的空白處填入合適的內容。main(){ints[10],*p,i;

for(i=0;i<10;i++)scanf("%d",p++);for(i=0;i<10;i++)printf("%5d",*p++);}_x001A_p=s;p=s;main(){ints[10],*p;for(p=s;p<s+10;p++)scanf("%d",p);for(p=s;p<s+10;p++)printf("%5d",*p);}_x001A_另一種寫法:

下面這個程序的功能是實現(xiàn)將一維數(shù)組s[12]升序排列,在在程序空白處填入合適內容.實訓2main(){ints[12],num,i,j;int*p;

for(i=0;i<12;i++)scanf("%d",p+i);for(i=0;i<12;i++)for(j=i+1;j<12;j++)if(*(p+j)>*(p+i))

for(;;p++)printf("%5d",*p);}{num=*(p+j);*(p+j)=*(p+i);*(p+i)=num;}p=a;p=a;p<=&s[11];main(){ints[12],num;int*p1,*p2;for(p1=s;p1<s+12;p1++)scanf("%d",p1);for(p1=s;p1<s+12;p1++)for(p2=p1+1;p2<s+12;p2++)if(*p2<*p1){num=*p1;*p1=*p2;*p2=num;}for(p1=s;p1<s+12;p1++)printf("%5d",*p1);}另一種編寫方法小結如果ints[10],*p;

p=s;1、p和s都表示數(shù)組元素的首地址。2、指向數(shù)組的指針p可以移動,如p++表示使p下移指向下一個元素。而s不可以移動。3、因為指針p可以移動,所以要隨時注意p的位置,如果需要使p重新指向第一個元素,則p=s4、*p++:等價于*(p++)表示先得到p指向的變量的值,然后使指針p加1指向下一個元素5、*(++p):先使指針p下移,指向下一個元素,然后取其所指向的變量的值9.3指針和二維數(shù)組示例:有一個二維數(shù)組s[3][4];S[3][4]={{12,14,11,1},{43,12,23,45},{34,43,32,12}};1214111s[0]43122345s[1]34433212s[2]1、s[0]表示第0行首地址

s[1]表示第1行首地址

s[2]表示第2行首地址2、第i行首地址可以表示為s[i],或*(s+i)或&s[i][0];3、二維數(shù)組名s表示二維數(shù)組第一行首地址。1214111s[0]43122345s[1]34433212s[2]4、第i行第j列元素的地址可以表示為:s[i]+j;*(s+i)+j;&s[i][j];5、第i行第j列元素的值可以表示為:*(s[i]+j);*(*(s+i)+j);*&s[i][j];那么如何使指針指向二維數(shù)組元素呢?一、指向二維數(shù)組元素的指針變量示例:有一個二維數(shù)組s[3][4];S[3][4]={{12,14,11,1},{43,12,23,45},{34,43,32,12}};1214111s[0]43122345s[1]34433212s[2]int*p;p=s;p1、P++表示使指針移向一下一個數(shù)組元素。p2、*p表示p所指向的數(shù)組元素中的值。3、第i行第j列元素的值可以表示為*(p+i*4+j)實訓1使用指針實現(xiàn)向二維數(shù)組中輸入輸出內容main(){intarray[4][5];int*p;for(p=array[0];p<;p++)scanf("%d",

);for(p=array[0];p<;p++)printf("%d",);}_x001A_方法1:方法2:main(

){intarray[4][5];inti,*p;p=array[0];for(i=0;i<20;i++,p++)scanf("%d",p);for(i=0;i<20;i++,p++)scanf("%d",*p);}_x001A_二、指向二維數(shù)組元素的行指針變量行指針變量:用來指向某一行元素,即一個一維數(shù)組的指針變量.12141114312234534433212int(*p)[4];pp=s;s1、行指針變量只能指向某一行,而不能具體指向某一個元素。2、p+i表示第i行元素的首地址。3、*(p+i)+j等價于*(s+i)+j,表示第i行第j列元素的地址.實訓3以下程序可分別求出方陣a中兩個對角線上元素之和,請在空白處填入合適的語句來完善程序。main(){inta[6][6],i,j,k,p1,p2;for(i=0;i<6;i++)for(j=0;j<6;j++)scanf("%d",*(a+i)+j);k=6;p1=0;p2=0;for(i=0;i<6;i++){p1=

+(*(*(a+i)+i));p2=

+(*(*(a+i)+k));}printf("p1=%4d,p2=%4d\n",p1,p2);}9.4指針和字符串例:charname[]=“SangDongLin”存

溫馨提示

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

評論

0/150

提交評論