实验7-数字孪生牛翰社区-数据算法-牛翰网

实验7

任务1

 1 #include<stdio.h>
 2 #define N 80
 3 #define M 100
 4 
 5 typedef struct{
 6     char name[N];
 7     char author[N]; 
 8 }Book;
 9 
10 void write();
11 void read();
12 
13 int main(){
14     printf("测试1:把图书信息写入文本文件\n");
15     write();
16     
17     printf("\n测试2:从文本文件读取图书信息,打印输出到屏幕\n");
18     read();
19     
20     return 0;
21     
22 }
23 
24 void write(){
25     Book x[] = { {"《雕塑家》", "斯科特.麦克劳德"},
26                   {"《灯塔》", "克里斯多夫.夏布特"},
27                   {"《人的局限性》", "塞缪尔.约翰生"}, 
28                   {"《永不停步:玛格丽特.阿特伍德传》", "罗斯玛丽.沙利文"},
29                   {"《大地之上》", "罗欣顿·米斯特里"}, 
30                   {"《上学记》", "何兆武"}, 
31                   {"《命运》", "蔡崇达"} };
32     int n,i;
33     FILE *fp;
34     n=sizeof(x)/sizeof(x[0]);
35     
36     fp=fopen("datal.txt","w");
37     
38     if(fp==NULL){
39         printf("fail to open file to write\n");
40         return;
41     }
42     
43     for(i=0;i<n;i++)
44         fprintf(fp,"%-40s%-20s\n",x[i].name ,x[i].author );
45     
46     fclose(fp);
47     
48 }
49 
50 void read(){
51     Book x[M];
52     int i,n;
53     int number;
54     
55     FILE *fp;
56     
57     fp=fopen("datal.txt","r");
58     
59     if(fp == NULL) {
60         printf("fail to open file to read\n");
61         return;
62     }
63     
64     i=0;
65     while(!feof(fp)){
66         number = fscanf(fp, "%s%s", x[i].name, x[i].author);
67         if(number != 2)
68             break;
69         i++;
70     }
71     n=i;
72     
73     for(i=0;i<n;++i)
74         printf("%d. %-40s%-20s\n", i+1, x[i].name, x[i].author);
75         
76     fclose(fp);
77 }

去掉line75-76,重新编译,再次运行程序,观察结果,对比运行结果是否有不同。结合结果,查阅资 料,分析这两行代码放在这里起到什么作用:删除之后就会再生成一行空行。如果fscanf没有正常读取到两串字符,比如格式错误或者已经到达文件末尾,就跳出循环
任务2

#include<stdio.h>
#define N 80
#define M 100

typedef struct {
    char name[N];      
    char author[N]; 
} Book;

void write();
void read();

int main() {
    printf("测试1: 把图书信息以数据块方式写入二进制文件\n");
    write();

    printf("\n测试2: 从二进制文件读取图书信息, 打印输出到屏幕\n");
    read();

    return 0;
}


void write(){
    Book x[] = { {"《雕塑家》", "斯科特.麦克劳德"},
                  {"《灯塔》", "克里斯多夫.夏布特"},
                  {"《人的局限性》", "塞缪尔.约翰生"}, 
                  {"《永不停步:玛格丽特.阿特伍德传》", "罗斯玛丽.沙利文"},
                  {"《大地之上》", "罗欣顿·米斯特里"}, 
                  {"《上学记》", "何兆武"}, 
                  {"《命运》", "蔡崇达"} };
    
    int n;
    FILE *fp;
    
    n=sizeof(x)/sizeof(x[0]);
    
    fp=fopen("data2.dat","wb");
    
    if(fp==NULL){
        printf("fail to open file to write\n");
        return;
    }
    
    fwrite(x,sizeof(Book),n,fp);
    
    fclose(fp);    
}

void read(){
    Book x[M];
    int i,n;
    int number;
    
    FILE *fp;
    
    fp=fopen("data2.dat","rb");
    
    if(fp==NULL){
        printf("fail to open file to read\n");
        return;
    }
    i=0;
    while(!feof(fp)){
        number=fread(&x[i],sizeof(Book),1,fp);
        if(number!=1)
            break;
        i++;
    }
    
    n=i;
    for(i=0;i<n;i++)
        printf("%d. %-40s%-20s\n", i+1, x[i].name, x[i].author);
    
    fclose(fp);
        
}

