




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 50002-3:2025 EN Energy audits - Part 3: Guidance for conducting an energy audit using ISO 50002-1 in processes
- 【正版授权】 ISO 24165-2:2025 EN Digital token identifier (DTI) - Registration,assignment and structure - Part 2: Data elements for registration
- 【正版授权】 ISO/TS 6417:2025 EN Microfluidic pumps - Symbols and performance communication
- 2025年教师资格之中学物理学科知识与教学能力自我检测试卷A卷附答案
- 【滨州】2025年山东滨州市事业单位公开招聘硕博士高层次人才168人笔试历年典型考题及考点剖析附带答案详解
- 《电子商务法律法规(第3版)》高职电子商务法全套教学课件
- 小学体育教学设计及课件
- 第三章化工生产基础理论BasicTheoryofChemi
- 第六章固体废物的处理与处置83课件
- 小学老师教学课件交互
- 2025年数字化转型下的监理计划
- 2025年全省卷烟营销知识理论多选题含答案
- 【北京市人社局】2025年北京市人力资源市场薪酬数据报告(一季度)
- 火锅餐饮考试题及答案
- 项目部临建工程施工方案
- 预制混凝土装配式叠合板施工技术的研究与应用
- 中国废轮胎行业发展前景预测及投资战略研究报告
- 登革热知识培训课件
- GIS设备安装施工方案
- 幼儿园6S管理述职
- 挖石碴施工方案
评论
0/150
提交评论