zoukankan      html  css  js  c++  java
  • 【实验7】文件


    实验任务一、二

    已自主验证。


    实验任务三

    stdout成功:(话说时间有点长)

    二进制文件生成成功:

    可见,dat文件内容正确可读。


    实验任务四

    子任务一

    stdout成功:

    打开二进制文件:

    令人费解的不直观。

    子任务二

    程序源代码:

     1 // 从文本数据文件file4.dat中读入数据,将结果输出到屏幕上
     2 #include <stdio.h> 
     3 #include <stdlib.h>
     4 
     5 #define N 10
     6 
     7 typedef struct student {
     8     int num;
     9     char name[20];
    10     int score;
    11 }STU;
    12 
    13 int main(){
    14     FILE *fin,*fout;
    15     STU st[N];
    16     int i;
    17     
    18     fin=fopen("file4.dat","rb");
    19     if(!fin){
    20         printf("Failed to open the file
    ");
    21         exit(0);
    22     }
    23     
    24     fread(st,sizeof(STU),N,fin);
    25         
    26     fclose(fin);
    27         
    28     for(i=0; i<N; i++) 
    29         fprintf(stdout,"%-6d%-10s%3d
    ", st[i].num, st[i].name, st[i].score);
    30         
    31     fclose(fout);
    32     
    33     return 0;
    34 }

    运行结果:


    实验任务五

    程序源代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 const int N = 10;
     4 
     5 // 定义结构体类型struct student,并定义其别名为STU 
     6 typedef struct student {
     7     long int id;
     8     char name[20];
     9     float objective;    /*客观题得分*/
    10     float subjective;    /*操作题得分*/
    11     float sum;
    12     char level[10];    
    13 }STU; 
    14 
    15 // 函数声明
    16 void input(STU s[], int n);
    17 void output(STU s[], int n);
    18 void process(STU s[], int n);
    19 
    20 int main() {
    21     STU stu[N];
    22     
    23     printf("录入%d个考生信息: 准考证号,姓名,客观题得分(<=40),操作题得分(<=60)
    ", N); 
    24     input(stu, N);
    25     
    26     printf("
    对考生信息进行处理: 计算总分,确定等级
    ");
    27     process(stu, N);
    28     
    29     printf("
    打印考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级
    ");
    30     output(stu, N); 
    31     
    32     return 0;
    33 } 
    34 
    35 // 从文本文件examinee.txt读入考生信息:准考证号,姓名,客观题得分,操作题得分
    36 void input(STU s[], int n) {
    37     // 补足代码
    38     // ××× 
    39     FILE *fin;
    40     int i;
    41     
    42     fin=fopen("examinee.txt","r");
    43     if(!fin){
    44         printf("failed to open!
    ");
    45         return;
    46     }
    47     
    48     for(i=0;i<n;i++){
    49         fscanf(fin,"%d %s %f %f",&s[i].id,s[i].name,&s[i].objective,&s[i].subjective);
    50     }
    51     
    52     fclose(fin);
    53 }
    54 
    55 // 输出考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级
    56 // 不仅输出到屏幕上,还写到文本文件result.txt中 
    57 void output(STU s[], int n) {
    58     // 补足代码
    59     // ××× 
    60     FILE *fout;
    61     int i;
    62     fout=fopen("result.txt","w+");
    63     for(i=0;i<n;i++)
    64         fprintf(fout,"%-4ld %s %-4f %-4f %f %s
    ",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level);
    65     for(i=0;i<n;i++)
    66         fprintf(stdout,"%-4ld %s %-4f %-4f %f %s
    ",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level);
    67     fclose(fout);
    68 }
    69 
    70 // 对考生信息进行处理:计算总分,排序,确定等级
    71 void process(STU s[], int n) {
    72     // 补足代码
    73     // ××× 
    74     int i,t;
    75     int k=0;
    76     STU temp;
    77     for(i=0;i<n;i++){
    78         s[i].sum=s[i].objective + s[i].subjective;
    79         if(s[i].sum<60)
    80             strcpy(s[i].level,"不及格");
    81         else if(s[i].sum>95)
    82             strcpy(s[i].level,"优秀");
    83         else
    84             strcpy(s[i].level,"及格");
    85     }
    86 
    87     for(i=0;i<n;i++){
    88         for(t=i+1;t<n;t++){
    89             if(s[t].sum>s[i].sum){
    90                 temp=s[i];
    91                 s[i]=s[t];
    92                 s[t]=temp;
    93             }
    94         }
    95     }
    96 }

    运行结果:

    result.txt


    实验任务六

    程序源代码:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<time.h>
     4 #define N 80
     5 
     6 //定义结构体; 
     7 typedef struct student {
     8     int num;
     9     long int id;
    10     char name[20];
    11     char classes[20];
    12 }STU;
    13 
    14 int main(){
    15     FILE *fin,*fout;
    16     int i,lucky_num[5],z;
    17     STU st[N];
    18     
    19     time_t t;
    20     int n=5;
    21     
    22     fin=fopen("list.txt","r");
    23     if(!fin){
    24         printf("failed to load list!
    ");
    25         exit(0);
    26     }
    27     
    28     for(i=0;i<N;i++)
    29         fscanf(fin,"%d %ld %s %s",&st[i].num,&st[i].id,st[i].name,st[i].classes);
    30     
    31     fclose(fin);
    32     
    33     fout=fopen("lucky.txt","w");
    34     
    35     srand((unsigned int)time(NULL));
    36     for( i = 0 ; i < n ; i++ ){
    37         lucky_num[i]=rand() % N;
    38         if(lucky_num[i]==0){
    39             lucky_num[i]=1;
    40         }
    41     }
    42     
    43     for(i=0;i<n;i++){
    44         z=lucky_num[i];
    45         fprintf(fout,"%d %ld %s %s
    ",st[z].num,st[z].id,st[z].name,st[z].classes);
    46         printf("%d %ld %s %s
    ",st[z].num,st[z].id,st[z].name,st[z].classes);
    47     }
    48 
    49         
    50     fclose(fout);
    51     return 0;
    52 }

    运行结果:


    拓展题 Bonus task

    重复多次抽取,且不抽出重复的学生,将点过的学生保存在txt文件中。

    源程序代码:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<time.h>
     4 #define N 80
     5 
     6 //定义结构体; 
     7 typedef struct student {
     8     int num;
     9     long int id;
    10     char name[20];
    11     char classes[20];
    12     int flag;
    13 }STU;
    14 
    15 int main(){
    16     //定义变量 
    17     FILE *fin,*fout;    //文件变量 
    18     int i,lucky_num[5],z,last_lucky_num[5],n=5,count_while;        
    19     STU st[N];                                     //工具变量 
    20     
    21     for(i=0;i<N;i++)
    22         st[i].flag=0;        //全体同学设置为未标记 
    23     time_t t;            //随机数 
    24 
    25 
    26     
    27     
    28     fin=fopen("list.txt","r");
    29     if(!fin){
    30         printf("failed to load list!
    ");
    31         exit(0);
    32     }
    33     
    34     for(i=0;i<N;i++)
    35         fscanf(fin,"%d %ld %s %s",&st[i].num,&st[i].id,st[i].name,st[i].classes);
    36     
    37     fout=fopen("lucky.txt","w");
    38     
    39     printf("Press enter key to select randomly:");
    40     while(getchar()!=EOF){
    41         for(i=0;i<N;i++)
    42             fscanf(fin,"%d %ld %s %s",&st[i].num,&st[i].id,st[i].name,st[i].classes);
    43     
    44         fout=fopen("lucky.txt","a+");
    45         
    46     
    47         srand((unsigned int)time(NULL));
    48         for(i=0;i<n;i++){
    49             lucky_num[i]=rand() % N;
    50             if(lucky_num[i]==0){
    51                 lucky_num[i]=1;
    52             }
    53             z=lucky_num[i];
    54             count_while=0;
    55             while(st[z].flag==1){        //判断是否为已标记学生 
    56                 lucky_num[i]=rand() % N;
    57                 if(lucky_num[i]==0){
    58                     lucky_num[i]=1;
    59                 }
    60                 z=lucky_num[i];
    61                 if(count_while++==80){        //循环结束的条件 
    62                     printf("
    
    Have no enough students to select!
    
    Program will break soon……
    ");
    63                     return 0;
    64                 }
    65             }
    66             st[z].flag=1;
    67         }
    68         
    69         for(i=0;i<n;i++){        //输出 
    70             z=lucky_num[i];
    71             fprintf(fout,"%d %ld %s %s
    ",st[z].num,st[z].id,st[z].name,st[z].classes);
    72             printf("%d %ld %s %s
    ",st[z].num,st[z].id,st[z].name,st[z].classes);
    73         }
    74             
    75         fclose(fout);
    76         printf("
    Press enter key to select randomly:");
    77     }
    78     fclose(fin);
    79     
    80     return 0;
    81 }

    运行结果:


    实验结论

    本章节函数较多,内容较新,需要熟练应用才能掌握。

    私以为实验任务六是很重要的,不是选作不选作的问题。task1到5都是程序填空,没有自己完整地写一遍程序。

    实验任务五中,我遇到了一个问题:

    很清楚很明显就能发现,我把输出结果的数据类型搞错了。

    但是当时我认为这并不影响,最多是强制转换。

    但过了半个小时,反复调试、中途输出验证的几种debug方法我试了又试,输出结果始终是零。我便开始没办法只能让程序完美化了。

    果不其然将int输出改成float就通了。

    我的教训就是每一个代码都有他的合理性。

    Thanks for reading.

  • 相关阅读:
    基因数据分析主流软件与基因预测方法步骤-搬运工
    调用约定__cdecl __fastcall与__stdcall
    const用法体会
    NS3系列——eclipse + NS3环境搭建
    小div在大div里面水平垂直都居中的实现方法
    template.js插件和ajax一起使用的例子
    js获取时间的函数集
    ajax获取json数据及实现跨域请求
    JavaScript里的Date 对象属性及对象方法--实现简单的日历
    css单行文本及多行文本溢出显示省略号
  • 原文地址:https://www.cnblogs.com/yinjx/p/14187013.html
Copyright © 2011-2022 走看看