C語(yǔ)言數(shù)組教學(xué)講義_第1頁(yè)
C語(yǔ)言數(shù)組教學(xué)講義_第2頁(yè)
C語(yǔ)言數(shù)組教學(xué)講義_第3頁(yè)
C語(yǔ)言數(shù)組教學(xué)講義_第4頁(yè)
C語(yǔ)言數(shù)組教學(xué)講義_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C語(yǔ)言數(shù)組教學(xué)講義內(nèi)容提要數(shù)組定義和基本操作;常用算法:求最大最小值、排序、查找等;用字符數(shù)組存取字符串;使用字符串處理函數(shù)處理字符串為什么引入數(shù)組保存大量同類型的相關(guān)數(shù)據(jù)如矩陣運(yùn)算,表格數(shù)據(jù)等一維數(shù)組(Array)的定義類型

數(shù)組名[長(zhǎng)度]; 長(zhǎng)度為常量表達(dá)式,不可以是變量(但C99提供了動(dòng)態(tài)數(shù)組)例:inta[10];定義一個(gè)有10個(gè)元素的數(shù)組,每個(gè)元素的類型均為int使用a[0]、a[1]、a[2]、……、a[9]這樣的形式訪問(wèn)每個(gè)元素。系統(tǒng)會(huì)在內(nèi)存分配連續(xù)的10個(gè)int空間給此數(shù)組a就是此數(shù)組的首地址intn=5;inta[n];×//長(zhǎng)度n不可以是變量一維數(shù)組(Array)的定義類型

數(shù)組名[長(zhǎng)度]; 長(zhǎng)度為常量表達(dá)式,不可以是變量(但C99提供了動(dòng)態(tài)數(shù)組)例:inta[10];定義一個(gè)有10個(gè)元素的數(shù)組,每個(gè)元素的類型均為int系統(tǒng)會(huì)在內(nèi)存分配連續(xù)的10個(gè)int空間給此數(shù)組a是數(shù)組名,同時(shí)也代表著此數(shù)組的首地址×//長(zhǎng)度n不可以是變量一維數(shù)組的初始化inta[5]={12,34,56,78,9};inta[5]={12};inta[]={12,34,56,78,9};123456789a[0]a[1]a[2]a[3]a[4]120000a[0]a[1]a[2]a[3]a[4]123456789a[0]a[1]a[2]a[3]a[4]×√√√一維數(shù)組的賦值數(shù)組賦值和普通變量賦值一樣只能逐個(gè)對(duì)數(shù)組元素進(jìn)行操作!不能整體賦值!切忌下標(biāo)越界!inta[4];for(i=0;i<4;i++)a[i]=2*i+1;√√×inta[4],b[4];……………;

a=b;

inta[4];a[0]=1;a[1]=3;a[2]=5;a[3]=7;//a和b是數(shù)組首地址,是地址常量//地址常量a不可以被賦值如何使兩個(gè)一維數(shù)組的值相等8inta[4]={1,2,3,4},b[4];方法1:逐個(gè)元素賦值b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];方法2:通過(guò)循環(huán)賦值

inti;for(i=0;i<4;i++)b[i]=a[i];一維數(shù)組的輸入和輸出inta[10],i=0;scanf(“%d”,&a[i]);//方法1:輸入第i個(gè)數(shù)組元素for(i=0;i<10;i++)scanf("%d",&a[i]);//方法2:循環(huán)輸入數(shù)組元素inta[10],i=0;printf(“%d”,a[i]);//方法1:輸出第i個(gè)數(shù)組元素for(i=0;i<10;i++)printf("%d",a[i]);//方法2:循環(huán)輸出數(shù)組元素耳聽(tīng)為虛,眼見(jiàn)為實(shí)一維數(shù)組在內(nèi)存中是連續(xù)存放的一維數(shù)組名就是此數(shù)組首元素的地址數(shù)組下標(biāo)越界的嚴(yán)重性證明:數(shù)組在內(nèi)存中是連續(xù)分布的;

數(shù)組名就是數(shù)組的首地址inti;inta[6]={1,3,5,7,9,11};for(i=0;i<=5;i++)printf("a[%d]的值是%2d,地址是%p\n",i,a[i],&a[i]);

printf(“a的size是%d\n”,sizeof(a));

