第6章數(shù)組與字符串_第1頁(yè)
第6章數(shù)組與字符串_第2頁(yè)
第6章數(shù)組與字符串_第3頁(yè)
第6章數(shù)組與字符串_第4頁(yè)
第6章數(shù)組與字符串_第5頁(yè)
已閱讀5頁(yè),還剩91頁(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)介

第6章數(shù)組與字符串第6章數(shù)組與字符串6.1數(shù)組與字符串的引入6.2一維數(shù)組6.3二維數(shù)組6.4字符串及其處理6.5數(shù)組與字符串程序設(shè)計(jì)及實(shí)例中國(guó)6.1數(shù)組與字符串的引入【引例】輸入100名學(xué)生的姓名和某門課程的成績(jī),要求把高于平均分的那些學(xué)生打印出來(lái),并按照成績(jī)從高到低進(jìn)行排序輸出。6.1.1問(wèn)題與引例前幾章使用的變量都屬于基本類型,例如整型、字符型、浮點(diǎn)型數(shù)據(jù),這些都是簡(jiǎn)單的數(shù)據(jù)類型。對(duì)于有些數(shù)據(jù),只用簡(jiǎn)單的數(shù)據(jù)類型是不夠的,難以反映出數(shù)據(jù)的特點(diǎn),也難以有效地進(jìn)行處理。6.1數(shù)組與字符串的引入三個(gè)數(shù)按從小到大排序代碼如下:#include<stdio.h>voidmain(){inta,b,c,t;printf("輸入三個(gè)數(shù):");scanf(“%d,%d,%d”,&a,&b,&c);//輸入三個(gè)數(shù)據(jù)

if(a>b){t=a;a=b;b=t;}//交換a、bif(a>c){t=a;a=c;c=t;}//交換a、c

if(b>c){t=b;b=c;c=t;}//交換b、cprintf("三個(gè)數(shù)從小到大排列為:%d,%d,%d\n",a,b,c);}思考:100個(gè)數(shù)呢?應(yīng)該定義多少個(gè)變量?如果有1000名學(xué)生,每個(gè)學(xué)生有一個(gè)成績(jī),需要求這1000名學(xué)生的平均成績(jī)。用s1,s2,s3,……,s1000表示每個(gè)學(xué)生的成績(jī),能體現(xiàn)內(nèi)在聯(lián)系。C語(yǔ)言用方括號(hào)中的數(shù)字表示下標(biāo),如用s[15]表示數(shù)組s中有15個(gè)元素。6.1數(shù)組與字符串的引入把具有相同類型的若干個(gè)數(shù)據(jù)按有序的形式組織起來(lái),這些按序排列的相同類型數(shù)據(jù)的集合稱為數(shù)組,一個(gè)數(shù)組必須用一個(gè)數(shù)組名表示。數(shù)組中的每一個(gè)數(shù)據(jù)稱為數(shù)組元素,數(shù)組元素用數(shù)組名加下標(biāo)表示,下標(biāo)表示數(shù)組元素在數(shù)組中的位置。數(shù)組元素用一個(gè)下標(biāo)表示的稱為一維數(shù)組,數(shù)組元素用兩個(gè)下標(biāo)表示的稱為二維數(shù)組,數(shù)組元素用兩個(gè)以上下標(biāo)表示的稱為多維數(shù)組。6.1.2數(shù)組的基本概念數(shù)組是一組有序數(shù)據(jù)的集合。數(shù)組中各數(shù)據(jù)的排列是有一定規(guī)律的,下標(biāo)代表數(shù)據(jù)在數(shù)組中的序號(hào)。用一個(gè)數(shù)組名和下標(biāo)惟一確定數(shù)組中的元素?cái)?shù)組中的每一個(gè)元素都屬于同一個(gè)數(shù)據(jù)類型6.1.2數(shù)組的基本概念6.2一維數(shù)組一維數(shù)組是數(shù)組中最簡(jiǎn)單的它的元素只需要用數(shù)組名加一個(gè)下標(biāo),就能惟一確定要使用數(shù)組,必須在程序中先定義數(shù)組6.2.1一維數(shù)組的定義6.2.1一維數(shù)組的定義1.一維數(shù)組定義的一般形式

類型符

數(shù)組名[常量表達(dá)式];數(shù)組名的命名規(guī)則和變量名相同如:inta[10];

數(shù)組名數(shù)組長(zhǎng)度每個(gè)元素的數(shù)據(jù)類型a[0]a[1]a[2]a[3]…a[7]a[8]a[9]10個(gè)元素例如:

inta[10];//整型數(shù)組a有10個(gè)元素

floatb[100],c[20];//實(shí)型數(shù)組b有100個(gè)元素//實(shí)型數(shù)組c有20個(gè)元素6.2.1一維數(shù)組的定義(1)所有數(shù)組中數(shù)組元素的下標(biāo)最小值都為0,下標(biāo)最大值為數(shù)組定義時(shí)方括號(hào)中常量表達(dá)式的值減1。(2)數(shù)組類型實(shí)際上是指數(shù)組元素的取值類型。對(duì)于同一個(gè)數(shù)組,其所有元素的數(shù)據(jù)類型都是相同的。(3)數(shù)組名的命名規(guī)則應(yīng)符合標(biāo)識(shí)符的規(guī)定。2.一維數(shù)組定義的注意點(diǎn)6.2.1一維數(shù)組的定義(4)數(shù)組名不能與其它變量名相同。inta;floata[10];是錯(cuò)誤的。(5)方括號(hào)中常量表達(dá)式表示數(shù)組元素的個(gè)數(shù),常量表達(dá)式通常為一個(gè)數(shù)值常量,也可以為數(shù)字表達(dá)式,如:inta[2+3]表示數(shù)組a有5個(gè)元素,這5個(gè)元素分別為a[0],a[1],a[2],a[3],a[4]。6.2.1一維數(shù)組的定義(6)數(shù)組定義時(shí)不能在方括號(hào)中用變量來(lái)表示元素的個(gè)數(shù),但是可以是符號(hào)常數(shù)或常量表達(dá)式。#defineN5voidmain()

