实验七

Part1:验证性实验

验证性实验2:已知文本数据文件file1.dat,从中读取数据,找出最高分和最低分学生信息,并输出到屏幕上。

 

ex1_2.cpp

运行结果截图

对line9进行修改

for(i=0; i<N; i++)
↓↓↓ 改为
while( !feof(fp) )。 运行结果正确
运行结果截图
  验证性实验3                                                                                                        验证性实验4
    
二进制文件和文本文件的区别
①二者的主要区别是存储数值型数据的形式不同。
文本文件的数据流由一个个字符组成,每个字符均以ASCII代码存储,占一个字节;
二进制文件的数据流由二进制字节代码组成,将数据按其在内存中的存储形式存储在文件中。
参数
"r"(只读) 为输入打开一个文本文件
  "w"(只写) 为输出打开一个文本文件
  "a"(追加) 向文件文件尾添加数据
  "rb"(只读) 为输入打开一个二进制文件
  "wb"(只写) 为输出打开一个二进制文件
  "r+"(读写) 为读写打开一个文本文件
  "w+"(读写) 为读写建立一个新的文本文件
  "a+"(读写) 为读写打开一个文本文件
  "rb+"(读写) 为读写打开一个二进制文件
  "wb+"(读写) 为读写建立一个新的二进制文件
  "ab+"(读写) 为读写打开一个二进制文件
 
ex1_5.cpp
写一个简单的程序,尝试从二进制文件fifile4.dat中读出数据,并在屏幕上显示,以此查看文件fifile4.dat的内容。
//该程序功能:读取file4.dat的数据,输出到屏幕,并以文本文件方式保存在file4_1.txt中 
  #include<stdio.h>
  #include<stdlib.h>
  const int n=10;
  typedef struct student 
  {
      int num;
      char name[20];
      int score;
  }STU;
 int main()
 {
    int i;
    STU st[n];
    FILE *hp;
    hp=fopen("file4.dat","r");
    if(hp==NULL)
    {
        printf("fail to open file4.dat\n");
    }
    for(i=0;i<n;i++)
    {
        fread(&st[i],sizeof(STU),n,hp); //使用块读写函数读取二进制文本中内容 
    }
    fclose(hp); 
    FILE *fp;
    fp=fopen("file4_1.txt","w");
    if(fp==NULL)
    {
        printf("fail to open file4_1.txt\n");
    } 
    for(i=0;i<n;i++)
    {
        printf("%d %s %d\n",st[i].num,st[i].name,st[i].score);
    }
    fwrite(st, sizeof(STU), n, fp);
    fclose(fp);
    return 0;
} 

运行结果截图

Part2: 编程练习
修改examinee.txt中测试数据,给出程序运行源码及运行结果截图。
在input()和output()函数中,请添加必要注释,增加程序源码的可读性。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int N = 10;

// 定义结构体类型struct student,并定义其别名为STU 
typedef struct student 
{
    long int id;
    char name[20];
    float objective;    /*客观题得分*/
    float subjective;    /*操作题得分*/
    float sum;
    char level[10];    
}STU; 

// 函数声明
void input(STU s[], int n);
void output(STU s[], int n);
void process(STU s[], int n);

int main() 
{
    STU stu[N];
    
    printf("录入%d个考生信息: 准考证号,姓名,客观题得分(<=40),操作题得分(<=60)\n", N); 
    input(stu, N);
    
    printf("\n对考生信息进行处理: 计算总分,确定等级\n");
    process(stu, N);
    
    printf("\n打印考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级\n");
    output(stu, N); 
    
    return 0;
} 

// 从文本文件examinee.txt读入考生信息:准考证号,姓名,客观题得分,操作题得分
void input(STU s[], int n) 
{
    FILE *fin;
    int i;
    if((fin=fopen("examinee.txt","r"))==NULL)
    {
       printf("cannot open file");
       exit(0);
    }
    for(i=0;i<n;i++)
    fscanf(fin,"%d %s %f %f",&s[i].id,s[i].name,&s[i].objective,&s[i].subjective);
    
     fclose(fin);
}

// 输出考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级
// 不仅输出到屏幕上,还写到文本文件result.txt中 
void output(STU s[], int n) 
{
    FILE *fout;
    int i;
    if((fout=fopen("result.txt","w"))==NULL)
    {
       printf("cannot open file");
       exit(0);
    }
     for(i=0;i<n;i++)
     {
         printf("%5d %10s   %5.1f %5.1f %5.1f %5s\n",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level);
     fprintf(fout,"%5d %10s   %5.1f %5.1f %5.1f %5s\n",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level);

     }
   fclose(fout);
}
// 对考生信息进行处理:计算总分,排序,确定等级
void process(STU s[], int n) 
{
    int i,j;
    STU temp;
    for(i=0;i<n;i++)
    {
        s[i].sum=0.4*s[i].objective+0.6*s[i].subjective;
    }
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-i-1;j++)
        {
            if(s[j].sum<s[j+1].sum)
            {
                temp=s[j];
                s[j]=s[j+1];
                s[j+1]=temp;
            }
        }
    }
    for(i=0;i<n;i++)
    {
        if(i<0.1*n)
           strcpy(s[i].level,"");
        else if(i<0.5*n&&i>=0.1*n)
           strcpy(s[i].level,"");
        else if(i>=0.5*n)
          strcpy(s[i].level,"不合格"); 
    }
}

运行结果截图

实验总结与体会

1、在做验证性实验1时,没有注意到源码中新建的文件存在d盘,一直在源代码文件夹里找file2.txt。

 
 
 
 

转载于:https://www.cnblogs.com/silentisland/p/11050700.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值