博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

作业一:学生学籍管理程序

学生学籍管理通常使用数据库为基础的管理信息系统(MIS)系统,但是我们这里要求不使用数据库技术,而是使用数据结构struct和链表操作完成管理任务。

作业描述

使用数据结构表示学生,记录学生的相关信息;学生信息包括:学号sno、姓名sname、年龄sage、专业sprof、班级sclass。请设计合理的数据结构,容纳这些信息。

完成学生的添加、修改、删除和查询等基本常用操作。

使用链表表示学生所在班级队列。

背景知识

1. 数据结构。

2. 链表。


代码实现如下:

发现简单的代码也不好写。

越写考虑的越多,还有很多想到的部分没实现,毕竟是伪界面,就这样吧。


代码框架如下:

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

class Student {
private :
	char sno[15];
	int sage;
	char sclass[15];
	char sname[15];
	char sprof[15];
	Student *next; 
	typedef Student* Stu;
	
public :
	Student() {
		//构造函数,初始化链表 
	}
	
	void Insert(Student &stu) {
		//插入操作 
	}
	
	bool Search(char cur_sno[], Stu &res_pre) {
		//查找操作 
	}
	
	bool Delete(char Delete_sno[]) {
		//删除操作 
	}
	
	void Modify(Student &stu) {//修改操作
		//输入修改学生信息保存到stu(插入部分的具体实现其实在Modify_info中)
	}
	
	//以上是链表插入删除,查找修改的基本操作 
/*---------------------------------------------------------------*/	
	void Input_Stu_Info(Student &stu) {
		//输入学生信息(除主码sno外)的函数 
	}
	
	void Back_Or_Not(int n) {
		//是否返回主界面的函数 
	}
	
	void Check_back_root(char str[]) {
		//异常而无法返回主菜单时做的处理。 
	}
	
	int Input() {//输入处理,字符串读入,做简单的排错处理 
	}
		
	void Frame() {//界面 
	}
	
	//以上是浮云... 
/*---------------------------------------------------------------*/	
	void Add_info() {
		//增加学生记录实现函数
		//输入学号信息,调用欧冠Insert()插入 
	}
	
	void Modify_info() {
		//修改学生记录实现函数
		//输入学号信息,调用欧冠Modify()修改 
	}
	
	void Delete_info() {
		//删除学生记录实现函数
		//输入学号信息,调用欧冠Delete()删除 
	}
	
	void Search_info() {
		//查找学生记录实现函数
		//输入学号信息,调用Search()进行查找 
	}
	 
	void Print_All() {
		//输出所有学生记录实现函数 
	}
	//以上是学籍管理程序的5个主要函数实现部分 
/*---------------------------------------------------------------*/	
};

int main() {
	Student StuList;
	StuList.Frame(); 
	return 0;
}

 

代码实现如下:

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

class Student {
private :
	char sno[15];
	int sage;
	char sclass[15];
	char sname[15];
	char sprof[15];
	Student *next; 
	typedef Student* Stu;
	
public :
	Student() {
		memset(sno, 0, sizeof(sno));
		memset(sname, 0, sizeof(sclass));
		memset(sname, 0, sizeof(sname));
		memset(sprof, 0, sizeof(sprof));
		next = NULL;
	}
	
	void Insert(Student &stu) {
		Stu p = this;
		while (p->next && strcmp(p->next->sno, stu.sno) < 0) {
			p = p->next;
		}
		Stu tmp = p->next;
		p->next = &stu;
		p = p->next;
		p->next = tmp;
	}
	
	bool Search(char cur_sno[], Stu &res_pre) {
		Stu p = this;
		while (p->next) {
			if (strcmp(p->next->sno, cur_sno) == 0) {
				res_pre = p;//res保存结果的前驱指针 
				//printf("%s--\n", res_pre->next->sno);
				return true;
			}
			p = p->next;
		}
		return false;
	}
	
	bool Delete(char Delete_sno[]) {
		Stu res_pre = this;
		if (Search(Delete_sno, res_pre)) {
			Stu res = res_pre->next;
			res_pre->next = res->next;
			delete(res);
			puts("\t删除信息成功"); 
			return true;
		} else {
			puts("\t该生不存在,请检查后重新输入!");
			return false;
		}
	}
	