printf(“a的值是%p\n”,a);//a是數(shù)組名,也是首元素的地址

//a的值和&a[0]的值相等后果很嚴(yán)重!下標(biāo)越界

inti,a[6];

for(i=1;i<=6;i++) { a[i]=0;

printf("a[%d]的值是%d\n",i,a[i]);

}

總是出現(xiàn)莫名其妙的錯(cuò)誤,且不容易被發(fā)現(xiàn)!越界下標(biāo)將訪問(wèn)數(shù)組以外的空間,可能帶來(lái)嚴(yán)重后果!C語(yǔ)言不提供下標(biāo)越界檢查,所以一定要注意!數(shù)組的使用數(shù)組的下標(biāo)都是從0開(kāi)始對(duì)數(shù)組每個(gè)元素的使用與普通變量無(wú)異可以用任意表達(dá)式作為下標(biāo),動(dòng)態(tài)決定訪問(wèn)哪個(gè)元素for(i=0;i<SIZE;i++)

a[i]=2*i;下標(biāo)越界是大忌!使用大于最大下標(biāo)的下標(biāo),將訪問(wèn)數(shù)組以外的空間。那里的數(shù)據(jù)是未知的,可能帶來(lái)嚴(yán)重后果sizeof可以用來(lái)獲得數(shù)組大小Fibonacci數(shù)列1,1,2,3,5,8,13,21,34,55…

兔子繁殖問(wèn)題(數(shù)組版)兔子問(wèn)題(數(shù)組版)#include<stdio.h>#defineYEAR_MONTH12intmain(){ intf[YEAR_MONTH+1]={0,1,1}; intmonth; for(month=3;month<=YEAR_MONTH;month++) { f[month]=f[month-1]+f[month-2]; } for(month=1;month<=YEAR_MONTH;month++) { printf("%d\t",f[month]); }

retuun0;}反轉(zhuǎn)并打印數(shù)組#include<……>#defineN10intmain(){inti,temp,a[N];srand(time(NULL));for(i=0;i<N;++i){a[i]=rand()%100;printf(“%3d",a[i]);}for(i=0;i<N/2;++i){temp=a[i];a[i]=a[N-1-i];a[N-1-i]=temp;}for(i=0;i<N;++i)printf(“%3d",a[i]);return0;}求數(shù)組最小元素及其所在下標(biāo)#defineN10…………inti,a[N];

imin=0;for(i=1;i<N;++i){if(a[i]<a[imin])imin=i;}printf("最小值是a[%d]:%3d\n",imin,a[imin]);求數(shù)組最小元素

及其所在下標(biāo)#include<……>#defineN10intmain(){inti,imin,a[N];srand(time(NULL));for(i=0;i<N;++i){a[i]=rand()%100;printf(“a[%d]是:%3d\n",i,a[i]);}

imin=0;for(i=1;i<N;++i){if(a[i]<a[imin])imin=i;}printf("最小值是a[%d]:%3d\n",imin,a[imin]);return0;}常用排序算法冒泡排序選擇排序a[0]9a[1]3a[2]5a[3]4a[4]2a[5]0395420359420354920354290354209a[0]3a[1]5a[2]4a[3]2a[4]0a[5]9354209345209342509342059第0輪第1輪Bubblesort#include<stdio.h>intmain(){ inta[10]={93,84,52,46,25,0,66,18,39,70},i,j,temp; for(j=0;j<9;j++) for(i=0;i<9-j;i++) { if(a[i]>a[i+1]) { temp=a[i];a[i]=a[i+1];a[i+1]=temp; } }

for(i=0;i<10;i++) printf("%3d",a[i]); return0;}選擇排序a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]532687409103268745610126874563第0輪第1輪第2輪iminiminiminiminiminiminiminimin選擇排序

for(i=0;i<n-1;i++){imin=i; for(j=i+1;j<n;j++){

if(a[j]<a[imin])記錄此輪參加比較的最小元素的下標(biāo)imin=j;

}

若imin不等于i,則

"交換a[imin]和a[i]",

}選擇排序

