数据的组织结构_第1页
数据的组织结构_第2页
数据的组织结构_第3页
数据的组织结构_第4页
数据的组织结构_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

第4章数据的组织结构(一)

4.3字符串的组织

4.2利用一维数组组织数据的应用实例

4.1数组类型

4.4常用的字符串标准函数及应用实例

4.5二维数组

课前复习前三章数据类型----数据结构的一种方式

学习新的数据的组织形式----数据结构的另一种方式4.1数组类型数组类型的应用背景(1)同时存在若干个用来描述同一性质且不同个体的数据。(2)只有将这些数据组织在一起形成批量数据,共同参与处理,很多操作才具有实际意义。例如:在某个部门中,需要由全体职工推选一名办公室主任。假设有10名候选人准备参与竞选。希望编写一个程序,统计每个候选人的得票数量及选举结果。一维数组类型的定义

定义格式:<元素类型><数组变量名>[<元素数量>];例如:intvote[10];C语言规定:数组的下标从0开始,因此,表示这10个数据的下标为0~9

变量一经定义,系统就要为它分配相应的存储空间。在C程序中,系统将会为每个数组型变量分配一片连续的存储空间,所需要分配的存储空间总数将取决于包含的元素个数和每个元素需要的存储空间。

一维数组的初始化基本格式为:<元素类型><数组变量名>[<元素数量>]={<元素初值1>,<元素初值2>,......,<元素初值n>};例如:floatscore[5]={9.2,9.1,8.7,9.1,8.5};

说明:1)为数组型变量中的每一个元素都提供了一个初始值。此时,可以省略方括号内的数组元素数量。系统将根据花括号中包含的初值数目推测出数组含有的元素数量。

floatscore[]={9.2,9.1,8.7,9.1,8.5};2)对数组型变量的前面若干个元素赋予初值。此时可以使用下面这种书写形式:

intletter[26]={10,9,8,7};它的执行结果是:将10、9、8、7分别赋予letter数组中下标为0、1、2、3的元素,后面的所有元素赋予初值0。3)将数组型变量中的每一个元素赋予初值0。此时,可以使用下面这种简化的书写形式:

intvote[10]={0};一维数组元素的引用及基本操作数组元素的引用<数组变量名>[<下标表达式>]数组的赋值利用赋值语句为数组赋值for(i=0;i<10;i++){vote[i]=0;}调用标准输入函数为数组赋值for(i=0;i<13;i++){scanf(“%f”,&score[i]);}数组的输出

for(i=0;i<10;i++){printf(“%5d”,vote[i]);}按照条件对数据进行筛选

在遇到的许多问题中,经常需要从众多的数据中挑选出来满足一定条件的数据,这就是数据的筛选操作。在C程序中,参与筛选操作的批量数据可以采用一个一维数组型变量组织,筛选的条件用逻辑表达式表示。

4.2利用一维数组组织数据的应用实例例1:在某个公司中,计划由职工们推选一名办公室主任。假设有10名候选人准备参与竞选。希望编写一个程序,输入一组选举人的投票信息,统计每个候选人的得票数目及选举结果。

问题分析用一维数组记录每位候选人的得票数量。投票通过循环输入介于1~10之间的整型数值来模拟的。例如,输入3代表某个职工选举编码为3的候选人。

找出最多的得票数量之后,从所有的候选人中筛选出得票数量与最高得票数量相同的人。算法描述

