C语言程序设计课程成绩管理系统4结构体变量定义“每位学生包含以下信息:1.学号;u2.姓名,3.考勤(旷课次数)4.课后作业成绩(9次,并求9次平均分)5.大作业成绩(1次);6.期末

C语言程序设计课程成绩管理系统4
结构体变量定义“
每位学生包含以下信息:
1.学号;u
2.姓名,
3.考勤(旷课次数)
4.课后作业成绩(9次,并求9次平均分)
5.大作业成绩(1次);
6.期末考核成绩(1次);
7.学生总评成绩(课后作业成绩*0.15+大作业成绩*015+期末考核成绩*0.7);增加学生e
录入学生信息(学号,姓名);
三、录入学生信息“
·1.录入学生考勤情况;(旷课次数)4
2.录入课后作业成绩并求出平均分;(0.0-100.0)
3.录入大作业成绩;(0.0-100.0)
4.录入期末考核成绩;(0.0-100.0)
5计算总评成绩(课后作业成绩*015+大作业成绩*0.15+期末考核成绩*0.7);四、按照学号(或姓名)查询学生信息“
五、按照学号(或姓名)修改学生信息“
六、打印所有学生信息“

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

#define MAX_STUDENTS 100
#define FILENAME "cj.txt"

/*完整代码联系我哦:微信:lxt123lxp456*/

void addStudent(Student students[], int *numStudents);
void inputAttendance(Student *student);
void inputHomework(Student *student);
void inputProject(Student *student);
void inputFinalExam(Student *student);
void calculateTotalScore(Student *student);
void printStudentInfo(Student student);
void searchStudent(Student students[], int numStudents);
void modifyStudent(Student students[], int numStudents);
void printAllStudents(Student students[], int numStudents);
void saveDataToFile(Student students[], int numStudents);
void loadDataFromFile(Student students[], int *numStudents);

/*完整代码联系我哦:微信:lxt123lxp456*/

void addStudent(Student students[], int *numStudents) {
	if (*numStudents >= MAX_STUDENTS) {
		printf("学生人数已达到最大限制。\n");
		return;
	}
	
	Student newStudent;
	
	printf("请输入学生学号:");
	scanf("%d", &newStudent.studentId);
	printf("请输入学生姓名:");
	scanf("%s", newStudent.name);
	
	inputAttendance(&newStudent);
	inputHomework(&newStudent);
	inputProject(&newStudent);
	inputFinalExam(&newStudent);
	calculateTotalScore(&newStudent);
	
	students[*numStudents] = newStudent;
	(*numStudents)++;
	
	printf("学生信息添加成功!\n");
}

void inputAttendance(Student *student) {
	printf("请输入学生考勤情况(旷课次数):");
	scanf("%d", &(student->absence));
}

void inputHomework(Student *student) {
	float totalScore = 0.0;
	
	printf("请输入学生的9次课后作业成绩:\n");
	for (int i = 0; i < 9; i++) {
		printf("第%d次成绩:", i + 1);
		scanf("%f", &(student->homework[i]));
		totalScore += student->homework[i];
	}
	
	student->homework[9] = totalScore / 9;
}

void inputProject(Student *student) {
	printf("请输入学生的大作业成绩:");
	scanf("%f", &(student->project));
}

void inputFinalExam(Student *student) {
	printf("请输入学生的期末考核成绩:");
	scanf("%f", &(student->finalExam));
}

void calculateTotalScore(Student *student) {
	student->totalScore = student->homework[9] * 0.15 + student->project * 0.15 + student->finalExam * 0.7;
}

void printStudentInfo(Student student) {
	printf("学号:%d\n", student.studentId);
	printf("姓名:%s\n", student.name);
	printf("考勤次数:%d\n", student.absence);
	printf("课后作业平均分数:%f\n", student.homework[9]);
	printf("大作业成绩:%f\n", student.project);
	printf("期末考核成绩:%f\n", student.finalExam);
	printf("总评成绩:%f\n", student.totalScore);
	printf("------------------------------\n");
}

void searchStudent(Student students[], int numStudents) {
	char searchString[50];
	int found = 0;
	
	printf("请输入要查询的学生学号或姓名:");
	scanf("%s", searchString);
	
	for (int i = 0; i < numStudents; i++) {
		Student student = students[i];
		
		if (strcmp(student.name, searchString) == 0 || student.studentId == atoi(searchString)) {
			printStudentInfo(student);
			found = 1;
		}
	}
	
	if (!found) {
		printf("未找到符合查询条件的学生。\n");
	}
}

