C语言实训 | 学生信息管理系统 (分析方法 and 简单实现代码)

本文档描述了一个学生信息管理系统的详细设计,包括学生信息的结构体定义、存储方式(数组)、功能实现(录入、查询、排序等)以及交互界面。系统采用C语言实现,提供了菜单式的操作界面,支持学生信息的录入、浏览、按学号和姓名查询,以及按总成绩排序等功能。此外,还探讨了使用链表作为存储结构的可行性。
摘要由CSDN通过智能技术生成

问题描述:
学生信息包括:学号,姓名,性别,出生年月,电话,英语,数学,总成绩等。
试设计一学生信息管理系统,使之能提供以下功能:
    1) 系统以菜单方式工作
    2) 学生信息录入功能(学生信息用文件保存)—输入
    3) 学生信息浏览功能—输出
    4) 根据输入英语、数学成绩,计算总成绩。
    5) 按学号查询
    6) 按姓名查询
    7) 按照总成绩进行排序
    8) 学生信息的删除与修改(可选项)


分析问题

信息管理系统的四大基本操作 (增删改查),分别对应 2 )、8 )、8 ) 和 5, 6, 7)
1)是呈现给使用者的界面
4)是对录入数据的处理,可以理解为查询

第一步 - 存储问题

信息管理系统,首先就要考虑如何存储信息
这里就存在两个问题:存什么?怎么存?

先回答第一个问题:存什么?
明显,我们要存储的是学生的基本信息(学号,姓名,性别,出生年月,电话,英语,数学,总成绩)
可以用结构体,来构造一个学生信息变量 studen,开一个studen数组来存储。
当然,这也意味着,可以使用很多个数组来存储这些信息。

ps:可以用蔡勒公式来处理时间,从而达到一个变量就可以实现年月日的存储

typedef struct Node{
	long long id;	// 或者使用字符数组 
	char name[20]; 	// 汉字一般占 2 个char的大小 
	int sex;		// 0 女 1 男 对于固定信息可以用数字代替文字,减小存储压力  
	int y;			// 年 
	int m;			// 月 
	int d;			// 日
	long long number; 	// 或者使用字符数组 
	double English;
	double math;
	double sum;
} student;

const int MAX_size = 1e3 + 5;
student a[MAX_size];

再来回答另一个问题:怎么存?
在上一个问题的回答中,已经给出了一种解决方法,用数组来存。
这里提一下另一种方法:链表,有能力的同学可以 try a try

第二步 - 交互问题

很明显,我要考虑如何呈现给使用者,并考虑如何设置可以更符合我们平常的操作
给出一个解决方法,输出一个 menu 作为提示语。让使用者知道系统可以实现的功能

void menu_main(){
	cout << "  ----------------------------" << endl;
	cout << "  | 1.录入学生信息           |" << endl;
	cout << "  | 2.查看所有学生信息       |" << endl;
	cout << "  | 3.按学号查询学生信息     |" << endl;
	cout << "  | 4.按姓名查询学生信息     |" << endl;
	cout << "  | 5.以成绩降序输出学生信息 |" << endl;
	cout << "  | 输入其他任意键退出系统   |" << endl;
	cout << "  ----------------------------" << endl;
}

当然,C语言也是提供图形化界面的,有兴趣的同学可以自行百度(B站上有很多视频)

第三步 - 功能实现(数组存储)

功能一 :录入学生信息

void input(){
	student a; string sex; 
	cout << "请输入学号:"; cin >> a.id; 
	cout << "请输入姓名:"; cin >> a.name; 
	cout << "请输入性别:"; cin >> sex; 
	cout << "请以此输入出生年月日(空格隔开):"; cin >> a.y >> a.m >> a.d; 
	cout << "请输入联系电话:"; cin >> a.number; 
	cout << "请输入英语成绩:"; cin >> a.English; 
	cout << "请输入数学成绩:"; cin >> a.Math; 
	// 转化性别 
	if(sex == "男") a.sex = 1;
	else a.sex = 0;
	// 计算总成绩 
	a.Sum = a.Math + a.English;
	// 检查信息是否合法
	// check(a)  
	add(a);
}

功能二:查看所有学生信息

void query(){
	if(cnt == 0){
		cout << "暂时无学生信息" << endl;
		return; 
	}
	string sex;
	for(int i = 1; i <= cnt; i++){
		if(A[i].sex == 1) sex = "男";
		else sex = "女"; 
		cout << A[i].id << " " << A[i].name << " " << sex << " ";
		cout << A[i].y << "-" << A[i].m << "-" << A[i].d << " ";
		cout << A[i].English << " " << A[i].Math << " " << A[i].Sum << endl;;
	}
}

功能三:按学号查询学生信息

