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 を追加して
生徒情報 (生徒番号、名前) を入力します;
3. 生徒情報を入力します」
· 1. 生徒の出席状況を入力; (欠席回数) 4
2. 授業後の宿題の得点を入力し、平均点を求める; (0.0-100.0 )
3. 主要な宿題の得点を入力; (0.0-100.0)
4. 最終評価の得点を入力; (0.0-100.0)
5 総合評価の得点を計算します (授業後の宿題の得点 * 015 + 主要な宿題の得点) * 0.15 + 最終評価スコア * 0.7); 4. 学生番号 (または名前) に従って学生情報をクエリする "
5. 学生番号 (または名前) に従って学生情報を変更する"
6. すべての学生情報を印刷する"

#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[]と、現在のstudent配列内の学生の数を追跡するために使用されるnumStudentsへのポインタを受け入れます。

まず、生徒数が最大制限 (MAX_STUDENTS) に達しているかどうかを確認し、達している場合は、これ以上生徒を追加できないことを示すプロンプト メッセージを出力して戻ります。

次に、追加する学生情報を格納するための新しい学生構造体変数 newStudent を作成します。

次に、ユーザー入力を通じて、ユーザーは学生の学生番号と名前を順番に入力し、この情報を newStudent の対応する属性に割り当てる必要があります。

次に、inputAttendance、inputHomework、inputProject、inputFinalExam、calculateTotalScore などの一連の補助関数を呼び出して、新入生の出席状況、宿題の成績、プロジェクトの成績、最終試験の成績を入力し、合計スコアを計算します。これらの関数の具体的な実装はこのスニペットでは示されていませんが、他の場所で見つけることができます。

次に、新しい生徒の情報が、students 配列 students の次に利用可能な場所に保存され、numStudents の値が 1 増加して、生徒の数が 1 人増えたことを示します。

最後に、生徒情報が正常に追加されたことを示すプロンプト メッセージが出力されます。

全体として、この関数の役割は、ユーザーが新しい学生に関する情報を入力し、それを Students 配列に追加できるようにすることです。

void  inputAttendance ( Student  * Student )  

void  input 宿題(学生 *学生)

void  inputProject ( Student  * Student ) 

void  inputFinalExam ( Student  * Student )

void  CalculateTotalScore ( Student  * Student ) 

まず、inputAttendance 関数は、ユーザーに学生の出席ステータス、つまり欠席回数を入力するように要求し、その値を Student 構造体の不在メンバーに格納します。

次に、input宿題関数では、ユーザーが生徒の 9 つの宿題スコアを入力する必要があります。これはループを通過して、ユーザーに各課題の成績の入力を促し、これらの成績を学生構造の宿題配列に保存します。同時に、すべての宿題の成績の合計を計算し、平均値を宿題配列の最後の要素位置 (インデックス 9) に保存します。

次に、inputProject 関数はユーザーに生徒の課題の成績を入力するように要求し、その値を Student 構造体のプロジェクト メンバーに保存します。

次に、inputFinalExam 関数はユーザーに学生の最終試験の成績を入力するように要求し、この値を Student 構造体の FinalExam メンバーに格納します。

最後に、calculateTotalScore 関数を使用して生徒の合計スコアを計算します。課題の成績の割合の 0.15、主要課題の成績の割合の 0.15、および最終評価の成績の割合の 0.7 を加算して学生の合計スコアを取得し、この値を Student 構造体の totalScore メンバーに格納します。

一般に、学生情報を追加する場合、これらの関数は学生の出席状況、授業後の宿題の得点、主な宿題の得点、最終評価の得点を入力し、学生の合計得点を計算するために使用されます。この情報は、その後の処理と分析のために学生構造に保存されます。

void 検索( Student students [],  int  numStudents ) 

この関数は、student 配列内のクエリ条件を満たす学生情報を検索するために使用されます。これは、students[] の配列と学生の数 numStudents をパラメータとして受け取ります。

まず、この関数はユーザーに、クエリする学生番号または名前の入力を求め、入力された文字列を searchString 配列に保存します。

次に、関数は Student 配列をループし、各生徒の名前と生徒番号を 1 つずつ比較して、検索文字列と一致するかどうかを確認します。strcmp 関数を使用して学生の名前が検索文字列と同じかどうかを比較し、== 演算子を使用して学生の学生番号が検索文字列の整数表現と同じかどうかを比較します (atoi 関数は文字列を変換します)整数に変換します)。一致する学生が見つかった場合は、printStudentInfo 関数を呼び出して学生の情報を出力し、見つかった値を 1 に設定します。

