数据结构实践——操作文件

本文是针对[数据结构基础系列(11):文件]中的实践项目。

【项目1】操作文件

有若干学生的成绩数据如下,将这些数据保存到st数组中:

  学号     姓名   年龄  性别  语文 数学 英语
    1      陈华    20   男   78   90   84
    5      张明    21   男   78   68   92
    8      王英    20   女   86   81   86
    3      刘丽    21   女   78   92   88
    2      许可    20   男   80   83   78
    4      陈军    20   男   78   88   82
    7      马胜    21   男   56   67   75

基于这些数据,编程序实现下面的功能:

(1)将st数组中学生记录写入stud.dat文件

(2)将stud.dat文件中学生记录读入到st数组中

(3)显示st数组中的学生记录

(4)求学生的平均分并放在st1数组中

(5)对st1数组按平均分递减排序

(6)将st1数组中学生记录写入stud1.dat文件

(7)将stud1.dat文件中学生记录读入到st1数组中

(8)显示st1数组中的学生记录

[参考解答]

#include <stdio.h>
#include <string.h>
#define N 10                //最多学生人数
typedef struct
{
    int no;                 //学号
    char name[10];          //姓名
    int age;                //年龄
    char sex[3];            //性别
    int deg1,deg2,deg3;     //课程1-课程3成绩
} StudType;
typedef struct
{
    int no;                 //学号
    char name[10];          //姓名
    int age;                //年龄
    char sex[2];            //性别
    int deg1,deg2,deg3;     //课程1-课程3成绩
    double avg;             //平均分
} StudType1;
void WriteFile(StudType st[],int n)     //将st数组中的学生记录写入到stud.dat文件中
{
    int i;
    FILE *fp;
    if ((fp=fopen("stud.dat","wb"))==NULL)
    {
        printf("\t提示:不能创建stud.dat文件\n");
        return;
    }
    for (i=0; i<n; i++)
        fwrite(&st[i],1,sizeof(StudType),fp);
    fclose(fp);
    printf("\t提示:文件stud.dat创建完毕\n");
}
void WriteFile1(StudType1 st1[],int n)  //将st1数组中的学生记录写入到stud1.dat文件中
{
    int i;
    FILE *fp;
    if ((fp=fopen("stud1.dat","wb"))==NULL)
    {
        printf("\t提示:不能创建stud1.dat文件\n");
        return;
    }
    for (i=0; i<n; i++)
        fwrite(&st1[i],1,sizeof(StudType),fp);
    fclose(fp);
    printf("\t提示:文件stud1.dat创建完毕\n");
}
void ReadFile(StudType st[],int &n)     //将stud.dat文件中的n个学生记录读入到st数组中
{
    FILE *fp;
    if ((fp=fopen("stud.dat","rb"))==NULL)
    {
        printf("\t提示:不能打开stud.dat文件\n");
        return;
    }
    n=0;
    while (fread(&st[n],sizeof(StudType),1,fp)==1)
        n++;
    printf("\t提示:文件stud.dat读取完毕\n");
}
void ReadFile1(StudType1 st1[],int &n)  //将stud1.dat文件中的n个学生记录读入到st1数组中
{
    FILE *fp;
    if ((fp=fopen("stud1.dat","rb"))==NULL)
    {
        printf("\t提示:不能打开stud1.dat文件\n");
        return;
    }
    n=0;
    while (fread(&st1[n],sizeof(StudType),1,fp)==1)
        n++;
    printf("\t提示:文件stud1.dat读取完毕\n");
}
void Display(StudType st[],int n)   //显示学生记录
{
    int i;
    printf("                ----学生成绩表----\n");
    printf("  学号     姓名   年龄 性别 语文 数学 英语\n");
    for (i=0; i<n; i++)
        printf("%5d%10s%6d%5s%5d%5d%5d\n",st[i].no,st[i].name,st[i].age,st[i].sex,st[i].deg1,st[i].deg2,st[i].deg3);
    printf("\n");
}
void Display1(StudType1 st1[],int n)    //显示求平均分后的学生记录
{
    int i;
    printf("                ----排序后学生成绩表----\n");
    printf("  学号     姓名   年龄 性别 语文 数学 英语 平均分\n");
    for (i=0; i<n; i++)
        printf("%5d%10s%6d%5s%5d%5d%5d%6.1f\n",st1[i].no,st1[i].name,st1[i].age,st1[i].sex,st1[i].deg1,st1[i].deg2,st1[i].deg3,st1[i].avg);
    printf("\n");
}
void Average(StudType st[],StudType1 st1[],int n)   //求平均分
{
    int i;
    for (i=0; i<n; i++)
    {
        st1[i].no=st[i].no;
        strcpy(st1[i].name,st[i].name);
        st1[i].age=st[i].age;
        strcpy(st1[i].sex,st[i].sex);
        st1[i].deg1=st[i].deg1;
        st1[i].deg2=st[i].deg2;
        st1[i].deg3=st[i].deg3;
        st1[i].avg=(st1[i].deg1+st1[i].deg2+st1[i].deg3)/3.0;
    }
}
void Sort(StudType1 st1[],int n)        //按平均分递减排序
{
    int i,j;
    StudType1 temp;
    for (i=1; i<n; i++)         //直接插入排序
    {
        temp=st1[i];
        for (j=i-1; j>=0 && temp.avg>st1[j].avg; j--)
            st1[j+1]=st1[j];
        st1[j+1]=temp;
    }
}
int main()
{
    int n=8;
    StudType st[]= {{1,"陈华",20,"男",78,90,84},
        {5,"张明",21,"男",78,68,92},
        {8,"王英",20,"女",86,81,86},
        {3,"刘丽",21,"女",78,92,88},
        {2,"许可",20,"男",80,83,78},
        {4,"陈军",20,"男",78,88,82},
        {7,"马胜",21,"男",56,67,75},
        {6,"曾强",20,"男",78,89,82}
    };
    StudType1 st1[N];
    printf("操作过程如下:\n");
    printf("  (1)将st数组中学生记录写入stud.dat文件\n");
    WriteFile(st,n);
    printf("  (2)将stud.dat文件中学生记录读入到st数组中\n");
    ReadFile(st,n);
    printf("  (3)显示st数组中的学生记录\n");
    Display(st,n);
    printf("  (4)求学生的平均分并放在st1数组中\n");
    Average(st,st1,n);
    printf("  (5)对st1数组按平均分递减排序\n");
    Sort(st1,n);
    printf("  (6)将st1数组中学生记录写入stud1.dat文件\n");
    WriteFile1(st1,n);
    printf("  (7)将stud1.dat文件中学生记录读入到st1数组中\n");
    ReadFile1(st1,n);
    printf("  (8)显示st1数组中的学生记录\n");
    Display1(st1,n);
    return 0;
}
时间: 2024-08-05 06:22:00

