課程-15級(jí)語言第5章數(shù)組_第1頁
課程-15級(jí)語言第5章數(shù)組_第2頁
課程-15級(jí)語言第5章數(shù)組_第3頁
課程-15級(jí)語言第5章數(shù)組_第4頁
課程-15級(jí)語言第5章數(shù)組_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余89頁可下載查看

付費(fèi)下載

下載本文檔

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

文檔簡介

1第5章數(shù)組今年雙十一節(jié),某公司要慶祝一下。經(jīng)理對(duì)公司的100個(gè)員工說:做一個(gè)游戲,讓每個(gè)人把出生年+月+日得到一個(gè)數(shù)。例如:1995年10月9日=1995+10+9=2014。然后把這個(gè)數(shù)報(bào)上來。公司里有一筆錢要作為游戲的獎(jiǎng)金,數(shù)額為M元。如果有人報(bào)上來的數(shù)字與2014相同,就把這筆錢發(fā)給這些人。如果只有一個(gè)人得獎(jiǎng),獎(jiǎng)金都?xì)w這個(gè)人。如果有多于一個(gè)人得獎(jiǎng),則他們平分這筆錢。現(xiàn)在讓我們來寫一段程序算算都有哪些人得到了獎(jiǎng)金?得到多少?2問題求解定義一個(gè)數(shù)組存放所有員工上報(bào)的數(shù)據(jù)定義一個(gè)數(shù)組存放獲獎(jiǎng)?wù)叩木幪?hào)(幸運(yùn)者數(shù)組)定義一個(gè)整數(shù)存放獲獎(jiǎng)?wù)呷藬?shù)員工順序報(bào)上數(shù)字,其相應(yīng)的編號(hào)就是存放其數(shù)據(jù)的數(shù)組元素下標(biāo):0,1,2,…報(bào)上數(shù)字與2014相等,則記錄編號(hào)到幸運(yùn)者數(shù)組中獲獎(jiǎng)?wù)呷藬?shù)加1輸出獲獎(jiǎng)?wù)呔幪?hào)和獲得的獎(jiǎng)金數(shù)額34#include<stdio.h>#defineLUCK_NUM2014#defineN100intmain(){ intpeople[M],lucky[M],count=0,i;

scanf(("%d",&M); for(i=0;i<N;i++) scanf("%d",&people[i]); for(i=0;i<N;i++) { if(people[i]==LUCK_NUM) { lucky[count]=i; count++; } } for(i=0;i<count;i++) printf("%d%d\n",lucky[i],N/count); return0;}5教學(xué)目標(biāo)掌握數(shù)組數(shù)據(jù)結(jié)構(gòu)掌握數(shù)組的聲明和存放,初始化和數(shù)組元素的引用方法掌握數(shù)組下標(biāo)的使用方法了解聲明和操作多維數(shù)組掌握字符串定義及使用方法初步理解排序和查找等基本算法基本概念定義:一組類型相同的數(shù)據(jù)對(duì)象構(gòu)成的集合特點(diǎn):存儲(chǔ)在一個(gè)區(qū)域內(nèi),引用時(shí)用同一名字(序號(hào)不同)數(shù)組名:數(shù)據(jù)集合的名稱數(shù)組元素:該集合的各數(shù)據(jù)元素。具有相同的數(shù)據(jù)類型,用集合的名稱(數(shù)組名)和(元素的位置)索引(也叫下標(biāo))確定65.1一維數(shù)組7{16.02.018.022.012.0}xx[0]x[1]x[2]x[3]x[4]數(shù)組元素?cái)?shù)組名數(shù)組的特征數(shù)組元素的類型

存儲(chǔ)在數(shù)組元素中的值的數(shù)據(jù)類型(數(shù)組類型)數(shù)組的大小

數(shù)組中能夠存放多少個(gè)數(shù)組元素(數(shù)組長度)85.1.1一維數(shù)組的定義9定義方式:數(shù)據(jù)類型數(shù)組名[常量表達(dá)式];合法標(biāo)識(shí)符表示元素個(gè)數(shù),下標(biāo)從0開始不能為變量[]:數(shù)組運(yùn)算符優(yōu)先級(jí)(1),左結(jié)合,不能用()例inta[6];a[0]0145a[1]a[2]a[3]a[4]a[5]23a編譯時(shí)分配連續(xù)內(nèi)存數(shù)組名表示內(nèi)存首地址(address.c);它是地址常量例intdata[5];data[5]=10;

//C語言對(duì)數(shù)組不作越界檢查,使用時(shí)要注意例inti=15;intdata[i];(

不能用變量定義數(shù)組維數(shù))例#defineI4intdata[I];(常量表達(dá)式包括常量、符號(hào)常量)5.1.1一維數(shù)組的定義一維數(shù)組的總字節(jié)數(shù)可按下式計(jì)算:

