1 / 44

第 6 章 数组

数组类型是一些具有相同类型的数据的集合, 同一数组中的每个元素都具有相同的数据类型,有统一的标识符即数组名 根据组织数组的结构不同,又将其分为一维数组、二维数组、三维数组等 C 语言允许使用任意维数的数组。 数组同其他类型的变量一样,也必须先定义后使用。. 第 6 章 数组. 简介. 6.1 一维数组. 6.1.1 一维数组的定义 一维数组的 定义格式 为: 数据类型 数组标识符 [ 常量表达式 ] ; 例如: int name[20] ; char ch[26] ;. 相关描述说明:

Télécharger la présentation

第 6 章 数组

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 数组类型是一些具有相同类型的数据的集合, • 同一数组中的每个元素都具有相同的数据类型,有统一的标识符即数组名 • 根据组织数组的结构不同,又将其分为一维数组、二维数组、三维数组等 • C语言允许使用任意维数的数组。 • 数组同其他类型的变量一样,也必须先定义后使用。 第6章 数组 简介

  2. 6.1 一维数组 6.1.1 一维数组的定义 一维数组的定义格式为: 数据类型 数组标识符[常量表达式]; 例如: int name[20];char ch[26];

  3. 相关描述说明: (1)数据类型可以是简单类型、指针类型或结构、联合等构造类型。(2)数组标识符是用来说明数组的名称,如name、ch均为数组名 (3)常量表达式是用来说明数组元素的个数,即数组的长度 (4)数组名表示数组存储区的首地址,即数组第一个元素存放的地址。

  4. 6.1.2 一维数组元素的引用 数组下标变量的形式为:数组名[下标表达式]若数组定义为:int array[10]; array[2]=105; /*对数组第3个元素赋值*/ scanf(“%d”,&array[4]); /*对数组第5个元素赋值*/ printf(“%d”,array[5]); /*输出数组第6个元素的值*/

  5. 6.1.3 一维数组元素的初始化 初始化是定义数组时或在程序中的开始位置为数组元素赋初值 。 初始化的方法:(1)直接用赋值语句赋初值。(2)用输入语句赋初值。(3)用输入函数赋初值。 一维数组元素在定义数组时初始化的格式: 数据类型 数组标识符[常量表达式]={常量表达式};

  6. [例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]);}

  7. 程序如下: #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分之间的有几个学生,...。

  8. [例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”);

  9. [例6.5]某地区6个商店在一个月内电视机的销售数量如下表所示,试计算并打印电视机销售汇总表如下所示。[例6.5]某地区6个商店在一个月内电视机的销售数量如下表所示,试计算并打印电视机销售汇总表如下所示。

  10. 内循环用于控制每一行表格中的列,每循环一次,读入一种电视机的销售量到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。

  11. 使用数组筛选法找1~N之间的素数

  12. 对有序数列的折半查找

  13. 6.2 二维数组 6.2.1 双下标变量 双下标变量的形式如下: 双下标变量的形式如下:

  14. [例6.6]某商店三个商品在四个季度的销售量如表6.1所示。[例6.6]某商店三个商品在四个季度的销售量如表6.1所示。

  15. 6.2.2 二维数组及其定义 由同名的双下标变量组成的数组称为二维数组,双下标变量是数组的元素。 二维数组定义的一般形式为: <类型标识符> <数组名标识符> [<常量表达式>] [<常量表达式>]

  16. 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)对全部元素都赋初值,则定义数 组时对第一维的长度可以不指出,但第二维的长度不能省。

  17. 部分程序: 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的汇总表程序。

  18. 6.3 综合应用举例 [例6.8] 打印输出以下的扬辉三角形(要求打印出10行)

  19. #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”); } } 程序

  20. 习题 6.6

  21. 矩阵相乘

  22. 矩阵相乘程序

  23. 6.4 字符数组 • 字符数组是每个元素存放一个字符型数据的数组。 • 字符数组的初始化有两种方法: (1)将字符逐个赋给数组中的每个元素,如: char c[5]={‘C’,’h’,’i’,’n’,’a’}; (2)直接用字符串常量给数组赋初值,如: char c[6]=”China”; 无论用哪种方法对字符数组进行初始化,若提供的字符个数大于数组长度,则系统作语法错误处理;

  24. [例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

  25. 6.4.1 字符串和字符串结束标志 • 在C语言中,把用双引号括起来的一串字符称为字符串常量,简称字符串 • C语言约定用’\0’作为字符串的结束标志,它占内存空间,但不记入串长度 实际为6个字符 字符串“China” • 字符数组并不要求它的最后一个字符必须为'\0'

  26. 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]);*/

  27. 字符串整体输入输出 使用函数scanf和printf时,使用%s格式符 输入形式: char str[6]; scanf("%s",str); 注意:在字符串整数输入时,字符数组名不加地址符号&, scanf(”%s”,&str);是错误的。

  28. 说明 • (1)输出字符不包括结束符‘\0’。 • (2)用“%s”格式符时,输出项应是数组名,不是数组元素,以下写法是错误的: printf(“%s”,str[0]); (3)如数组长度大于字符串实际长度,也只输出到‘\0’结束。如 • (4)如有一个字符数组中包含一个以上的’\0’,则遇到第一个’\0’时即结束输出。 (5)函数gets和puts实现字符串的整数输入输出。

  29. 6.4.3 字符串函数 1、整行输入函数—gets() • 函数格式:gets • 例如: gets(str); 2、整行输出函数—puts() 函数格式:puts • 例如:char str[]=”string”; • puts(str); 3、字符串长度函数——strlen() 函数格式为:strlen

  30. 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”);

  31. 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

  32. 7、strlwr(字符串) 将字符串中大写字母转换成小写字母。lwr是lowercase(小写)的缩写。 8、strupr(字符串) 将字符串中小写字母转换成大写字母。upr是uppercase(大写)的缩写。 强调 库函数并非C语言本身的组成部分,而是人们为使用方便编写,提供用户使用的公共函数。

  33. 6.4.4 二维字符数组 一个字符串可以用一个二维数组来存放他们。 char str[3][6] = {"China","Japan","Koren"};

  34. [例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); }

  35. 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); }

  36. [例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;

More Related