Download presentation
Presentation is loading. Please wait.
1
C程序设计 第6章 数 组 主讲教师: 鲁 萍 西安建筑科技大学 理学院 任务:键盘输入整数,排序
2
第6章 数组 1 一维数组 2 二维数组 3 字符数组与字符串 小 结 习 题 游 戏
3
任务 若干个同一个数据类型数据的集合 —— 一维数组 用一个统一的数组名和下标确定数组中的元素。
例:整形数组 a[0]=2 a[1]=4 a[2]=6 定义 输入输出 使用/处理 1.对某班学生成绩进行排序 例7-3: 冒泡排序。对10个整形从小到大排序 2.对某班c语言成绩,找出最高成绩和最低成绩 例7-4:键盘输入10个数,找最大数、最小数
4
一维数组的定义 1.定义: 类型 数组名[常量表达式]; int a[10]; 例:int a[10];
1.定义: 类型 数组名[常量表达式]; 例:int a[10]; float b[20],c[15]; 2.存储 在内存分配若干连续空间给数组 数组元素个数,即数组长度 (不能用变量) 数组中每一个元素的类型 数组名代表数组的首地址,是地址常量 地址 1000 1002 … 1018 例如: /*以下是一个典型的错误定义方式!*/ int n; scanf("%d",&n); int a[n]; a[0] a[1] … a[9] a int a[10]; 分配内存
5
一维数组的引用 引用方法: 数组名[下标] 整型常量或整型表达式 取值:0~数组长度-1
引用方法: 数组名[下标] 整型常量或整型表达式 取值:0~数组长度-1 例如: 定义 int a[10]; /*可引用元素从a[0]~a[9]*/ a[5]=6; /*正确*/ a[3+4]=a[5]++; /*正确*/ a=a /*错误*/ 数组作为一个整体,不能参加数据运算,只能对单个的元素进行处理
6
一维数组的引用 A0601 对数组赋值0~9, 并逆序输出 从键盘输入10个数 #include <stdio.h>
void main() { int i,a[10]; for(i=0;i<10;i++) a[i]=i; for(i=9;i>=0;i--) printf("%d ",a[i]); } 输入数据之间用空格间隔! 定义数组 必须是常量 引用数组元素 可以是变量 输入 输出 scanf("%d",&a[i]); C1:例7-1 程序的运行情况:
7
一维数组的初始化 1. 初始化--在定义数组时对数组元素赋初值; 2. 初始化方法: 数组类型 数组名 [数组长度]={数组元素值};
数组类型 数组名 [数组长度]={数组元素值}; ① 给全部元素赋初值 int a[5]={0,1,2,3,4}; ② 可以只给一部分元素赋初值; float b[5]={ , ,1.4,7.2}; ③ 在对全部数组元素赋初值时,可以不指定数组长度 int a[]={1,2,3};
8
一维数组举例 A0602 键盘输入10个数,将最大的数置于最后 void main() { int a[10], i,t;
for(i=0;i<10;i++) /*键盘输入10个数 */ scanf("%d",&a[i]); for(i=0;i<9;i++) /* 将最大数置于最后 */ if(a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } for(i=0;i<=9;i++) /* 输出10个数*/ printf("%d ",a[i]); } 输入 处理核心 输出 依次比较相邻的2个数将较大数换到后面 运行结果 输入: 输出:
9
一维数组举例 A0603 : 冒泡排序。对10个整形从小到大排序 输入: 3 7 6 8 9 2 1 5 4 0
第0趟 第1趟 第2趟 第3趟 ……….. 第8趟 共进行 9趟找最大数 对第j趟,该趟比较9-j次 例7.3 for(j=0;j<9;j++) /* 9趟*/ for( i=0;i<9-j;i++) /*每趟比较9-j次*/ if(a[i]>a[i+1]) { 交换 }
10
一维数组举例 A0603: 冒泡排序。对10个整形从小到大排序 #include <stdio.h> void main()
{ int i,j,a[10],t; printf("input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); 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("%d ",a[i]); } 输入 处理核心 输出 程序的运行情况: input 10 numbers: ↙
11
一维数组练习 A0604 键盘输入10个数,找最大数、最小数 及所在位置 #define N 10 void main() 分析:
{ int i,a[N],max,min; for(i=0;i<N;i++) scanf("%d",&a[i]); max=min=a[0]; for(i=1;i<N;i++) { if(a[i]>max) max=a[i]; if(a[i]<min) min=a[i]; } printf("\nmax=%d, min=%d\n",max,min); 分析: 输入:循环结构 变量定义:整形数组,最大数,最小数 ,max_i,min_i; 输入 处理核心 输出 max_i= min_i=0; { max_i=i; min_i=i; } printf("\nmax=%d, %d , min=%d,%d\n",max, max_i,min, min_i); 一维数组小结
12
思考 1. 有4个班所有学生的C语言成绩,找出最高成绩,并显示该学生学号和班级 例7-7 有一个3*4矩阵,找出最大的元素及其所在的行、列
数据是二维组织,需要"行、列"来控制数据 —— 二维数组 1. 有4个班所有学生的C语言成绩,找出最高成绩,并显示该学生学号和班级 例7-7 有一个3*4矩阵,找出最大的元素及其所在的行、列 定义 输入输出 使用/处理 1班 2班 3班 4班 学生 学生 学生
13
二维数组的定义 a00 a01 a02 a03 a10 a11 a12 a13 a[3][4] a20 a21 a22 a23
1.定义: 类型 数组名[表达式1][表达式2]; 行数 列数 常量 例:float a[3][4], b[5][10]; int i=10; int b[i][3]; 错,不能用变量 例:二维数组int a[3][4] a可以看作一个一维数组,包含三个元素a[0]、a[1]、a[2] 每个元素如a[0]也是一个一维数组,包含4个元素 a[0] a[1] a[2] a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 a[3][4]
14
二维数组的定义 2.存储:元素在内存排列顺序为按行存放 可看作特殊的一维数组 例: int a[3][4]; a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] ……… a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 存储
15
二维数组的引用 输入 输出 引用:数组名[行下标] [列下标]; 例:a[2][3] A0605 二维数组输入与输出(二重循环)
#include <stdio.h> void main() { int i,j,a[3][4]; for(i=0;i<3;i++) // 行 for(j=0;j<4;j++) //列 scanf("%d",&a[i][j]); for(i=0;i<3;i++) for(j=0;j<4;j++) printf("%d",a[i][j]); } 程序输入: ↙ ↙ ↙ 习惯上:i 行 j 列 输入 输出 程序输出: 演示同行输出,讲解分行输出 程序输出: ↙ ↙ ↙ { for(j=0;j<4;j++) printf("%4d",&a[i][j]); printf("\n"); }
16
二维数组的初始化 ⒈分行初始化 int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
⒊ 部分元素初始化 int a[3][4]={{0,1},{0,6},{0,0,11}}; ⒋ 如果对全部元素都赋初值,则定义数组时可以不指定第一维的长度,但二维的长度不能省略。如: int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
17
二维数组举例 A0606 有一个3*4矩阵,找出最大的元素及其所在的行、列
int a[3][4] ={{80,85,78,90}, {75,80,76,83} , {90,92,85,87}}; int max,row=0,colum=0; 1班 2班 3班 4班 学生 学生 学生 max=a[0][0]; for(i=0;i<3;i++) for(j=0;j<4;j++) if (a[i][j]>max) { max=a[i][j]; row=i; colum=j; } printf(" ", max, row, colum); 1 a= 2
18
二维数组举例 A0606有一个3*4矩阵,找出最大的元素及其所在的行、列 void main()
{ int a[3][4] ={{80,85,78,90}, {75,80,76,83} , {90,92,85,87}}; int max,row=0,colum=0,i,j; max=a[0][0]; for(i=0;i<3;i++) /*查找最大元素*/ for(j=0;j<4;j++) if (a[i][j]>max) { max=a[i][j]; row=i; colum=j; } for(i=0;i<3;i++) /*输出二维数组*/ { for(j=0;j<4;j++) printf("%3d",a[i][j]); printf("\n"); } printf("\nmax=%d,row=%d,colum=%d", max, row, colum); 核心 输出 1 a= 2
19
二维数组举例 A0607 有某班学生各门课的成绩单,求 (1)每个学生的平均成绩(2)每门课程的平均成绩
例7-8 有一个3*4矩阵,求行平均和列平均,并显示 语 数 外 C 学生 学生 学生 平均 83.25 78.5 88.5 a= 83.25 333 314 354 78.5 88.5 平均 float a[4][5] ={{80,85,78,90,0}, {75,80,76,83,0} , {90,92,85,87,0},{0,0,0,0,0}};
20
二维数组举例 列位置为4, 固定不变a[i][4] A0607 有一个3*4矩阵,求行平均和列平均,并显示 /*行平均*/
for(i=0;i<3;i++) /*3行*/ { for(j=0;j<4;j++) /*4列*/ a[i][4] += a[i][j]; /*累加和 */ a[i][4] = a[i][4]/4; /*求平均 */ } a= 83.25 333 314 354 78.5 88.5 a= /*列平均*/ for(j=0;j<4;j++) /*4列*/ { for(i=0;i<3;i++) /*3行/ a[3][j] += a[i][j]; /*累加和 */ a[3][j] = a[3][j]/3; /*求平均 */ } C3:实验六 2 245 81.7 行位置为3, 固定不变a[3][j] 二维数组小结
21
一维二维数组练习 1. 要说明一个有10个整型元素的数组,应当选择( ) A) int a[10]; B) int a[2,5];
1. 要说明一个有10个整型元素的数组,应当选择( ) A) int a[10]; B) int a[2,5]; C) int a[]; D) int *a[10]; 2. 若说明有int a[10];则对数组元素引用正确的是( ) A) a[10] B) a[3-5] C) a(5) D) a[10-10] 3. int a[][3]={1,3,6,2,8,9,10,13};数组行数为 ( ) A) B) C) D)3
22
一维二维数组练习 (2) 有以下程序 main() { int m[][3]={1,4,7,2,5,8,3,6,9}; int i,j,k=2; for(i=0; i<3; i++) { printf("%d ",m[k][i]); } } 执行后输出结果是 A) 4 5 6 B) 2 5 8 C) 3 6 9 D) 7 8 9
23
思考 A0608:键盘输入一串字符,将其中的小写字母转换成大写字母后输出 A0609 :键盘输入一行字符,统计有多少个单词
字符数组的定义,输入,输出 A0609 :键盘输入一行字符,统计有多少个单词 单词统计方法 A0610:有三个字符串,找出其中最大者。例输入"Zhang" "Li" "Zhao",输出其中最大的 Li. 比较字符串大小 字符数组的整体赋值 if (x>y) max=x; else max=y;
24
字符数组的定义 定义: char 数组名[常量表达式]; 例: char a[5]; a[0]=‘A’; a[1]=' ';
a[2]=‘B’; a[3]='o'; a[4]='y'; 则数组a在内存存储为 A B o y a[0] a[1] a[2] a[4] a[3]
25
字符数组的初始化 1. 逐个元素初始化 例如:char c[10]={'h','a','p','p','y'};
有效字符结束标记 1. 逐个元素初始化 例如:char c[10]={'h','a','p','p','y'}; 将字符赋给数组中前面元素,其余元素自动定为空字符('\0') char c[]={'h','a','p','p','y'}; h a p y \0 数组长度 初值个数 > h a p y 长度省略,则 数组个数=初值个数 字符串常量自动 添加结束标记 2. 用字符串常量初始化字符数组 例如:char a[10] = {“happy”}; char a[] = {"happy"}; h a p y \0 h a p y \0
26
字符数组的输入输出1 例:char a[10]; 1.用格式符"%c"逐个字符输入输出: for(i=0;i<10;i++)
a[i]=getchar(); for(i=0;i<10;i++) scanf("%c",&a[i]); 输入 输出 for(i=0;i<10;i++) putchar(a[i]); for(i=0;i<10;i++) printf("%c",a[i]); 输入:C programm↙ 输出:C programm 优点:可以输入任何字符,包括 空格、回车等特殊字符 缺点:必须指明输入字符的个数(灵活性差)
27
字符数组的输入输出2 2. 用格式符"%s"输入输出整个字符串 scanf("%s",a); /*数组名a前面没有&*/
printf("%s",a); /*注意: 用数组名a*/ 优点:输入字符的个数不限定,灵活 缺点:输入的字符中不能有空格(否则结束输入) 例:char s1[20]; scanf ("%s",s1); printf("%s",s1); 例:char s1[5],s2[5]; scanf ("%s%s",s1,s2); printf("%s %s",s1,s2); 输入:C prog↙ 输出:C prog 输入:C prog↙ 输出:C C \0 P r o g \0 S1 S2 空格 或 回车 标识一个 %s 输入结束 输入时,末尾自动添加\0 输出时,遇'\0'结束
28
字符数组的输入输出3 3.字符串输入函数gets、输出函数puts 输入:gets(字符数组) /*输入一串字符,以回车结束*/
例: char str[20]; gets(str); puts(str); #include <stdio.h> C p r o g \0 … 输入:C prog↙ 输出:C prog 优点:输入字符的个数不限定,灵活 :输入的字符中可以有空格
29
字符串的 结束标记 '\0' 是判断字符串结束的标记 何时自动添加'\0' 1) 以字符串初始化时 2) 以%s输入字符串时
如: char c[ ]={"I am happy"}; 或: char c[ ]="I am happy"; 2) 以%s输入字符串时 scanf("%s",c); 3) 用gets接收字符串时 char str[20]; gets(str);
30
字符数组例题 A0608 :键盘输入一串字符,将其中的大写字母转换成小写字母后输出 数据结构: char str[80] 1. 输入字符串
(长度不确定) 2. 依次考察每个字符,将大写转换为小写 3. 输出 #include<stdio.h> void main() { char str[80]; int i; printf("input string:\n"); gets(str); for(i=0;str[i]!='\0';i++) if( str[i]>='A' && str[i] <='Z') str[i] += 32; puts(str); } gets(str) 循环:str[i]!='\0' puts(str) i=0; while(str[i]!='\0') { if( str[i]>='A' && str[i]<='Z') str[i] += 32; i++; } 输入:Hello World!↙ 输出:hello world!↙
31
字符数组例题 A0609 :键盘输入一行字符,统计有多少个单词 输入: Hello world! Everyone! ↙
输出: 3 words 2 words 1. 输入 2. 判断单词 3. 输出 while 逐个输入并统计字符个数num if (str[0]!=' ' && str[0]!='\n') count++; 段首 for(i=0~num-1) puts str[i]==' ' && str[i+1]!=' ' 段首无空格则少统计一个单词!
32
字符数组例题 A0609 :键盘输入一行字符,统计有多少个单词 #include<stdio.h> void main()
{ char str[81]; int num=0,count=0,i; printf("input string:\n"); while((str[num]=getchar())!='\n') //逐个输入并统计字符个数num num++; if (str[0]!=' ' && str[0]!='\n') count++; //段首无空格单词数+1 for(i=0;i<num-1;i++) //判断并统计单词数量 if (str[i]==' ' && str[i+1]!=' ') count++; printf("\n %d words\n",count); //输出 } gets(str); num=strlen(str);
33
字符串处理函数 strlen 计算字符串长度的函数 函数原型: int strlen(s);
函数功能:求出字符串或字符数组中实际字符个数(不包括'\0')。 例:char st[20]={"hello\0abce\0abc\0"}; printf("%d\n",strlen(st)); 程序运行结果: 5
34
字符数组应用举例 A0610 有三个字符串,找出其中最大者。例输入"Zhang" "Li" "Zhao",输出其中最大的 Zhao.
#include <stdio.h> void main() { char s1[10], s2[10], s3[10], max[10]; gets(s1); gets(s2); gets(s3); max=s1; if (s2>max) max=s2; if (s3>max) max=s3; puts(max); } 分析: 定义3+1个字符串 输入3个字符串 比较,找出最大值 输出最大值 错! 不允许数组 整体赋值、 整体比较! 可以用字符串处理函数
35
字符串比较函数 strcmp 函数原型:int strcmp(s1,s2);
函数功能: 从左到右逐个比较s1、s2中各个字符的ASCII码,直到出现不同字符或遇到结束标记为止。 当s1=s2 函数值= 负整数 当s1<s2 正整数 当s1>s2 此处在黑板上举例:关于字典序的问题 例1: strcmp(" d ", " abc ") strcmp(" dog ", " door ") 例2:如果字符串s1大于s2,则输出提示信息“s1>s2” if (strcmp(s1,s2)>0) printf("s1>s2"); 结果为正整数 结果为负整数
36
字符串拷贝函数 strcpy 函数: strcpy(s1,s2); //字符串拷贝函数 功能:将字符串s2复制到字符数组s1中,返回s1。
例如: static char a[10]="abcdefghi",b[]="happy"; strcpy(a,b); a数组内存原始情况: a b c d e f g h i \0 函数调用后a、b数组内存情况: h a p p y \0 g h i \0
37
字符数组应用举例 A0610有三个字符串,找出其中最大者。例输入"Zhang" "Li" "Zhao",输出其中最大的 Zhao.
有10个字符串 #include <stdio.h> void main() { char s1[10], s2[10], s3[10], max[10]; gets(s1); gets(s2); gets(s3); max=s1; if (s2>max) max=s2; if (s3>max) max=s3; puts(max); } 分析: 定义3+1个字符串 输入3个字符串 比较,找出最大值 输出最大值 strcpy(max,s1); if (strcmp(s2,max)>0) strcpy(max,s2); if (strcmp(s3,max)>0) strcpy(max,s3);
38
字符数组应用举例 #define N 3 void main() { char s [3][10],max[10] ; int i ;
#define N 3 void main() { char s [3][10],max[10] ; int i ; printf("input %d strings:\n",N); gets(s[0]); strcpy(max,s[0]); for( i=1;i< 2 ;i++) { gets(s[i]); if (strcmp(s[i],max)>0) strcpy(max,s[i]); } puts(max); } S[0] S[1] S[2] S[3][10] z h a n g \0 l i o N S[i]>max 输入字符串s[i] 输入字符串S[0] Max=s[i] Max=S[0] i++ 真 假 N 字符数组小结
39
字符串处理函数 使用字符串函数需包含头文件 #include <string.h> strlen 返回字符串长度
strcmp 字符串比较 strcpy 字符串拷贝 strcat 字符串连接
40
字符串连接函数 strcat 字符串连接函数 函数:strcat(S1,S2);
功能: 删去s1的'\0',将s2连接到s1尾部,返回连接以后的字符串。 例: char a[20]="My name is ",b[10]="Li ming"; strcat(a,b); 执行 strcat(a,b); 后数组a M y n a m e i s L g \0 二维数组小结
41
字符数组练习 1.合法的数组定义是( ) A) int a[]="string"; B)int a[5]={0,1,2,3,4,5};
1.合法的数组定义是( ) A) int a[]="string"; B)int a[5]={0,1,2,3,4,5}; C) char a="string"; D)char a[]={0,1,2,3,4,5}; 2. 函数strlen("abcd\0ef\0g")的结果值为( ) A) B) C) D)5 3.Char s[5],c;int b;以下正确的调用语句是 ( )。 A)scanf("%s%c",s,c); B)scanf("%%d%c",&b,&c); C)scanf("%d%%c",b,&c); D)scanf("%s%c",s,&c); 4、判断字符串s1是否大于字符串s2,应当使用 ( ) A) if(s1>s2) B) if(strcmp(s1,s2)) C) if(strcmp(s1,s2)>0) D) if(strcmp(s2,s1)>0)
42
数组定义及初始化练习 定义如下数据 1. 某学生5门课成绩 75,80,83,91,78
2. 字符串 I'm a good student! 3. 矩阵 4. 学生姓名数组 zhang3, li4, wang5 5. 由键盘输入3个学生5门课成绩
43
数组定义及初始化练习解答 1.某学生5门课成绩 75,80,83,91,78 int score[5]={75,80,83,91,78};
2.字符串 I am a good student! char str[]={"I am a good student!"}; char str[]="I am a good student!"; char str[]={'I',' ','a','m',……}; 3. 矩阵 int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
44
数组定义及初始化练习解答 4.学生姓名数组 zhang3, li4, wang5
char name[][10]={"zhang3","li4","wang5"} char name[3][10]={"zhang3","li4","wang5"} 5.由键盘输入3个学生5门课成绩 int score[3][5],i,j; for(i=0;i<3;i++) for(j=0;j<5;j++) scanf("%d",&score[i][j]);
45
小结 —— 一维数组 数组定义 数组的引用 数组初始化 类型 数组名[常量表达式]-----int a[10] 数组连续存放
小结 —— 一维数组 数组定义 类型 数组名[常量表达式]-----int a[10] 数组连续存放 数组名代表数组存储的首地址 数组的引用 a[i], 数组引用 a[0]…..a[N-1] 常用for循环配合访问数组元素 数组初始化 int a[5]={0,1,2,3,4}; 常用于程序测试阶段
46
小结 —— 二维数组 二维数组定义 a00 a01 a02 a03 a10 a11 a12 a13 二维数组初始化 a[3][4]
小结 —— 二维数组 二维数组定义 类型 数组名[行] [列] (常量) 数组按行连续存放 数组名代表数组首地址 二维数组初始化 int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 二维数组的引用 a[i][j], 数组引用 a[0][0]…..a[M-1][N-1] 常用二重for循环配合访问数组元素 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 a[0] a[1] a[2] a[3][4]
47
小结 —— 字符数组 字符数组定义 字符数组输入、输出 字符串函数 类型 数组名[行] [列] (常量)
小结 —— 字符数组 字符数组定义 类型 数组名[行] [列] (常量) 初始化: char a[] = {“happy”}; ‘\0’ :判断字符串结束的标记 字符数组输入、输出 gets(str) puts(str) 字符串函数 求长度 strlen 字符串比较 strcmp 字符串赋值 strcpy S[0] S[1] S[2] S[3][10] z h a n g \0 l i o
48
数组---习题 B0601(习题6.4)把一个整数x按大小顺序插入已排好序(从大到小)的数组a中。假设数组a中有10个数。
B0602: 判断一个字符串是否为回文串(回文串指正读反读都一样的字符串,如:字符串“abc121cba”) B0603:对若干姓名进行排序并显示。
49
游戏扩展 C0601 数组小游戏:连连看。请找出和给定坐标有相同图案的另一个坐标。(给定坐标是随机生成)
Similar presentations