#include<stdio.h>#defineNUM10/*候选选人人数*/main(){intvote[NUM]={0};intcode,i,winner;/*职工投投票*/printf("\nEnteryourselection<0end>:\n");do{scanf("%d",&code);if(code<0||code>NUM){/*检验输输入的编码是是否有效*/printf("\nInvalidvote.");}else{if(code!=0)vote[code-1]=vote[code-1]+1;/*累加票票数*/}}while(code!=0);程序代码/*输出选选票*/printf("\nTheamountofvotesis:");for(i=0;i<NUM;i++){printf("%4d",vote[i]);}/*计算最最高得票数量量*/winner=0;for(i=1;i<NUM;i++){if(vote[i]>vote[winner])winner=i;}/*输出得得票最高的所所有候选人*/printf("\nThewinner:");for(i=winner;i<NUM;i++){if(vote[i]==vote[winner])printf("%3d",i+1);}}根据需求对数数据进行统计计为了满足特定定的需要,对对一组数据的的某些特征进进行统计是一一项经常遇到到的基本操作作。例如,统统计一段文本本中某个字符符出现的频率率;统计学生生考试的平均均成绩等等都都属于统计操操作。统计操操作的结果往往往是通过对对所有数据进进行扫描、判判断或综合加加工得到的。。在C程序中,参与与统计操作的的批量数据可可以用一维数数组来组织,,具体统计过过程可以通过过逻辑判断、、累计、算术术运算等基本本操作手段实实现。例2:在一段段文本中,可可能会出现各各式各样的字字符。编写一一个程序,从从键盘读入一一行文本,完完成统计每个个英文字母出出现频率的操操作。问题分分析用一维维数组组构造造26个用用于记记录每每个字字母出出现次次数的的累加加器。。对于输输入的的文本本字符符,可可以在在读取取时检检查一一下是是否为为英文文字母母,而而不需需要将将其存存储起起来。。算法描描述#include<stdio.h>#defineNUM26main(){intletter[NUM]={0};charch;inti;printf("\nEntertextline\n");while((ch=getchar())!='\n'){if('A'<=ch&&ch<='Z'){/*检检测是是否为为大写写字母母*/letter[ch-'A']=letter[ch-'A']+1;}else{if('a'<=ch&&ch<='z')/*检检测测是是否否为为小小写写字字母母*/letter[ch-'a']=letter[ch-'a']+1;}}/*输出出每每个个英英文文字字母母出出现现的的次次数数*/for(i=0;i<NUM;i++){printf("\n\'%c\':%d",'A'+i,letter[i]);}}程序代码码例3:每每年中央央电视台台都要举举办青年年歌手大大奖赛。。假设有有13位位评委参参与评分分工作。。计算每每位歌手手最终得得分的方方法是::首先去去掉一个个最高分分和一个个最低分分,然后后计算剩剩余11个分数数的平均均值,所所得结果果就是选选手的最最终得分分。希望望编写一一个程序序,帮助助工作人人员计算算每个歌歌手的分分数。问题分析析用一维数数组存储储13位评委委给出的的分数寻找最高高分和最最低分计算剩余余11个个分数的的平均分分算法描述述#include<stdio.h>#defineNUM13main(){floatscore[NUM];*/inti,minValue,maxValue;floatsum;/*输输入13位评委委给出的的分数*/printf("\nEnter13score:");for(i=0;i<NUM;i++){scanf("%f",&score[i]);}程序代码码/*找找出最高高分、最最低分,,并同时时累加13个分分数的总总和*/minValue=score[0];maxValue=score[0];sum=score[0];for(i=1;i<NUM;i++){if(score[i]<minValue)minValue=score[i];if(score[i]>maxValue)maxValue=score[i];sum=sum+score[i];}/*计计算并输输出歌手手的最终终得分*/sum=(sum-minValue-maxValue)/(NUM-2);printf("\nFinalscoreis%6.2f",sum);}查找问题题所谓查找找是指根根据某个个给定的的条件,,在一组组数据中中搜索是是否存在在满足该该条件的的数据的的过程。。如果存存在,则则表示查查找成功功,给出出成功的的标志;;否则表表示查找找不成功功,给出出失败的的标志。。在程序序中,查查找操作作的结果果经常被被用来作作为是否否执行某某项后续续操作的的决策依依据。例4::已知知某个个班级级35名学学生的的某门门课程程的考考试成成绩。。请编编写一一个程程序,,查看看在这这个班班级中中是否否存在在不及及格的的学生生。问题分分析用一维维数组组记录录每位位学生生的考考试成成绩,,下标标表示示每个个学生生的编编号,,元素素内容容表示示考试试成绩绩。查找可可以通通过从从前往往后依依次查查看每每个元元素内内容的的过程程实现现。算法描描述#include<stdio.h>#include<stdlib.h>#defineNUM35/*学生生人数数*/main(){intscore[NUM];inti;/*随机机产生35个考试成成绩*/randomize();for(i=0;i<NUM;i++){score[i]=random(100);}/*显示35名学生生的考试成成绩*/for(i=0;i<NUM;i++){printf("\nNo.%d:%d",i+1,score[i]);}程序代码/*顺序查查找是否存存在不及格格的学生*/for(i=0;i<NUM;i++){if(score[i]<60)break;}/*输出查查找结果*/if(i<NUM)printf("\nNotallpass.");elseprintf("Allpass.");}例5:已知知一个按非非递减有序序排列的整整型数列((12,23,30,45,48,50,67,82,91,103)。。请编写一一个程序,,查找其中中是否存在在与给定key相等等的数值。。问题分析二分查找是是指每次用用key与位于查找找区间中央央位置的元元素进行比比较,比较较结果将会会产生下面面三种情形形之一:如果相等,,说明查找找成功。如果key小于中央位位置的元素素,说明如如果存在这这样的元素素,应该位位于查找区区间的前半半部分。此此时可以将将查找区间间缩减为原原来的一半半,并在这这一半的区区间中继续续用相同的的方式查找找。如果key大于中央位位置的元素素,说明如如果存在这这样的元素素,应该位位于查找区区间的后半半部分。同同样可以将将查找区间间缩减为原原来的一半半,并在这这一半的区区间中继续续用相同的的方式查找找。可以看出,,用key与当前查找找区间中央央位置的元元素比较后后,不是找找到了,就就是将查找找区间缩小小了一半。。直到查找找区间不存存在了,说说明没有要要找的key。算法描述#include<stdio.h>#defineNUM10main(){intvalue[NUM]={12,23,30,45,48,50,67,82,91,103};/*非递递减整型数数列*/intlow,high,mid,key;printf("\nEnterakey:");/*输入入查找的数数值*/scanf("%d",&key);low=0;high=NUM-1;while(low<=high){mid=(low+high)/2;if(value[mid]==key)break;if(value[mid]<key)low=mid+1;elsehigh=mid-1;}if(low<=high)printf("\n%disfoundat%d.",key,mid); /*确确认break出出口*/elseprintf("\n%disnotfound.",key);/*确认认循环正常常出口*/}程序代码排序问题将一组无序序的数列重重新排列成成非递减或或非递增的的顺序是一一种经常需需要的操作作。例如,,在管理学学生成绩的的应用程序序中,可以以用一个数数列表示一一个班级的的学生成绩绩,并按照照从高到低低的顺序重重新排列,,以便确定定获得奖学学金的学生生。例6::假假设设用用户户通通过过键键盘盘输输入入一一个个整整型型数数列列。。请请编编写写一一个个程程序序,,将将其其按按照照从从小小到到大大的的顺顺序序重重新新排排列列。。问题题分分析析首先先从从n个个数数据据中中选选择择一一个个最最小小的的数数据据,,并并将将它它交交换换到到第第1个个位位置置;;然然后后再再从从后后面面n-1个个数数据据中中选选择择一一个个最最小小的的数数据据,,并并将将它它交交换换到到第第2个个位位置置;;以以此此类类推推,,直直至至最最后后从从两两个个数数据据中中选选择择一一个个最最小小的的数数据据,,并并将将它它交交换换到到第第n-1个个位位置置为为止止,,整整个个排排序序操操作作结结束束。。算法描述#include<stdio.h>#defineNUM10/*参参与排序的数数据个数*/main(){intdata[NUM];/*存放放参与排序的的所有整数*/inti,j,minValue,temp;/*通通过过键盘盘输入入待排排序的的整型型数列列*/printf("\nEnter%dintegers.",NUM);for(i=0;i<NUM;i++){scanf("%d",&data[i]);}/*显显示示原始始整型型数列列*/printf("\n%dintegersare:",NUM);for(i=0;i<NUM;i++){printf("%5d",data[i]);}程序代代码for(i=0;i<NUM-1;i++){minValue=i;for(j=i+1;j<NUM;j++){if(data[j]<data[minValue])minValue=j;}if(minValue!=i){/*交交换换*/temp=data[i];data[i]=data[minValue];data[minValue]=temp;}}/*输输出出排序序后的的结果果*/printf("\nOrderinglistis:\n");for(i=0;i<NUM;i++){printf("%5d",data[i]);}}小结与与作业业一维数数组的的定义义、初初始化化、赋赋值、、引用用一维数数组的的应用用课后作作业9、静夜夜四无无邻,,荒居居旧业业贫。。。12月月-2212月月-22Saturday,December24,202210、雨中黄叶叶树,灯下下白头人。。。05:52:2805:52:2805:5212/24/20225:52:28AM11、以我独沈久久,愧君相见见频。。12月-2205:52:2805:52Dec-2224-Dec-2212、故人江海别别,几度隔山山川。。05:52:2805:52:2805:52Saturday,December24,202213、乍乍见见翻翻疑疑梦梦,,相相悲悲各各问问年年。。。。12月月-2212月月-2205:52:2805:52:28December24,202214、他乡生生白发,,旧国见见青山。。。24十十二月20225:52:28上午午05:52:2812月-2215、比不了得就就不比,得不不到的就不要要。。。十二月225:52上上午12月-2205:52December24,202216、行动出成果果,工作出财财富。。2022/12/245:52:2805:52:2824December202217、做前,能够够环视四周;;做时,你只只能或者最好好沿着以脚为为起点的射线线向前。。5:52:28上午5:52上上午05:52:2812月-229、没没有有失失败败,,只只有有暂暂时时停停止止成成功功!!。。12月月-2212月月-22Saturday,December24,202210、很很多多事事情情努努力力了了未未必必有有结结果果,,但但是是不不努努力力却却什什么么改改变变也也没没有有。。。。05:52:2805:52:2805:5212/24/20225:52:28AM11、成功功就是是日复复一日日那一一点点点小小小努力力的积积累。。。12月月-2205:52:2805:52Dec-2224-Dec-2212、世间间成事事,不不求其其绝对对圆满满,留留一份份不足足,可可得无无限完完美。。。05:52:2805:52:2805:52Saturday,December24,202213、不知香积积寺,数里里入云峰。。。12月-2212月-2205:52:2805:52:28December24,202214、意志坚强的的人能把世界界放在手中像像泥块一样任任意揉捏。24十二月月20225:52:28上午05:52:2812月-2215、楚塞三湘接接,荆门九派派通。。。十二月225:52上上午12月-2205:52December24,202216、少年年十五五二十十时,,步行行夺得得胡马马骑。。。2022/12/245:52:2805:52:2824December202217、空山山新雨

温馨提示

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

评论

0/150

提交评论