c语言程序设计4(数组、字符串).ppt_第1页
c语言程序设计4(数组、字符串).ppt_第2页
c语言程序设计4(数组、字符串).ppt_第3页
c语言程序设计4(数组、字符串).ppt_第4页
c语言程序设计4(数组、字符串).ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章 数据的组织结构(一),4.3 字符串的组织,4.2 利用一维数组组织数据的应用实例,4.1 数组类型,4.4 常用的字符串标准函数及应用实例,4.1 数组类型,数组名字相同、类型相同的一组数据 (1)同时存在若干个用来描述同一性质且不同个体的数据。 (2)只有将这些数据组织在一起形成批量数据,共同参与处理,很多操作才具有实际意义。,一维数组类型的定义 定义格式: 元素类型 数组名元素个数;,整型常量,例如: int vote10; 下标从0开始,因此,表示这10个数据的下标为09, 这10个元素是:vote0, vote9,变量一经定义,系统就要为它分配相应的存储空间。在C程序中,系统

2、将为每个数组分配一段连续的存储空间,所需要分配的存储空间总数将取决于包含的元素个数和每个元素需要的存储空间大小。,数组中的各个元素将按照下标从小到大的顺序依次连续的存储在该存储空间中。,score0=9.2, score1=9.1 ,score2=8.7, score3=9.1 score4=8.5,一维数组的初始化 元素类型 数组名元素个数=初值1,初值2,.,初值n ; 例如:float score5 = 9.2, 9.1, 8.7, 9.1, 8.5;,说明: 1)对数组全部元素赋初值时,可以省略方括号内的数组元素数量。元素个数由初值个数自动确定。,例如:float score = 9.

