实验六 动态组织数据.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验六 动态组织数据

实验六 动态组织数据 一、目的和要求 1. 掌握动态组织数据的概念; 2. 掌握动态申请存储空间的相关函数的使用; 3. 掌握动态数组的建立方法; 4. 掌握动态链表的基本操作; 5. 进一步掌握文件的操作。 二、重点与难点 重点:动态申请存储空间,动态数组的建立,建立有序的动态链表,文件的操作。 难点:建立有序的动态链表。 三、实验内容 1. 编写一个程序,将二制文件“student.dat”中的数据,按成绩从高到低排序并输出。其中,文件中的数据包含了众多学生的信息,包括:学号、姓名、成绩。其结构如下: struct student{ char id[11]; char name[21]; int score; }; 在做实验时需要事先生成包含学生成绩的二进制文件,可以单独编写相应的程序,要求输出排序后的数据有如下形式: id name score 2013011001 Wangxiaotang 95 2013011030 FangMin 70 2013011101 Zuzhong 85 …… 本实验要点: (1)问题分析:本实验涉及两个关键问题:一是二制数据的读入;二是数据排序。 从文件中读入结构化的二进制数据,可以使用fread()函数。对数据排序,可以将所有数据存储在数组中,并采用熟悉的算法排序。但这里的关键的问题是:之前不知道文件中的数据个数,因此无法确定数组的大小。此处采用动态分配空间的方式使用动态数组。但还是需要计算文件中数据的个数。这里可采用两种方法来统计个数: 方法一是先将所有数据读出,以统计出个数; 方法二是利用函数fseek()和ftell()计算出个数。 (2)实现要点 ①二进制文件数据的读写与处理 先以二进制文件读方式 “rb”打开文件。由于需要知道记录的个数并申请动态数组空间, 可以采用以下两中方法: 方法一:循环中用fread()读出每一条记录统计人数,再根据人数精确地分配存储数据的存储空间,然后使用rewind()函数将文件指针移到文件首,再次读出数据放入动态分配的存储空间内。最后对这些读出的数据进行处理。 方法二:先使用fseek()控制文件指针到文件尾,再利用ftell()获得相对于文件开关的字节数,然后通过计算获得文件内存储的人数,然后使用rewind()函数将文件指针移到文件首,再次读出数据放入动态分配的存储空间内。最后对这些读出的数据进行处理。 ②排序函数的定义、参数传递、调用。 可定义函数 void sort(struct student *p , int n),实现以p为首地址的连续n条记录(结构体变量),按结构分量score排序。在主函数中,调用sort(p,n),将存储空间首地址实参p和人数n传给对应的形参。 ③基本算法描述 (3)实验参考程序 #include stdio.h #include stdlib.h #include string.h typedef struct student { char id[11]; char name[12]; int score; }STU; void main() { STU st,*p; FILE *fp; int i,n=0; void sort(STU *p , int n); void input(); input(); if((fp = fopen(student.dat,rb))==NULL) { printf(Cant open file!\n); exit(0); } //读出数据统计人数 while(!feof(fp)) { fread(st,sizeof(STU),1,fp); n++; } n--; //c程序自动将最后一个学生的数据重复读出一次 p= (STU *)malloc(n*sizeof(STU)); //根据读到的人数动态分配存储单元 rewind(fp); fread(p,sizeof(STU),n,fp); // 将n个学生数据存储在以p为首地址的存储单元 fclose(fp); sort(p,n); printf(%6s%13s%15s\n,id,name,socre); for(i=0;in;i++) printf(% -12s% -20s%d\n,p[i].id,p[i].name,p[i].score); } void sort(STU *p , int n) { int i,j; STU stu; for(i=1;in;i++) { for(j=0; jn-i; j++) if( p[j].score p[j+1].score ) { s

文档评论(0)

f8r9t5c + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档