ループ終了後、一致する生徒が見つからなかった場合、つまり見つかった値が 0 のままの場合、「クエリ条件に一致する生徒が見つかりませんでした。」というメッセージが出力されます。

したがって、この関数は、ユーザーが入力した学生番号または名前に基づいて特定の学生配列を検索し、見つかった学生情報を出力するために使用されます。クエリ条件に一致する学生が見つからない場合は、対応するプロンプトが表示されます。

void  edit ( Student students [],  int  numStudents ) 

この関数は、クエリ条件を満たす学生配列内の学生の情報を変更するために使用されます。これは、students[] の配列と学生の数 numStudents をパラメータとして受け取ります。

まず、この関数は、変更する学生の学生番号または名前を入力するようユーザーに求め、入力された文字列を searchString 配列に保存します。

次に、関数はループを通じて Student 配列を走査し、各反復で Student ポインタを Student に割り当て、生徒の情報を直接変更できるようにします。

ループ内で、関数は現在の学生の名前と学生番号が検索文字列と一致するかどうかを確認します。一致する学生が見つかった場合は、その学生の情報が印刷され、変更された出席回数を入力するようユーザーに求められます。次に、他の関数 (inputHome、inputProject、inputFinalExam、calculateTotalScore など) を呼び出して、生徒情報の他の側面を入力および計算します。

変更が完了すると、学生情報が正常に変更されたことを示すメッセージが出力され、変更された学生情報が再度出力されます。

ループ終了後、一致する生徒が見つからなかった場合、つまり見つかった値が 0 のままの場合、「クエリ条件に一致する生徒が見つかりませんでした。」というメッセージが出力されます。

したがって、この関数は、ユーザーが入力した学生番号または名前に基づいて、特定の学生配列内の資格のある学生の情報を検索および変更するために使用されます。生徒が見つかり、変更が成功すると、変更された生徒の情報が出力されます。クエリ条件に一致する学生が見つからない場合は、対応するプロンプトが表示されます。

void  saveData ( Student students [],  int  numStudents ) 

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

saveData 関数は、student 配列のデータをファイル「cj.txt」に保存するために使用されます。

まず、データ書き込み用ファイル「cj.txt」をオープンし、ファイルが正常にオープンするかどうかを確認します。ファイルを開けない場合は、エラー メッセージが出力されて返されます。

次に、関数はループを使用して、students 配列内の各学生を反復処理します。この関数は fprintf 関数を使用して、学生の学生番号、名前、出席回数、課題、プロジェクト、期末試験、合計得点を順番にファイルに書き込みます。課題の成績は「%.2f」の小数点以下2桁の形式で記述されます。

最後に、この関数はファイルを閉じて、データの保存操作を完了します。

loadData 関数は、ファイル「cj.txt」からデータをロードし、students 配列にデータを埋めるために使用されます。

まず、ファイル「cj.txt」を開いてデータを読み込み、ファイルが正常に開くかどうかを確認します。ファイルを開けない場合は、エラー メッセージが出力されて返されます。

次に、関数は numStudents を 0 に初期化します。これは、students 配列内の学生の数を表します。

次に、この関数はループを使用して、ファイルの終わり (EOF) に達するまでファイルからデータを読み取ります。各ループ反復で、関数は fscanf 関数を使用して学生の学生番号、名前、出席時間、課題、プロジェクト、最終試験、および合計スコアを順番に読み取り、これらのデータを対応する学生構造に保存します。課題の評定は浮動小数点数として読み取られます。

最後に、関数は numStudents 値をインクリメントし、ループの終了後にファイルを閉じます。このようにして、students 配列にファイルからのデータが正常にロードされます。

要約すると、saveData 関数は Student 配列のデータをファイルに保存するために使用され、loadData 関数はファイルから Student 配列にデータをロードするために使用されます。これら 2 つの機能を組み合わせて使用​​すると、生徒データの永続的な保存と復元を実現できます。


完全なコードについては、WeChat: lxt123lxp456 までお問い合わせください。作成するのは簡単ではありません。ご連絡いただいても、邪魔しないでください。

 

おすすめ

転載: blog.csdn.net/qq_62088638/article/details/134321467