第章數組與字符串數組的定義和使用字符串和字符_第1頁
第章數組與字符串數組的定義和使用字符串和字符_第2頁
第章數組與字符串數組的定義和使用字符串和字符_第3頁
第章數組與字符串數組的定義和使用字符串和字符_第4頁
第章數組與字符串數組的定義和使用字符串和字符_第5頁
已閱讀5頁,還剩63頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第5章數組與字符串5.1數組的定義和使用5.2字符串和字符數組5.3數組作為函數的參數

本章教學目標:理解數組的概念,掌握數組的定義、初始化和數組元素的訪問學習數組的應用,如數組元素的查找、排序等要求學生掌握字符串函數操作字符數組的方法。通過數組的學習,提高學生的數據管理能力和編程能力

本章重點內容:一維數組、二維數組的定義及初始化賦值;一維數組、二維數組的引用;字符數組的輸入輸出;字符串的處理函數數組作為函數參數以及數組的應用。【例5-1】求5個學生的平均成績#include<stdio.h>voidmain(){floata0,a1,a2,a3,a4,aver;scanf("%f%f%f%f%f",&a0,&a1,&a2,&a3,&a4);aver=(a0+a1+a2+a3+a4)/5;printf("平均成績是:%4.1f\n",aver);}如果有100個學生,程序也不復雜,但很不方便。定義存放成績的

100個變量就是一件麻煩事,而利用C語言中數組可以輕易地解決這個問題。

5.1數組的定義和使用

是一組具有相同數據類型的數據的有序集合。數組一個班學生的學習成績一行文字一個矩陣這些數據的特點是:1、具有相同的數據類型2、使用過程中需要保留原始數據

C語言為這些數據,提供了一種構造數據類型:數組。5.1.1數組的概念數組是構造數據類型之一,是一種自定義數據類型數組的相關概念:數組:是數目固定,類型相同的若干個變量的有序集合,用數組名標識。

序:是數組元素之間的位置關系,不是元素值的大小順序。元素:屬同一數據類型,用數組名和下標確定

數組名:是用于區別其它數組及變量的

下標:是數組元素在數組中的位置5.1.2一維數組的定義和使用1定義方式:數據類型數組名[常量表達式];合法標識符表示數組長度[]:數組運算符不能用()例

inta[6];a[0]0145a[1]a[2]a[3]a[4]a[5]23a編譯時分配連續內存內存字節數=數組長度*sizeof(元素數據類型)數組名表示內存首地址,是地址常量例如:

inta[10];說明整型數組a,有10個元素。

floatb[10],c[20];說明實型數組b,有10個元素,實型數組c,有20個元素。

charch[20];說明字符數組ch,有20個元素。例inti=15;

int

data[i];(

不能用變量定義數組長度)例:①floata[0]; /*數組大小為0沒有意義*/②intb(2)(3);/*不能使用圓括號*/③intk,a[k];/*不能用變量說明數組大小*/2、一維數組的引用(所謂引用,就是訪問(存、取)數組元素)數組必須先定義,后使用只能逐個引用數組元素,不能一次引用整個數組數組元素表示形式:數組名[下標]其中:下標可以是常量或整型表達式例inta[10];a=100,或scanf(“%d”,a);(

)必須

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

scanf(“%d”,&a[j]);(

)例inti=2,data[15];data[0]=1;data[i]=16;data[15]=10;//C語言對數組不作越界檢查,使用時要注意3、一維數組的初始化初始化方式在定義數組時,為數組元素賦初值(在編譯階段使之得到初值)

inta[5]={1,2,3,4,5};等價于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;說明:數組不初始化,其元素值為隨機數當全部數組元素賦初值時,可不指定數組長度如inta[5]={6,2,3};

等價于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;如inta[3]={6,2,3,5,1};(

)只給部分數組元素賦初值

inta[]={1,2,3,4,5,6};編譯系統根據初值個數確定數組長度4一維數組應用舉例將一維數組和循環結合起來,可以解決以下常見的問題:(1)數據統計,如計算若干個數據的最大值、最小值、總和、平均值等。(2)數學中某些數列的表示,如Fibonacii數列、約瑟夫問題的求解等。(3)若干個數據的排序,常見的排序算法有冒泡法、選擇法等。(4)數據的檢索,在未排序或已排序的數據序列中查找指定的數據是否存在。【例5-2】求100個學生的平均成績分析:整個程序可以分為2步,首先輸入100個成績,并計算100個成績的和,再計算平均成績。程序如下:#include<stdio.h>voidmain(){floata[100],sum=0,aver;inti;for(i=0;i<100;++i){scanf("%f",&a[i]);sum+=a[i];}aver=sum/100;//計算平均成績for(i=0;i<100;++i){if(i%10==0)printf("\n");//一行顯示10個

