配色: 字号:
《C语言程序设计(第2版)》第07章数组
2023-05-24 | 阅:  转:  |  分享 
  
Chap 7 数 组7.1 投票情况统计7.2 找出矩阵中最大值所在的位置7.3 判断回文本章要点什么是数组? 为什么要使用数组?
如何定义数组?如何引用数组元素?二维数组的元素在内存中按什么方式存放?什么是字符串? 字符串结束符的作用是什么?如何实现字符串的
存储和操作,包括字符串的输入和输出?怎样理解C语言将字符串作为一个特殊的一维字符数组?例7-1:调查电视节目欢迎程度。某电视台要进
行一次对该台8个栏目(设相应栏目编号为1~8)的受欢迎情况,共调查了1000位观众,现要求编写程序,输入每一位观众的投票,每位观众
只能选择一个最喜欢的栏目投票,统计输出各栏目的得票情况。7.1.1 程序解析7.1.2 一维数组的定义和引用7.1.3 一维
数组的初始化7.1.4 使用一维数组编程7.1 投票情况统计7.1.1 程序解析-排序 # include
int main( void ) { int count[9]; / 设立数组,栏目编号对应数组下标
/ int i,response; for(i = 1;i <= 8;i++) count[i] = 0
; / 各栏目计数器清0 / for( i = 1;i <= 1000;i++) {/ 调试时可
把1000改小,如10 / printf("input your response: "); / 输入提示
/ scanf("%d",&response); if(response < 1 || respon
se > 8) / 检查投票是否有效/ printf("this is a bad response:
%d\n",response); else count[response]++;
/ 对应栏目得票加1 / } printf("result:\n");
/ 输出各栏目得票情况 / for(i = 1;i <= 8;i++) printf("%4d%4d\n"
,i,count[i]); return 0;}input your response: 3input your resp
onse: 6input your response: 9this is a bad response: 9input your
response: 8…result:1 22 03 4…for(i = 1;i <= 8;i++) p
rintf("%4d%4d\n",i,count[i]);count count[0] count[1]
count[8]例7-1中为何不使用count[0]?数组数组:相同类型数据的有序集合,在内存中
连续存放。 由数组名和下标惟一地确定每个数组元素 每个元素都属于同一类型一批相同类型的变量使用同一个数组变量名,用下标来相互区分。
优点:表述简洁,可读性高;便于使用循环结构7.1.2 一维数组的定义和引用1、定义 类型名 数组名[数组长度]类型名:数组元素
的类型数组名:数组(变量)的名称,标识符数组长度:常量表达式,给定数组的大小int a[10]; 定义一个含有10个整型元素的数组
achar c[200];定义一个含有200个字符元素的数组 cfloat f[5];定义一个含有5个浮点型元素的数组 f数组长
度为常量2、数组的内存结构aint a[10];假设系统规定int类型占用2个字节,则对于数组a,其内存分配形式 只要知道了数组第
一个元素的地址以及每个元素所需的字节数,其余各个元素的存储地址均可计算得到。 数组名是一个地址常量,存放数组内存空间的首地址。不允
许被修改。3、引用先定义,后使用只能引用单个的数组元素,不能一次引用整个数组数组名[下标]下标:整型表达式取值范围:[0,数组长度
-1]int a[10];10个元素:a[0]、a[1]、…… a[9]数组元素的使用方法与同类型的变量相同scanf("%d"
, &a[i]);count[i]++;temp = a[index]; a[index]= a[k]; a[k] = temp;
printf("%d ", a[i]);下标不要越界不能使用a[10]定义数组类型名 数组名[数组长度]引用数组元素数组名[下
标]int a[10];a[0] = a[9] = 0;a[k] = temp;区分数组的定义和数组元素的引用下标不要越界数组长度
为常量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静态数组、动态数组的初始化s
tatic int b[5] = {1, 2, 3, 4, 5}; 静态存储的数组如果没有初始化,所有元素自动赋0static
int b[5];动态存储的数组如果没有初始化,所有元素为随机值auto int c[5]; 等价与 int c[5];sta
tic int b[5] = {1, 2, 3};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[ 10 ] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
针对部分元素的初始化建议不要省略数组长度7.1.4 使用一维数组编程数组和循环for(i = 0; i < n; i++)
printf("%d ", a[i]);数组下标作为循环变量,通过循环,逐个处理数组元素 一维数组示例例 7-2 用数组
计算fibonacci数列的前10个数,并按每行打印5个数的格式输出。1, 1, 2, 3, 5, ……例 7-3 顺序查找法。输
入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的最小下标,否则,输出“Not Found”
。例 7-4 输入n(n<10),再输入n个数(1) 输出最小值和它所对应的下标(2) 将最小值与第一个数交换,输出交换后的n个
数例 7-5 选择排序法。输入一个n(1 已有一个10个元素的整形数组a,且按值从小到大有序。输入一个整数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“No
t Found”。用数组计算fibonacci数列的前10个数,并按每行打印5个数的格式输出。1, 1, 2, 3, 5, 8,
13, ……用数组计算并存放fibonacci数列的前10个数f[0] = f[1] = 1f[n] = f[n-1] + f[n
-2] 2≤n≤9例 7-2 计算fibonacci数列#include int main(void){
int i; int fib[10] = {1, 1}; / 数组初始化 / for(i = 2;
i < 10; i++) fib[i] = fib[i - 1] + fib[i - 2]; for(
i = 0; i < 10; i++){ printf("%6d", fib[i]); if((i
+ 1) % 5 == 0) / 5个数换行 / printf("\n"); }
return 0;} 例 7-2 源程序 1 1 2 3 5
8 13 21 34 55输入5个整数,将它们存入数组a中,再输入1个数x,然后在
数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。输入:2 9 8 1 9 9输出
:1输入:2 9 8 1 6 7输出:Not Found例7-3 在数组中查找一个给定的数#include
int main(void){ int i, flag, x; int a[5]; p
rintf(“Enter 5 integers: "); for(i = 0; i < 5; i++) sc
anf("%d", &a[i]); printf(“Enter x: "); scanf("%d", &x);
flag = 0; for(i = 0; i < 5; i++) if(a[i] == x){
printf("Index is %d\n", i); flag = 1;
break; } if(flag == 0) printf("Not Found\n"); r
eturn 0;} 例 7-3 源程序Enter 5 integers: 2 9 8 1 9Enter x: 9Index i
s 1Enter 5 integers: 2 9 8 1 9Enter x: 7Not Foundflag的作用?#include
int main(void){ int i, flag, x; int a[5]; pr
intf(“Enter 5 integers: "); for(i = 0; i < 5; i++) sca
nf("%d", &a[i]); printf(“Enter x: "); scanf("%d", &x);
flag = 0; for(i = 0; i < 5; i++) if(a[i] == x){
printf("Index is %d\n", i); flag = 1;
break; } if(flag == 0) printf("Not Found\n"); r
eturn 0;} 例 7-3 思考(1)Enter 5 integers: 2 9 8 1 9Enter x: 9Index
is 1Index is 4去掉break语句,结果?#include int main(void){ i
nt i, sub, x; int a[5]; printf(“Enter 5 integers: ");
for(i = 0; i < 5; i++) scanf("%d", &a[i]); printf(“E
nter x: "); scanf("%d", &x); sub = -1; for(i = 0; i
< 5; i++) if(a[i] == x) sub = i; if(sub !
= -1) printf("Index is %d\n", sub); else printf("Not Found\n"
); return 0;} 例 7-3 思考(2)Enter 5 integers: 2 9 8 1 9Ente
r x: 9Index is 4sub的作用?#include 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;}例 7-4 求最小值Enter n: 6Enter 6 integers:
2 9 -1 8 1 6min is -1方法!!虽得到了最小值,但不能确定最小值所在下标!输入n(n<10), 再输
入n个数, 输出最小值和它所对应的下标。用index记录最小值对应的下标a[index]就是最小值例 7-4(1) 求最小值及其
下标流程图#include 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++) sc
anf("%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: 6Enter 6 inte
gers: 2 9 -1 8 1 6min is -1 sub is 2 输入n(n<10), 再输入n个数,
将最小值与第一个数交换,输出交换后的n个数。用index记录最小值对应的下标a[index]就是最小值最小值与第一个数交换a[in
dex] <==> a[0]例 7-4(2) 交换最小值例 7-5 选择法排序 输入n(n<10), 再输入n个数
,用选择法将它们从小到大排序后输出。设 n=5 ,输入为:3 5 2 8 1第1次: 1 5
2 8 3 第2次: 2 5 8 3 第3次:
3 8 5 第4次:
5 8 下标 值3 5 2 8 1 (n=5)5个数(a[0]~a[4])中找最小数,与a[0
]交换(1) 1 5 2 8 3 a[4] <==> a[0]4个数(a[1
]~a[4])中找最小数,与a[1]交换(2) 1 2 5 8 3 a[2] <
==> a[1]3个数(a[2]~a[4])中找最小数,与a[2]交换(3) 1 2 3 8 5
a[4] <==> a[2]2个数(a[3]~a[4])中找最小数,与a[3]交换(4) 1 2 3
5 8 a[4] <==> a[3]选择法(1)(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] 交换(1) 5
个数 (a[0]~a[4]) 中找最小数,与 a[0] 交换(2) 4个数 (a[1]~a[4]) 中找最小数,与 a[1] 交换
(3) 3个数 (a[2]~a[4]) 中找最小数,与 a[2] 交换(4) 2个数 (a[3]~a[4]) 中找最小数,与 a[
3] 交换选择法(2)n个数重复n-1次流程图外循环控制: n 个数选择排序共需要n-1次内循环控制:在下标范围[k,n-1]内找
最小值所在位置index选择法排序 (程序段) 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: 5Enter 10 integers: 3 5
2 8 1After sorted: 1 2 3 5 8例 7-6 二分法查找 设已有一个10个元素的整形
数组a,且按值从小到大有序。输入一个整数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。
例7-3顺序查找是最简单明了的一种,其查找过程就是对数组元素从头到尾的遍历过程。但是一旦数组元素量很大的情况下,其查找的效率不高
。 二分查找是查找效率较高的一种,但前提是数组元素必须是有序的。二分查找流程图二分法查找 (程序段) low = 0
; high = n - 1; / 开始时查找区间为整个数组 / while (low <
= high) { / 循环条件 / mid = (low + high) / 2
; / 中间位置 / if (x == a[mid]) break;
/ 查找成功,中止循环 / else if (x < a[mid])
high = mid - 1; / 前半段,high前移 /
else low = mid + 1; / 后半段,low
后移 / } if(low <= high) printf("Index is %d \
n",mid); else printf( "Not Found\n");将1个32的矩阵存入1个32的
二维数组中,找出最大值以及它的行下标和列下标,并输出该矩阵。 7.2.1 程序解析7.2.2 二维数组的定义和引用7.2.3
二维数组的初始化7.2.4 使用二维数组编程7.2 找出矩阵中最大值所在的位置 7.2.1 程序解析-求矩阵的最大值 例
7-7 将1个32的矩阵存入1个32的二维数组中,找出最大值以及它的行下标和列下标,并输出该矩阵。 row 记录最大值的行
下标col 最大值的列下标a[row][col] 就是最大值int main(void){ int col,
i, j, row; int a[3][2]; printf(“Enter 6 integers:\n") ; f
or(i = 0; i < 3; i++) for(j = 0; j < 2; j++)
scanf("%d", &a[i][j]); for(i = 0; i < 3; i++){ fo
r(j = 0; j < 2; j++) printf("%4d", a[i][j]); p
rintf("\n"); } row = col = 0; for(i = 0; i < 3; i++) f
or(j = 0; j < 2; j++) 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-7 源程序Enter
6 integers: 3 2 10 -96 -13 2 10 -96 -1max = a[1][0] = 10二维
数组多维数组的空间想象二维数组: 一个表格或一个平面矩阵一维数组: 一列长表或一个向量多维数组: 多维空间的一个数据列阵三维数组:
三维空间的一个方阵7.2.2 二维数组的定义和引用1、定义类型名 数组名[行长度][列长度]int a[3][2];定义1个二
维数组a,3行2列,6个元素int b[5][10];定义1个二维数组a,5 行 10 列, 50 个元素 2、引用先定义,
后使用数组元素的引用:数组名[行下标] [列下标]行下标和列下标:整型表达式行下标的取值范围是[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] 下标不要越界二维数组在内存中的存放方式int a[3][2];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] 7.2.3 二维数组的初始化1、分行赋初值int a[3][3] = {{1,2,3},{
4,5,6},{7,8,9}};static int b[4][3] = {{1,2,3},{ },{4,5}};数组a1
2 3 4 5 67 8 9数组b1 2 30 0 04 5 0
0 0 02、顺序赋初值 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};省略行长度对全部元素都赋了初值,int a[ ][3]={1,2,3,4,
5,6,7,8,9};或分行赋初值时,在初值表中列出了全部行static int b[ ][3]={{1,2,3},{},{4,5
},{}}数组a1 2 3 4 5 67 8 9数组b1 2 30 0
04 5 00 0 0建议不要省略7.2.4 使用二维数组编程行下标和列下标分别做为循环变量, 通过二
重循环,遍历二维数组通常将行下标做为外循环的循环变量 列下标 内循环定义1个 32 的二维数组a,数组元素的值由
下式给出,按矩阵的形式输出a。a[i][j] = i + j(0≤i≤2,0≤j≤1)例7-8 生成一个矩阵并输出 int a[
3][2];a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
0 11 22 3#include 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++){ for(j = 0; j < 2; j++) 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] i
= 0 j = 0i = 0 j = 1i = 1 j = 0i = 1 j = 1i = 2 j = 0i
= 2 j = 1 例7-8 源程序0 11 22 3二维数组的输入例7-7中,int a[3][2]
;for(i = 0; i < 3; i++) for(j = 0; j < 2; j++) scanf("%
d", &a[i][j]);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]);Enter 6 integers: 3 2 10 -9 6 -1
3 2 10 -9 6 -1max = a[1][0] = 10Enter 6 integers: 2 10 -9
6 -13 -9 2 610 -1max = a[2][0] = 10int a[N][N];
N是正整数a[i][j]:i、j的取值范围[0,N-1]用二维数组a表示NN方阵时,对应关系: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==ji<=ji>=ji+j==N-1输入一个正整数n (1 转置(行列互换)后输出。 a[i][j] = i n + j + 1(0≤i≤n-1,0≤j≤n-1)分析:int a[6]
[6]; n=3时例7-9 方阵转置 #include 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-9 源程序 / 行列互换/ 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=01 4 7
2 5 63 8 9i=11 4 72 5 83 6 9例7-9
说明for( j = i; j < n; j++) / 行列互换/ for(i = 0; i < n; i++) f
or(j = 0; j < n; j++){ temp = a[i][j]; a[i][j
] = a[j][i]; a[j][i] = temp; }1 2 3 4 5
67 8 9例7-9 思考i=01 4 7 2 5 63 8 9i=11
2 74 5 83 6 9i=21 2 3 4 5 67 8
9例7-10 日期计算自定义1个函数day_of_year(year, month, day),计算并返回年year、月
month和日day对应的是该年的第几天。 day_of_year(2000, 3, 1) 返回61day_of_year(198
1, 3, 1) 返回60分析: 月 0 1 2 3 …… 11 12非闰年 0
31 28 31 30 31闰年 0 31 29 31 30
31int 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}}例7-10 源程序int da
y_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} }; le
ap = (year%4==0&&year%100!=0) || year %400==0; for (k=1; k nth; k++) day = day + tab[leap][k]; return day;}例7
-11 输入一个以回车结束的字符串(少于10个字符),判断该字符串是否是回文? 所谓回文就是字符串中心对称,如“
abcba”、“abccba”是回文,“abcdba”不是回文。7.3.1 程序解析7.3.2 一维字符数组7.3.3 字符
串7.3.4 使用字符串编程7.3 判断回文7.3.1 程序解析- 判断回文# include int m
ain(void) { int i, n, m; char s[10]; printf("Enter a str
ing: "); i = 0; while((s[i] = getchar( )) != ''\n'')
i++; s[i] = ''\0''; for(n = 0,m = i-1; n < m;n++,
m--) if(s[n] != s[m]) break; if( n >=
m) printf(“ It is a plalindrome\n”); else print
f(“ It is not a plalindrome\n”); return 0;} Enter a string: ab
cbaIt is a plalindrome Enter a string: abcdbaIt is not a plalindr
ome 7.3.2 一维字符数组字符串的存储和运算可以用一维字符数组实现一维字符数组的定义、引用、初始化与其他类型的一维数组一样。
char str[80]; 定义一个含有80个字符型元素的数组str char t[5]={''H'', ''a'', ''p'', ''p''
, ''y''};初始化数组 t输出数组 t 的所有元素for(i=0; i<5; i++) putchar( t[i] );一
维字符数组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''};7.3.3 字符串字符串常量用一对双引号括起来的字符序列一个字符串结束符 ''\0''"Happy"6个字
符 ''H'' ''a’ ''p’ ''p’ ''y'' ''\0''有效字符字符串结束符字符串的有效长度:有效
字符的个数字符串与一维字符数组字符串:一个特殊的一维字符数组把字符串放入一维字符数组(存储)对字符串的操作 ===> 对字符数组的
操作1. 字符串的存储-数组初始化字符串可以存放在一维字符数组中 static char s[6] = {''H'', ''a'', ''p
'', ''p'', ''y'', ''\0''};字符数组初始化:用字符串常量static char s[6] = {"Happy"};sta
tic char s[6] = "Happy";数组长度 >= 字符串的有效长度 + 1char t[5]; "H
appy" 能存入t吗?字符串的存储auto char s[80]= "Happy";字符串遇 ''\0'' 结束第一个 ''\0'' 前
面的所有字符和 ''\0'' 一起构成了字符串 "Happy”''\0'' 之后的其他数组元素与该字符串无关字符串由有效字符和字符串结束符
''\0'' 组成 2. 对字符串的操作把字符串放入一维字符数组(存储)对字符串的操作 ===> 对字符数组的操作普通字符数组:数组
元素的个数是确定的,一般用下标控制循环字符串:没有显式地给出有效字符的个数,只规定在字符串结束符 ''\0'' 之前的字符都是字符串的
有效字符,一般用结束符 ''\0'' 来控制循环循环条件:s[i] != ''\0'' for(i = 0; s[i] != ''\0'';
i++) putchar(s[i]);for(i = 0; i < 80; i++) putchar(s[i]);fo
r(i = 0; i < len; i++) putchar(s[i]);输出字符串输出?3. 字符串的存储-赋值和输入把字
符串放入一维字符数组(存储)对字符串的操作 ===> 对字符数组的操作存储数组初始化static char s[6]= "Hell
o";赋值s[0]=''a''; s[1]=''\0'';或者static char s[6]= "a";"a" 2 个字符 ''a''
和 ''\0''''a'' 1 个字符常量区分"a" 和 ''a''字符串的输入字符串的存储字符数组初始化:static char
s[6] = "Happy";赋值:s[0] = ''a''; s[1] = ''\0'';输入 ''\0'' 代表空操作,无法输入输入时,设
定一个输入结束符将输入结束符转换为字符串结束符 ''\0''例7-12 数值转换#include int main(
void){ int i, number; char str[10]; printf(“Enter a
string: "); ? / 输入字符串 / i = 0; while((str[i] = getchar
( )) != ''\n'') i++; str[i] = ''\0''; number = 0;
/ 将字符串转换为整数 / for(i = 0; str[i] != ''\0''; i++)
if(str[i] >= ‘0'' && str[i] <= ‘9'') number = n
umber 10 + (str[i] - ''0''); printf("digit = %d\n", number);
return 0;} Enter a string:ab1cb23adigit = 1237.3.4 使用字符串
编程 由于字符串在C语言中采用一维的字符数组方式存储,故对字符串的处理实际上就是对一维数组的处理,只是循环的控制
条件由数组元素值是否等于’\0’来确定。输入一个以回车结束的字符串(少于80个字符),统计其中数字字符的个数。分析:数组长度取上限
80以 ''\n'' 做为输入结束符例7-13 统计数字字符个数#include 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-13 源程序Enter a string: It‘s 512count = 3如何改变输入结束符?能省略str
[i] = ''\0''吗? 输入一个以回车结束的字符串(少于80个字符),滤去所有的非十六进制字符后,组成一个新字符串(十六进
制形式),输出该字符串并将其转换为十进制数后输出。例7-14 进制转换 例如:输入字符串: zx1?ma0!kbq去掉非十六进制
后组成新字符串:1a0b 转换为十进制为:6667分析输入原字符串str1虑调非16进制字符后生成新字符串str2把字符串str2
转换成十进制数number输出number i = 0; while((str1[i] = getchar()) != ''\n'')
i++;str[i] = ‘\0’;k=0; //k控制新字符串str2的下标for(i = 0; str1[i] != ''\0''; i++) if ( str1[i] >= ''0'' && str1[i] <= ''9‘ || str1[i] >= ''a'' && str1[i] <= ''f'' || str1[i] >= ''A'' && str1[i] <= ''F‘ ) { str2[k] = str1[i]; k++; }str2[k] = ‘\0’; //新字符串结束标记number = 0; //清0for(i = 0; str2[i] != ‘\0’; i++) //逐个转换 if(str2[i] >= ''0'' && str2[i] <= ''9'') number = number 16 + str2[i] - ''0''; else if(str2[i] >= ''a'' && str2[i] <= ''f'') number = number 16 + str2[i] - ''a'' + 10; else if(str2[i] >= ''A'' && str2[i] <= ''F'') number = number 16 + str2[i] - ''A'' + 10;字符串小结字符串:一个特殊的一维字符数组 ''\0''把字符串放入一维字符数组(存储)数组长度足够字符数组初始化: static char s[80] = "Happy";赋值: s[0] = ''a''; s[1] = ''\0'';输入: 输入结束符 ==> 字符串结束符''\0'' i = 0; while((s[i]=getchar( )) != ''\n'') i++; s[i] = ''\0'';把字符串放入一维字符数组(存储)对字符串的操作 ===> 对字符数组的操作只针对字符串的有效字符和字符串结束符 ''\0'' 检测for(i = 0; s[i] != ''\0''; i++) putchar(s[i]);本章总结一维数组:定义、初始化、引用使用一维数组:选择排序二维数组定义、初始化、引用使用二维数组:矩阵字符串字符数组与字符串字符串的存储字符串的操作使用数组进行程序设计正确理解数组的基本概念及在内存中的存放方式;掌握使用一维数组编写程序;掌握使用二维数组编写程序;正确理解字符串的概念,掌握使用字符串编写程序;能合理运用数组进行程序设计,熟练掌握几个常用的算法;
献花(0)
+1
(本文系小磊老师首藏)