#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100
#define NAME_MAX_LEN 100 // 假设姓名最长为100个字符
#define FILE_NAME "D:\\高级语言程序设计\\实验二\\experiment1\\experiment1\\student.txt"
// 存储学生信息的结构体
struct Student {
int id; // 学号
char name[NAME_MAX_LEN]; // 姓名
int nameLen; // 姓名长度
char sex; // 性别
double scores[3]; // 3门课的成绩
double avgScore; // 平均成绩
double totalScore; // 总成绩
};
int count_chars(char* line) { // 统计一行的字符数
int count = 0;
while (*line != '\0' && *line != '\n') { // 遍历整行字符
count++;
line++;
}
return count;
}
// 计算学生信息
void calcStudentInfo(struct Student* stu) {
double total = stu->scores[0] + stu->scores[1] + stu->scores[2];
stu->avgScore = total / 3.0;
stu->totalScore = total;
}
int main() {
struct Student students[MAX_STUDENT_NUM] ; // 存储学生信息
int n, i;
FILE* fp = fopen(FILE_NAME, "w");;
int count[100] = { 0 };
printf("请输入学生数:\n");
scanf("%d", &n);
printf("请输入学生信息:\n");
for (i = 0; i < n; i++) {
printf("No.%d 学号:", i + 1);
scanf("%d", &students[i].id);
printf("No.%d 姓名:", i + 1);
getchar(); // 吃掉上一次输入留下的回车符
gets_s(students[i].name);//这边为了不接受回车不能用fgets
count[i] = count_chars(students[i].name);
// students[i].nameLen = strlen(students[i].name) - 1; // 记录姓名长度,去掉回车符
printf("No.%d 性别:", i + 1);
scanf("%c", &students[i].sex);
printf("No.%d 3门课成绩:", i + 1);
scanf("%lf %lf %lf", &students[i].scores[0], &students[i].scores[1], &students[i].scores[2]);
calcStudentInfo(&students[i]); // 计算学生信息
}
// 将学生信息写入文件
fp = fopen(FILE_NAME, "w");
for (i = 0; i < n; i++) {
fprintf(fp, "%d %d %s %c %.2lf %.2lf %.2lf\n", students[i].id, count[i], students[i].name, students[i].sex, students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].avgScore, students[i].totalScore);
}
fclose(fp);
printf("学生信息已写入文件 %s 中\n", FILE_NAME);
return 0;
}
文件操作`
于 2023-03-25 16:58:36 首次发布