printf("%5.1f",a[i]);

}

printf("\n平均成績為:%4.1f\n",aver);}例5-3讀10個整數存入數組,找出其中最大值和最小值步驟:1.輸入:for循環輸入10個整數2.處理:(a)先令max=min=x[0](b)依次用x[i]和max,min比較(循環)若max<x[i],令max=x[i]

若min>x[i],令min=x[i]3.輸出:max和min#include<stdio.h>#defineSIZE10main(){int

x[SIZE],i,max,min;

printf("Enter10integers:\n");

for(i=0;i<SIZE;i++){printf("%d:",i+1);

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);}例5-4用數組求Fibonacci數列前20個數)3()2(12)1(1121=+=====--nFFFnFnFnnnf[0]f[1]f[2]f[3]f[4]f[5]f[19]……...11f[19]01452319235#include<stdio.h>main(){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]);}}運行結果如下:

11235813213455891442333776109871597258441816765例5-5用冒泡法對10個數排序排序過程:(1)比較第一個數與第二個數,若為逆序(a[0]>a[1]),則交換;然后比較第二個數與第三個數;依次類推,直至第n-1個數和第n個數比較為止——第一趟冒泡排序,結果最大的數被安置在最后一個元素位置上(2)對前n-1個數進行第二趟冒泡排序,結果使次大的數被安置在第n-1個元素位置(3)重復上述過程,共經過n-1趟冒泡排序后,排序結束例3849657613273097第一趟38496513273076第二趟384913273065第三趟3813273049第四趟13273038第五趟132730第六趟4938659776132730初始關鍵字n=8384976971397279730971376767627301365276530651313494930492738273830381327第七趟#include<stdio.h>main(){inta[11],i,j,t;

printf("Input10numbers:\n");

for(i=1;i<11;i++)

scanf("%d",&a[i]);

printf("\n");

for(j=1;j<=9;j++)for(i=1;i<=10-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=1;i<11;i++)

printf("%d",a[i]);}選擇法排序:是指先將a[0]~a[n]中的最小元素與a[0]交換;再將a[1]~a[n]中的最小元素與a[1]交換……,每進行一輪比較,找出當前未排序數中的最小元素。比較n-1輪后,排序結束。程序如下:#include<stdio.h>voidmain(){inti,j,p,t,a[10];

printf("\ninput10numbers:\n");for(i=0;i<10;i++)

scanf("%d",&a[i]);for(i=0;i<10;i++)//第i輪排序{p=i;for(j=i+1;j<10;j++)//找最小元素

if(a[j]<a[p])p=j;if(i!=p){t=a[i];a[i]=a[p];a[p]=t;}//交換

printf("%8d",a[i]);}}5.1.3二維數組的定義和引用(1)二維數組的定義若有一個數組,它的每個元素都是類型相同的一維數組時,便構成了二維數組。在邏輯上可以把二維數組看成是一個具有行和列的表格或一個矩陣。在C語言中,二維數組的定義語句形式如下:

類型標識符數組名[常量表達式1][常量表達式2];

其中常量表達式1表示第一維下標的長度,常量表達式2表示第二維下標的長度。例如有以下定義:inta[3][4];定義了一個三行四列的數組,且數組名為a.

inta[3][4];從定義形式可知:定義了一個名為a的二維數組。a數組中每個元素都是整型。a數組中共有12個元素,相當于12個變量。a數組的邏輯結構是一個具有如下形式的3行4列的矩陣(或表格):

第0列第1列第2列第3列第0行a[0][0]a[0][1]a[0][2]a[0][3]第1行a[1][0]a[1][1]a[1][2]a[1][3]第2行a[2][0]a[2][1]a[2][2]a[2][3](2)

二維數組元素的引用

C語言中,二維數組的元素也稱為雙下標變量,其引用形式如下:

數組名[下標1][下標2]“下標1”稱為第一維下標(或稱為行下標),“下標2”為第二維下標(或稱為列下標)。