總字節(jié)數(shù)=sizeof(數(shù)組元素的數(shù)據(jù)類型)*數(shù)組長度

其中sizeof是計(jì)算數(shù)據(jù)類型在存儲(chǔ)空間中占用字節(jié)數(shù)的運(yùn)算符。

數(shù)組x所占用的存儲(chǔ)字節(jié)數(shù)為:sizeof(double)*5105.1.1一維數(shù)組的定義語句說明inta[10];長度為10的int數(shù)組adoublescore[50];長度為50的double數(shù)組scorecharstudentname[20];長度為20的char數(shù)組studentnameintb[100],x[27];int數(shù)組b長度為100,長度為27的int數(shù)組x11

例5.1數(shù)組的聲明語句及含義5.1.1一維數(shù)組的定義[例5.2]將數(shù)據(jù)存入數(shù)組相應(yīng)的數(shù)組元素中。12/*

程序功能:聲明數(shù)組,從鍵盤輸入數(shù)據(jù)存儲(chǔ)數(shù)組元素中并輸出*/#include<stdio.h>intmain(){

doublex[5];inti;for(i=0;i<5;i++)scanf(“%lf”,&x[i]);for(i=0;i<5;i++)printf(“%8.2lf”,x[i]);return0;}一維數(shù)組的注意事項(xiàng)(1)數(shù)組的長度是一個(gè)整型常量,例如:inta[10];

使用符號(hào)常量的形式定義數(shù)組的大小:#defineN10inta[N];

(2)數(shù)組的命名方式與其他變量一樣,符合標(biāo)識(shí)符的定義規(guī)范(3)數(shù)組元素的起始下標(biāo)為013一維數(shù)組的存儲(chǔ)結(jié)構(gòu)若有數(shù)組:inta[10];14索引號(hào)(下標(biāo))存儲(chǔ)地址元素值數(shù)組元素020001a[0]120042a[1]220083a[2]320124a[3]420165a[4]520206a[5]620247a[6]720288a[7]820329a[8]9203610a[9]char型數(shù)組str的存儲(chǔ)結(jié)構(gòu)示意圖

charstr[5]={‘H’,’e’,’l’,’l’,’o’};一維數(shù)組的存儲(chǔ)結(jié)構(gòu)15索引號(hào)存儲(chǔ)地址元素值數(shù)組元素02000‘H’str[0]12001‘e’str[1]22002‘l’str[2]32003‘l’str[3]42004‘o’str[4]5.1.2一維數(shù)組元素的引用數(shù)組必須先定義,后使用只能逐個(gè)引用數(shù)組元素,不能一次引用整個(gè)數(shù)組數(shù)組元素表示形式:數(shù)組名[下標(biāo)]

其中:下標(biāo)可以是常量或整型表達(dá)式16例inta[10];printf(“%d”,a);

()必須for(j=0;j<10;j++)

printf(“%d\n”,a[j]);

()數(shù)組元素的引用5.1.2一維數(shù)組元素的引用17語句說明printf(“%.2lf”,x[3]);顯示x[3]的值,其值為22.00x[0]=25.0;將浮點(diǎn)數(shù)25.0存入x[0]中sum=c[1]+c[2];將c[1]和c[2]的和存儲(chǔ)在變量sum中sum+=c[2];將sum和c[2]的和存儲(chǔ)在變量sum中c[7]=100;將100的值存入c[7]元素中x[2]+1=x[3];非法的賦值語句,賦值運(yùn)算符的左邊不能被賦值在C語言中,使用下標(biāo),從數(shù)組的第一個(gè)元素開始,順序處理數(shù)組的元素,使用循環(huán)語句實(shí)現(xiàn)對(duì)數(shù)組元素的遍歷。5.1.2一維數(shù)組元素的引用[例5.3]保存一個(gè)10以內(nèi)的整數(shù)的所有約數(shù)。

18#include<stdio.h>intmain(){inta[10],n;inti,j=0;printf("輸入一個(gè)整數(shù)(<10):");scanf("%d",&n);for(i=1;i<=n;i++)if(n%i==0)a[j++]=i;printf("約數(shù)為:\n");for(i=0;i<j;i++) printf("%6d",a[i]);return0;}程序運(yùn)行結(jié)果:輸入:輸入一個(gè)整數(shù)(<10):8輸出:約數(shù)為:12485.1.3數(shù)組的初始化在聲明簡單變量時(shí),初始化形式:inti=0;定義數(shù)組時(shí)直接初始化:各元素的值用逗號(hào)分隔,填充到數(shù)組元素所在的存儲(chǔ)空間中。例如:intb[4]={1,2,3,4};19b[0]1b[1]2b[2]3b[3]45.1.3數(shù)組的初始化錯(cuò)誤的初始化:intd[10];d={0,1,2,3,4,5,6,7,8,9};/*錯(cuò)誤的賦值*/正確的初始化方法為:intd[]={0,1,2,3,4,5,6,7,8,9};根據(jù)初值計(jì)算長度205.1.3數(shù)組的初始化部分初始化charletters[26]={‘A’,‘B’};21letter[0]‘A’charletter[1]‘B’letter[2]‘\0’……‘\0’Letter[25]‘\0’5.1.3數(shù)組的初始化問題:若初始化了很多數(shù)組元素,如何確定數(shù)組的大???

