实验七
已完成前面三个验证性实验
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 }

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

浙公网安备 33010602011771号