实验八结构体和文件操作(4学时)
目的要求
(1)掌握结构体类型变量的定义和使用;
(2)掌握结构体类型数组的概念和使用;
(3)掌握链表的概念,初步学会对链表进行操作;
(4)掌握文件以及缓冲文件系统、文件指针的概念;
(5)学会使用文件打开、关闭、读、写等文件操作函数;
(6)学会用缓冲文件系统对文件进行简单的操作。
上机内容
一般示例
【例1】上机运行程序,观察运行结果。
#include <stdio.h>
structst
{ int x;
int *y;
} *p;
int s[]={10,20,30,40};
struct st a[]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]};
void main( )
{
p=a;
printf(“%d\n”,p->x);
printf(“%d\n”,(++p)->x);
printf(“%d\n”,*(++p)->y);
printf(“%d\n”,++(*(++p)->y));
}
【例2】试利用结构体类型编写程序,有5个职工的姓名、基本工资和补贴,计算每个职工实发工资并输出。
#include <stdio.h>
void main( )
{
int i;
/*结构体类型struct worker 的定义,其成员有姓名、基本工资、补贴和实发工资*/
struct worker s[5]={{“li”,2000,120},{“ma”,2020,45},
{“lin”,3211,234},{“wang”,4567,900},{“deng”,6467,861}};
for i=0;i<5;i++)
/*计算每个人的实发工资*/
for(i=0;i<5;i++)
/*用printf()语句输出每个人的姓名和实发工资*/
}
【思考】
a.改写程序,利用循环语句从键盘逐个输入数据,给struct worker 类型的数组元素赋值。
b.重新编写程序,增加相应的变量,将所有人的基本工资、补贴和实发工资分别累加起来,并输出。
【例3】下面的程序对data.dat文件写入10条记录。通过此题,请总结文件操作的一般规律。
#include <stdio.h>
void main()
{
FILE *fp;
int i;
float x;
fp = fopen(date.dat,w);
for(i = 1;i <= 10;i ++)
{
scanf(%f,&x);
fprintf(fp,%f\n,x);
}
fclose(fp);
}
编程作业
下面的作业均要求画出程序流程图和写出源程序代码。并在电脑上运行通过。
1.定义一个结构体类型,包含用户的姓名(含6个字符的字符串)和电话号码(含8个字符的字符串)。编写函数getUser用于读入n位用户的数据到结构体数组中;编写函数sortUser用于将数组中的用户按姓名的字母顺序重新排列;编写函数outUser用于输出数据。
部分程序如下,请完善程序。
#include “stdio.h”
#include “string.h”
#define N 5
struct User
{
char name[7],tel[9];
};
/*以下是getUser函数*/
/*以下是sortUser函数*/
/*以下是outUser函数*/
void main( )
{
struct User user[N];
getUser(user,N);
sortUser(user,N);
outUser(user,N);
}
2.建立一个链表,每个结点包括的成员为:职工号、工资。用一个creat()函数来建立链表,用list()函数来输出数据。5个职工号为101,103,105,107,109。在此基础上,新增加一个职工的数据,按职工号的顺序插入链表,新插入的职工号为106。写一函数insert来插入新结点。然后再写一函数delete,用来删除一个结点。要求删除职工号为103的结点。打印出删除后的链表。
3.用记事本软件建立一个名为“d1.txt”的文本文件存入磁盘,文件中有18个数。请你编写一个程序,你的程序能从磁盘上读入该文件,并用文件中的前9个数和后9个数分别作为两个3*3矩阵的元素。求这两个矩阵的和,并把结果按每行3个数据写入文本文件“d2.txt”。你可以用DOS命令TYPE显示“d2.txt”文件中的内容。
选做题
1.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。(习题11.11)
2.学生成绩单制作
(1)定义一个结构体数组,存放10个学生的学号,姓名,三门课的成绩
(2)从键盘输入10个学生的以上内容
(3)输出单门课成绩最高的学生的学号、姓名、以及该门课程的成绩
(4)输出三门课程的平均分数最高的学生的学号、姓名及其平均分
(5)将10个学生按照平均分数从高到低进行排序,输出结果,格式如下所示:
numbernamemathChineseEnglishaverage
103tom909010095
101alice90807080
3.学生成绩文件管理
(1)定义一个结构体数组,存放10个学生的学号,姓名,三门课的成绩
(2)从键盘输入10个学生的以上内容,存入文件stud.dat,关闭文件
(3)打开stud.dat文件,将数据读出,查看是否正确写入,关闭文件。
(4)打开文件stud.dat文件,读出数据,将10个学生按照平均分数从高到低进行排序,
(5)分别将结果输出到屏幕上和另一文件studsort.dat中。
(6)从studsort.dat 文件中读取第2,4,6,8,10个学生的数据。