学生管理系统–微笑笑一个
#include"weixiaodestudentManagement.h"//在本地目录优先搜索文件(为“<>”的话是优先在系统目录搜索文件)
int main()
{
{
system("title Student Management1.0--来自微笑笑一个");//修改控制台的标题
}
while(1)
{
//打印菜单
Menu();
//读取一个一个字符整数,字符在内存中映射为ASCII码
char ch = _getch();//getch()函数不将读入的字符显示在屏幕上
switch(ch)
{
case '1'://录入学生信息
InputStudent();
break;
case '2'://打印学生信息
PrintStudent();
break;
case '3'://保存学生信息
SaveStudent();
break;
case '4'://读取学生的信息
ReadStudent();
break;
case '5'://统计学生信息
CountStudent();
break;
case '6'://查找学生信息
FindStudent();
break;
case '7'://修改学生信息
ChangeStudent();
break;
case '8'://删除学生信息
DeleteStudent();
break;
default:
printf("输入有误,没有该功能\n\n");
system("pause");//暂停
system("cls");//清屏
break;
}
}
return 0;
}
//菜单
void Menu()
{
printf("*************************************************\n");
printf("*\t 学生成绩管理系统 Versioning 1.0 \t*\n");
printf("*\t欢迎使用高校学生成绩管理系统V 1.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.录入学生信息
void InputStudent()
{
//创建的单个学生在堆中分配内存(动态内存分配)
Node*pNewNode = (Node*)malloc(sizeof(Node));
/*(Node*):中Node是类型说明符,将其强制转换为该类型的指针等于号的左边是Node类型的指针,sizeof(Node):中的Node在内存的动态存储空间中分配一块“Node”字节的连续存储空间,函数的返回值是该区域的首地址。*/
malloc(100);
//指针下一个指向空
pNewNode->pNext = NULL;//(pNewNode是"new"的一个新节点,这里的new指的是新建一个新节点)
//查找链表的尾节点
Node*p = g_pHead; /*(Node*p = Node*g_pHead这里使用*p代替*g_phead(指针指向头节点,即指针指向头指针指向的位置))
while(g_pHead !=NULL&&p->pNext !=NULL)(g_pHead是前面创建的头结点,p->pNext=Node *p->taqNode*pNext)(指向头结点的指针不为空,指向下一个节点的指针不为空)*/
{
p=p->pNext;//(Node*p = Node*g_pHead这里使用*p代替*g_phead(指针指向头节点))
}
//把节点插到链表的尾节点
if(g_pHead == NULL)
{
g_pHead = pNewNode;//(+1分配内存空间的首地址,(没有输入,没有分配存储空间))
}
else{
p->pNext = pNewNode;//(+1分配内存空间的首地址,(根据你输入的动态内存分配的空间))
}
//录入学生信息
printf("请输入学生姓名:\n");
scanf_s("%s",pNewNode->stu.szName, sizeof(pNewNode->stu.szName));/*(stu指的是前面定义的Student 类型的变量,(scanf()函数中“,”后面跟的是地址))*/
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");
system("pause");
system("cls");
}
//2.打印学生的信息
void PrintStudent()//(void:在这里指无返回值的函数)
{
system("cls");
//遍历链表
Node*p = g_pHead;
if(p==NULL)//(判断p指针是否为null)
{
printf("查无此学生");//没有录入学生信息就直接打印
}
else{
printf("*********************************************************************************\n");
printf("*\t\t\t学生成绩管理系统 Versioning 1.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");
}
此处之前无误
//3.保存学生信息
void SaveStudent(){
//打开文件
FILE*pFile;//文件结构体指针(FILE类型的指针)
pFile = fopen(".\\save.dat","w");//(在cpp文件的同文件目录下创建一个save.dat的文件)
if(pFile == NULL)//文件指针为null
{
printf("抱歉,打开文件失败\n");
return;
}
//写入数据
Node*p = g_pHead;//(指针指向头指针的位置)
while(p != NULL)(若指针p不是空指针)
{
fwrite(&p->stu,sizeof(Node),1,pFile);//将数据写入文件流,&p->stu(写入的地址),总共写入的字符数,返回实际写入的数目,pfile为FILE*pFile(打开的文件指针)
p=p->pNext;
}
//关闭文件
fclose(pFile);
printf("数据保存成功。\n");
system("pause");
system("cls");
}
//4.读取学生信息
void ReadStudent()
{
system("cls");
//遍历链表
Node*p = g_pHead;
if(p==NULL)
{
printf("系统中暂无学生信息,请录入学生数据后再来查看。\n\n");
}
else{
printf("*********************************************************************************\n");
printf("*\t\t\t学生成绩管理系统 Versioning 1.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.nAge,
p->stu.nScore
);
//下一个节点
p = p->pNext;
printf("*********************************************************************************\n");
}
}
system("pause");
system("cls");
}
//统计所有学生人数
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");
}
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 = ture;
}
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.Score
);
isFindStu = ture;
printf("*********************************************************************************\n");
}
p = p->pNext;
}
if(!isFindstu){
printf("学号输入有误,系统暂无该学生的信息。\n\n");
}
system("pause");
sysyem("cls");
}
//7.修改学生信息
void ChangeStudent(){
//以学号为查找示例,其他信息查找流程基本相似
int stuNum;
printf("请输入与修改学生的号码:");
scanf("%d",&stuNum);
//遍历链表查找,查找到后进行信息显示
Node* p = g_pHead;
//对表头进行展示一次
bool isShowhead = false;
while(p!=NULL)
{
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.nAge,
p->stu.nScore
);
//修改学生信息
printf("请输入学生姓名:\n");
scanf("%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");
}
//8.删除学生信息
void DeleteStudent(){
system("cls");
//以学号为查找示例,其他信息查找流程基本相似
int stuNum;
printf("请输入删除学生的学号:");
scanf_s("%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");
}
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
首先我们要定义一个为student类型(相当于int float)的结构变量taqStudent
student 包括szName[](姓名)、szSex[](性别)、nAge(年龄)、nStuNo(学号)、nScore(成绩)
/*结构模板:标记是book*/
typedef struct student{
char szName[20];//姓名
char szSex[4]//性别;
int nAge;//年龄
int nStuNo;//学号
int nScore;//成绩
}Student;
/*结构模板结束*/
//链表
//节点
typedef struct taqNode //(相当于定义的一个节点,struct taqNode指的是taqNode类型)
{
Student stu;//节点中学生的信息
struct taqNode*pNext;//指向下一个节点
}Node;(这代表一个类型)
(一个单向链表的节点被分为两个部分,一部分用来保存或显示关于节点的信息,另一部分用来存放下一个节点的地址)
(struct taqNode 相当于 Node)
//创建头节点
Node*g_pHead = NULL;//指向头节点的指针
//模块化
(一个主菜单包含:1.录入学生信息、2.打印学生信息、3.保存学生信息、4.读取学生信息、5.统计学生信息、6.查看学生信息、7.修改学生信息、8.删除学生信息)
//菜单
void Menu();
//1.录入学生信息
void InputStudent();
//2.打印学生信息
void PrintStudent();
//3.保存学生信息
void SaveStudent();
//4.读取学生信息
void ReadStudent();
//5.统计学生信息
void CountStudent();
//6.查找学生信息
void FindStudent();
//7.修改学生信息
void ChangeStudent();
//8.删除学生信息
void DeleteStudent();
先定义一个学生类型的结构
再定义一个节点类型的结构
然后模块化部分
菜单
录入学生信息
打印学生信息
保存