{inta[3+2],b[7+N];//合法}inta[4+6];intn=10;inta[n];//不合法(7)允許在同一個(gè)定義語(yǔ)句中,說(shuō)明多個(gè)數(shù)組和多個(gè)變量。inta,b,c,d,k1[10],k2[20];6.2.1一維數(shù)組的定義在定義數(shù)組并對(duì)其中各元素賦值后,就可以引用數(shù)組中的元素。6.2.2一維數(shù)組元素的引用一維數(shù)組元素的一般形式為:數(shù)組名[下標(biāo)]其中:下標(biāo)只能為整型常量或整型表達(dá)式。如果為實(shí)數(shù)時(shí),則C編譯將自動(dòng)取整。例如:a[5]、a[i+j]、a[i++]都是合法的數(shù)組元素。如:a[0]=a[5]+a[7]-a[2*3]//合法intn=5,a[10];a[n]=20;//合法,此時(shí)的n為0~9,表示數(shù)組元素在C語(yǔ)言中必須先定義數(shù)組,然后才能使用該數(shù)組的下標(biāo)變量,且只能單個(gè)或逐個(gè)使用下標(biāo)變量,而不能一次引用整個(gè)數(shù)組。例如,要輸出有10個(gè)元素的數(shù)組必須使用循環(huán)語(yǔ)句逐個(gè)輸出各下標(biāo)變量:for(i=0;i<10;i++)printf("%d",a[i]);而不能用一個(gè)語(yǔ)句輸出整個(gè)數(shù)組。下面的寫法是錯(cuò)誤的:printf("%d",a);a為數(shù)組名6.2.2一維數(shù)組元素的引用【例6.1】從鍵盤輸入10個(gè)整數(shù),并將超過(guò)平均值的數(shù)打印出來(lái)。問(wèn)題分析:

首先利用循環(huán)和數(shù)組將輸入的數(shù)據(jù)存儲(chǔ)起來(lái),并求所有數(shù)據(jù)的和,然后再用循環(huán)輸出超過(guò)平均值的各個(gè)數(shù)據(jù)。6.2.2一維數(shù)組元素的引用程序設(shè)計(jì):#include<stdio.h>voidmain(){inti,s,av,a[10];s=0;for(i=0;i<10;i++)//數(shù)組數(shù)據(jù)輸入,并求和{scanf("%d",&a[i]);s=s+a[i];}6.2.2一維數(shù)組元素的引用程序設(shè)計(jì):av=s/10;//求平均值for(i=0;i<10;i++)//數(shù)組元素超過(guò)平均值時(shí),輸出{if(a[i]>av)printf("%d",a[i]);

}printf("\n");}6.2.2一維數(shù)組元素的引用6.2.3一維數(shù)組的輸入/輸出一維數(shù)組的初始化數(shù)組的初始化是指在數(shù)組定義時(shí)給數(shù)組元素賦予初值(1)一維數(shù)組初始化的一般形式類型說(shuō)明符數(shù)組名[常量表達(dá)式]={值1,值2,……,值n};其中:在“{}”中的各數(shù)據(jù)值即為各元素的初值,各值之間用逗號(hào)間隔。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};相當(dāng)于:inta[10];a[0]=0;a[1]=1;……;a[9]=9;(2)一維數(shù)組初始化的規(guī)定①可以只給部分元素賦初值。當(dāng)“{}”中值的個(gè)數(shù)少于元素個(gè)數(shù)時(shí),只給前面部分元素賦初值。②只能給元素逐個(gè)賦初值,不能給數(shù)組整體賦初值。③如果給全部元素賦初值,則在數(shù)組說(shuō)明中,可以不給出數(shù)組元素的個(gè)數(shù)。例如:inta[10]={0,1,2,3,4};表示只給a[0]~a[4]5個(gè)元素賦初值,而后面的a[5]~a[9]這5個(gè)元素自動(dòng)賦以0值。例如,給10個(gè)元素全部賦1值,只能寫為:inta[10]={1,1,1,1,1,1,1,1,1,1};而不能寫為:inta[10]=1;例如:inta[5]={1,2,3,4,5};可寫為:inta[]={1,2,3,4,5};6.2.3一維數(shù)組的輸入/輸出在定義數(shù)組的同時(shí),給各數(shù)組元素賦值inta[10]={0,1,2,3,4,5,6,7,8,9};inta[10]={0,1,2,3,4};相當(dāng)于inta[10]={0,1,2,3,4,0,0,0,0,0};inta[10]={0,0,0,0,0,0,0,0,0,0};相當(dāng)于inta[10]={0};inta[5]={1,2,3,4,5};可寫為inta[]={1,2,3,4,5};6.2.3一維數(shù)組的輸入/輸出一維數(shù)組的輸入【例6.2】輸入10個(gè)數(shù)據(jù),求其中的最大數(shù)及其位置。問(wèn)題分析:

本例程序中用數(shù)組a存放10個(gè)數(shù),變量max存放最大值,變量p存放最大值的位置。先輸入10個(gè)數(shù)到數(shù)組a中,然后把a(bǔ)[0]作為最大數(shù)送入max中,將1送到p中;再將a[1]到a[9]逐個(gè)與max中的內(nèi)容比較,若比max的值大,則把該下標(biāo)變量的值及下標(biāo)加1送入max和p中。因此,max總是在已比較過(guò)的下標(biāo)變量中為最大者,p為最大值的位置。比較結(jié)束時(shí),輸出max和p的值。#include<stdio.h>voidmain(){inti,max,p,a[10];printf("請(qǐng)輸入10個(gè)數(shù):");for(i=0;i<10;i++)//數(shù)組數(shù)據(jù)輸入

