内容正文:
《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
$$