-
2019-10-22 18:52:03
数据结构线性表实现学生信息管理系统
方法一:顺序表实现
#include <stdio.h> #include <iostream> #include <stdlib.h> #include <string.h> #define MAXSIZE 1000 #define OVERFLOW -1 using namespace std; typedef struct{ char num[8];//8位学号 char name[20];//学生姓名 int score;//学生成绩 }Student; typedef struct{ Student *elem;//指向数据元素的基地址 int length;//线性表的长度 }SqList; SqList L; //初始化顺序表 int InitList(SqList &L){ L.elem=new Student[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间 if (!L.elem) exit(OVERFLOW);//存储分配失败推出 L.length=0;//空表长度为0 return 1;//成功返回1 } //顺序表的取值 int GetElem(SqList L,int i,Student &s){ if(i<1||i>L.length){ return 0;//若i值不合理,返回0 }else{ s=L.elem[i-1];//取出第i个元素 存放在i里面 加&是让形参影响到实参 return 1; } } //按学生姓名进行学生信息的查找 int LocateElem(SqList L,Student &s){ //在顺序表L中查找值e的数据元素,返回其序号 for(int i=0;i<L.length;i++){ if(!strcmp(L.elem[i].name,s.name)) { s = L.elem[i]; return 1;//查找成功 } } return 0;//查找失败 } //插入学生信息 int ListInsert(SqList &L,int i,Student &s){ if((i<1)||(i>L.length+1)) return 0; if(L.length==MAXSIZE) return 0;//顺序表已达到最大长度 for(int j=L.length-1;j>=i-1;j--){ L.elem[j+1]=L.elem[j];//插入位置及之后的元素全部后移 } L.elem[i-1]=s;//将新元素s插入第i个位置 ++L.length;//顺序表长度加1 return 1;//插入成功,返回1 } //顺序表的删除 int ListDelete(SqList &L,int i){ //在顺序表L中删除第i个元素,i值的合法范围是1<=i<=L.length if((i<1)||(i>L.length)) return 0; for(int j=i;j<=L.length-1;j++){//被删除的元素是第i个元素,但是其下标i-1。j=i,此时j指向的是i后面的一个元素 L.elem[j-1]=L.elem[j];//被删除元素之后的元素前移(删除数据的真实操作其实是覆盖) } --L.length;//顺序表表长度减1 return 1;//删除成功返回1 } //输入学生表 void InputList(SqList &L,int i,Student e) { L.length+=1; L.elem[i]=e; } //主函数 int main(){ Student student; InitList(L); int a; while(1) { printf("------------学生信息系统------------\n"); printf("1:输入学生信息\n"); printf("2:显示所有学生信息\n"); printf("3:根据学生姓名查找学生信息\n"); printf("4:根据位置查找学生信息\n"); printf("5:添加学生信息\n"); printf("6:删除指定位置的学生记录;\n"); printf("7:统计表中学生个数\n"); printf("8:退出学生信息系统\n"); printf("请输入您的选择:"); scanf("%d",&a); printf("--------------------------------------------------------"); printf("\n"); switch(a)//输入学生的信息; { case 1: { for(int i=0;i<5;i++) { printf("学号:"); scanf("%s",&student.num); printf("姓名:"); scanf("%s",&student.name); printf("成绩:"); scanf("%d",&student.score); InputList(L,i,student); printf("\n"); } printf("输入学生信息成功,请选择接下来的操作…………"); printf("\n\n\n\n\n\n"); break; } case 2://显示全部学生的信息; { printf("NO\t\tName\t\t\tScore\t\n"); for(int i=1;i<=L.length;i++) { GetElem(L,i,student); printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score); } printf("\n\n\n\n\n\n"); break; } case 3://根据学生姓名查找学生信息 { int i; printf("请输入您要查找学生的名字:"); scanf("%s",&student.name); i=LocateElem(L,student); if(!i) { printf("系统中无记录\n"); } printf("学号:%s\t\t姓名:%s\t\t成绩:%3d\n",student.num,student.name,student.score); printf("\n\n\n\n\n\n"); break; } case 4://根据位置查找学生信息 { int local; printf("请输入要查询的位置:"); scanf("%d",&local); GetElem(L,local,student); printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score); printf("\n\n\n\n\n\n"); break; } case 5://给定一个学生信息,插入到表中指定位置; { int t,i; printf("请输入学生的学号:"); scanf("%s",&student.num); printf("请输入学生的姓名:"); scanf("%s",&student.name); printf("请输入学生的成绩:"); scanf("%d",&student.score); printf("请输入插入的位置:"); scanf("%d",&t); i = ListInsert(L,t,student); if(i) { printf("添加成功…………"); printf("\n") ; printf("NO\t\tName\t\t\tScore\t\n"); for(int i=1;i<=L.length;i++) { GetElem(L,i,student); printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score); } } else printf("插入失败,请选择正确的插入位置…………"); printf("\n\n\n\n\n\n"); break; } case 6://删除指定位置的学生信息; { int i; printf("请输入要删除的位置:"); scanf("%d",&i); ListDelete(L,i); printf("删除成功…………"); printf("\n"); printf("NO\t\tName\t\t\tScore\t\n"); for(int i=1;i<=L.length;i++) { GetElem(L,i,student); printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score); } printf("\n\n\n\n\n\n"); break; } case 7://统计系统中学生个数 { printf("系统中学生个数:%d\n",L.length); printf("\n\n\n\n\n\n"); break; } case 8://退出系统; { return 0; } default: { printf("输入错误,请重新输入"); printf("\n\n\n\n\n\n"); } } } }
方法二:链表实现
#include<stdio.h> #include <iostream> #include <stdlib.h> #include <string.h> #define MAXSIZE 1000 using namespace std; //定义学生 typedef struct{ char num[8];//8位学号 char name[20];//学生姓名 int score;//学生成绩 }Student; Student student; //---单链表的存储结构--- typedef struct LNode { Student data; struct LNode *next;//节点的指针域 }LNode,*LinkList;//LinkList为指向结构体LNode的结构体类型 typedef struct{ int length; }T; T list; LinkList L; LNode *p,*s,*q,*head; //初始化单链表 int InitList(LinkList &L) { //构造一个空的单链表 L = new LNode; L->next=NULL; list.length=0; return 1; } //单链表按照序号取值 int GetElem(LinkList L,int i,Student &e) { //在带头节点的链表L中根据序号i获取元素的值,用e返回L中第i个数据元素的值 p=L->next; int j=1; while(p&&j<i) { p=p->next; ++j; } if(!p||j>i) return 0; e=p->data; return 1; } //单链表的姓名查找 int LocateElem(LinkList L,Student &e) { int j=0; p=L->next; while(p && strcmp((p->data).name,e.name))//如果p不为空,且p指向的数据与发送过来的数据名字不相等。执行while循环语句 { p=p->next; ++j; } if(!p||j>list.length) return 0; e=p->data; return 1; } //单链表的插入 int ListInsert(LinkList $L,int i,Student &e) { //在带头结点的链表L中第i个位置插入值为e的新节点 p=L;int j=0; while(p && (j<i-1)) { p=p->next;++j; } if(!p||j>i-1) return 0; s = new LNode; s->data=e; s->next=p->next; p->next=s; list.length++; return 1; } //单链表的删除 int ListDelete(LinkList &L,int i) { //在带头节点的链表L中删除第i个元素 p=L;int j=0; while((p->next) && (j<i-1)) {p=p->next;++j;} if(!(p->next)||(j>i-1)) return 0;//当i>n或i<1时,删除位置不合理 q=p->next;//临时保存被删除的节点的地址以备释放 p->next=q->next;//改变删除节点前驱节点的指针域 delete q; list.length--; return 1; } //单链表的创建(后插法) void CreateList_H(LinkList &L,int n) {//逆位序输入n个元素的值,建立带表头结点的单链表L //L=new LNode;//先建立一个带头结点的空链表 L->next=NULL; Student stu; LNode *r; r=L; for(int i=0;i<n;++i) { p=new LNode; printf("学号:"); scanf("%s",&student.num); printf("姓名:"); scanf("%s",&student.name); printf("成绩:"); scanf("%d",&student.score); list.length++;//输入元素值赋给新结点*p的数据域 printf("\n\n"); p->data=student; p->next=NULL; r->next=p; r=p;//将新结点*p插入到头结点之后 } } //主函数 int main() { Student student; InitList(L); int a; while(1) { printf("------------学生信息系统------------\n"); printf("1:输入学生信息\n"); printf("2:显示所有学生信息\n"); printf("3:根据学生姓名查找学生信息\n"); printf("4:根据位置查找学生信息\n"); printf("5:添加学生信息\n"); printf("6:删除指定位置的学生记录;\n"); printf("7:统计表中学生个数\n"); printf("8:退出学生信息系统\n"); printf("请输入您的选择:"); scanf("%d",&a); printf("--------------------------------------------------------"); printf("\n"); switch(a)//输入学生的信息; { case 1: { CreateList_H(L,5); printf("输入学生信息成功,请选择接下来的操作…………"); printf("\n\n\n\n\n\n"); break; } case 2://显示全部学生的信息; { printf("NO\t\tName\t\t\tScore\t\n"); for(int i=1;i<=list.length;i++) { GetElem(L,i,student); printf("%s\t\t%s\t\t\t%d\t\n",student.num,student.name,student.score); } printf("\n\n\n\n\n\n"); break; } case 3://根据学生姓名查找学生信息 { int i; printf("请输入您要查找学生的名字:"); scanf("%s",&student.name); i=LocateElem(L,student); if(!i) printf("系统中没有此学生\n"); printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score); printf("\n\n\n\n\n\n"); break; } case 4://根据位置查找学生信息 { int i; int local; printf("请输入要查询的位置:"); scanf("%d",&local); GetElem(L,local,student); printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score); printf("\n\n\n\n\n\n"); break; } case 5://给定一个学生信息,插入到表中指定位置; { int t,i; printf("学号:"); scanf("%s",&student.num); printf("姓名:"); scanf("%s",&student.name); printf("成绩:"); scanf("%d",&student.score); printf("插入位置:"); scanf("%d",&t); ListInsert(L,t,student); if(1) { printf("添加成功…………"); printf("\n") ; printf("NO\t\tName\t\t\tScore\t\n"); for(int i=1;i<=list.length;i++) { GetElem(L,i,student); printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score); } } else printf("插入失败,请选择正确的插入位置…………"); printf("\n\n\n\n\n\n"); break; } case 6://删除指定位置的学生信息; { int i; printf("请输入要删除的位置:"); scanf("%d",&i); ListDelete(L,i); printf("删除成功…………"); printf("\n"); printf("NO\t\tName\t\t\tScore\t\n"); for(int i=1;i<=list.length;i++) { GetElem(L,i,student); printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score); } printf("\n\n\n\n\n\n"); break; } case 7://统计系统中学生个数 { printf("系统中学生个数:%d\n",list.length); printf("\n\n\n\n\n\n"); break; } case 8://退出系统; { return 0; } default: { printf("输入错误,请重新输入"); printf("\n\n\n\n\n\n"); } } } }
更多相关内容 -
数据结构C语言学生信息管理系统
2017-04-16 11:08:42基于C语言,数据结构,学生信息管理系统 -
数据结构实现学生信息管理系统功能
2019-01-22 20:25:22学生信息管理系统 1、 学生信息录入:主要是录入学生班级信息和学生基本情况; 2、 学生信息查询:按指定系检索该系的学生信息,其中包括所有的学生信息; 3、 学生信息维护:维护学生、系别、课程、学生选课及...学生信息管理系统
1、 学生信息录入:主要是录入学生班级信息和学生基本情况;
2、 学生信息查询:按指定系检索该系的学生信息,其中包括所有的学生信息;
3、 学生信息维护:维护学生、系别、课程、学生选课及成绩等方面的基本信息,包括增加、删除和修改;
4、 学生选课:为学生提供选课界面,包括所有课程信息。进入该界面前学生要输入正确的学号和姓名。具体代码如下:(vc++6.0刚刚试过可以运行)
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include <windows.h> struct course //定义储存课程信息的结构体 { int num;//课程号 char subject[10];//课程名 int mark;//学分 int count;//已选人数 }cour[5] = { {1,"数据结构",3,0},{2,"java语言",3,0}, {3,"大学英语",5,0},{4,"软件工程",4,0},{5,"线性代数",3,0} };//课程信息 void Output_course(struct course *p)//调用存储课程信息结构体数组,输出所有课程信息 { system("cls"); printf("课程信息如下: \n"); for (p = cour; p < cour + 5; p++) printf("课程号--%d 科目--%7s 学分--%d 已选人数--%d\n\n", p->num, p->subject, p->mark, p->count); } struct student //定义存储学生信息的结构体 { long num; char name[10]; char order1[10];//所选课程1 char order2[10];//所选课程2 }stu[8] = { {20170401,"小明","NULL","NULL"}, {20170402,"小红","NULL","NULL"}, {20170403,"小张","NULL","NULL"}, {20170404,"小王","NULL","NULL"}, {20170405,"小花","NULL","NULL"}, {20170406,"小丽","NULL","NULL"}, {20170407,"小雨","NULL","NULL"}, {20170408,"小二","NULL","NULL"}, }; void Output_student(struct student *p)调用存储课程信息结构体数组,输出所有学生信息 { system("cls"); printf("学生的选课情况如下:\n"); for(p=stu;p<stu+8;p++) printf("学号--%d 姓名--%3s 课程1--%7s 课程2--%7s\n\n", p->num, p->name, p->order1, p->order2); } void modify(struct student *p, struct course cour[5]) //调用储存course和student的结构体数组,输出任意一个学生信息,并且可以修改 { int s; int g; char b; char k[10]; char h; long n; long m; int i; int j; char name1[20]; system("cls"); printf("请输入学号(20170401-20170408):"); scanf("%d", &n); printf("请输入学号对应的姓名:"); scanf("%d", &h); for (p = stu; p < stu + 8; p++) { if (n == p->num) //找到对应的学生 { system("cls"); printf("\n\n\n 该学生信息如下\n\n\n"); printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); printf("\nA.修改 退出请按A,a外任意字母键\n"); scanf("%s", &b); { if (b == 'a' || b == 'A') { printf("\n1.修改学号 2.修改姓名 3.修改所选课程\n"); scanf("%d", &s); { if (s == 1) { printf("\n 学号修改为:\n"); //修改学号 scanf("%d", &m); p->num = m; system("cls"); printf("\n\n\n\n\n\n\n修改后如下:\n"); printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); } if (s == 2) { printf("\n 姓名修改为:\n"); scanf("%20s", name1); strcpy(p->name, name1); system("cls"); printf("\n\n\n\n\n 修改后如下\n\n"); printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); } if (s == 3) { system("cls"); printf("\n 输入你想修改的课程:区分大小写\n"); scanf("%s", &k); {if (strcmp(p->order1, k) == 0) { system("cls"); printf("\n1.数据结构 2.java语言 3.大学英语 4.软件工程 5.线性代数\n"); printf("\n你想修改为(1-5):\n"); scanf("%d", &g); for (i = 0; i < 5; i++) { if (g == i + 1) { if (cour[g - 1].count >= 3) { system("cls"); printf("\n\n 该课程已被选满\n");//课程选满,返回主菜单 } else { if (strcmp(p->order2, cour[g - 1].subject) == 0) printf("\n\n 你已选过这门课 \n\n");//重选,返回主菜单 else { strcpy(p->order1, cour[g - 1].subject); cour[g - 1].count++; for (j = 0; j < 5; j++) { if (strcmp(cour[j].subject, k) == 0) cour[j].count--; } system("cls"); printf("\n\n学生信息 \n\n"); printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); } } } } } else if (strcmp(p->order2, k) == 0) { system("cls"); printf("\n1.数据结构 2.java语言 3.大学英语 4.软件工程 5.线性代数\n"); printf("\n你想修改为(1-5):\n"); scanf("%d", &g); for (i = 0; i < 5; i++) { if (g == i + 1) { if (cour[g - 1].count >= 3) { printf("\n\n 该课程已被选满\n");//已选满 } else { if (strcmp(p->order1, cour[g - 1].subject) == 0) printf("\n\n 你已选过这门课 \n\n");//重选 else { strcpy(p->order2, cour[g - 1].subject); cour[g - 1].count++; for (j = 0; j < 5; j++) { if (strcmp(cour[j].subject, k) == 0) cour[j].count--; } system("cls"); printf("\n\n学生信息 \n\n"); printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); } } } } } else printf("\n\n 您还没选这门课或拼写错误\n\n"); } } } } } } } } void xuanke(struct student *p,struct course cour[5])//为任意学生去选课 { long n;int a;int b;int t = 0;int u = 0;int i; system("cls"); printf("请输入学号(20170401-20170408):"); scanf("%d", &n); for (p = stu;p < stu + 8;p++) { if (n == p->num)//找到相应的学生 { system("cls"); if (strcmp(p->order1,"NULL")!=0) //第一门课不为空 t = 1; else { system("cls"); printf("\n\n\n\n\n\n请选您的第一门课 提示:您最多只能选二门课\n\n"); printf("\n1.数据结构 2.java语言 3.大学英语 4.软件工程 5.线性代数\n\n"); printf("\n请选第一门课:不选请按1-5外任意数字键返回\n\n"); scanf("%d", &a);//输入所选课程编号 for (i = 0; i < 5; i++) { if (a == i + 1) { if (cour[a - 1].count >= 3) { printf("\n\n该课程已被选满\n");//课程选满。返回主菜单 } else { if (strcmp(p->order2,cour[a - 1].subject)==0) printf("\n\n\n 你已选过这门课\n");//重选,返回主菜单 else { strcpy(p->order1, cour[a - 1].subject);//选课成功 cour[a - 1].count++; system("cls"); printf("\n\n\n\n\n\n 学生信息:\n"); printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); } } } } } if (strcmp(p->order2, "NULL")!=0)//第二门课不为空 u = 1; else { printf("\n\n\n\n\n\n请选您的第二门课 提示:您最多只能选二门课\n\n"); printf("\n1.数据结构 2.java语言 3.大学英语 4.软件工程 5.线性代数\n\n"); printf("\n 请选第二门课:不选请按 1-5 外任意数字键返回\n\n"); scanf("%d", &b); for (i = 0; i < 5; i++) { if (b == i + 1) { if (cour[b - 1].count >= 3) { printf("\n\n 该课程已被选满 \n");//已选满,返回主菜单 } else { if (strcmp(p->order1, cour[b - 1].subject)==0) printf("\n\n\n 你已选过这门课 \n");//重选,返回主菜单 else { strcpy(p->order2, cour[b - 1].subject); cour[b - 1].count++; system("cls"); printf("\n\n\n\n\n\n 学生信息:\n");//成功选课 printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); } } } } } if (u==1&&t==1) printf("\n 您已选满,若想修改请进入菜单 3\n"); } } } void a() { for (;;){ int n; printf("\t\t************欢迎来到选课系统************\n\n"); printf("\t\t**-------- 1 浏览课程信息 ------------**\n\n"); printf("\t\t**-------- 2 浏览学生选课情况 --------**\n\n"); printf("\t\t**-------- 3 学生信息查询和修改 ------**\n\n"); printf("\t\t**-------- 4 学生选课 ----------------**\n\n"); printf("\t\t**-------- 5 退出 --------------------**\n\n"); printf("请选择(1-5):[ ]\b\b"); scanf("%d", &n); switch (n) { case 1:Output_course(cour); break; case 2:Output_student(stu); break; case 3:modify(stu,cour); break; case 4:xuanke(stu,cour); break; case 5:exit(0); default:printf("请输入正确数字!\n"); } } } #define N 100 typedef struct stulink_node { char sdepartment[10]; char sclass[10]; char scourse[10]; char sno[14]; char sname[10]; char ssex[2]; float psscore; float syscore; float qmscore; float zpscore; struct stulink_node *next; }student; typedef student *linklist; student *head; char sno[N][20]={{'a','b'}}; int count; void display(); //函数声明 int judge(char sno1[]) //判断学号函数 { int i; for(i=0;i<N;i++) { if(!strcmp(sno1,sno[i])) return 1; } return 0; } student *init() //建立一个空的单链表 { return NULL; } float average(student *stu) //求总评成绩函数 { return (float)(0.4*stu->psscore+0.3*stu->syscore+0.3*stu->qmscore); } void luru() //录入学生信息函数 { linklist p,q; static int count=0; char flag='0'; q=(linklist)malloc(sizeof(student)); p=head=NULL; while(flag=='0') { printf("\n"); printf("请输入学生的学号: "); scanf("%s",&q->sno); while(judge(q->sno)) { printf("学号重复,请重新输入:"); scanf("%s",&q->sno); } strcpy(sno[count],q->sno);count++; printf("请输入学生的系别: "); scanf("%s",&q->sdepartment); printf("请输入学生的班级: "); scanf("%s",&q->sclass); printf("请输入学生的课程: "); scanf("%s",&q->scourse); printf("请输入学生的姓名: "); scanf("%s",&q->sname); printf("请输入学生的性别: "); scanf("%s",&q->ssex); printf("请输入学生的平时成绩: "); scanf("%f",&q->psscore); printf("请输入学生的实验成绩: "); scanf("%f",&q->syscore); printf("请输入学生的期末成绩: "); scanf("%f",&q->qmscore); q->zpscore=average(q); setbuf(stdin,NULL); if(head==NULL) { head=q; p=head; } else { p->next=q; p=q; } q=(linklist)malloc(sizeof(student)); printf("按0继续输入,否则退出\n"); flag=getch(); setbuf(stdin,NULL); } free(q); printf("输入完毕!\n "); p->next=NULL; } void charu() //插入 学生信息函数 { int j=0,i; linklist p,q; p=head; printf("请输入要插入的位置: "); scanf("%d",&i); if(i<0) printf("输入位置不规范!\n"); else { while (p&&i!=j) { p=p->next;j++; } if(!p&&i!=0) printf("未找到该结点不能插入!"); else { q=(linklist)malloc(sizeof(student)); printf("请输入学生的学号: "); scanf("%s",&q->sno); while(judge(q->sno)) { printf("学号重复,请重新输入:"); scanf("%s",&q->sno); } strcpy(sno[count],q->sno);count++; printf("请输入学生的系别: "); scanf("%s",&q->sdepartment); printf("请输入学生的班级: "); scanf("%s",&q->sclass); printf("请输入学生的课程: "); scanf("%s",&q->scourse); printf("请输入学生的姓名: "); scanf("%s",&q->sname); printf("请输入学生的性别: "); scanf("%s",&q->ssex); printf("请输入学生的平时成绩: "); scanf("%f",&q->psscore); printf("请输入学生的实验成绩: "); scanf("%f",&q->syscore); printf("请输入学生的期末成绩: "); scanf("%f",&q->qmscore); q->zpscore=average(q); if(i==0) { q->next=head; head=q; } else { q->next=p->next; p->next=q; } } } } void xiugai() //修改学生信息函数 { linklist q; int m=0; char sno[15]; q=head; printf("请输入要修改的学生学号:"); scanf("%s",&sno); if(!q) printf("修改失败,没有学生信息!\n"); else { while(q!=NULL) { if(strcmp(q->sno,sno)==0) { printf("请输入学生的系别: "); scanf("%s",&q->sdepartment); printf("请输入学生的班级: "); scanf("%s",&q->sclass); printf("请输入学生的课程: "); scanf("%s",&q->scourse); printf("请输入学生的学号: "); scanf("%s",&q->sno); printf("请输入学生的姓名: "); scanf("%s",&q->sname); printf("请输入学生的性别: "); scanf("%s",&q->ssex); printf("请输入学生的平时成绩: "); scanf("%f",&q->psscore); printf("请输入学生的实验成绩: "); scanf("%f",&q->syscore); printf("请输入学生的期末成绩: "); scanf("%f",&q->qmscore); q->zpscore=average(q); setbuf(stdin,NULL); m=1; printf("修改成功!\n\n"); break; } else q=q->next; } if(m==0) printf("修改失败,没有该学生信息!\n\n"); } } void shanchu() //删除学生信息函数 { linklist pre,q; char sno[12]; pre=head; q=head; printf("请输入要删除的学生学号:"); scanf("%s",&sno); if(!q) printf("没有学生信息,无法删除!\n\n"); else { while(q) { if(strcmp(q->sno,sno)==0) { if(q==head) { head=q->next; free(q); } else { pre->next=q->next; free(q); } printf("删除成功!\n"); break; } else { pre=q; q=q->next; } } } } void chaxun() //查询学生信息函数 { linklist p; int m=0; char sno[15]; p=head; printf("请输入需查询的学生学号:"); scanf("%s",&sno); if(!p) printf("没有学生信息,无法查询!\n\n"); else { while(p) { if(strcmp(p->sno,sno)==0) { printf("系别:%s\n",p->sdepartment); printf("班级:%s\n",p->sclass); printf("课程:%s\n",p->scourse); printf("学号:%s\n",p->sno); printf("姓名:%s\n",p->sname); printf("性别:%s\n",p->ssex); printf("平时成绩:%-.2f\n",p->psscore); printf("实验成绩:%-.2f\n",p->syscore); printf("期末成绩:%-.2f\n",p->qmscore); printf("总评成绩:%-.2f\n",p->zpscore); m=1; break; } else p=p->next; } if(m==0) printf("查询失败,没有该生信息!\n"); } } void paixu() //对学生总评成绩排序(冒泡法) { linklist p,q,r; student temp; r=head; if(r==NULL) printf("没有学生成绩,请先添加学生成绩!\n"); else { while(r) { p=r; q=r->next; while(q) { if(p->zpscore < q->zpscore) { strcpy(temp.sdepartment,p->sdepartment); strcpy(temp.sclass,p->sclass); strcpy(temp.scourse,p->scourse); strcpy(temp.sno,p->sno); strcpy(temp.sname,p->sname); strcpy(temp.ssex,p->ssex); temp.psscore=p->psscore; temp.syscore=p->syscore; temp.qmscore=p->qmscore; temp.zpscore=p->zpscore; strcpy(p->sdepartment,q->sdepartment); strcpy(p->sclass,q->sclass); strcpy(p->scourse,q->scourse); strcpy(p->sno,q->sno); strcpy(p->sname,q->sname); strcpy(p->ssex,q->ssex); p->psscore=q->psscore; p->syscore=q->syscore; p->qmscore=q->qmscore; p->zpscore=q->zpscore; strcpy(q->sdepartment,temp.sdepartment); strcpy(q->sclass,temp.sclass); strcpy(q->scourse,temp.scourse); strcpy(q->sno,temp.sno); strcpy(q->sname,temp.sname); strcpy(q->ssex,temp.ssex); q->psscore=temp.psscore; q->syscore=temp.syscore; q->qmscore=temp.qmscore; q->zpscore=temp.zpscore; } q=q->next; } r=r->next; } printf("****排序完毕,按由大到小的总评成绩!"); display(); } } void display() //输出学生信息函数 { student *p; p=head; if(!p) printf("暂无学生成绩!\n"); else { printf("各个学生成绩为:\n"); while(p) { /*printf("系别:%s,班级:%s,课程:%s,学号:%s,姓名:%s,性别:%s, 平时成绩:%-.2f,实验成绩:%-.2f,期末成绩:%-.2f,总评成绩:%-.2f\n", p->sdepartment,p->sclass,p->scourse,p->sno,p->sname,p->ssex, p->psscore,p->syscore,p->qmscore,p->zpscore);*/ printf("系别:%s ",p->sdepartment); printf("班级:%s ",p->sclass); printf("课程:%s ",p->scourse); printf("学号:%s ",p->sno); printf("姓名:%s ",p->sname); printf("性别:%s ",p->ssex); printf("平时成绩:%-.2f ",p->psscore); printf("实验成绩:%-.2f ",p->syscore); printf("期末成绩:%-.2f ",p->qmscore); printf("总评成绩:%-.2f\n",p->zpscore); p=p->next; } } } void menu() { int choose; printf("**************学生信息管理系统*****************\n"); printf("* *\n"); printf("*----------- 1.录入学生成绩 ------------------*\n"); printf("*----------- 2.增加学生成绩 ------------------*\n"); printf("*----------- 3.修改学生成绩 ------------------*\n"); printf("*----------- 4.删除学生成绩 ------------------*\n"); printf("*----------- 5.查询学生成绩 ------------------*\n"); printf("*----------- 6.对学生成绩进行排序 ------------*\n"); printf("*----------- 7.输出学生成绩 ------------------*\n"); printf("*----------- 8.进入选课系统-------------------*\n"); printf("*----------- 9.退出系统-----------------------*\n"); printf("***********************************************\n"); printf("\n"); printf("请输入你的选择:"); scanf("%d",&choose); switch(choose) { case 1:luru();break; case 2:charu();break; case 3:xiugai();break; case 4:shanchu();break; case 5:chaxun();break; case 6:paixu();break; case 7:display();break; case 8:a();break; case 9:exit(0);break; default:printf("请输入正确数字!\n"); } menu(); } int main() { head=init(); menu(); return 0; }
运行结果很多,我简单的给个主菜单
欢迎您关注我的微信公众号:学习微站(studysth)
最后,这是我的主页链接:https://blog.csdn.net/weixin_43206161
-
数据结构课程设计——学生信息管理系统
2016-12-29 13:55:39程序区: stud.h #ifndef _TEST #define _TEST #include #include #include #include #define LEN sizeof(struct Student) ...struct Student //学生信息的结构体声明 { unsigned int num;程序区: stud.h #ifndef _TEST #define _TEST #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student //学生信息的结构体声明 { unsigned int num; //记录学号 char grade[10]; //记录年级 char name[20]; //记录姓名 char born[20]; //记录出生年月 char sex[10]; //记录性别 char poli[20]; //记录政治面貌 char phone[20]; //记录联络电话 char addr[100]; //记录家庭住址 struct Student *next; //指向下一个结构体的指针 }; //******************对各功能函数的声明*************************** void show(); //显示函数的声明 struct Student *input(); //新建学生信息的函数声明 struct Student *insert(struct Student *head,struct Student *stu); //插入学生信息的函数声明 struct Student *del(struct Student *head); //删除学生信息的函数声明 void alter(struct Student *head); //修改学生信息的函数声明 void search(struct Student *head,unsigned int num); //查询学生信息的函数声明 void output(struct Student *head); //保存学生信息的函数声明 #endif
stud.cpp #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #include"stud.h" extern struct Student *head = NULL; extern unsigned int kg = 0; void show() { int n,z = 1,k = 0; char cho; do { //***********显示提示信息********** printf(" 学生信息管理系统 \n"); printf(" \n"); printf(" 1.新建学生信息 2.插入学生信息 \n"); //显示序号1的功能 printf(" \n"); //显示序号2的功能 printf(" 3.删除学生信息 4.修改学生信息 \n"); //显示序号3的功能 printf(" \n"); //显示序号4的功能 printf(" 5.查询学生信息 6.保存学生信息 \n"); //显示序号5的功能 printf(" \n"); //显示序号6的功能 printf(" 0.退出系统 \n"); //显示序号0的功能 printf(" \n"); //******************************** printf(" 请输入功能序号: "); //提示用户输入 while(!scanf("%d",&n)) //接受用户输入的功能序号,并且进行排错 { printf(" 输入序号有误,请重新输入: "); fflush(stdin); //清空输入缓冲区,通常是为了确保不影响后面的数据读取 } printf("\n"); //输出回车 while((n < 0 || n > 6)) //对用户输入不能实现的功能序号进行处理 { printf(" 抱歉,没有此功能,请重新输入功能序号: "); //提示用户所输入的功能序号系统不能进行处理 fflush(stdin); while(!scanf("%d",&n)) //接收用户重新输入的功能序号 { printf(" 输入序号有误,请重新输入: "); fflush(stdin); } printf("\n"); //输出回车 } switch(n) //对用户信息进行功能函数的调用 { case 0: { printf(" "); if (k == 1) //对于没有对数据进行存盘的情况进行对用户提示以确认是否退出 { printf("数据未保存,是否退出? Y.是 N.否 请选择: "); fflush(stdin); cho = getchar(); if (cho == 'y' || cho == 'Y') { z = 0; printf(" "); } else if (cho == 'n' || cho == 'N') {} else { printf(" 无效输入\n "); system("pause"); } } else { z = 0; } break; } case 1: { head = input(); k = 1; system("pause"); break; } case 2: { head = insert(head,NULL); k = 1; printf(" 成功插入学生信息\n "); system("pause"); break; } case 3: { head = del(head); k = 1; printf(" "); system("pause"); break; } case 4: { alter(head); break; } case 5: { if (head == NULL) k = 1; search(head,0); printf(" "); system("pause"); break; } case 6: { k = 0; output(head); break; } } }while(z == 1); } //*************************************************************** struct Student *input() { struct Student *p1,*p2; //尾插法 unsigned m,n,i; FILE *read; char filename[20]; head = NULL; printf (" 请输入学生人数: "); while (!scanf("%u",&n)) //接收录入学生信息的人数,并对输入有误的进行排除 { printf(" 输入有误,请重新输入学生人数: "); fflush(stdin); } if (n == 0) //对录入人数为0的情况进行处理 { printf(" 学生个数为0人,建立失败\n "); return (head); } head = p2 = p1 = (struct Student *) malloc (LEN); //开辟内存,用于生成链表 printf(" 学生个数为:%u个,请按照以下顺序输入\n",n); //对学生总数的提示,并且提示每个学生信息的输入顺序 printf(" 学号、年级、姓名、出生年月、性别、政治面貌、联络电话、家庭住址\n"); //每个学生信息的输入顺序 for(i = 0; i < n; i++) { printf(" 请输入第%u个学生信息!\n",i+1); //提示接下来要输入第几个学生的信息 printf(" "); //格式调整,输出三个空格 fflush(stdin); while(!scanf("%d %s %s %s %s %s %s %s",&p2->num,p2->grade,p2->name,p2->born,p2->sex,p2->poli,p2->phone,p2->addr)) { printf(" 输入有误,请重新输入该学生信息\n "); fflush(stdin); } if (n == 1) //对录入人数为1时的情况进行处理 { p2->next = NULL; } else //对录入人数大于1的情况进行录入,并在录入时进行排序,每录入一位学生信息就开辟一个内存空间,用于下一个学生的录入 { head = insert(head,p2); p2 = (struct Student *) malloc (LEN); } } printf(" 成功录入学生信息,并且学生信息已经按学号从小到大排列\n"); printf(" 学生信息如下: \n"); search(head,1); //以表格的形式显示所录入的学生信息 printf(" "); return head; //返回*head指针的地址 } struct Student *insert(struct Student *head,struct Student *stu) //插入学生信息功能函数定义 { struct Student *p1,*p2; if (stu == NULL) //对于传入插入学生信息为空时要求用户输入插入的学生信息 { printf(" 请按照学号、年级、姓名、出生年月、性别、政治面貌、联络电话、家庭住址的顺序输入\n "); //每个学生信息的输入顺序 stu = (struct Student *) malloc (LEN); while(!scanf("%d %s %s %s %s %s %s %s",&stu->num,stu->grade,stu->name,stu->born,stu->sex,stu->poli,stu->phone,stu->addr)) { printf(" 输入信息有误,请重新输入\n"); fflush(stdin); } } if (head == NULL) //对于链表为空的情况的处理 { head = stu; head->next = NULL; } else //在链表中插入学生信息 { p1 = p2 = head; while(stu->num > p2->num && p1->next != NULL) //查找适合位置的前一个学生 { p2 = p1; p1 = p1->next; } if (p2 == p1) //插入的学生正好为链表头的情况 { if (stu->num < p2->num) //插入在表头前 { head = stu; stu->next = p2; } else //插入在表头后 { p2->next = stu; stu->next = NULL; } } else //插入的学生在链表中的情况 { if (stu->num < p1->num) //插入到p1指向的学生前 { p2->next = stu; stu->next= p1; } else //插入到p1指向的学生后 { p1->next = stu; stu->next = NULL; } } } kg = 1; return(head); } struct Student *del(struct Student *head) //删除学生信息的功能函数定义 { unsigned int num,k; struct Student *p1,*p2; if (head == NULL) //对空链表删除的情况处理 { printf(" 没有学生信息,结束删除\n"); return(head); } printf(" 请输入要删除的学生学号: "); //求用户输入要删除的学生学号 while(!scanf("%u",&num)) //接收学生序号并进行排错处理 { printf(" 输入有误,请重新输入学生序号: "); fflush(stdin); } do { p1 = p2 = head; while(num != p1->num && p1->next != NULL) //查找删除位置的前一个学生 { p2 =p1; p1= p1->next; } if (num == p1->num) //对满足要求的学生进行删除 { if (num == p1->num) { if (p1->next == NULL && p1 == head) //对只有一个节点的链表进行删除 { free(p1); head = NULL; } else if (p1->next == NULL) //删除链表尾节点 { free(p1); p2->next = NULL; } else if (head == p1) //删除表头节点 { head = p1->next; free(p1); } else //删除表中节点 { p2->next = p1->next; free(p1); } } printf(" 成功删除学生信息\n"); //提示删除成功信息 } else //找不到要删除的学生时的提示 { printf(" 找不到该同学信息\n"); fflush(stdin); } if (head == NULL) //对空链表删除时的处理 { printf(" 没有学生信息,结束删除\n"); return(head); } else //提示用户删除后是否继续 { printf(" 1.继续删除学生信息\n"); printf(" 2.结束删除\n"); printf(" 请选择: "); while(!scanf("%u",&k)) //接收用户选择 { printf(" 输入有误,请重新输入选择的序号: "); fflush(stdin); } if (k == 1) //选择继续 { printf(" 请输入要删除的学生学号: "); while(!scanf("%u",&num)) { printf(" 输入有误,请重新输入学生学号: "); fflush(stdin); } } else if (k != 2) //对于不是选择2的继续循环提示 { k = 1; } } }while(k == 1); return(head); //返回表头地址 } void search(struct Student *head,unsigned int num) //查询函数的定义 { unsigned int cho,t = 0; struct Student *p1; if (head == NULL) //对查询空链表时的操作 { printf(" 没有学生信息,结束查询\n"); return; } p1 = head; if (num == 0) //当传入实参 num = 0 需要接受用户需要的查询方式(个别或者全部),不等于0则可以直接查询个别学生信息 { printf(" 1.查询个别学生信息\n"); printf(" 2.查询全部学生信息\n"); printf(" 请选择: "); while(!scanf("%u",&cho)) //对错误输入数据的处理 { printf(" 输入有误,请重新输入序号: "); fflush(stdin); } while(cho != 1 && cho != 2) //处理不能处理的功能序号 { printf(" 抱歉,没有此功能,请重新输入功能序号: "); //提示不能处理的信息,并要求用户重新输入功能序号 while(!scanf("%u",&cho)) //接收用户重新输入的功能序号 { printf(" 输入序号有误,请重新输入序号: "); fflush(stdin); } printf("\n"); //输出回车 } } else { cho = 1; //设置直接查询个别学生的开关 } if (kg == 1) //kg(全局变量)为全部学生查询的开关 kg = 1 打开开关由下面直接进行全部学生查询 kg = 0 关闭开关 { cho = 2; } switch(cho) //查询类别分支 { case 1: //查询个别学生 { do { p1 = head; if (num == 0 || t == 1) { printf(" 请输入需要查询的学生学号: "); while(!scanf("%u",&num)) { printf(" 输入有误,请重新输入: "); fflush(stdin); } t = 1; //打开开关,该开关为查询完毕后 num不能作为该分支的条件(因为以下的操作会改变num的值)而建立的,并且能够实现当传入num不等于0时,以下询问用户是否继续的分支就不用执行了 } else { cho = 2; //如果传入的实参num不等于0 则该 DO WHILE 循环只做一次 } while(p1->num != num) //查找查询学生学号 { if (p1->next == NULL) break; p1 = p1->next; } if (p1->num == num) //查找成功一表格方式输出该学生信息 { //***********************表格头部设计************************ printf(" ┃学号┃年级┃ 姓名 ┃出生年月┃性别┃政治面貌┃ 联络电话 ┃ 家庭住址 ┃\n"); //********************************************************** //****************表格主体设计以及数据输出****************** printf(" ┃%-4d┃%-4s┃%-8s┃%-8s┃%-4s┃%-8s┃%-12s┃%-38s┃\n",p1->num,p1->grade,p1->name,p1->born,p1->sex,p1->poli,p1->phone,p1->addr); //********************************************************** //***********************表格头部设计*********************** //********************************************************* } else //查找不成功,提示用户找不到该学生 { printf(" 找不到该学生\n"); } if (t == 1) //如果传入的num=0,则此分支有效,询问用户是否继续查询 { printf(" 1.继续查询\n"); printf(" 2.结束查询\n"); printf(" 请选择: "); while(!scanf("%u",&cho)) //对输入序号查错,利用cho = 2时的情况跳出 DO WHILE 循环 { printf(" 输入序号有误,请重新输入: "); fflush(stdin); } } }while (cho == 1); break; } case 2: //查询全部信息 { //***********************表格头部设计************************ printf(" ┃学号┃年级┃ 姓名 ┃出生年月┃性别┃政治面貌┃ 联络电话 ┃ 家庭住址 ┃\n"); //********************************************************** //****************表格主体设计以及数据输出****************** while(p1 != NULL) { //intf(" ┣━━╋━━╋━━━━╋━━━━╋━━╋━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━┫\n"); printf(" ┃%-4d┃%-4s┃%-8s┃%-8s┃%-4s┃%-8s┃%-12s┃%-38s┃\n",p1->num,p1->grade,p1->name,p1->born,p1->sex,p1->poli,p1->phone,p1->addr); p1 = p1->next; } //********************************************************** //***********************表格头部设计*********************** //********************************************************** break; } } if (kg == 1) kg = 0; //关闭查询全部学生的开关,以便下一次使用 } void alter(struct Student *head) //修改学生信息的功能函数定义 { struct Student *p1,*p2; unsigned int num,cho,k,l=0; if (head == NULL) //对空链表的处理 { printf(" 没有学生信息,结束修改\n "); system("pause"); return; } printf(" 请输入需要修改的学生学号: "); while(!scanf("%u",&num)) //接受用户输入的学号并且进行查错 { printf(" 输入学号有误,请重新输入: "); fflush(stdin); } do { p2 = p1 = head; while(p1->num != num) //查找学生学号 { if (p1->next == NULL) break; p2 = p1; p1 = p1->next; } if (p1->num == num) //查找成功 { printf(" 已找到该学生,该学生的信息为: \n"); search(head,num); l = 0; do { if (l == 0) //开关,当第一次循环时 l=0 执行 IF 语句 printf(" 选择修改的内容\n"); else printf(" 序号输入错误,请重新选择\n"); l = 1; //打开开关,以在以下操作用户输入序号超出范围时控制上面的分支语句,进而可以更好地向用户提示信息 printf(" 1.学号\n"); printf(" 2.年级\n"); printf(" 3.姓名\n"); printf(" 4.出生年月\n"); printf(" 5.性别\n"); printf(" 6.政治面貌\n"); printf(" 7.联络电话\n"); printf(" 8.家庭住址\n"); printf(" 9.全部\n"); printf(" 请选择序号: "); fflush(stdin); while(!scanf("%u",&cho)) //接受序号并查错 { printf(" 输入序号有误,请重新输入: "); fflush(stdin); } }while(cho > 9 || cho < 1); switch(cho) //对序号进行多分支处理 { case 1: { printf(" 请输入该学生改正的学号信息: "); while(!scanf("%u",&p1->num)) { printf(" 输入改正信息有误,请重新输入: "); fflush(stdin); } break; } case 2: { printf(" 请输入该学生改正的年级信息: "); while(!scanf("%s",p1->grade)) { printf(" 输入改正信息有误,请重新输入: "); fflush(stdin); } break; } case 3: { printf(" 请输入该学生改正的姓名信息: "); while(!scanf("%s",p1->name)) { printf(" 输入改正信息有误,请重新输入: "); fflush(stdin); } break; } case 4: { printf(" 请输入该学生改正的出生年月信息: "); while(!scanf("%s",p1->born)) { printf(" 输入改正信息有误,请重新输入: "); fflush(stdin); } break; } case 5: { printf(" 请输入该学生改正的性别信息: "); while(!scanf("%s",p1->sex)) { printf(" 输入改正信息有误,请重新输入: "); fflush(stdin); } break; } case 6: { printf(" 请输入该学生改正的政治面貌信息: "); while(!scanf("%s",p1->poli)) { printf(" 输入改正信息有误,请重新输入: "); fflush(stdin); } break; } case 7: { printf(" 请输入该学生改正的联络电话信息: "); while(!scanf("%s",p1->phone)) { printf(" 输入改正信息有误,请重新输入: "); fflush(stdin); } break; } case 8: { printf(" 请输入该学生改正的家庭住址信息: "); while(!scanf("%s",p1->addr)) { printf(" 输入改正信息有误,请重新输入: "); fflush(stdin); } break; } case 9: { printf(" 请输入该学生全部要改正的信息: "); while(!scanf("%u %s %s %s %s %s %s %s",&p1->num,p1->grade,p1->name,p1->born,p1->sex,p1->poli,p1->phone,p1->addr)) { printf(" 输入改正信息有误,请重新输入: "); fflush(stdin); } break; } } if (cho == 1 || cho == 9) //对修改过学号的学生进行重新排序 { if (p1 == head) //当该学生在链表头时,删除链表头节点 { head = head->next; } else if (p1->next == NULL) //当该学生在链表尾时,删除链表尾节点 { p2->next = NULL; } else //当该学生在链表中时,删除该学生对应的节点 { p2->next = p1->next; } head = insert(head,p1); //利用插入学生信息功能函数,进行该学生的重新排序 } printf(" 修改成功,该学生改正后的信息为: \n"); search(head,p1->num); //显示以下修改后的学生信息 //询问用户是否继续 printf(" 1.继续修改其他学生信息\n"); printf(" 2.退出修改\n"); printf(" 请选择: "); while(!scanf("%u",&k)) //接受用户输入的序号,并进行排错 { printf(" 输入序号有误,请重新输入: "); fflush(stdin); } if (k == 1) //接受下一次修改的学生学号 { printf(" 请输入需要修改的学生学号: "); while(!scanf("%u",&num)) { printf(" 输入修改信息有误,请重新输入: "); fflush(stdin); } } else if (k != 2) //排错 { printf(" 输入有误,请重新输入\n"); } } else //查找不到学生时要求用户进行重新输入学生序号 { k = 1; printf(" 找不到该学生信息,请重新输入需要修改的学生学号: "); fflush(stdin); while(!scanf("%u",&num)); //接受用户重新输入的学号并进行排错 { printf(" 输入修改信息有误,请重新输入: "); fflush(stdin); } } }while(k == 1); printf(" "); system("pause"); } void output(struct Student *head) //保存学生信息到txt文件功能函数 { FILE *write; char filename[20]; struct Student *p1,*p2; unsigned int cho,n; if (head == NULL) //对空链表进行处理 { printf(" 没有学生信息,保存失败\n "); system("pause"); return; } p1 = p2 = head; printf(" 请输入保存的文件名(如save): "); while(!scanf("%s",filename)) //接受文件名,并进行排错(几乎不会出现错误的现象,慎重而设) { printf(" 输入的文件名有误,请重新输入:"); fflush(stdin); } strcat(filename,".txt"); //链接后缀名 write = fopen(filename,"w"); //以写入方式打开文件 //询问用户用哪种方式保存 printf(" 1.以表格形式保存(不可重新录入)\n"); printf(" 请按1进行确认 : "); while(!scanf("%u",&cho)) //接受用户输入的序号并进行排错 { printf(" 输入序号有误,请重新输入: "); fflush(stdin); } while(cho < 1 || cho > 1) //对超出范围的序号进行排错 { printf(" 输入序号有误,请重新输入: "); while(!scanf("%u",&cho)) { printf(" 输入序号有误,请重新输入: "); //对输入错误的序号进行排错 fflush(stdin); } } if (cho == 1) //以表格形式保存 { //***********************表格头部设计************************ fprintf(write," ┃学号┃年级┃ 姓名 ┃出生年月┃性别┃政治面貌┃ 联络电话 ┃ 家庭住址 ┃\n"); //********************************************************** //****************表格主体设计以及数据输出****************** while(p1 != NULL) { ; fprintf(write," ┃%-4d┃%-4s┃%-8s┃%-8s┃%-4s┃%-8s┃%-12s┃%-38s┃\n",p1->num,p1->grade,p1->name,p1->born,p1->sex,p1->poli,p1->phone,p1->addr); p1 = p1->next; } //********************************************************** //***********************表格头部设计*********************** //********************************************************** } fclose(write); printf(" 保存成功\n "); system("pause"); }
main.cpp #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #include"stud.h" int main() { show(); //调用显示功能函数 return 0;
-
数据结构 学生信息管理系统
2017-12-22 09:28:23吴玉然 学生信息管理系统 main.cpp #include "list.h" #include #include #include #include using namespace std; void xinjian(Listtype &L,Data data) { cout新建学生信息输入"; do {吴玉然
学生信息管理系统
main.cpp
#include "list.h" #include <iostream> #include <stdio.h> #include <cstdlib> #include<fstream> using namespace std; void xinjian(Listtype &L,Data data) { cout<<"新建学生信息输入"<<endl; do { //循环添加结点数据 cout<<"Please enter the student id:"; cin>>data.num; cout<<"Please enter the student name:"; cin>>data.name; cout<<"Please enter the student age ( if the age entry is 0, you can end the entry ):"; cin>>data.age; cout<<endl; if(data.age) { //若年龄不为0 if(!Adddata(&L,data)) { cout<<"Failure!"<<endl; break; } } else break; }while(1); cout<<"长度为:"<<GetLength(&L); cout<<"添加成功!"<<endl; system("pause"); return; } void Add(Listtype &L,int i,Data data) { cout<<"插入学生信息输入"<<endl; cout<<"请输入要插入位置:"<<endl; cin>>i; cout<<"请输入学生学号:"; cin>>data.num; cout<<"请输入学生姓名:"; cin>>data.name; cout<<"请输入学生年龄:"; cin>>data.age; cout<<"插入前长度为:"<<GetLength(&L); Insertdata(&L,i,data); cout<<"插入后长度为:"<<GetLength(&L); cout<<"插入成功!"<<endl; system("pause"); return; } void Delete(Listtype &L,int i,int j,Data data) { cout<<"删除从第i位置起的j个学生数据:"<<endl; cout<<"请输入i的值:"; cin>>i; cout<<endl; cout<<"请输入j的值:"; cin>>j; cout<<endl; IjDelete(&L,i,j); cout<<"删除成功!"<<endl; system("pause"); return; } void Show(Listtype &L) { cout<<"以下为所有学生的信息:"<<endl; Show(&L); cout<<endl; system("pause"); return; } void Save(Listtype &L,Data data) //保存文件函数 { cout<<"保存已输入数据中......"<<endl; Savefile(&L,data); system("pause"); return; } void xiugai(Listtype &L,int i,int j,Data data) //学生信息修改函数 { system("cls"); //清屏 int choice2; do { cout<<"\n********************************************************************************\n"<<endl; cout<<" 学生信息修改"<<endl; cout<<"\n"<<endl; cout<<" 1.新建 2.增添"<<endl; cout<<" 3.删除 4.显示"<<endl; cout<<" 5.保存 0.返回"<<endl; cout<<"\n"<<endl; cout<<"\n"<<endl; cout<<"\n********************************************************************************\n"<<endl; cout<<"\n"<<endl; cout<<"\n 请输入您的选择(1 or 2 or 3 or 4 or 0):"; cin>>choice2; switch(choice2) { case 1:xinjian(L,data);break; //进入新建学生信息操作的函数 case 2:Add(L,i,data);break; //进入增添学生信息操作的函数 case 3:Delete(L,i,j,data);break; //进入删除学生信息操作的函数 case 4:Show(L);break; //进入显示学生信息操作的函数 case 5:Save(L,data);break; //进入保存文件的函数 case 0:cout<<endl<<"返回上一菜单!"<<endl;break; //返回上一菜单,即初始菜单界面 default:cout<<"无此选项!请重试!"<<endl;break; //若输入异常,显示异常操作,提示错误! } }while(choice2!=0); } void Icha(Listtype &L,int i,Data *&xian) //按位置查找函数 { cout<<"长度为:"<<GetLength(&L); cout<<"请输入要查找的学生的位置:"; cin>>i; xian=DataGet(&L,i); cout<<"姓名:"<<xian->name<<endl; cout<<"学号:"<<xian->num<<endl; cout<<"年龄:"<<xian->age<<endl; system("pause"); return; } void chaxun(Listtype &L,int i,Data data,Data *&xian) //学生信息查询函数 { system("cls"); cout<<"\n********************************************************************************\n"<<endl; cout<<" 学生信息查询"<<endl; cout<<endl; cout<<" 1、按位置查询 0、返回"<<endl; cout<<endl; cout<<"\n********************************************************************************\n"<<endl; int choice3=0; cout<<" 请输入您的选择(1 or 2 or 3 or 0):"; cin>>choice3; switch(choice3) { case 1:Icha(L,i,xian);break; //进入按位置查询的函数 case 0:cout<<endl<<"返回上一菜单!"<<endl;break; //返回上一菜单,即初始菜单界面 default:cout<<"无此选项!请重试!"<<endl;break; //若输入异常,显示异常操作,提示错误! } } int main() //主函数 { int i=0; int j=0; Listtype L; Data data; Data *xian; ChuShiHua(&L); system("cls"); //清屏 int choice1; do //进入初始菜单界面 { cout<<"\n*********************************************************************************"<<endl; cout<<"\n**************************** *************************************"<<endl; cout<<" *学生信息查询系统 \n"<<endl; cout<<"\n"<<endl; cout<<"\n"<<endl; cout<<"\n************************** 1、学生信息管理 ***********************************"<<endl; cout<<"\n************************** 2、学生信息查询 ***********************************"<<endl; cout<<"\n*************************** 0、退出系统 ***********************************"<<endl; cout<<"\n"<<endl; cout<<"\n*********************************************************************************"<<endl; cout<<"\n 请输入您的选择(1 or 2 or 0):"; cin>>choice1; switch(choice1) { case 1:xiugai(L,i,j,data);break; //进入学生信息修改菜单界面 case 2:chaxun(L,i,data,xian);break; //进入学生信息查询菜单界面 case 0:cout<<"\n您已安全退出系统."<<endl;break; //退出系统,即结束此函数 default:cout<<"\n没有此选项.请重选."<<endl;break; //若输入异常,显示异常操作,提示错误! } }while(choice1!=0); cout<<"\n------------------------------欢迎您下次再使用!---------------------------------"<<endl; return 0; return 0; }
List.cpp
List.h#include "List.h" #include <iostream> #include <cstdlib> #include <string> #include<fstream> using namespace std; /************************************************************************** 功能描述:本函数是给顺序表进行初始化赋值,主要是给顺序表的长度 Length赋初值为0 输入参数:Listtype类型的指针变量L 输出参数:无 返回值:无 其他说明:无 ***************************************************************************/ void ChuShiHua(Listtype*L) //顺序表的初始化函数 { L->Length=0; } /************************************************************************** 功能描述:本函数可以的到顺序表的长度,即返回Length的值 输入参数:Listtype类型的指针变量L 输出参数:无 返回值:Length值 其他说明:无 ***************************************************************************/ int GetLength(Listtype*L) //计算顺序表的长度 { return(L->Length); } /************************************************************************** 功能描述:本函数是按照位置查找已经录入的学生信息,若输入的i值不 在有效内,输出错误信息;输入正确则返回要查询的地址 输入参数:Listtype类型的指针变量L,int类型的变量i 输出参数:错误信息 返回值:0或者查询的地址 其他说明:无 ***************************************************************************/ Data *DataGet(Listtype*L,int i) //按照位置查找学生位置 { if(i<1||i>MAXLEN) { cout<<"位置输入错误!"<<endl; return 0; } else { return &(L->listData[i]); } } /************************************************************************** 功能描述:本函数是按照名字查询录入的学生信息,输入要查找的姓名, 若找到与之匹配的,便返回其地址 输入参数:Listtype类型的指针变量L,string类型的变量name 输出参数:无 返回值:0或者要查找的地址 其他说明:无 ***************************************************************************/ Data *NameGet(Listtype *L,string name) //按照姓名查找学生位置 { int n; for(n=1;n<=L->Length;n++) { cout<<n; if(L->listData[n].name==name) { return &(L->listData[n]); break; } else return 0; } } /************************************************************************** 功能描述:本函数是按照学号查询录入的学生信息,输入要查找的学号, 若找到与之匹配的,便返回其地址 输入参数:Listtype类型的指针变量L,string类型的变量num 输出参数:无 返回值:0或者要查找的地址 其他说明:无 ***************************************************************************/ Data *NumGet(Listtype *L,string num) //按照学号查找学生位置 { int n; for(n=1;n<=L->Length;n++) { cout<<n; if(L->listData[n].num==num) { return &(L->listData[n]); break; } else return 0; } } /************************************************************************** 功能描述:本函数是在已经录入的学生信息里插入一条新的学生信息,判断 若顺序表满则不能继续存储,输入的i不在有效范围输出错误信息, 输入正确则插入成功 输入参数:Listtype类型的指针变量L,int类型的变量i,Data类型的变量data 输出参数:错误信息 返回值:0或者1 其他说明:无 ***************************************************************************/ int Insertdata(Listtype*L,int i,Data data) //插入学生信息 { int j; if(L->Length>=MAXLEN) { cout<<"储存已满,不能添加!"<<endl; return 1; } if(i<1||i>MAXLEN) { cout<<"插入序号错误!"<<endl; return 1; } else { for(j=L->Length;j>=i;j--) L->listData[j+1]=L->listData[j]; L->listData[i]=data; L->Length++; return 0; } } /************************************************************************** 功能描述:本函数是删除指定位置的学生的信息,输入的i不在有效范围输出 错误信息,输入正确则删除成功。 输入参数:Listtype类型的指针变量L,int类型的变量i 输出参数:错误信息 返回值:0或者1 其他说明:无 ***************************************************************************/ int Deletedata(Listtype*L,int i) //删除学生信息 { int j; if(i<1||i>MAXLEN) { cout<<"输入删除节点错误!"<<endl; return 1; } else { for(j=i;j<L->Length;j++) L->listData[j]=L->listData[j+1]; L->Length--; return 0; } } /************************************************************************** 功能描述:本函数是删除指定位置的学生的信息,输入的i,k不在有效范围输出 错误信息,输入正确则删除成功。 输入参数:Listtype类型的指针变量L,int类型的变量i,int类型的变量k 输出参数:无 返回值:0或者1 其他说明:无 ***************************************************************************/ int IjDelete(Listtype*L,int i,int k) //删除顺序表中从第i个学生起的j个学生 { if(i<1||k<0||i+k>L->Length+1) return 1; else { int j; int count; for(count=1;count<=k;count++) { for(j=i;j<i+k;j++) { L->listData[j]=L->listData[j+1]; } L->Length--; } return 0; } } /************************************************************************** 功能描述:本函数显示出所有的录入的学生的信息,按照制定格式输出到 电脑屏幕上 输入参数:Listtype类型的指针变量L 输出参数:无 返回值:无 其他说明:无 ***************************************************************************/ void Show(Listtype*L) //显示所有的学生信息 { int i; for(i=1;i<=L->Length;i++) { cout<<"学号:"<<L->listData[i].num; cout<<"姓名:"<<L->listData[i].name; cout<<"年龄:"<<L->listData[i].age; cout<<endl; } } /************************************************************************** 功能描述:本函数能够连续添加学生信息,判断若线性表到达最大值, 输出提示信息 输入参数:Listtype类型的指针变量L,Data类型的变量data 输出参数:提示信息 返回值:0或者1 其他说明:无 ***************************************************************************/ int Adddata(Listtype*L,Data data) //新建学生信息 { if(L->Length>MAXLEN) { cout<<"存储已满,不能再添加学生!"<<endl; return 0; } else { L->listData[++L->Length]=data; return 1; } } /************************************************************************** 功能描述:本函数能把所有的录入信息保存进入文件中,如果打开失败输出 错误信息,打开成功按照指定格式保存入文件 输入参数:Listtype类型的指针变量L 输出参数:无 返回值:无 其他说明:无 ***************************************************************************/ void Savefile(Listtype *L,Data data) //保存文件 { ofstream out("学生.txt",ios::out); if(!out) { cout<<"打开失败!"<<endl; return; } cout<<"打开成功!"<<endl; for(int i=1;i<=L->Length;i++) { out<<"以下为所有学生信息:"<<endl; out<<"学生姓名:"<<L->listData[i].name<<" "<<"学生学号:"<<L->listData[i].num<<" "<<"学生年龄:"<<L->listData[i].age<<" " <<endl; } cout<<"写入成功!"<<endl; out.close(); }
#ifndef LIST_H #define LIST_H #include <string> using namespace std; #define MAXLEN 100 //定义顺序表的最大长度 struct Data { //定义顺序表结点类型 string num; //节点关键字 string name; int age; }; struct Listtype { //定义顺序表结构 Data listData[MAXLEN+1]; //结构体中嵌套结构体 int Length; }; void ChuShiHua(Listtype*L); //顺序表的初始化函数 int GetLength(Listtype*L); //计算顺序表的长度 Data *DataGet(Listtype*L,int i); //按照位置查找节点 Data *NameGet(Listtype*L,string name); //按照姓名查找节点 Data *NumGet(Listtype*L,string num); //按照学号查找节点 int Insertdata(Listtype*L,int i,Data data); //插入节点 int Deletedata(Listtype*L,int i); //删除节点 int IjDelete(Listtype*L,int i,int k); //删除顺序表中从第i个学生起的k个学生 void Show(Listtype*L); //显示所有的节点 int Adddata(Listtype*L,Data data); //追加节点 void Savefile(Listtype *L,Data data); //保存文件 #endif // LIST_H
-
数据结构实验报告(一)学生信息管理系统
2020-01-12 10:58:03大二计算机学生报告的汇总 进入计算机专业以来每天的必要工作就是写报告,按照老师的话来说,我们计算机专业的...学生信息管理系统 代码区 代码说明:此代码所运用的软件是ios系统的x-code #include <stdio.h... -
数据结构课程设计之学生宿舍信息管理系统
2020-06-21 10:14:38数据结构课程设计之学生宿舍信息管理系统,宿舍对于大学生在校生活来说相当于家的存在,而宿舍管理又是学校后勤管理的重要环节,如何直观的了解宿舍的入住情况和每位同学的住宿位置是提高工作效率的重要课题,根据... -
数据结构-学生成绩管理系统
2021-02-27 19:21:17学生信息的录入、查询、修改、排序、按学生成绩确定名次以及信息的输出。 其中学生信息包含:学号、姓名、专业、四门课、总分以及排名; 信息修改仅对四门成绩进行修改; 信息查询可以按照学号和姓名两种查询方法... -
数据结构大作-学生信息管理系统
2020-06-02 12:31:40C语言编写的 辣鸡 学生管理系统 -
数据结构课程设计——学生成绩管理系统
2021-12-12 17:50:05本程序是对学生的成绩管理做一个简单的模拟,用菜单选择方式完成下列功能: 登记学生成绩;查询学生成绩;插入学生成绩;删除学生成绩。把问题看作对线性表的操作来完成。 #include <stdio.h> #include ... -
数据结构—单链表实现学生信息管理系统
2019-06-19 13:50:22printf("链表结构如下:\n"); while (p) { printf("%s %s %d %.2f", p->data.name, p->data.sno, p->data.age, p->data.score); printf("\n"); p = p->next; } } //插入操作 int ListInsert(LinkList &L... -
学生成绩管理系统(数据结构课程设计)
2009-10-13 11:39:46学生信息管理系统是现实生活中比较常见的系统,它主要负责对学生信息的管理。 学生管理系统所要解决的问题是: (1)建立一个学生管理的链表 (2)数据的插入 (3)数据的删除 (4)信息的显示 (5)信息的查找 (6... -
数据结构--学生成绩管理系统(顺序表)
2021-11-24 15:30:461.通过此次课程设计学生成绩管理系统的题目,掌握链表等数据结构的基本操作方面的知识,并能灵活的解决一些基本的问题,加深对其性质及各项操作的理解; 2. 将所学数据结构方面的知识与具体的语言来进行实现,感受数据... -
学生管理系统的设计与实现(c语言版本数据结构)
2020-07-09 18:54:04文章目录学生管理系统的设计与实现1、需求分析1.1 实验目的:1.2 实验内容:1.3实验要求:1.4概要设计:2、概要设计2.1所用数据结构的定义及其相关说明(相关结构体或类的定义及其含义)2.2、各子程序调用关系2.3、各... -
数据结构课程设计(学生选课管理系统)链表实现
2020-07-03 22:47:498)修改学生信息 9)删除学生信息 10)删除课程信息 … 2.代码 学生和课程结构体 讲文件里的内容读取到单链表中 将学生信息保存到结构体中 4.代码实现 还有其他的功能我就不一一展示了。 有想要源代码 -
数据结构课程设计--学生信息管理系统
2017-12-22 07:52:01//(((((((((((((修改信息 (可以单项修改学生信息) ))))))))))))) stu *modify(stu *y) { int choi; char choice; int cp; char num[20],ch[20]; stu *p; if (y== NULL) { printf... -
数据结构(Java版)-学生成绩管理系统
2011-01-04 15:34:24学生成绩管理系统---使用数据结构中的二叉树排序,利用数据库实现学生查询、删除、修改信息、按学号或班级或课程成绩查询学生信息等。主要是字符界面显示 -
数据结构课程设计——学生成绩查询与分析系统(简单详细版,含讲解)
2022-01-04 17:20:25我是湫湫,一名普通的在校大学生。在学习之余,用博客来记录我学习过程中的点点滴滴,也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获!希望大家多多关照,我们一起成长一起进步。也希望大家多多支持我鸭... -
C语言版-数据结构-期末课程设计-大作业(学生成绩管理系统)附源码+实验文档
2021-12-22 16:53:044. 数据结构说明和模块算法说明 4.1结构体顺序表的定义 4.2顺序表的构造 4.3顺序表的插入 4.4顺序表的按值查找 4.5顺序表的删除数据 4.6顺序表的按值查找 4.7顺序表的排序算法---冒泡排序 5. 使用说明书 ... -
数据结构 课程设计 通讯录管理系统 源代码 c++
2014-06-17 21:36:59数据结构课程设计,用链表实现的通讯录管理系统。 可以方便查询多个班级每一个同学的手机号、电子邮箱,及家庭住址等信息。 本系统用线性链表实现多个班级的同学通讯信息的管理,实现了数据文件的保存与读取功能。... -
数据结构顺序表写学生管理系统
2020-09-05 18:08:21上一篇学习了顺序表(线性表的顺序存储)的九大操作,为了巩固知识点,今天用顺序表写了简单的学生管理系统。一下用了两种方式来实现,不适用指针和使用指针,加深对C语言指针的了解。 一、不使用指针方式 /********... -
数据结构课程设计---学生成绩管理系统
2020-12-10 22:27:542.建立学生信息链表并保存到文件中 3.按照总成绩进行排序 4.打印需要补考的学生的信息 5.合并两个成绩单到一个新的成绩单中 6.查找学生成绩(按照学号) 7.打印学生成绩单 C语言代码 #define _CRT_SECURE_... -
C语言:学生信息管理系统演示和说明(数据结构版)
2019-05-19 20:05:15文件版的学生管理系统...而数据结构版的学生管理系统重点是维护链表,能够将大家学到的数据结构的知识运用到实际中。 演示程序下载地址:http://pan.baidu.com/s/1dDS5WI... -
C++数据结构 线性表的链式存储结构应用 简单的学生成绩管理系统
2019-05-05 00:21:23C++数据结构 线性表的链式存储结构应用 简单的学生成绩管理系统 # include # include # include # include # include "stdlib.h" using namespace std ; struct Node { int num ; ... -
数据结构(Java实现)-单链表(单链表实现学生成绩管理系统)
2020-08-14 15:33:55每个节点包含data域:存储数据,next域:指向下一个节点 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 没有头节点单链表:也就是phead只是一个引用(指针),指向链表的第一个节点 有头节点... -
数据结构课程设计—学生信息管理系统
2015-12-25 15:33:18问题描述: /* ...* All rights reserved. * 文件名称:aaaa.cbp * 作 者:张芸嘉 * 完成日期:2015年12月24日 ...* 问题描述: 本项目为学生信息管理系统,设计一个可以管理学生信息的软件系统。 * -
数据结构:学生通讯录管理系统
2019-05-24 23:34:45printf("请输入学生学号、姓名和电话号码,建立通讯录,以'-1'为输入结束标志\n"); printf("请输入学号 %d:",num); scanf("%d",&number); printf("请输入姓名 %d: ",num); temp=getchar(); gets(name); printf("请... -
数据结构课程设计-通讯录管理系统(C语言版)
2020-12-12 13:48:18##数据结构课程设计-通讯录管理系统 一,前言 自从上次C语言课设写完后,这次数据结构课设就写的游刃有余了,很快啊,不足三天就写完了它(年轻人不讲武德),如果你认真看过我之前写的C语言课程设计-球队管理系统,... -
数据结构(顺序表):学生管理系统的设计与实现(C语言)
2020-06-20 12:36:21设计并实现一个学生管理系统,即定义一个包含学生信息(学号,姓名,成绩)的的顺序表,可以不考虑重名的情况,系统至少包含以下功能: (1)根据指定学生个数,逐个输入学生信息; (2)逐个显示学生表中所有学生... -
数据结构实验报告—学生成绩管理系统(Java实现)
2019-01-05 14:32:31根据给出的排序和查找源代码设计并实现一个学生管理系统,即定义一个包含学生信息(学号,姓名,成绩)的的顺序表,可以不考虑重名的情况,系统至少包含以下功能: (1) 根据指定学生个数,逐个输入学生信息;V (2)...
收藏数
125,040
精华内容
50,016