3、2, 9.1, 8.7, 9.1, 8.5;,2)可以只给前面若干个元素赋予初值,未赋初值的元素自动赋缺省值。 如: int a5=1,3,5;,相当于:a0=1 a1=3 a2=5 a3=0 a4=0,3)使数组的全部元素赋予初值0。此时,可以使用下面这种简化的书写形式: int vote10 = 0;,数组元素的引用 数组变量名下标表达式 注意:下标不能越界, 逐个引用 数组的赋值 利用赋值语句为数组赋值 for (i=0; i10; i+) votei = 0; 调用标准输入函数为数组赋值 for (i=0; i13; i+) scanf(“%f”, ,一维数组元素的引用及基本操作,例如

4、: main( ) int i,a10; for(i=0;i=0;i-) printf(“%d”,ai); ,结果:9 8 7 6 5 4 3 2 1 0,按照条件对数据进行筛选 在遇到的许多问题中,经常需要从众多的数据中挑选出来满足一定条件的数据,这就是数据的筛选操作。在C程序中,参与筛选操作的批量数据可以采用一个一维数组型变量组织,筛选的条件用逻辑表达式表示。,4.2 利用一维数组组织数据的应用实例,P85 例1:在某个公司中,计划由职工们推选一名办公室主任。假设有10名候选人准备参与竞选。希望编写一个程序,输入一组选举人的投票信息,统计每个候选人的得票数目及选举结果。,问题分析,用一维数

5、组记录每位候选人的得票数量,数组下标09分别对应10位候选人。,投票通过循环输入介于110之间的整型数值来模拟。例如,输入3代表编码为3(下标为2)的候选人得票。0作为输入的结束标志。,找出最多的得票数量之后,从所有的候选人中筛选出得票数量与最高得票数量相同的人。,显示每位候选人的得票数量。,算法描述,#include #define NUM 10 /* 候选人人数 */ main( ) int voteNUM = 0; int code, i, winner; /* 职工投票 */ printf(nEnter your selection:n); do scanf(%d, ,程序代码,/*

6、输出选票 */ printf(n The amount of votes is :); for (i=0; ivotewinner) winner = i; /* 输出得票最高的所有候选人 */ printf(nThe winner :); for (i=winner; iNUM; i+) if (votei=votewinner) printf(%3d,i+1); ,根据需求对数据进行统计,为了满足特定的需要,对一组数据的某些特征进行统计是一项经常遇到的基本操作。例如,统计一段文本中某个字符出现的频率;统计学生考试的平均成绩等等都属于统计操作。统计操作的结果往往是通过对所有数据进行扫描、判断

7、或综合加工得到的。在C程序中,参与统计操作的批量数据可以用一维数组来组织,具体统计过程可以通过逻辑判断、累计、算术运算等基本操作手段实现。,问题分析 用一维数组构造26个用于记录每个字母出现次数的累加器。 依次读入字符,判别其是否为英文字母,是则进行统计,该字母对应的计数器(数组中的对应元素)加1。,P87 例2:在一段文本中,可能会出现各式各样的字符。编写一个程序,从键盘读入一行文本,完成统计每个英文字母出现的频率的操作。,算法描述,#include #define NUM 26 main( ) int letterNUM = 0; /*对应26个字母计数器的一维数组,初值为0*/ char

8、 ch; int i; printf(nEnter text linen); while (ch=getchar() != n) if (A=ch ,程序代码,P89 例3:每年中央电视台都要举办青年歌手大奖赛。假设有13位评委参与评分工作。计算每位歌手最终得分的方法是:首先去掉一个最高分和一个最低分,然后计算剩余11个分数的平均值,所得结果就是选手的最终得分。希望编写一个程序,帮助工作人员计算每个歌手的分数。,问题分析 用一维数组存储 13位评委给出的分数 寻找最高分和最低分 计算剩余11个分数的平均分,算法描述,程序代码,#include #define NUM 13 main( ) fl

9、oat scoreNUM; /*保存13位评委给分的一维数组*/ int i, minValue, maxValue; float sum; printf(nEnter 13 score:); /* 输入13位评委给出的分数 */ for (i=0; imaxValue) maxValue = scorei; sum = sum+scorei; sum = (sum- minValue-maxValue)/(NUM-2); /* 计算并输出歌手的最终得分 */ printf(nFinal score is %6.2f, sum); ,所谓查找是指根据某个给定的条件,在一组数据中搜索是否存在满足

10、该条件的数据的过程。如果存在,则表示查找成功,给出成功的标志;否则表示查找不成功,给出失败的标志。在程序中,查找操作的结果经常被用来作为是否执行某项后续操作的决策依据。,查找问题,P91 例4:已知某个班级35名学生的某门课程的考试成绩。请编写一个程序,查看在这个班级中是否存在不及格的学生。,问题分析 用一维数组记录每位学生的考试成绩,下标表示每个学生的编号,元素内容表示考试成绩。 查找可以通过从前往后依次查看每个元素内容的过程实现。顺序查找,算法描述,程序代码,#include #include /*含random( )的原型声明*/ #define NUM 35 /*学生人数*/ main

11、( ) int scoreNUM; int i; /* 随机产生35个考试成绩 */ randomize( ); /*随机数种子发生器*/ for (i=0; iNUM; i+) scorei = random(100); /*产生0到100-1之间的随机整型数*/ /*显示35名学生的考试成绩*/ for (i=0; iNUM; i+) printf(nNo.%d: %d, i+1, scorei); for (i=0; iNUM; i+) /*顺序查找是否存在不及格的学生*/ if (scorei60) break; /*输出查找结果*/ if (iNUM) printf(nNot all

12、 pass.); else printf(All pass.); ,问题分析适合于有序排列的数列 二分查找是指每次用key与位于查找区间中央位置的元素进行比较,比较结果将会产生下面三种情形之一: 如果相等,说明查找成功。 如果key小于中央位置的元素,说明如果存在这样的元素,应该位于查找区间的前半部分。此时可以将查找区间缩减为原来的一半,并在这一半的区间中继续用相同的方式查找。 如果key大于中央位置的元素,说明如果存在这样的元素,应该位于查找区间的后半部分。同样可以将查找区间缩减为原来的一半,并在这一半的区间中继续用相同的方式查找。 可以看出,用key与当前查找区间中央位置的元素比较后,不是

13、找到了,就是将查找区间缩小了一半。直到查找区间不存在了,说明没有要找的key。,P93 例5:已知一个按非递减有序排列的整型数列(12,23,30,45,48,50,67,82,91,103)。请编写一个程序,查找其中是否存在与给定key相等的数值。,算法描述,#include #define NUM 10 main( ) int valueNUM = 12, 23, 30, 45, 48, 50, 67, 82, 91, 103; /* 递增数列 */ int low, high, mid, key; printf(nEnter a key:); /* 输入查找的数值 */ scanf(%d

14、, /* 确认循环正常出口 */ ,程序代码,排序问题 将一组无序的数列重新排列成非递减或非递增的顺序是一种经常需要的操作。例如,在管理学生成绩的应用程序中,可以用一个数列表示一个班级的学生成绩,并按照从高到低的顺序重新排列,以便确定获得奖学金的学生。,P96 例6:假设用户通过键盘输入一个整型数列。请编写一个程序,将其按照从小到大的顺序重新排列。,问题分析 首先从n个数据中选择一个最小的数据,并将它交换到第1个位置;然后再从后面n-1个数据中选择一个最小的数据,并将它交换到第2个位置;以此类推,直至最后从两个数据中选择一个最小的数据,并将它交换到第n-1个位置为止,整个排序操作结束。,算法描

15、述,#include #define NUM 10 /* 参与排序的数据个数 */ main() int dataNUM; /* 存放参与排序的所有整数 */ int i, j, minValue, temp; /* 通过键盘输入待排序的整型数列 */ printf(nEnter %d integers., NUM); for (i=0; iNUM; i+) scanf(%d, ,程序代码,/*选择排序*/ for (i=0; iNUM-1; i+) /*排i号元素,i从0到NUM-2*/ minValue = i; /* minValue 代表最小值下标*/ for (j=i+1; jNUM

16、; j+) /*求最小值元素的下标*/ if (datajdataminValue) minValue = j; if (minValue!=i) /* 交换 */ temp = datai; datai = dataminValue; dataminValue = temp; /* 输出排序后的结果 */ printf(nOrdering list is:n); for (i=0; iNUM; i+) printf(%5d, datai); ,字符串的组织形式 字符串是指一个有限长度的字符序列 ,字符串常量用一对双引号(“”)括起来。 字符串中所包含的字符个数被称为字符串长度。,4.3 字符

17、串的组织,例如:“Welcom to Beijing” 长度为17 “This is a C program.” 长度为20 “” 空串,长度为0 “ ” 空格串,长度为空格的数目,在数组中存储时, 以0作为字符串结束标志,其ASCII代码为0,占一个字节,char str = “C program”; 或:char str = “C program” ; char str = C, , p, r, o, g, r, a, m, 0; 对于这种初始化形式,系统将其视为字符操作,而不是字符串操作,因此不会在尾部添加结束符0。 “C program”的存储状态,字符串的初始化,char str80

18、; 1、gets(str); 可以读入空格,遇到回车符为止 2、scanf(“%s”, str); 字符串本身不能含空格 gets( ) 函数以换行符或文件结束符EOF作为输入的结束标志,因此在输入的字符串中允许包含空格和制表符;而scanf( ) 函数则以空格、制表符、换行符和文件结束符EOF作为输入的结束标志,因此,在输入的字符串中不允许包含这些字符。如果包含了它们,将作为字符串输入的结束标志处理。,字符串的输入,1、puts(str); 2、printf(%s”, str); puts将字符串的内容显示到标准输出设备屏幕上,并换行。,gets和puts只能输入或输出一个字符串,用一个sc

19、anf函数可输入多个字符串, 各字符串间用空格分隔,字符串的输出,例:逐个字符输入输出,%c #include “stdio.h” main( ) int i; char c10; i=0; while(ci=getchar( )!=n) i+; ci=0; for(i=0; ci!=0; i+) printf(“%c”, ci); printf(“n”); ,4.4 常用的字符串标准函数及应用实例,1. 字符串转换成数值类型 atof(str); 将字符串str转换成一个双精度数值, 返回类型是double atoi(str); 将字符串str转换成普通整型, 返回类型是int atol(s

20、tr); 将字符串str转换成长整型, 返回类型是long,字符串标准函数,例7:标准函数atof()的应用 将用户以字符串形式输入的两个实型数值转换成double类型,并显示输出这两个实型数值及它们相加的结果。,#include #include main( ) char num120, num220; double d1, d2, sum; printf(nEnter the first number:); gets(num1); /* 输入第1个用字符串表示的实型数值 */ printf(Enter ths second number:); gets(num2); /* 输入第2个用字符