void modifyStudent(Student students[], int numStudents) {
	char searchString[50];
	int found = 0;
	
	printf("请输入要修改的学生学号或姓名:");
	scanf("%s", searchString);
	
	for (int i = 0; i < numStudents; i++) {
		Student *student = &(students[i]);
		
		if (strcmp(student->name, searchString) == 0 || student->studentId == atoi(searchString)) {
			printf("学生信息已找到:\n");
			printStudentInfo(*student);
			
			printf("请输入修改后的考勤次数:");
			scanf("%d", &(student->absence));
			
			inputHomework(student);
			inputProject(student);
			inputFinalExam(student);
			calculateTotalScore(student);
			
			printf("学生信息修改成功!修改后的信息如下:\n");
			printStudentInfo(*student);
			
			found = 1;
		}
	}
	
	if (!found) {
		printf("未找到符合查询条件的学生。\n");
	}
}

void printAllStudents(Student students[], int numStudents) {
	if (numStudents == 0) {
		printf("暂无学生信息。\n");
		return;
	}
	
	printf("学生信息如下:\n");
	for (int i = 0; i < numStudents; i++) {
		printf("学生%d\n", i + 1);
		printStudentInfo(students[i]);
	}
}
void saveDataToFile(Student students[], int numStudents) {
	FILE *fp;
	fp = fopen("cj.txt", "w"); // 打开文件以写入数据
	
	if (fp == NULL) {
		printf("无法打开文件!\n");
		return;
	}
	
	for (int i = 0; i < numStudents; i++) {
		fprintf(fp, "%d %s %d ", students[i].studentId, students[i].name, students[i].absence);
		
		for (int j = 0; j < 9; j++) {
			fprintf(fp, "%.2f ", students[i].homework[j]);
		}
		
		fprintf(fp, "%.2f %.2f %.2f\n", students[i].project, students[i].finalExam, students[i].totalScore);
	}
	
	fclose(fp);
}
void loadDataFromFile(Student students[], int *numStudents) {
	FILE *fp;
	fp = fopen("cj.txt", "r"); // 打开文件以读取数据
	
	if (fp == NULL) {
		printf("无法打开文件!\n");
		return;
	}
	
	*numStudents = 0;
	while (fscanf(fp, "%d %s %d", &students[*numStudents].studentId, students[*numStudents].name, &students[*numStudents].absence) != EOF) {
		for (int i = 0; i < 9; i++) {
			fscanf(fp, "%f", &students[*numStudents].homework[i]);
		}
		
		fscanf(fp, "%f %f %f", &students[*numStudents].project, &students[*numStudents].finalExam, &students[*numStudents].totalScore);
		
		(*numStudents)++;
	}
	
	fclose(fp);
}

报告:

void add(Student students[], int *numStudents) 

用于向学生数组中添加新的学生信息。它接受一个学生数组 students[] 和一个指向 numStudents 的指针,numStudents 用于追踪当前学生数组中的学生数量。

首先,它会检查学生数量是否已达到最大限制 (MAX_STUDENTS),如果是,则打印一条提示信息并返回,表示无法再添加更多的学生。

然后,它创建一个新的学生结构体变量 newStudent,用于存储待添加的学生信息。

接下来,通过用户输入,要求用户依次输入学生的学号和姓名,并将这些信息赋值给 newStudent 的相应属性。

然后,它调用一系列辅助函数,如 inputAttendance、inputHomework、inputProject、inputFinalExam 和 calculateTotalScore,用于输入新学生的考勤情况、作业成绩、项目成绩、期末考试成绩,并计算总分。这些函数的具体实现在此代码段中没有给出,但可以在其他地方找到它们。

接着,将新学生的信息存储在学生数组 students 的下一个可用位置中,然后将 numStudents 的值增加1,以表示学生数量增加了一个。

最后,会打印一条表示学生信息添加成功的提示信息。

总的来说,这个函数的功能是允许用户输入新学生的信息并将其添加到学生数组中。

void inputAttendance(Student *student)  

void inputHomework(Student *student)

void inputProject(Student *student) 

void inputFinalExam(Student *student)

void calculateTotalScore(Student *student) 

首先,inputAttendance 函数要求用户输入学生的考勤情况,即旷课次数,并将该值存储在学生结构体的 absence 成员中。

接下来,inputHomework 函数要求用户输入学生的9次课后作业成绩。它通过一个循环,依次提示用户输入每次作业的成绩,并将这些成绩存储在学生结构体的 homework 数组中。同时,它计算所有作业成绩的总和,并将平均值存储在 homework 数组的最后一个元素位置(索引为9)中。

然后,inputProject 函数要求用户输入学生的大作业成绩,并将该值存储在学生结构体的 project 成员中。