	void Modify(Student &stu) {
		printf("\t待修改的学生%s的学籍信息如下:", stu.sno);
		puts("\t姓名\t年龄\t专业\t班级"); 
		printf("\t%s\t%d\t%s\t%s\n", stu.sname, stu.sage, stu.sprof, stu.sclass); 
		printf("\t输入修改后的该学生信息(按以上顺序):\n"); 
		Input_Stu_Info(stu);
	}

/*----------------------------------------------------------------------------*/  
	void Input_Stu_Info(Student &stu) {
		printf("\t");
		scanf("%s", stu.sname); 
		Check_back_root(stu.sname);
		printf("\t");
	 	int check_age = Input();
		if (check_age >= 0 && check_age <= 100) {
			stu.sage = check_age;
		}		
		printf("\t");
		scanf("%s", stu.sprof);
		Check_back_root(stu.sprof);
		printf("\t");
		scanf("%s", stu.sclass);
		Check_back_root(stu.sclass);
		printf("\n");
	}
	
	void Back_Or_Not(int n) {
		puts("  ═════ 继续当前操作请按0, 返回主界面请按1   ═════\n");
		int check_in = Input();
		while (!(check_in >= 0 && check_in <= 1)) {
			printf("您选择的编号错误,请重新选择: ");
			check_in = Input();
		}//输入的异常处理 
		if (check_in == 0) {
			switch(n) {
				case 1: Add_info(); break;
				case 2: Modify_info(); break;
				case 3: Delete_info(); break;
				case 4: Search_info(); break;
				default : break; 
			}
		} else {
			Frame();
		}
	}
	
	void Check_back_root(char str[]) {
		if (strcmp(str, "250") == 0) {
			Frame();
		}
	}
	
	int Input() {//输入处理,做简单的排错处理 
		int i, k = 0;
		char stmp[110], str[110];
		scanf("%s", str);
		Check_back_root(str); 
		for (i = 0; str[i]; i++) {
			if (!(str[i] >= '0' && str[i] <= '9')) {
				return -1;
			} else {
				stmp[k++] = str[i];		
			}
		}
		int r = 1, sum = 0;
		for (i = k - 1; i >= 0; i--, r *= 10) {
			sum += (str[i] - '0') * r;
		}
		return sum;
	}
		
	void Frame() {
		system("cls");
		puts("╓**************************学生学籍管理程序**************************╖"); 
		puts("║                                                                    ║"); 
		puts("║ Author info --  class: abcdefgh   name: XXX  stu.no: 33333333      ║"); 
		puts("╠════════════════╦═════════════════╣"); 
		puts("║                                ║                                  ║");  
		puts("║ 1:添加学生记录                ║ 2:修改学生记录                  ║"); 
		puts("║                                ║                                  ║");    
		puts("╠════════════════╬═════════════════╣"); 
		puts("║                                ║                                  ║"); 
		puts("║ 3:删除学生记录                ║ 4: 查询学生记录                 ║"); 
		puts("║                                ║                                  ║");
		puts("╠════════════════╬═════════════════╣"); 
		puts("║                                ║ Notice: 任何不可返回的异常情况可 ║"); 
		puts("║ 5:显示所有学生记录            ║ (此情况下任何学生信息不可是250)  ║"); 
		puts("║                                ║         输入250返回主菜单        ║");
		puts("╚════════════════╩═════════════════╝"); //这个的戳,主要是因为这里的字体,复制出来就好了。。
		printf("请输入编号:");
		int check_in = Input();
		while (!(check_in >= 1 && check_in <= 6)) {
			printf("您选择的编号错误,请重新选择: ");
			check_in = Input();
		}//输入的异常处理 
		
		switch(check_in) {//建立关联 
			case 1:
				Add_info();
			case 2:
				Modify_info();
				break;
			case 3: 
				Delete_info();
				break;
			case 4:
				Search_info();
				break;
			case 5:
				Print_All();	
				break;
			default :break;
		}
	}
/*----------------------------------------------------------------------------*/    
	
