第七次实验的总结与体会

这周进行了最后一次实验,是有关文件打开/关闭与文件读写操作的实验,总的来说实验操作起来还行,我之前基础不太好,如果有些的不对的地方请指出来,我会改正的,下面是实验内容。

Part1:验证性实验

 验证性实验1:已知文件fle1.txt已经存在,将fle1.txt中小写字母转换成大写后,另存为fle2.txt。
#include <stdio.h>
#include <stdlib.h>
int main() 
{
    FILE *fin, *fout; 
    int ch;    
    fin = fopen("file1.txt", "r"); 
    if (fin == NULL) 
    {
        printf("fail to open file1.txt\n");
        exit(0);    
    }     
    fout = fopen("file2.txt", "w"); 
    if (fout == NULL) 
    {
        printf("fail to open or create file2.txt\n");
        exit(0);
    }     
    while( !feof(fin) ) 
    {
        ch = fgetc(fin);         
        if(ch >= 'a' && ch <= 'z')  
            ch -= 32;        
        fputc(ch, fout); 
    }    
    fclose(fin);    
    fclose(fout);    
    return 0;
}

   

 尝试对line15做如下修改,在文件名前加上绝对路径:
修改line15里的内容后file2和file3都一样。
验证性实验2: 从文件fle1.dat中读入数据,找出最高分和最低分学生信息,并输出在屏幕上。
#include <stdio.h> 
#include <stdlib.h>
#define N 10 
typedef struct student 
{
    int num;
    char name[20];
    int score;
}STU;
int main() 
{
    STU st, stmax, stmin;
    int i;
    FILE *fp;    
    fp = fopen("file1.dat", "r");
    if( !fp ) 
    {  
        printf("fail to open file1.dat\n");
        exit(0);
    }    
    stmax.score = 0;    
    stmin.score = 100;        
    for(i=0; i<N; i++) 
    {
        fscanf(fp, "%d %s %d", &st.num, st.name, &st.score);          
        if(st.score > stmax.score)
            stmax = st;
        else if(st.score < stmin.score)
            stmin = st; 
    }     
    fclose(fp);    
    printf("最高分学生信息: %5d%15s%5d\n", stmax.num, stmax.name, stmax.score);
    printf("最低分学生信息: %5d%15s%5d\n", stmin.num, stmin.name, stmin.score);
    return 0;
}

尝试对line29做修改:

修改后的输出和未修改的一样。

验证性实验3:从文件fle1.dat中读入数据,按成绩从高到低排序,将排序结果输出到屏幕上,同时也以文本方式存入文件file3.dat中。

#include <stdio.h> 
#include <stdlib.h>
#define N 10
typedef struct student 
{
    int num;
    char name[20];
    int score;
}STU;
void sort(STU *pst, int n);  
int main() 
{
    FILE *fin, *fout;
    STU st[N];
    int i;    
    fin = fopen("file1.dat", "r");
    if( !fin ) 
    {  
        printf("fail to open file1.dat\n");
        exit(0);
    }    
    for(i=0; i<N; i++) 
        fscanf(fin, "%d %s %d", &st[i].num, st[i].name, &st[i].score);    
    fclose(fin);      
    sort(st, N);    
    fout = fopen("file3.dat", "w");
    if( !fout ) 
    {  
        printf("fail to open file1.dat\n");
        exit(0);
    }    
    for(i=0; i<N; i++) 
    {
        printf("%-6d%-10s%3d\n", st[i].num, st[i].name, st[i].score);
        fprintf(fout, "%-6d%-10s%3d\n", st[i].num, st[i].name, st[i].score);
    }        
    fclose(fout);      
    return 0;
}
void sort(STU *pst, int n) 
{
    STU *pi, *pj, t;    
    for(pi = pst; pi < pst+n-1; pi++)
        for(pj = pi+1; pj < pst+n; pj++) 
            if(pi->score < pj->score) 
            {
                t = *pi;
                *pi = *pj;
                *pj = t; 
            }    
} 

        

运行程序,能正确输出按分数高到低排序的信息,在当前路径下,生成了file3.dat,里面的信息全部正确,可直观可读。

验证性实验4:从文件fle1.dat中读入数据,按成绩从高到低排序,将排序结果输出到屏幕上,同时也以二进制方式存入文件file4.dat中。

#include <stdio.h> 
#include <stdlib.h>
#define N 10
typedef struct student 
{
    int num;
    char name[20];
    int score;
}STU;
void sort(STU *pst, int n);  
int main() 
{
    FILE *fin, *fout;
    STU st[N];
    int i;        
    fin = fopen("file1.dat", "r");
    if( !fin ) 
    {   
        printf("fail to open file1.dat\n");
        exit(0);
    }    
    for(i=0; i<N; i++) 
        fscanf(fin, "%d %s %d", &st[i].num, st[i].name, &st[i].score);    
    fclose(fin);     
    sort(st, N);    
    fout = fopen("file4.dat", "wb");
    if( !fout ) 
    {  
        printf("fail to open file1.dat\n");
        exit(0);
    }    
    for(i=0; i<N; i++) 
        printf("%-6d%-10s%3d\n", st[i].num, st[i].name, st[i].score);
    fwrite(st, sizeof(STU), N, fout);  
    fclose(fout); 
    return 0;
} 
void sort(STU *pst, int n) 
{
    STU *pi, *pj, t;    
    for(pi = pst; pi < pst+n-1; pi++)
        for(pj = pi+1; pj < pst+n; pj++) 
            if(pi->score < pj->score) 
            {
                t = *pi;
                *pi = *pj;
                *pj = t; 
            }    
} 

              