22一一計(jì)數(shù),可能比較麻煩!sizeof(d)/sizeof(d[0])含義是數(shù)組d的存儲(chǔ)空間的大小除以數(shù)組中第一個(gè)元素的占用存儲(chǔ)空間的字節(jié)數(shù)5.1.3數(shù)組的初始化[例5.4]輸出數(shù)組元素。/*程序功能:輸出數(shù)組元素*/#include<stdio.h>intmain(){charv[]={'A','E','I','O','U'};inti=0;for(i=0;i<sizeof(v)/sizeof(v[0]);i++)printf("%6c",v[i]);return0;}23

程序運(yùn)行結(jié)果:

輸出:AEIOU利用數(shù)組解決問題例用冒泡法對(duì)10個(gè)數(shù)排序(由小到大)24排序過程:(1)比較第一個(gè)數(shù)與第二個(gè)數(shù),若為逆序a[0]>a[1],則交換;然后比較第二個(gè)數(shù)與第三個(gè)數(shù);依次類推,直至第n-1個(gè)數(shù)和第n個(gè)數(shù)比較為止——第一趟冒泡排序,結(jié)果最大的數(shù)被安置在最后一個(gè)元素位置上(2)對(duì)前n-1個(gè)數(shù)進(jìn)行第二趟冒泡排序,結(jié)果使次大的數(shù)被安置在第n-1個(gè)元素位置(3)重復(fù)上述過程,共經(jīng)過n-1趟冒泡排序后,排序結(jié)束2538

49

65

76132730

97第二趟排序384965132730

76第三趟排序3849132730

65第四趟排序3813273049第五趟排序132730

38第六趟排序1327

30第七趟排序4938659776132730第一趟排序n=83849769713972797309713767676273013652765306513134949304927382738303813

27結(jié)束輸入n個(gè)數(shù)給a[0]到a[n-1]forj=0ton-2fori=0ton-1-ja[i]>a[i+1]真假a[i]a[i+1]輸出a[0]到a[n-1]#include<stdio.h>#defineN10intmain(){inta[N],i,j,t;

for(i=0;i<N;i++)scanf("%d",&a[i]);

printf("\n");

for(j=0;j<N-1;j++)for(i=0;i<N-j-1;i++)

if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}

printf("Thesortednumbers:\n");

for(i=0;i<N;i++) printf("%d",a[i]);}例:已知數(shù)組a中有n個(gè)互不相等的元素,數(shù)組b中有m(m<n)個(gè)互不相等的元素,而數(shù)組c中包含那些在a中但不在b中的元素,編程產(chǎn)生數(shù)組c(產(chǎn)生新數(shù)組)

12-13

27731

-62-1477

-176

a12331-6

c

b

0

0#include<stdio.h>#defineN8#defineM5intmain(){inti,j,k=0,a[N],b[M],c[N];for(i=0;i<N;i++)scanf("%d",&a[i]);for(i=0;i<M;i++)scanf("%d",&b[i]);for(i=0;i<N;i++){for(j=0;j<M;j++)if(a[i]==b[j])break;

if(j>=M){c[k]=a[i];k++;}}

for(i=0;i<k;i++)printf("%5d",c[i]);printf("\n");}利用數(shù)組解決問題例:將一串整數(shù),依次左移一個(gè)數(shù),且原來的第1個(gè)數(shù)移到最后去29例:輸入m和k,將大于整數(shù)m且緊靠m的k個(gè)素?cái)?shù)存入數(shù)組中并輸出。

例如,若輸入17,5,則應(yīng)輸出19,23,29,31,37。

