实验七

已完成前面三个验证性实验

task4

代码

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 
 4 int main()
 5 {
 6     FILE* fp;
 7     int line = 0;
 8     int charNum = 0;
 9     char ch;
10     int newLineFlag = 1;
11     fp = fopen("data4.txt", "r");
12     if (fp == NULL)
13     {
14         printf("文件打开失败,请把data4.txt和程序放在同一个文件夹!\n");
15         return 0;
16     }
17     while ((ch = fgetc(fp)) != EOF)
18     {
19        
20         if (ch == '\n')
21         {
22             line = line + 1;
23             newLineFlag = 1;
24             continue;
25         }
26         
27         if (ch == ' ' || ch == '\t')
28         {
29             continue;
30         }
31         
32         charNum = charNum + 1;
33         newLineFlag = 0; 
34     }
35 
36     if (newLineFlag == 0)
37     {
38         line = line + 1;
39     }
40     fclose(fp);
41     printf("data4.txt统计结果:\n");
42     printf("行数:%d\n", line);
43     printf("字符数(不计空白符):%d\n", charNum);
44 
45     return 0;
46 }
View Code

屏幕截图 2026-06-23 202628

 

 

task5

代码

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include <stdio.h>
  3 #include <string.h>
  4 #define N 10
  5 typedef struct {
  6     long id;         // 准考证号
  7     char name[20];   // 姓名
  8     float objective; // 客观题得分
  9     float subjective;// 操作题得分
 10     float sum;       // 总分
 11     char result[10]; // 考试结果
 12 } STU;
 13 
 14 // 函数声明
 15 void read(STU st[], int n);
 16 void write(STU st[], int n);
 17 void output(STU st[], int n);
 18 int process(STU st[], int n, STU st_pass[]);
 19 
 20 int main() {
 21     STU stu[N], stu_pass[N];
 22     int cnt;
 23     double pass_rate;
 24     printf("从文件读入%d个考生信息: 已完成\n", N);
 25     read(stu, N);
 26     printf("\n对考生成绩进行统计: 已完成\n");
 27     cnt = process(stu, N, stu_pass);
 28     printf("\n所有考生完整信息:\n");
 29     output(stu, N);
 30     printf("\n通过考试的名单写入文件: 已完成!\n");
 31     write(stu_pass, cnt);
 32     pass_rate = 1.0 * cnt / N;
 33     printf("\n本次等级考试通过率: %.2f%%\n", pass_rate * 100);
 34     return 0;
 35 }
 36 
 37 // 把所有考生完整信息输出到屏幕上
 38 // 准考证号,姓名,客观题得分,操作题得分,总分,结果
 39 void output(STU st[], int n) {
 40     int i;
 41     printf("准考证号\t姓名\t客观题得分\t操作题得分\t总分\t\t结果\n");
 42     for (i = 0; i < n; i++)
 43         printf("%ld\t\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%s\n", st[i].id, st[i].name,
 44             st[i].objective, st[i].subjective, st[i].sum, st[i].result);
 45 }
 46 
 47 // 从文本文件examinee.txt读入考生信息:准考证号,姓名,客观题得分,操作题得分
 48 void read(STU st[], int n) {
 49     int i;
 50     FILE* fin;
 51     fin = fopen("examinee.txt", "r");
 52     if (!fin) {
 53         printf("fail to open file\n");
 54         return;
 55     }
 56     for (i = 0; i < n; i++)
 57         fscanf(fin, "%ld %s %f %f", &st[i].id, st[i].name, &st[i].objective,
 58             &st[i].subjective);
 59     fclose(fin);
 60 }
 61 
 62 // 对考生信息进行处理:计算每位考生考试总分、结果;统计并返回通过考试的人数
 63 int process(STU st[], int n, STU st_pass[]) {
 64     int i;
 65     int pass_num = 0;
 66     for (i = 0; i < n; i++)
 67     {
 68         st[i].sum = st[i].objective + st[i].subjective;
 69         if (st[i].sum >= 60)
 70         {
 71             strcpy(st[i].result, "通过");
 72             st_pass[pass_num] = st[i];
 73             pass_num++;
 74         }
 75         else
 76         {
 77             strcpy(st[i].result, "未通过");
 78         }
 79     }
 80     return pass_num;
 81 }
 82 
 83 // 把通过考试的考生完整信息写入文件list_pass.txt
 84 // 准考证号,姓名,客观题得分,操作题得分,总分,结果
 85 void write(STU st[], int n) {
 86     int i;
 87     FILE* fout;
 88     fout = fopen("list_pass.txt", "w");
 89     if (fout == NULL)
 90     {
 91         printf("无法打开输出文件list_pass.txt!\n");
 92         return;
 93     }
 94     fprintf(fout, "%-10s%-8s%-12s%-12s%-10s%s\n","准考证号", "姓名", "客观题得分", "操作题得分", "总分", "结果");
 95     for (i = 0; i < n; i++)
 96     {
 97         fprintf(fout, "%-10ld%-8s%-12.2f%-12.2f%-10.2f%s\n",
 98             st[i].id, st[i].name, st[i].objective, st[i].subjective, st[i].sum, st[i].result);
 99     }
100     fclose(fout);
101 }
View Code

 

