440 likes | 578 Views
数组类型是一些具有相同类型的数据的集合, 同一数组中的每个元素都具有相同的数据类型,有统一的标识符即数组名 根据组织数组的结构不同,又将其分为一维数组、二维数组、三维数组等 C 语言允许使用任意维数的数组。 数组同其他类型的变量一样,也必须先定义后使用。. 第 6 章 数组. 简介. 6.1 一维数组. 6.1.1 一维数组的定义 一维数组的 定义格式 为: 数据类型 数组标识符 [ 常量表达式 ] ; 例如: int name[20] ; char ch[26] ;. 相关描述说明:
E N D
数组类型是一些具有相同类型的数据的集合, • 同一数组中的每个元素都具有相同的数据类型,有统一的标识符即数组名 • 根据组织数组的结构不同,又将其分为一维数组、二维数组、三维数组等 • C语言允许使用任意维数的数组。 • 数组同其他类型的变量一样,也必须先定义后使用。 第6章 数组 简介
6.1 一维数组 6.1.1 一维数组的定义 一维数组的定义格式为: 数据类型 数组标识符[常量表达式]; 例如: int name[20];char ch[26];
相关描述说明: (1)数据类型可以是简单类型、指针类型或结构、联合等构造类型。(2)数组标识符是用来说明数组的名称,如name、ch均为数组名 (3)常量表达式是用来说明数组元素的个数,即数组的长度 (4)数组名表示数组存储区的首地址,即数组第一个元素存放的地址。
6.1.2 一维数组元素的引用 数组下标变量的形式为:数组名[下标表达式]若数组定义为:int array[10]; array[2]=105; /*对数组第3个元素赋值*/ scanf(“%d”,&array[4]); /*对数组第5个元素赋值*/ printf(“%d”,array[5]); /*输出数组第6个元素的值*/
6.1.3 一维数组元素的初始化 初始化是定义数组时或在程序中的开始位置为数组元素赋初值 。 初始化的方法:(1)直接用赋值语句赋初值。(2)用输入语句赋初值。(3)用输入函数赋初值。 一维数组元素在定义数组时初始化的格式: 数据类型 数组标识符[常量表达式]={常量表达式};
[例6.1]从键盘输入10个数,求其中的最大数和最小数,并按逆序打印出该数组。 # include <stdio.h> void main( ) { float a[10];int i;float max=-1e20,min=1e20;for(i=0;i<=9;i++) scanf("%f",&a[i]);for(i=0;i<=9;i++) { if(a[i]>max) max=a[i];if(a[i]<min) min=a[i];} printf("max=%6.2f,min=%6.2f\n",max,min);for(i=9;i>=0;i--) printf("%6.2f\t",a[i]);}
程序如下: #include<math.h> main() { int i,r,s[11]; float q=0.0; clrscr();/*清屏函数 */ for(i=0;i<=10;i++){ s[i]=0; scanf(“%f”,&q); while(fabs(q+99)<0.001) { r=(int)(q/10); s[r]=s[r]+1; scanf(“%f”,&q); } } for(i=0;i<=10;i++) { if(i<=9) printf(“%d--%d%d\n”,10*i,i*10+9,s[i]); else printf(“ %d%d\n”,i*10,s[i]); } } [例6.2] 学生成绩统计。以下是一个统计学生成绩的程序。统计得100分的有几个学生,得90分到99分之间的有几个学生,得80分到89分之间的有几个学生,...。
[例6.3]用选择法对10个整数排序。 for(i=0;i<N-1;i++) /*排序*/ { min=i; for(j=i;j<N;j++) if(a[min]>a[j]) min=j; temp=a[i]; a[i]=a[min]; a[min]=temp; } printf(“\n排序结果如下:\n”); /*输出*/ for(i=0;i<N;i++) printf(“%5d”,a[i]); } # define N 10 main() /*选择法排序*/ { int i ,j,min,temp,a[N]; printf(“\n请输入十个数据:\n”); for(i=0;i<N;i++) { printf(“a[%d]=”,i); scanf(“%d ”,&a[i]); } printf(“\n”); for(i=0;i<N;i++) printf(“%5d”,a[i]); printf(“\n”);
[例6.5]某地区6个商店在一个月内电视机的销售数量如下表所示,试计算并打印电视机销售汇总表如下所示。[例6.5]某地区6个商店在一个月内电视机的销售数量如下表所示,试计算并打印电视机销售汇总表如下所示。
内循环用于控制每一行表格中的列,每循环一次,读入一种电视机的销售量到a[j],一方面由语句“s=s+a[j]内循环用于控制每一行表格中的列,每循环一次,读入一种电视机的销售量到a[j],一方面由语句“s=s+a[j] • 外循环中“s0=s0+s;”用于累计总销售量。 • 输出每一商店代号,各种牌号电视机的销售量及其总和。 • 当外循环执行6次后结束,跳出循环,输出各种电视机的累计和y[1]、y[2]、y[3]、y[4],同时也输出总销售量s0。
6.2 二维数组 6.2.1 双下标变量 双下标变量的形式如下: 双下标变量的形式如下:
[例6.6]某商店三个商品在四个季度的销售量如表6.1所示。[例6.6]某商店三个商品在四个季度的销售量如表6.1所示。
6.2.2 二维数组及其定义 由同名的双下标变量组成的数组称为二维数组,双下标变量是数组的元素。 二维数组定义的一般形式为: <类型标识符> <数组名标识符> [<常量表达式>] [<常量表达式>]
6.2.3 二维数组的初始化 方法: (1)分行给二维数组赋值。如: int a[2][3]={{1,2,3},{4,5,6}}; (2)可将所有数据放在一个花括号内,按数组元素按行排列的顺序对个元素赋初值。如: int a[2][3]={ 1,2,3,4,5,6 }; (3)对部分元素赋初值。如: int a[2][3]={{1},{4}}; (4)如按方法(2)对全部元素都赋初值,则定义数 组时对第一维的长度可以不指出,但第二维的长度不能省。
部分程序: main() { int i,j,s; int y[5]={0,0,0,0,0}; int b[6][6] = { {1,52,34,40,20,0}, {2,32,10,35,15,0}, {3,10,12,20,15,0}, {4,35,20,40,25,0}, {5,47,32,50,27,0}, {6,22,20,28,20,0} }; s=0; for(i=0;i<6;i++){ for(j=1;j<5;j++) b[i][5]=b[i][5]+b[i][j]; s=s+b[i][j]; } 6.2.4 二维数组应用举例 [例6.7] 用二维数组改编例6.5的汇总表程序。
6.3 综合应用举例 [例6.8] 打印输出以下的扬辉三角形(要求打印出10行)
#define N 11 main () { int i,j,a[N][N]; for(i=1;i<N;i++) { a[i][i]=1; a[i][1]=1; } for(i=3;i<N;i++) for(j=2;j<=i-1;j++) a[i][j]=a[i-1][j-1][j]; for(i=1;i<N;i++) { for(j=1;j<=i;j++) printf(“%6d”,a[i][j]); printf(“\n”); } } 程序
6.4 字符数组 • 字符数组是每个元素存放一个字符型数据的数组。 • 字符数组的初始化有两种方法: (1)将字符逐个赋给数组中的每个元素,如: char c[5]={‘C’,’h’,’i’,’n’,’a’}; (2)直接用字符串常量给数组赋初值,如: char c[6]=”China”; 无论用哪种方法对字符数组进行初始化,若提供的字符个数大于数组长度,则系统作语法错误处理;
[例6.10] 输出一个字符串。 main() { char str[6]= {‘C’,’h’,’i’,’n’,’a’}; int i; for(i=0;i<6;i++) printf(“%c”,str[i]); printf(“\n”); } • 运行结果: China
6.4.1 字符串和字符串结束标志 • 在C语言中,把用双引号括起来的一串字符称为字符串常量,简称字符串 • C语言约定用’\0’作为字符串的结束标志,它占内存空间,但不记入串长度 实际为6个字符 字符串“China” • 字符数组并不要求它的最后一个字符必须为'\0'
6.4.2 字符数组的输入输出 • 逐个字符输入输出 使用scanf和printf时,使用格式指定符%c。 或使用getchar()和putcharr()函数。 例如: for(i=0;i<10;i++) scanf("%c",&str[i]);/*或getchar(str[i]);*/ for(i=0;i<10;i++) printf("%c",str[i]);/*或putchar(str[i]);*/
字符串整体输入输出 使用函数scanf和printf时,使用%s格式符 输入形式: char str[6]; scanf("%s",str); 注意:在字符串整数输入时,字符数组名不加地址符号&, scanf(”%s”,&str);是错误的。
说明 • (1)输出字符不包括结束符‘\0’。 • (2)用“%s”格式符时,输出项应是数组名,不是数组元素,以下写法是错误的: printf(“%s”,str[0]); (3)如数组长度大于字符串实际长度,也只输出到‘\0’结束。如 • (4)如有一个字符数组中包含一个以上的’\0’,则遇到第一个’\0’时即结束输出。 (5)函数gets和puts实现字符串的整数输入输出。
6.4.3 字符串函数 1、整行输入函数—gets() • 函数格式:gets • 例如: gets(str); 2、整行输出函数—puts() 函数格式:puts • 例如:char str[]=”string”; • puts(str); 3、字符串长度函数——strlen() 函数格式为:strlen
4、字符串连接函数——strcat() • 函数格式:stract(字符数组1,字符数组2) 举例: char str1[15]={“I am”}; char str2[]={“student”}; printf(“%s”,stract(str1,str2)); 5、字符串复制函数——strcpy() • 函数格式:strcpy(字符数组1,字符数组2) 举例: strcapy(str1,“China”);
6、字符串比较函数—strcmp() • 函数格式:strcmp(字符串1,字符串2) [例6.11]输入5个字符串,将其中最小的打印出来。 main() { char str[10],temp[10]; int i; gets (temp); for(i=0;i<4;) { get(str); if(strcmp (temp,str)>0) strcpy(temp,str); } printf(“the first string is :%s”,temp); } • 运行结果: China U.S.A Canada Korea Japan the first string is:Canada
7、strlwr(字符串) 将字符串中大写字母转换成小写字母。lwr是lowercase(小写)的缩写。 8、strupr(字符串) 将字符串中小写字母转换成大写字母。upr是uppercase(大写)的缩写。 强调 库函数并非C语言本身的组成部分,而是人们为使用方便编写,提供用户使用的公共函数。
6.4.4 二维字符数组 一个字符串可以用一个二维数组来存放他们。 char str[3][6] = {"China","Japan","Koren"};
[例6.12]一个班级中有若干名学生。进输入一个学生名,要求查询该学生是否属于该班,输出相应的信息。[例6.12]一个班级中有若干名学生。进输入一个学生名,要求查询该学生是否属于该班,输出相应的信息。 #define MAX 5 #define LEN 10 main() { int i,flag=0; char name[len]; char list [max][len]={“zhang”,“wang”,“li”,“tan”,“ling”}; printf(“Enter your name :”); gets(name); for(i=0;i<max;i++) if(strcmp(list[i],name)==0) flag=1; if (flag==1) printf(“%s is in our class \n”, name); else printf(“%s is not in our class \n”, name); }
6.4.5 字符数组应用举例 [例6.13] 编一个程序,将两个字符串连接起来,不要用strcat函数。 运行结果: 请输入字符串1:country 请输入字符串2:side 连接后的字符串为:countryside • main() { char s1[80],s2[40]; int i=0,j=0; printf (“\n请输入字符串1:”); scanf (“%s”,s1); printf (“请输入字符串2:”); scanf (“%s”,s2); while (s1[i]!=’\0’) i++; while (s2[i]!=’\0’) s1[i++]=s2[j++]; s1[i]=’\0’; printf (“\n 连接后的字符串为:%s”,s1); }
[例6.14] 编一个程序,比较两个字符串s1和s2,如果s1>s2,输出一个正数;如果s1=s2,输出0;如s1<s2,输出一个负数。不要用strcmp函数。两个字符串用gets函数读入。 程序如下: main() { int i,resu; char s1[100],s2[100]; printf (“\n请输入字符串1:”); gets (s1); printf (“请输入字符串2:”); gets (s2); i=0; while ((s1[i]= =s2[i])&&(s1[i]! =’\0’)) i++; if (s1[i]= =’\0’&& s2[i]= =’\0’) resu=0; else resu=s1[i]-s2[i]; printf (“%s与%s比较结果是%d.”,s1,s2,resu); } 运行结果: 请输入字符串1: aid 请输入字符串2: and aid和and的比较结果是-5;