Download presentation
Presentation is loading. Please wait.
1
只怕有心人只怕有心人 世上无难事世上无难事 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
2
项目 5 简易的选票统计器 学习目标 : 通过该项目你可以知道: 1. 一维数组的的概念、定义、初始化、数组元素引用。 2. 一维数组的输入 / 输出。 3. 比较排序和冒泡排序的算法。 4. 一维字符数组的定义、初始、引用 。 5. 常用的字符串函数。 6. 二维字符数组的定义、初始、引用。 7. 二维数组的输入 / 输出。 8. 结构体类型和结构体变量的定义、引用、初始化。 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
3
项目 5 简易的选票统计器 通过该项目你能够: 能使用一维数组进行编程。 能使用比较法和冒泡法对数据进行排序。 能正确使用一维字符数组、常见的字符串处理函数 以及二维字符数组。 能正确使用二维数组进行编程。 能使用结构体数组进行编程,解决各种实际问题。 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
4
5.1 项目情景 王佳想要自己用 C 语言编程实现制作一个选票统计 器的简易功能,该选票统计器实现如下功能: (1) 投票功能 (2) 统计票数 实现结果如下图所示: 请你帮助王佳一起用 C 语言完成一个简易版的选票 统计器吧! 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
5
5.1 项目情景 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
6
5.2 项目相关知识 到目前为止,我们所使用到都是 C 语言 的基本数据类型的数据,但是在实际问题 中有些只靠基本数据类型是无法表达,所 以就要利用构造型数据来描述。 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
7
请编写如下程序: 输入 100 名学生的成绩,要求输出高于平均分的成绩。 算法:为了保存 100 名学生的成绩,需要定义 100 个 变量(假定为 a1 , a2 , …a100) 来存放, 且用变量与 平均分 ( 假定为 avg) 一一比较如下 : if(a1>avg)printf(“%f\n”,a1); if(a2>avg)printf(“%f\n”,a2); …… if(a100>avg)printf(“%f\n”,a100); 5.2 项目相关知识 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
8
1 、数组: 2 、数组元素: 一组具有相同数据类型的数据的有序的集合 数组中的每一个数组元素具有相同的名称,不同的下 标,可以作为单个变量使用,所以也称为下标变量。在 定义一个数组后,在内存中使用一片连续的空间依次存 放数组的各个元素。 5.2 项目相关知识 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
9
一、一维数组的定义(先定义后使用) 1. 定义方式: 类型说明符 数组名 [ 常量表达式 ] 2. 例 : int a[10] 定义一个数组,数组名 a ,有 10 个元素,每个元素的类型 均为 int 。 这 10 个元素分别是: a[0] 、 a[1] 、 a[2] 、 a[3] 、 a[4] 、.... 、 a[8] 、 a[9] 。 5.2.1 一维数组 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
10
3. 说明: ( 3 )常量表达式表示元素的个数,即数组的长度。下标从 0 开始! 例如: int n; scanf("%d",&n); int a[n]; ( 4 ) C 语言不允许对数组的大小做动态定义 ( 2 )数组名后是 [ ] ,不能是( )。 因为在编译时, C 编译器根据已知数组大小分配内存。 × 5.2.1 一维数组 ( 1 )数组名:按标识符规则。本例 a 就是数组名。 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
11
【例 4-1 】数组元素的使用。输入十个学生的成绩,并将其输出。 #include "stdio.h" main() { int i,a[10]; printf(" 输入数组元素: "); for(i=0;i<10;i++) scanf("%d",&a[i]); printf(" 输出数组元素: "); for(i=0;i<10;i++) printf("%5d",a[i]); } 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
12
( 1 ) C 语言不检查数组下标越界,但是使用时, 一般不能越界使用,否则结果难以预料 ( 2 ) C 语言还规定,数组名是数组的首地址。即 a=&a[0] 5.2.1 一维数组 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
13
1. 先定义,后使用。不能一次引用整个数组 二、一维数组元素的引用 2. 表示形式 : 数组名 [ 下标 ] 3. 下标可以是整型常量或表达式。 例如: a[0]=a[5]+a[7]-a[2*3] 5.2.1 一维数组 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
14
【例 4-2 】求学生的总评成绩。现有十个学生,从键盘上输入他们的 平时成绩、期终成绩,输出总评成绩。 总评成绩 = 平时成绩 *40%+ 期终成绩 *60%. #include "stdio.h" main() { int i; float a[11],b[11],c[11]; printf(" 输入平时成绩: "); for(i=1;i<=10;i++) scanf("%f",&a[i]); printf(" 输入期终成绩: "); for(i=1;i<=10;i++) scanf("%f",&b[i]); for(i=1;i<=10;i++) c[i]=0.4*a[i]+0.6*b[i]; printf(" 输出总评成绩: "); for(i=1;i<=10;i++) printf("%5.1f",c[i]); printf("\n"); } 输入 10 个平时成绩给 a[1] 到 a[10] 输入 10 个期终成绩给 b[1] 到 b[10] for(i=0;i<10;i++) c[i]=0.4*a[i]+0.6*b[i]; 输出总评成绩 c[1] 直到 c[10] 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
15
三、一维数组的初始化 (1) 定义数组时对数组元素赋以初值。 int x[5]={1,2,3,4,5}; (2) 可以只给一部分元素赋初值。 int x[5]={1,2}; 系统自动给指定值的数组元素赋值: x[0]=1,x[1]=2 ,其他元素值均为 0 。 (3) 如果一个数组的全部元素值都为 0 ,可以写成: int x[5]={0,0,0,0,0}; 或 int x[5]={0}; (4) 对全部元素赋初值时,可以不指定长度。 int x[5]={1,2,3,4,5}; 等价于 int x[ ]={1,2,3,4,5}; 5.2.1 一维数组 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
16
int arr[10] = {10,9,8,7,6,5,4,3,2,1,0}; int arr[10] = {9,8,7,5}; int arr[] = {9,8,7}; int arr[]={}; // 错误!越界了 // 正确,后面的 6 个元素未初始化 // 正确:元素个数为 3 // 错误,到底是几个元素? 判断下面数组初始化的正确性 5.2.1 一维数组 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
18
2. 一维字符数组的初始化 (1) 定义时逐个字符给数组中各元素。 char c[5]={‘c’,’h’,’i’,’n’,’a’}; (2) 可省略数组长度。 char c[ ]={‘c’,’h’,’i’,’n’,’a’}; 系统根据初值个数确定数组的长度,数组 c 的长度自动为 5 。 (3) 字符数组可以用字符串来初始化。 char c[6]=”china” char c[10]={“china”} /* 加不加花括号都没关系 */ ( 一 ) 1. 一维字符数组的定义 例如: char c[10]; 意思是定义一个字符数组 c ,它有 10 个元素。 c[0]=’I’;c[1]=’□’;c[2]=’a’;c[3]=’m’;c[4]=’□ ’; c[5]=’h’;c[6]=’a’;c[7]=’p’;c[8]=’p’;c[9]=’y 。 该数组的下标从 0 到 9 ,数组元素值如右图所示。 china\0 I □ am □ happy china 5.2.2 一维字符数组 浙江长征职业技术学院 — 计算机与信 息技术系 — 相方莉制作
19
(1)“%s” 格式输入时,遇空格或回车结束,但获得的字符中不包 含回车及空格本身,而是在字符串末尾添 ’\0’ 。 3. 一维字符数组的引用 方法一:用 %c 格式符逐个输入输出。 例如: char c[6]; for(i=0;i<6;i++) {scanf(“%c”,&c[i]); printf(“%c”,c[i]);} 方法二:用 %s 格式符进行字符串输 入输出。例如: char c[6]; scanf(“%s”,c); printf(“%s”,c); 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
20
【例 4-7 】三个同学姓名的输入输出。 程序如下 : #include "stdio.h" main() {char name1[10],name2[10],name3[10]; printf(" 请输入姓名 :\n"); scanf("%s%s%s",name1,name2,name3); printf(" 输出的姓名为 :\n"); printf("%s,%s,%s\n",name1,name2,name3);} 程序的运行结果表明: %s 输入时,空格或回车表示输入的分隔符 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
21
4. 常用的字符串处理函数 (1) 输入字符串函数 ——gets() 格式: gets( 字符数组 ) 例如: char s[12]; gets(s); 功能:从键盘输入 1 个字符串。允许输入空格。 【例 4-8 】将例 4-7 改为 gets() 输入: #include "stdio.h" main() {char name1[10],name2[10],name3[10]; printf(" 请输入姓名 :\n"); gets(name1); gets(name2); gets(name3); printf(" 输出的姓名为 :\n"); printf("%s,%s,%s\n",name1,name2,name3);} 注意: gets( ) 允许输入空格 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
22
(2) 输出字符串函数 格式: puts( 字符数组 ) 如: char s[6]=”china”; puts(s); 功能:把字符数组中所存的字符串,输出到标准输出设备中, 并用 ’\n’ 代替 ’\0’ 【例 4-9 】将例 4-7 改为 gets() 、 puts() 函数。 #include "stdio.h" main() {char name1[10],name2[10],name3[10]; printf(" 请输入姓名 :\n"); gets(name1);gets(name2);gets(name3); printf(" 输出的姓名为 :\n"); puts(name1);puts(name2);puts(name3); } 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
23
【例 4-17 】从键盘输入一串字符(以回车键结束),统计字符数。 分析:因为不知道会输入一串多长的字符,所以刚开始定义一个足够大 的字符数组 char str[80] ,然后从键盘输入的字符将会放在 str[0] 至 str[k] 中,而 str[k+1] 将存放回车。如表: 所以,从 str[0] 开始找,只要没找到 ’\0’ ,则继续找下一个。 \0Str(k)……Str(0) 程序如下: #include "stdio.h" #define N 80 main() { char str[N],i,t; printf(" 输入字符串 \n"); gets(str); i=0; while(str[i]!='\0') i++; printf(" 字符数为 %d",i); printf("\n"); } 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
24
二级 C 语言考试大纲要求 常用字符串函数: strcpy 、 strcmp 、 strcat 、 strlen 等。 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
25
字符串处理函数 C语言提供了丰富的字符串处理函数,大致可分为 字符串的输入、输出、合并、修改、比较、转换、复 制、搜索几类。 用于输入输出的字符串函数,在使用前应包含头文 件 stdio.h 。 使用其它字符串函数,则应包含头文件 string.h 。 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
26
字符串连接函数( strcat ) 格式: strcat( 字符数组名 1 ,字符数组名 2) ; 功能: 把字符数组 2 中的字符串(连同尾部的 ’\0’ )连接到 字符数组 1 中字符串的后面,并删去字符串 1 后的串 结束标志 ’\0’ 。本函数返回值是字符数组 1 的首地址。 说明: 字符数组 1 必须足够大。 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
27
字符串连接函数举例 #include"string.h" void main() { char st1[30]="My name is "; char st2[10]; printf(" 请输入姓名 :\n"); gets(st2); strcat(st1,st2); puts(st1); } 源程序 【问题 3 】写出下面程序的运行情况。 程序运行情况 输入 Zhang yi ↙时, 输出结果是什么? My name is Zhang yi 输出结果 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
28
字符串拷贝函数( strcpy ) 格式: strcpy( 字符数组名 1 ,字符数组名 2) ; 功能: 把字符数组 2 中的字符串拷贝到字符数组 1 中。串结束标志 “\0” 也一同拷贝。 说明: ① 字符数组 1 必须写成数组名形式, 字符数组 2 可以是数组名 形式也可以是字符串常量。 ② 不能用赋值语句将一个字符串常量或字符数组直接赋给一 个字符数组。 例如: char str1[20], str2[]=“program”; str1=“program”; str1=str2; 错误的用法 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
29
字符串拷贝函数举例 源程序 【问题 4 】写出下面程序的运行情况。 程序运行情况 C Language 输出结果 #include "string.h" void main() { char st1[15],st2[]="C Language"; strcpy(st1,st2); puts(st1); } 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
30
字符串比较函数( strcmp ) 格式: strcmp( 字符数组名 1 ,字符数组名 2) 功能: 按照 ASCII 码顺序 ( 即字典顺序 ) 比较两个数组中的字符串, 并由函数返回值返回比较结果。 字符串 1 = 字符串 2 ,返回值 =0 ; 字符串 1 > 字符串 2 ,返回值 >0 ; 字符串 1 < 字符串 2 ,返回值 <0 。 说明: 不能用比较运算符直接比较两个字符串。 例如: char str1[]=“progress”, str2[]=“program”; if (str1!=str2) …… 错误的用法 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
31
字符串比较函数举例 源程序 【问题 5 】写出下面程序的运行情况。 程序运行情况 输入 C Lang ↙时,输 出结果是什么? #include "string.h" void main() { int k; char st1[15],st2[]="C Language"; printf(" 请输入一个字符串 :\n"); gets(st1); k=strcmp(st1,st2); if (k==0) printf("%s 与 %s 相等。 \n",st1,st2); if (k>0) printf("%s 大于 %s 。 \n",st1,st2); if (k<0) printf("%s 小于 %s 。 \n",st1,st2); } C Lang 小于 C Language 。 输出结果 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
32
测字符串长度函数( strlen ) 格式: strlen( 字符数组名 ) 功能: 测字符串的实际长度 ( 不含字符串结束标志 ‘\0’) ,并 作为函数返回值。 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
33
测字符串长度函数举例 源程序 【问题 6 】写出下面程序的运行情况。 程序运行情况 #include "string.h" void main() { int k; char st[]="C Language"; k=strlen(st); printf(“ 字符串( %s )的长度为 %d 。 \n", st, k); } 字符串( C Language )的长度为 10 。 输出结果 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
34
单个字符的输入 / 出函数 单个字符的输出函数 putchar( 字符变量或字符常量 ) ; 例如: ① putchar( ‘A’ ); ② char ch=‘\n’; putchar(ch); 单个字符的输入函数 字符变量 =getchar() ; 例如: char ch; ch=getchar(); 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
35
二级 C 语言考试大纲要求 常用字符函数: isalnum 、 isalpha 、 isdigit 、 islower 、 toupper 、 tolower 等; 浙江长征职业技术学院 — 计算机与信息技术系 — 相方莉制作
Similar presentations