下標從0開始變化,其值分別小于數組定義中的“常量表達式1”與“常量表達式2”例如,若有以下定義句:

floata[3][4];則a[0][1]、a[i][j]、a[i+k][j+k]都是合法的數組元素引用形式,只是每個下標表達式的值必須是整數,且不得超越數組定義中的上、下界。(3)二維數組在內存中的存放

存儲器單元是按一維線性排列的。如何在一維存儲器中存放二維數組,可有兩種方式:

一種是按行優先排列,即放完一行之后順次放入第二行。另一種是按列優先排列,即放完一列之后再順次放入第二列。

在C語言中,二維數組是按行優先排列的。即:先存放a[0]行,再存放a[1]行,最后存放a[2]行。inta[3][2]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]014523a[0][0]a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1](4)二維數組的初始化

與一維數組相似,在定義二維數組時也可以同時對其進行初始化。二維數組初始化也是在類型說明時給各下標變量賦以初值。二維數組可按行分段賦值,也可按行連續賦值。

例如對整型數組a[3][3]:

(1)按行分段賦值可寫為:

inta[3][3]={{80,75,92},{61,65,71},{59,63,70}};

(2)按行連續賦值可寫為:

inta[3][3]={80,75,92,61,65,71,59,63,70};(3)可以只對部分元素賦初值,未賦初值的元素自動賦值為0或空字符。例如:inta[3][3]={{1},{2},{3}};

賦值后各元素的值為:

100200300

inta[3][3]={{0,1},{0,0,2},{3}};

賦值后的元素值為:010002300注意兩種形式的區別如果是這樣寫:

inta[3][3]={1,2,3};結果又如何呢?(4)如對全部元素賦初值,則可以不指定第一維的長度,但是第二維的長度必須確定。

C語言編譯系統可自動根據初值數目與第二維大小自動確定第一維大小。若是采用分行初始化的方式,則根據初始值行數確定第一維大小。

例如:

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

可以寫為:

inta[][3]={1,2,3,4,5,6,7,8,9};(5)二維數組應用舉例

利用二維數組,可以解決以下常見的問題:(1)計算m×n矩陣中的每行、每列、對角線上元素的和、平均值。(2)計算m×n矩陣中的每行、每列元素的最大值、最小值。【例5-9】編寫程序,將2行3列的二維數組a中的每個元素行列互換,存到另一個3行2列的數組b中分析:這是矩陣中的行列轉置的問題,關鍵要弄清兩個數組行、列下標之間的對應關系,即數組a的第i行的第j個元素在數組b中是第j行第i列。通過雙重循環對數組元素進行可以實現行列轉置。例如:a=12314456b=2536#include<stdio.h>main(){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");}printf("arrayb:\n");for(i=0;i<=2;i++){for(j=0;j<=1;j++) printf("%5d",b[i][j]);

printf("\n");}}運行結果如下:arraya:123456arrayb:1425

36

【例5-11】有一個3行4列的矩陣,要求編程序求出其中值最大的那個元素的值,以及其所在的行號和列號分析:這是矩陣中的求最大值問題。編程思路是,使用雙重循環在二維數組a中尋找最大的元素,并保存最大元素及其行列號。#include"stdio.h"main(){inti,j,x[3][4],max,row,col;

printf("inputarraynumbers:\n");

for(i=0;i<3;i++)for(j=0;j<4;j++)

scanf(“%d”,&x[i][j]);/*鍵盤輸入數據*/max=x[0][0];row=col=0;

for(i=0;i<3;i++)for(j=0;j<4;j++)if(max<x[i][j]){max=x[i][j];row=i;col=j;}printf("max=%d\nrow=%d\ncol=%d\n",max,row,col);}如果是初始化數組元素#include<stdio.h>main(){inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};

inti,j,row=0,colum=0,max;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,row=%d,

colum=%d\n",max,row,colum);}【例5-12】一個學習小組有5個人,每個人有三門課的考試成績。求全組分科的平均成績和各科總平均成績張三李四王五趙六周七語文8061598576數學7565638777英語9271709085分析:可設一個二維數組a[5][3]存放五個人三門課的成績。再設一個一維數組v[3]存放所求得各分科平均成績,設變量average為全組各科總平均成績。程序中用一個雙重循環。在內循環中依次讀入某一門課程的各個學生的成績,并把這些成績累加起來,退出內循環后再把該累加成績除以5存入v[i],這就是該門課程的平均成績。外循環共循環三次,分別求出三門課各自的平均成績并存放在v數組之中。退出外循環之后,把v[0],v[1],v[2]相加除以3即得到各科總平均成績。最后按題意輸出各個成績。#include<stdio.h>voidmain(){inti,j,s,a[5][3];floataverage,v[3];