3031#include<stdio.h>#defineN1000intmain(){ intm,k,i,j,n,x[N]; scanf("%d%d",&m,&k); n=0; for(i=m+1;n<k;i++) { for(j=2;j<i;j++) if(i%j==0)break; if(j>=i) x[n++]=i; } for(i=0;i<n;i++) printf("%d",x[i]); return0;}5.1.4向函數(shù)傳遞一維數(shù)組分類:數(shù)組元素作為函數(shù)的參數(shù)printf("%6c",v[i]);scanf(“%lf”,&x[i]);數(shù)組名作為函數(shù)的參數(shù)321數(shù)組元素作為函數(shù)的參數(shù)[例5.5]寫程序建立一個(gè)包含F(xiàn)ibonacci數(shù)列前20項(xiàng)的數(shù)組,然后從大到小輸出這個(gè)數(shù)組中所有的數(shù)。33f[0]f[1]f[2]f[3]f[4]f[5]f[19]……...11f[19]014523192351數(shù)組元素作為函數(shù)的參數(shù)#include<stdio.h>#defineMAX20intmain(){longfib[MAX];intn;fib[0]=1;fib[1]=1;for(n=2;n<MAX;++n)fib[n]=fib[n-1]+fib[n-2];for(n=MAX-1;n>=0;--n){34printf("%ld",fib[n]);putchar((MAX-n-1)%6==5?‘\n’:‘’);}return0;}程序運(yùn)行結(jié)果:6765418125841597987610

377233138532

11

數(shù)組元素作為函數(shù)的參數(shù)2數(shù)組參數(shù)數(shù)組元素作為參數(shù)傳遞,函數(shù)會(huì)接收到數(shù)組元素的一個(gè)副本,參數(shù)傳遞方法為值傳遞。數(shù)組整體作為函數(shù)的參數(shù),函數(shù)操作與實(shí)參數(shù)組一致的數(shù)組元素。傳地址:將數(shù)組在內(nèi)存中的存儲(chǔ)地址作為參數(shù)來傳遞352數(shù)組參數(shù)例5.6voidinit(inta[],intn,intvalue){ inti; for(i=0;i<n;i++) a[i]=value;}36函數(shù)的參數(shù)是一個(gè)數(shù)組,而不是數(shù)組元素函數(shù)的調(diào)用形式為:init(b,8,-1);

其中數(shù)組b的定義形式為:intb[8];37#include<stdio.h>voidinit(inta[],int,int);intmain(){ intb[10],i;

init(b,8,-1); for(i=0;i<8;i++) printf("%d",b[i]); return0;}2數(shù)組參數(shù)b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]38

8-1

-實(shí)參81函數(shù)init形參數(shù)組anvalue形參數(shù)組名b實(shí)參將數(shù)據(jù)傳遞給形參數(shù)組a2數(shù)組參數(shù)[例5.7]定義了一個(gè)函數(shù)sum,返回?cái)?shù)組中所有元素值的和,函數(shù)不能改變數(shù)組元素。intsum(inta[],intn){ inti,s=0; for(i=0;i<n;i++) s+=a[i]; returns;}392數(shù)組參數(shù)[例5.8]用數(shù)組表示A和B兩個(gè)向量,定義函數(shù)實(shí)現(xiàn)兩個(gè)向量的和(對(duì)應(yīng)項(xiàng)相加)存入數(shù)組C中。voidsum(inta[],

intb[],intn,intc[]){inti; for(i=0;i<n;i++) c[i]=a[i]+b[i];}405.1.4向函數(shù)傳遞一維數(shù)組說明:(1)數(shù)組作為函數(shù)參數(shù)的語法為:元素類型數(shù)組名[](2)數(shù)組名后的[]不能省略(3)數(shù)組作為參數(shù)時(shí),實(shí)參中只須寫實(shí)參數(shù)組名,不能再取其地址了。如:41charname[10];scanf("%s",name);scanf(“%s”,&name);/*錯(cuò)誤!name已經(jīng)是數(shù)組名*/5.1.5一維數(shù)組應(yīng)用讀10個(gè)整數(shù)存入數(shù)組,找出其中最大值和最小值42分析步驟:1.輸入:for循環(huán)輸入10個(gè)整數(shù)2.處理:(a)先令max=min=x[0](b)依次用x[i]和max,min比較(循環(huán))

若max<x[i],令max=x[i]

若min>x[i],令min=x[i]3.輸出:max和min#include<stdio.h>#defineSIZE10intmain(){intx[SIZE],i,max,min;printf(“Input10integers:\n");for(i=0;i<SIZE;i++){scanf("%d",&x[i]);}max=min=x[0];for(i=1;i<SIZE;i++){if(max<x[i])max=x[i];if(min>x[i])min=x[i];}printf("Maximumvalueis%d\n",max);printf("Minimumvalueis%d\n",min);return0;}5.1.5一維數(shù)組應(yīng)用例5.11將一個(gè)數(shù)組中的元素首尾依次逆轉(zhuǎn)并輸出43#include<stdio.h>voidinv(intx[],intn);intmain(){ inti,a[10]={8,6,7,1,0,9,3,5,4,2}; printf("數(shù)組元素的原先順序:\n"); for(i=0;i<10;i++) printf("%d",a[i]); printf("\n"); inv(a,10); printf("逆序操作后的順序:\n");for(i=0;i<10;i++) printf("%d",a[i]); printf("\n"); return0;}voidinv(intx[],intn){ intt,i,j,m=(n-1)/2; for(i=0;i<=m;i++){ j=n-1-i;t=x[i];x[i]=x[j];x[j]=t; }}44例5.13有兩個(gè)一維數(shù)組,需要將其合并為一個(gè)一維的數(shù)組,要求合并后數(shù)組的每一項(xiàng)是遞減順序排列的。

