《数据的组织结构.ppt》由会员分享,可在线阅读,更多相关《数据的组织结构.ppt(59页珍藏版)》请在课桌文档上搜索。
1、整理课件,1,第4章 数据的组织结构(一),4.3 字符串的组织,4.2 利用一维数组组织数据的应用实例,4.1 数组类型,4.4 常用的字符串标准函数及应用实例,4.5 二维数组,整理课件,2,4.1 数组类型,数组类型的应用背景(1)同时存在若干个用来描述同一性质且不同个体的数据(同质数据)。(2)只有将这些数据组织在一起形成批量数据,共同参与处理,很多操作才具有实际意义。例如:在某个部门中,需要由全体职工推选一名办公室主任。假设有10名候选人准备参与竞选。希望编写一个程序,统计每个候选人的得票数量及选举结果。,整理课件,3,一维数组类型的定义 定义格式:;例如:int vote10;C语
2、言规定:数组的下标从0开始,因此,表示这10个数据的下标为09 变量一经定义,系统就要为它分配相应的存储空间。在C程序中,系统将会为每个数组型变量分配一片连续的存储空间,所需要分配的存储空间总数将取决于包含的元素个数和每个元素需要的存储空间。,整理课件,4,一维数组的初始化基本格式为:=,.,;例如:float score5=9.2,9.1,8.7,9.1,8.5;,整理课件,5,说明:1)为数组型变量中的每一个元素都提供了一个初始值。此时,可以省略方括号内的数组元素数量。系统将根据花括号中包含的初值数目推测出数组含有的元素数量。float score=9.2,9.1,8.7,9.1,8.5;
3、2)对数组型变量的前面若干个元素赋予初值。此时可以使用下面这种书写形式:int letter26=10,9,8,7;它的执行结果是:将10、9、8、7分别赋予letter数组中下标为0、1、2、3的元素,后面的所有元素赋予初值0。3)将数组型变量中的每一个元素赋予初值0。此时,可以使用下面这种简化的书写形式:int vote10=0;,整理课件,6,一维数组元素的引用及基本操作数组元素的引用 数组的赋值利用赋值语句为数组赋值 for(i=0;i10;i+)votei=0;调用标准输入函数为数组赋值 for(i=0;i13;i+)scanf(“%f”,整理课件,7,按照条件对数据进行筛选 在遇到
4、的许多问题中,经常需要从众多的数据中挑选出来满足一定条件的数据,这就是数据的筛选操作。在C程序中,参与筛选操作的批量数据可以采用一个一维数组型变量组织,筛选的条件用逻辑表达式表示。,4.2 利用一维数组组织数据的应用实例,整理课件,8,例1:在某个公司中,计划由职工们推选一名办公室主任。假设有10名候选人准备参与竞选。希望编写一个程序,输入一组选举人的投票信息,统计每个候选人的得票数目及选举结果。,问题分析用一维数组记录每位候选人的得票数量。投票通过循环输入介于110之间的整型数值来模拟的。例如,输入3代表某个职工选举编码为3的候选人。找出最多的得票数量之后,从所有的候选人中筛选出得票数量与最
5、高得票数量相同的人。,整理课件,9,算法描述,整理课件,10,#include#define NUM 10/*候选人人数*/main()int voteNUM=0;int code,i,winner;/*职工投票*/printf(nEnter your selection:n);do scanf(%d,程序代码,整理课件,11,/*输出选票*/printf(n The amount of votes is:);for(i=0;ivotewinner)winner=i;/*输出得票最高的所有候选人*/printf(nThe winner:);for(i=winner;iNUM;i+)if(vot
6、ei=votewinner)printf(%3d,i+1);,整理课件,12,根据需求对数据进行统计 为了满足特定的需要,对一组数据的某些特征进行统计是一项经常遇到的基本操作。例如,统计一段文本中某个字符出现的频率;统计学生考试的平均成绩等等都属于统计操作。统计操作的结果往往是通过对所有数据进行扫描、判断或综合加工得到的。在C程序中,参与统计操作的批量数据可以用一维数组来组织,具体统计过程可以通过逻辑判断、累计、算术运算等基本操作手段实现。,整理课件,13,例2:在一段文本中,可能会出现各式各样的字符。编写一个程序,从键盘读入一行文本,完成统计每个英文字母出现频率的操作。,问题分析用一维数组构
7、造26个用于记录每个字母出现次数的累加器。对于输入的文本字符,可以在读取时检查一下是否为英文字母,而不需要将其存储起来。,整理课件,14,算法描述,整理课件,15,#include#define NUM 26 main()int letterNUM=0;char ch;int i;printf(nEnter text linen);while(ch=getchar()!=n)if(A=ch,程序代码,整理课件,16,例3:每年中央电视台都要举办青年歌手大奖赛。假设有13位评委参与评分工作。计算每位歌手最终得分的方法是:首先去掉一个最高分和一个最低分,然后计算剩余11个分数的平均值,所得结果就是
8、选手的最终得分。希望编写一个程序,帮助工作人员计算每个歌手的分数。,问题分析用一维数组存储 13位评委给出的分数寻找最高分和最低分计算剩余11个分数的平均分,整理课件,17,算法描述,整理课件,18,#include#define NUM 13 main()float scoreNUM;*/int i,minValue,maxValue;float sum;/*输入13位评委给出的分数*/printf(nEnter 13 score:);for(i=0;iNUM;i+)scanf(%f,程序代码,整理课件,19,/*找出最高分、最低分,并同时累加13个分数的总和*/minValue=score
9、0;maxValue=score0;sum=score0;for(i=1;imaxValue)maxValue=scorei;sum=sum+scorei;/*计算并输出歌手的最终得分*/sum=(sum-minValue-maxValue)/(NUM-2);printf(nFinal score is%6.2f,sum);,整理课件,20,查找问题 所谓查找是指根据某个给定的条件,在一组数据中搜索是否存在满足该条件的数据的过程。如果存在,则表示查找成功,给出成功的标志;否则表示查找不成功,给出失败的标志。在程序中,查找操作的结果经常被用来作为是否执行某项后续操作的决策依据。,整理课件,21,
10、例4:已知某个班级35名学生的某门课程的考试成绩。请编写一个程序,查看在这个班级中是否存在不及格的学生。,问题分析用一维数组记录每位学生的考试成绩,下标表示每个学生的编号,元素内容表示考试成绩。查找可以通过从前往后依次查看每个元素内容的过程实现。,整理课件,22,算法描述,整理课件,23,#include#include#define NUM 35/*学生人数*/main()int scoreNUM;int i;/*随机产生35个考试成绩*/randomize();for(i=0;iNUM;i+)scorei=random(100);/*显示35名学生的考试成绩*/for(i=0;iNUM;i
11、+)printf(nNo.%d:%d,i+1,scorei);,程序代码,整理课件,24,/*顺序查找是否存在不及格的学生*/for(i=0;iNUM;i+)if(scorei60)break;/*输出查找结果*/if(iNUM)printf(nNot all pass.);else printf(All pass.);,整理课件,25,例5:已知一个按非递减有序排列的整型数列(12,23,30,45,48,50,67,82,91,103)。请编写一个程序,查找其中是否存在与给定key相等的数值。,问题分析二分查找是指每次用key与位于查找区间中央位置的元素进行比较,比较结果将会产生下面三种情
12、形之一:如果相等,说明查找成功。如果key小于中央位置的元素,说明如果存在这样的元素,应该位于查找区间的前半部分。此时可以将查找区间缩减为原来的一半,并在这一半的区间中继续用相同的方式查找。如果key大于中央位置的元素,说明如果存在这样的元素,应该位于查找区间的后半部分。同样可以将查找区间缩减为原来的一半,并在这一半的区间中继续用相同的方式查找。可以看出,用key与当前查找区间中央位置的元素比较后,不是找到了,就是将查找区间缩小了一半。直到查找区间不存在了,说明没有要找的key。,整理课件,26,算法描述,整理课件,27,整理课件,28,#include#define NUM 10main()
13、int valueNUM=12,23,30,45,48,50,67,82,91,103;/*非递减整型数列*/int low,high,mid,key;printf(nEnter a key:);/*输入查找的数值*/scanf(%d,/*确认循环正常出口*/,程序代码,整理课件,29,用递归函数实现二分查找,int search(int value,int key,int low,int high)/*二分查找的递归函数*/int mid;if(lowhigh)return-1;/*查找区间为空*/mid=(low+high)/2;/*求中间位置*/if(valuemid=key)retur
14、n mid;/*得到查找的数据位置*/if(keyvaluemid)return search(value,key,low,mid-1);/*在下半区查找*/else return search(value,key,mid+1,high);/*在上半区查找*/,整理课件,30,排序问题 将一组无序的数列重新排列成非递减或非递增的顺序是一种经常需要的操作。例如,在管理学生成绩的应用程序中,可以用一个数列表示一个班级的学生成绩,并按照从高到低的顺序重新排列,以便确定获得奖学金的学生。,整理课件,31,例6:假设用户通过键盘输入一个整型数列。请编写一个程序,将其按照从小到大的顺序重新排列。,问题分析
15、首先从n个数据中选择一个最小的数据,并将它交换到第1个位置;然后再从后面n-1个数据中选择一个最小的数据,并将它交换到第2个位置;以此类推,直至最后从两个数据中选择一个最小的数据,并将它交换到第n-1个位置为止,整个排序操作结束。,整理课件,32,算法描述,整理课件,33,#include#define NUM 10/*参与排序的数据个数*/main()int dataNUM;/*存放参与排序的所有整数*/int i,j,minValue,temp;/*通过键盘输入待排序的整型数列*/printf(nEnter%d integers.,NUM);for(i=0;iNUM;i+)scanf(%d
16、,程序代码,整理课件,34,for(i=0;iNUM-1;i+)minValue=i;for(j=i+1;jNUM;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);,整理课件,35,字符串的组织形式 字符串是指一个有限长度的字符序列,字符串常量用一对双引号(“”)括起来。字符串中所包含的字符
17、个数被称为字符串长度。,4.3 字符串的组织,整理课件,36,字符串的初始化char str=“C program”;char str=C,p,r,o,g,r,a,m,0;对于这种初始化形式,系统将其视为字符操作,而不是字符串操作,因此不会在尾部添加结束符0。“C program”的存储状态,整理课件,37,字符串的输入输出 1、gets(str);2、scanf(“%s”,str);gets()函数以换行符或文件结束符EOF作为输入的结束标志,因此在输入的字符串中允许包含空格和制表符;而scanf()函数则以空格、制表符、换行符和文件结束符EOF作为输入的结束标志,因此,在输入的字符串中不允
18、许包含这些字符。如果包含了它们,将作为字符串输入的结束标志处理。,整理课件,38,字符串的输出 1、puts(str);2、printf(%s”,str);puts将字符串的内容显示到标准输出设备屏幕上,并换行。,整理课件,39,字符串标准函数 在C语言的标准函数库中,提供了30余种与字符串处理有关的标准函数,从而大大地提高了字符串处理的能力,降低了字符串处理的复杂程度。,4.4 常用的字符串标准函数及应用实例,整理课件,40,字符串转换成数值类型 atof(str);atoi(str);atol(str);其中str是一个字符串。atof()的返回类型是double,它可以将字符串str转换
19、成一个双精度数值;atoi()的返回类型是int,它可以将字符串str转换成普通整型;atol()的返回类型是long,它可以将字符串str转换成长整型(long)。,例7:将用户以字符串形式输入的两个实型数值转换成double类型,并显示输出这两个实型数值及它们相加的结果。,整理课件,41,#include#include main()char num120,num220;double d1,d2,sum;printf(nEnter the first number:);gets(num1);/*输入第1个用字符串表示的实型数值*/printf(Enter ths second number
20、:);gets(num2);/*输入第2个用字符串表示的实型数值*/d1=atof(num1);/*将第1个字符串转换成double类型*/d2=atof(num2);/*将第2个字符串转换成double类型*/sum=d1+d2;/*将2个double类型数值相加*/printf(n%s+%s=%.3lf,num1,num2,sum);/*显示结果*/,程序代码,整理课件,42,数值类型转换成字符串 itoa(num,str,radix);ltoa(num,str,radix);其中str用于存放结果的字符串,radix是用户指定的进制数,它的取值必须介于236之间。在itoa()函数中的n
21、um是一个int类型的数值;在ltoa()函数中的num是一个long类型的数值。,例8:将用户输入的长整型(long类型)数值转换成以字符串形式表示的十六进制、八进制和二进制数值,并显示输出。,整理课件,43,#include#include main()char str33;long value;printf(nEnter a long number:);scanf(%ld,程序代码,整理课件,44,大小写转换 strlwr(str);strupr(str);str是一个字符串。标准函数strlwr()可以将字符串str中出现的所有大写字母转换成小写字母;标准函数strupr()可以将字符
22、串str中出现的所有小写字母转换成大写字母。,例9:统计一段文本中每个英文字母出现的次数。,整理课件,45,#include#include#include#define NUM 26main()int letterNUM=0;/*用于存放统计结果的一维数组*/char str80;/*存放以字符串形式输入的文本*/int i;printf(nEnter a text line);gets(str);/*输入文本*/strupr(str);/*将文本中的所有小写字母转换成大写字母*/for(i=0;stri!=0;i+)/*统计每个字母出现的次数*/if(isalpha(stri)/*isal
23、pha函数判断是否英文字母*/letterstri-A=letterstri-A+1;for(i=0;iNUM;i+)/*输出统计结果*/printf(n%c:%d,A+i,letteri);,程序代码,整理课件,46,计算字符串长度 strlen(str);这个函数的功能是返回字符串中所包含的字符个数,即字符串长度。字符串结束标志0不计算在内。字符串比较 strcmp(str1,str2);两个字符串进行比较时将依据每个字符对应的ASCII编码决定其大小。,例10:假设用户的密码是“administrators”,下面这个程序将用于检测用户输入的密码是否正确。如果不正确,给出相应的提示信息,
24、并请求用户重新输入。,整理课件,47,#include#include main()char password20;/*存放用户输入的密码*/printf(nEnter password:);gets(password);/*输入密码*/*检测用户输入的密码,如果不正确,给出提示,并请求重新输入*/while(strcmp(password,administrators)!=0)printf(nInvalid passwordnn);printf(Enter password,again:);gets(password);printf(OK);/*输入正确,显示OK*/,程序代码,整理课件,4
25、8,字符串拷贝 strcpy(str1,str2);其中str2是将要被拷贝的字符串,str1是用于存放拷贝结果的存储区域。字符串连接 strcat(str1,str2);其中str1和str2是两个字符串。这个函数的功能是:将str2连接在str1之后,并在结束处添加一个字符串结束符0,例11:根据用户的选择输出相应的字符串。,整理课件,49,#include#include main()char str180=This is a;char str2=program.;char str3=Java;char str4=Pascal;char str5=C;char str6=C+;int c
26、hoice;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,/*用户做出选择*/,程序代码,整理课件,50,switch(choice)/*根据用户的选择拼接字符串*/case 1:strcat(str1,str3);strcat(str1,str2);break;case 2:strcat(str1,str4);strcat(str1,str2);break;case 3:strcat(str1,str5);st
27、rcat(str1,str2);break;case 4:strcat(str1,str6);strcat(str1,str2);break;default:strcpy(str1,Error);break;printf(n%s,str1);/*显示字符串*/,整理课件,51,求子串 strstr(str1,str2);其中str1是主串,str2是子串。如果在主串str1中存在子串str2,函数将返回子串str2在主串中第一次出现的、第一个字符的存储位置;否则返回空。确定某个字符在字符串中出现的位置 strchr(str1,ch);其中str1是一个给定的字符串,ch 是所要查找的字符。如果
28、在str1中存在字符ch,函数返回ch在字符串str1中第一次出现的存储位置;否则返回空。,例12:文本变换。,整理课件,52,#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);,程序代码,整理课件,53,4.5 二维数组,二维数组的
29、定义 定义格式:;例如:int value54;value数组的每个元素类型为int,包含5行4列共20个元素 一旦定义了一个二维数组型变量,系统就会立即为其分配相应的存储空间用于存放数组中的每个元素。存储空间的数量取决于数组元素的类型和所定义的行数、列数,即存储空间数量=每个元素所占用的字节数量行数列数,并按照行列顺序依次排列。,整理课件,54,二维数组的初始化int a43=12,11,10,9,8,7,6,5,4,3,2,1;int a43=12,11,10,9,8,7,6,5,4,3,2,1;int a3=12,11,10,9,8,7,6,5,4,3,2,1;如果只对二维数组变量中的部
30、分元素进行初始化,可以使用下面两种形式。int array143=,1,1,2,1,2,3;int array243=10,9,8,7,6,5;,整理课件,55,二维数组元素的引用及基本操作数组元素的引用 数组的赋值 for(i=0;iROWS;i+)for(j=0;jCOLS;j+)valueij=i+j;数组的输入 for(i=0;iROWS;i+)for(j=0;jCOLS;j+)scanf(“%d”,整理课件,56,二维数组的应用实例,例13:判断给定方阵是否为对称矩阵。,问题分析对于一个给定的NN矩阵array,如果矩阵中的每个元素都满足arrayij=arrayji,则称这个矩阵为
31、对称矩阵。在判断一个给定的矩阵是否为对称矩阵时,只需要用下三角部分的每个元素与对应的上三角元素进行比较。如果每一对元素都相等,这个矩阵就是对称矩阵,否则,就是非对称矩阵。,整理课件,57,算法描述,整理课件,58,#include#define NUM 5 矩阵行列数main()int mNUMNUM;/*定义二维数组变量*/int i,j;/*输入矩阵*/printf(Enter%d rows%d cols datas for the maxtrix:n,NUM,NUM);for(i=0;iNUM;i+)for(j=0;jNUM;j+)scanf(%d,程序代码,整理课件,59,/*判断矩阵是否对称并输出相应的结果*/for(i=0;iNUM;i+)for(j=0;ji;j+)if(mij!=mji)printf(nThe matrix isnt symmetrical.);return 0;printf(nThe matrix is symmetrical.);,
链接地址:https://www.desk33.com/p-229762.html