	void Add_info() {
		system("cls");
		puts("╓********************添加学生记录信息************************╖\n");
		puts("   Notice: 任何不可返回的异常情况可输入250返回主菜单 \n");  
		puts("\t输入顺序如下(学号作为主码)\n");
		puts("\t学号\t姓名\t年龄\t专业\t班级\n");
		Student stu, *res_pre = this;
		char stmp[110], str[110];
		bool flag, OK = false;
		int i, k = 0;
		while (!OK) {
			printf("\t");
			scanf("%s", str);
			Check_back_root(str);
			flag = false;
			while (!flag) {
				flag = true;
				k = 0;
				for (i = 0; str[i]; i++) {
					if (!(str[i] >= '0' && str[i] <= '9')) {
						flag = false;
						break;
					} else {
						stmp[k++] = str[i];
					}
				} 
			}
			stmp[k] = 0;
			if (Search(str, res_pre)) {
				puts("\t学生学号不可重复,该学号的记录已存在,请检查后重新输入。");
			} else {
				OK = true;
			}	
		}
		strcpy(stu.sno, stmp);
		Input_Stu_Info(stu);
		Insert(stu);
		
		puts("  congratulation!  添加记录成功!\n");
		Back_Or_Not(1);
	}
	
	void Modify_info() {
		char str[110];
		Stu res_pre = this;
		system("cls");
		puts("╓********************修改学生记录信息************************╖\n"); 
		puts("   Notice: 任何不可返回的异常情况可输入250返回主菜单 \n"); 
		printf("\t请输入待修改信息的学生学号:\n\t");
		scanf("%s", str);
		Check_back_root(str);
		while (!Search(str, res_pre)) {
			puts("\t您输入的学生信息不存在,请检查后重新输入");
			printf("\t");
			scanf("%s", str);
			Check_back_root(str);
		}
		Modify(*(res_pre->next));
		puts("  congratulation!  修改记录成功!\n");
		Back_Or_Not(2);
	}
	
	void Delete_info() {
		system("cls"); 
		char str[110];
		puts("╓**********************删除学生记录信息**********************╖\n"); 
		puts("   Notice: 任何不可返回的异常情况可输入250返回主菜单 \n"); 
		printf("\t请输入待删除信息的学生学号:\n\t");
		scanf("%s", str);
		Check_back_root(str);
		while (!Delete(str)) {
			//puts("\t该记录不存在,请检查后重新输入:");Delete里已有 
			printf("\t"); 
			scanf("%s", str);
			Check_back_root(str); 
		}
		Back_Or_Not(3);
	}
	
	void Search_info() {
		system("cls");
		char str[110];
		Stu res_pre = this;
		puts("╓**********************查询学生记录信息**********************╖\n");
		puts("   Notice: 任何不可返回的异常情况可输入250返回主菜单 \n");  
		printf("\t请输入需查询信息的学生学号:\n\t");
		scanf("%s", str);
		Check_back_root(str);
		while (!Search(str, res_pre)) {
			puts("\t不存在该记录,请检查后重新输入:");
			printf("\t");
			scanf("%s", str); 
			Check_back_root(str);
		}
		Student stu = *(res_pre->next);
		printf("  查询结果如下:"); 
		puts("\t学号\t姓名\t年龄\t专业\t班级\n");
		printf("\t%s\t%s\t%d\t%s\t%s\n", stu.sno, stu.sname, stu.sage, stu.sprof, stu.sclass); 
		Back_Or_Not(4);
	}
	 
	void Print_All() {
		system("cls");
		Stu p = this;
		Student stu;
		puts("╓*********************输出所有学生记录信息**********************╖\n"); 
		puts("   Notice: 任何不可返回的异常情况可输入250返回主菜单 \n"); 
		if (!p->next) {
			puts("\t记录为空!");
		} 
		
		puts("\t学号\t姓名\t年龄\t专业\t班级\n"); 
		for ( ; p->next; p = p->next) {
			stu = *p->next;
			printf("\t%s\t%s\t%d\t%s\t%s\n", stu.sno, stu.sname, stu.sage, stu.sprof, stu.sclass); 
		}
		system("pause");
		Frame();
		system("cls");
	}
};

int main() {
	Student StuList;
	StuList.Frame(); 
	return 0;
}


原创文章如转载请注明:转自¥忘%风 {http://www.cnblogs.com/slave_wc}

本文地址: 《操作系统》课程作业(作业一:学生学籍管理程序)