printf("輸入5個學生三門功課的成績\n");for(i=0;i<3;i++){s=0;for(j=0;j<5;j++) {scanf("%d",&a[j][i]);//輸入各科成績

s=s+a[j][i];//計算各科總分

}

v[i]=s/5.0;//計算各科平均成績

}average=(v[0]+v[1]+v[2])/3;//計算總平均成績

printf("語文:%.1f\n數學:%.1f\n英語:%.1f\n",v[0],v[1],v[2]);

printf("總平均分:%.1f\n",average);}【例5-13】N階魔方陣是由一個N×N的1到N2之間的自然數構成的矩陣。它的每一行、每一列和對角線之和均相等。例如,一個三階魔方陣如下所示,它的每一行、每一列和對角線之和均為15。編寫程序,輸出N階魔方陣816357492分析:有一個簡單的方法可以生成魔方陣。依次將1到N2填入矩陣,填入的位置由如下規則確定:第1個元素放在第0行的中間一列。下一個元素放在當前元素的上一行、下一列。如上一行、下一列已經填好,則下一個元素的填入位置為當前列下一行。在找上一行、下一行或下一列時,必須把矩陣看成是回繞的。也就是說,如果當前行是最后一行時,下一行為第0行;當前行是第0行時,上一行為最后一行;當前列是最后一列時,下一列為第0列。程序如下:#include<stdio.h>#defineMAX15voidmain(){

inti,row,col,n,a[MAX][MAX]={0};

printf("輸入n:\n");

scanf("%d",&n);row=0;col=(n-1)/2;a[row][col]=1;//填入1

for(i=2;i<=n*n;i++)//依次填入2至n×n{if(a[(row-1+n)%n][(col+1)%n]==0)//如果下一個位置未填數

{row=(row-1+n)%n;//計算下一個位置的行號

col=(col+1)%n;//計算下一個位置的列號}elserow=(row+1)%n;//如果已填數,下一個位置為當前行的下一列

a[row][col]=i;//填入I}

printf("%d階魔方陣如下:\n",n);for(row=0;row<n;row++){for(col=0;col<n;col++)printf("%4d",a[row][col]);

printf("\n");}}5.2字符串與字符數組5.2.1字符串的概念字符串是由一對雙引號括起的字符序列。例如:”CHINA”,”Cprogram”等,字符串總是以‘\0’作為串的結束符。(1)字符串的定界符:雙引號(2)字符串的長度:雙引號內字符的個數

A、含空格;

B、ASCII字符:長度為1;

C、一個漢字:長度為2。(3)空串:不含任何字符的字符串(4)認真區分:’A’和”A”字符串和字符是不同的,它們之間主要有以下區別:(1)字符由單引號括起來,字符串由雙引號括起來。(2)字符只能是單個字符,字符串則可以含一個或多個字符。(3)可以把一個字符賦予一個字符變量,但不能把一個字符串常量賦予一個字符變量。在C語言中可以用一個字符數組來存放一個字符串。(5)字符串中可以含有轉義符

例:字符串:”\”cout<<ch\”\n”

解釋:其中第一個\”和第二個\”都表示將”裝成普通的雙引號,而不是字符串定界符;轉義符和其后的字符只算一個字符。

2、字符串的存儲

1)C語言中,用一維數組存儲字符串

2)數組長度=字符串長度+13)存儲方法:設字符串有n個字符,則字符依次存入數組的0~n-1號元素中,最后把一個空字符“\0”存入下標為n的元素

4)存儲內容:字符的ASCII碼或區位碼例:用a[12]存儲:“Springs.”

數組a[12]的內容下標01234567891011元素Springs.\0\0\0\0ASCII831161141051101031154600005)當數組存儲字符串時,如尾部尚剩余元素,則自動位置存入\0,a數組的a[9]、a[10]、a[11]均自動存入’\0’

