精华内容
下载资源
问答
  • C语言开发简单的学生成绩管理系统(附源码)

    万次阅读 多人点赞 2019-04-15 21:08:22
    学生成绩管理系统 开发语言:C语言 开发工具:Visual Studio 2019 开发时间:2019.4.14 开发者:summer @一、系统使用展示 @二、系统功能 @三、菜单 @四、录入学生信息 @五、打印学生信息 @六、保存学生信息 @七、...

    学生成绩管理系统

    开发语言:C语言
    开发工具:Visual Studio 2019
    开发时间:2019.4.14
    开发者:summer

    商业合作可淘宝搜索店铺“程序员夏天的小店”

    @一、系统使用展示

    @二、系统功能

    @三、菜单

    @四、录入学生信息

    @五、打印学生信息

    @六、保存学生信息

    @七、读取学生信息

    @八、统计所有学生人数

    @九、查找学生信息

    @十、修改学生信息

    @十一、删除学生信息

    @十二、退出系统

    @十三、出错

    一、系统使用展示

    Alt

    二、系统功能

    1. 系统功能介绍
    1.录入学生信息:用户可以自由输入学生信息到系统中。
    2.打印学生信息:格式化展示系统中的学生信息。
    3.保存学生信息:将系统中的学生信息保存到本地文档。
    4.读取学生信息:读取本地文档中的学生信息并显示。
    5.统计所有学生人数
    6.查找学生信息:根据用户给定的信息(学号)在系统中查找该学生的信息
    7.修改学生信息
    8.删除学生信息
    0.退出系统
    
    1. 系统main函数,while循环在外,系统程序能够持续运行,switch判断语句进行功能选择与函数切换。
    int main() {
    	while (1)
    	{
    		//打印菜单
    		Menu();
    		//读取一个字符 整数,字符在内存中映射为ASCII码
    		char ch = _getch();
    
    		switch (ch)
    		{
    		case '1'://1.录入学生信息
    			InputStudent();
    			break;
    		case '2'://2.打印学生信息
    			PrintStudent();
    			break;
    		case '3'://3.保存学生信息
    			SaveStudent();
    			break;
    		case '4'://4.读取学生信息
    			ReadStudent();
    			break;
    		case '5'://5.统计所有学生人数
    			CountStudent();
    			break;
    		case '6'://6.查找学生信息
    			FindStudent();
    			break;
    		case '7'://7.修改学生信息
    			ChangeStudent();
    			break;
    		case '8'://8.删除学生信息
    			DeleteStudent();
    			break;
    		case '0'://0.退出系统
    			return 0;
    			break;
    		default:
    			printf("输入有误,没有该功能\n\n");
    			system("pause");  //暂停
    			system("cls");    //清屏
    			break;
    		}
    	}
    
    	return 0;
    }
    

    三、菜单

    1. 菜单显示
    //菜单
    void Menu() {
    	printf("*************************************************\n");
    	printf("*\t欢迎使用高校学生成绩管理系统V1.0\t*\n");
    	printf("*\t\t请选择功能\t\t\t*\n");
    	printf("*************************************************\n");
    	printf("*\t\t1.录入学生信息\t\t\t*\n");
    	printf("*\t\t2.打印学生信息\t\t\t*\n");
    	printf("*\t\t3.保存学生信息\t\t\t*\n");
    	printf("*\t\t4.读取学生信息\t\t\t*\n");
    	printf("*\t\t5.统计所有学生人数\t\t*\n");
    	printf("*\t\t6.查找学生信息\t\t\t*\n");
    	printf("*\t\t7.修改学生信息\t\t\t*\n");
    	printf("*\t\t8.删除学生信息\t\t\t*\n");
    	printf("*\t\t0.退出系统\t\t\t*\n");
    	printf("*************************************************\n");
    }
    
    1. 打印菜单

    scanf()、getchar()输入后均需要按enter,而getch()不用

    	//打印菜单
    	Menu();
    	//读取一个字符 整数,字符在内存中映射为ASCII码
    	char ch = _getch();
    

    四、录入学生信息

    1. 定义学生结构体、链表节点结构体
    //定义一个学生
    typedef struct tagStudent {
    	char szName[20];	//姓名
    	char szSex[4];		//性别
    	int  nAge;			//年龄
    	int  nStuNo;		//学号
    	int  nScore;		//成绩
    }Student;
    
    //链表
    //节点
    typedef struct tagNode
    {
    	Student stu;			//学生信息
    	struct tagNode* pNext;	//指向下一个节点
    }Node;
    
    //创建头节点
    Node* g_pHead = NULL;		//指向头节点
    
    1. 利用学生结构体,以及链表操作输入学生信息
    //1.录入学生信息
    void InputStudent() {
    	//创建一个人,在堆中分配内存
    	Node* pNewNode = (Node*)malloc(sizeof(Node));
    	//指针下一个指向空
    	pNewNode->pNext = NULL;
    
    	//查找链表的尾结点
    	Node* p = g_pHead;
    	while (g_pHead != NULL && p->pNext != NULL)
    	{
    		p = p->pNext;
    	}
    
    	//把节点插到链表的尾节点
    	if (g_pHead == NULL) {
    		g_pHead = pNewNode;
    	}
    	else {
    		p->pNext = pNewNode;
    	}
    
    	//录入学生信息
    	printf("请输入学生姓名:\n");
    	scanf_s("%s", pNewNode->stu.szName, sizeof(pNewNode->stu.szName));
    	printf("请输入性别:\n");
    	scanf_s("%s", pNewNode->stu.szSex, sizeof(pNewNode->stu.szSex));
    	printf("请输入学生年龄:\n");
    	scanf_s("%d", &pNewNode->stu.nAge);
    	printf("请输入学号:\n");
    	scanf_s("%d", &pNewNode->stu.nStuNo);
    	printf("请输入成绩:\n");
    	scanf_s("%d", &pNewNode->stu.nScore);
    
    	printf("学生信息录入成功。\n\n");
    	system("pause");
    	system("cls");
    }
    

    五、打印学生信息

    1. 读取链表结构,输出学生信息。先进行判空处理,如果无学生信息则输出提示信息,反之则正确输出学生信息。
    //2.打印学生信息
    void PrintStudent() {
    
    	system("cls");
    	//遍历链表
    	Node* p = g_pHead;
    	if (p == NULL) {
    		printf("系统中暂无学生信息,请录入后再来打印查看。\n\n");
    	}
    	else {
    		printf("*********************************************************************************\n");
    		printf("*\t\t\t欢迎使用高校学生成绩管理系统V1.0\t\t\t*\n");
    		printf("*********************************************************************************\n");
    		printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");
    		printf("*********************************************************************************\n");
    
    		while (p != NULL)
    		{
    			printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",
    				p->stu.nStuNo,
    				p->stu.szName,
    				p->stu.szSex,
    				p->stu.nAge,
    				p->stu.nScore
    			);
    
    			//下一个节点
    			p = p->pNext;
    			printf("*********************************************************************************\n");
    		}
    	}
    
    	system("pause");
    	system("cls");
    }
    

    六、保存学生信息

    1. 利用文件对学生信息进行存储
    //3.保存学生信息
    void SaveStudent() {
    	//打开文件
    	FILE* pFile;
    	pFile = fopen(".\\stuinfo.dat", "w");
    	
    	if (pFile == NULL) {
    		printf("打开文件失败。\n");
    		return;
    	}
    
    	//写入数据
    	Node* p = g_pHead;
    	while (p != NULL)
    	{
    		fwrite(&p->stu, sizeof(Node), 1, pFile);
    		p = p->pNext;
    	}
    
    	//关闭文件
    	fclose(pFile);
    
    	printf("数据保存成功。\n");
    	system("pause");
    	system("cls");
    }
    
    1. fopen在vs中会报错,解决方式

    (1)按照vs的提示,将fopen换成fopen_s

    (2)不修改函数,仅仅修改项目的属性。因为fopen_s是一种Microsoft的函数,若纯做Windows开发则直接改为_s也无妨,但是我们尽量还是用标准C++比较好,这样代码有较好的移植性。

    具体操作:

    右键工程名–>属性–>C/C++–>预处理器–>预处理器定义,编辑右边输入框加入: _CRT_SECURE_NO_WARNINGS

    保存(注意用分号隔开)。

    七、读取学生信息

    1. 打开存储学生信息的文本,单个单词读取,判断非分隔符或者空时则赋值给链表中的节点,读取完毕后,直接调用PrintStudent()函数进行打印结果。
    //4.读取学生信息
    void ReadStudent() {
    	system("cls");
    
    	//打开文件
    	FILE* pFile;
    	pFile = fopen(".\\stuinfo.dat", "r");
    
    	if (pFile == NULL) {
    		printf("打开文件失败。\n");
    		return;
    	}
    	
    	//创建一个人,在堆中分配内存
    	Node* p = (Node*)malloc(sizeof(Node));
    	p->pNext = NULL;
    	//重新建立链表
    	g_pHead = p;
    
    	//逐个单词读入文本内容
    	char str[200];
    	int i = 0;
    	while (fscanf(pFile, "%s", str) != EOF) {  //读文件 
    		//单词不是*或者空时,进行赋值
    		if (strcmp(str, "*") && str != NULL) {
    			switch (i)
    			{
    			case 0:
    				p->stu.nStuNo = atoi(str);
    				break;
    			case 1:
    				strcpy(p->stu.szName, str);
    				break;
    			case 2:
    				strcpy(p->stu.szSex, str);
    				break;
    			case 3:
    				p->stu.nAge = atoi(str);
    				break;
    			case 4:
    				p->stu.nScore = atoi(str);
    				break;
    			default:
    				Node* pNewNode = (Node*)malloc(sizeof(Node));
    				pNewNode->pNext = NULL;
    				p->pNext = pNewNode;
    				p = pNewNode;
    				p->stu.nStuNo = atoi(str);
    				i = 0;
    				break;
    			}
    			i++;
    		}
    	}
    	//打印读取结果
    	PrintStudent();
    }
    
    1. 读取文本时,将内容全部赋值给char数组,所有赋值时需特殊处理。
    • char数组赋值给整数

      在<stdlib.h>头文件中有两个函数,int atoi(char *p)和char *itoa(int p),分别将装有整数的char数组转化为整数,和将整数按位数分解依次存入char数组中。

    • char数组赋值给char数组

      用strcpy函数!

      原型声明:extern char *strcpy(char *dest,char *src);

      头文件:string.h

      功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

      说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

      返回指向dest的指针。

      注:不能使用memcpy(a, b, strlen(b)),会导致中文乱码。

    八、统计所有学生人数

    1. 设置计数器,遍历链表
    //5.统计所有学生人数
    void CountStudent() {
    	int countStu = 0;
    
    	//遍历链表
    	Node* p = g_pHead;
    	while (p != NULL)
    	{
    		countStu++;
    		p = p->pNext;
    	}
    	printf("学生总人数:%d\n\n", countStu);
    
    	system("pause");
    	system("cls");
    }
    

    九、查找学生信息

    1. 本次查找以学号为示例,改用姓名等信息查询流程基本一致。

      遍历链表,如果有符合信息的学生则打印,反之则继续下一个节点,若系统中无该学生信息,给予用户无结果提示。

    //6.查找学生信息
    void FindStudent() {
    	system("cls");
    	//以学号为查找示例,其他信息查找流程基本相似
    	int stuNum;
    	printf("请输入查找学生学号:");
    	scanf("%d", &stuNum);
    	//遍历链表查找,查找到后进行信息显示
    	Node* p = g_pHead;
    	//对表头进行展示一次
    	bool isShowHead = false;
    	//记录是否有找到该学号的学生信息
    	bool isFindStu = false;
    	while (p != NULL)
    	{
    		if (stuNum == p->stu.nStuNo) {
    			if (!isShowHead) {
    				printf("*********************************************************************************\n");
    				printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");
    				printf("*********************************************************************************\n");
    				isShowHead = true;
    			}
    			printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",
    				p->stu.nStuNo,
    				p->stu.szName,
    				p->stu.szSex,
    				p->stu.nAge,
    				p->stu.nScore
    			);
    			isFindStu = true;
    			printf("*********************************************************************************\n");
    		}
    		p = p->pNext;
    	}
    
    	if (!isFindStu) {
    		printf("学号输入有误,系统中暂无该学生信息。\n\n");
    	}
    
    	system("pause");
    	system("cls");
    }
    

    十、修改学生信息

    1. 可参考查找学生信息代码段,在查找后进行修改即可
    //7.修改学生信息
    void ChangeStudent() {
    	//以学号为查找示例,其他信息查找流程基本相似
    	int stuNum;
    	printf("请输入欲修改学生的学号:");
    	scanf("%d", &stuNum);
    	//遍历链表查找,查找到后进行信息显示
    	Node* p = g_pHead;
    	//对表头进行展示一次
    	bool isShowHead = false;
    	//记录是否有找到该学号的学生信息
    	bool isFindStu = false;
    	while (p != NULL)
    	{
    		if (stuNum == p->stu.nStuNo) {
    			if (!isShowHead) {
    				printf("*********************************************************************************\n");
    				printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");
    				printf("*********************************************************************************\n");
    				isShowHead = true;
    			}
    			printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",
    				p->stu.nStuNo,
    				p->stu.szName,
    				p->stu.szSex,
    				p->stu.nAge,
    				p->stu.nScore
    			);
    			//修改学生信息
    			printf("请输入学生姓名:\n");
    			scanf_s("%s", p->stu.szName, sizeof(p->stu.szName));
    			printf("请输入性别:\n");
    			scanf_s("%s", p->stu.szSex, sizeof(p->stu.szSex));
    			printf("请输入学生年龄:\n");
    			scanf_s("%d", &p->stu.nAge);
    			printf("请输入学号:\n");
    			scanf_s("%d", &p->stu.nStuNo);
    			printf("请输入成绩:\n");
    			scanf_s("%d", &p->stu.nScore);
    			isFindStu = true;
    			printf("*********************************************************************************\n");
    			printf("学生信息修改成功,请注意及时保存。\n\n");
    		}
    		p = p->pNext;
    	}
    
    	if (!isFindStu) {
    		printf("学号输入有误,系统中暂无该学生信息,无法进行修改。\n\n");
    	}
    
    	system("pause");
    	system("cls");
    }
    

    十一、删除学生信息

    1. 仍然以查找学生信息操作为基础,以学号为线索,查找到则进行删除,未查找到则进行错误提示,删除时需要区分当前节点是头结点、尾节点或者中间节点,不同节点操作不同,同时该删除仅作用于本次操作,需保存学生信息才能长久生效。
    //8.删除学生信息
    void DeleteStudent() {
    	system("cls");
    	//以学号为查找示例,其他信息查找流程基本相似
    	int stuNum;
    	printf("请输入删除学生的学号:");
    	scanf("%d", &stuNum);
    	//遍历链表查找,查找到后进行信息显示
    	Node* p = g_pHead;
    	//记录前一个节点,删除时方便操作
    	Node* beforeNode = g_pHead;
    
    	//对表头进行展示一次
    	bool isShowHead = false;
    	//记录是否有找到该学号的学生信息
    	bool isFindStu = false;
    	while (p != NULL)
    	{
    		if (stuNum == p->stu.nStuNo) {
    			if (!isShowHead) {
    				printf("*********************************************************************************\n");
    				printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");
    				printf("*********************************************************************************\n");
    				isShowHead = true;
    			}
    			printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",
    				p->stu.nStuNo,
    				p->stu.szName,
    				p->stu.szSex,
    				p->stu.nAge,
    				p->stu.nScore
    			);
    			isFindStu = true;
    			printf("*********************************************************************************\n");
    
    			//删除节点为头节点
    			if (p == g_pHead) {
    				g_pHead = p->pNext;
    			}
    			//删除节点为尾节点
    			else if (p->pNext == NULL) {
    				p = beforeNode;
    				p->pNext = NULL;
    			}
    			//删除节点为中间节点
    			else {
    				beforeNode->pNext = p->pNext;
    			}
    			printf("删除成功,请记得保存。\n\n");
    		}
    		beforeNode = p;
    		p = p->pNext;
    	}
    
    	if (!isFindStu) {
    		printf("学号输入有误,系统中暂无该学生信息,无法进行删除操作。\n\n");
    	}
    
    	system("pause");
    	system("cls");
    }
    

    十二、退出系统

    直接在选择0时,设置return即可。

    十三、出错

    用户输入有误时,进行提示信息输出即可。

    	printf("输入有误,没有该功能\n\n");
    	system("pause");  //暂停
    	system("cls");    //清屏
    

    展开全文
  • 项目名称:学生信息管理系统项目内容:设计一个学生信息管理系统,实现对学生基本信息的添加、删除、修改和查询等操作,其中每个学生信息包含学号,姓名和绩点。要求系统完成以下主要功能: (1)显示:显示当前...

    1.内容

    项目名称:学生信息管理系统项目内容:设计一个学生信息管理系统,实现对学生基本信息的添加、删除、修改和查询等操作,其中每个学生信息包含学号,姓名和绩点。要求系统完成以下主要功能:
    (1)显示:显示当前所有学生信息记录;
    (2)录入:从键盘输入一条学生信息记录,插入到表中指定的位置;
    (3)查找:根据学号或者记录的位置查找学生的各项信息;
    (4)删除:删除指定位置的学生信息记录;
    (5)更新:更新指定位置的学生信息记录;
    (6)统计:统计表中学生人数。
    (7) 排序:按照学号或者绩点进行排序
    (8)清空:清空表中所有记录

    2.顺序表的实现

    
    #include<iostream>
    #include"SqList.hpp"
    #include<cstring>
    using namespace std;
    
    int main() {
     SqList<student>* list = new SqList<student>();
     while (1) {
      system("cls");
      show_list();
      int choise;
      cin >> choise;
      if (!(choise < 10 && choise>0))
       continue;
      switch (choise) {
      case 1: {
       show_student(*list);
       system("pause");
       break;
      }
      case 2: {
       set_massage(*list);
       system("pause");
       break;
      }
      case 3: {
       find(*list);
       system("pause");
       break;
      }
      case 4: {
       delete_him(*list);
       system("pause");
       break;
      }
      case 5: {
       change(*list);
       system("pause");
       break;
      }
      case 6: {
       sum_student(*list);
       system("pause");
       break;
      }
      case 7: {
       sort(*list);
       system("pause");
       break;
      }
      case 8: {
       clear_all(*list);
       system("pause");
       break;
      }
      case 9: {
       return 0;
       break;
      }
      }
     }
     system("pause");
     return 0;
    }

    结构体定义:

    
    typedef struct student {
     student() {
     }
     string name;
     string number;
     double performance;
    public:
     void set_student() {
      cout << "输入姓名:" << endl;
      cin >> this->name;
      cout << "输入学号:" << endl;
      cin >> this->number;
      cout << "输入绩点:" << endl;
      cin >> this->performance;
     }
    }student;

    成员函数的实现:

    
    void print_student(const student& a) {
     cout << "姓名:" << a.name << " 学号:" << a.number << " 绩点:" << a.performance << endl;
    }
    void show_list() {
     cout << "1.显示:显示当前所有学生信息记录;" << endl;
     cout << "2.录入:从键盘输入一条学生信息记录,插入到表中指定的位置;" << endl;
     cout << "3.查找:根据学号或者记录的位置查找学生的各项信息;" << endl;
     cout << "4.删除:删除指定位置的学生信息记录;" << endl;
     cout << "5.更新:更新指定位置的学生信息记录;" << endl;
     cout << "6.统计:统计表中学生人数。" << endl;
     cout << "7. 排序:按照学号或者绩点进行排序." << endl;
     cout << "8.清空:清空表中所有记录." << endl;
     cout << "9.退出。" << endl;
    }
    //显示:显示当前所有学生信息记录;
    void show_student(SqList<student>& a) {
     if (a.IsEmpty())
      cout << "没有学生" << endl;
     else {
      a.Traverse(print_student);
     }
    }
    //录入:从键盘输入一条学生信息记录,插入到表中指定的位置;
    void set_massage(SqList<student>& a) {
     system("cls");
     int sign = 0;
     cout << "1.在尾部插入" << endl;
     cout << "2.输入插入位置" << endl;
     cin >> sign;
     if (sign == 1) {
      student m;
      m.set_student();
      a.InsertElem(m);
     }
     else if (sign == 2) {
      cout << "输入位置:(在1-" << a.GetLength() << "之间)" << endl;
      int i = 0;
      cin >> i;
      if (i<1 && i>a.GetLength()){
       cout << "输入错误" << endl;
      }
      else {
       student m;
       m.set_student();
       a.InsertElem(i, m);
      }
     }
     else {
      cout << "输入错误" << endl;
     }
     
    }
    //查找:根据学号或者记录的位置查找学生的各项信息;
    void find(SqList<student>& a) {
     system("cls");
     int sign = 0;
     student s;
     cout << "1.位置查找" << endl;
     cout << "2.学号查找" << endl;
     cout << "3.姓名查找" << endl;
     cin >> sign;
     if (sign == 1) {
      int m = 0;
      cout << "输入位置:(在1-" << a.GetLength() << "之间)" << endl;
      cin >> m;
      if (m > 0 && m <= a.GetLength()) {
       a.GetElem(m, s);
      }
      else {
       cout << "位置查找错误" << endl;
      }
      print_student(s);
     }
     else if (sign == 2) {
      string m;
      int ok = 0;
      cout << "输入学号:" << endl;
      cin >> m;
      for (int i = 1; i <= a.GetLength(); i++) {
       a.GetElem(i, s);
       if (s.number == m) {
        print_student(s);
        ok = 1;
        break;
       }
      }
      if (ok == 0)
       cout << "没找到" << endl;
     }
     else if (sign == 3) {
      string m;
      int ok = 0;
      cout << "输入姓名:" << endl;
      cin >> m;
      for (int i = 1; i <= a.GetLength(); i++) {
       a.GetElem(i, s);
       if (s.name == m) {
        print_student(s);
        ok = 1;
        break;
       }
      }
      if (ok == 0)
       cout << "没找到" << endl;
     }
     else {
      cout << "输入错误,请按序号输入" << endl;
     }
    }
    //删除:删除指定位置的学生信息记录;
    void delete_him(SqList<student>& a) {
     int sign = 0;
     student s;
     cout << "输入位置:(在1-" << a.GetLength() << "之间)" << endl;
     cin >> sign;
     if (sign > 0 && sign <= a.GetLength()) {
      a.DeleteElem(sign, s);
      cout << "删除成功" << endl;
      cout << "信息:";
      print_student(s);
     }
     else {
      cout << "位置查找错误" << endl;
     }
    }
    //更新:更新指定位置的学生信息记录;
    void change(SqList<student>& a) {
     system("cls");
     int sign = 0;
     student s;
     cout << "输入位置:(在1-" << a.GetLength() << "之间)" << endl;
     cin >> sign;
     if (sign > 0 && sign < a.GetLength()) {
      a.GetElem(sign, s);
      cout << "原学生信息为:" << endl;
      print_student(s);
      cout << "更改为:" << endl;
      s.set_student();
      a.SetElem(sign, s);
      cout << "更新成功" << endl;
     }
     else {
      cout << "输入错误" << endl;
     }
    }
    //统计:统计表中学生人数。
    void sum_student(SqList<student>& a) {
     system("cls");
     cout << "学生人数为:" << a.GetLength() << endl;
    }
    //排序:按照学号或者绩点进行排序
    void sort(SqList<student>& a) {
     system("cls");
     if (a.GetLength() < 2) {
      cout << "人数过少,无法排序" << endl;
      return;
     }
     int sign = 0;
     cout << "1.按学号排列" << endl;
     cout << "2.按绩点排列" << endl;
     cin >> sign;
     if (sign < 1 && sign>2) {
      cout << "输入错误" << endl;
     }
     else {
      for (int i = 0; i < a.GetLength(); i++) {
       for (int j = 1; j < a.GetLength() - i; j++) {
        student s1, s2;
        a.GetElem(j, s1);
        a.GetElem(j + 1, s2);
        if (sign == 2) {
         if (s1.performance > s2.performance)
          a.change_two(j);
        }
        else {
         if (s1.number > s2.number) {
          a.change_two(j);
         }
        }
       }
      }
     }
     cout << "排序完成" << endl;
    }
    //清空:清空表中所有记录
    void clear_all(SqList<student>& a) {
     for (int i = a.GetLength(); i > 0; i--) {
      student s;
      a.DeleteElem(i, s);
     }
     cout << "清空完成" << endl;
    }

    头文件SqList.hpp:

    #pragma once
    #ifndef __SQ_LIST_H__
    #endif
    #define __SQ_LIST_H__
    // ANSI C++标准库头文件
    #include <cstring>     // 标准串操作
    #include <iostream>     // 标准流操作
    using namespace std;
    // 宏定义
    #define DEFAULT_SIZE 1000   // 缺省元素个数
    #define DEFAULT_INFINITY 1000000 // 缺省无穷大
    
    template <class ElemType>
    class SqList
    {
    protected:
     // 顺序表的数据成员
     int length;     // 顺序表的当前长度 
     int maxLength;    // 顺序表的最大容量
     ElemType* data;   // 元素存储空间的首地址 
    public:
    // 顺序表的函数成 构造一个空表 
     SqList(int size = DEFAULT_SIZE) {
      this->length = 0;
      this->maxLength = size;
      data = new ElemType[DEFAULT_SIZE];
     }
    // 根据数组v的内容构造顺序表 
     template <class ElemType>
     SqList(ElemType v[], int n, int size = DEFAULT_SIZE) {
      this->data = new ElemType(DEFAULT_SIZE);
      this->length = n;
      this->maxLength = size;
      for (int i = 0; i < n; i++) {
       ElemType* a = new ElemType;
       *a = v[i];
       data[i] = *a;
      }
     }
     // 析构函数
     virtual ~SqList() {
     }
     // 取顺序表长度 
     int GetLength() const {
      return this->length;
     }
     // 判断顺序表是否为空
     bool IsEmpty() const {
      return this->length == 0;
     }
     // 将顺序表清空
     void Clear() {
      delete[] data;
      this->length = 0;
     }
     // 遍历顺序表
     template <class ElemType>
     void Traverse(void (*Visit)(const ElemType&)) const {
      for (int i = 0; i < this->length; i++) {
       (*Visit)(data[i]);
      }
      if (this->length == 0)
       cout << "没有成员" << endl;
     }
     // 元素定位,求指定元素在顺序表中的位置
     template <class ElemType>
     int LocateElem(const ElemType& e) {
      int sign = 0;
      for (int i = 0; i < this->length; i++) {
       if (this->data[i] == e) {
        sign = 1;
        return i+1;
       }
      }
      if (sign == 0)
       cout << "没有找到" << endl;
      return -1;
     }
     // 取顺序表中第i个元素的值
     template <class ElemType>
     int GetElem(int i, ElemType& e) const {
      
      if ((i - 1 <= this->length-1)&&i>=0)
       e = data[i - 1];
      else
       cout << "没有找到" << endl;
      return 0;
     }
     // 修改顺序表中第i个元素的值
     template <class ElemType>
     int SetElem(int i, const ElemType& e) {
      if ((i  <= this->length) && i >= 0)
       this->data[i-1] = e;
      else
       cout << "没有找到" << endl;
      return 0;
     }
     // 删除顺序表中第i个元素  
     template <class ElemType>
     int DeleteElem(int i, ElemType& e) {
      e = this->data[i - 1];
      if ((i <= this->length) && i >= 0) {
       for (int j = i - 1; j < this->length - 1; j++)
        this->data[j] = this->data[j + 1];
       this->length--;
      }
      else
       cout << "没有找到" << endl;
      return 0;
     }
     // 在顺序表第i个位置插入元素
     template <class ElemType>
     int InsertElem(int i, const ElemType& e) {
      if (((i-1 <= this->length) && i > 0)) {
       for (int j = this->length; j > i - 1; j--) {
        this->data[j] = this->data[j - 1];
       }
       this->data[i - 1] = e;
      }
      else
       cout << "没有找到" << endl;
      this->length++;
      return 0;
    }
    void change_two(int m) {
      ElemType a;
      a=this->data[m -1];
      this->data[m-1]= this->data[m + 1-1];
      this->data[m + 1-1]=a;
     }
     // 在顺序表表尾插入元素
     template <class ElemType>
     int InsertElem(const ElemType& e) {
      this->data[this->length] = e;
      this->length++;
      return 0;
     }
     // 复制构造函数
     template <class ElemType>
     SqList(const SqList<ElemType>& sa) {
      for (int i = 0; i < sa.GetLength(); i++) {
       this->data[i] = sa.data[i];
      }
      this->length = sa.GetLength();
     }
     // 赋值语句重载
    template <class ElemType>
    SqList<ElemType>& operator =(const SqList<ElemType>& sa) {
     SqList(sa);
     return *this;
    }
    };
    展开全文
  • 相信很多大一的同学在做c语言程序设计期末大作业的时候,都会被这些题目所困扰:学生成绩管理系统学生信息管理系统、图书借阅管理系统、通讯录、选课系统......上网百度到别人的代码,有的人用C++写,有的人用类C...

    目录

    一、前言(学习请从头开始看)

    二、要求和思路

    2.1 要求

    2.2 数据结构的定义

    2.3 基本函数的申明

    2.3.1 链表初始化

    2.3.2 尾部增加节点

    2.3.3 删除节点

    2.3.4 修改节点 

    2.3.5 搜索节点 

    三、具体构建

    3.1 函数申明 

    3.2 读取文件

    3.3 写入文件

    3.4 增加学生

    3.5 删除学生

    3.6 修改学生

    3.7 查找学生

    3.8 显示学生

    3.9 主菜单

    3.10 主函数

    四、完整代码(搬运请看这)

    五、界面展示

    5.1 显示信息

    5.2 删除学生 

    5.3 修改学生 


    一、前言

    相信很多大一的同学在做c语言程序设计期末大作业的时候,都会被这些题目所困扰:学生成绩管理系统、学生信息管理系统、图书借阅管理系统、通讯录、选课系统......上网百度到别人的代码,有的人用C++写,有的人用类C写,有的人用C写,有的人用链表写,有的人用顺序表(结构体数组)写,搬运完别人的代码,还得自己看懂并且修改,以防和别的同学雷同。但不同的学校采用不同的c语言教材,不同的老师又有不同的理念:有的老师要求学生使用vb(Visual Basic)来进行编码,有的老师要求学生使用vs(Visual Studio)来进行编码......

    vb的缺点是比较死板,规范陈旧,如变量申明必须在函数一开始的时候,否则会报错;vs体量大不说,要求用scanf_s来代替scanf,用fopen_s来代替fopen,并且scanf_s在接收字符串的时候用法和传统的scanf不一样,fopen_s的用法也和fopen稍有不同。个人认为如果不做大型项目,大学4年使用Dev-Cpp足以应付基础的C语言学习和C++学习,Dev-Cpp精巧强大,兼容性较好,不像vb和vs一样纠结于细枝末节,令初学者对C语言的学习望而生畏。一般的Dev-Cpp安装好后默认关闭了调试模式,需要手动打开,这里附上教程

    说完IDE,接下来说说语言:受严蔚敏《数据结构(C语言版)》的影响,很多人在学习数据结构的时候逐渐将C语言代码转变为了类C代码,因为默认使用.cpp文件,类C代码(其实就是C语言代码中混入了少量使代码能够更加简洁的C++的语法)在部分IDE中也能运行。本文所使用的也是类C,部分函数为方便采用了C++的引用符号&(C语言中&是取地址符号,C++中既可以用做取地址也可以用作引用),目的是和传统的数据结构教程相对应,有利于读者后续对数据结构的学习。

    通过之前顺序表的学习,相信很多同学都对管理系统的代码结构有了一定的了解,本文用链式结构实现学生成绩管理系统,用到了一些数据结构的思想和理念。

    这里简单介绍一些顺序表和链表的区别:顺序表中每个元素在内存中的分布是连续的,当删除中间的某个元素的时候,需要把其后面的所有元素向前移动,比如删除数组a中的第6个元素,那么原先的第7个元素需要移动到现在第6个的位置,原先的第8个元素需要移动到现在第7个的位置......最后再修改顺序表的长度即可;而链表中每个元素(链表中习惯称作节点)在内存中的分布是离散的,当删除中间的某个节点的时候,只需要把该节点的前一个节点和后一个节点进行链接,再释放该节点的空间。

    首先定义一个数据结构,再申明操作该数据结构的基本函数,最后实现这些基本函数。

    二、要求和思路

    2.1 要求

    对学生信息(学号、姓名、成绩)进行统一管理,实现增、删、改、查、显,且需要用到文件读写的知识对学生信息进行读取和保存。

    2.2 数据结构的定义

    数据结构的思想就是基于现有的数据结构(本文的数据结构是链表)和相关函数来实现需求。

    链表中的每一个节点都有数据域和指针域,数据域用来存放该节点所存储的信息,指针域用来获取下一个节点在内存中的位置。如下是非常经典的链表节点的定义方式:

    typedef struct LNode{//定义节点 
    	ElemType data;   //数据域 
    	LNode *next;     //指针域 
    }LNode, *LinkList;

    typedef 可以理解为是一个取名字的符号,他将struct LNode这个结构体取了一个简单的代号叫LNode。通常我们定义一个结构体变量,需要这样写struct LNode p,当我们取完代号之后,可以直接写作LNode p。这里举一个一般的例子说明一下

    #include<stdio.h>
    struct a{
    	int b;
    };
    typedef struct a a;
    int main(){
    	a b;
    	b.b = 2;
    	printf("%d", b.b);
    }

    这段代码首先声明结构体a,接着将结构体a取代号为a,即省略了struct。然后在主函数中直接使用a来声明一个结构体变量b,再对他进行赋值和输出。

    这段代码和链表节点的定义方式的区别在于,节点的定义方式取代号和申明结构体同时进行,然后用代号在节点结构体中申明一个指针变量,可以说是一举三得。而这段代码就比较中规中矩,便于理解了。肯定有人要问*LinkList是怎么回事,*LinkList和他左边的LNode一样,也是代号,只不过这个代号的类型是指向LNode的指针。可以这样理解,*表示这个代号的类型是LNode类型的指针,LinkList表示这个代号的具体名字。为什么这里要申明一个LNode类型的指针呢?当然是为了编程方便。后面出现的LinkList其实都可以用LNode *来替换。 

    2.3 基本函数的申明

    链表的基本函数有很多,但最最最基础的只有几个,初始化链表、销毁链表、增加节点、删除节点、查找节点、修改节点、打印节点。这里先罗列链表的基本函数:(本文省略了销毁链表)

    void CreateList(LinkList &L);                    //创建链表 
    void NodeAppend(LinkList &L, ElemType e);		 //增加节点 
    int NodeDelete(LinkList &L, int num);			 //删除节点 
    int NodeModify(LinkList &L, int num, ElemType e);//修改节点 
    int NodeSearch(LinkList L, int num, ElemType &e);//查找节点 

    这里CreateList和NodeAppend的函数类型是void,意思是没有返回值,而其余三个函数的返回值是int,通过返回值来判断删除、修改、查找操作是否成功。当然,创建链表和增加节点的操作也可能不成功,即没有内存空间可以申请,遇到这种情况通常是直接用exit(1)来退出整个程序,但一般来说,这两个操作都是能正常运行的,所以我也就没写异常退出的情况了。

    2.3.1 链表初始化

    //创建链表(含头节点) 
    void CreateList(LinkList &L){
    	L = (LinkList)malloc(sizeof(LNode));
    	L -> next = NULL;
    }

    朴实无华的创建一个链表。

    2.3.2 尾部增加节点

    //尾部增加节点 
    void NodeAppend(LinkList &L, ElemType e){
    	LNode *q = (LinkList)malloc(sizeof(LNode));
    	q -> data = e;
    	q -> next = NULL;
    	LNode *p = L;
    	while(p -> next) p = p -> next;
    	p -> next = q;
    }

    一般插入都采用的是头插法,即在链表头部插入,这里为了逻辑更清晰一些,采用了更费时的尾部插入法。首先函数传入的参数是L和e,L是链表,e是新增节点的数据域。要插入一个节点,首先需要申明一个节点空间用于存储e。这里LNode *q = (LinkList)malloc(sizeof(LNode))的作用是申明一个LNode类型的指针q,申明一段LNode大小的空间,并让q指向这段空间。当然也可以写作LNode *q = (LNode *)malloc(sizeof(LNode)),因为LNode * 和 LinkList是等价的。正常来说,q是一个指针,想要对q指向的空间进行赋值,应该使用解地址符*,考虑到q是指针类型,c\c++对结构体的指针类型的数据提供了一个更便捷的符号 ->,用以直接访问该指针指向的结构体的内部成员。当然你也可以使用*来实现,如q -> data = e可以改写为 (*q).data = e

    接着申明一个指针变量p指向链表的头部,通过while循环将p逐步更新,直到p -> next为空,此时p指向链表尾部的节点,用q来更新p -> next实现节点的尾部插入。

    2.3.3 删除节点

    //根据编号删除节点 
    int NodeDelete(LinkList &L, int num){
    	LNode *p,*q;
    	p = L;
    	while(p -> next){
    		q = p -> next;
    		if(num == (q -> data).num){
    			p -> next = q -> next;
    			free(q);
    			return 0;
    		} 
    		p = p -> next;
    	}
    	return 1;
    }

    返回0表示删除成功,返回1表示未找到节点,删除失败。

    2.3.4 修改节点 

    //根据编号修改节点 
    int NodeModify(LinkList &L, int num, ElemType e){
    	LNode *p,*q;
    	p = L;
    	while(p -> next){
    		q = p -> next;
    		if(num == (q -> data).num){
    			q -> data = e;
    			return 0;
    		} 
    		p = p -> next;
    	}
    	return 1;
    }

     返回0表示修改成功,返回1表示未找到节点,修改失败。

    2.3.5 搜索节点 

    //根据编号搜索节点,若找到则将节点信息存储至e并返回 
    int NodeSearch(LinkList L, int num, ElemType &e){
    	LNode *p, *q;
    	p = L;
    	while(p -> next){
    		q = p -> next;
    		if(num == (q -> data).num){
    			e = q -> data;
    			return 0;
    		} 
    		p = p -> next;
    	}
    	return 1;
    }

    返回0表示查找成功,返回1表示未找到节点,查找失败。

    三、具体构建

    实现了基本的数据结构(数据结构和基本操作),现在只要在其基础上增加交互性就能实现成绩管理系统。

    首先要定义学生信息结构体,并将其取代号为ElemType来和链表的数据域相统一。

    //student结构体存储学生信息 
    typedef struct student{
       int num;//学号
       char name[10];//姓名
       int score;//分数 
    }student;
    typedef student ElemType;

    这里先将struct student取代号为student,再将student取代号为ElemType。当然也可以一步到位。

    //student结构体存储学生信息 
    typedef struct student{
       int num;//学号
       char name[10];//姓名
       int score;//分数 
    }ElemType;

     这里再提供一种方法,请读者自行理解。

    //student结构体存储学生信息 
    typedef struct{
       int num;//学号
       char name[10];//姓名
       int score;//分数 
    }student;
    typedef student ElemType;

    3.1 函数申明 

    void ReadFile(LinkList &L);						 //读取文件 
    void WriteFile(LinkList L); 					 //写入文件 
    void AddStudent(LinkList &L);					 //增加学生 
    void DeleteStudent(LinkList &L);				 //删除学生 
    void ModifyStudent(LinkList &L);				 //修改学生 
    void SearchStudent(LinkList L);					 //查找学生 
    void DisplayStudent(LinkList L);				 //显示学生 
    void Menu();                                     //主菜单 

    3.2 读取文件

    //读取文件中的数据到链表 
    void ReadFile(LinkList &L){
    	FILE *fp = NULL;
    	fp = fopen("student.txt", "r");
    	if(fp == NULL){
            printf("Can not open the file\n");
            exit(1);
        }
        CreateList(L);
        ElemType temp;
    	while(fscanf(fp, "%d %s %d", &temp.num, temp.name, &temp.score) != EOF){
    		NodeAppend(L, temp);
    	}
    	fclose(fp); 
    }

    3.3 写入文件

    //将链表中的数据用覆盖的方式写入文件中 
    void WriteFile(LinkList L){
    	FILE *fp = NULL;
    	fp = fopen("student.txt", "w");
    	if(fp == NULL){
            printf("Can not open the file\n");
            exit(1);
        }
        LNode *p = L;
        ElemType temp;
        while(p -> next){
        	temp = p -> next -> data;
        	fprintf(fp, "%d %s %d\n", temp.num, temp.name, temp.score);
        	p = p -> next;
    	} 
    	fclose(fp);
    }

    3.4 增加学生

    //录入学生信息 
    void AddStudent(LinkList &L){
    	ElemType e;
    	printf("请输入要录入的学生信息:\n");
    	printf("学号\t姓名\t分数\n");
    	scanf("%d %s %d", &e.num, e.name, &e.score);
    	NodeAppend(L, e);
    	system("pause");
    }

    3.5 删除学生

    //删除学生信息 
    void DeleteStudent(LinkList &L){
    	int num;
    	printf("请输入要删除的学生学号:");
    	scanf("%d", &num);
    	if(NodeDelete(L,num) == 1) 
    		printf("未查找到该学生!\n");
    	else 
    		printf("删除成功!\n");
    	system("pause");
    }

    3.6 修改学生

    //修改学生信息 
    void ModifyStudent(LinkList &L){
    	ElemType e;
    	int num; 
    	printf("请输入要修改的学生的当前学号:");
    	scanf("%d", &num);
    	printf("请输入修改后的信息:学号 姓名 分数\n");
    	scanf("%d %s %d", &e.num, e.name, &e.score);
    	if(NodeModify(L, num, e) == 1) 
    		printf("未查找到该学生!\n");
    	else 
    		printf("修改成功!\n");
    	system("pause");
    }

    3.7 查找学生

    //查找学生信息 
    void SearchStudent(LinkList L){
    	ElemType e;
    	int num; 
    	printf("请输入要查找的学生学号:\n");
    	scanf("%d", &num);
    	if(NodeSearch(L, num, e) == 1) 
    		printf("未查找到改该学生!\n");
    	else 
    		printf("学号\t姓名\t分数\n%d %s %d\n", e.num, e.name, e.score);
    	system("pause");
    }

    3.8 显示学生

    //显示学生信息 
    void DisplayStudent(LinkList L){  
    	printf("学号\t姓名\t分数\n");
    	LNode *p = L;
    	ElemType e;
    	while(p -> next){
    		e = (p -> next) -> data;
    		printf("%d %s %d\n", e.num, e.name, e.score);
    		p = p -> next;
    	}
    	system("pause");
    }

    3.9 主菜单

    //主菜单 
    void Menu(){
    	system("cls"); 
    	printf("------------------------------------------\n");
    	printf("             学生管理系统                 \n");
    	printf("                                          \n"); 
    	printf("          作者微信:qczsbwjzjn            \n");
    	printf("                                          \n");
    	printf("             欢迎交流咨询~                \n");
    	printf("                                          \n");
    	printf("    1.增加学生信息    2.删除学生信息      \n");
    	printf("                                          \n");
    	printf("    3.修改学生信息    4.查找学生信息      \n"); 
    	printf("                                          \n"); 
    	printf("    5.显示所有信息    0.退出管理系统      \n");
    	printf("                                          \n");
    	printf("------------------------------------------\n");
    	printf("                                          \n");
    	printf("    请输入:");
    }

    3.10 主函数

    //主函数 
    int main(){
    	LinkList L;
    	CreateList(L);
    	ReadFile(L);
    	int choice = 1;
    	while(choice){
    		Menu();
    		scanf("%d", &choice);
    		switch(choice){
    			case 1: AddStudent(L); break;
    			case 2: DeleteStudent(L); break;
    			case 3: ModifyStudent(L); break;
    			case 4: SearchStudent(L); break;
    			case 5: DisplayStudent(L); break;
    			case 0: WriteFile(L); break;
    		}
    	}
    	return 0;
    }

    四、完整代码

    #include<stdio.h>
    #include <stdlib.h>
    
    //student结构体存储学生信息 
    typedef struct student{
       int num;//学号
       char name[10];//姓名
       int score;//分数 
    }ElemType;
    
    typedef struct LNode{//定义节点 
    	ElemType data;   //数据域 
    	LNode *next;     //指针域 
    }LNode, *LinkList;
     
    void CreateList(LinkList &L);                    //创建链表 
    void NodeAppend(LinkList &L, ElemType e);		 //增加节点 
    int NodeDelete(LinkList &L, int num);			 //删除节点 
    int NodeModify(LinkList &L, int num, ElemType e);//修改节点 
    int NodeSearch(LinkList L, int num, ElemType &e);//查找节点 
    void ReadFile(LinkList &L);						 //读取文件 
    void WriteFile(LinkList L); 					 //写入文件 
    void AddStudent(LinkList &L);					 //增加学生 
    void DeleteStudent(LinkList &L);				 //删除学生 
    void ModifyStudent(LinkList &L);				 //修改学生 
    void SearchStudent(LinkList L);					 //查找学生 
    void DisplayStudent(LinkList L);				 //显示学生 
    void Menu();                                     //主菜单 
    
    //创建链表(含头节点) 
    void CreateList(LinkList &L){
    	L = (LinkList)malloc(sizeof(LNode));
    	L -> next = NULL;
    }
    
    //尾部增加节点 
    void NodeAppend(LinkList &L, ElemType e){
    	LNode *q = (LinkList)malloc(sizeof(LNode));
    	q -> data = e;
    	q -> next = NULL;
    	LNode *p = L;
    	while(p -> next) p = p -> next;
    	p -> next = q;
    }
    
    //根据编号删除节点 
    int NodeDelete(LinkList &L, int num){
    	LNode *p,*q;
    	p = L;
    	while(p -> next){
    		q = p -> next;
    		if(num == (q -> data).num){
    			p -> next = q -> next;
    			free(q);
    			return 0;
    		} 
    		p = p -> next;
    	}
    	return 1;
    }
    
    //根据编号修改节点 
    int NodeModify(LinkList &L, int num, ElemType e){
    	LNode *p,*q;
    	p = L;
    	while(p -> next){
    		q = p -> next;
    		if(num == (q -> data).num){
    			q -> data = e;
    			return 0;
    		} 
    		p = p -> next;
    	}
    	return 1;
    }
    
    //根据编号搜索节点,若找到则将节点信息存储至e并返回 
    int NodeSearch(LinkList L, int num, ElemType &e){
    	LNode *p, *q;
    	p = L;
    	while(p -> next){
    		q = p -> next;
    		if(num == (q -> data).num){
    			e = q -> data;
    			return 0;
    		} 
    		p = p -> next;
    	}
    	return 1;
    }
    
    //读取文件中的数据到链表 
    void ReadFile(LinkList &L){
    	FILE *fp = NULL;
    	fp = fopen("student.txt", "r");
    	if(fp == NULL){
            printf("Can not open the file\n");
            exit(1);
        }
        CreateList(L);
        ElemType temp;
    	while(fscanf(fp, "%d %s %d", &temp.num, temp.name, &temp.score) != EOF){
    		NodeAppend(L, temp);
    	}
    	fclose(fp); 
    }
    
    //将链表中的数据用覆盖的方式写入文件中 
    void WriteFile(LinkList L){
    	FILE *fp = NULL;
    	fp = fopen("student.txt", "w");
    	if(fp == NULL){
            printf("Can not open the file\n");
            exit(1);
        }
        LNode *p = L;
        ElemType temp;
        while(p -> next){
        	temp = p -> next -> data;
        	fprintf(fp, "%d %s %d\n", temp.num, temp.name, temp.score);
        	p = p -> next;
    	} 
    	fclose(fp);
    }
    
    //录入学生信息 
    void AddStudent(LinkList &L){
    	ElemType e;
    	printf("请输入要录入的学生信息:\n");
    	printf("学号\t姓名\t分数\n");
    	scanf("%d %s %d", &e.num, e.name, &e.score);
    	NodeAppend(L, e);
    	system("pause");
    }
    
    //删除学生信息 
    void DeleteStudent(LinkList &L){
    	int num;
    	printf("请输入要删除的学生学号:");
    	scanf("%d", &num);
    	if(NodeDelete(L,num) == 1) 
    		printf("未查找到该学生!\n");
    	else 
    		printf("删除成功!\n");
    	system("pause");
    }
    
    //修改学生信息 
    void ModifyStudent(LinkList &L){
    	ElemType e;
    	int num; 
    	printf("请输入要修改的学生的当前学号:");
    	scanf("%d", &num);
    	printf("请输入修改后的信息:学号 姓名 分数\n");
    	scanf("%d %s %d", &e.num, e.name, &e.score);
    	if(NodeModify(L, num, e) == 1) 
    		printf("未查找到该学生!\n");
    	else 
    		printf("修改成功!\n");
    	system("pause");
    }
    
    //查找学生信息 
    void SearchStudent(LinkList L){
    	ElemType e;
    	int num; 
    	printf("请输入要查找的学生学号:\n");
    	scanf("%d", &num);
    	if(NodeSearch(L, num, e) == 1) 
    		printf("未查找到改该学生!\n");
    	else 
    		printf("学号\t姓名\t分数\n%d %s %d\n", e.num, e.name, e.score);
    	system("pause");
    }
    
    //显示学生信息 
    void DisplayStudent(LinkList L){  
    	printf("学号\t姓名\t分数\n");
    	LNode *p = L;
    	ElemType e;
    	while(p -> next){
    		e = (p -> next) -> data;
    		printf("%d %s %d\n", e.num, e.name, e.score);
    		p = p -> next;
    	}
    	system("pause");
    }
    
    //主菜单 
    void Menu(){
    	system("cls"); 
    	printf("------------------------------------------\n");
    	printf("             学生管理系统                 \n");
    	printf("                                          \n"); 
    	printf("          作者微信:qczsbwjzjn            \n");
    	printf("                                          \n");
        printf("             可以帮忙代写,                \n");
    	printf("             欢迎交流咨询~                \n");
    	printf("                                          \n");
    	printf("    1.增加学生信息    2.删除学生信息      \n");
    	printf("                                          \n");
    	printf("    3.修改学生信息    4.查找学生信息      \n"); 
    	printf("                                          \n"); 
    	printf("    5.显示所有信息    0.退出管理系统      \n");
    	printf("                                          \n");
    	printf("------------------------------------------\n");
    	printf("                                          \n");
    	printf("    请输入:");
    }
    
    //主函数 
    int main(){
    	LinkList L;
    	CreateList(L);
    	ReadFile(L);
    	int choice = 1;
    	while(choice){
    		Menu();
    		scanf("%d", &choice);
    		switch(choice){
    			case 1: AddStudent(L); break;
    			case 2: DeleteStudent(L); break;
    			case 3: ModifyStudent(L); break;
    			case 4: SearchStudent(L); break;
    			case 5: DisplayStudent(L); break;
    			case 0: WriteFile(L); break;
    		}
    	}
    	return 0;
    }

    五、界面展示

    5.1 显示信息

    5.2 删除学生 

    5.3 修改学生 

    下面附上下载链接(含测试文件)

    作者微信:qczsbwjzjn         欢迎交流咨询

    展开全文
  • 学生管理系统c++链表实现

    千次阅读 多人点赞 2016-04-10 22:22:18
    学生管理系统,c++,链表,c; 学生管理系统,主要划分为以下三个模块: 1) 学生:包括增加学生信息、删除学生信息、修改学生信息、查找学生信息、学生选课。 2) 课程:包括增加课程信息、删除课程信息、修改课程...
    简单版学生管理系统,c++,链表实现,如果你是计算机系的学生真的希望你不要完全复制,做下参考自己编写出来才能有所收获,这是对你的将来负责;
    学生管理系统,主要划分为以下三个模块: 
        1) 学生:包括增加学生信息、删除学生信息、修改学生信息、查找学生信息、学生选课。 
        2) 课程:包括增加课程信息、删除课程信息、修改课程信息、查找课程信息。
        3)拓展功能:文件导入,文件导出。
    #include<iostream>
    #include<fstream>
    #include<string>
    using namespace std;
    const int nubofCourse = 10;//学生最多可以选修的课程
    typedef struct StudentMessage *sMessage;//学生结点指针类型
    typedef struct Courses *sCourse;//课程结点指针类型
    fstream foutint;//文件导入导出
    /*课程结构体*/
    struct Courses {
    	int stdCourstcount;
    	string cNo;
    	string cName;
    	string scTeacher;
    	string stdNo[nubofCourse];
    	sCourse cNext;
    };
    /*学生结构体*/
    struct StudentMessage {
        string sNo;//学号
    	string sClass;
    	string sName;
    	char  sSex;
    	sMessage sNext;
    };
    
    typedef sMessage sm;//学生头指针类型
    typedef sCourse sc;//课程头指针类型			  
    /*关于我们,关于程序*/
    void aboutMe() {  //首页打印设置 
    	string input;
    	cout << "\n\n\t\t\t*****************************\n";
    	cout << "\t\t\t      学生信息管理系统\n";
    	cout << "\t\t\t*****************************\n\n\n";
    	// cout<<"\n\t\t\t    欢迎来到学生信息管理系统\n\n";
    	cout << "--------------------------------------------------------------------------------\n";
    	cout << "\n\t\t\t拼搏到无能为力,\n";  cout << "\t\t\t\t       坚持到感动自己!\n";
    	cout << "\t   开发者:路ren甲\n\n";  cout << "\t   联系方式:QQ:1508287079     or     Mail To:1508287079@qq.com\n";
    	cout << " \n--------------------------------------------------------------------------------\n";
    	//cout<<"\t______________________________________________________________________\n"; 
    	cout << "\t\t版权所有@路ren甲\n\n\n";
    	cout << "\t<输入任意字符进入>\n\t";
    	cin >> input;  //让用户输入一个字符后再进行下一步  
    	system("cls");    //清屏
    }
    //再见页面
    void goodbye() {  //首页打印设置 
    	string input;
    	// cout<<"\n\t\t\t    欢迎来到学生信息管理系统\n\n";
    	cout << " \n\n\n\n\n\n\n\n--------------------------------------------------------------------------------\n";
    	cout << "\n\t\t可能程序还有许多不足,\n";  cout << "\t\t\t 希望大家可以提出或者修改!\n";
      cout << "\t\t\t\t再见,遇见成功的自己!\n";
    	cout << " \n--------------------------------------------------------------------------------\n";
    	cout << "\t<输入任意字符关闭>\n\t";
    	cin >> input;  //让用户输入一个字符后再进行下一步  
    	exit(1);    //清屏
    }
    //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓课程函数↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//
    sc initC() {
    
    	sCourse chead;
    	chead = new Courses;
    	chead->cNext = NULL;
    	return chead;
    }
    //打印课程信息
    int ptfselect_SCourse(sc head, string sId) {
    	int flags = 0;
    	if (head->cNext == NULL) { cout << "\n\t\t\t没有选到课喔……………!_!-_-\n"; return 1; }
    	cout << "\t\t课程编号" << "\t   课程名称" << "\t   开课老师" << endl;
    	//课程信息
    	head = head->cNext;
    	while (head != NULL) {
    		for (int l = 0; l < nubofCourse; l++) {
    			if (head->stdNo[l] == sId) {
    				flags = 1;
    				cout << "\t\t" << head->cNo << "\t\t" << head->cName << "\t\t" << head->scTeacher << "\t\n";
    			}
    		}
    		head = head->cNext;
    	}
    	if (flags == 0) { cout << "\n\t\t\t没有选到课喔……………!_!-_-\n"; }
    	cout << "\t\t----------------------------------------------------\n";
    	return 1;
    }
    int ptfSCourse(sc cHead) {
    	if (cHead->cNext == NULL) { cout << "没有课程信息\n"; return 0; }
    	//全部学生信息
    	cout << "\n\t\t课程编号" << "\t   课程名称" << "\t   开课老师" << endl;
    
    	cHead = cHead->cNext;
    	while (cHead != NULL) {
    		cout << "\t\t" << cHead->cNo << "\t\t" << cHead->cName << "\t\t" << cHead->scTeacher<< "\t\n";
    		cHead = cHead->cNext;
    	}
    	return 1;
    }
    void printfCourse(sc head, int i) {
    	//一个课程信息
    	int j;
    	sCourse find;
    	j = 0;
    	find = head->cNext;
    	cout << "\n\t\t课程编号" << "\t\t课程名称" << "\t\t开课老师" << endl;
    	while (find != NULL) {
    		j++; if (j == i) {
    			cout << "\t\t" << find->cNo << "\t\t" << find->cName << "\t\t" << find->scTeacher << "\t\n";
    			break;
    		}
    		find = find->cNext;
    	}
    
    }
    void pfCourse(sc head) {
    	cout << "\n\t\t课程编号" << "\t\t课程名称" << "\t\t开课老师" << endl;
    	cout << "\t\t" << head->cNo << "\t\t" << head->cName << "\t\t" << head->scTeacher << "\t\n";
    	cout << endl;
    }
    查找课程
    int locateCourse(sc chead, string numb) {
    	int j = 0;
    	chead = chead->cNext;
    	while (chead != NULL) {
    		j++;//统计
    		if (numb == chead->cNo) {
    			return j;
    		}
    		chead = chead->cNext;
    	}
    	return 0;
    
    }
    添加课程
    void addCourse(sc scHead) {
    	sc cnew;//新课程
    	int  g = 0,k=0;
    	char flag = 'y';
    	while (flag == 'y') {
    		cnew = new Courses;
    		cnew->stdCourstcount = 0;
    		
    		while (g==0) {
    			g = 1;
    			cout << "输入课程编号(六位数字):";
    			cin >> cnew->cNo;
    			if (locateCourse(scHead,cnew->cNo) != 0) { cout << "课程编号已经存在,请重新输入" << endl; g = 0; }
    			
    		} 
    		g = 0;
    		cout << "输入课程名称:";
    		cin >> cnew->cName;
    		cout<<"输入教师姓名:";
    		cin >> cnew->scTeacher;
    		cnew->cNext = scHead->cNext;
    		scHead->cNext = cnew;
    		cout << "您想继续进行添加吗?输入y继续,输入n退出" << endl;
    		cout << "输入你的选择(y/n):";
    		cin >> flag;
    	}
    	//system("cls");
    	cout << "已经添加课程信息成功\n" << endl;
    	
    }
    //修改课程信息
    int updatesCourse(sc chead) {
    	string fdc;
    	int k = 0;
    
    	if (chead->cNext == NULL) { cout << "没有课程数据,请添加课程" << endl; return 0; }
    	cout << "输入修改课程编号:";
    	cin >> fdc;
    	chead = chead->cNext;
    	while (chead != NULL) {
    		k++;//统计
    		if (fdc == chead->cNo) {
    			pfCourse(chead);
    			cout << "课程名称:";
    			cin >> chead->cName;
    			cout << "开课老师:";
    			cin >> chead->scTeacher;	
    			cout << "修改课程" << chead->cNo << "信息成功!";
    			return k;
    		}
    		chead = chead->cNext;
    	}
    	return 0;
    
    }
    int deletesCourse(sc cHead) {
    	string del;
    	char flag;
    	int f = 0;
    	sCourse deletestd,preform;
    	int j = 0;
    	if (cHead->cNext == NULL) { cout << "没有课程数据,请添加课程" << endl; return 0; }
    	preform = cHead;
    	deletestd = cHead->cNext;//从首节点开始扫描
    	cout << "输入删除课程编号:";
    	cin >> del;//删除课程
    
    	while (deletestd != NULL) {
    		f = 0;
    		j++;
    		if (deletestd->cNo==del) {
    			pfCourse(deletestd);
    			cout << "是否删除该课程(y/n),输入你的选择:";
    			cin >> flag;
    			if (flag == 'y') {
    				cout << "删除课程" << deletestd->cName << "成功!";
    				preform->cNext = deletestd->cNext;
    				delete deletestd;
    				return j;
    			}
    			else {
    				cout << "你已经取消删除" << deletestd->cNext->cName << endl;
    				return 0;
    			}
    		}
    		preform=preform->cNext;
    		deletestd = deletestd->cNext;
    		f = 1;
    	}
    	if (f == 1) { cout << "不存在该学生找到了"; }
    	return 0;//不存在该学生找到了
    }
    //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓学生函数↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//
    /*初始化*/
    sm init() {
    	sMessage shead;
    	shead = new StudentMessage;
    	shead->sNext = NULL;
    	return shead;
    }
    //打印学生信息
    void printfSMessge(sm head, sc cHead) {
    	sm find2;
    	string fc;
    	int i = 0;
    	if (head == NULL) cout << "没有学生信息";
    	find2 = head->sNext;
    	//全部学生信息
    	head = head->sNext;
    	while (head != NULL) {
    		cout << "\t\t---------------------第"<<++i<<"位--------------------------\n";
    		cout << "\t\t\t\t姓名:" << head->sName << "\t\n";
    		if (head->sSex == '1') {
    			cout << "\t\t\t\t性别:男" << "\t\n";
    		}
    		else if (head->sSex == '0') {
    			cout << "\t\t\t\t性别:女" << "\t\n";
    		}
    		cout << "\t\t\t\t学号:" << head->sNo << "\t\n";
    		cout << "\t\t\t\t班级:" << head->sClass << "\t\n";
    
    		cout << "\n\t\t\t选修课程:\n";
    		if (find2 != NULL) {
    			fc =find2->sNo;
    			ptfselect_SCourse(cHead, fc);//输出学生选课
    		}
    		find2 = find2->sNext;
    		head = head->sNext;
    	}
    	
    
    }
    void printfPerson(sm head, int i,sc cHead) {
    	//一个学生信息
    	int j;
    	string fc;
    	sMessage find, find2;
    	//if(i==0) return head;
    	//	if(i<0) return ;//位置非法。无此结节点
    	j = 0;
    	find = head->sNext;
    	find2 = head->sNext;
    	while (find != NULL){
    		j++; if (j == i) {
    			cout << "\t\t----------------------------------------------------\n";
    			cout << "\t\t\t\t姓名:" << find->sName << "\t\n";
    			if (find->sSex == '1') {
    				cout << "\t\t\t\t性别:男" << "\t\n";
    			}
    			else if (find->sSex == '0') {
    				cout << "\t\t\t\t性别:女" << "\t\n";
    			}
    			cout << "\t\t\t\t学号:" << find->sNo << "\t\n";
    			cout << "\t\t\t\t班级:" << find->sClass << "\t\n";
    		
    			cout << "\n\t\t\t选修课程:\n";
    			while (find2 != NULL) {
    				fc = find2->sNo;
    				if(ptfselect_SCourse(cHead, fc)==1) break;//输出学生选课
    			}
    			break;
    		}
    		find2 = find2->sNext;
    		find = find->sNext;
    	}
    
    }
    void pfPerson(sm head) {
    	cout << "\t\t----------------------------------------------------\n";
    	cout << "\t\t\t\t姓名:" << head->sName << "\t\n";
    	if (head->sSex == '1') {
    		cout << "\t\t\t\t性别:男" << "\t\n";
    	}
    	else if (head->sSex == '0') {
    		cout << "\t\t\t\t性别:女" << "\t\n";
    	}
    	cout << "\t\t\t\t学号:" << head->sNo << "\t\n";
    	cout << "\t\t\t\t班级:" << head->sClass << "\t\n";
    
    	cout << "\t\t----------------------------------------------------\n";
    }
    查找学生
    int locateStdfByNo(sm sHead, string numb) {
    	int j = 0;
    	if (sHead->sNext == NULL) { cout << "没有学生数据,请添加学生" << endl; return NULL; }
    	sHead = sHead->sNext;
    	j = 0;
    	while (sHead != NULL) {
    		j++;//统计
    		if (numb==sHead->sNo) {
    			return j;
    		}
    		sHead = sHead->sNext;
    	}
    	return 0;
    }
    int locateByName(sm sHead, string sname,sc cHead) {
    	int j = 0;
    	sm head=sHead;
    	if (sHead->sNext == NULL) { cout << "没有学生数据,请添加学生" << endl; return NULL; }
    	sHead = sHead->sNext;
    	while (sHead != NULL) {
    		j++;
    		if (sHead->sName == sname) { printfPerson(head, j, cHead);
    		}
    		sHead = sHead->sNext;
    	}
    	return 0;
    }
    //添加学生
    void addStudent(sm sHead) {
    	sMessage snew;//新学生
    	int f = 1,g=0;
    	char flag = 'y';
    	while (flag == 'y') {
    		snew = new StudentMessage;
    		while (f == 1) {//判断学号和输入学号
    			f = 0;
    			cout << "输入学号6位数字:";
    			cin >> snew->sNo;
    			if (locateStdfByNo(sHead, snew->sNo) != 0) { cout << "学号已经存在,请重新输入"<<endl; f = 1;}//判断学号是否重复
    			
    		}
    		cout << "输入姓名:";
    		cin >> snew->sName;
    		f = 1;
    	     while(f==1){
    			 f = 0;
    		     cout << "输入性别选择<男:1><女:0>:";
    		     cin >> snew->sSex;
    		    if (snew->sSex!='1'&& snew->sSex != '0'&&f==0) { cout << "选择操作不对,请重新输入"<<endl; f = 1; }
    			
    		 }
    		 f = 1;
    		cout << "输入班级:";
    		cin >> snew->sClass;
    		snew->sNext = sHead->sNext;
    		sHead->sNext = snew;
    		pfPerson(snew);
    		cout << "您想继续进行添加吗?输入y继续,输入n退出" << endl;
    		cout << "输入你的选择(y/n):";
    		cin >> flag;
    
    	}
    	//system("cls");
    	cout << "已经添加学生信息成功" << endl;
    
    }
    //修改学生信息
    int updates(sm sHead) {
    	char flagc = 'y';
    	string numb;
    	int j = 0,f=1;
    	if (sHead->sNext == NULL) { cout << "没有学生数据,请添加学生" << endl; return 0; }
    	cout << "输入修改学生学号:";
    	cin >> numb;
    	sHead = sHead->sNext;
    	while (sHead != NULL) {
    		j++;//统计
    		if ( numb== sHead->sNo) {
    			pfPerson(sHead);
    			cout << "\n输入修改信息\n";
    			while (f == 1) {
    				f = 0;
    				cout << "输入性别选择<男:1><女:0>:";
    				cin >> sHead->sSex;
    				if (sHead->sSex != '1' && sHead->sSex != '0') { cout << "选择操作不对,请重新输入" << endl; f = 1; }
    
    			}
    			cout << "输入姓名:";
    			cin >> sHead->sName;
    			f = 1;
    			cout << "输入班级:";
    			cin >> sHead->sClass;
    			return j;
    		}
    		sHead = sHead->sNext;
    	}
    	return 0;
    }
    //删除
    int deletesMessage(sm sHead) {
    	string numb;
    	char flag;
    	sMessage deletestd, preform;
    	int j = 0, i = 0;
    	if (sHead->sNext == NULL) { cout << "没有学生数据,请添加学生" << endl; return 0; }
    	preform = sHead;
    	deletestd = sHead->sNext;//从首节点开始扫描
    	cout << "输入删除学生学号:";
    	cin >> numb;
    
    	while (deletestd != NULL) {
    		j++;
    		if (deletestd->sNo==numb) {
    			pfPerson(deletestd);
    			cout << "是否删除该学生(y/n),输入你的选择:";
    			cin >> flag;
    			if (flag == 'y') {
    				cout << "你已经删除" << deletestd->sName << "成功!";
    				preform->sNext = deletestd->sNext;
    				delete(deletestd->sNext);
    				return j;
    			}
    			else {
    				cout << "你已经取消删除" << deletestd->sNext->sName;
    				return j;
    			}
    		}
    		preform = preform->sNext;
    		deletestd = deletestd->sNext;
    		i = 1;
    	}
    
    	if (i == 1) cout << "没有找到该学生!-_-!\n";
    
    	return 0;//不存在该学生找到了
    }
    //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓选择排序↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//
    sMessage getminkey(sm p) {
    	sm minp, exchange, perfrom;
    	if (p->sNext == NULL) {
    		return p;
    	}
    	minp = p;
    	perfrom = p;
    	p = p->sNext;
    	while (p) {
    		if (minp->sNo>p->sNo) {
    			exchange = minp;
    			minp = p;
    			perfrom->sNext = p->sNext;
    			minp->sNext = exchange;//minp是较小值的指针
    		}
    		perfrom = p;
    		p = p->sNext;
    	}
    	return minp;//返回较小值的指针
    }
    sm selectsort(sm head, sm newHead) {
    	sm j, i, temp;
    	if (head->sNext == NULL || newHead == NULL) cout << "没有学生数据,请添加学生\n";
    	i = head;
    	j = newHead;
    	i = i->sNext;
    	while (i != NULL) {//尾插法
    		i = getminkey(i);
    		j->sNext = i;
    		temp = i->sNext;
    		i->sNext = NULL;
    		j = i;
    		i = temp;
    	}
    	head->sNext = newHead->sNext;
    	return newHead;
    }
    //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓导出程序↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//
    void savePersonFile(sm student, sc course) {
    	ofstream *outfile[50], out;
    	int j = 0, k = 0;
    	//写入方式为追加
    	student = student->sNext;
    	course = course->cNext;
    	while (student != NULL) {
    		string str = "Project16";
    		//string i;
    		//ostringstream change;
    		str.append(student->sName);
    		//change << j;
    		//i = change.str();
    		//str.append(i);
    		str.append(".txt");
    		outfile[j] = new ofstream(str, ios::ate);
    		*outfile[j] << "\t\t\t\t学生信息:" << endl;
    		*outfile[j] << "\t\t学号:" << student->sNo << endl;
    		*outfile[j] << "\t\t姓名:" << student->sName << endl;
    		if (student->sSex = '1'){
    			*outfile[j] << "\t\t性别:" << "男" << endl;
    		}
    		else {
    			*outfile[j] << "\t\t性别:" << "女" << endl;
    		}
    		*outfile[j] << "\t\t班级:" << student->sClass << endl;
    
    		*outfile[j] << "\t\t\t\t选修课程:" << endl;
    		while (course != NULL) {
    			for (int l = 0; l < nubofCourse; l++) {
    				if (course->stdNo[l] == student->sNo) {
    					k = 1;
    					*outfile[j] << "\t\t课程名称:" << course->cName << endl;
    					*outfile[j] << "\t\t课程编号:" << course->cNo << endl;
    					*outfile[j] << "\t\t开课老师:" << course->scTeacher << endl;
    				}
    			}
    			course = course->cNext;
    		}
    		if (k == 0) *outfile[j] << "\t\t\t没有选修课程:" << endl;
    		student = student->sNext;
    		(*outfile[j]).close();
    		j++;
    	}
    
    }
    void saveCourseToLocal(sc head) {
    	ofstream outfile;
    	outfile.open("course.txt");
    	sc p;
    	p = head->cNext;
    	while (p != NULL) {
    		outfile << p->stdCourstcount << " ";
    		outfile << p->cNo << " ";
    		outfile << p->cName << " ";
    		outfile << p->scTeacher << "\n";
    		if(p->stdCourstcount>0){
    		  for (int i = 0; i < p->stdCourstcount; i++) {
    			  outfile << p->stdNo[i] << "\n";
    		   }
    		}
    		p = p->cNext;
    	}
    }
    void readCourseFromLacal(sc head) {
    	fstream fin("course.txt");
    	if (fin)
    	{
    		sc p;
    		p = head;
    		sc q;
    		int stdCourstcount;
    		string  scTeacher, cNo, cName,std;
    		while (fin >>stdCourstcount >> cNo >> cName >> scTeacher)
    		{
    			q = new Courses;
    			if (stdCourstcount > 0) {
    				for (int i = 0; i < stdCourstcount; i++) {
    					fin >>std;
    					q->stdNo[i] = std;
    				}
    			}
    			q->stdCourstcount = stdCourstcount;
    			q->cNo = cNo;
    			q->cName = cName;
    			q->scTeacher = scTeacher;
    			q->cNext = p->cNext;
    			p->cNext = q;
    		}
    		fin.close();
    	}
    	else
    	{
    		cerr << "打开文件失败!" << endl;
    	}
    
    }
    void saveStudentToLocal(sm head) {
    	ofstream outfile;
    	outfile.open("student.txt");
    	sm p;
    	p = head->sNext;
    	while (p != NULL) {
    		outfile << p->sNo << " ";
    		outfile << p->sName << " ";
    		outfile << p->sSex  << " ";
    		outfile << p->sClass << "\n";
    		p = p->sNext;
    	}
    	outfile.close();
    }
    void readStudentFromLacal(sm head) {
    	fstream fin("student.txt");
    	if (fin)
    	{
    		sm p;
    		p = head;
    		sm q;
    		int rowNum = 0;
    		string sTel;
    		char sSex;
    		string  sClass,sNo,sName;
    		while (fin >> sNo >> sName >> sSex >> sClass)
    		{
    			q = new StudentMessage;
    			q->sNo = sNo;
    			q->sName = sName;
    			q->sSex = sSex;
    			q->sClass = sClass;
    
    			q->sNext = p->sNext;
    			p->sNext = q;
    		}
    		fin.close();
    	}
    	else
    	{
    		cerr << "打开文件失败!" << endl;
    	}
    
    }
    //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓学生选课相关函数↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//
    void stdSelectCourse(sc course, string select, string sNo) {
    	//select是课程编号,sNo选课学生学号
    	int k=0,j = 0;
    	int f = locateCourse(course, select);
    	course = course->cNext;
    	while (course != NULL) {
    		j++; if (j == f) {
    			for (int i = 0; i < course->stdCourstcount; i++) {
    				course->stdNo[course->stdCourstcount] = sNo;
    				cout << "你已经选择了"<<course->cName<<"课程" << endl;
    				k = 1;
    				break;
    			}
    			if(k!=1){
    			course->stdNo[course->stdCourstcount++] = sNo;
    			cout << "\n\t\t\t"<<course->stdNo[course->stdCourstcount - 1] << "恭喜你选课选课成功!";
    			}
    			break;
    		}
    		course = course->cNext;
    	}
    }
    //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓main函数↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//
    void main() {
    	int  i;
    	char s1,c;
    	sm sort, newHead;
        string sname;
    	string numb;
    	StudentMessage std;
    	int flag = 1, cflag = 1;
    	sm head = init();
    	newHead = init();
    	sc chead = initC();
    	aboutMe();
    
    	// 导入学生信息
    	readStudentFromLacal(head);
    	readCourseFromLacal(chead);
    	while (flag == 1) {
    		cout << "\n\n\t\t\t*****************************\n";
    		
    		cout << "\t\t\t   欢迎来到学生信息管理系统\n";
    		cout << "\t\t\t*****************************\n";
    
    		cout << " -------------------------------------------------------------------------------\n";
    		cout << "\t\t  选择功能:\n\t\t\t\t1.添加学生\n\t\t\t\t2.查找学生\n\t\t\t\t3.修改学生\n" <<
    			"\t\t\t\t4.删除学生\n\t\t\t\t5.学生排序\n\t\t\t\t6.课程管理\n\t\t\t\t7.学生选课\n\t\t\t\t8.学生列表\n\t\t\t\t9.导出学生\n\t\t\t\t0.退出学生管理系统";
    		cout << " \n\n-------------------------------------------------------------------------------\n";
    		cout << "\t\t\t请输入你的选择后按Enter键进入:";
    		cin >> s1;
    		//	system("cls");
    		switch (s1) {
    	
    		case '9':
    			system("cls"); 
    			savePersonFile(head, chead);
    			saveCourseToLocal(chead); 
    			saveStudentToLocal(head);
    			cout << "\n\n\n----------------------------------导出学生信息----------------------------------\n";
    			cout << "\n*******************************导出文件成功************************************";
    			cout << "\n!!!!!!!!!!!!!!!已经存储Project16!!!!!!!!!!!!!!!!";
    			break;
    		case '8':
    			system("cls");
    			printfSMessge(head, chead);
    			break;
    		case '0':
    			system("cls");
    			flag = 0;
    			break;
    		case '1':
    			system("cls");
    			cout << "\n\n\n-----------------------------------增加学生-------------------------------------\n";
    			addStudent(head);
    			break;
    		case '2':
    			system("cls");
    			cout << "\n\n\n----------------------------------查找学生信息----------------------------------\n";
    		
    			cout << "1.按学号查询\n2.按姓名查询\n请输入你的选择:";
    			cin >> s1;
    			switch (s1) {
    			case '1':
    				cout << "输入学生学号(6位数字):";
    				cin >> numb;
    				i = locateStdfByNo(head, numb);
    				if (head->sNext == NULL) { cout << "没有学生数据,请添加学生" << endl; }
    				if (0 != i) printfPerson(head, i, chead); else {
    					cout << "没有找到\n";
    				}
    				break;
    			case '2':
    				cout << "输入学生姓名:";
    				cin >> sname;
    				if (head->sNext == NULL) { cout << "没有学生数据,请添加学生" << endl; }
    				i = locateByName(head,sname,chead);
    				if (0 != i) printfPerson(head, i, chead); else {
    					cout << "没有找到\n";
    				}
    				break;
    			}
    			break;
    		case '3':
    			system("cls");
    			cout << "\n\n\n----------------------------------更新学生信息----------------------------------\n";
    		
    			i = updates(head);
    			if (0 != i) printfPerson(head, i, chead); else {
    				cout << "没有找到该学生!-_-!\n";
    			}
    			break;
    		case '4':system("cls");
    			cout << "\n\n\n----------------------------------删除学生-------------------------------------\n";
    			
    			i = deletesMessage(head);
    			break;
    		case '5': 
    			system("cls");
    			cout << "\n\n\n----------------------------------学生排序信息----------------------------------\n";
    
    			sort = selectsort(head, newHead);
    			if (sort) printfSMessge(head, chead);
    			
    			//printfSMessge(head, chead);
    			break;
    		case '6':
    			system("cls");
    			cflag = 1;
    			while (cflag == 1){
    				cout << "\n\n\n------------------------------课程管理系统-------------------------------------\n";
    				cout << "\n\t\t输入你选择的功能:\n\t\t\t\t1.添加课程信息\n\t\t\t\t2.查找课程\n\t\t\t\t3.修改课程信息\n\t\t\t\t4.删除课程\n\t\t\t\t5.显示课程\n\t\t\t\t0.退出图书管理\n";
    				cout << "\n------------------------------课程管理系统-------------------------------------\n\n请输入你的选择:";
    				cin >> c;
    				switch (c)
    				{
    				case '1':
    					system("cls");
    					cout << "\n\n\n----------------------------------增加课程-------------------------------------\n";
    					addCourse(chead); ptfSCourse(chead);
    					break;
    				case '2':
    					system("cls");
    					cout << "\n\n\n----------------------------------查找课程信息----------------------------------\n";
    					
    					cout << "输入课程编号:";
    					cin >> numb;
    					if (chead->cNext == NULL) { cout << "没有课程数据,请添加课程" << endl;}
    					else i = locateCourse(chead, numb);
    					if (i != 0) printfCourse(chead, i); else {
    						cout << "没有找到课程\n";
    					}break;
    				case '3':
    					system("cls");
    					cout << "\n\n\n----------------------------------更新课程信息----------------------------------\n";
    			
    					i = updatesCourse(chead);
    					if (i != 0) printfCourse(chead, i); else {
    						cout << "没有找到该课程课程\n";
    					}
    					break;
    				case '4':
    					system("cls");
    					cout << "\n\n\n----------------------------------删除课程--------------------------------------\n";
    					deletesCourse(chead); break;
    				case '5':
    					system("cls");
    					cout << "\n\n\n----------------------------------显示课程--------------------------------------\n";
    					ptfSCourse(chead);
    					break;
    					case '0':
    					system("cls");
    					cflag = 0;
    					break;
    					default:
    						break;
    				}
    		  
    			} 
    			break;
    		case '7':
    			system("cls");
    			cout << "\n\n\n-----------------------------------学生选课-------------------------------------\n";
    		
    			bool f = true;
    			if(ptfSCourse(chead)!=0){
    			string stdNo, select;
    			while (f) {
    				if (head->sNext == NULL) {
    					cout << "没有学生信息,选课成功"; f = false;
    				}
    				cout << "请输入你的(学生)的学号:";
    				cin >> stdNo;
    				f = false;
    				i = locateStdfByNo(head, stdNo);
    				if (0 == i) {
    					cout << "不存在该学生,请重新输入\n"; f = true;
    				}
    			}
    			f = true;
    			while(f){
    				f = false;
    				cout << "请输入你要选的课程编号:";
    				cin >> select;
    				if (locateCourse(chead, select) == 0) {
    					cout << "不存在该课程,请重新输入\n"; f = true; ptfSCourse(chead);
    				}
    			}
    			stdSelectCourse(chead,select, stdNo);
    			}
    			break;
    		
    		}
    		
    		cflag = 1;
    	}
    	system("cls");
    	goodbye();
    }
    
    当然自己水平有限,写的不好,还有很多bug没有完善,希望大家见谅,仅仅供大家参考,希望吐槽。
    展开全文
  • 用顺序写的简单的学生管理系统,自己动手,丰衣足食! #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 50 typedef struct{ char name[21],num[12]; int math,...
  • Python 学生管理系统

    万次阅读 多人点赞 2019-07-20 09:57:11
    Python学生管理系统功能工具效果展示图结构分析Python代码studentmanagementsystem模块tools 模块 功能 学生信息录入 学生成绩查询 查找学生信息 录入学生成绩 课程平均值 所有学生信息 工具 ...
  • 顺序练习——C++学生信息管理系统

    千次阅读 多人点赞 2019-10-04 11:25:26
    C++顺序简单实现学生信息管理系统,未加入文件输入输出流,界面较简单,编译通过
  • 数据结构课程设计(学生选课管理系统)链表实现

    千次阅读 热门讨论 2020-07-03 22:47:49
    1)增加学生基本信息 2)增加学生选课信息 3)增加学生课程成绩 4)根据学生姓名和选课名称修改课程成绩 5)查询所有学生的所有选课信息 6)根据名字查询某个学生的选课信息及所有选课的总平均成绩 7)查询成绩排名 ...
  • 设计并实现一个学生管理系统,即定义一个包含学生信息(学号,姓名,成绩)的的顺序,可以不考虑重名的情况,系统至少包含以下功能: (1)根据指定学生个数,逐个输入学生信息; (2)逐个显示学生中所有学生...
  • java 学生信息管理系统

    万次阅读 多人点赞 2015-10-06 14:03:33
    学生信息管理包括添加,删除,修改,查询,显示全部等 具体结构如图 在SQL Server 2005数据库上实现数据操作。使用纯面向对象的java语言作为开发语言 在sql server 2005新建一个名为Student的数据库,在下面新建一...
  • 统计学生的成绩学号姓名,实现增添,删除,修改,查询等操作。 代码实现如下: #include&lt;stdlib.h&gt; #include&lt;stdio.h&gt; #include&lt;malloc.h&gt; #include&lt;windows.h...
  • 学生管理系统的设计与实现 - 顺序

    万次阅读 多人点赞 2017-05-26 00:05:41
    实验题目:学生管理系统的设计与实现 实验环境:Visual C++ 6.0或其他C++环境 一、实验目的 1、掌握重要的排序算法――直接插入排序和快速排序; 2、掌握折半查找算法。 3、综合运用所学数据结构知识,提高解决...
  • C语言实现学生信息管理系统

    万次阅读 多人点赞 2019-04-08 14:40:48
    使用C语言对学生管理系统进行优化
  • 学生成绩管理系统(链表的实现)

    万次阅读 多人点赞 2016-04-26 09:50:42
    学生成绩管理系统
  • C语言课程设计 学生宿舍管理系统 链表、文件版

    万次阅读 多人点赞 2017-06-22 12:44:16
    采用链表和文件完成的学生宿舍管理系统,伴随代码文件产生"数据.txt"文本文件来存储学生数据。
  • 数据结构线性表实现学生信息管理系统

    千次阅读 多人点赞 2019-10-22 18:52:03
    数据结构线性表实现学生信息管理系统 方法一:顺序实现 #include <stdio.h> #include <iostream> #include <stdlib.h> #include <string.h> #define MAXSIZE 1000 #define OVERFLOW -1 ...
  • Java 图形界面开发--图文并茂建立学生管理系统

    万次阅读 多人点赞 2016-03-19 19:52:28
     这是本人在学习java图形界面开发阶段一步一步实现的超级简易的学生管理系统。虽然说不入大神法眼,但这确实是费了自己不少心血。对于我这样的菜鸟来说,考虑不周到,一不小心就Exception,然后就是自己调呀调。在...
  • 基于动态链表的学生成绩管理系统

    千次阅读 多人点赞 2015-06-19 22:23:56
    学生综合利用本学期所学完成了学生成绩管理系统的编写,利用预处理、数据类型、自定义函数、结构体、链表、文件操作、Windows.h中某些处理等知识,在VS2012中对学生成绩管理系统进行编写,初步实现了管理员模式、...
  • 顺序构建学生信息管理系统(C++)

    千次阅读 多人点赞 2017-06-21 15:01:21
    顺序构建学生管理系统–C++样例 对于本文的任何建议和问题都可留言,我们共同探讨,进步和提高。 上次编写了根据单链表进行构建学生管理系统的C++样例,本次使用顺序进行构建。单链表与顺序各有利弊,顺序...
  • 学生成绩管理系统顺序实现

    千次阅读 多人点赞 2016-11-19 13:37:13
    #include #include #define listSize 100//学生信息结构体 typedef struct { long num;//学号 char name[10];//姓名 int score;//成绩 }STUDENT;//顺序结构体 typedef struct { STUDENT stu[l
  • Python题目:学生信息管理系统-高级版(图形界面+MySQL数据库) 使用图形界面显示,选用list、tuple、dictionary或map等数据结构,操作数据库存储X个学生的三门课的成绩(机器学习、Python程序设计、研究生英语)...
  • 数据结构实现学生信息管理系统功能

    万次阅读 多人点赞 2019-01-22 20:25:22
    学生信息管理系统 1、 学生信息录入:主要是录入学生班级信息和学生基本情况; 2、 学生信息查询:按指定系检索该系的学生信息,其中包括所有的学生信息; 3、 学生信息维护:维护学生、系别、课程、学生选课及...
  • 链表实现学生管理系统

    千次阅读 2016-10-13 21:08:01
    printf("***********欢迎进入考生管理系统*************\n"); printf("* 1.创建学生信息 *\n"); printf("* 2.查找学生信息 *\n"); printf("* 3.修改学生信息 *\n"); printf("* 4.删除学生信息 *\n"); ...
  • C语言《学生信息管理系统》链表+文件操作

    万次阅读 多人点赞 2017-03-24 19:25:18
    今天带来的是一个链表版本的《学生信息管理系统》,功能包括:添加、显示、查询、删除、保存、读取,等功能模块,链表是C语言的进阶内容,希望大家好好学习,这里的代码可能会有一些瑕疵,希望大家提供意见或建议 ...
  • 用顺序实现学生信息管理系统

    千次阅读 多人点赞 2019-03-30 15:32:34
    用顺序实现学生信息管理系统 问题描述: 定义一个包含学生信息(学号,姓名,成绩)的顺序,使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据...
  • 实验目的 : 1 、掌握线性表的定义; 2 、掌握线性表的基本操作,如...(2) 逐个显示学生表中所有学生的相关信息; (3) 根据姓名进行查找,返回此学生的学号和成绩; (4) 根据指定的位置可返回相应的学生信息
  • 学生管理系统的设计与实现(c语言版本数据结构

    千次阅读 多人点赞 2020-07-09 18:54:04
    文章目录学生管理系统的设计与实现1、需求分析1.1 实验目的:1.2 实验内容:1.3实验要求:1.4概要设计:2、概要设计2.1所用数据结构的定义及其相关说明(相关结构体或类的定义及其含义)2.2、各子程序调用关系2.3、各...
  • 数据结构课程设计(学生成绩管理系统

    千次阅读 多人点赞 2019-06-17 09:06:29
    printf("\n Sorry,找不到该学生~\n"); ShowOneGrade(head); } back(head); } //查看单个学生成绩Controller void ShowOneGrade(LinkList *head) { int choose; int number; char name[20]; printf(" 请...
  • 数据结构课程设计之学生宿舍信息管理系统

    千次阅读 多人点赞 2020-06-21 10:14:38
    数据结构课程设计之学生宿舍信息管理系统,宿舍对于大学生在校生活来说相当于家的存在,而宿舍管理又是学校后勤管理的重要环节,如何直观的了解宿舍的入住情况和每位同学的住宿位置是提高工作效率的重要课题,根据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,011
精华内容 26,404
关键字:

学生管理系统表结构