- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)