5.2.2字符數組的定義與使用1、字符數組的定義與引用字符數組是指數組中每個元素的類型都是字符型,即數據為字符型的數組,可以是一維數組,也可以是二維數組。對于一個字符串,可以用一維數組來存放和處理,而對多個字符串進行處理時,可以使用多個一維數組分別存儲一個字符串,也可以用一個二維字符數組實現,即每一行保存一個字符串。例charc[10],ch[3][4];字符數組引用方法:一是以數組元素的方式,如:c[1],ch[1][1]二是以一維數組名方式進行字符串的整體輸入輸出

2、字符數組的初始化一維字符數組初始化方法:

(1)逐個字符賦值

(2)用字符串常量

例charch[5]={‘H’,’e’,’l’,’l’,’o’};

charch[]={‘H’,’e’,’l’,’l’,’o’};長度省略ch[0]Hello逐個字符賦值ch[1]ch[2]ch[3]ch[4]

例charch[5]={‘B’,’o’,’y’};部分賦值,補‘\0’ch[0]Boy\0\0逐個字符賦值ch[1]ch[2]ch[3]ch[4]用字符串常量

例charch[6]={“Hello”};charch[6]=“Hello”;charch[]=“Hello”;ch[0]ch[1]ch[2]ch[3]ch[4]Hello\0ch[5]系統分配40個字節的空間,4個字符串的保存形式如下所示,每個字符串總是從第0個元素開始存放。str[0]BASIC\0str[1]PASCAL\0str[2]Java\0str[3]Access\0二維字符數組初始化例如:charstr[4][10]={"BASIC","PASCAL","Java","Access"};或:charstr[][10]={"BASIC","PASCAL","Java","Access"};5.2.3字符數組的輸入與輸出字符數組的輸入與輸出:實際上是對字符數組所保存的字符串進行輸入輸出,可以對每個字符順序進行,也可以對整個字符串整體處理1、逐個字符輸入/輸出常用函數:scanf、printf、getchar

格式控制符%c2、整個字符串輸入/輸出常用函數:scanf、printf、gets,格式控制符

%s例用%c

main(){charstr[5];

inti;for(i=0;i<5;i++)

scanf(“%c”,&str[i]);for(i=0;i<5;i++)

printf(“%c”,str[i]);}

i=0;While(str[i]=getchar()!=‘\n’)i++;

str[i]=‘\0’;例用%s

main(){charstr[5];

scanf(“%s”,str);

printf(“%s”,str);}用字符數組名,不要加&輸入串長度<數組長度遇空格或回車結束自動加‘\0’用字符數組名,遇‘\0’結束例main(){chara[5]={‘H’,’e’,’l’,’l’,’o’};

printf(“%s”,a);}例main(){chara[]=“Hello”;

printf(“%s”,a);}結果:Hello#-=*

hello02314結果:Hello注:用“%s”輸出時,遇‘\0’結束例main(){inti;chara[5]={‘H’,’e’,’l’,’l’,’o’};

for(i=0;i<5;i++)

printf(“%c”,a[i]);}結果:Hellomain(){chara[]={'h','e','l','\0','l','o','\0'};

printf("%s",a);}例輸出:hel

hel\0lo\0注:數組中有多個‘\0’時,遇第一個結束例字符串輸入舉例

How\0

are\0

you?\0

#include<stdio.h>main(){chara[15],b[5],c[5];

scanf("%s%s%s",a,b,c);

printf("a=%s\nb=%s\nc=%s\n",a,b,c);

scanf("%s",a);

printf("a=%s\n",a);}運行情況:輸入:Howareyou?輸出:a=Howb=arec=you?輸入:Howareyou?輸出:a=How注:scanf中%s輸入時,遇空格或回車結束常用的字符串處理函數包含在頭文件string.h字符串輸出函數puts格式:puts(字符數組)功能:向顯示器輸出字符串(輸出完,換行)說明:字符數組必須以‘\0’結束字符串輸入函數gets格式:gets(字符數組)功能:從鍵盤輸入一以回車結束的字符串放入字符數組中,并自動加‘\0’說明:輸入串長度應小于字符數組長度例#include<stdio.h>main(){charstring[80];

printf(“Inputastring:”);