首先先將兩個(gè)數(shù)組分別排序,然后將排序后的數(shù)組合并。5.1.5一維數(shù)組應(yīng)用voidsort(intarr[],intk){ inttemp; inti,j; for(i=0;i<k-1;i++){ for(j=0;j<k-i-1;j++){ if(arr[j]<arr[j+1]) { temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } }}voidmerge(inta[],intb[],intc[],intm,intn){ inti=0,j=0,k=0; while(i<m&&j<n) { if(a[i]<b[j]) c[k++]=b[j++]; else c[k++]=a[i++]; } while(i<m) c[k++]=a[i++]; while(j<n) c[k++]=b[j++];}#include<stdio.h>#defineM5#defineN4voidsort(intx[],int);voidmerge(inta[],intb[],intc[],int,int);intmain(){intj; inta[M]={2,8,7,9,3}; intb[N]={7,5,1,4}; intc[M+N]; printf("a數(shù)組排序前:\n"); for(j=0;j<M;j++) printf("%5d",a[j]); printf("\n");printf("b數(shù)組排序前:\n"); for(j=0;j<N;j++) printf("%5d",b[j]); printf("\n");

sort(a,M); printf("a數(shù)組排序后:\n"); for(j=0;j<N;j++) printf("%5d",a[j]); printf("\n");

sort(b,N); printf("b數(shù)組排序后:\n"); for(j=0;j<N;j++) printf("%5d",b[j]); printf("\n");

merge(a,b,c,M,N); printf("合并a和b后:\n"); for(j=0;j<10;j++) printf("%5d",c[j]); printf("\n"); return0;}5.1.5一維數(shù)組應(yīng)用程序運(yùn)行結(jié)果:a數(shù)組排序前:28793b數(shù)組排序前:7514a數(shù)組排序后:98732b數(shù)組排序后:7541合并a和b后:987754321

47校門外的樹題目描述:某校大門外長度為L的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1米。我們可以把馬路看成一個(gè)數(shù)軸,馬路的一端在數(shù)軸0的位置,另一端在L的位置;數(shù)軸上的每個(gè)整數(shù)點(diǎn),即0,1,2,……,L,都種有一棵樹。由于馬路上有一些區(qū)域要用來建地鐵。這些區(qū)域用它們?cè)跀?shù)軸上的起始點(diǎn)和終止點(diǎn)表示。已知任一區(qū)域的起始點(diǎn)和終止點(diǎn)的坐標(biāo)都是整數(shù),區(qū)域之間可能有重合的部分?,F(xiàn)在要把這些區(qū)域中的樹(包括區(qū)域端點(diǎn)處的兩棵樹)移走。你的任務(wù)是計(jì)算將這些樹都移走后,馬路上還有多少棵樹。(L<=100000)輸入要求:輸入兩個(gè)整數(shù)L(1

<=

L

<=

10000)和

M(1

<=

M

<=

100),L代表馬路的長度,M代表區(qū)域的數(shù)目,L和M之間用一個(gè)空格隔開。接下來的M行每行包含兩個(gè)不同的整數(shù),用一個(gè)空格隔開,表示一個(gè)區(qū)域的起始點(diǎn)和終止點(diǎn)的坐標(biāo)。輸出要求:占一行,馬路上剩余的樹的數(shù)目輸入樣例:

500

3

150

300

100

200

470

471輸出樣例:

298495.2二維數(shù)組在實(shí)際計(jì)算中,有時(shí)需要更復(fù)雜的結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù)完成相應(yīng)的計(jì)算任務(wù),例如經(jīng)常需要表示和處理矩陣。矩陣是由行和列組成的數(shù)陣,它是一個(gè)二維的結(jié)構(gòu),是由若干行元素構(gòu)成的數(shù)組,每一個(gè)行元素表示一個(gè)長度一致的一維數(shù)組。505.2.1二維數(shù)組的聲明定義方式:

數(shù)據(jù)類型數(shù)組名[常量表達(dá)式][常量表達(dá)式];數(shù)組元素的存放順序原因:內(nèi)存是一維的二維數(shù)組:按行序優(yōu)先多維數(shù)組:最右下標(biāo)變化最快例inta[3][2];floatb[2][5];inta[3,4];()inta[3][2]014523a[0][0]

a[0][1]a[1][0]

a[1][1]a[2][0]

a[2][1]a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]若有:doublea[3][2];