运行后,屏幕上正确输出了按分数高到低排序的信息,虽然生成了file4.dat文件,但数据不可读。

注意比较ex1_3.cpp和ex1_4.cpp这两个程序,在数据写到文本文件和二进制文件的具体实现上的区别?
答:文件在存储时,都是用的二进制数据。如果有一类文件,其中存储的主要内容都可以当成可见字符的ASCII码来显示使用时,是文本文件。文本文件是二进制文件的特殊子集,或者说它存放的都是ASCII码、汉字编码这样的数据。当数据文件被当成二进制文件打开时,可以将数据以二进制方式读写,即使它们是ASCII码;当数据文件被用文本格式打开时,一般可以将读取的数据直接送显示也不会有乱码。

Part2:编程练习

1. 改写「实验6」中的「编程练习2」,使得成绩信息从文本文件examinee.txt读入,计算后的结果不仅在屏幕上显示,也写入文本文件result.txt中。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int N = 10;
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;
}
void input(STU s[], int n) 
{
    FILE *fin;
    fin=fopen("examinee.txt","r");
    if(!fin) 
    { 
        printf("Failed to open file\n");
        exit(0);
    }
    int i;
    for(i=0;i<n;i++)
    {
        if(fscanf(fin,"%ld %s %f %f",&s[i].id,s[i].name,&s[i].objective,&s[i].subjective)==0)
        printf("读取错误!"); 
    }
    fclose(fin);
}
void output(STU s[], int n) 
{
    int i;
    FILE *fout;
    fout=fopen("result.txt","w");
    printf("准考证号   姓名   客观题得分   操作题得分   总分   等级\n");
    fprintf(fout,"准考证号   姓名   客观题得分   操作题得分   总分   等级\n");
    for(i=0;i<n;i++)
    {
        printf("  %-9ld%-10s%-13.2f%-10.2f%-7.2f%-8s\n",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level);
        fprintf(fout,"  %-9ld  %-10s%-13.2f%-10.2f%-7.2f%-8s\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,k;
    int a1,a2;                 
    a1=(int)(N*0.1),a2=(int)(N*0.5);
    STU temp;
    for(i=0;i<n;i++)
    s[i].sum=s[i].objective+s[i].subjective;
    for(j=0;j<n-1;j++)
    {
       for(k=0;k<n-j-1;k++)
       {
            if(s[k].sum<s[k+1].sum)
            {
                temp=s[k];
                s[k]=s[k+1];
                s[k+1]=temp;
            }
        }
    }
    for(i=0;i<a1;i++)
        strcpy(s[i].level,"优秀");
    for(i=a1;i<a2;i++)
        strcpy(s[i].level,"合格");
    for(i=a2;i<n;i++)
        strcpy(s[i].level,"不合格");
}

Part3:拓展综合应用

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define N 80
int main()
{
    FILE *fin,*fout;
    int i,j,num[5];
    char str[N][64];
    time_t t;
    char strtime[60]={0};
    struct tm *info; 
    t=time(0);
    info=localtime(&t);  
    strftime(strtime,60,"%Y-%m-%d.txt",info);  
    fin=fopen("list.txt","r");
    if(!fin)
    {
        printf("fail to open list.txt");
        exit(0);
    }
    for(i=0;i<N;i++)
    {
        fgets(str[i],64,fin);    
        srand(time(0));    
        num[0]=(rand()%N);
    }
    for(i=1;i<5;i++)
    {
        num[i]=rand()%N;
        for(j=0;j<i;j++)
        {     
            if(num[i]==num[j])
            {
                num[i]=(rand()%N);
                j = 0;
            }
        }
    }   
    fout = fopen(strtime, "w");    
    if(!fout)
    {
        printf("fail to open %s",strtime);
        exit(0);
    }   
    for(i=0; i<5; i++)
    {
        printf("%s\n",str[num[i]]);
        fprintf(fout,"%s\n",str[num[i]]);
    }
    fclose(fin);
    fclose(fout);
    return 0; 
}

    

这一部分自主练习刚开始怎么写都是错的,本来想放弃的,但还是想把它写出来,就从网上找了相应的部分,看了一会儿,看懂了一些,花了很长时间写出来,还是要多练。

总结与体会:

这次实验总体来说还不错,但还是会把一些程序写错,我容易把一些词写错,少写或多写。感觉程序是对的,但还是出错,这还是因为不熟练。虽然这是最后一次实验,但平时我还要多练,多写程序,巩固自己的基础。期末快到了,希望我们所有人都过,加油!

互评:

https://www.cnblogs.com/Xoy31415926/p/11083729.html

https://www.cnblogs.com/zxy-345/p/11081994.html

https://www.cnblogs.com/hsc6/p/11080530.html

 

posted on 2019-06-20 17:09  苏巴提  阅读(297)  评论(3)    收藏  举报

导航