scanf("%d",&a[i]);for(i=0;i<10;i++)//數(shù)組數(shù)據(jù)輸出

printf("%d",a[i]);//找最大值及其位置}一維數(shù)組的輸入【例6.3】輸入10個(gè)數(shù)據(jù),按逆序輸出這10個(gè)數(shù)據(jù)。簡(jiǎn)化:利用數(shù)組下標(biāo)對(duì)數(shù)組元素賦值,對(duì)10個(gè)數(shù)組元素依次賦值為、0,1,2,3,4,5,6,7,8,9一維數(shù)組的輸入#include<stdio.h>voidmain(){inti,a[10];for(i=0;i<=9;i++)a[i]=i;for(i=9;i>=0;i--)printf("%d",a[i]);printf("\n");}使a[0]~a[9]的值為0~90123456789a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]一維數(shù)組的輸出#include<stdio.h>voidmain(){inti,a[10];for(i=0;i<=9;i++)a[i]=i;for(i=9;i>=0;i--)printf("%d",a[i]);printf("\n");}先輸出a[9],最后輸出a[0]0123456789a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]一維數(shù)組的輸出

【思考】用數(shù)組處理求Fibonacci數(shù)列問(wèn)題。解題思路:如果用數(shù)組處理,每一個(gè)數(shù)組元素代表數(shù)列中的一個(gè)數(shù),依次求出各數(shù)并存放在相應(yīng)的數(shù)組元素中。一維數(shù)組的輸出#include<stdio.h>voidmain(){inti;intf[20]={1,1};for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i<20;i++){if(i%5==0)printf("\n");printf("%12d",f[i]);}printf("\n");}6.3二維數(shù)組2456184712431600234627573045201817252020245814361427117510461976147720181分隊(duì)2分隊(duì)3分隊(duì)隊(duì)員1隊(duì)員2隊(duì)員3隊(duì)員4隊(duì)員5隊(duì)員6如:floatpay[3][6];二維數(shù)組元素有兩個(gè)下標(biāo),以標(biāo)識(shí)它在數(shù)組中的位置,所以也稱為雙下標(biāo)變量。C語(yǔ)言中允許構(gòu)造二維數(shù)組。二維數(shù)組定義的一般形式為:

類型符數(shù)組名[常量表達(dá)式][常量表達(dá)式];其中:

常量表達(dá)式1表示第一維下標(biāo)的長(zhǎng)度,也就是行數(shù)

常量表達(dá)式2表示第二維下標(biāo)的長(zhǎng)度,也就是列數(shù)。如:inta[3][4];floatb[5][10];6.3.1二維數(shù)組的定義二維數(shù)組可被看作是一種特殊的一維數(shù)組:

它的元素又是一個(gè)一維數(shù)組例如,把a(bǔ)看作是一個(gè)一維數(shù)組,它有3個(gè)元素:a[0]、a[1]、a[2]每個(gè)元素又是一個(gè)包含4個(gè)元素的一維數(shù)組a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[0]a[1]a[2]6.3.1二維數(shù)組的定義a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]邏輯存儲(chǔ)順序:內(nèi)存存儲(chǔ)順序:在C語(yǔ)言中,二維數(shù)組中的元素是按行存放的。6.3.1二維數(shù)組的定義二維數(shù)組元素也稱為雙下標(biāo)變量,表示形式為:

數(shù)組名[下標(biāo)][下標(biāo)]如:b[1][2]=a[2][3]/2;//合法for(i=0;i<m;i++)printf("%d,%d\n",a[i][0],a[0][i]);//合法6.3.2二維數(shù)組元素的引用6.3.3二維數(shù)組的輸入輸出1.二維數(shù)組的初始化(1)二維數(shù)組初始化的方法二維數(shù)組初始化是在類型說(shuō)明時(shí)給各數(shù)組元素賦以初值。二維數(shù)組可按行分段賦值,也可按行連續(xù)賦值。①按行分段賦值

inta[5][3]={

{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};②按行連續(xù)賦值

inta[5][3]={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};(2)二維數(shù)組初始化賦值的說(shuō)明①可以只對(duì)部分元素賦初值,未賦初值的元素自動(dòng)取0值。例如:inta[3][3]={{1},{2},{3}};對(duì)每一行的第一列元素賦值,未賦值的元素取0值。賦值后各元素的值為:100200300inta[3][3]={{0,1},{0,0,2},{3}};賦值后的元素值為:010002300②如對(duì)全部元素賦初值,則第一維的長(zhǎng)度可以不給出。例如:inta[3][3]={1,2,3,4,5,6,7,8,9};可以寫為:inta[][3]={1,2,3,4,5,6,7,8,9};inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};inta[3][4]={{1},{5},{9}};等價(jià)于inta[3][4]={{1,0,0,0},{5,0,0,0},{9,0,0,0}};inta[3][4]={{1},{5,6}};相當(dāng)于inta[3][4]={{1},{5,6},{0}};二維數(shù)組的初始化6.3.3二維數(shù)組的輸入輸出2.二維數(shù)組的輸入同一維數(shù)組類似,也可以在程序執(zhí)行過(guò)程中,對(duì)二維數(shù)組作動(dòng)態(tài)輸入,這時(shí)可用雙重循環(huán)配合scanf()函數(shù)逐個(gè)輸入二維數(shù)組元素的值。3.二維數(shù)組的輸出同一維數(shù)組類似,也可以在程序執(zhí)行過(guò)程中,要輸出二維數(shù)組中所有元素,這時(shí)可用雙重循環(huán)結(jié)構(gòu)配合printf()函數(shù)逐個(gè)輸出二維數(shù)組元素的值。6.3.3二維數(shù)組的輸入輸出【例6.4】一個(gè)學(xué)習(xí)小組有5位學(xué)生,每位學(xué)生有3門課程的考試成績(jī),如下表所示,求每位學(xué)生的平均成績(jī)。