gets(string);puts(string);}輸入:Howareyou?輸出:Howareyou?5.2.4字符串函數字符串連接函數strcat格式:strcat(字符數組1,字符數組2)功能:把字符數組2連到字符數組1后面返值:返回字符數組1的首地址說明:字符數組1必須足夠大連接前,兩串均以‘\0’結束;連接后,串1的‘\0’取消,新串最后加‘\0’字符串拷貝函數strcpy格式:strcpy(字符數組1,字符串2)功能:將字符串2,拷貝到字符數組1中去返值:返回字符數組1的首地址說明:字符數組1必須足夠大拷貝時‘\0’一同拷貝不能使用賦值語句為一個字符數組賦值例charstr1[20],str2[20];str1={“Hello!”};(

)str2=str1;(

)例strcpy與strcat舉例#include<string.h>#include<stdio.h>voidmain(){chardestination[25];charblank[]="",c[]="C++",turbo[]="Turbo";

strcpy(destination,turbo);

strcat(destination,blank);

strcat(destination,c);

printf("%s\n",destination);}輸出:TurboC++TrboC++0123456789u\024…….Trbo0123456789u\024…….…….Trbo\00123456789u24…….…...字符串比較函數strcmp格式:strcmp(字符串1,字符串2)功能:比較兩個字符串的大小比較規則:對兩串從左向右逐個字符比較(ASCII碼),直到遇到不同字符或‘\0’為止返值:返回int型整數,a.若字符串1<字符串2,返回負整數

b.若字符串1>字符串2,返回正整數

c.若字符串1==字符串2,返回零說明:字符串比較不能用“==”,必須用strcmp串的比較函數是比較串中相對應字符的大小,不是比較首元素的地址

字符串長度函數strlen格式:strlen(字符數組)功能:計算字符串長度返值:返回字符串實際長度,不包括‘\0’在內例對于以下字符串,strlen(s)的值為:(1)chars[10]={‘A’,‘\0’,‘B’,‘C’,‘\0’,‘D’};(2)chars[10]=″China″;答案:15#include<string.h>#include<stdio.h>main(){charstr1[]=”Hello!",str2[]=”Howareyou?”,str[20];

intlen1,len2,len3;

len1=strlen(str1);len2=strlen(str2);

if(strcmp(str1,str2)>0)

{strcpy(str,str1);strcat(str,str2);}

elseif(strcmp(str1,str2)<0)

{strcpy(str,str2);strcat(str,str1);}

elsestrcpy(str,str1);len3=strlen(str);

puts(str);printf(”Len1=%d,Len2=%d,Len3=%d\n”,len1,len2,len3);}例strcmp與strlen舉例Howareyou?Hello!Len1=6,Len2=12,Len3=185.2.5字符串的應用舉例【例5-27】輸入一行字符,統計其中有多少個單詞分析:輸入字符串存入字符數組中,結合循環對每個元素分別進行判斷,如果是空格,說明一個單詞結束。#include<stdio.h>main(){charstring[81];

inti,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++;}

printf("Thereare%dwordsintheline\n",num);}當前字符=空格是否未出現新單詞,使word=0,num不累加前一字符為空格(word==0),新單詞出現,word=1,num加1前一字符為非空格(word==1),未出現新單詞,num不變否0是11是1未01否0是12否1未12是1未02否0是13是1未03否0是14否1未14否1未14否1未14例輸入:Iamaboy.

當前字符是否空格word原值新單詞開始否word新值num值

Iamaboy.How\0Hello\0High\0str[0]str[1]str[2]例有三個字符串,找出其中最大者分析:1、需要用到比較函數strcmp才能進行字符串的大小比較,2、定義一個三行的二維數組存放三個字符串,再用一個一維數組存放最大的那個字符串#include<stdio.h>#include<string.h>main(){charstring[20],str[3][20];

inti;

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

gets(str[i]);

if(strcmp(str[0],str[1])>0) strcpy(string,str[0]);elsestrcpy(string,str[1]);if(strcmp(str[2],string)>0) strcpy(string,str[2]);

printf("\nThelargeststring\is:\n%s\n",string);}【例5-29】從鍵盤輸入10個字符串,將這10字符串排序并輸出分析:10個字符串應由一個二維字符數組來處理。由于C語言可以把一個二維數組當成多個一維數組處理。因此又可以按10個一維數組處理,而每一個一維數組就是一個字符串。用字符串比較函數比較各一維數組的大小,排序并輸出結果。使用gets函數輸入10字符串存入二維字符數組str中,使用選擇法對10個字符串進行排序并輸出#include<stdio.h>#include<string.h>voidmain(){inti,j,p;chartmp[20],str[10][20];