inta[10]={1,3,5,7,9,10,8,6,4,2}; inti,j,imin,temp; for(i=0;i<9;i++) { imin=i; for(j=i+1;j<10;j++) { if(a[j]<a[imin])imin=j; } if(imin!=i) { temp=a[i]; a[i]=a[imin]; a[imin]=temp; }} for(i=0;i<10;i++) printf("%3d",a[i]);

順序查找哈,找到了!a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9序查找{inta[N]=(1,3,5,7,9,2,4,6,8,10),xinti,find=0,pos=-1;for(i=0;i<10;i++){

if(a[i]==number){pos=i; find=1;}} if(find) printf(“找到了,位置是%d“,pos);

else printf(”未找到”);

}哈,找到了!順序查找#include<stdio.h>#defineN10intmain(){inta[N]={1,3,5,7,9,2,4,6,8,10},number;inti,find=0,pos=-1;

printf("請(qǐng)輸入要查找數(shù)據(jù):"); scanf("%d",&number);for(i=0;i<N;i++){if(a[i]==number){pos=i; find=1;}} if(find) printf("找到了,位置是%d",pos); else printf("未找到");return0;}折半查找(有序數(shù)組)a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]135791214161820第1次第2次第3次lowhigh135791214161820lowhigh135791214161820lowhighmid查找12成功!折半查找(有序數(shù)組)a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]135791214161820第1次第2次第3次lowhighmid135791214161820lowhighmid135791214161820lowhighmid折半查找(有序數(shù)組)a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]135791214161820第1次第2次第3次lowhighmid135791214161820lowhighmid135791214161820lowhighmid折半查找(有序數(shù)組)a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]135791214161820第1次第2次第3次lowhighmid135791214161820lowhighmid135791214161820lowhighmid第4次135791214161820lowhigh折半查找

inta[10]={1,3,5,7,9,12,14,16,18,20},number; intlow=0,high=9,mid,pos=-1,find=0 printf("請(qǐng)輸入要查找的數(shù):");scanf("%d",&number); while(low<=high) { mid=(low+high)/2; if(number>a[mid]) { low=mid+1; } elseif(number<a[mid]) { high=mid-1; } else { find=1; pos=mid; break; } } if(find) printf("找到了!位置是%d",pos); else printf("未找到");}二維數(shù)組的定義數(shù)據(jù)類型數(shù)組名[常量表達(dá)式][常量表達(dá)式];inta[2][3];a[0]a[1]a----a[0][0]a[0][1]a[0][2]----a[1][0]a[1][1]a[1][2]在c語(yǔ)言中,二維數(shù)組是數(shù)組的數(shù)組!二維數(shù)組的初始化int

b[2][3]={{1,2,3},{4,5,6}};按行賦值int

b[2][3]={1,2,3,4,5,6};按存放順序賦值int

b[][3]={1,2,3,4,5,6};行長(zhǎng)度可省,列長(zhǎng)度不能省int

b[2][3]={1,2,3,4};部分元素賦初值int

b[2][3]={{1,2,3,4},5,6};√√√√×二維數(shù)組的存儲(chǔ)結(jié)構(gòu)shortinta[2][3];a[0]a[1]a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]存放順序:按行存放先存放第0行的元素,再存放第1行的元素a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]二維數(shù)組是先行后列存放inti,j;shortinta[3][4];//注意:a是short整型for(i=0;i<3;i++) for(j=0;j<4;j++) { a[i][j]=4*i+j; printf("a[%d][%d]的值是:%2d“,”地址是:%p\n",i,j,a[i][j],&a[i][j]); }二維數(shù)組是數(shù)組的數(shù)組inti,j;shortinta[3][4];

for(i=0;i<3;i++){ printf("a[%d]的值是:%p" "size是:%d\n",i,a[i],sizeof(a[i]));}printf("a的值是:%p\n",a);

printf("a的size是:%d\n",sizeof(a));