姓名高等數(shù)學(xué)大學(xué)物理程序設(shè)計(jì)張明807890王浩667179李琴858892趙飛778690周正6881796.3.3二維數(shù)組的輸入輸出

課程(1)問(wèn)題分析設(shè)用一個(gè)二維數(shù)組a[5][3]存放5位學(xué)生3門課的成績(jī),再用一個(gè)一維數(shù)組b[5]存放所求得的每位學(xué)生的平均成績(jī)。

課程姓名高等數(shù)學(xué)大學(xué)物理程序設(shè)計(jì)a[0]a[0][0]=80a[0][1]=78a[0][2]=90a[1]667179a[2]858892a[3]778690a[4]688179平均成績(jī)b[0]a[0][3]6.3.3二維數(shù)組的輸入輸出#include<stdio.h>voidmain(){inti,j,s,b[5],a[5][3];//數(shù)組與變量的定義

printf("請(qǐng)輸入學(xué)生的成績(jī):\n");for(i=0;i<5;i++){s=0;for(j=0;j<3;j++) {scanf("%d",&a[i][j]);//二維數(shù)組數(shù)據(jù)的輸入,5行3列

s=s+a[i][j];//求二維數(shù)組每行元素之和}b[i]=s/3.0;//求二維數(shù)組每行元素的平均值

}for(i=0;i<5;i++)//輸出二維數(shù)組,按5行4列格式{for(j=0;j<3;j++)printf("%d",a[i][j]);

printf("%d\n",b[i]);}}(2)程序設(shè)計(jì)思考:若直接定義一個(gè)二維數(shù)組a[5][4],前3列為課程成績(jī),最后一列為平均成績(jī),如何修改程序?a[5][4];a[i][3]=s/3.0;4字符串是用雙撇號(hào)“"”作為定界符的一個(gè)字符序列,如:"a"、"Cprogram"等。在C語(yǔ)言中沒(méi)有專門的字符串變量,通常用一個(gè)字符數(shù)組來(lái)存放一個(gè)字符串。6.4字符串及其處理用來(lái)存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組。字符數(shù)組中的一個(gè)元素存放一個(gè)字符。定義字符數(shù)組的方法與定義數(shù)值型數(shù)組的方法類似前面介紹字符串常量時(shí),已說(shuō)明字符串總是以‘\0’作為串的結(jié)束符。因此,當(dāng)把一個(gè)字符串存入一個(gè)數(shù)組時(shí),也把結(jié)束符‘\0’存入數(shù)組,并以此作為該字符串是否結(jié)束的標(biāo)志。6.4.1字符串及其結(jié)束標(biāo)志

6.4字符串及其處理

字符串的長(zhǎng)度表示字符數(shù)組的實(shí)際長(zhǎng)度,C語(yǔ)言規(guī)定了字符串結(jié)束標(biāo)志'\0'。'\0'—代表ASCII碼為0的字符,是一個(gè)“空操作符”用它作為字符串結(jié)束標(biāo)志不會(huì)產(chǎn)生附加的操作或增加有效字符,只起一個(gè)供辨別的標(biāo)志。6.4字符串及其處理6.4.1字符串及其結(jié)束標(biāo)志

6.4.1字符串及其結(jié)束標(biāo)志

C語(yǔ)言允許用字符串的方式對(duì)數(shù)組作初始化賦值。例如:charc[]={'c','','p','r','o','g','r','a','m','\0'};charc[]={"Cprogram"};charc[]="Cprogram";C

program\0數(shù)組c在內(nèi)存中的實(shí)際存放情況:'\0'為字符串結(jié)束標(biāo)志,由系統(tǒng)自動(dòng)加上。charc[10]={"China"};可寫成charc[10]="China";從c[5]開始,元素值均為\0只顯示printf("%s",c);China\0\0\0\0\0如果一個(gè)字符數(shù)組中包含多個(gè)'\0',則遇第一個(gè)'\0'時(shí)輸出就結(jié)束6.4.1字符串及其結(jié)束標(biāo)志

字符數(shù)組的輸入輸出可以有兩種方法:

逐個(gè)字符輸入輸出(%c)

整個(gè)字符串一次輸入輸出(%s)輸出的字符中不包括結(jié)束符'0'用%s輸出字符串時(shí),printf函數(shù)中的輸出項(xiàng)是字符數(shù)組名,不是數(shù)組元素名6.4.2字符串的輸入/輸出

字符數(shù)組的輸入輸出可以有以下兩種方法:1、用“%c”格式符將字符逐個(gè)輸入或輸出;

#include<stdio.h>voidmain(){inti;charch[]="cprogram.";//定義字符數(shù)組,并賦值字符串for(i=0;ch[i]!='0';i++)

printf("%c",ch[i]);//輸出字符串}數(shù)組元素6.4.2字符串的輸入/輸出

2、用“%s”格式符,將整個(gè)字符串一次性輸入或輸出。#include<stdio.h>voidmain(){charch[]="cprogram.";//定義字符數(shù)組,并賦值字符串

printf("%s\n",ch);//輸出字符串}數(shù)組名6.4.2字符串的輸入/輸出

#include<stdio.h>voidmain(){charst[15];//定義字符數(shù)組

