ユニークだから いつも同じだから
記事ディレクトリ
序文:
生徒の成績管理システムには、教師ログイン ポータルと生徒ログイン ポータルが含まれており、生徒情報の追加、削除、検索、ランク付け、保存などを行うことができます。
1. 学生の成績管理システムの紹介
プロジェクトは、4 つの .c ソース ファイルと 1 つの .h ヘッダー ファイルの 5 つのファイルに分割されています。
test.c プロジェクト実装の全体的な枠組みやスコア管理システムの初期ログインインターフェースなど。
Student Management System.cは、 教師システムと生徒システムのログインインターフェースとシステムメンバーデータの初期化を実現します。
Stu_System.c は 学生ログイン システムなどの関連機能を実装します。
Teacher.c は 教師ログインシステムなどの関連機能を実装します。
Student Management System.h に は、プロジェクト内のさまざまなヘッダー ファイル、#define で定義された定数変数、関数、構造体宣言などが格納されます。
コンパイルとリンクが統合された翻訳環境を使用することをお勧めします。
推奨環境:
C/C++ コンパイラ (Visual Studio 2017 以降、Dev-C++、Visual Studio Code など)
学生成績管理システムの概要
成績管理システムには、教師用入口と生徒用入口の2つのログイン入口があります。
学生の成績情報には、学生の名前、年齢、性別、学生番号、専攻、学年が含まれます。
教師システムでは生徒情報の追加、生徒情報の削除、生徒情報の照会、生徒の総合ランキングの表示が可能であり、生徒システムでは入力された生徒情報やランキングなどを表示できます。教師が生徒を追加するたびに、生徒の成績管理システムを終了した後、プログラムは生徒の情報をバイナリ テキスト形式の txt ファイルとして自動的に保存します。生徒の一部またはすべての情報は完全に削除されます。
学生の成績管理システムの操作インターフェース
2. 生徒の成績管理システムの設計思想
まず第一に、システム インターフェイスをカプセル化する必要があります。これは比較的単純です。間隔を制御するだけでよく、printf を使用してそれを実現できます。次に、switch...case ステートメントを使用して、教師がログインするかどうかを選択します。または、生徒がログインし、do...while ループを使用してシステムをカプセル化し、教師システムと生徒システムで同様の printf、switch...case 選択ステートメント、および do を複数回使用できるようにします。 ...while ループは、対応する選択関数を実現するためにも使用されます。
2 番目は、学生システムの初期化です。メモリを節約し、システムの動作効率を最大化するために、プロジェクトでは動的メモリ管理方法が使用されています。初期化時に、動的メモリ機能を使用して 3 つの学生スペースが開きます。後で、学生の数が増えるにつれて、システム スペースがいっぱいになったら、さらに 2 つの学生スペースを開き、いっぱいになった後も開き続ける、というように、毎回さらに 2 つの学生スペースだけを開きます。ここで動的メモリ管理を使用すると、メモリの過度の浪費を回避できます。
次に、教師は情報の入力、生徒の削除などを行います。scanf関数を使用して直接入力することもできますが、生徒情報を削除するにはまず生徒を検索する必要があるため、生徒名で生徒情報を検索する関数を別途パッケージ化する必要がありますが、これは後々の利用にも便利です生徒情報を確認する場合 生徒を見つけたら、その生徒を次の生徒のデータで上書きし、その後の入力で前の情報を上書きし、最後に生徒数を1減らします。 memset関数を使用して完了します。
生徒の成績をランキングする機能もあり、教師システムと生徒システムのランキングにランキングが表示される必要があります。学生情報が構造内にあるため、 qsort クイックソート関数を使用して完了することをお勧めしますが、qsort 関数を元の昇順から降順に変更する必要があります。
最後に、生徒情報を保存してロードします。プロジェクト全体の最後に、ファイルに書き込むステートメントを追加し、rwrite 関数を使用して生徒情報を 1 つずつファイルに書き込むことができます。ファイル内のバイナリ生徒情報のロードは、読み取ったファイルを個別にカプセル化することによって行われます。生徒情報を初期化する際に生徒データを読み込むファイル機能。ファイルの読み取りおよび書き込みにはバイナリ方式が使用され、学生情報の漏洩を防ぎます。
3. ソースコード
1.test.c _
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"
void menu()
{
printf("————————————————————————————————————————————————————————————————\n");
printf(" 学生成绩管理系统 \n");
printf("————————————————————————————————————————————————————————————————\n");
printf(" 1.教师登录 2.学生登录 \n");
printf(" 0.退出系统 \n");
printf("————————————————————————————————————————————————————————————————\n");
}
int main()
{
int input = 0;
System Mge;
Init_System(&Mge);
int ret = 0;
do
{
menu();
printf("请选择:-> ");
scanf("%d", &input);
switch (input)
{
case 1:
//进入教师系统
Teacher_System(&Mge);
break;
case 2:
Stu_System(&Mge);
break;
case 3:
break;
case 0:
break;
default:
break;
}
} while (input);
return 0;
}
2. 学生管理システム.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"
int Increase_Capacity2(System* Mge)//先判断是否够
{
assert(Mge);
if (Mge->sz == Mge->Max_Space)
{
Stu* tmp = (Stu*)realloc(Mge->data, (Mge->Max_Space + Add_Connt) * sizeof(Stu));
if (Mge->data == NULL)
{
perror("realloc");
return 1;
}
Mge->data = tmp;
Mge->Max_Space += Add_Connt; /*printf("增容成功\n");*/
return 0;
}
else
return 0;
}
void Load_Sy(System* Mge)
{
assert(Mge);
FILE* pf = fopen("data.txt", "rb");
if (pf == NULL)
{
return;
}
else
{
Stu tmp = { 0 };
while (fread(&tmp, sizeof(Stu), 1, pf))
{
if (1 == Increase_Capacity2(Mge))
return;//开辟失败
else
{
Mge->data[Mge->sz] = tmp;
Mge->sz +=1;
}
}
}
fclose(pf);
pf = NULL;
}
void Menu_Teacher()
{
printf("\n—————————— 教师系统 ————————————\n");
printf(" 1.录入学生信息 2.删除学生信息 \n");
printf(" 3.显示所有学生信息 4.查看排名 \n");
printf(" 5.查询学生信息 6.一键删除所有学生信息 \n");
printf(" 0.退出教师系统 \n");
printf("————————————————————————————————————————————————————————————————\n");
}
void Menu_Stu()
{
printf("\n—————————— 学生系统 ————————————\n");
printf(" 1.查看我的信息 \n");
printf(" 0.退出学生系统 \n");
printf("————————————————————————————————————————————————————————————————\n");
}
void Init_System(System* Mge)
{
//初始化系统
assert(Mge);
Mge->data = (Stu*)malloc(Inti_Data * sizeof(Stu));//初始化三个学生的空间
if (Mge->data == NULL)
{
perror("malloc");
return;
}
else
{
Mge->sz=0;
Mge->Max_Space = Inti_Data;
//加载通讯录
Load_Sy(Mge);
}
}
void Teacher_System(System* Mge)//教师系统
{
assert(Mge);
int input = 0;
do
{
Menu_Teacher();
printf("请选择:->");
scanf("%d", &input);
switch (input)
{
case 1:
Add_Stu(Mge);//增加学生信息
break;
case 2:
Del_Stu(Mge);//删除学生信息
break;
case 3:
Show_Stu(Mge);//打印
break;
case 4:
Sort(Mge);//查看排名
break;
case 5:
SearchStu(Mge);//查找学生
break;
case 6:
Del_Exit(Mge);//删除所有信息
break;
case 0:
De_System(Mge);
break;
default:
printf("退出教师系统\n");
break;
}
} while (input);
}
void Stu_System(System* Mge)
{
assert(Mge);
int input = 0;
do
{
Menu_Stu();
printf("请选择:->");
scanf("%d", &input);
switch (input)
{
case 1:
View(Mge);
break;
case 0:
break;
default:
printf("输入错误,请重新输入:");
break;
}
} while (input);
}
3.Stu_System.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"
int FindName1(System* Mge, char* str1)
{
int i = 0;
for (i = 0; i < Mge->sz; i++)
{
if (strcmp(str1, Mge->data[i].Name) == 0)
return i;//找到了
}
return Mge->sz;
}
int Comper2(const void* p1, const void* p2)
{
return(((Stu*)p2)->Garde-(((Stu*)p1)->Garde));
}
void View(System* Mge)
{
assert(Mge);
printf("请输入你的名字:->\n");
char str1[10] = "0";
scanf("%s",str1);
qsort(&(Mge->data[0]), Mge->sz, sizeof(Stu), Comper2);
int i=FindName1(Mge,str1);
if (i == Mge->sz)
{
printf("请检查你的信息是否正确或找老师查询信息是否录入\n");
return;
}
else
{
printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s%5s\n",
"姓名", "年龄", "学号", "性别", "专业", "成绩", "排名");
printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d%5d\n",
Mge->data[i].Name,
Mge->data[i].Age,
Mge->data[i].Id,
Mge->data[i].Sex,
Mge->data[i].Pro,
Mge->data[i].Garde,
i+1);
}
}
4.先生.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"
int FindName(System* Mge,char*str1)
{
assert(Mge && str1);
int i = 0;
for (i = 0; i < Mge->sz; i++)
{
if (strcmp(str1, Mge->data[i].Name) == 0)
return i;//找到了
}
return Mge->sz;
}
int Increase_Capacity(System* Mge)//先判断是否够
{
assert(Mge);
if (Mge->sz == Mge->Max_Space)
{
Stu* tmp = (Stu*)realloc(Mge->data, (Mge->Max_Space + Add_Connt) * sizeof(Stu));
if (Mge->data == NULL)
{
perror("realloc");
return 1;
}
Mge->data = tmp;
Mge->Max_Space += Add_Connt; /*printf("增容成功\n");*/
return 0;
}
else
return 0;
}
void Add_Stu(System* Mge)//录入学生信息
{
assert(Mge);
int z = Increase_Capacity(Mge);
if (z == 1)
printf("增容失败\n");
else//不用增容
{
printf("请输入姓名:\n");
scanf("%s", Mge->data[Mge->sz].Name);
printf("请输入年龄:\n");
scanf("%d",&(Mge->data[Mge->sz].Age));
printf("请输入学号:\n");
scanf("%s",Mge->data[Mge->sz].Id);
printf("请输入性别:\n");
scanf("%s",Mge->data[Mge->sz].Sex);
printf("请输入专业:\n");
scanf("%s",Mge->data[Mge->sz].Pro);
printf("请输入成绩:\n");
scanf("%d",&(Mge->data[Mge->sz].Garde));
Mge->sz += 1;
}
}
void Show_Stu(System* Mge)//打印学生信息
{
assert(Mge);
printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s\n",
"姓名", "年龄", "学号", "性别", "专业","成绩");
int i = 0;
for (i = 0; i < Mge->sz; i++)
{
printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d\n",
Mge->data[i].Name,
Mge->data[i].Age,
Mge->data[i].Id,
Mge->data[i].Sex,
Mge->data[i].Pro,
Mge->data[i].Garde);
}
}
void Del_Stu(System* Mge)//删除学生信息
{
assert(Mge);
printf("请输入你要删除学生的名字:\n");
char str1[10] = "0";
scanf("%s", str1);
//先找到学生
int z=FindName(Mge,str1);
if (z == Mge->sz)
{
printf("未找到该学生\n");
return;
}
else
{
int i = 0;
for (i = z; i < Mge->sz; i++)
{
memmove(&Mge->data[i], &Mge->data[i + 1], sizeof(Stu));
}
Mge->sz--;
}
}
int Comper(const void* p1, const void* p2)
{
return(((Stu*)p2)->Garde - (((Stu*)p1)->Garde));
}
void Sort(System* Mge)
{
assert(Mge);
qsort(&(Mge->data[0]), Mge->sz, sizeof(Stu), Comper);
printf("学生排名为:\n");
printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s%5s\n",
"姓名", "年龄", "学号", "性别", "专业", "成绩","排名");
int i = 0;
for (i = 0; i < Mge->sz; i++)
{
printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d%5d\n",
Mge->data[i].Name,
Mge->data[i].Age,
Mge->data[i].Id,
Mge->data[i].Sex,
Mge->data[i].Pro,
Mge->data[i].Garde
, i+1);
}
}
void SearchStu(System* Mge)
{
assert(Mge);
char str1[15] = "0";
printf("请输入要查找的学生的姓名");
scanf("%s", str1);
int i = FindName(Mge, str1);
if (i == Mge->sz)
{
printf("未找到该学生\n");
return;
}
else
{
printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s\n",
"姓名", "年龄", "学号", "性别", "专业", "成绩");
printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d\n",
Mge->data[i].Name,
Mge->data[i].Age,
Mge->data[i].Id,
Mge->data[i].Sex,
Mge->data[i].Pro,
Mge->data[i].Garde);
}
}
void De_System(System* Mge)//写入文件
{
assert(Mge);
FILE* pf = fopen("data.txt", "wb");
Stu tmp = { 0 };
int i = 0;
for (i = 0; i < Mge->sz; i++)
{
//以二进制的形式写入文件
fwrite(Mge->data + i, sizeof(Stu), 1, pf);
}
//关闭文件
free(Mge->data);
Mge->data = NULL;
fclose(pf);
pf = NULL;
}
void Del_Exit(System* Mge)
{
assert(Mge);
memset(Mge->data, 0, sizeof(Stu) * (Mge->sz));
Mge->sz= 0;
}
5.学生管理システム.h
#pragma once
#define Inti_Data 3
#define Add_Connt 2
#include<stdlib.h>
#include<assert.h>
#include<stdio.h>
#include<string.h>
//学生信息
typedef struct Stu
{
//结构体类型重命名为Stu
char Name[15];
int Age;
char Id[19];//学号
char Sex[5];//性别
char Pro[24];//专业
int Garde;//成绩
}Stu;
typedef struct System
{
Stu* data;
int sz;//学生人数
int Max_Space;//系统最大容量
}System;
void Teacher_System(System* Mge);
int FindName(System* Mge, char* str1);
void Init_System(System* Mge);
void Add_Stu(System* Mge);
void Show_Stu(System* Mge);
void Del_Stu(System* Mge);
void Sort(System* Mge);
void SearchStu(System* Mge);
void Stu_System(System* Mge);
void View(System* Mge);
void De_System(System* Mge);
void Del_Exit(System* Mge);
ブロガーは長い間書いていますが、ブロガーを励ますために無料のトリプルコンボを与えることができれば、あなたのタイパンツは本当に辛いと思います!!!