截图屏幕截图 2026-06-23 210127

 

task6

代码

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <time.h>
  5 #include <string.h>
  6 
  7 #define MAX_STU 80   // 最多80名学生
  8 #define DRAW_NUM 5   // 抽取5人
  9 
 10 typedef struct {
 11     long id;        // 学号
 12     char name[20];  // 姓名
 13     char cls[30];   // 班级
 14 } STU;
 15 
 16 int readAllStudent(STU arr[]);
 17 void getRandomIndex(int index[], int total);
 18 void printWinner(STU all[], int idx[]);
 19 void saveWinner(STU all[], int idx[], char filename[]);
 20 
 21 int main(void)
 22 {
 23     STU student[MAX_STU];
 24     int totalStu;       // 文件里总学生数
 25     int winIndex[DRAW_NUM]; // 存放中奖学生下标
 26     char fileName[50];  // 自定义输出文件名
 27 
 28     totalStu = readAllStudent(student);
 29     if (totalStu < DRAW_NUM)
 30     {
 31         printf("学生总数不足5人,无法抽奖!\n");
 32         return 1;
 33     }
 34 
 35     getRandomIndex(winIndex, totalStu);
 36 
 37     printf("----------------中奖名单----------------\n");
 38     printWinner(student, winIndex);
 39     printf("----------------------------------------\n");
 40 
 41     printf("输入文件名:");
 42     scanf("%s", fileName);
 43 
 44     saveWinner(student, winIndex, fileName);
 45     printf("保存成功!\n");
 46 
 47     return 0;
 48 }
 49 
 50 int readAllStudent(STU arr[])
 51 {
 52     FILE* fp = fopen("list.txt", "r");
 53     if (fp == NULL)
 54     {
 55         printf("打开list.txt失败,请检查文件!\n");
 56         exit(1);
 57     }
 58     int count = 0;
 59     while (fscanf(fp, "%ld %s %s", &arr[count].id, arr[count].name, arr[count].cls) == 3)
 60     {
 61         count++;
 62     }
 63     fclose(fp);
 64     return count;
 65 }
 66 
 67 void getRandomIndex(int index[], int total)
 68 {
 69   
 70     srand((unsigned)time(NULL));
 71     int i, j, randNum;
 72     for (i = 0; i < DRAW_NUM; )
 73     {
 74         randNum = rand() % total; // 生成0~total-1随机下标
 75         
 76         int repeat = 0 77         for (j = 0; j < i; j++)
 78         {
 79             if (index[j] == randNum)
 80             {
 81                 repeat = 1;
 82                 break;
 83             }
 84         }
 85     
 86         if (!repeat)
 87         {
 88             index[i] = randNum;
 89             i++;
 90         }
 91     }
 92 }
 93 
 94 
 95 void printWinner(STU all[], int idx[])
 96 {
 97     for (int i = 0; i < DRAW_NUM; i++)
 98     {
 99         int pos = idx[i];
100         printf("%ld\t%s\t%s\n", all[pos].id, all[pos].name, all[pos].cls);
101     }
102 }
103 
104 
105 void saveWinner(STU all[], int idx[], char filename[])
106 {
107     FILE* fp = fopen(filename, "w");
108     if (fp == NULL)
109     {
110         printf("文件创建失败!\n");
111         exit(1);
112     }
113     for (int i = 0; i < DRAW_NUM; i++)
114     {
115         int pos = idx[i];
116         fprintf(fp, "%ld\t%s\t%s\n", all[pos].id, all[pos].name, all[pos].cls);
117     }
118     fclose(fp);
View Code

 

截图屏幕截图 2026-06-23 211045

遇到的问题:在验证性实验时,没有解压缩文件导致找不到生成的文件,询问老师过后成功解决;在实验五时输出的文本中文乱码了,查询资料发现是文本保存类型不一致导致的乱码,最后成功解决;还有一些其他问题在与ai互动过后成功解决。

posted @ 2026-06-23 21:51  幼稚园·小廿  阅读(2)  评论(0)    收藏  举报