📄 3.cpp
字号:
/*主控菜单处理测试程序*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct { //通讯录结点类型
char num[5]; //学号
char name[9]; //姓名
char sex[3]; //性别
float math; //数学
float English; //英语
float chinese; //语文
float computer; //计算机
float sum; //总分
float average;
}datatype;
typedef struct node { //结点类型定义
datatype data; //结点数据定义
struct node * next; //结点指针域
}listnode;
typedef listnode * linklist;
linklist head;
listnode *p;
//函数说明
int menu_select();
linklist createlist(void);
linklist loaddata(void);
listnode *savedata(linklist head);
void insertnode(linklist head,listnode *p);
listnode * listfind(linklist head);
void delnode(linklist head);
void printlist(linklist head);
//主函数
void main()
{printf(" =====制作人:刘莎(06410901048)========\n");
for( ; ; ){
switch (menu_select())
{
case 1:
printf("****************************************\n");
printf("* 学 生 成 绩 管 理 系 统 的 建 立 *\n");
printf("*****************************************\n");
head=createlist();
break;
case 2:
printf(" *********************************\n");
printf(" * 学 生 信 息 的 添 加 *\n");
printf("**********************************\n");
p=(listnode *)malloc(sizeof(listnode)); //申请新结点
printf("学号:");
scanf("%s",p->data.num);
printf("姓名:");
scanf("%s",p->data.name);
printf("性别:");
scanf("%s",p->data.sex);
printf("数学:");
scanf("%f",&p->data.math);
printf("英语:");
scanf("%f",&p->data.English);
printf("语文:");
scanf("%f",&p->data.chinese);
printf("计算机:");
scanf("%f",&p->data.computer);
p->data.sum=p->data.math+p->data.English+p->data.chinese+p->data.computer;
printf("总分:%f\n",p->data.sum);
p->data.average= p->data.sum/4;
printf("平均分:%f\n",p->data.average);
insertnode(head,p);
break;
case 3:
printf(" *****************************\n");
printf(" * 学 生 信 息 的 查 询 *\n");
printf("*****************************\n");
p=listfind(head);
if(p!=NULL) {
printf(" 学号 姓 名 性别 数学 英语 语文 计算机 总分 平均分 \n");
printf("-----------------------------------------------------------------------------------\n");
printf("%s,%s,%s,%f,%f,%f,%f,%f,%f\n",p->data.num,p->data.name,
p->data.sex,p->data.math,p->data.English,p->data.chinese,p->data.computer,p->data.sum,p->data.average);
printf("----------------------------------------------------------------------------------------\n");
}
else
printf("没有查到要查询的学生\n");
break;
case 4:
printf("*****************************\n");
printf(" * 学 生 信 息 的 删 除 *\n");
printf("*****************************\n");
delnode(head);
break;
case 5:
printf(" ******************************\n");
printf(" *学 生 信 息 的 输 出 *\n");
printf(" ******************************\n");
printlist(head);
break;
case 6:
printf(" *数 据 保 存 中 ...*\n");
head=savedata(head);
break;
case 7:
printf(" * 数 据 读 取 中 ...*\n");
head=loaddata();
break;
case 0:
printf("\t 再见\n");
return;}
}
}
/*菜单选择函数程序*/
int menu_select()
{
int sn;
printf(" ----------------------------------\n");
printf(" * 欢迎进入 *\n");
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(" * 0.退出管理系统 * \n");
printf(" ==================================\n");
printf(" 请选择0-7: ");
for( ; ; )
{
scanf("%d",&sn);
if(sn<0 || sn>7)
printf("\n\t 输出错误,重选 0-7:");
else
break;
}
return sn;
}
/*用尾插法建立学生链表函数*/
linklist createlist(void)
{//尾插法建立带头结点的学生链表算法
linklist head=(listnode *)malloc(sizeof(listnode)); //申请头结点
listnode *p,*rear;
int flag=0; //结束标志置0
rear=head; //尾指针初始指向头结点
while(flag==0)
{ p=(listnode *)malloc(sizeof(listnode)); //申请新结点
printf("学号:");
scanf("%s",p->data.num);
printf("姓名:");
scanf("%s",p->data.name);
printf("性别:");
scanf("%s",p->data.sex);
printf("数学:");
scanf("%f",&p->data.math);
printf("英语:");
scanf("%f",&p->data.English);
printf("语文:");
scanf("%f",&p->data.chinese);
printf("计算机:");
scanf("%f",&p->data.computer);
p->data.sum=p->data.math+p->data.English+p->data.chinese+p->data.computer;
printf("总分:%f\n",p->data.sum);
p->data.average= p->data.sum/4;
printf("平均分:%f\n",p->data.average);
rear->next=p; //新结点连接到尾结点之后
rear=p; //尾结点指向新结点
printf("结束建表吗?(1/0):");
scanf("%d",&flag); //读入一个标志数据
}
rear->next=NULL; //终端结点指针域置空
return head; //返回链表头指针
}
void insertnode(linklist head,listnode *p)
{
listnode *p1,*p2;
p1=head;
p2=p1->next;
while(p2!=NULL && strcmp(p2->data.num,p->data.num)<0)
{
p1=p2; //p1指向刚访问过的结点
p2=p2->next; //p2指向表的下一个结点
}
p1->next=p; //插入p所指向的结点
p->next=p2;
}
listnode * listfind(linklist head)
{ //有序链表上的查找
listnode *p;
char num[5];
char name[9];
int xz;
printf("==========================\n");
printf("1.按学号查询\n");
printf("2.按姓名查询\n");
printf("==========================\n");
printf("请选择 :\n");
p=head->next; //假定带头结点
scanf("%d",&xz);
if(xz==1){
printf("请输入要查找的学号:");
scanf("%s",num);
while(p && strcmp(p->data.num,num)<0)
p=p->next;
if(p==NULL || strcmp(p->data.num,num)>0)
p=NULL; //没有查到要查找的学生信息
}
else
if(xz==2){
printf("请输入要查找的姓名:");
scanf("%s",name);
while(p && strcmp(p->data.name,name)!=0)
p=p->next;
}
return p;
}
/*学生信息的删除*/
void delnode(linklist head)
{
char jx;
listnode *p,*q;
p=listfind(head); //调用查找函数
if(p==NULL){
printf("没有查到要删除的学生!\n");
return;
}
printf("真的要删除吗?(y/n) : ");
scanf("%s",&jx);
if(jx=='y' || jx=='Y') {
q=head;
while(q!=NULL && q->next!=p)
q=q->next;
q->next=p->next; //删除结点
free(p); //释放被删除的结点空间
printf("学生信息已被删除 \n");
}
}
/*学生信息的输出*/
void printlist(linklist head)
{
listnode *p;
p=head->next; //因为链表带头结点,使p指向链表开始结点
printf("学号 姓 名 性别 数学 英语 语文 计算机 总分 平均分 \n");
printf("----------------------------------------------------------------------\n");
while(p!=NULL)
{
printf("%s,%s,%s,%f,%f,%f,%f,%f,%f\n",p->data.num,p->data.name,
p->data.sex,p->data.math,p->data.English,p->data.chinese,
p->data.computer,p->data.sum,p->data.average);
printf("---------------------------------------------------------------------\n");
p=p->next;
}
}
/*****************************/
/* 读取纪录 */
/*****************************/
linklist loaddata(void)
{
FILE *fp;
int count=0;
listnode *p,*rear;
linklist head=(listnode *)malloc(sizeof(listnode));/* 申请结点 */
int flag=0; /* 结束标志置0*/
if((fp=fopen("D:\\student.txt","r"))==NULL)
{
printf("\t数据读取失败!!\n\n");
return NULL;
}
rear=head;
p=(listnode *)malloc(sizeof(listnode));
p->next=NULL;
while(fscanf(fp,"%s,%s,%s,%f,%f,%f,%f,%f,%f\n",p->data.num,p->data.name,
p->data.sex,p->data.math,p->data.English,p->data.chinese,
p->data.computer,p->data.sum,p->data.average)!=EOF)
{
rear->next=p;rear=rear->next;flag=1;count++;
p=(listnode *)malloc(sizeof(listnode));
p->next=NULL;
}
fclose(fp);
printf("共读取 %d 条数据纪录\n\n",count);
if(flag==1) return head;
}
/********************************/
/* 保存纪录 */
/********************************/
listnode *savedata(linklist head)
{
FILE *fp;
listnode *p;
int flag=0;
int count=0;
p=head->next;
if((fp=fopen("D:\\student.txt","wb"))==NULL)
{
printf("\t文件打开失败!!\n\n");
return NULL;
}
while(p!=NULL)
{
fprintf(fp,"%s\n%s\n%s\n%f\n%f\n%f\n%f\n%f\n%f\n",p->data.num,p->data.name,
p->data.sex,p->data.math,p->data.English,p->data.chinese,
p->data.computer,p->data.sum,p->data.average);
p=p->next; count++;
}
fclose(fp);
if(flag==1) return head;
printf("\t共存入 %d 条数据纪录\n\n",count);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -