<span style="color:#ff0000;"> 学生学籍管理系统</span>
这个项目用了一天半的时间就完成了,一开始我没打算用链表来实现的,但是我自学链表也有一段时间了,想看看自己对链表掌握了多少,所以选择了用链表。第一次用链表写了一个系统,难免会有Bug,希望各位程序猿能指点一下。。。。。
/********************************************** 学生学籍管理系统 每个学生的信息包括:学号、姓名、性别、三门成绩 ***********************************************/ #include <iostream> #include<cstring> #include <cstdio> #include <Windows.h> using namespace std; const int N=10 ; //N表示系统最多能记录多少个学生的信息 const int courseNum = 3; //三门课程 const char courseTitle[courseNum][10] = { "数学", "英语", "体育" }; //三门课程名 struct Date { // 定义年、月、日 int yesr; int month; int day; }; struct CStudent { int id; // 学号,范围1至100 char name[10]; // 假设每个人的姓名长度不超过9个字符 char sex; // 性别,'M'表示男,'F'表示女 double score[courseNum]; // 每人有三门成绩 double avescore;//平均成绩 Date birthDate; CStudent *next; }stud; int choice; int n=0; int getChoice() { system("cls"); printf(" 当前学生人数:%d\n",n); printf("1. 添加学生信息\n"); printf("2. 显示所有学生信息\n"); printf("3. 按学号查询某个学生的信息\n"); printf("4. 按姓名查询某个学生的信息\n"); printf("5. 按姓名修改某个学生的信息\n"); printf("6. 按学号删除某个学生的信息\n"); printf("7. 退出系统\n"); do { scanf("%d",&choice); } while (choice < 1 || choice > 7); return choice; } void getAge(const CStudent* s) { SYSTEMTIME time; GetLocalTime(&time); int year = time.wYear; printf("%d\n",time.wYear-s->birthDate.yesr); } // 添加一个记录,若添加成功,则函数返回true; // 否则(数组已满),则返回false int a[100000];//判断学号是否重复 CStudent *p, *head, *q,*t; void InPut() { if (n==0) { head = new CStudent; head->next = NULL; p = head; } double sum = 0; q = new CStudent; cout << "学号(1~100):"; scanf("%d",&q->id); // 思考:如何添加代码,判断输入学号不重复 while (!a[q->id]) { if (a[q->id] == 0) { a[q->id] = 1; } else { scanf("%d",&q->id); } } printf("姓名:"); scanf("%s",&q->name); printf("性别(M-男,F-女):"); cin.get(); scanf("%c",&q->sex); printf("%d",courseNum); printf("门课程成绩:\n"); for (int i = 0; i < courseNum; i++) { printf("%s :",courseTitle[i]); scanf("%lf",&q->score[i]); sum += q->score[i]; } q->avescore = sum / 3.0; printf("请输入出生年月日:"); scanf("%d %d %d",&q->birthDate.yesr,&q->birthDate.month,&q->birthDate.day); printf("\n"); if (n) { head=p; t = p->next; for (int i = 0; i < n; ++i) { if (q->avescore>t->avescore&&t->next!=NULL) { head=t; t = t->next; } else if(q->avescore>t->avescore&&t->next==NULL) { t->next = q; t=q; t->next = NULL; break; } else { q->next=t; head->next=q; } } } else { head->next = q; head = q; head->next = NULL; } n++; //记录人数+1 printf("成功添加信息\n"); } void Sort(CStudent* q)//修改数据后重新按平均分排序 { if (n) { head=p; t = p->next; for (int i = 0; i < n; ++i) { if (q->avescore>t->avescore&&t->next!=NULL) { head=t; t = t->next; } else if(q->avescore>t->avescore&&t->next==NULL) { t->next = q; t=q; t->next = NULL; break; } else { q->next=t; head->next=q; } } } else { head->next = q; head = q; head->next = NULL; } n++; //记录人数+1 } void ShowAllInfo(const CStudent* w)// 显示所有记录 { w = w->next; int h=0; while (w) { printf("位置\t学号\t姓名\t性别\t平均分\t年龄\n"); printf("%d\t",h++); printf("%d\t",w->id); printf("%s\t",w->name); printf("%c\t",w->sex); printf("%.2lf\t",w->avescore); getAge(w); for (int i=0;i<courseNum;++i) { printf("%s: ",courseTitle[i]); printf("%.1lf\t",w->score[i]); } printf("\n"); printf("----\\\n"); printf("----/\n"); w=w->next; } } void findById(const CStudent* w) { int count = 0 ,num,flag=0; printf("请输入学生学号:\n"); scanf("%d",&num); w=w->next; while (w) { if (w->id==num) { flag=1; printf("此学生的位置:"); printf("%d\n",count); printf("查找成功!\n"); break; } count++; w=w->next; } if (flag==0) { printf("查找失败!\n"); } } void findByName(const CStudent* w) { int count = 0 ,flag=0; char Name[10]; printf("请输入想要找的姓名:\n"); scanf("%s",&Name); printf("\n"); w=w->next; while (w) { if (strcmp(w->name,Name)==0) { flag=1; printf("此名学生的位置:%d\n",count); break; } count++; w=w->next; } if (flag==0) { printf("找不到此名学生学号!\n"); } } void modify(CStudent* w) { int count = 0 ,flag=0; char Name[10]; double sum=0; printf("请输入要修改的姓名:"); scanf("%s",&Name);//修改第N条记录,为name cin.get(); printf("\n"); while (true&&w!=NULL) { head=w; w=w->next; if (strcmp(Name,w->name)==0) { if (w->next!=NULL) { head->next=w->next; } else { head->next=NULL; } q=w; printf("姓名:"); scanf("%s",& q->name); cin.get(); printf("性别(M-男,F-女):"); scanf("%c",& q->sex); printf("%d",courseNum); printf("门课程成绩:\n"); for (int i = 0; i < courseNum; i++) { printf("%s :",courseTitle[i]); scanf("%lf",& q->score[i]); sum += q->score[i]; } q->avescore = sum / courseNum; printf("请输入出生年月日:"); scanf("%d %d %d",&q->birthDate.yesr,&q->birthDate.month,&q->birthDate.day); printf("\n"); flag=1; n--; Sort(q); printf("修改成功!\n"); break; } } if (flag==0) { printf("修改失败!\n"); } } void removeAt(CStudent* w) { //删除第N条记录 int N,L=0; CStudent *k,*H; printf("请输入要删除的学号:"); scanf("%d",&N); printf("\n"); k=p; w=w->next; while (w) { if (w->id==N) { H=w; if (w->next==NULL) { k->next=NULL; } else { k->next=w->next; } printf("删除成功\n"); L=1; delete H; n--; break; } } if (L==0) { printf("删除失败\n"); } } int main() { memset(a, 0, sizeof(a)); while (true) { getChoice(); switch (choice) { case 1: // 添加一个记录,若添加成功,则函数返回true; // 否则(数组已满),则返回false InPut(); break; case 2: // 显示所有记录 ShowAllInfo(p); break; case 3: // 按学号查找,若记录中存在queryId,则返回该记录在数组中的位置 // 否则返回-1 findById(p); break; case 4: // 按姓名查找,若记录中存在queryName,则返回该记录在数组中的位置 // 否则返回-1 findByName(p); break; case 5: // 修改第p条记录 modify(p); break; case 6: // 删除第p条记录 removeAt(p); break; case 7: return 0; } system("pause"); } }
时间: 2024-11-05 13:29:38