printf("請(qǐng)輸入一個(gè)字符串:\n");scanf("%s",st);//輸入字符串

printf("%s\n",st);//輸出字符串}兩處均為數(shù)組名,表示首地址注意:1、對(duì)一個(gè)字符數(shù)組,如果不作初始化賦值,則必須說(shuō)明數(shù)組長(zhǎng)度。2、當(dāng)用scanf函數(shù)輸入字符串時(shí),字符串中不能含有空格,否則將以空格作為串的結(jié)束符。6.4.3常用字符串處理函數(shù)C語(yǔ)言提供了豐富的字符串處理函數(shù)。用于輸入輸出的字符串函數(shù),在使用前應(yīng)包含頭文件<stdio.h>,使用其它字符串函數(shù)則應(yīng)包含頭文件。<string.h>1.字符串輸出函數(shù)puts格式:puts(字符數(shù)組名)功能:把字符數(shù)組中的字符串輸出到顯示器,即在屏幕上顯示該字符串。#include<stdio.h>voidmain(){charc[]="BASIC\nVC++6.0";//定義字符數(shù)組,并賦值字符串puts(c);//輸出字符數(shù)組}注意:'\n'與'\0'的區(qū)別'\n'—回車換行'\0'—字符串結(jié)束標(biāo)志2.字符串輸入函數(shù)gets格式:gets(字符數(shù)組名)功能:從標(biāo)準(zhǔn)輸入設(shè)備鍵盤上輸入一個(gè)字符串。本函數(shù)得到一個(gè)函數(shù)值,即為該字符數(shù)組的首地址。例如:#include<stdio.h>voidmain(){charst[15];//定義字符數(shù)組

printf("請(qǐng)輸入一個(gè)字符串:");

gets(st);//輸入字符數(shù)組

puts(st);//輸出字符數(shù)組}6.4.3常用字符串處理函數(shù)3.字符串連接函數(shù)strcat格式:strcat(字符數(shù)組名1,字符數(shù)組名2)功能:把字符數(shù)組2中的字符串連接到字符數(shù)組1中字符串的后面,并刪去字符串1后的串標(biāo)志'\0'。本函數(shù)返回值是字符數(shù)組1的首地址。例如:#include<stdio.h>#include<string.h>//使用字符串函數(shù)的頭函數(shù)voidmain(){charst1[30]="我的名字是:";//定義字符數(shù)組st1,并賦值字符串

charst2[10];//定義字符數(shù)組st2printf("請(qǐng)輸入你的姓名:");gets(st2);//輸入字符數(shù)組st2

strcat(st1,st2);//將字符數(shù)組st2連接到字符數(shù)組st1中

puts(st1);//輸出字符數(shù)組st1}6.4.3常用字符串處理函數(shù)4.字符串拷貝函數(shù)strcpy格式:strcpy(字符數(shù)組名1,字符數(shù)組名2)功能:把字符數(shù)組2中的字符串拷貝到字符數(shù)組1中。字符串結(jié)束標(biāo)志'\0'也一同拷貝。字符數(shù)組名2也可以是一個(gè)字符串常量,這時(shí)相當(dāng)于把一個(gè)字符串賦予一個(gè)字符數(shù)組。例如:#include<stdio.h>#include<string.h>//使用字符串函數(shù)的頭函數(shù)voidmain(){charst1[15],st2[]="CLanguage";

strcpy(st1,st2);//將字符數(shù)組st2中的字符復(fù)制到字符數(shù)組st1puts(st1);printf("\n");}6.4.3常用字符串處理函數(shù)5.字符串比較函數(shù)strcmp格式:strcmp(字符數(shù)組名1,字符數(shù)組名2)功能:按照ASCII碼值順序比較兩個(gè)字符數(shù)組中的字符,并由函數(shù)返回值返回比較結(jié)果。字符串比較規(guī)則:將兩個(gè)字符串中的字符從左到右逐個(gè)比較ASCII碼值的大小,如果遇到字符的ASCII值大,則對(duì)應(yīng)那個(gè)字符串就大;如果兩個(gè)字符串完全相同,則這兩個(gè)字符串就相等。字符串比較的結(jié)果由函數(shù)值帶回:①字符串1=字符串2,返回值=0;②字符串1>字符串2,返回值>0;③字符串1<字符串2,返回值<0。6.4.3常用字符串處理函數(shù)#include<stdio.h>#include<string.h>voidmain(){intk;charst1[15],st2[]="CLanguage";printf("請(qǐng)輸入一個(gè)字符串:");gets(st1);

k=strcmp(st1,st2);//將字符數(shù)組st1與st2中的字符進(jìn)行比較

if(k==0)printf("st1=st2\n");//比較結(jié)果為0時(shí),兩個(gè)字符串相等

if(k>0)printf("st1>st2\n");//比較結(jié)果大于0時(shí),st1>st2if(k<0)printf("st1<st2\n");//比較結(jié)果小于0時(shí),st1<st2}6.求字符串長(zhǎng)度函數(shù)strlen格式:strlen(字符數(shù)組名)功能:求字符串的實(shí)際長(zhǎng)度(不含字符串結(jié)束標(biāo)志'\0'),并作為函數(shù)返回值。例如:#include<stdio.h>#include<string.h>voidmain(){intk;charst[]="C語(yǔ)言程序設(shè)計(jì)";k=strlen(st);//求字符串的長(zhǎng)度,一個(gè)漢字的長(zhǎng)度為2,不含結(jié)束標(biāo)志

