6.3 字符数组(课件)-《C语言程序设计》同步教学(清华大学出版)

2024-08-11
| 26页
| 98人阅读
| 9人下载
普通

内容正文:

《C语言程序设计》 (清华大学出版) 1 C 语言程序设计 第六章 数 组 2 第六章 数 组 6.3 字符数组 6.3.1 字符数组的定义 char c[5]; c[0]= 'a'; c[1]= ' '; c[2]= 'b'; c[3]= 'o'; c[4]= 'y'; 在内存中的状态如下: a   b o y c c+1 c+2 c+3 c+4 3 第六章 数 组 6.3.2 字符数组的初始化 例如 char c[ ]={'a', ' ' , 'b', 'o', 'y', '\0'}; char c[ ]= "a boy"; char c[ ]={"a boy"}; 三者等价。 数组 c 在内存中的状态: 注意:数组名是常量—是首地址。 如 char a[10]; a="abcde";是错的。 但 char a[10]="abcde";是对的 a   b o y \0 6.3.3 字符数组的输入/输出 1. 逐个字符的输入、输出 函数 getchar 和 putchar, 函数 scanf 和 printf 的"%c"。 【例6.8】输入一行字符,将其中的小写字母转换成大写字母,其余不变。 第六章 数 组 【例6.8】输入一行字符,将其中的小写字母转换成大写字母,其余不变。 第六章 数 组 #include <stdio.h> void main() { char c[81]; int i; for( i=0; (c[i]=getchar()) !=' '; i++ ); c[i]='\0'; for(i=0;c[i]!='\0';i++) { if ( c[i]>='a'&&c[i]<='z' ) c[i]-=32; printf("%c",c[i]); } } 【例6.8】输入一行字符,将其中的小写字母转换成大写字母,其余不变。 第六章 数 组 2. 整个字符串的输入/输出 函数 scanf 和 printf 的"%s"。 将【例6.8】修改如下: #include <stdio.h> void main() { char c[81]; int i; scanf("%s",c); for(i=0;c[i]!='\0';i++) if(c[i]>='a'&&c[i]<='z') c[i]-=32; printf("%s",c); } 遇到空格、Tab符、回车符终止,并写入 '\0' 6.3.4 常用的字符数串处理函数 1.字符串输出函数puts 函数原型:int puts (char *str); 使用方法:puts(str); 例如: char s[ ]="Beijing China"; puts(s); 输出: Beijing China 第六章 数 组 6.3.4 常用的字符数串处理函数 2.字符串输入函数gets 函数原型:char *gets (char *str); 使用方法:gets(str); 例如: char str[81]; gets(str); 从键盘输入:Computer Science↙ 第六章 数 组 6.3.4 常用的字符数串处理函数 3. 字符串连接函数strcat (包含在头文件<string.h>中) 函数原型:char * strcat (char *str1, char *str2); 使用方法:strcat(str1,str2); 例如: char str1[15]="Beijing "; char str2[ ]="China"; printf("%s", strcat(str1,str2)); 输出: Beijing China 第六章 数 组 6.3.4 常用的字符数串处理函数 4.字符串拷贝函数strcpy (包含在头文件<string.h>中) 函数原型:char * strcpy (char *str1, char *str2); 使用方法:strcpy(str1,str2); 例如: char str1[10]="012345678", str2[ ]="China"; strcpy(str1,str2); 第六章 数 组 '0' '1' '2' '3' '4' '5' '6' '7' '8' '\0' 'C' 'h' 'i' 'n' 'a' '\0' '6' '7' '8' '\0' 6.3.4 常用的字符数串处理函数 5.字符串比较函数strcmp (包含在头文件<string.h>中) 函数原型:int strcmp (char *str1, char *str2); 使用方法:strcmp(str1,str2); 例如: strcmp("abc", "abc") 的返回值 为0(即'\0'-'\0'的值); strcmp("abc", "abcd") 的返回值 为-100 (即'\0'-'d'的值); strcmp("abc", "aBef")的返回值 为32 (即'b'-'B'的值)。 第六章 数 组 依次按相应位置上的字符的ASCII码大小进行比较,直到出现不同的字符或遇到字符串结束标记'\0'。 6.3.4 常用的字符数串处理函数 6.求字符串长度函数strlen (包含在头文件<string.h>中) 函数原型:int strlen (char *str); 使用方法:strlen(str); 例如: char str[10]="China"; printf("%d",strlen(str)); 输出结果为 5 第六章 数 组 6.3.5 二维字符数组 char str[3][10]={"China", "Holland", "America"}; 定义了一个二维字符数组str,在内存中的存放形式 printf("%s",str[0]); 或puts(str[0]); 均输出字符串 China 第六章 数 组 str[0] → 'C' 'h' 'i' 'n' 'a' '\0' '\0' '\0' '\0' '\0' str[1] → 'H' 'o' 'l' 'l' 'a' 'n' 'd' '\0' '\0' '\0' str[2] → 'A' 'm' 'e' 'r' 'i' 'c' 'a' '\0' '\0' '\0' 6.3.6 字符串应用举例 【例6.9】将字符数组中的字符串按逆序存放。 分析:怎样将字符串逆序存放? (1)先找出最后字符的位置; (2)将第一个字符与最后一个字符交换、第二个字符和倒数第二个字符交换,…。 若有n个字符,则要交换 n/2 次,即可将原字符串按逆序存放。 第六章 数 组 第六章 数 组 #include <stdio.h> void main() { char s[81], t; int i, j; gets(s); /* 输入字符串 */ for(j=0;s[j]!='\0';j++); /* 统计字符串的长度(j的值)*/ for(i=0,j--;i<j;i++,j--) /* 将i、j对应的字符交换 */ { t=s[i];s[i]=s[j];s[j]=t;} printf("the reverse string: %s ",s); } j=strelen(s); /* 统计字符串长度,确定最后字符的位置*/ #include <string.h> 6.3.6 字符串应用举例 【例6.10】从输入的字符串中删除一指定字符。 分析:怎样将字符串中的指定字符删除? (1)从字符串的第一个字符开始逐一比较是否为要删除的字符; (2)若是要删除的字符,则将下一个字符开始的所有字符均往前移一位,直到检查到字符串结束标志为止。 第六章 数 组 第六章 数 组 #include <stdio.h> #include <string.h> void main() { char s[81], ch; int i; printf("input string: "); gets(s); printf("delete character: "); ch=getchar(); for(i=0;s[i]!='\0'; ) { if(s[i]==ch) strcpy(s+i,s+i+1); /* s+i 表示s[i]的地址 */ else i++; /* i++不能放在for语句表达式3的位置上,为什么? */ } puts(s); } 如果不允许用<string.h>中的字符串函数,本题该如何处理? 留作上机实验的作业! 第六章 数 组 【例6.1】用选择排序法对 n 个数从小到大排序。 排序算法 设n=5 a[0] a[1] a[2] a[3] a[4] 原序列: 8 6 3 1 2 i=0, k=3 第1遍选择: 1 6 3 8 2 i=1, k=4 第2遍选择: 1 2 3 8 6 i=2, k=2 第3遍选择: 1 2 3 8 6 i=3, k=4 第4遍选择: 1 2 3 6 8 for ( i=0; i<4; i++ ) { k=i; for(j=i+1; j<5; j++) if( a[j]<a[k] ) k=j; t=a[k]; a[k]=a[i]; a[i]=t; } 19 #include <stdio.h> #define N 8 void main() { float a[N], t; int i, j, k; for(i=0;i<N;i++) scanf("%f",&a[i]); for(i=0;i<N-1;i++) { k=i; for(j=i+1;j<N;j++) if(a[j]<a[k]) k=j; t=a[k]; a[k]=a[i]; a[i]=t; } for(i=0;i<N;i++) printf("%.2f ",a[i]); } 第六章 数 组 20 第六章 数 组 【例6.2】用冒泡排序法对 n 个数从小到大排序。 8 6 3 1 2 原始 6 8 3 1 2 第一次 6 3 8 1 2 第二次 6 3 1 8 2 第三次 6 3 1 2 8 第四次 对5个数,从小到大排序:N=5 第一遍选择: a[0] a[1] a[2] a[3] a[4] 排序算法 21 第六章 数 组 6 3 1 1 3 1 2 2 1 2 3 3 2 6 6 6 8 8 8 8 第一遍 第二遍 第三遍 第四遍 for(i=0;i<N-1;i++) for(j=0;j<N-1-i;j++) if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1] ; a[j+1]=t; } a[0] a[1] a[2] a[3] a[4] 22 第六章 数 组 #include <stdio.h> #define N 8 void main() { float a[N] ,t; int i,j,k; printf("input %d numbers: ",N); for(i=0;i<N;i++) scanf("%f",&a[i]); for(i=0;i<N-1;i++) for(j=0;j<N-1-i;j++) if(a[j]>a[j+1]) {t=a[j]; a[j]=a[j+1] ; a[j+1]=t; } printf("the sorted numbers: "); for(i=0;i<N;i++) printf("%.2f ",a[i]); } 23 第六章 数 组 1. 学校举行校园歌手大赛,请为大赛组委会编一个程序,计算评委为每位歌手打分的平均分(共20名评委)。 2. 去掉一个最高分和一个最低分,计算每位歌手的平均分。 3. 去掉 2 个最高分 和 2 个最低分,计算每位歌手的平均分。 思考题: 24 第六章 数 组 #include<stdio.h> void main() { int i; printf("请输入评委打分 "); for(i=0; i<N ; i++) { scanf("%f", J+i); sum +=J[i]; } // 累加求和 ave=sum/N ; // 求平均分 printf(" 平均分:%.2f ",ave); } ave ; float J[N], sum=0.0, 1. 学校举行校园歌手大赛,请为大赛组委会编一个程序,计算评委为每位歌手打分的平均分(共20名评委)。 # define N 20 // 宏定义 N 3. 去掉 2 个最高分和 2 个最低分,计算每位歌手的平均分。 先排序,然后按需要求和,再求平均! 25 谢谢观看 26 $$

资源预览图

6.3 字符数组(课件)-《C语言程序设计》同步教学(清华大学出版)
1
6.3 字符数组(课件)-《C语言程序设计》同步教学(清华大学出版)
2
6.3 字符数组(课件)-《C语言程序设计》同步教学(清华大学出版)
3
6.3 字符数组(课件)-《C语言程序设计》同步教学(清华大学出版)
4
6.3 字符数组(课件)-《C语言程序设计》同步教学(清华大学出版)
5
6.3 字符数组(课件)-《C语言程序设计》同步教学(清华大学出版)
6
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。