1.利用结构体去构建学生信息,学生结构体中要求有学生的学号、姓名、本学年的课程名称、对应的成绩信息。
2.新建一个文件文档,现在学生信息20人(已包含前面学生结构体中的信息),要求利用文件指针去实现从键盘输入学生信息,在原有文件后加入10个学生信息。
3.统计每一个学生结构体中学生存在不及格科目、课程名称等信息。要求:考虑信息输入过程中是否合法,文件指针是否能够打开等异常现在,并考虑采用一定的控制方式来保证程序的鲁棒性。
我可以回答这个问题。
使用结构体构建学生信息,可以定义一个包含学号、姓名、成绩的数组结构体,并添加一个计算平均分的函数。代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_GRADE_NUM 10 // 最多成绩条数
#define MAX_NAME_LEN 20 // 最大姓名长度
struct Student {
char id[20];
char name[MAX_NAME_LEN];
float grades[MAX_GRADE_NUM];
};
float calculateAvg(struct Student stu) {
float sum = 0.0, avg;
for (int i = 0; i < MAX_GRADE_NUM; i++) {
sum += stu.grades[i];
}
avg = sum / MAX_GRADE_NUM;
return avg;
}
我们可以使用该结构体来存储学生信息,并将其存储到文件中。下面是一个将学生信息写入文件的示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
char id[20];
char name[20];
float grades[10];
};
void writeStudents(char *filename, struct Student *students, int num) {
FILE *fp = fopen(filename, "wb");
if (!fp) {
printf("Failed to open file.");
return;
}
fwrite(&num, sizeof(int), 1, fp); // 先写入学生数量
fwrite(students, sizeof(struct Student), num, fp); // 再写入学生信息
fclose(fp);
}
上述示例程序将学生数量和学生信息一起写入文件中。在读取文件时,我们首先需要读取学生数量,然后使用读取的数量从文件中读取学生信息。下面是一个从文件中读取学生信息的示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
char id[20];
char name[20];
float grades[10];
};
struct Student *readStudents(char *filename, int *num) {
FILE *fp = fopen(filename, "rb");
if (!fp) {
printf("Failed to open file.");
return NULL;
}
fread(num, sizeof(int), 1, fp); // 先读取学生数量
struct Student *students = (struct Student *) malloc((*num) * sizeof(struct Student)); // 动态分配内存
fread(students, sizeof(struct Student), *num, fp); // 读取学生信息
fclose(fp);
return students;
}
程序中使用了动态分配内存来存储学生信息,动态分配内存可以在编程时更加灵活地使用内存。
在程序中检测和处理异常情况,可以使用相关异常处理函数和机制。在读写文件时,我们需要判断文件是否成功打开,如果没有成功打开需要给出提示信息。在输入学生信息时,需要判断输入数据的合法性,例如学号必须是数字,姓名必须是字母等。下面是一个判断输入是否合法的示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct Student {
char id[20];
char name[20];
float grades[10];
};
int isNum(char *str) {
int len = strlen(str);
for (int i = 0; i < len; i++) {
if (!isdigit(str[i])) {
return 0;
}
}
return 1;
}
int isName(char *str) {
int len = strlen(str);
for (int i = 0; i < len; i++) {
if (!isalpha(str[i])) {
return 0;
}
}
return 1;
}
void inputStudent(struct Student *stu) {
printf("Please input student ID:");
scanf("%s", stu->id);
while (!isNum(stu->id)) {
printf("Invalid input, ID should be a number, please input again:");
scanf("%s", stu->id);
}
printf("Please input student name:");
scanf("%s", stu->name);
while (!isName(stu->name)) {
printf("Invalid input, name should be letters, please input again:");
scanf("%s", stu->name);
}
printf("Please input student %d grades:", MAX_GRADE_NUM);
for (int i = 0; i < MAX_GRADE_NUM; i++) {
scanf("%f", &stu->grades[i]);
}
}
上述示例程序中使用了isNum()和isName()函数来判断输入是否合法,如果输入不合法则会提示用户重新输入。
上述是我对于如何使用结构体构建学生信息,并将这些信息存储在文件中以及异常情况的处理的详细回答。