500 likes | 633 Vues
第 6 章 数组. 2014/10/9. 主要内容. 1. 一维数组. 2. 二维数组. 3. 字符数组. 案例. 【例 6-1 】统计候选人得票。班委有 5 名成员 ( 设相应编号为 0~4) ,要从中选出 1 名来当班长,由班级的 30 名学生通过投票决定,请编写程序,输入每名同学的投票情况 ( 每名同学只能投一票,即输入 0~4 中的任意一个数字 ) ,统计输出各位候选人的得票数。
E N D
第 6 章 数组 2014/10/9
主要内容 1 一维数组 2 二维数组 3 字符数组
案例 【例6-1】统计候选人得票。班委有5名成员(设相应编号为0~4),要从中选出1名来当班长,由班级的30名学生通过投票决定,请编写程序,输入每名同学的投票情况(每名同学只能投一票,即输入0~4中的任意一个数字),统计输出各位候选人的得票数。 案例分析:这是一个分类统计的问题,要累计并保存各个候选人的得票数,按以前学过的方法可以设置5个整型变量来分别存放5位候选人的得票,但这不是最好的方法,在这里采用一维数组来实现。
案例程序 #include<stdio.h> void main( ) { int count[5]; /*定义存放候选人得票的数组*/ int i,vote,invad=0; for(i=0;i<5;i++) count[i]=0; /*给每位选手得票赋初值0*/ for(i=0;i<30;i++) { printf("input your vote:"); scanf("%d",&vote); if(vote<0||vote>4) { printf("this vote is %d,it is invalid.\n",vote); invad++; } else count[vote]++; *对应选票的选手得票增加1*/ } printf("the result is:\n"); for(i=0;i<5;i++) printf("第%d号选手的得票为:%d\n",i,count[i]); printf("无效票数为:%d\n",invad); } 使用数组,可以让一批相同类型(本例中为整型)的变量使用同一个数组名,使用下标来相互区分。 优点是表达简洁、使用灵活、可读性好,对下标可使用循环结构实现不同元素的引用。
一维数组的定义 一维数组的定义一般形式: 类型说明符 数组名[整型常量表达式]; 例如:int a[10]; 10个数组元素为:a[0],a[1],a[2],a[3],a[4],a[5] ,a[6],a[7],a[8] ,a[9] (1) 类型说明符可以是任意一种基本数据类型或构造数据类型,它指明数组元素的数据类型。 (2) 数组名是用户定义的数组的名字,必须是一个合法的标识符。 (3) 方括号中的常量表达式表示数组中所包含的数组元素的个数。 (4) 数组名后是用方括弧括起来的常量表达式,不能用圆括弧。
分配连续的存储单元,数组所占存储空间的字节数是数组中所有元素所占字节数之和。公式表示为:分配连续的存储单元,数组所占存储空间的字节数是数组中所有元素所占字节数之和。公式表示为: 数组所占存储空间的字节数 =数组大小×sizeof(数组元素类型) 例如 float a[20]; 数组a占存储单元 20×sizeof(float)=20×4=80(字节) 数组定义注意几点 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。 int a[3+2],b[7*5]; √ int n=5; int a[n]; 错误! 允许在同一个类型说明中,说明多个数组和多个变量。 例如:int a,b,c[5],d[6];
一维数组初始化赋值的一般形式为: 类型说明符 数组名[常量表达式]={值,值,……,值}; 例如:int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于 a[0]=0;a[1]=1...a[9]=9; 值与数组元素的顺序一一对应 一维数组的初始化 初始化赋值有以下几点规定: (1) 初值的个数不能超过数组的大小。int a[2]={1,2,3};错 (2) 初值的个数可以小于数组的大小。(其余后面元素都赋0。) 例如:int a[10]={0,1,2,3,4}; 表示只给a[0]~a[4]5个元素赋值,另5个元素a[5]~a[9]自动赋0值 (3) 只能给元素逐个赋值,不能给数组整体赋值。 int a[4]={8,8,8,8}; √不能写成:int a[10]=8; (4) 不给出数组的长度,此时数组的实际大小就是初值列表中表达式的个数。例如:int a[5]={1,2,3,4,5}; 可写为:int a[]={1,2,3,4,5};
一维数组元素的引用 数组元素的标识形式为: 数组名[下标] 数组元素引用说明: (1) 下标可以是整型常量,也可以是已赋值的整型变量或整型表达式。如:a[3],a[i+j],a[i++] 合法。 (2) 数值型数组只能逐个地使用下标变量,而不能一次引用整个数组。for(i=0;i<10;i++) printf("%d",a[i]); (3) 对变量的一切操作同样也适用于数组元素。 (4) 数组引用要注意越界问题。例如: int a[10]; a[10]=7; /*引用越界,数组元素只能是a[0]~a[9]*/
一维数组举例说明1 【例6-2】对含有10个元素的数组赋值,并输出。 #include<stdio.h> void main( ) { int i,a[10]; // 一维数组定义 for(i=0;i<10; ) //表达式3省略 a[i++] =2*i+1; //一维数组元素引用 for(i=0;i<=9;i++) printf("%d ",a[i]); //一维数组元素引用 } 运行结果: 1 3 5 7 9 11 13 15 17 19 2*i+1 表示 送入奇数值
【例6-3】从键盘输入10个数存放到一个一维数组中,输出其中最大的数及其下标。【例6-3】从键盘输入10个数存放到一个一维数组中,输出其中最大的数及其下标。 #include<stdio.h> void main( ) { int i,max,subsc, a[10]; printf("input 10 numbers:\n"); for(i=0;i<10;i++) scanf(“%d”, &a[i] ); // &不能缺 max= a[0]; subsc=0; for(i=1;i<10;i++) if( a[i] >max) { max= a[i] ; subsc=i; } printf("maxmum=%d,subscript=%d\n",max,subsc); } 一维数组举例说明2 运行结果: input 10 numbers: 12 54 –100 60 23 44 123 27 99 20↙ maxmum=123, subscript=6
【例6-4】从键盘输入10个数,用起泡法对这10个数由小到大排序。分析:将相邻两个数进行比较,把较小的数据交换到前面。从纵向来看,这些数据交换过程中较小的数据就像水中的气泡不断地浮出。下面以6个数为例说明起泡法【例6-4】从键盘输入10个数,用起泡法对这10个数由小到大排序。分析:将相邻两个数进行比较,把较小的数据交换到前面。从纵向来看,这些数据交换过程中较小的数据就像水中的气泡不断地浮出。下面以6个数为例说明起泡法 一维数组举例说明3 起泡法第一趟比较 起泡法第二趟比较
#include<stdio.h> void main( ) { int i,j,t,a[10]; printf("\n input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); 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("the sorted numbers:\n"); for(i=0;i<10;i++) printf("%d ",a[i]); } 输入10个数据到a数组 运行结果: input 10 numbers: 1 0 8 65 -76 23 –20 45 80 100↙ the sorted numbers: –76 –20 0 1 8 23 45 65 80 100 起泡法比较 输出从小到大排序后a数组的10个数据
选择排序演示 原理:每次找出剩余数的最小值和a[i] 交换。 下标: 0 1 2 3 4 5 6 24 45 6 78 1 2 34 i: k: a[k]:
一维数组举例说明4 【例6-5】从键盘输入10个数,用简单选择法对这10个数由小到大排序。 以6个数为例说明。 分析:从所有元素中找出最小的数与第1个元素的值交换,第1个元素得到了最小值,接着从余下的元素(除第1个以外的元素)中找出最小数与第2个元素的值交换,再从余下的元素中找出最小数与第3个元素的值交换,以此类推
for(i=0;i<9;i++) { k=i; for(j=i+1;j<10;j++) if(a[j]<a[k]) k=j; if(i!=k) { x=a[i]; a[i]=a[k]; a[k]=x; } } #include<stdio.h> void main( ) { int a[10],i,j,k,x; printf("input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); 运行结果: input 10 numbers: 1 0 8 65 -76 23 –20 45 80 100↙ the sorted numbers: –76 –20 0 1 8 23 45 65 80 100 printf("The sorted numbers:\n"); for(i=0;i<10;i++) printf("%d ",a[i]); }
一维数组举例说明5 【例6-6】从键盘输入一批学生的成绩(以输入-1为结束标志),计算其平均成绩,并统计高于平均分的人数。 #include<stdio.h> void main( ) { int i,n=0,num=0; /*n为输入成绩个数,num为高于平均分人数*/ float score[80],ave,sum=0; /*成绩个数未知,数组可定义较大些*/ printf("input some score,end -1:\n"); for(i=0; ;i++) /*循环次数未知,条件设为真,用break退出循环*/ { scanf("%f",&score[i]); if(score[i]==-1) break; sum+=score[i]; n++; } ave=sum/n; for(i=0;i<n;i++) if(score[i]>ave) num++; printf("平均成绩为:%f\n高于平均分的人数为:%d\n",ave,num); } 运行结果: input some score,end -1: 67 80 100 77 45 90 23 88 45 82 -1↙ 平均成绩为:69.699997 高于平均分的人数为:6
一维数组举例说明6 【例6-7】有7位评委对选手打分(通过键盘输入),计算选手的最后得分(去掉1个最高分和1个最低分后的平均分)。 分析:先对7个评分进行从小到大排序,然后计算中间5个评分的平均值即可。 for(i=1;i<7;i++) /*起泡法排序*/ for(j=0;j<7-i;j++) if(point[j]>point[j+1]) { t=point[j]; point[j]=point[j+1]; point[j+1]=t; } for(i=1;i<6;i++) /*求中间5个评分的和*/ sum=sum+point[i]; ave=sum/5; printf("选手的最后得分为:%5.2f\n",ave); } #include<stdio.h> void main( ) { int i,j; float sum=0,point[7],ave,t; printf("input 7 point:\n"); for(i=0;i<7;i++) scanf("%f",&point[i]); 运行结果: input 7 point:: 7.0 7.5 7.0 8.0 8.5 8.5 7.5↙ 选手的最后得分为: 7.70
一维数组举例说明7 【例6-8】把指定数据插入到已排序的数据列中。 分析:要把指定数据插入到序列中,先要找到插入数据的位置,然后将这个位置及其后面的数据依次向后移动一个位置,从而空出该位置,再将要插入的数据存放在该位置即可。 #include<stdio.h> void main( ) { int data[50],ins,n,i,j,flag=0; printf("please enter the number of org data:\n"); scanf("%d",&n); printf("please enter data:\n"); for(i=0;i<n;i++) scanf("%d",&data[i]); printf("the org data:\n"); for(i=0;i<n;i++) printf("%d ",data[i]); printf("please enter insert data:\n");
scanf("%d",&ins); /* 下面循环完成的功能是确定插入位置并向后移动数据*/ for(i=n-1;i>=0;i--) if (ins<data[i]) data[i+1]=data[i]; else break; data[i+1]=ins; printf("data after inserted:\n"); for(i=0;i<n;i++) printf("%d ",data[i]); } 运行结果: please enter the number of data: 8↙ please enter data: 2 4 6 10 12 14 16 19↙ the org data: 2 4 6 10 12 14 16 19 please enter insert data: 7↙ data after inserted: 2 4 6 7 10 12 14 16 19
一维、二维数组 1 4 23 5 12 56 245 9 67 1 2 3 3 2 1 4 5 6 5 4 3 7 8 9 4 7 8
二维数组的定义 二维数组定义的一般形式是: 类型说明符数组名[常量表达式1][常量表达式2] 例如:int a[3][4]; a数组的逻辑结构是一个具有如下形式的的三行四列的矩阵: 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] 在C语言中,二维数组是按行排列方式在内存中存放 其存放顺序为: a[0][0]→a[0][1]→a[0][2]→a[0][3]→a[1][0]→a[1][1]….
二维数组元素的引用 引用形式加下:数组名[下标][下标] 例如:a[2][3] 表示a数组第二行第三列的元素 !引用二维数组元素,两个下标分别放在两个方括号内 请思考: 左侧定义的 a数组有 数组元素a[3][4] 吗? 数组的定义和数组元素的引用在形式区别: 定义:int a[3][4]; 3,4分别某一维的长度 引用: a[2][3]=4 2,4 a[1][2]=a[2][3] 1,2和2,3元素在数组中的位置标识,可以是常量、变量或表达式。
二维数组的初始化 二维数组初始化方法有两种:分行赋初值和顺序赋初值。 1.分行赋初值一般形式为: 数据类型 数组名[整型常量][ 整型常量]= {{数据列表0},{数据列表1},……}; 如: int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}}; 分行赋初值方法 直观清晰常用 2.顺序赋初值 一般形式为: 数据类型 数组名[整型常量][ 整型常量]={数据列表}; 例如:int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85}; a[0][0]=80,a[0][1]=75,a[0][2]=92,a[1][0]=61,…… a[4][0]=76,a[4][1]=77,a[4][2]=85。 两种赋初值的结果是相同的
思考:定义int a[3][3]={{1},{2},{3}};和 int b[3][3]={1,2,3}; 请问数组a和数组b各元素的值为什么? 二维数组部分元素赋初值 例如对数组a[3][3]赋初值可以写成: int a[3][3]={ {80,75},{61 }, {59,63,70}}; 等同于以下哪种顺序赋初值 (1)int a[3][3]={80,75,61,59,63,70}; (2)int a[3][3]={80,75,0,61,0,0,59,63,70}; √ 二维数组也可以只对部分元素赋初值,未赋初值的元素自动取0值。
二维数组初始化其他说明 二维数组初始化时,如果对全部元素赋初值,则第一维的长度可以省略。 例如: int a[3][3]={1,2,3,4,5,6,7,8,9}; 可以写为: int a[][3]={1,2,3,4,5,6,7,8,9}; 缺省的第一维长度为初值个数9/3=3 思考:int a[][3]={1,2,3,4,5,6,7};缺省的第一维长度如何计算? • 二维数组a[3][4],可分解为三个一维数组,其数组名分别为:a[0] a[1] a[2] 在二维数组中,a[0],a[1],a[2]不能当作简单下标变量使用,它们是数组名,分别为二维数组的第0行,第1行和第2行的首地址,而不是一个单纯的下标变量。
二维数组举例说明2 【例6-10】有一个3×4的矩阵,编写程序找出最大值及其所在的行号和列号。 主要程序段代码: int i,j,row=0,colum=0,max; int a[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,row=%d,colum=%d\n",max,row,colum); 运行结果: max=10,row=2,colum=1 max中的值比该元素a[i][j]值小,则将该元素值赋给max 该元素a[i][j]的位置信息(行值i、列值j)赋给row、colum
二维数组举例说明3 【例6-11】求下列二维数组a中各行的平均值和各列的平均值。主要程序段代码: int i,j; float a[5][5],sum; printf("input array a:\n"); for(i=0;i<4;i++) { for(j=0;j<4;j++) scanf("%f",&a[i][j]); } for(i=0;i<4;i++) { sum=0; for(j=0;j<4;j++) sum=sum+a[i][j]; a[i][4]=sum/4; } 运行结果: input array a: 3 16 87 65 4 32 11 108 9 28 16 73 7 5 80 6↙ 输入二维数组 计算a数组中第0~4行各列平均值
运行结果: printf("array a:\n"); for(i=0;i<5;i++) { for(j=0;j<5;j++) printf("%5.0f",a[i][j]); printf("\n"); } array a: 3 16 87 65 43 4 32 11 108 39 9 28 16 73 32 7 5 80 6 25 6 20 49 63 34
二维数组举例说明4 【例6-12】求下列二维数组a中主对角线元素之和以及副对角线元素之和。 int i,j,sum1=0,sum2=0; int a[][4]={3,16,87,65,4,32,11,108,9,28,16,73,7,5,80,6}; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(i==j) sum1=sum1+a[i][j]; /*求主对角线元素和*/ if(i+j==3) sum2=sum2+a[i][j]; /*求副对角线元素和*/ } }
运行结果: array a: 3 16 87 65 4 32 11 108 9 28 16 73 7 5 80 6 主对角线元素和:57 副对角线元素和:111 printf("array a:\n"); for(i=0;i<4;i++) { for(j=0;j<4;j++) printf("%5d",a[i][j]); printf("\n"); } printf("主对角线元素和:%d\n副对角线元素和:%d\n",sum1,sum2);
字符数组 在C语言中,没有专门的字符串类型变量,字符串的显示和存储通过字符数组来实现。用来存放字符数据的数组是字符数组。字符数组中的一个数组元素存放一个字符。 • 字符数组的定义与初始化 1.字符数组的定义 形式与前面介绍的数值型数组相同,其格式如下: char 数组名 [常量表达式]; 例如:char c[10]; 声明一个一维字符数组c,有10个元素,可以存放10个字符。 2.字符数组的初始化 字符数组也允许在定义时作初始化赋值。 例如:char c[5]={ 'H', ' E', 'L', 'L, 'O', }; 把5个字符分别赋给c[0]到c[4]的5个元素。
字符数组举例说明 【例6-13】输出一个字符串。 #include<stdio.h> void main( ) { char c[10]={'I',' ','a','m',' ','a',' ','b','o','y'}; int i; for(i=0;i<10;i++) printf("%c",c[i]); printf("\n"); } 运行结果: I am a boy
字符串 字符串常量就是一对双引号括起来的字符序列,即一串字符,它有一个结束标志’\0’,结束标志’\0’存入数组。 C语言允许用字符串的方式对数组作初始化赋值。 例如:char c[]={"C program"}; 或:去掉{}写为:char c[]="C program"; 思考:缺省定义的第一维长度如何? 10 字符串的操作 可用printf函数和scanf函数一次性输入输出一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符,此时使用“%s”格式符。
【例6-14】由键盘输入一个字符串,并输出。 #include<stdio.h> void main( ) { char st[15]; printf("input string:"); scanf("%s",st); printf("output string:"); printf("%s\n",st); } 字符串举例说明 运行结果: input string: books output string: books 当输入的字符串中含有空格时,运行情况为: input string:this is a book↙ output string: this 原因:当用scanf函数输入字符串时,字符串中不能含有空格,因为C语言规定以空格和回车作为输入字符串的分隔符。 为了避免这种情况,可多设几个字符数组分段存放含空格的串。
字符串处理函数 用于输入输出的字符串函数,在使用前应包含头文件“stdio.h”,使用其它字符串函数则应包含头文件“string.h”。 【例6-15】在屏幕上显示字符串。 #include <stdio.h> void main( ) { char c[]="BASIC\nDBASE"; puts(c); } 1. 字符串输出函数puts 格式:puts(字符串) 功能:把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串。其中字符串既可以是一个字符串常量,也可以是存放字符串的字符数组名。 转义字符 运行结果: BASIC DBASE puts函数通常用来输出字符串,当需要按一定格式输出时,通常使用printf函数。
【例6-16】由键盘输入一个字符串,并输出。 #include <stdio.h> void main( ) { char st[15]; printf("input string:\n"); gets(st); puts(st); } 2. 字符串输入函数gets 格式: gets(字符数组名) 功能: 从标准输入设备键盘上输入一个字符串,并保存在字符数组中。本函数得到一个函数值,即为该字符数组的首地址。 运行结果: input string: this is a book↙ this is a book 说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束,这是与scanf函数不同的。
【例6-17】连接两个字符串,并输出。 #include <stdio.h> #include <string.h> void main( ) { static char st1[30]="My name is "; char st2[10]; printf("input your name: \n"); gets(st2); strcat(st1,st2); puts(st1); } 3、字符串连接函数strcat 格式: strcat(字符数组名1,字符串2) 功能:把字符串2代表的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志'\0',结果放在字符数组1中。其中字符串2既可以是字符数组名,也可以是一个字符串常量。本函数返回值是字符数组1的首地址。 运行结果: input your name: liping.↙ My name is liping. • 字符数组1必须足够大 • 连接时将字符串1后面的'\0'取消 说明:
例6、打印输出九九乘法表 【例6-18】复制字符串,并输出。 #include <stdio.h> #include <string.h> void main( ) { char st1[15],st2[]="C Language"; strcpy(st1,st2); puts(st1); } 4. 字符串拷贝函数strcpy 格式: strcpy(字符数组名1,字符串2) 功能:把字符数组2中的字符串拷贝到字符数组1中。 运行结果: C Language • 说明: • 字符数组1必须定义得足够大, • 字符数组1必须写成数组名形式(如str1), • 字符串2可以是字符数组名,也可以是一个字符串常量。 • 如strcpy(str1,"china"); • (3) 复制时连同字符串后面的’\0’一起复制到字符数组1中。 • (4) 不能用赋值语句将一个字符串常量或字符数组直接赋值给一个字符数组,只能采用函数实现字符串的赋值。 • str1={"china"};str1=str2; 不合法 运行结果: C Language
5. 字符串比较函数strcmp 格式:strcmp(字符串1,字符串2) 功能:按照ASCII码值顺序逐个比较两个字符串中的相应字符,直到出现不同的字符或遇到’\0’为止,如全部字符相同,则相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。 比较结果分三种情况进行处理: (1) 若字符串1=字符串2,返回值=0; (2) 若字符串1>字符串2,返回值>0; (3) 若字符串1<字符串2,返回值<0。 本函数也可用于比较两个字符串常量,或比较字符数组和字符串常量。
【例6-19】比较两个字符串的大小。 #include <stdio.h> #include <string.h> void main( ) {int k; char st1[15],st2[]="C Language"; printf("input a string:\n"); gets(st1); k=strcmp(st1,st2); if(k==0)printf("st1=st2\n"); if(k>0)printf("st1>st2\n"); if(k<0)printf("st1<st2\n"); } 运行结果: dbase↙ st1>st2
6. 求字符串长度函数strlen 格式:strlen(字符串) 功能:求出字符串的实际长度(从第一个字符计算到字符串的结束标志‘\0’为止,但不含字符串结束标志‘\0’) 并作为函数返回值。 【例6-20】求字符串的长度。 #include <stdio.h> #include <string.h> void main( ) { int k; char st[]="C language"; k=strlen(st); printf("The lenth of the string is %d\n",k); } 运行结果: The lenth of the string is 10
字符数组程序举例 【例6-21】输入一个字符串,统计其中大写字母、小写字母、空格、数字和其他字符的个数。 #include<stdio.h> #include<string.h> void main( ) { char s[100]; int i; int space,upper,lower,num,other; space=upper=lower=num=other=0; printf("请输入一个字符串:\n"); gets(s);
源程序 for(i=0;i<strlen(s);i++) { if(s[i]>='A'&&s[i]<='Z') upper++; else if(s[i]>='a'&&s[i]<='z') lower++; else if(s[i]>='0'&&s[i]<='9') num++; else if(s[i]==' ') space++; else other++; } printf("大写字母%d个\n小写字母%d个\n数字%d个\n空格%d个\n其他字符%d个\n",upper,lower,num,space,other); } 运行结果: 请输入一个字符串: 1232$^%^&DSFG asdhj↙ 大写字母4个 小写字母5个 数字4个 空格2个 其他字符5个
【例6-22】输入一个字符串,把其中的大写字母转换成小写字母,然后输出。【例6-22】输入一个字符串,把其中的大写字母转换成小写字母,然后输出。 #include<stdio.h> #include<string.h> void main( ) { char s[100]; int i; printf("请输入一个字符串"); gets(s); for(i=0;i<strlen(s);i++) if(s[i]>='A'&&s[i]<='Z') s[i]=s[i]+32; puts(s); putchar(0); } 运行结果: 请输入一个字符串: ASDHJASsdahj1324↙ asdhjassdahj1324
【例6-23】输入五个国家的名称按字母顺序排列输出。【例6-23】输入五个国家的名称按字母顺序排列输出。 #include <stdio.h> #include <string.h> void main( ) { char st[20],cs[5][20]; int i,j,p; printf("input country's name:\n"); for(i=0;i<5;i++) /*输入5个国家名*/ gets(cs[i]); printf("\n"); 分析:五个国家名应由一个二维字符数组来处理。然而C语言规定可以把一个二维数组当成多个一维数组处理。 而每一个一维数组就是一个国家名字符串。用字符串比较函数比较各一维数组的大小并排序,输出结果即可。
for(i=0;i<4;i++) /*选择排序*/ { p=i; for(j=i+1;j<5;j++) if(strcmp(cs[j],cs[p])<0) p=j; if(p!=i) { strcpy(st,cs[i]); strcpy(cs[i],cs[p]); strcpy(cs[p],st); } } printf("After sort:\n"); for(i=0;i<5;i++) /*输出*/ puts(cs[i]); printf("\n"); } • 运行结果: input country's name: China↙ America↙ Spain↙ Japan↙ Australia↙ After sort: America Australia China Japan Spain
【例6-24】从存放学生姓名的数据中查找某个学生。【例6-24】从存放学生姓名的数据中查找某个学生。 #include <stdio.h> #include <string.h> void main( ) { int ins,n,i,j,flag=0; char names[50][10],name[10]; printf("please enter the number of students:\n"); scanf("%d",&n); getchar(); /*吃掉前面输入数据后的回车*/ printf("please input names:\n"); 分析:我们采用最基本的查找方法——“顺序查找法”,就是根据输入的查找数据与数组中的数据一个一个的进行比较,直到找到相同的数据为止。
for(i=0;i<n;i++) gets(names[i]); printf("please input name you want to search:\n"); gets(name); for(i=0;i<n;i++) if(strcmp(name,names[i])==0) { flag=1; printf("student %s is at %d.\n",name,i); break; } if(flag==0) printf("not found!"); }
运行结果: please enter the number of students: 5↙ please input names: Bush↙ Susam↙ Jack↙ Tom↙ Mary↙ please input name you want to search: Tom↙ student Tom is at 3. 再次运行结果: please enter the number of students: 5↙ please input names: Bush↙ Susam↙ Jack↙ Tom↙ Mary↙ please input name you want to search: Bob↙ not found!