printf("輸入10個字符串:\n");for(i=0;i<10;i++)gets(str[i]);printf("10個字符串的排序結果如下:\n");

for(i=0;i<10;i++){p=i;for(j=i+1;j<10;j++)

if(strcmp(str[j],str[p])<0)p=j;

strcpy(tmp,str[i]);

strcpy(str[i],str[p]);

strcpy(str[p],tmp);

puts(str[i]);}}5.3數組作為函數的參數

數組作為函數參數使用主要有兩種情況:

一種是數組元素作為函數的實參,這種情況與普通變量作為實參一樣,是將數組元素的值傳遞給形參。形參的變化不會影響到實參數組元素,我們稱這種參數傳遞方式為值傳遞;

另一種是數組名作為實參,要求函數形參是相同類型的數組或指針,這種方式是把實參數組的起始地址傳給形參數組,形參數組的改變也是對實參數組元素的改變,稱這種參數傳遞方式為地址傳遞。1.數組元素作實參

在函數調用中,數組元素的使用和變量相同,因此,其作為函數參數也與變量相同,仍是單向的值傳遞。數組元素的值可以傳送給該變量,在函數中只能對該變量進行操作,而不能直接引用對應的數組元素,更不能在函數中改變對應數組元素中的值。【例5-30】求一個數組中所有素數的和

分析:由于數組有多個元素,對每個元素均作同樣的是否是素數的判斷,因此通過定義一個素數判定函數來實現將使問題的求解更加清晰。素數判別函數判定一個整數是否為素數,如是則返回1,否則返回0。#include<stdio.h>int

prime(intv){

int

i,flag=1;//素數flag標記

if(v<=1)return0;else{for(i=2;i<v;i++)if(v%i==0){flag=0;

break;}returnflag;}}voidmain(){

inta[5],i,sum=0;

printf("input5numbers\n");for(i=0;i<5;i++){

scanf("%d",&a[i]);sum=sum+a[i]*prime(a[i]);//計算素數之和

}

printf("sumofprime=%d\n",sum);}2.數組名做實參

數組名也可以作為實參傳送,此時形參和實參都應使用數組名,分別在被調函數和主調函數中說明數組類型,并且要保證實參與形參數組的類型相同、長度相同。在函數中,進行參數傳遞時是地址傳遞,即實參數組的首地址傳遞給形參數組。可以通過指針變量來引用調用函數中對應的數組元素,從而達到對調用函數中對應的數組元素進行操作。(1)帶下標說明的數組形參如函數定義:int

sum(inta[10])//求數組a[10]的所有元素之和

{

int

i,s=0;

for(i=0;i<10;i++)s+=a[i];returns;}則其函數調用為:

s=sum(b);//其中數組b的說明為:intb[10];數組名作為函數參數,不僅可以作為函數的形參,而且可以作為函數的實參,其基本形式有兩種:(2)不帶下標說明的數組形參如函數定義:int

sum(int

a[],intn)//求數組a[]前n個元素之和{

int

i,s=0;

for(i=0;i<n;i++)s+=a[i];returns;}則其函數調用為:s=sum(b,10);//其中數組b的說明為:intb[10];3.數組名作函數參數與數組元素作函數參數的區別(1)類型說明不同用數組元素作實參時,只要數組類型和函數的形參變量的類型一致即可。用數組名作函數參數時,則要求形參和相對應的實參都必須是類型相同的數組,都必須有明確的數組說明。(2)內存分配不同在普通變量或下標變量作函數參數時,形參變量和實參變量是由編譯系統分配的兩個不同的內存單元。在用數組名作函數參數時,因為實際上形參數組并不存在,編譯系統不為形參數組分配內存(3)參數傳遞方式不同(傳值與傳地址)在函數調用時發生的值傳送是把實參變量的值賦予形參變量(即傳值,又稱值傳遞)。而在數組名作函數參數時所進行的傳送把實參數組的首地址傳送給形參數組名(即傳地址,又稱為引用傳遞),形參數組名取得該首地址之后,也就等于有了實在的數組。【例5-31】數組a中存放了一個學生5門課程的成績,通過函數求其總分與平均分#include<stdio.h>floatsum(float

a[],intn){inti;floats=0;

for(i=0;i<n;i++)s=s+a[i];returns;}void

溫馨提示

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

評論

0/150

提交評論