二維數(shù)組的輸入和輸出數(shù)組的輸入和輸出只能逐個(gè)對(duì)數(shù)組元素進(jìn)行操作(字符數(shù)組例外)輸入方法:輸入第i行第j列元素:scanf(“%d”,&a[i][j]);輸入整個(gè)數(shù)組元素:for(i=0;i<2;i++)for(j=0;j<3;j++)scanf(“%d”,&a[i][j]);輸出方法:輸出第i行第j列元素:printf(“%d”,a[i][j]);輸出整個(gè)數(shù)組元素:for(i=0;i<2;i++)for(j=0;j<3;j++)printf(“%d”,a[i][j]);二維數(shù)組的輸入和輸出for(i=0;i<2;i++) for(j=0;j<3;j++)scanf(“%d”,&a[i][j]);//輸入for(i=0;i<2;i++) for(j=0;j<3;j++)printf(“%d”,a[i][j]);//輸出inta[2][3],i,j;只能逐個(gè)對(duì)數(shù)組元素進(jìn)行操作(字符數(shù)組例外)二維數(shù)組的最大值#include<stdio.h>intmain(){ inti,j,row=0,col=0; inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};row=0; col=0; for(i=0;i<=2;i++) for(j=0;j<=3;j++) { if(a[i][j]>a[row][col]) { row=i; col=j; } } printf("最大值為:%d",a[row][col]); return0;}#include<stdio.h>intmain(){inta[10][10];inti,j,k;for(i=0;i<10;i++){a[i][0]=1;a[i][i]=1;}for(i=2;i<10;i++){ for(j=1;j<i;j++)a[i][j]=a[i-1][j]+a[i-1][j-1];}for(i=0;i<10;i++){ for(j=0;j<=i;j++) printf("%6d",a[i][j]);printf("\n");}return0;}111121133114641……………楊輝三角形例:輸出10行揚(yáng)輝三角形。intmain(){inta[10][10];inti,j;for(i=0;i<10;i++){a[i][0]=1;a[i][i]=1;}for(i=0;i<10;i++){for(j=1;j<i;j++)

/*0,1兩行不用計(jì)算,j循環(huán)不執(zhí)行*/

a[i][j]=a[i-1][j]+a[i-1][j-1];

/*上一行的同列元素與前一列元素之和*/

for(j=0;j<=i;j++) printf("%5d",a[i][j]);printf("\n");}}111121133114641……………字符數(shù)組與字符串(String)字符數(shù)組數(shù)組每個(gè)元素都是字符類型charstring[5]={’h’,’e’,’l’,’l’,’o’};字符串以‘\0’結(jié)尾的字符數(shù)組(在c語(yǔ)言中)charstring[6]={’h’,’e’,’l’,’l’,’o’,’\0’};C語(yǔ)言使用字符數(shù)組實(shí)現(xiàn)字符串字符串的初始化用字符初始化charstr[6]={'C','h','i','n','a','\0'};用字符串常量初始化charstr[6]={"China"};charstr[6]="China";charstr[]="China";“China”是字符串常量,系統(tǒng)自動(dòng)添加‘\0’字符China\0str[0]str[1]str[2]str[3]str[4]str[5]China\0str[0]str[1]str[2]str[3]str[4]str[5]字符數(shù)組的賦值只能逐個(gè)對(duì)字符數(shù)組元素進(jìn)行操作!切忌下標(biāo)越界!chara[4];for(i=0;i<4;i++)a[i]=‘a(chǎn)’+i;√√chara[4],b[4];

chara[4];a[0]=‘a(chǎn)’;a[1]=‘b’;…………

a=b;

//a是數(shù)組首地址,是地址常量,不能賦值×字符數(shù)組的賦值字符串輸入函數(shù)gets()也沒(méi)有提供限制輸入字符串長(zhǎng)度的方法,容易引起緩沖區(qū)溢出,給黑客攻擊以可乘之機(jī)對(duì)輸入字符串長(zhǎng)度有限制的函數(shù)調(diào)用fgets(buf,sizeof(buf),stdin);scanf("%s",str);printf("%s",str);charstr[10];字符串的輸入輸出

gets(str);puts(str);gets可以輸入帶空格的字符串scanf(“%s”,str)將遇到空格或回車鍵停止讀入字符串注意字符長(zhǎng)度越界,引起緩沖區(qū)溢出for(i=0;i<10;i++){str[i]=getchar();putchar(str[i]);}scanf("%s",str);printf("%s",str);charstr[10];字符數(shù)組和字符串的輸入輸出