void query_id(){
	if(cnt == 0){
		cout << "暂时无学生信息" << endl;
		return; 
	}
	long long id, flag = 0;
	cout << "请输入要查询的学号:"; 
	cin >> id;
	for(int i = 1; i <= cnt; i++){
		if(A[i].id != id) continue;
		string sex; 
		if(A[i].sex == 1) sex = "男";
		else sex = "女"; 
		cout << A[i].id << " " << A[i].name << " " << sex << " ";
		cout << A[i].y << "-" << A[i].m << "-" << A[i].d << " ";
		cout << A[i].English << " " << A[i].Math << " " << A[i].Sum << endl;
		flag = 1; //成功查询 
		break;
	}
	if(flag == 0) cout << "未找到给学号的学生" << endl;
}

功能四:按姓名查询学生信息

void query_name(){
	if(cnt == 0){
		cout << "暂时无学生信息" << endl;
		return; 
	}
	char name[20]; int flag = 0;
	cout << "请输入要查询的性名:"; 
	cin >> name;
	for(int i = 1; i <= cnt; i++){
		if(strcmp(A[i].name, name) != 0) continue;
		string sex; 
		if(A[i].sex == 1) sex = "男";
		else sex = "女"; 
		cout << A[i].id << " " << A[i].name << " " << sex << " ";
		cout << A[i].y << "-" << A[i].m << "-" << A[i].d << " ";
		cout << A[i].English << " " << A[i].Math << " " << A[i].Sum << endl;
		flag = 1; //成功查询 
	}
	if(flag == 0) cout << "未找到给学号的学生" << endl;
}

功能五:以成绩降序输出学生信息(可以使用更高效的排序方法,同时可以有更完善的排序规则)

// 定义排序规则
int cmp(student X, student Y){
	if(X.Sum > Y.Sum) return 1;
	else if(X.Sum == Y.Sum) return X.Math >= Y.Math ? 1 : 0;
	else return 0;
}
// 选择排序 
void Sort(){
	for(int i = 1; i <= cnt; i++){
		int ind = i;
		for(int j = i+1; j <= cnt; j++){
			if(cmp(A[j], A[i])){
				ind = j;
			}
		}
		student X = A[i]; A[i] = A[ind]; A[ind] = X;
	}
	query();
}

第四步 - 调试部分


在完成代码时,要去查看代码会不会在处理极端情况出现bug,或者有什么细节没有考虑到



完结★,°:.☆( ̄▽ ̄)/$:.°★

参考代码:

#include <bits/stdc++.h>
using namespace std;

typedef struct Node{
	long long id;	// 或者使用字符数组 
	char name[20]; 	// 汉字一般占 2 个char的大小 
	int sex;		// 0 女 1 男 对于固定信息可以用数字代替文字,减小存储压力  
	int y;			// 年 
	int m;			// 月 
	int d;			// 日
	long long number; 	// 或者使用字符数组 
	double English;
	double Math;
	double Sum;
	//(学号,姓名,性别,出生年月,电话,英语,数学,总成绩
} student;

const int MAX_size = 1e3 + 5;
student A[MAX_size];

void menu_main(){
	cout << "  ----------------------------" << endl;
	cout << "  | 1.录入学生信息           |" << endl;
	cout << "  | 2.查看所有学生信息       |" << endl;
	cout << "  | 3.按学号查询学生信息     |" << endl;
	cout << "  | 4.按姓名查询学生信息     |" << endl;
	cout << "  | 5.以成绩降序输出学生信息 |" << endl;
	cout << "  | 输入其他任意键退出系统   |" << endl;
	cout << "  ----------------------------" << endl;
}

int cnt = 0;
void add(student a){
	if(cnt == MAX_size) cout << "录入失败" << endl;
	else A[++cnt] = a;
}

void input(){
	student a; string sex; 
	cout << "请输入学号:"; cin >> a.id; 
	cout << "请输入姓名:"; cin >> a.name; 
	cout << "请输入性别:"; cin >> sex; 
	cout << "请以此输入出生年月日(空格隔开):"; cin >> a.y >> a.m >> a.d; 
	cout << "请输入联系电话:"; cin >> a.number; 
	cout << "请输入英语成绩:"; cin >> a.English; 
	cout << "请输入数学成绩:"; cin >> a.Math; 
	// 转化性别 
	if(sex == "男") a.sex = 1;
	else a.sex = 0;
	// 计算总成绩 
	a.Sum = a.Math + a.English;
	// 检查信息是否合法
	// check(a)  
	add(a);
}

void query(){
	if(cnt == 0){
		cout << "暂时无学生信息" << endl;
		return; 
	}
	string sex;
	for(int i = 1; i <= cnt; i++){
		if(A[i].sex == 1) sex = "男";
		else sex = "女"; 
		cout << A[i].id << " " << A[i].name << " " << sex << " ";
		cout << A[i].y << "-" << A[i].m << "-" << A[i].d << " ";
		cout << A[i].English << " " << A[i].Math << " " << A[i].Sum << endl;;
	}
}