邏輯結(jié)構(gòu)

物理結(jié)構(gòu)

51[0][1]a[0]a[0][0]a[0][1]a[1]a[1][0]a[1][1]a[2]a[2][0]a[2][1]a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[1]a[2]a[0]5.2.1二維數(shù)組的聲明二維數(shù)組的初始化

分行賦值

floata[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

順序賦值

floata[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

部分賦值:其他為0floata[3][4]={{1},{},{9}};

全部賦值:一維長度可以省略

floata[][3]={1,0,3,4,0,0,0,8,0};5.2.2二維數(shù)組的初始化53doubleE[3][3]={{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0}};1.00.00.00.01.00.00.00.01.0inta[3][3]={{1,2},{3,4},{5,6}};120340560intb[3][3]={1,2,3,4,5,6};1234560005.2.2二維數(shù)組的初始化[例5.14]二維數(shù)組的初始化54printf(“\nb:\n”);for(i=0;i<2;i++){for(j=0;j<3;j++)printf("%5d",b[i][j]);

printf("\n");}return0;}#include<stdio.h>intmain(){inta[2][3]={{1,2,3},{4,5,6}};intb[2][3]={1,2,3,4,5,6};inti,j;printf("a:\n");for(i=0;i<2;i++){for(j=0;j<3;j++)printf("%5d",a[i][j]);printf("\n");}5.2.3二維數(shù)組應(yīng)用[例5.15]實(shí)現(xiàn)矩陣的輸入與輸出55#include<stdio.h>#defineM3#defineN4intmain(){inta[M][N];inti,j;for(i=0;i<M;i++)for(j=0;j<N;j++)scanf("%d",&a[i][j]);for(i=0;i<M;i++){for(j=0;j<N;j++)printf("%4d",a[i][j]);printf("\n");}return0;}程序運(yùn)行結(jié)果輸入:123434564567輸出:

1234345645675.2.3二維數(shù)組應(yīng)用[例5.16]設(shè)計(jì)程序?qū)崿F(xiàn):一個(gè)班級(jí)有30名同學(xué),每位同學(xué)有三門課程的成績,求每位同學(xué)的總分,并求每門課的平均分。56

1000001310001433101443331444331214431222141222221例:找規(guī)律自動(dòng)填充n×n方陣。n=7時(shí)如下圖所示。主對(duì)角線副對(duì)角線i==ji+j==6N-1#include<stdio.h>#defineN7

intmain(){inta[N][N],i,j;for(i=0;i<N;i++)for(j=0;j<N;j++)if(i==j||i+j==N-1)a[i][j]=1; elseif(i<j&&i+j<N-1)a[i][j]=0;elseif(i<j&&i+j>N-1)a[i][j]=4;elseif(i>j&&i+j>N-1)a[i][j]=2;elsea[i][j]=3;for(i=0;i<N;i++){for(j=0;j<N;j++) printf("%3d",a[i][j]);printf("\n");}}i<ji>ji+j<N-1i+j>N-15.3字符數(shù)組字符數(shù)組就是存儲(chǔ)字符數(shù)據(jù)的數(shù)組,比如單詞,電話號(hào)碼等等文本數(shù)據(jù)。C語言提供非常強(qiáng)大的處理字符序列或文本的功能。當(dāng)然這些功能都是從存儲(chǔ)字符型數(shù)據(jù)開始的。585.3.1字符數(shù)組的定義一維字符數(shù)組聲明的形式:

char數(shù)組名稱[長度];

二維字符數(shù)組聲明的形式:char數(shù)組名稱[行長度][列寬度];例如,charline[80];chartext[1000];

charname[5][20];59常量表達(dá)式指定了長度,即可以存放字符數(shù)據(jù)的個(gè)數(shù)理解為:定義了五名同學(xué)的姓名,每個(gè)姓名不超過20個(gè)字符。5.3.2字符數(shù)組元素的引用數(shù)組元素的賦值操作for(i=0;i<80&&(line[i]=getchar())!=‘\n‘;i++);/*用循環(huán)將一行(最多80列)字符讀入到數(shù)組line*/數(shù)組元素的取值操作

字符數(shù)組元素的引用方式也是通過數(shù)組名和下標(biāo)運(yùn)算符表示式實(shí)現(xiàn)的for(i=0;i<80;i++)printf(“%c”,line[i]);/*輸出數(shù)組元素的值*/605.3.3字符數(shù)組元素的初始化逐個(gè)字符賦值61用字符串常量例