接着,inputFinalExam 函数要求用户输入学生的期末考核成绩,并将该值存储在学生结构体的 finalExam 成员中。

最后,calculateTotalScore 函数用于计算学生的总分。它通过将作业成绩占比的0.15、大作业成绩占比的0.15以及期末考核成绩占比的0.7相加,得到学生的总分,并将该值存储在学生结构体的 totalScore 成员中。

总体而言,这些函数在添加学生信息时,分别用于输入学生的考勤情况、课后作业成绩、大作业成绩和期末考核成绩,并计算学生的总分。这些信息将被保存在学生结构体中,以便后续的处理和分析。

void search(Student students[], int numStudents) 

这个函数用于在学生数组中搜索符合查询条件的学生信息。它接收一个学生数组 students[] 和学生数量 numStudents 作为参数。

首先,函数会提示用户输入要查询的学生学号或姓名,并将输入的字符串存储在 searchString 数组中。

然后,函数通过一个循环遍历学生数组,逐个比较每个学生的姓名和学号是否与搜索字符串匹配。它使用 strcmp 函数比较学生的姓名与搜索字符串是否相同,使用 == 运算符比较学生的学号与搜索字符串的整数表示形式是否相同(通过 atoi 函数将字符串转换为整数)。如果找到了匹配的学生,它会调用 printStudentInfo 函数打印该学生的信息,并将 found 设置为1。

如果循环结束后仍未找到匹配的学生,即 found 保持为0,则打印 "未找到符合查询条件的学生。" 的消息提示。

因此,这个函数用于根据用户输入的学号或姓名,在给定的学生数组中进行搜索,并将查找到的学生信息打印出来。如果没有找到符合查询条件的学生,它会给出相应的提示。

void modify(Student students[], int numStudents) 

这个函数用于修改学生数组中符合查询条件的学生的信息。它接收一个学生数组 students[] 和学生数量 numStudents 作为参数。

首先,函数会提示用户输入要修改的学生的学号或姓名,并将输入的字符串存储在 searchString 数组中。

然后,函数通过一个循环遍历学生数组,在每次迭代中,它将学生的指针赋值给 student,这样可以直接修改学生的信息。

在循环中,函数会检查当前学生的姓名和学号是否与搜索字符串匹配。如果找到匹配的学生,它会打印出学生的信息,并提示用户输入修改后的考勤次数。接着,它调用其他函数(例如 inputHomework、inputProject、inputFinalExam 和 calculateTotalScore)来输入和计算其他方面的学生信息。

修改完成后,函数会打印出学生信息修改成功的消息,并再次打印修改后的学生信息。

如果循环结束后仍未找到匹配的学生,即 found 保持为0,则打印 "未找到符合查询条件的学生。" 的消息提示。

因此,这个函数用于根据用户输入的学号或姓名,在给定的学生数组中查找并修改符合条件的学生的信息。如果找到学生并成功修改,它将输出修改后的学生信息。如果没有找到符合查询条件的学生,它会给出相应的提示。

void saveData(Student students[], int numStudents) 

void loadData(Student students[], int *numStudents) 

saveData 函数用于将学生数组中的数据保存到文件 "cj.txt" 中。

首先,函数打开文件 "cj.txt" 以写入数据,并检查文件是否成功打开。如果无法打开文件,则输出错误消息并返回。

接下来,函数使用一个循环遍历学生数组中的每个学生。对于每个学生,函数使用 fprintf 函数将学生的学号、姓名、考勤次数以及作业、项目、期末考试和总分依次写入文件中。作业的成绩使用 "%.2f" 的格式进行写入,保留两位小数。

最后,函数关闭文件,完成数据保存操作。

loadData 函数用于从文件 "cj.txt" 中加载数据并填充到学生数组中。

首先,函数打开文件 "cj.txt" 以读取数据,并检查文件是否成功打开。如果无法打开文件,则输出错误消息并返回。

接下来,函数初始化 numStudents 为 0,表示学生数组中的学生数量。

然后,函数使用一个循环从文件中读取数据,直到遇到文件结尾(EOF)。在每次循环迭代中,函数使用 fscanf 函数依次读取学生的学号、姓名、考勤次数以及作业、项目、期末考试和总分,并将这些数据存储到对应的学生结构体中。作业的成绩读取为浮点数。

最后,函数递增 numStudents 数值,并在循环结束后关闭文件。这样,学生数组就成功地加载了来自文件的数据。

综上所述,saveData 函数用于将学生数组中的数据保存到文件中,而 loadData 函数用于从文件中加载数据到学生数组中。这两个函数的配合使用可以实现学生数据的持久化存储和恢复。


完整代码联系我哦:微信:lxt123lxp456  制作不易  伸手党勿扰

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值