gets(str);puts(str);字符數(shù)組輸入輸出字符串輸入輸出for(i=0;i<10;i++){scanf("%c",str[i]);printf("%c",str[i]);}#include<stdio.h>intmain(){ charstr1[50],str2[50]; printf("調(diào)用gets()函數(shù)輸入字符串:\n"); gets(str1); printf("輸入的字符串是:\n"); puts(str1); printf("\n調(diào)用scanf()函數(shù)輸入字符串:\n"); scanf("%s",str2); //str2之前沒(méi)有&,為什么?

printf("輸入的字符串是:\n"); printf("%s\n",str2);

return0;}字符串的輸入輸出

Whatdoesitprint?intmain(void){charstr[]="I'mafullstring";

puts(str);

str[7]='o';

str[8]='o';puts(str);

str[10]='\0';puts(str);str[10]='s';puts(str);return0;}I’mafullstringI’mafoolstringI’mafoolI’mafoolsstring0123456789…scanf()charstr[10];

scanf("%s",str);這里沒(méi)有&不能讀入帶空格的字符串,gets()可以這兩種用法都不安全。當(dāng)用戶的輸入多于10個(gè)(含10個(gè)),str數(shù)組將越界scanf被公認(rèn)為最易遭到黑客攻擊的函數(shù)之一gets()字符串輸入函數(shù)gets()也沒(méi)有提供限制輸入字符串長(zhǎng)度的方法,容易引起緩沖區(qū)溢出,給黑客攻擊以可乘之機(jī)對(duì)輸入字符串長(zhǎng)度有限制的函數(shù)調(diào)用fgets(buf,sizeof(buf),stdin);字符串處理函數(shù)在<string.h>中定義了若干專門的字符串處理函數(shù)strcpy:string

copystrcpy(目的字符串,源字符串);strlen:string

lengthstrlen(字符串);返回字符串的實(shí)際長(zhǎng)度,不包括'\0'strcat:string

combinationstrcat(目的字符串,源字符串);strcmp:string

comparisonstrcmp(字符串1,字符串2);當(dāng)出現(xiàn)第一對(duì)不相等的字符時(shí),就由這兩個(gè)字符決定所在字符串的大小返回其ASCII碼比較的結(jié)果值字符串處理函數(shù)字符串不能直接整體復(fù)制!str1=str2;/*錯(cuò)誤*/strcpy(str1,str2);/*正確*/字符串不能用關(guān)系運(yùn)算符比較大?。f(str1>str2)/*錯(cuò)誤*/if(strcmp(str1,str2)>0)/*正確*/字符串函數(shù)strcmp()strcmp(str1,str2)abcde\0str1abcde\0str2abc\0

abcde\0abcd\0

Abcde\0str1str2str1str2strcmp(str1,str2)==0strcmp(str1,str2)>0strcmp(str1,str2)<0字符串例題

從鍵盤任意輸入5個(gè)學(xué)生的姓名,編程找出并輸出按字典順序排在最前面的學(xué)生姓名等價(jià)于求最小字符串#include<stdio.h>#include<string.h>#defineARRA_SIZE80main(){ intn; charstr[ARRA_SIZE],min[ARRA_SIZE];

printf("Pleaseenterfivenames:\n"); gets(str); strcpy(min,str); for(n=1;n<5;n++) { gets(str); if(strcmp(str,min)<0) { strcpy(min,str); } } printf("Theminis:"); puts(min);}a[0]93a[1]84a[2]52a[3]46a[4]25a[5]0a[6]66a[5]18a[8]39a[9]70a[0]9a[1]8a[2]5a[3]4a[4]2a[5]0a[6]66a[5]18a[8]39a[9]7084935246250661839708452934625066183970845246932506618397084524625066183993708452462506618397093……a[0]84a[1]52a[2]46a[3]25a[4]0a[5]66a[6]18a[5]39a[8]70a[9]935284462506618397093524684250661839709352462584066183970939393……a[0]84a[1]52a[2]46a[3]25a[4]0a[5]66a[6]18a[5]39a[8]70a[9]935284462506618397093524684250661839709352462584066183970939393……字符串(String)與字符數(shù)組字符串一串以'\0'結(jié)尾的字符在C語(yǔ)言中被看作字符串用雙引號(hào)括起的一串字符是字符串常量,C語(yǔ)言自動(dòng)為其添加'\0'終結(jié)符C語(yǔ)言并沒(méi)有為字符串提供任何

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論