printf("字符串的長(zhǎng)度是:%d\n",k);}7.轉(zhuǎn)換大寫字母為小寫字母函數(shù)strlwr格式:strlwr(字符數(shù)組名)功能:將字符串中的大寫字母轉(zhuǎn)換為小寫字母。例如:printf("%s\n",strlwr("ThisisaBOOK."));8.轉(zhuǎn)換小寫字母為大寫字母函數(shù)strupr格式:strupr(字符數(shù)組名)功能:將字符串中的小寫字母轉(zhuǎn)換為大寫字母。例如:printf("%s\n",strupr("Thisisabook."));6.5程序設(shè)計(jì)舉例【例6.5】采用順序查找法在任意給定的10數(shù)中找出要查找的數(shù)。(1)算法分析首先從鍵盤輸入一個(gè)要查找的數(shù),然后將數(shù)組中每一個(gè)數(shù)依次與要查找的數(shù)進(jìn)行比較,如果相等,則表明已經(jīng)找到,找到時(shí)就退出循環(huán);如果所有數(shù)與要查找的數(shù)都不相等,則說(shuō)明要查找的數(shù)不存在。數(shù)組的典型應(yīng)用:查找順序查找:在數(shù)組a中查找是否存在數(shù)x?查找的方法一般有:順序查找,折半查找兩種。(2)程序設(shè)計(jì)#include<stdio.h>#defineN10voidmain(){inta[N],i,x;printf("請(qǐng)輸入10個(gè)數(shù)據(jù):\n");for(i=0;i<N;i++){printf("第%d個(gè)數(shù)據(jù):",i+1);

scanf("%d",&a[i]);}printf("\n\n");printf("請(qǐng)輸入要查找的數(shù):\n");scanf("%d",&x);//輸入要查找的數(shù)

for(i=0;i<N;i++)//將數(shù)組中的數(shù)據(jù)逐個(gè)與要找的數(shù)進(jìn)行比較

if(x==a[i])break;//找到時(shí),結(jié)束查找

if(i<N)//i<N時(shí),說(shuō)明是找到了,在循環(huán)體內(nèi)跳出的printf("要查找的數(shù)是:a[%d]=%d\n",i,x);else//i>=N時(shí),說(shuō)明整個(gè)數(shù)組中沒(méi)有等于要找的數(shù)printf("要查找的數(shù)%d不存在!\n",x);}

【例6.6】采用選擇法排序?qū)⑷我饨o定的10數(shù)按從小到大的順序排列。(1)算法分析設(shè)已經(jīng)在數(shù)組a中輸入了10個(gè)整數(shù),數(shù)組元素分別為a[0],a[1],……,a[9],且數(shù)組中的10個(gè)數(shù)據(jù)為:6,12,8,2,5,4,7,11,10,9。數(shù)組的典型應(yīng)用:排序數(shù)組的典型應(yīng)用:排序

排序的規(guī)律有升序(從小到大)和降序(從大到?。﹥煞N。排序的方法很多,常見的有:選擇排序,冒泡排序、插入排序等。第1輪:把a(bǔ)[0]依次與a[1]~a[9]中的數(shù)比較,如果a[0]大,則進(jìn)行交換;第2輪:把a(bǔ)[1]依次與a[2]~a[9]中的數(shù)比較,如果a[1]大,則進(jìn)行交換;第3輪:把a(bǔ)[2]依次與a[3]~a[9]中的數(shù)比較,如果a[2]大,則進(jìn)行交換;第4輪:把a(bǔ)[3]依次與a[4]~a[9]中的數(shù)比較,如果a[3]大,則進(jìn)行交換;第5輪:把a(bǔ)[4]依次與a[5]~a[9]中的數(shù)比較,如果a[4]大,則進(jìn)行交換;第6輪:把a(bǔ)[5]依次與a[6]~a[9]中的數(shù)比較,如果a[5]大,則進(jìn)行交換;第7輪:把a(bǔ)[6]依次與a[7]~a[9]中的數(shù)比較,如果a[6]大,則進(jìn)行交換;第8輪:把a(bǔ)[7]依次與a[8]~a[9]中的數(shù)比較,如果a[7]大,則進(jìn)行交換;第9輪:把a(bǔ)[8]與a[9]中的數(shù)比較,如果a[8]大,則進(jìn)行交換。數(shù)組的典型應(yīng)用:選擇法排序處理過(guò)程如下:初始數(shù)據(jù):6,12,8,2,5,4,7,11,10,9第一輪后結(jié)果:2,12,8,6,5,4,7,11,10,9第二輪后結(jié)果:2,4,12,6,8,5,7,11,10,9第三輪后結(jié)果:2,4,5,12,8,6,7,11,10,9第四輪后結(jié)果:2,4,5,6,12,8,7,11,10,9第五輪后結(jié)果:2,4,5,6,7,12,8,11,10,9第六輪后結(jié)果:2,4,5,6,7,8,12,11,10,9第七輪后結(jié)果:2,4,5,6,7,8,9,12,11,10第八輪后結(jié)果:2,4,5,6,7,8,9,10,12,11第九輪后結(jié)果:2,4,5,6,7,8,9,10,11,12數(shù)組的典型應(yīng)用:選擇法排序

回顧前面所介紹的三個(gè)數(shù)的排序方法,可將該方法擴(kuò)展到更多數(shù)的排序。

第1趟:把a(bǔ)[0]依次與a[1]~a[9]中的數(shù)比較;第2趟:把a(bǔ)[1]依次與a[2]~a[9]中的數(shù)比較;第3趟:把a(bǔ)[2]依次與a[3]~a[9]中的數(shù)比較;

……第8趟:把a(bǔ)[7]依次與a[8]~a[9]中的數(shù)比較;第9趟:把a(bǔ)[8]依次與a[9]比較;~a[9]i=0i=1i=2i=7i=8a[i]a[i+1]a[i]a[i+1]a[i]a[i+1]a[i]a[i+1]a[i]a[i+1]數(shù)組的典型應(yīng)用:選擇法排序#include<stdio.h>voidmain(){voida[10],i,j,t;printf("Input10numbers:\n");

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

printf("\n");

for(i=0;i<9;i++)for(j=i+1;j<=9;j++)if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}