void query_id(){
	if(cnt == 0){
		cout << "暂时无学生信息" << endl;
		return; 
	}
	long long id, flag = 0;
	cout << "请输入要查询的学号:"; 
	cin >> id;
	for(int i = 1; i <= cnt; i++){
		if(A[i].id != id) continue;
		string sex; 
		if(A[i].sex == 1) sex = "男";
		else sex = "女"; 
		cout << A[i].id << " " << A[i].name << " " << sex << " ";
		cout << A[i].y << "-" << A[i].m << "-" << A[i].d << " ";
		cout << A[i].English << " " << A[i].Math << " " << A[i].Sum << endl;
		flag = 1; //成功查询 
		break;
	}
	if(flag == 0) cout << "未找到给学号的学生" << endl;
}

void query_name(){
	if(cnt == 0){
		cout << "暂时无学生信息" << endl;
		return; 
	}
	char name[20]; int flag = 0;
	cout << "请输入要查询的性名:"; 
	cin >> name;
	for(int i = 1; i <= cnt; i++){
		if(strcmp(A[i].name, name) != 0) continue;
		string sex; 
		if(A[i].sex == 1) sex = "男";
		else sex = "女"; 
		cout << A[i].id << " " << A[i].name << " " << sex << " ";
		cout << A[i].y << "-" << A[i].m << "-" << A[i].d << " ";
		cout << A[i].English << " " << A[i].Math << " " << A[i].Sum << endl;
		flag = 1; //成功查询 
	}
	if(flag == 0) cout << "未找到给学号的学生" << endl;
}

// 定义排序规则
int cmp(student X, student Y){
	if(X.Sum > Y.Sum) return 1;
	else if(X.Sum == Y.Sum) return X.Math >= Y.Math ? 1 : 0;
	else return 0;
}
// 选择排序 
void Sort(){
	for(int i = 1; i <= cnt; i++){
		int ind = i;
		for(int j = i+1; j <= cnt; j++){
			if(cmp(A[j], A[i])){
				ind = j;
			}
		}
		student X = A[i]; A[i] = A[ind]; A[ind] = X;
	}
	query();
}

int main(){
    
    cout << "  ** 欢迎进入学生信息管理系统 **  " << endl;
    int op;
    while(1){
    	menu_main();
    	cout << "请输出操作对应的数字:";
		cin >> op;
		if(op == 1) input();
		else if(op == 2) query();
		else if(op == 3) query_id();
		else if(op == 4) query_name();
		else if(op == 5) Sort();
		else break;
	}
    
	return 0;
}
C语言学生成绩管理系统(以包含文件的形式写的),结构体,链表,数组,以下是main.c #include #include #include #define m 3/*宏定义m的值为3*/ struct node/*链表初始化*/ { char name[20]; int no; float score[m]; float sum; float avg; struct node *next; }; char ch[m+4][20]={{"学号"},{"姓名"},{"语文"},{"数学"},{"英语"},{"总分"},{"平均分"}};/*定义并初始化一个全局二维字符数组*/ #include "save.c"/*包含保存文件*/ #include "read.c"/*包含读取文件*/ #include "output.c"/*包含打印文件*/ #include "set.c"/*包含录入文件*/ #include "demand.c"/*包含查询文件*/ #include "sort.c"/*包含排序文件*/ #include "modified.c"/*包含修改文件*/ #include "add.c"/*包含添加文件*/ #include "del.c"/*包含删除文件*/ void main() { int n; printf("\n\t\t\t欢迎使用学生成绩管理系统\n\n"); printf("\t\t\t\t\t\t制 作: XIA XIA\n"); do { printf("\n\n1:学生成绩录入,并保存\n"); printf("2:学生成绩查询\n"); printf("3:学生成绩的排序\n"); printf("4:学生成绩的修改\n"); printf("5:学生成绩的打印\n"); printf("6:学生信息的添加\n"); printf("7:学生信息的删除\n"); printf("0:退出学生成绩管理系统\n\n\n"); printf("输入你要执行操作的相应序号\n"); scanf("%d",&n);/*输入相就的操作的序号*/ switch (n) { case 1: set();break;/*调用录入函数*/ case 2: demand();break;/*调用查询函数*/ case 3: sort();break;/*调用排序函数*/ case 4: modified();break;/*调用修改函数*/ case 5: output();break;/*调用打印函数*/ case 6: add();break;/*调用添加函数*/ case 7: del();break;/*调用删除函数*/ case 0: printf("正在退出学生成绩管理系统......\n");exit(0);/*直到输入“0”退出学生成绩管理系统*/ default:printf("输入错误码,请重新输入\n"); } }while(1); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值