charch[5]={'H','e','l','l','o'};ch[0]Helloch[1]ch[2]ch[3]ch[4]逐個(gè)字符賦值例charch[6]={“Hello”};或charch[6]=“Hello”;或charch[]=“Hello”;ch[0]Helloch[1]ch[2]ch[3]ch[4]\0ch[5]用字符串常量5.3.3字符數(shù)組元素的初始化charstr[20]={"Nanjing"};或charstr[20]=“Nanjing”;/*可將花括號(hào)省略*/62[0][6][7][12]Nanjing\0\0\0\0\0\0str[7]包含的字符‘\0’,表示“空字符”,表示一組字符的結(jié)束符。在C語言中,空字符常量用‘\0’轉(zhuǎn)義字符表示??兆址贑語言中有特殊作用,表示字符串的結(jié)束符。注意:5.3.3字符數(shù)組元素的初始化63例chardiamond[][5]={{‘',‘','*'},{‘','*',‘','*'},{'*',‘',‘',‘','*'},{‘','*',‘','*'},{‘',‘','*'}};diamond[0]*\0\0diamond[1]**\0diamond[2]**diamond[3]**\0diamond[4]*\0\05.3.4字符串的表示字符串:雙引號(hào)對(duì)("“)引起的部分。

字符型數(shù)據(jù)指的是一個(gè)字符數(shù)據(jù),其常量的表示用單引號(hào)對(duì)(‘’)表示。字符串指的是一組有意義字符構(gòu)成的數(shù)據(jù)。

在C語言中,二者間的差別很大。scanf("%f",&a,&b);printf("Average=%5.2f\n",(a+b)/2);64用字符串常量用字符串常量字符串的存儲(chǔ)在C語言中,字符串的存儲(chǔ)是利用字符數(shù)組來實(shí)現(xiàn)的。編譯系統(tǒng)將字符串以字符數(shù)組的形式存儲(chǔ),即從內(nèi)存空間中分配連續(xù)的若干存儲(chǔ)單元,依次保存字符串中的字符,且每個(gè)字符占用一個(gè)字節(jié)。C語言規(guī)定:在字符串常量中所有字符之后,增加一個(gè)空字符'\0'作為字符串的結(jié)束標(biāo)志。65字符串的存儲(chǔ)[0][6][7]Nanjing\066例如:charstr[]="Nanjing";雖然它只有7個(gè)字符,其內(nèi)部表示卻需要占8個(gè)字節(jié)存儲(chǔ),尤其是元素str[7],存儲(chǔ)了一個(gè)空字符’\0’。以表示字符串的結(jié)束。當(dāng)字符串初始化缺省長度時(shí),數(shù)組的長度必為字符串字符個(gè)數(shù)再加一個(gè)存放空字符的字節(jié)數(shù)。注意:字符串?dāng)?shù)組字符串?dāng)?shù)組是一個(gè)二維字符數(shù)組,該數(shù)組中的每一行都是一個(gè)字符串。#defineWEEK_DAY7#defineNAME_LEN10charweekday[WEEK_DAY][NAME_LEN]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday“};675.3.5字符數(shù)組的輸入與輸出字符數(shù)組的輸入與輸出與值型數(shù)組類似,字符數(shù)組也是從索引號(hào)為0的元素開始訪問的。通常使用循環(huán)計(jì)數(shù)器作為數(shù)組的下標(biāo)可以依次地遍歷數(shù)組中的所有元素。68例輸入一行字符,統(tǒng)計(jì)其中有多少個(gè)單詞輸入一字符串給stringi=0num=0word=0當(dāng)((c=string[i])!=‘\0’)c=空格真真假假word=0word=1num=num+1i=i+1輸出:numword==0#include<stdio.h>intmain(){charstring[81];inti=0,num=0,word=0;charc;gets(string);

for(i=0;(c=string[i])!='\0';i++)

if(c=='')word=0;

elseif(word==0){word=1;num++;}cout<<num;return0}70分析:一行文字中單詞間的分隔符,我們一般認(rèn)為是非字母字符數(shù)據(jù)。在給定問題中,我們首先需要找到單詞,即尋找單詞的開始和結(jié)束位置,并設(shè)計(jì)一個(gè)計(jì)數(shù)器記錄單詞的長度,通過比較找到最大值,并記錄單詞的起始位置,以便輸出該單詞。[例5.17]從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)中輸入一行文字,查找該行文字中最長的單詞。#include<stdio.h>#include<ctype.h>intmain(){charline[100];intmaxlen=0,i=0,max=0,end=0;intwordflag=0;while((

line[i++]=getchar())!='\n'&&i<100);

line[i]='\0';for(i=0;line[i]!='\0';i++){if(isalpha(line[i])){if(!wordflag)wordflag=1;maxlen++;}

else{wordflag=0;if(max<maxlen){max=maxlen;end=i; }maxlen=0;}}for(i=end-max;i<end;i++)printf("%c",line[i]);printf("\n");return0;}字符串的輸入與輸出(printf和scanf函數(shù))