printf("Thesortednumbers:\n");

for(i=0;i<10;i++) printf("%d",a[i]);}思考:能否改進(jìn),以減少交換次數(shù)?for(i=0;i<9;i++)

{p=i;//p指向第i個(gè)數(shù)

for(j=i+1;j<10;j++)if(a[j]<a[p])p=j;//第j個(gè)數(shù)小于p指的數(shù)時(shí),p向第j個(gè)數(shù)

if(i!=p)//p的值變化時(shí),交換

{t=a[i];a[i]=a[p];a[p]=t;}}【例6.7】采用冒泡法排序?qū)⑷我饨o定的10數(shù)按從小到大的順序排列。解題思路:排序的規(guī)律有兩種:一種是“升序”,從小到大;另一種是“降序”,從大到小把題目抽象為:“對(duì)n個(gè)數(shù)按升序排序”采用起泡法排序,下面以6個(gè)數(shù)為例,顯示動(dòng)態(tài)比較和交換過(guò)程。數(shù)組的典型應(yīng)用:冒泡法排序985420895420859420854920854290854209大數(shù)沉底,小數(shù)起泡a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<5;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}854209584209548209542809542089for(i=0;i<4;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}a[0]a[1]a[2]a[3]a[4]a[5]542089452089425089420589for(i=0;i<3;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}a[0]a[1]a[2]a[3]a[4]a[5]420589240589204589for(i=0;i<2;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}a[0]a[1]a[2]a[3]a[4]a[5]204589024589for(i=0;i<1;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<5;i++)if(a[i]>a[i+1]){……}for(i=0;i<4;i++)if(a[i]>a[i+1]){……}for(i=0;i<1;i++)if(a[i]>a[i+1]){……}……for(i=0;i<5-j;i++)if(a[i]>a[i+1]){……}for(j=0;j<5;j++)inta[10];inti,j,t;printf("input10numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(j=0;j<9;j++) for(i=0;i<9-j;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<10;i++)printf("%d",a[i]);printf("\n");典型問(wèn)題:折半查找【例6.8】采用折半查找法在任意給定的10個(gè)數(shù)中找出要查找的數(shù)。重復(fù)工作:①求中點(diǎn)m=(b+t)/2;②判斷a[m]是否等于x,如果等于x,則退出循環(huán),否則繼續(xù)下一步;③判斷x>a[m]?如果成立,說(shuō)明x可能在數(shù)組a的后一半(a[m+1],a[t])中,否則可能在數(shù)組a的前一半(a[t],a[m-1])中;④轉(zhuǎn)①。(1)算法分析設(shè)一維數(shù)組a中的數(shù)據(jù)是有序的(升序),b和t是一維數(shù)組a下標(biāo)的最小值和最大值。b=m+1開始結(jié)束輸入a數(shù)組,xa[m]=xYNx>a[m]YNm=(b+t)/2判斷加輸出t=m-1對(duì)數(shù)組a排序b=0,t=9b<=tYN(3)程序設(shè)計(jì)#include<stdio.h>voidmain(){inta[10],x,i,j,m,b,t;printf("請(qǐng)輸入10個(gè)數(shù):\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("輸入要查找的數(shù):\n");scanf("%d",&x);//輸入要查找的數(shù)

for(i=0;i<9;i++)//選擇法排序

for(j=i+1;j<10;j++)if(a[i]>a[j])

{t=a[i];a[i]=a[j];a[j]=t;}典型問(wèn)題:折半查找(3)程序設(shè)計(jì)b=0;t=9;//設(shè)查找的區(qū)間的下限和上限

while(b<=t)//當(dāng)下限小于或等于上限時(shí),進(jìn)行循環(huán)

{m=(b+t)/2;

if(x==a[m])break

if(x>a[m])//若要找的數(shù)大于中點(diǎn)元素,則在右一半找b=m+1;else//若要找的數(shù)小于中點(diǎn)元素,則在左一半找t=m-1;}if(b<=t)//若下限小于或等于上限時(shí),則找到,否則沒(méi)有找到

printf("要查找的數(shù)a[%d]=%d\n",m,x);elseprintf("%d要查找的數(shù)不存在!\n",x);}【例6.9】用篩選法求100以內(nèi)的素?cái)?shù)。算法分析:(1)定義一維數(shù)組a,其初值為:2,3,……,100;(2)若a[k]不為0,則將該元素的倍數(shù)的數(shù)組元素置為0;(3)數(shù)組a中不為0的元素,均為素?cái)?shù)。典型問(wèn)題:求素?cái)?shù)

#include<math.h>voidmain(){intk,j,a[101],l=0;

for(k=2;k<101;k++)a[k]=k;for(k=2;k<sqrt(101);k++)for(j=k+1;j<101;j++)

if(a[k]!=0&&a[j]!=0) if(a[j]%a[k]==0)a[j]=0;for(k=2;k<101;k++){if(a[k]!=0)printf("%10d",a[k]);l=l+1;if(l%5==0)printf("\n");}}賦初值,數(shù)組值等于下標(biāo)若a[k]不為0,則將該元素的倍數(shù)的數(shù)組元素置為0數(shù)組a中不為0的元素均為素?cái)?shù)

【例6.4】