21、串表示的实型数值 */ d1 = atof(num1); /* 将第1个字符串转换成double类型 */ d2 = atof(num2); /* 将第2个字符串转换成double类型 */ sum = d1+d2; /* 将2个double类型数值相加 */ printf(n%s+%s=%.3lf, num1, num2, sum); /* 显示结果 */ ,程序代码,例8:标准函数ltoa( )的应用 将用户输入的长整型(long类型)数值转换成以字符串形式表示的十六进制、八进制和二进制数值,并显示输出。,2. 数值类型转换成字符串,itoa(num, str, radix); 将数值nu

22、m转换成radix 进制的字符串存于str中。 ltoa(num, str, radix);,其中str用于存放结果的字符串,radix是用户指定的进制数,它的取值必须介于236之间。在itoa( ) 函数中的num是一个int类型的数值;在ltoa( ) 函数中的num是一个long类型的数值。,#include #include main( ) char str33; long value; printf(nEnter a long number:); scanf(%ld, ,程序代码,strlwr(str);将字符串str中出现的所有大写字母转换成小写字母 strupr(str);将字符

23、串str中出现的所有小写字母转换成大写字母,P103 例9:统计一段文本中每个英文字母出现的次数。,3. 大小写转换,#include #include #include #define NUM 26 main( ) int letterNUM = 0; /* 用于存放统计结果的一维数组 */ char str80; /* 存放以字符串形式输入的文本 */ int i; printf(nEnter a text line); gets(str); /* 输入文本 */ strupr(str); /* 将文本中的所有小写字母转换成大写字母 */ for (i=0; stri!=0; i+) /*