去掉line75-76,重新编译,再次运行程序,观察结果,对比运行结果是否有不同。结合结果,查阅资料,分析这两行代码放在这里起到什么作用:删除之后就会再生成一行空行。如果fscanf没有正常读取到一个book结构体,比如格式错误或者已经到达文件末尾,就跳出循环
任务三

 1 // 文件读写操作:以字符、字符串形式读、写
 2 
 3 #include <stdio.h>
 4 #define N 5
 5 #define M 80
 6 
 7 void write();
 8 void read_str();
 9 void read_char();
10 
11 int main() {
12     printf("测试1: 把一组字符信息以字符串方式写入文本文件\n");
13     write();
14 
15     printf("\n测试2: 从文件以字符串方式读取, 输出到屏幕\n");
16     read_str();
17 
18     printf("\n测试3: 从文件以单个字符方式读取, 输出到屏幕\n");
19     read_char();
20 
21     return 0;
22 }
23 
24 void write() {
25     char *ptr[N] = { "Working\'s Blues",
26                      "Everything Will Flow",
27                      "Streets of London",
28                      "Perfect Day",
29                      "Philadelphia"};
30     int i;
31     FILE *fp;
32 
33     fp = fopen("data3.txt", "w");
34     if(!fp) {
35         printf("fail to open file to write\n");
36         return;
37     }
38 
39     for(i = 0; i < N; ++i) {
40         fputs(ptr[i], fp);
41         fputs("\n", fp);
42     }
43     
44     fclose(fp);
45 }
46 
47 void read_str() {
48     char songs[N][M];
49     int i;
50     FILE *fp;
51 
52     fp = fopen("data3.txt", "r");
53     if(!fp) {
54         printf("fail to open file to read\n");
55         return;
56     }
57 
58     for(i = 0; i < N; ++i)
59         fgets(songs[i], 80, fp);
60 
61     for(i = 0; i < N; ++i)
62         printf("%d. %s", i+1, songs[i]);
63     
64     fclose(fp);
65 }
66 
67 void read_char() {
68     char ch;
69     FILE *fp;
70 
71     fp = fopen("data3.txt", "r");
72     if(!fp) {
73         printf("fail to open file to read\n");
74         return;
75     }
76 
77     while(!feof(fp)) {
78         ch = fgetc(fp);
79         if(ch == EOF)
80             break;
81         
82         putchar(ch);
83     }
84 
85     fclose(fp);
86 }

代码line25字符串 “Working\’s Blues”输出时为什么没有显示反斜杠\:fgets函数不录入\
任务4

#include<stdio.h>
#include<string.h>
#define N 100
#define M 80 

void read();

int main(){
    printf("data4.txt统计结果:\n");
    read();
    return 0; 
}

void read(){
    int i,n,j,sum=0;
    char x[N][M];
    int number;
    
    FILE *fp;
    
    fp = fopen("data4.txt", "r");
    
    if(fp==NULL){
        printf("fail to open file to read\n");    
        return;    
    }
    i=0;
    
    while(!feof(fp)){
    
        fgets(x[i], 80, fp);
        i++;}
    printf("行数:%d\n",i);
    
    for(j=0;j<i;j++)
    {
        n=strlen(x[j]);
        for(int k=0;k<n;k++)
        if(x[j][k]!=' ' && x[j][k]!='\n')sum++;
    }
    printf("字符数:%d\n",sum); 
    fclose(fp);
}

 

任务5

#include <stdio.h>
#include <string.h>

#define N 10

typedef struct {
    long id;            // 准考证号
    char name[20];      // 姓名
    float objective;    // 客观题得分
    float subjective;   // 操作题得分
    float sum;          // 总分
    char result[10];    // 考试结果
} STU;

// 函数声明
void read(STU st[], int n);
void write(STU st[], int n);
void output(STU st[], int n);
int process(STU st[], int n, STU st_pass[]);

int main() {
    STU stu[N], stu_pass[N];
    int cnt;
    double pass_rate;

    printf("从文件读入%d个考生信息...\n", N);
    read(stu, N);

    printf("\n对考生成绩进行统计...\n");
    cnt = process(stu, N, stu_pass);

    printf("\n通过考试的名单:\n");
    output(stu, N);   // 输出所有考生完整信息到屏幕
    write(stu_pass, N);    // 输出考试通过的考生信息到文件

    pass_rate = 1.0 * cnt / N;
    printf("\n本次等级考试通过率: %.2f%%\n", pass_rate*100);

    return 0;
}