將一個(gè)二維數(shù)組行和列的元素互換,存到另一個(gè)二維數(shù)組中。典型問(wèn)題:矩陣處理解題思路:可以定義兩個(gè)數(shù)組:數(shù)組a為2行3列,存放指定的6個(gè)數(shù)數(shù)組b為3行2列,開始時(shí)未賦值將a數(shù)組中的元素a[i][j]存放到b數(shù)組中的b[j][i]元素中用嵌套的for循環(huán)完成典型問(wèn)題:矩陣處理#include<stdio.h>voidmain(){inta[2][3]={{1,2,3},{4,5,6}};intb[3][2],i,j;printf("arraya:\n");for(i=0;i<=1;i++){for(j=0;j<=2;j++){printf("%5d",a[i][j]);b[j][i]=a[i][j];}printf("\n");}//處理a的一行中各元素//處理a中某一列元素//輸出a的各元素//a元素值賦給b相應(yīng)元素

printf("arrayb:\n");for(i=0;i<=2;i++){for(j=0;j<=1;j++)printf("%5d",b[i][j]);printf("\n");}}

//輸出b的各元素典型問(wèn)題:矩陣處理

【例6.10】有一個(gè)3×4的矩陣,要求找出其中值最大的那個(gè)元素的值,以及其所在的行號(hào)和列號(hào)。解題思路:采用“打擂臺(tái)算法”先找出任一人站在臺(tái)上,第2人上去與之比武,勝者留在臺(tái)上第3人與臺(tái)上的人比武,勝者留臺(tái)上,敗者下臺(tái)以后每一個(gè)人都是與當(dāng)時(shí)留在臺(tái)上的人比武,直到所有人都上臺(tái)比為止,最后留在臺(tái)上的是冠軍典型問(wèn)題:矩陣處理

解題思路:采用“打擂臺(tái)算法”先把a(bǔ)[0][0]的值賦給變量max,并記當(dāng)前最大值所在行和列為0;max用來(lái)存放當(dāng)前已知的最大值,row和colum用來(lái)存入最大值所在的行號(hào)和列號(hào);將數(shù)組中的每個(gè)數(shù)組元素依次與max比較,如a[0][1]與max比較,如果a[0][1]>max,則表示a[0][1]是已經(jīng)比過(guò)的數(shù)據(jù)中值最大的,把它的值賦給max,取代了max的原值,同時(shí)修改行號(hào)和列號(hào);以后依此處理,最后max就是最大的值,row和colum的值就是最大值所在的位置。

fori=0to2

forj=0to3max=a[i][j]row=Icolum=ja[i][j]>max真

max=a[0][0]輸出:max,row,colum假……

inti,j,row=0,colum=0,max;inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};max=a[0][0];for(i=0;i<=2;i++)for(j=0;j<=3;j++)if(a[i][j]>max){max=a[i][j];row=i;colum=j;}printf("max=%d\nrow=%d\ncolum=%d\n",max,row,colum);……思考:1.求一個(gè)3*3的整型矩陣對(duì)角線元素(周邊元素)之和2.輸出楊輝三角形。111121133114641……典型問(wèn)題:矩陣處理對(duì)角線及周邊元素之和#defineN4voidmain(){inta[N][N],i,j;……//定義sum1,sum2并賦初值,二維數(shù)組賦值并輸出)for(i=0;i<N;i++)//計(jì)算對(duì)角線元素之和 for(j=0;j<N;j++)

if(i==j||i+j==N-1)//滿足條件的才相加 sum1+=a[i][j];printf("兩條對(duì)角線上的元素之和為:%5d\n",sum1);for(i=0;i<N;i++) for(j=0;j<N;j++)

if(i==0||i==N-1||j==0||j==N-1) sum2+=a[i][j];printf("四周靠邊的元素之和為:%5d\n",sum2);}楊輝三角形#defineN8voidmain(){inta[N][N],i,j;for(i=0;i<N;i++)//N為符號(hào)常量,由#define定義{a[i][0]=1;a[i][i]=1; for(j=1;j<i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j];}for(i=0;i<N;i++){ for(j=0;j<=i;j++)//僅輸出下三角的數(shù)組元素printf("%5d",a[i][j]);printf("\n");}}for(i=0;i<N;i++){for(j=0;j<=i;j++)if()a[i][j]=0; elsea[i][j]=a[i-1][j-1]+a[i-1][j];}

字符例1:輸入一行字符,編寫程序分別統(tǒng)計(jì)各個(gè)英文字母出現(xiàn)的次數(shù)(不區(qū)分字母大小寫)。解題思路:統(tǒng)計(jì)26個(gè)字母中每個(gè)字母出現(xiàn)的次數(shù),可定義數(shù)組存放每個(gè)字符的個(gè)數(shù),如zmc[26],并初始化為0從第1個(gè)字符開始逐個(gè)字符進(jìn)行檢查,判斷此字符是否是大寫字母,如果是'A',就將zmc

[0]加1如果是'B',就將zmc

[1]加1如果是'C',就將zmc

[2]加1如果是ch,就將zmc

[?]加1否則,判斷此字符是否是小寫字母,如果是'a',就將zmc

[0]加1典型問(wèn)題:字符處理統(tǒng)計(jì)各個(gè)英文字母出現(xiàn)的次數(shù)—部分代碼while((ch=getchar())!='\n') { if(ch>='A'&&ch<='Z') zmc[ch-'A']++; elseif(ch>='a'&&ch<='z') zmc[ch-'a']++; }for(i=0;i<26;i++)

printf("%c:%d\n",i+'a',zmc[i]); charch;intzmnum=0,kgnum=0,sznum=0,other_num=0;while((ch=getchar())!='\n') {if(ch>='a'&&ch<='z'||ch<='z'&&ch>='a')zmnum++;elseif(ch=='')kgnum++;elseif(ch>='0'&&ch<='9')sznum++;elseother_num++; }isalpha(ch)(isspace(ch))(isdigit(ch))函數(shù)外部加#include<ctype.h>

溫馨提示

  • 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)論