Download presentation
Presentation is loading. Please wait.
1
Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换
2
本章要点 什么是数组? 为什么要使用数组? 如何定义数组? 如何引用数组元素? 二维数组的元素在内存中按什么方式存放?
什么是字符串? 字符串结束符的作用是什么? 如何实现字符串的存储和操作,包括字符串的输入和输出? 怎样理解C语言将字符串作为一个特殊的一维字符数组?
3
7.1 排序问题 输入一个正整数n (1<n≤10),再输入n个整数,用选择法将它们从小到大排序后输出。 7.1.1 程序解析
7.1 排序问题 输入一个正整数n (1<n≤10),再输入n个整数,用选择法将它们从小到大排序后输出。 程序解析 一维数组的定义和引用 一维数组的初始化 使用一维数组编程
4
7.1.1 程序解析-排序 #include <stdio.h> int main(void)
{ int i, index, k, n, temp; int a[10]; /* 定义1个数组a,它有10个整型元素*/ printf(“Enter n: "); scanf("%d”, &n); printf(“Enter %d integers: ", n); for(i = 0; i < n; i++) scanf("%d", &a[i]); for(k = 0; k < n-1; k++){ /* 对n个数排序 */ index = k; for(i = k + 1; i < n; i++) if(a[i] < a[index]) index = i; temp = a[index]; a[index] = a[k]; a[k] = temp; } printf("After sorted: "); for(i = 0; i < n; i++) /* 输出n个数组元素的值 */ printf("%d ", a[i]); return 0; 程序解析-排序 Enter n: 10 Enter 10 integers: After sorted:
5
for(i = 0; i < n; i++) printf("%d ", a[i]); 数组 a[0] a[1] a[9] a 数组:相同类型数据的有序集合,在内存中连续存放。 由数组名和下标惟一地确定每个数组元素 每个元素都属于同一类型 一批相同类型的变量使用同一个数组变量名,用下标来相互区分。 优点:表述简洁,可读性高;便于使用循环结构
6
7.1.2 一维数组的定义和引用 1、定义 类型名 数组名[数组长度] int a[10]; char c[200];
一维数组的定义和引用 1、定义 类型名 数组名[数组长度] 类型名:数组元素的类型 数组名:数组(变量)的名称,标识符 数组长度:常量表达式,给定数组的大小 int a[10]; 定义一个含有10个整型元素的数组 a char c[200]; 定义一个含有200个字符元素的数组 c float f[5]; 定义一个含有5个浮点型元素的数组 f
7
2、引用 先定义,后使用 只能引用单个的数组元素,不能一次引用整个数组 数组元素的使用方法与同类型的变量相同 数组名[下标]
下标:整型表达式 取值范围:[0,数组长度-1] int a[10]; 10个元素:a[0]、a[1]、…… a[9] 数组元素的使用方法与同类型的变量相同 scanf("%d", &a[i]); temp = a[index]; a[index]= a[k]; a[k] = temp; printf("%d ", a[i]); 下标不要越界 不能使用a[10]
8
区分数组的定义和数组元素的引用 定义数组 引用数组元素 类型名 数组名[数组长度] 数组名[下标] int a[10];
类型名 数组名[数组长度] 引用数组元素 数组名[下标] int a[10]; a[0] = a[9] = 0; a[k] = temp; 数组长度为常量 下标不要越界
9
7.1.3 一维数组的初始化 定义数组时,对数组元素赋初值 静态数组、动态数组的初始化 类型名 数组名[数组长度] = {初值表};
一维数组的初始化 定义数组时,对数组元素赋初值 类型名 数组名[数组长度] = {初值表}; int a[10] = {1,2,3,4,5,6,7,8,9,10}; a[0]=1, a[1]=2,...… a[9]=10 静态数组、动态数组的初始化 static int b[5] = {1, 2, 3, 4, 5}; 静态存储的数组如果没有初始化,所有元素自动赋0 static int b[5]; 动态存储的数组如果没有初始化,所有元素为随机值 auto int c[5];
10
针对部分元素的初始化 static int b[5] = {1, 2, 3}; auto int fib[20] = {0, 1};
b[0] = 1, b[1] = 2, b[2] = 3, b[3] = 0, b[4] = 0 auto int fib[20] = {0, 1}; fib[0] = 0, fib[1] = 1, 其余元素不确定 如果对全部元素都赋初值,可以省略数组长度 int a[ ] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; /*长度为10*/
11
7.1.4 使用一维数组编程 数组和循环 for(i = 0; i < n; i++) printf("%d ", a[i]);
使用一维数组编程 数组和循环 for(i = 0; i < n; i++) printf("%d ", a[i]); 数组下标作为循环变量,通过循环,逐个处理数组元素
12
一维数组示例 例 7-2 用数组计算fibonacci数列的前20个数,并按每行打印5个数的格式输出。1, 1, 2, 3, 5, ……
例7-3 输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。 例 7-4 输入n(n<10),再输入n个数 (1) 求最小值 (2) 求最小值和它所对应的下标 (3) 将最小值与第一个数交换,输出交换后的n个数 例 7-1 输入n(n<10),再输入n个数,用选择法将它们从小到大排序后输出。
13
例 7-2 计算fibonacci数列 用数组计算fibonacci数列的前20个数,并按每行打印5个数的格式输出。
1, 1, 2, 3, 5, 8, 13, …… 用数组计算并存放fibonacci数列的前20个数 f[0] = f[1] = 1 f[n] = f[n-1] + f[n-2] 2≤n≤19
14
例 7-2 源程序 #include <stdio.h> int main(void) { int i;
int fib[20] = {1, 1}; /* 数组初始化 */ for(i = 2; i < 20; i++) fib[i] = fib[i - 1] + fib[i - 2]; for(i = 0; i < 20; i++){ printf("%6d", fib[i]); if((i + 1) % 5 == 0) /* 5个数换行 */ printf("\n"); } return 0; 例 7-2 源程序
15
例7-3 在数组中查找一个给定的数 输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。 输入: 9 输出:1 7 输出:Not Found
16
例 7-3 源程序 Enter 5 integers: 2 9 8 1 9 Enter x: 9 Index is 1
#include <stdio.h> int main(void) { int i, flag, x; int a[5]; printf(“Enter 5 integers: "); for(i = 0; i < 5; i++) scanf("%d", &a[i]); printf(“Enter x: "); scanf("%d", &x); flag = 0; if(a[i] == x){ printf("Index is %d\n", i); flag = 1; break; } if(flag == 0) printf("Not Found\n"); return 0; 例 7-3 源程序 Enter 5 integers: Enter x: 9 Index is 1 Enter 5 integers: Enter x: 7 Not Found
17
例 7-3 思考(1) #include <stdio.h> int main(void)
{ int i, flag, x; int a[5]; printf(“Enter 5 integers: "); for(i = 0; i < 5; i++) scanf("%d", &a[i]); printf(“Enter x: "); scanf("%d", &x); flag = 0; if(a[i] == x){ printf("Index is %d\n", i); flag = 1; break; } if(flag == 0) printf("Not Found\n"); return 0; 例 7-3 思考(1) Enter 5 integers: Enter x: 9 Index is 1 Index is 4
18
例 7-3 思考(2) #include <stdio.h> int main(void) { int i, sub, x;
int a[5]; printf(“Enter 5 integers: "); for(i = 0; i < 5; i++) scanf("%d", &a[i]); printf(“Enter x: "); scanf("%d", &x); sub = -1; if(a[i] == x) sub = i; if(sub != -1) printf("Index is %d\n", i); else printf("Not Found\n"); return 0; } 例 7-3 思考(2) Enter 5 integers: Enter x: 9 Index is 4
19
例 7-4(1) 求最小值 #include <stdio.h> int main(void) { int i, min, n;
例 7-4(1) 求最小值 #include <stdio.h> int main(void) { int i, min, n; int a[10]; printf(“Enter n: "); scanf("%d", &n); printf(“Enter %d integers: ", n); for(i = 0; i < n; i++) scanf("%d", &a[i]); min = a[0]; for(i = 1; i < n; i++) if(a[i] < min) min = a[i]; printf("min is %d \n", min); return 0; } Enter n: 6 Enter 6 integers: min is -1
20
例 7-4(2) 求最小值及其下标 输入n(n<10), 再输入n个数, 输出最小值和它所对应的下标。
例 7-4(2) 求最小值及其下标 输入n(n<10), 再输入n个数, 输出最小值和它所对应的下标。 用index记录最小值对应的下标 a[index]就是最小值
21
求最小值及下标 #include <stdio.h> int main(void) { int i, index, n;
int a[10]; printf(“Enter n: "); scanf("%d", &n); printf(“Enter %d integers: ", n); for(i = 0; i < n; i++) scanf("%d", &a[i]); index = 0; for(i = 1; i < n; i++) if(a[i] < a[index]) index = i; printf("min is %d\tsub is %d\n", a[index], index); return 0; } 求最小值及下标 Enter n: 6 Enter 6 integers: min is sub is 2
22
例 7-4(3) 交换最小值 输入n(n<10), 再输入n个数,将最小值与第一个数交换,输出交换后的n个数。
例 7-4(3) 交换最小值 输入n(n<10), 再输入n个数,将最小值与第一个数交换,输出交换后的n个数。 用index记录最小值对应的下标 a[index]就是最小值 最小值与第一个数交换 a[index] <==> a[0]
23
例 7-1 选择法排序 输入n(n<10), 再输入n个数,用选择法将它们从小到大排序后输出。 3 5 2 8 1
例 7-1 选择法排序 输入n(n<10), 再输入n个数,用选择法将它们从小到大排序后输出。 设 n=5 3 5 2 8 1 (1) (2) (3) (4)
24
选择法(1) 3 5 2 8 1 (n=5) (1) 1 5 2 8 3 a[4] <==> a[0]
5个数(a[0]~a[4])中找最小数,与a[0]交换 (1) a[4] <==> a[0] 4个数(a[1]~a[4])中找最小数,与a[1]交换 (2) a[2] <==> a[1] 3个数(a[2]~a[4])中找最小数,与a[2]交换 (3) a[4] <==> a[2] 2个数(a[3]~a[4])中找最小数,与a[3]交换 (4) a[4] <==> a[3]
25
选择法(2) (1) 5个数 (a[0]~a[4]) 中找最小数,与 a[0] 交换
(1) n个数 (a[0]~a[n-1]) 中找最小数,与 a[0] 交换 (2) n-1个数 (a[1]~a[n-1]) 中找最小数,与 a[1] 交换 …… (n-1) 2个数 (a[n-2]~a[n-1]) 中找最小数,与 a[n-2] 交换
26
流程图 输入数组a k=0 假(0) k<n-1 index=k i=k+1 i<n 真(非0) a[i]<a[index] index=i
i=i+1 交换a[index]和a[k] 输出数组a index=k i=k+1 k=k+1 i<n
27
选择法排序 (程序段) for(k = 0; k < n-1; k++){ index = k;
for(i = k + 1; i < n; i++) if(a[i] < a[index]) index = i; temp = a[index]; a[index] = a[k]; a[k] = temp; } Enter n: 5 Enter 10 integers: After sorted:
28
7.2 找出矩阵中最大值所在的位置 将1个3*2的矩阵存入1个3*2的二维数组中,找出最大值以及它的行下标和列下标,并输出该矩阵。
7.2 找出矩阵中最大值所在的位置 将1个3*2的矩阵存入1个3*2的二维数组中,找出最大值以及它的行下标和列下标,并输出该矩阵。 程序解析 二维数组的定义和引用 二维数组的初始化 使用二维数组编程
29
程序解析-求矩阵的最大值 例 将1个3*2的矩阵存入1个3*2的二维数组中,找出最大值以及它的行下标和列下标,并输出该矩阵。 row 记录最大值的行下标 Col 最大值的列下标 a[row][col] 就是最大值
30
例7-5 源程序 int main(void) { int col, i, j, row; int a[3][2];
printf(“Enter 6 integers:\n") ; for(i = 0; i < 3; i++) for(j = 0; j < 2; j++) scanf("%d", &a[i][j]); for(i = 0; i < 3; i++){ printf("%4d", a[i][j]); printf("\n"); } row = col = 0; if(a[i][j] > a[row][col]){ row = i; col = j; printf("max = a[%d][%d] = %d\n", row, col, a[row][col]); return 0; 例7-5 源程序 Enter 6 integers: 3 2 10 -9 6 -1 3 2 max = a[1][0] = 10
31
二维数组 多维数组的空间想象 一维数组: 一列长表或一个向量 二维数组: 一个表格或一个平面矩阵 三维数组: 三维空间的一个方阵
多维数组: 多维空间的一个数据列阵
32
7.2.2 二维数组的定义和引用 1、定义 类型名 数组名[行长度][列长度] int a[3][2]; int b[5][10];
类型名 数组名[行长度][列长度] int a[3][2]; 定义1个二维数组a,3行2列,6个元素 int b[5][10]; 定义1个二维数组a,5 行 10 列, 50 个元素
33
2、引用 数组元素的引用: 数组名[行下标] [列下标] int a[3][2]; 3 行 2 列, 6 个元素 行下标和列下标:整型表达式
行下标的取值范围是[0,行长度-1] 列下标的取值范围是[0,列长度-1] int a[3][2]; 3 行 2 列, 6 个元素 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] 下标不要越界
34
二维数组在内存中的存放方式 int a[3][2]; 二维数组的元素在内存中按行/列方式存放 a[0][0] a[0][1]
3 行 2 列, 6 个元素 表示1个3行2列的矩阵 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] 二维数组的元素在内存中按行/列方式存放 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
35
7.2.3 二维数组的初始化 1、分行赋初值 数组a 1 2 3 4 5 6 7 8 9 数组b 1 2 3 0 0 0 4 5 0
二维数组的初始化 1、分行赋初值 int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; static int b[4][3] = {{1,2,3},{ },{4,5}}; 数组a 数组b 2、顺序赋初值 int a[3][3] = {1,2,3,4,5,6,7,8,9}; static int b[4][3] = {1,2,3,0,0,0,4,5};
36
省略行长度 数组b 1 2 3 数组a 0 0 0 1 2 3 4 5 0 4 5 6 7 8 9 对全部元素都赋了初值,
int a[ ][3]={1,2,3,4,5,6,7,8,9}; 或分行赋初值时,在初值表中列出了全部行 static int b[ ][3]={{1,2,3},{},{4,5},{}} 数组b 数组a
37
使用二维数组编程 行下标和列下标分别做为循环变量, 通过二重循环,遍历二维数组 通常将行下标做为外循环的循环变量 列下标 内循环
38
例7-6 生成一个矩阵并输出 定义1个 3*2 的二维数组a,数组元素的值由下式给出,按矩阵的形式输出a。
例7-6 生成一个矩阵并输出 定义1个 3*2 的二维数组a,数组元素的值由下式给出,按矩阵的形式输出a。 a[i][j] = i + j(0≤i≤2,0≤j≤1) int a[3][2]; a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] 0 1 1 2 2 3
39
例7-6 源程序 #include <stdio.h> int main(void) { int i, j;
例7-6 源程序 #include <stdio.h> int main(void) { int i, j; int a[3][2]; for(i = 0; i < 3; i++) for(j = 0; j < 2; j++) a[i][j] = i + j; for(i = 0; i < 3; i++){ printf("%4d", a[i][j]); printf("\n"); } return 0; a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] 0 1 1 2 2 3 i = 0 j = 0 i = 0 j = 1 i = 1 j = 0 i = 1 j = 1 i = 2 j = 0 i = 2 j = 1
40
二维数组的输入 例7-5中,int a[3][2]; for(i = 0; i < 3; i++)
for(j = 0; j < 2; j++) scanf("%d", &a[i][j]); Enter 6 integers: 3 -9 2 6 10 -1 max = a[2][0] = 10 Enter 6 integers: 3 2 10 -9 6 -1 max = a[1][0] = 10 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] for(j = 0; j < 2; j++) for(i = 0; i < 3; i++) scanf("%d", &a[i][j]);
41
矩阵与二维数组 int a[N][N]; N是正整数 a[i][j]:i、j的取值范围[0,N-1]
a[0][0] a[0][1] a[0][2] 主对角线 a[1][0] a[1][1] a[1][2] 上三角 a[2][0] a[2][1] a[2][2] 下三角 付对角线 i==j i<=j i>=j i+j==N-1
42
例7-7 方阵转置 输入一个正整数n (1<n≤6),根据下式生成1个n*n的方阵,然后将该方阵转置(行列互换)后输出。
例7-7 方阵转置 输入一个正整数n (1<n≤6),根据下式生成1个n*n的方阵,然后将该方阵转置(行列互换)后输出。 a[i][j] = i * n + j + 1(0≤i≤n-1,0≤j≤n-1) 分析:int a[6][6]; n=3时 a[i][j] a[j][i] a[0][1] a[1][0] a[0][2] a[2][0] a[1][2] a[2][1]
43
例7-7 源程序 #include <stdio.h> int main(void) { int i, j, n, temp;
int a[6][6]; printf(“Enter n: "); scanf("%d", &n); /* 给二维数组赋值 略……*/ /* 行列互换*/ for(i = 0; i < n; i++) for(j = 0; j < n; j++) if(i <= j){ /* 只遍历上三角阵 */ temp = a[i][j]; a[i][j] = a[j][i]; a[j][i] = temp; } /* 按矩阵的形式输出a 略…… */ return 0; 例7-7 源程序
44
例7-7 说明 1 2 3 4 5 6 7 8 9 /* 行列互换*/ for(i = 0; i < n; i++)
主对角线:i == j 上三角: i <= j 下三角: i > =j /* 行列互换*/ for(i = 0; i < n; i++) for(j = 0; j < n; j++) if(i <= j){ temp = a[i][j]; a[i][j] = a[j][i]; a[j][i] = temp; } i=0 i=1 for( j = i+1; j < n; j++)
45
例7-7 思考 /* 行列互换*/ for(i = 0; i < n; i++) for(j = 0; j < n; j++){
temp = a[i][j]; a[i][j] = a[j][i]; a[j][i] = temp; } i=0 i=1 i=2
46
例7-8 日期计算 自定义1个函数day_of_year(year, month, day),计算并返回年year、月month和日day对应的是该年的第几天。 day_of_year(2000, 3, 1) 返回61 day_of_year(1981, 3, 1) 返回60 分析: 月 ……11 12 非闰年 闰年 int tab[2][13]={ {0, 31, 28, 31, 30,31,30,31,31,30,31, 30,31} {0, 31, 29, 31, 30,31,30,31,31,30,31, 30,31} }
47
例7-8 源程序 int day_of_year(int year, int month, int day) { int k, leap;
例7-8 源程序 int day_of_year(int year, int month, int day) { int k, leap; int tab[2][13]={ {0, 31, 28, 31, 30,31,30,31,31,30,31, 30,31} {0, 31, 29, 31, 30,31,30,31,31,30,31, 30,31} }; leap = (year%4==0&&year%100!=0) || year %400==0; for (k=1; k<month; k++) day = day + tab[leap][k]; return day; }
48
7.3 进制转换 例7-9 输入一个以回车结束的字符串(少于10个字符),它由数字字符组成,将该字符串转换成整数后输出。
7.3 进制转换 例7-9 输入一个以回车结束的字符串(少于10个字符),它由数字字符组成,将该字符串转换成整数后输出。 程序解析 一维字符数组 字符串
49
7.3.1 程序解析- 进制转换 #include <stdio.h> int main(void)
{ int i, n; char s[10]; printf(“Enter a string: "); /* 输入字符串 */ i = 0; while((s[i] = getchar( )) != '\n') i++; s[i] = '\0'; n = 0; /* 将字符串转换为整数 */ for(i = 0; s[i] != '\0'; i++) if(s[i] <= '9' && s[i] >= '0') n = n * 10 + (s[i] - '0'); else break; printf("digit = %d\n", n); return 0; } 程序解析- 进制转换 Enter a string: 123 digit = 123
50
7.3.2 一维字符数组 字符串的存储和运算可以用一维字符数组实现 一维字符数组的定义、引用、初始化与其他类型的一维数组一样。 t
char str[80]; 定义一个含有80个字符型元素的数组str char t[5]={'H', 'a', 'p', 'p', 'y'}; 初始化数组 t 输出数组 t 的所有元素 for(i=0; i<5; i++) putchar( t[i] ); t[0] t[1] t[4] t H a p p y
51
一维字符数组 t s char t[5] = {'H', 'a', 'p', 'p', 'y'};
static char s[6] = {'H', 'a', 'p', 'p', 'y'}; static char s[6]={'H', 'a', 'p', 'p', 'y', 0}; 0代表字符'\0',也就是ASCII码为0的字符 static char s[6]={'H', 'a', 'p', 'p', 'y', '\0'}; t[0] t[1] t[4] t H a p p y s[0] s[1] s[5] s H a p p y \0
52
7.3.3 字符串 字符串常量 用一对双引号括起来的字符序列 一个字符串结束符 '\0' "Happy"
字符串 字符串常量 用一对双引号括起来的字符序列 一个字符串结束符 '\0' "Happy" 6个字符 'H' 'a’ 'p’ 'p’ 'y' '\0' 字符串结束符 有效字符 字符串的有效长度:有效字符的个数
53
字符串与一维字符数组 字符串:一个特殊的一维字符数组 把字符串放入一维字符数组(存储) 对字符串的操作 ===> 对字符数组的操作
54
1. 字符串的存储-数组初始化 s 字符串可以存放在一维字符数组中
static char s[6] = {'H', 'a', 'p', 'p', 'y', '\0'}; 字符数组初始化:用字符串常量 static char s[6] = {"Happy"}; static char s[6] = "Happy"; 数组长度 >= 字符串的有效长度 + 1 char t[5]; "Happy" 能存入t吗? s[0] s[1] s[5] s H a p p y \0
55
字符串的存储 s auto char s[80]= "Happy"; 字符串遇 '\0' 结束
'\0' 之后的其他数组元素与该字符串无关 字符串由有效字符和字符串结束符 '\0' 组成 s[0] s[1] s[5] s H a p p y \0 ? ?
56
2. 对字符串的操作 把字符串放入一维字符数组(存储) 对字符串的操作 ===> 对字符数组的操作
普通字符数组:数组元素的个数是确定的,一般用下标控制循环 字符串:没有显式地给出有效字符的个数,只规定在字符串结束符 '\0' 之前的字符都是字符串的有效字符,一般用结束符 '\0' 来控制循环 循环条件:s[i] != '\0'
57
例6-10 计算字符串的有效长度 s H a p p y \0 ? ? s[0] s[1] s[5] 计算字符串的有效长度,并输出该字符串。
例6-10 计算字符串的有效长度 s[0] s[1] s[5] s H a p p y \0 ? ? 计算字符串的有效长度,并输出该字符串。 字符串的有效长度:有效字符的个数 数组中第一个 '\0' 前面的字符个数
58
例7-10 源程序 s #include <stdio.h> int main(void) { int i = 0, len;
char str[80] = "Happy"; /* 初始化 */ for(i = 0; str[i] != '\0'; i++) ; len = i; printf("len = %d\n", len); for(i = 0; str[i] != '\0'; i++) /* 输出字符串 */ putchar(str[i]); return 0; } 例7-10 源程序 len = 5 Happy 循环条件 s[0] s[1] s[5] s H a p p y \0 ? ?
59
输出字符串 s for(i = 0; s[i] != '\0'; i++) putchar(s[i]);
for(i = 0; i < 80; i++) for(i = 0; i < len; i++) s[0] s[1] s[5] s H a p p y \0 ? ?
60
3. 字符串的存储-赋值和输入 把字符串放入一维字符数组(存储) 对字符串的操作 ===> 对字符数组的操作 存储 数组初始化 赋值
static char s[6]= "Hello"; 赋值 s[0]='a'; s[1]='\0'; 或者 static char s[6]= "a"; 区分"a" 和 'a' "a" 2 个字符 'a' 和 '\0' 'a' 个字符常量
61
字符串的输入 字符串的存储 字符数组初始化:static char s[6] = "Happy";
赋值:s[0] = 'a'; s[1] = '\0'; 输入 '\0' 代表空操作,无法输入 输入时,设定一个输入结束符 将输入结束符转换为字符串结束符 '\0'
62
例7-11 统计字符 输入一个以回车结束的字符串(少于80个字符),统计其中数字字符的个数。 分析: 数组长度取上限80
以 '\n' 做为输入结束符
63
例7-11 源程序 #include <stdio.h> int main(void) { int count, i;
char str[80]; printf(“Enter a string: "); i = 0; while((str[i] = getchar( )) != '\n') i++; str[i] = '\0'; /* 输入结束符=>字符串结束符 */ count = 0; for(i = 0; str[i] != '\0'; i++) if(str[i] <= '9' && str[i] >= '0') count++; printf("count = %d\n", count); return 0; } 例7-11 源程序 字符串的输入 如何改变输入结束符? 能省略str[i] = '\0'吗? Enter a string: It's 512? count = 3 s I t ' s \0 ? ?
64
例7-9 进制转换 s #include <stdio.h> int main(void)
{ int i, n; char s[10]; printf(“Enter a string: "); /* 输入字符串 */ i = 0; while((s[i] = getchar( )) != '\n') i++; s[i] = '\0'; n = 0; /* 将字符串转换为整数 */ for(i = 0; s[i] != '\0'; i++) if(s[i] <= '9' && s[i] >= '0') n = n * 10 + (s[i] - '0'); else break; printf("digit = %d\n", n); return 0; } 例7-9 进制转换 Enter a string: 123 digit = 123 s \0 ? ?
65
进制转换方法 s i s[i] s[i]-'0' n = n*10+(s[i]-'0') 0 '1' 1 0*10+1 = 1
s \0 ? ? n = 0; for(i = 0; s[i] != '\0'; i++) if(s[i] <= '9' && s[i] >= '0') n = n * 10 + (s[i] - '0'); else break; Enter a string: 1#2#3 digit = i s[i] s[i]-'0' n = n*10+(s[i]-'0') 0 '1' *10+1 = 1 1 '2 ' *10+2 =12 2 '3' *10+3 =123 3 '\0'
66
字符串小结 字符串:一个特殊的一维字符数组 '\0' 把字符串放入一维字符数组(存储) s 数组长度足够 H a p p y \0 ? ?
字符串:一个特殊的一维字符数组 '\0' 把字符串放入一维字符数组(存储) 数组长度足够 字符数组初始化: static char s[80] = "Happy"; 赋值: s[0] = 'a'; s[1] = '\0'; 输入: 输入结束符 ==> 字符串结束符'\0' i = 0; while((s[i]=getchar( )) != '\n') i++; s[i] = '\0'; s[0] s[1] s[5] s H a p p y \0 ? ?
67
对字符串的操作 ===> 对字符数组的操作
把字符串放入一维字符数组(存储) 对字符串的操作 ===> 对字符数组的操作 只针对字符串的有效字符和字符串结束符 '\0' 检测 for(i = 0; s[i] != '\0'; i++) putchar(s[i]); s[0] s[1] s[5] s H a p p y \0 ? ?
Similar presentations