24、 统计每个字母出现的次数 */ if (isalpha(stri) letterstri-A = letterstri-A+1; for (i=0; iNUM; i+) /* 输出统计结果 */ printf(n%c:%d,A+i, letteri); ,程序代码,strlen(str);函数值为字符串中实际字符个数,即字符串长度。字符串结束标志0不计算在内。,4. 计算字符串长度,如:char str10=“China”; printf(“%d”, strlen(str); 结果为5 如:strlen(“China”); 函数值为5,若字符串1=字符串2,函数值为0 若字符串1字符串2,函数

25、值为一正整数 若字符串1字符串2,函数值为一负整数,P105 例10:假设用户的密码是“administrators”,下面这个程序将用于检测用户输入的密码是否正确。如果不正确,给出相应的提示信息,并请求用户重新输入。,5. 字符串比较,例:“A” “Compare”,strcmp(str1, str2); 两个字符串进行比较时,将依据两个字符串对应位置的字符的ASCII编码决定其大小。,#include #include main( ) char password20; /* 存放用户输入的密码 */ printf(nEnter password: ); gets(password); /*

26、 输入密码 */ /* 检测用户输入的密码,如果不正确,给出提示,并请求重新输入 */ while (strcmp(password, administrators) != 0) printf(nInvalid passwordnn); printf(Enter password, again: ); gets(password); printf(OK); /*输入正确,显示OK*/ ,程序代码,6. 字符串拷贝,strcpy(str1, str2); 将str2中的字符串拷贝复制到str1代表的存储区域中。,例:char str80; strcpy(str, “0123456789”); 不

27、能:str=“0123456789”;,7. 字符串连接,strcat(str1, str2); 其中str1和str2是两个字符串。 这个函数的功能是:将str2连接在str1之后,并在结束处添加一个字符串结束符0。str1要足够大。,P106 例11:根据用户的选择输出相应的字符串。,#include #include main( ) char str180 = This is a ; char str2 = program.; char str3 = Java; char str4 = Pascal; char str5 = C; char str6 = C+; int choice;

28、printf(n = MENU =n); /* 菜单 */ printf(n Java . . 1); printf(n Pascal . 2); printf(n C . . 3); printf(n C+ . 4); printf(n choice:); scanf(%d, /* 用户做出选择 */,程序代码,该程序将显示一个简易的菜单,根据用户的选择,拼接不同的字符串显示输出。,switch (choice) /* 根据用户的选择拼接字符串 */ case 1: strcat(str1, str3); strcat(str1, str2); break; case 2: strcat(s

29、tr1, str4); strcat(str1, str2); break; case 3: strcat(str1, str5); strcat(str1, str2); break; case 4: strcat(str1, str6); strcat(str1, str2); break; default: strcpy(str1, Error); break; printf(n%s, str1); /* 显示字符串 */ ,8. 求子串,strstr(str1, str2);其中str1是主串,str2是子串。如果在主串str1中存在子串str2,函数将返回子串str2在主串中第一次出

30、现的、第一个字符的存储位置;否则返回空。功能:检测在主串中是否存在给定子串。,9. 确定某个字符在字符串中出现的位置,strchr(str1, ch); 其中str1是一个给定的字符串,ch 是所要查找的字符。如果在str1中存在字符ch,函数返回ch在字符串str1中第一次出现的存储位置;否则返回空。,例:char str =“1236.87”;strchr(str, .)-str+1的值为5,#include #include #include main( ) int i; char text1000; gets(text); /* 输入文本内容 */ for (i=0; texti!=0; i+) if (isalnum(texti) texti = texti+5; /* 变换 */ puts(text); for (i=0; texti!=0; i+) if (isalnum(texti) texti = texti-5; /* 还原 */ puts(text); ,程序代码,P108 例12:文本变换 。,4.5 二维数组,二维数组的定义 定义格式: ; 例如: int value54; value数组的每个元素类型为int,包含5行4列共20个元素 一旦定义了一个二维数组型变量,系统就会立即

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论