学生信息管理系统c语言实现
关于
这篇博客是关于学生信息管理,由于时间太匆忙,只完成了少部分功能,基础的增删改查功能,并未进行细致的拓展。
注:代码框架来源于闫海玉老师的分享,但是闫海玉老师的B占视频讲解是基于数组实现,我用的是动态链表实现
特点:
1.使用睡眠函数,界面是动态打印。
2.实现了链表的快速排序。
代码如下:
#include <string.h>
#include <windows.h>
using namespace std;
char sname[100][100];
int m[100][100];
struct student
{
int sno; // 学号
char name[20]; //姓名
char sex[3]; // 性别
char clas[10]; // 班级
int chinese; // 语文成绩
int maths; // 数学成绩
int english; // 英语成绩
int total; // 总分
}Student;
// 链表
typedef struct node
{
struct student stu;
struct node *next;
} Lnode;
// 最大数
int maxSum = 0;
// 文件指针
FILE *fp;
Lnode *Head;
/*****函数声明*********/
//延迟打印
void pr(char *p1)
{
Sleep(200);
while(1)
{
if(*p1!=0)
printf("%c",*p1++);
else break;
Sleep(35);
}
}
//冒泡排序
int SortLinkBubble(Lnode *pHead);
//快速排序
Lnode* partition(Lnode* begin,Lnode* end);
void quicksort(Lnode* begin, Lnode* end);
// 增加
void addStudent();
// 删除
void deleteStudent();
// 查找
void queryStudent();
void queryBySno();
void queryByName();
// 更新
void updateStudnt();
// 打印:
void printAll();
// 统计分析
void analysis();
/
//文件操作
/
// 读文件
int readData();
// 写文件
int writeData();
// 自动生成学号
int createSno();
// 显示当前学生信息
void printCurrent(Lnode *p);
// 欢迎界面
void welcome();
// 菜单
void mainMenu();
Lnode *bycno();
/*****主函数***********/
int main()
{
Head=(Lnode *)malloc(sizeof(Lnode));
Head->next=NULL;
maxSum = readData();
SortLinkBubble(Head);
welcome();
mainMenu();
return 0;
}
/*****菜单选择*********/
void mainMenu()
{
// 循环显示主业务
// 提供选择项
// 输入选择项后调用
int select = 0;
while(1)
{
printf("\t\t\t| 菜单 |\n");
printf("\t\t\t|------------------------------|\n");
pr("\t\t\t| 1. 增加学生信息 |\n");
pr("\t\t\t| 2. 删除学生信息 |\n");
pr("\t\t\t| 3. 修改学生信息 |\n");
pr("\t\t\t| 4. 查找学生信息 |\n");
pr("\t\t\t| 5. 打印学生信息 |\n");
pr("\t\t\t| 6. 统计成绩信息 |\n");
pr("\t\t\t| 0. 退出系统 |\n");
printf("\t\t\t|------------------------------|\n");
pr("\t\t\t\t请输入选择业务\n\t\t\t");
scanf("%d",&select);
switch(select)
{
case 1:
system("cls");
addStudent();
break;
case 2:
system("cls");
deleteStudent();
break;
case 3:
system("cls");
updateStudnt();
break;
case 4:
system("cls");
queryStudent();
break;
case 5:
system("cls");
printAll();
break;
case 6:
system("cls");
analysis();
break;
case 0:
exit(0);
default:
printf("\t\t\t输入错误,请重新选择\n");
}
}
}
void addStudent()
{
char x;
Lnode *p;
printf("\t\t\t---------- 增加学生信息 ----------\n");
while(1){
p=(Lnode*)malloc(sizeof(Lnode));
p->stu.sno= createSno();
maxSum++;
fflush(stdin);// 清空缓存
printf("\t\t\t请依次输入以下信息:姓名 性别 班级 语文成绩 数学成绩 英语成绩\n\t\t");
scanf("%s %s %s %d %d %d",
p->stu.name,
p->stu.sex,
p->stu.clas,
&p->stu.chinese,
&p->stu.maths,
&p->stu.english);
p->stu.total=p->stu.chinese+p->stu.english+p->stu.maths;
p->next=Head->next;
Head->next=p;
SortLinkBubble(Head);
printf("\t\t\t是否继续添加学生信息?(Y)or(N)\n\t\t");
fflush(stdin);// 清空缓存
scanf("%c",&x);
if(x=='N')break;
}
if(writeData() == 1)
{
printf("\t\t\t添加成功\n\n\n");return ;
}
else
{
printf("添加失败\n");
}
}
/********************************
*********************************/
void deleteStudent()
{
printAll();
int sno;
int flag = -1;
printf("\t\t\t---------- 删除学生信息 ----------\n");
printf("\t\t\t请输入想要删除学生的学号:\n\t ");
scanf("%d",&sno);
Lnode *pre,*p;
pre=Head;
p=pre->next;
while(p->next)
{
if(p->stu.sno==sno)
{
pre->next=p->next;
free(p);
p=pre;
maxSum--;
flag=1;
}
pre=p;
p=pre->next;
}
if(flag == 1)
{
if(writeData() == 1)
{
printf("\t\t\t删除成功!\n\n");
printAll();
}
}
else
{
printf("\t\t\t删除失败\n");
}
}
void queryBySno()
{
int sno;
printf("\t\t\t请输入想要查找学生的学号:\n\t\t ");
scanf("%d",&sno);
Lnode *pre,*p;
pre=Head;
p=pre->next;
while(p->next)
{
if(p->stu.sno==sno)
{
printf("\t\t\t已查找到该学生的信息:\n");
printCurrent(p);return;
}
pre=p;
p=pre->next;
}
printf("\t\t\t该学号学生不存在,未找到!\n");
}
/********************************
*********************************/
void queryByName()
{
char name[20];
int flag=0;
printf("\t\t\t请输入想要查找的学生的任意名字字符\n\t\t\t");
fflush(stdin);
gets(name);
Lnode *pre,*p;
pre=Head;
p=pre->next;
while(p->next)
{
if(strstr(p->stu.name,name) != NULL)
{
if(flag!=1)printf("\t\t\t已查找到该学生的信息:\n");
printCurrent(p);
flag=1;
}
pre=p;
p=pre->next;
}
if(flag == 0)
{
printf("\t\t\t未找到该姓学生\n");
}
}
/********************************
函数功能:查找
方式:学号查找和名字字符模糊查找
*********************************/
void queryStudent()
{
char x;
int select = 0;
while(1){
printf("\t\t\t---------- 请输入查找方式 ----------\n");
printf(" \t\t\t 1 学号查找 2 姓名字符模糊查找 \n\t\t\t");
scanf("%d",&select);
if(select == 1)
{
queryBySno();
}
else
{
queryByName();
}
printf("\t\t\t是否想继续分析:Y(是)N(否)\n\t\t\t");
fflush(stdin);
scanf("%c",&x);
if(x=='N'){system("cls");return;}
}
}
/********************************
函数功能:
修改学生信息
*********************************/
void updateStudnt()
{
printAll();
int sno;
printf("\t\t\t---------- 修改的学生的信息 ----------\n");
printf("\t\t\t请输入想要修改信息的学生的学号: ");
scanf("%d",&sno);
Lnode *pre,*p;
pre=Head;
p=pre->next;
while(p->next)
{
if(p->stu.sno==sno)
{
printf("\t\t\t已查找到该学生的信息:\n");
printCurrent(p);
printf("\t\t\t请依次输入以下信息:姓名 性别 班级 语文成绩 数学成绩 英语成绩\n\t\t");
scanf("%s %s %s %d %d %d",
p->stu.name,
p->stu.sex,
p->stu.clas,
&p->stu.chinese,
&p->stu.maths,
&p->stu.english);
p->stu.total=p->stu.chinese+p->stu.english+p->stu.maths;
writeData();
printf("\t\t\t修改成功!\n");
printCurrent(p);
return;
}
pre=p;
p=pre->next;
}
printf("\t\t\t未找到该学号学生信息,修改失败\n");
return;
}
/********************************
输出学生信息
*********************************/
void printAll()
{
printf("\t\t\t\t---------- 学生基本信息 ----------\n");
printf("\t|-------------------------------------------------------------------------|\n");
printf("\t|%-10s|%-8s|%-8s|%-8s|%-8s|%-8s|%-8s|%-8s|\n"," 学号"," 姓名","性别","班级","语文成绩","数学成绩","英语成绩"," 总分");
printf("\t|----------+--------+--------+--------+--------+--------+--------+--------|\n");
Lnode *p=Head->next;
while(p->next)
{
printf("\t%10d %8s %8s %8s %8d %8d %8d %8d\n",
p->stu.sno,
p->stu.name,
p->stu.sex,
p->stu.clas,
p->stu.chinese,
p->stu.maths,
p->stu.english,
p->stu.total);
p=p->next;
}
printf("\n\t\t\t\t---------- 打印完成 ----------\n\n");
}
int SortLinkBubble(Lnode *pHead)
{ //从小到大
int n,i,j;
Lnode *p,*pNext;
n=maxSum;
for(i=0;i<n-1;i++)
{
p=pHead->next;
pNext=p->next;
for(j=0;j<n-i-1;j++)
{ if(p->stu.sno>pNext->stu.sno)
swap(p->stu,pNext->stu);
p=p->next;
pNext=p->next;
}
}
return 0;
}
Lnode* partition(Lnode* begin,Lnode* end) {
if (!begin) return nullptr;
Lnode* slow = begin, *fast = begin->next;
const int pivot = begin->stu.total;
while (fast != end) {
if (fast->stu.total > pivot) {
slow = slow->next;
swap(slow->stu, fast->stu);
}
fast = fast->next;
}
swap(begin->stu, slow->stu);
return slow;
}
void quicksort(Lnode* begin, Lnode* end) {
if (begin != end) {
Lnode* mid = partition(begin, end);
quicksort(begin, mid);
quicksort(mid->next, end);
}
}
void getMaxScore(Lnode *head,int sum)
{
Lnode *p,*q,*r,*m;
int maxc=0,maxmath=0,maxen=0;
p=head->next;
q=r=m=p;
while(p->next)
{
maxc+=p->stu.chinese;maxmath+=p->stu.maths;maxen+=p->stu.english;
if(p->stu.chinese>q->stu.chinese)
q=p;
if(p->stu.maths>r->stu.maths)
r=p;
if(p->stu.english>m->stu.english)
m=p;
p=p->next;
}
printf("\t\t\t语文单科成绩最高的同学是:\n");
printCurrent(q);
printf("\t\t\t数学单科成绩最高的同学是:\n");
printCurrent(r);
printf("\t\t\t英语单科成绩最高的同学是:\n");
printCurrent(m);
printf("\t\t\t语文总分 %d 平均分是 %d \n",maxc,maxc/sum);
printf("\t\t\t数学总分 %d 平均分是 %d \n",maxmath,maxmath/sum);
printf("\t\t\t英语总分 %d 平均分是 %d \n",maxen,maxen/sum);
}
Lnode *bycno()
{
char x[10];int i=0;
fflush(stdin);
gets(x);
printf("\t\t\t----%s班级的学生成绩分析:-----------\n",x);
Lnode *h;
h=(Lnode*)malloc(sizeof(Lnode));
h->next=NULL;
Lnode *pre,*p,*q,*r=h;
pre=Head;
p=pre->next;
while(p)
{
if(strstr(p->stu.clas,x) != NULL)
{
q=(Lnode*)malloc(sizeof(Lnode));
q->stu=p->stu;
r->next=q;
r=q;
i++;
}
pre=p;
p=pre->next;
}
q=(Lnode*)malloc(sizeof(Lnode));
r->next=q;
r=q;
r->next=NULL;
getMaxScore(h,i);
return h;
}
void analysis()
{
int i=0;
char x;
printf("\t---------- 统计分析全年级的同学成绩 ----------\n");
while(1){
printf("--------------请输入想分析的模块:1 全年级成绩 or 2 班级成绩 3年级总分排名-----------\n\t\t\t");
int select;
scanf("%d",&select);
if(select==1)
{
printf("\t\t\t----全年级的学生成绩分析:-----------\n");
getMaxScore(Head,maxSum);
}
else if(select==2)
{
printf("\t\t\t请输入待分析的班级代号:1 2 3(任选一个)\n\t\t\t");
bycno();
}
else if(select==3)
{quicksort(Head->next,NULL);
printAll();
}
printf("\t\t\t是否想继续分析:Y(是)N(否)\n\t\t\t");
fflush(stdin);
scanf("%c",&x);
if(x=='N'){system("cls");return;}
}
}
/***************************************************
函数功能 :读取文件
返回:数据的总个数,首次运行会创建文件并返回-1
***************************************************/
int readData()
{
// 定义个数
int i = 0;
// 1打开文件
if((fp = fopen("C:/Users/lx/Desktop/c课设/test.txt","r")) == NULL)
{
//读取文件失败就创建新文件
fp = fopen("C:/Users/lx/Desktop/c课设/test.txt","w");
return -1;
}
// 2读文件
Lnode *p,*r;
r=Head;
while(!feof(fp))
{
i++;
p=(Lnode*)malloc(sizeof(Lnode));
fscanf(fp,"%d %s %s %s %d %d %d %d",
&p->stu.sno,
p->stu.name,
p->stu.sex,
p->stu.clas,
&p->stu.chinese,
&p->stu.maths,
&p->stu.english,
&p->stu.total);
r->next=p;
r=p;
}
r->next=NULL;
fclose(fp);
return i-1;
}
/***************************************************
写文件:成功返回1,失败返回0
***************************************************/
int writeData()
{
if((fp = fopen("C:/Users/lx/Desktop/c课设/test.txt","w")) == NULL)
{
printf("打开文件失败");
return 0;
}
Lnode *p;
p=Head->next;
while(p->next){
fprintf(fp,"%d %s %s %s %d %d %d %d\n",
p->stu.sno,
p->stu.name,
p->stu.sex,
p->stu.clas,
p->stu.chinese,
p->stu.maths,
p->stu.english,
p->stu.total);
p=p->next;
}
fclose(fp);
return 1;
}
/***************************************************
函数功能:自动生成学号.从1001开始生成,
***************************************************/
int createSno()
{
if(maxSum == 0)
{
return 10001;
}
else
{
return 1003 + maxSum;
}
}
/***************************************************
输出函数
***************************************************/
void printCurrent(Lnode *p)
{
printf("\t|-------------------------------------------------------------------------|\n");
printf("\t|%-10s|%-8s|%-8s|%-8s|%-8s|%-8s|%-8s|%-8s|\n"," 学号"," 姓名","性别","班级","语文成绩","数学成绩","英语成绩"," 总分");
printf("\t|----------+--------+--------+--------+--------+--------+--------+--------|\n");
printf("\t%10d %8s %8s %8s %8d %8d %8d %8d\n",
p->stu.sno,
p->stu.name,
p->stu.sex,
p->stu.clas,
p->stu.chinese,
p->stu.maths,
p->stu.english,
p->stu.total);
printf("\t|-------------------------------------------------------------------------|\n");
}
void welcome()
{
printf("\t\t\t|------------------------------|\n");
pr("\t\t\t|---欢迎使用学生成绩管理系统---|\n");
printf("\t\t\t|------------------------------|\n");
printf("\t\t\t\n");
}
总结
c语言的课程设计大作业,本来是两个星期的时间,但是由于学校的特色月考和期末考,以及各种课设交叉穿梭,还有自己在摸鱼的缘故,导致最后是一天半匆匆忙忙写完改完代码,写完报告。若以后有时间再继续修改完善吧!