数据结构实践——操作文件的相关文章

数据结构实践——索引文件

本文是针对[数据结构基础系列(11):文件]中的实践项目. [项目]索引文件 有若干学生的成绩数据如下,将这些数据保存到st数组中: 学号 姓名 年龄 性别 语文 数学 英语 1 陈华 20 男 78 90 84 5 张明 21 男 78 68 92 8 王英 20 女 86 81 86 3 刘丽 21 女 78 92 88 2 许可 20 男 80 83 78 4 陈军 20 男 78 88 82 7 马胜 21 男 56 67 75 6 曾强 20 男 78 89 82 基于这些数据,编程序

数据结构实践——操作用邻接表存储的图

本文是针对[数据结构基础系列(7):图]的实践. [项目 - 操作用邻接表存储的图] 假设图G采用邻接表存储,分别设计实现以下要求的算法: (1)输出出图G中每个顶点的出度: (2)求出图G中出度最大的一个顶点,输出该顶点编号: (3)计算图G中出度为0的顶点数: (4)判断图G中是否存在边<i,j>. 利用下图作为测试用图,输出结果. 提示:(1)分别设计函数实现算法:(2)不要全部实现完再测试,而是实现一个,测试一个:(3)请利用图算法库. [参考解答] #include <stdi

系统调用操作文件——《Unix/Linux编程实践教程》读书笔记

1.who命令通过读系统日志的内容显示当前已经登录的用户. 2.Unix系统把数据存放在文件中,可以通过以下系统调用操作文件: open(filename, how) creat(filename, mode) read(fd, buffer, amt) write(fd, buffer, amt) lseek(fd, distance, base) close(fd) 3.进程对文件的读/写都要通过文件描述符,文件描述符表示文件和进程之间的连接. 4.每次系统调用都会导致用户模式和内核模式的切

IOS PUSH 实践操作~~~~

1.推送过程简介 (1)App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请.若注册成功,回调函数application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 会被触发,App可以得到deviceToken,该tok

vim的编辑模式、命令模式与vim实践操作

一.vim的编辑模式 二.vim命令模式三.vim实践操作# cp /etc/dnsmasq.conf /tmp/1.txt (1) 分别向下.向右.向左.向上移动6个字符(6j 6l 6h 6k).(2) 分别向下.向上翻两页(分别按两次ctrl+f和ctrl+b).(3) 把光标移动到第49行(49G).(4) 把光标移动到行尾,再移动到行首(Shift+4, Shift+6).(5) 移动到1.txt文件的最后一行(G).(6) 移动到文件的首行(gg).(7) 搜索文件中出现的"dnsm

git bash 常用操作文件命令

git bash常用操作文件命令 在Windows下使用Git Bash,用的是Linux命令,常用几个文件操作命令如下: Windows命令 Linux 命令 意义 Windows命令 Linux 命令 意义 cd e:\xxx cd /e/xxx 切换到xxx目录 cd pwd 显示当前目录路径 dir ls 列出当前目录内容 copy nul xxx.txt touch xxx.txt 生成名为xxx.txt的空文件 del xxx.txt rm xxx.txt 删除xxx.txt文件 m

Python IO编程——操作文件和目录

1.1   操作文件和目录 >>> import os >>> os.name     #操作系统类型 'posix' >>> os.uname()     #详细的系统信息 posix.uname_result(sysname='Linux',nodename='daidai.com', release='2.6.18-194.el5', version='#1 SMP Tue Mar 1621:52:39 EDT 2010', machine='x

操作文件方法简单总结(File,Directory,StreamReader,StreamWrite ) - Zery-zhang

一 基本介绍 操作文档,文件夹,需要用到的类 1 Directory (静态类) :      用于创建.移动和删除等操作通过 目录 和子 目录 DirectoryInfo (非静态): 2 File (静态类)  : 提供用于创建.复制.删除.移动和打开文件的静态类,并协助创建 FileStream 对象 FileInfo (非静态) 3 StreamReader : 实现一个 TextReader,使其以一种特定的编码从字节流中读取字符 StreamWriter : 实现一个 TextWri

python读写操作文件

with open(xxx,'r,coding='utf-8') as f:   #打开文件赋值给F ,并且执行完了之后不需要 f.close(). 在Python 2.7 及以后,with又支持同时对多个文件的上下文进行管理,即:with open('log1') as obj1, open('log2') as obj2: f.tell          #获取指针位置 f.seek(1)   #调整指针位置 f.writ()     #往文件里面些东西  并切指针到最后 r.read()