// 把所有考生完整信息输出到屏幕上
// 准考证号,姓名,客观题得分,操作题得分,总分,结果
void output(STU st[], int n) {
    int i;
    
    printf("准考证号\t姓名\t客观题得分\t操作题得分\t总分\t\t结果\n");
    for (i = 0; i < n; i++)
        printf("%ld\t\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%s\n", st[i].id, st[i].name, st[i].objective, st[i].subjective, st[i].sum, st[i].result);
}

// 从文本文件examinee.txt读入考生信息:准考证号,姓名,客观题得分,操作题得分
void read(STU st[], int n) {
    int i,result;
    FILE *fp;

    fp = fopen("examinee.txt", "r");
    if (!fp) {
        printf("fail to open file\n");
        return;
    }

    while (!feof(fp)) {
        for (i = 0; i < n; i++)
            result=fscanf(fp, "%ld %s %f %f", &st[i].id, st[i].name, &st[i].objective, &st[i].subjective);
            if(result!=4){
                break;
            }
    }

    fclose(fp);
}

// 把通过考试的考生完整信息写入文件list_pass.txt
// 准考证号,姓名,客观题得分,操作题得分,总分,结果
void write(STU s[], int n) {
    int i;
    FILE *fin;
    
    fin=fopen("list_pass.txt","w");
    if(!fin){
        printf("fail to open file\n");
        return;
    }
    
    for(i=0;i<n;i++){
        fprintf(fin,"%ld\t\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%s\n", s[i].id, s[i].name, s[i].objective, s[i].subjective, s[i].sum, s[i].result);
    }

    fclose(fin);
}
     
   

// 对考生信息进行处理:计算每位考生考试总分、结果;统计考试通过的人数
int process(STU st[], int n, STU st_pass[]) {
    int i,cnt=0;
    for(i=0;i<n;i++){
        st[i].sum=st[i].objective+st[i].subjective;
        if(st[i].sum>=60){
        
             strcpy(st[i].result, "通过");
             st_pass[cnt++] = st[i];}
        else{
            strcpy(st[i].result, "不通过"); 
        }
    }
    
    return cnt;
}

 

任务6

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 
 5 #define N 80
 6 
 7 typedef struct {
 8     long id;            // 准考证号
 9     char name[20];      // 姓名
10     char cla[40];  // 考试结果
11 } STU;
12 
13 void write(STU st[],int n);
14 void read(STU st[],int n);
15 void output(STU st[], int n);
16 void process(STU st[],STU stu[],int n);
17 
18 int main(){
19     STU st[N],stu[N]; 
20     
21     
22     read(st,N);
23     printf("随机抽取五个人的名单\n");
24     
25     process (st,stu,N);
26     
27     output(stu,5);
28     write(stu,5);
29     printf("保存到文件\n输入文件名:20241000.txt\n保存成功");
30     return 0;
31 }
32 
33 void output(STU st[], int n) {
34     int i;
35     
36     for (i = 0; i < n; i++)
37         printf("%ld\t\t%s\t%s\n", st[i].id, st[i].name,st[i].cla);
38 }
39 
40 
41 void read(STU st[],int n){
42     int i,result;
43     FILE *fp;
44     
45     fp=fopen("list.txt","r");
46     if (!fp) {
47         printf("fail to open file\n");
48         return;
49     }
50     
51         for (i = 0; i < n; i++){
52         
53             result=fscanf(fp, "%ld %s %s", &st[i].id, st[i].name, st[i].cla);
54             if(result!=3){
55                 break;
56             }}
57     
58     
59     fclose(fp);
60 }
61 
62 
63     
64 void write(STU st[], int n){
65     int i;
66     FILE *fp;
67 
68     fp = fopen("20241000.txt", "w");
69     if (!fp) {
70         printf("fail to open file\n");
71         return;
72     }
73 
74     for (i = 0; i < n; i++) {
75         fprintf(fp, "%ld %s %s\n", st[i].id, st[i].name, st[i].cla);
76     }
77 
78     fclose(fp);
79 
80 }
81 
82 void process(STU st[],STU stu[],int n){
83     int i,count=0;
84     srand(time(NULL));
85     while (count < 5) {
86         int index = rand() % n; 
87         if (stu[index].id == 0 || stu[index].id == st[index].id) { 
88             stu[count++] = st[index];
89             }
90     }
91 }

 

来源链接:https://www.cnblogs.com/shansuiqu/p/18639762

请登录后发表评论

    没有回复内容