在格式控制字符串中,使用%s格式實(shí)現(xiàn)對(duì)字符串的輸出與輸入[例5.17]要求用戶輸入一個(gè)代表課程名稱的字符串、表示星期幾的整數(shù)以及表示該課程上課節(jié)次串,輸出該節(jié)次對(duì)應(yīng)的課程表。735.3.5字符數(shù)組的輸入與輸出#include<stdio.h>#defineWEEK_DAY7#defineNAME_LEN10charweekday[WEEK_DAY][NAME_LEN]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};intmain(){charcourse_name[20];intdays;chartime[6];inti;scanf("%s",course_name);scanf("%d",&days);scanf("%s",time);74for(i=0;i<WEEK_DAY;i++)printf("%10s",weekday[i]);printf("\n%s",time);for(i=0;i<10*days;i++)printf("");printf("%s\n",course_name);return0;}5.3.5字符數(shù)組的輸入與輸出輸入:

Math35~6輸出:SundayMondayTuesdayWednesdayThursdayFridaySaturday5~6Math注意:scanf函數(shù)掃描字符串時(shí),分隔符也是空格、換行和制表符字符。從第一個(gè)非分隔字符開始,將字符復(fù)制到它的字符數(shù)組參數(shù)的連續(xù)內(nèi)存單元。即:5.3.5字符數(shù)組的輸入與輸出[0][4][9]Math\0?????76輸入數(shù)據(jù):Math?(回車確認(rèn)輸入)

scanf函數(shù)會(huì)在字符串的結(jié)尾處自動(dòng)添加一個(gè)空字符’\0’5.3.5字符數(shù)組的輸入與輸出charstr[50];scanf("%s",str);當(dāng)輸入:CProgrammingLanguagestr中的值是?77CProgrammingLanguageCWhy?5.3.6字符串處理函數(shù)字符串不是標(biāo)準(zhǔn)數(shù)據(jù)類型,大多數(shù)操作不能直接對(duì)字符串進(jìn)行操作,一般都通過循環(huán)對(duì)每個(gè)字符進(jìn)行操作,這樣就使字符串的操作并不簡便。但C語言提供專門處理字符串的函數(shù),這些函數(shù)的原型都包含在string.h中,下面介紹常用的幾個(gè)字符串處理函數(shù)。781字符串的賦值函數(shù)strcpy()一般形式:

strcpy(字符數(shù)組,字符串);函數(shù)功能:將字符串復(fù)制到字符數(shù)組中。如果字符串的長度小于數(shù)組的長度,其余部分用'\0'填補(bǔ)。返回處理完成的字符串。說明:不能用賦值符號(hào)“=”對(duì)字符串進(jìn)行復(fù)制。字符數(shù)組的長度足夠大,未使用的部分是空字符(‘\0’)。

charstr[20];strcpy(str,"CProgrammingLanguage");792字符串的長度一般形式:strlen(字符串);函數(shù)功能:返回字符串的有效字符數(shù)(除空字符以外的的字符個(gè)數(shù))。例如:strlen("Hello");/*結(jié)果是5*/說明:strlen()和sizeof()是有區(qū)別的,sizeof("Hello")的值是6。803字符串的連接一般形式:strcat(字符數(shù)組1,字符串);函數(shù)功能:把字符串連接到字符數(shù)組1所表示的字符串的后面,結(jié)果放在字符數(shù)組1中。說明:字符數(shù)組1的長度要足夠大,以便容納新的字符串。如:charC[40]="CProgramming",str[12];strcpy(str,"Language");strcat(C,str);81"CProgrammingLanguage"3字符串的比較一般形式:

strcmp(字符串1,字符串2);函數(shù)功能:比較兩個(gè)字符串的大小,返回一個(gè)整數(shù)值。說明:若函數(shù)返回值為0,則字符串1與字符串2相等若函數(shù)返回值大于0,則字符串1大于字符串2若函數(shù)返回值小于0,則字符串1小于字符串2823字符串的比較如:charstr1[]=“CProgrammingLanguage”;charstr2[]="BasicProgrammingLanguage";if(strcmp(str1,str2)>0)printf("str1字典序中排在str2的后面\n");elseprintf(“str1字典序中排在str2的前面\n”);83str1字典序中排在str2的后面字符串和數(shù)值型數(shù)組的區(qū)別交換排序數(shù)值字符數(shù)據(jù)定義intlist[M];charlist[M][N]比較操作if(list[i]<list[first])first=i;if(strcmp(list[i],list[first])<0)first=i;元素交換temp=list[min];List[min]=list[fill];list[fill]=temp;strcpy(temp,list[min]);strcpy(list[min],list[fill]);strcpy(list[fill],temp);845.3.7字符數(shù)組應(yīng)用例5.19完成字符串的復(fù)制操作voidstr_copy(chartarget[],charsource[]){inti=0;while(source[i]

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論