C语言编程题:学分管理程序

【题目描述】
请设计一个学生的学分管理程序。
假设每位学生必须完成基础课50学分、专业课50学分、选修课24学分、人文类课程8学分、实验性课程20学分才能够毕业。因此在管理学分时,要考虑每个学分所属于的课程类别。
该程序应该具有下列功能:
(1) 通过键盘输入某位学生的学分;
(2) 给定学号,显示某位学生的学分完成情况;
(3) 给定某个班级的班号,显示该班所有学生学分完成情况;
(4) 给定某位学生的学号,修改该学生的学分信息;
(5) 按照某类课程的学分高低进行排序;
(6) 提供一些统计各类信息的功能。

【题目要求】
(1) 按照分析、设计、编码、调试和测试的软件开发过程完成这个应用程序;
(2) 学分信息应该包括学号、姓名、课程类别、学分等;
(3) 为各项操作功能设计一个菜单。应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。

【输入要求】
应用程序运行后,在屏幕上显示一个菜单(菜单显示外观见前面的图示)。用户可以根据需求,选定相应的操作项目。进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。

【输出要求】
(1) 应用程序运行后,要在屏幕上显示一个菜单;
(2) 要求用户输入数据时,要给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等。

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#define null '\0'
int shoudsave=0;

struct student /*声明一个结构体类型struct student*/
{
char clas[20]; /*定义成员班级号*/
char name[20]; /*定义成员学生姓名*/
char classnum[20]; /*定义成员学生学号*/
float basis; /*定义成员基础学分*/
float major; /*定义成员专业学分*/
float elective; /*定义成员选修学分*/
float humanity; /*定义成员人文学分*/
float laboratory; /*定义成员实验学分*/
float sum; /*定义成员学分总和*/
float average; /*定义成员平均学分*/
};

typedef struct node /*声明一个节点类型struct node*/
{
struct student data; /*定义节点数据*/
struct node *next; /*定义节点指针*/
}Node,*Link;

void menu1() /*输出系统名称及简介*/
{
printf("\n 学生学分管理系统 \n");
printf("********************************************************************************");
printf("说明:本系统旨在帮助师生方便,快捷地统计,管理学分。您可以进行输入,修改,查看,排序等操作,界面清爽,操作简单,欢迎您的使用。\n");
printf("********************************************************************************");
}//menu1

void menu2() /*输出主菜单*/
{
printf(" 菜 单 \n");
printf("\t\t0:退出本次登入\t\t\t5:清除屏幕内容\n");
printf("\t\t1:输入学生信息\t\t\t6:修改学生学分\n");
printf("\t\t2:删除学生信息\t\t\t7:显示学生学分\n");
printf("\t\t3:查询学生学分\t\t\t8:统计学生信息\n");
printf("\t\t4:排序学生学分\t\t\t9:保存学生学分\n");
}//menu2

void menu3() /*输出排序菜单,供void sort(Link l)函数调用*/
{
printf("\n\t\tA:基础学分\t\t\tB:专业学分\n");
printf("\t\tC:选修学分\t\t\tD:人文学分\n");
printf("\t\tE:实验学分\t\t\tF:学分总和\n");
printf("\t\tG:平均学分\t\t\t\n");
printf("\n请选则您要排序的课程代码:");
}//menu3

void menu4() /*输出菜单上下限制符*/
{
printf("================================================================================");
}//menu4

void title() /*输出显示菜单,供void display(Link l)函数调用*/
{
printf(" 班级\t学号\t姓名\t基础\t专业\t选修\t人文\t试验\t总分\t平均\n");
}//title

void data(Node *p,char find[]) /*输出按姓名查找的结果,供void search(Link l)函数调用*/
{
if(strcmp(p->data.name,find)==0)
printf(" %s\t %s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",p->data.clas,p->data.classnum,p->data.name,p->data.basis,p->data.major,p->data.elective,p->data.humanity,p->data.laboratory,p->data.sum,p->data.average);
}//data

void data1(Node *p) /*输出按学号查找的结果,供void search(Link l)函数调用*/
{
printf(" %s\t %s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",p->data.clas,p->data.classnum,p->data.name,p->data.basis,p->data.major,p->data.elective,p->data.humanity,p->data.laboratory,p->data.sum,p->data.average);
}//data1

void data2(Node *p,char find[]) /*输出按班级查找的结果,供void search(Link l)函数调用*/
{
if(strcmp(p->data.clas,find)==0)
printf(" %s\t %s\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",p->data.clas,p->data.classnum,p->data.name,p->data.basis,p->data.major,p->data.elective,p->data.humanity,p->data.laboratory,p->data.sum,p->data.average);
}//data2

Node* Locate(Link l,char find[],char match[]) /*查找匹配函数定义,该函数用于定位链表中符合要求的节点,并返回该指针*/
{
Node *r; /*定义节点指针r*/
if(strcmp(match,"classnum")==0) /*按学号查询*/
{
r=l->next; /*初始化r,指向第一个节点*/
while(r!=NULL) /*r非空*/
{
if(strcmp(r->data.classnum,find)==0) /*查询成功*/
return r;
r=r->next; /*节点后移*/
} //while
} //if
else if(strcmp(match,"name")==0) /*按姓名查询*/
{
r=l->next; /*初始化r,指向第一个节点*/
while(r!=NULL) /*r非空*/
{
if(strcmp(r->data.name,find)==0) /*查询成功*/
return r;
r=r->next; /*节点后移*/
} //while
} //else if
else if(strcmp(match,"clas")==0) /*按班级号查询*/
{
r=l->next; /*初始化r,指向第一个节点*/
while(r!=NULL) /*r非空*/
{
if(strcmp(r->data.clas,find)==0) /*查询成功*/
return r;
r=r->next; /*节点后移*/
}//while
}//else if
return 0;
}//Locate

void input(Link l) /*输入函数定义,用于增加学生信息*/
{
char clas[10];
Node *r,*p; /*定义节点r和p*/
r=l; /*将r指向头结点*/
while(r->next!=NULL)
r=r->next; /*将指针置于最末尾*/
while(l)
{
printf("\n友情提示:输入'#'返回上一菜单\n");
printf("\n输入学生的班级号:");
scanf("%s",clas);
if(strcmp(clas,"#")==0)
break;
p=(Node *)malloc(sizeof(Node)); /*生成新的节点*/
strcpy(p->data.clas,clas); /*将clas字符串复制到p->data.clas中*/
printf("输入学生的学 号:");
scanf("%s",&p->data.classnum);
getchar();
printf("输入学生的姓 名:");
scanf("%s",&p->data.name);
getchar();
printf("输入学生的基础分:");
scanf("%3.1f",&p->data.basis);
getchar();
printf("输入学生的专业分:");
scanf("%3.1f",&p->data.major);
getchar();
printf("输入学生的选修分:");
scanf("%3.1f",&p->data.elective);
getchar();
printf("输入学生的人文分:");
scanf("%3.1f",&p->data.humanity);
getchar();
printf("输入学生的实验分:");
scanf("%3.1f",&p->data.laboratory);
getchar();
p->data.sum=p->data.basis+p->data.major+p->data.elective+p->data.humanity+p->data.laboratory; /*计算学分总和*/
p->data.average=p->data.sum/5; /*计算平均学分*/
p->next=NULL; /*p节点的下一个节点为空*/
r->next=p; /*节点前移*/
r=p;
}//while
}//input

void delet(Link l) /*删除函数定义*/
{
char find[10];
Node *p,*r; /*定义节点r和p*/
if(!l->next) /*删除位置不合理*/
{ printf("\n\a对不起,无信息可删除!");
printf("\n");
return;
}//if
printf("\n请输入要删除学生的学号:");
scanf("%s",find);
p=Locate(l,find,"classnum");
if(p)
{ r=l; /*r指向头结点*/
while(r->next!=p) /*r的下一个节点不是p,一直循环*/
r=r->next; /*顺指针向后查找,直到r指向p的前一个节点*/
r->next=p->next; /*删除节点p*/
free(p); /*释放节点p*/
printf("\n\a系统提示:信息删除成功!\n");
shoudsave=1; /*保存资料*/
}//if
else
{ printf("\n\a对不起,无信息可删除!");
printf("\n");
}//else
}//delet

void search(Link l) /*查询函数定义*/
{
char temp; /*定义单字符temp*/
char find[10]; /*定义字符串find[]*/
Node *p; /*定义节点p*/
if(!l->next)
{
printf("\n\a对不起,无信息可查询!");
printf("\n");
return;
}//if
printf("\n\t\t1:按学号查询\t 2:按姓名查询\t 3:按班级查询\n");
printf("\n请输入您要查询的方式:");
scanf("%s",&temp);
if(temp!='1' && temp!='2' && temp!='3')
printf("\n\a\a系统提示:您输入错误!\n");
else if(temp=='1')
{
printf("\n请输入要查询的学号:");
scanf("%s",find);
p=Locate(l,find,"classnum"); /*按学号进行查找匹配*/
}//else if
else if(temp=='2')
{
printf("\n请输入要查询的姓名:");
scanf("%s",find);
p=Locate(l,find,"name"); /*按名字进行查找匹配*/
}//else if
else if(temp=='3')
{
printf("\n请输入您要查询的班级:");
scanf("%s",find);
p=Locate(l,find,"clas"); /*按班级号进行查找匹配*/
}//else if
if(p)
{
printf("\n ==============>查询结果<==============\n");
menu4();
title();
if(temp=='1')
data1(p); /*输出按学号查找的结果*/
else if(temp=='2')
while(p)
{
data(p,find); /*输出按名字查找的结果*/
p=p->next; /*节点后移*/
}//while
else if(temp=='3')
while(p)
{
data2(p,find); /*输出按班级号查找的结果*/
p=p->next; /*节点后移*/
}//while
menu4();
}//if
else
{
printf("\n\a对不起,无信息可查询!");
printf("\n");
}//else
}//search

Link sortH(Link l,char ch) /*分类排序函数定义*/
{
Node *p,*q,*wei,*s,*p1; /*定义节点p,q,wei,s,p1*/
wei=NULL; /*将尾节点置空*/
char temp;
temp=ch;
if(!l->next)
{
printf("\n\a对不起,无信息可排序!");
printf("\n");
return 0;
}//if
while(l->next!=wei)
{
p=l;
q=p->next;
while(q->next!=wei)
{
if(temp=='A') /*按基础学分由高到低进行排序*/
{
if(p->next->data.basis<q->next->data.basis)
{
s=q->next;
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=s;
}//if
}//if
else if(temp=='B') /*按专业学分由高到低进行排序*/
{
if(p->next->data.major<q->next->data.major)
{
s=q->next;
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=s;
}//if
}//else if
else if(temp=='C') /*按选修学分由高到低进行排序*/
{
if(p->next->data.elective<q->next->data.elective)
{
s=q->next;
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=s;
}//if
}//else if
else if(temp=='D') /*按人文学分由高到低进行排序*/
{
if(p->next->data.humanity<q->next->data.humanity)
{
s=q->next;
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=s;
}//if
}//else if
else if(temp=='E') /*按实验学分由高到低进行排序*/
{
if(p->next->data.laboratory<q->next->data.laboratory)
{
s=q->next;
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=s;
}//if
}//else if
else if(temp=='F') /*按学分总和由高到低进行排序*/
{ if(p->next->data.sum<q->next->data.sum)
{
s=q->next;
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=s;
}//if
}//else if
else if(temp=='G') /*按平均学分由高到低进行排序*/
{
if(p->next->data.average<q->next->data.average)
{
s=q->next;
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=s;
}//if
}//else if
p=p->next;
q=q->next;
}//while
wei=q;
}//while
p1=l->next;
printf("\n ==============>排序结果<==============\n");
menu4();
if(temp=='A') /*输出按基础学分排序的结果*/
{ printf("\t\t\t班级\t学号\t姓名\t基础学分\n");
while(p1)
{
printf("\n\t\t\t %s\t %s\t%s\t %3.1f",p1->data.clas,p1->data.classnum,p1->data.name,p1->data.basis);
p1=p1->next;
}//while
}//if
if(temp=='B') /*输出按专业学分排序的结果*/
{
printf("\t\t\t班级\t学号\t姓名\t专业学分\n");
while(p1)
{
printf("\n\t\t\t %s\t %s\t%s\t %3.1f",p1->data.clas,p1->data.classnum,p1->data.name,p1->data.major);
p1=p1->next;
}//while
}//if
if(temp=='C') /*输出按选修学分排序的结果*/
{
printf("\t\t\t班级\t学号\t姓名\t选修学分\n");
while(p1)
{
printf("\n\t\t\t %s\t %s\t%s\t %3.1f",p1->data.clas,p1->data.classnum,p1->data.name,p1->data.elective);
p1=p1->next;
}//while
}//if
if(temp=='D') /*输出按人文学分排序的结果*/
{
printf("\t\t\t班级\t学号\t姓名\t人文学分\n");
while(p1)
{
printf("\n\t\t\t %s\t %s\t%s\t %3.1f",p1->data.clas,p1->data.classnum,p1->data.name,p1->data.humanity);
p1=p1->next;
}//while
}//if
if(temp=='E') /*输出按实验学分排序的结果*/
{
printf("\t\t\t班级\t学号\t姓名\t实验学分\n");
while(p1)
{
printf("\n\t\t\t %s\t %s\t%s\t %3.1f",p1->data.clas,p1->data.classnum,p1->data.name,p1->data.laboratory);
p1=p1->next;
}//while
}//if
if(temp=='F') /*输出按学分总和排序的结果*/
{
printf("\t\t\t班级\t学号\t姓名\t学分总和\n");
while(p1)
{
printf("\n\t\t\t %s\t %s\t%s\t %3.1f",p1->data.clas,p1->data.classnum,p1->data.name,p1->data.sum);
p1=p1->next;
}//while
}//if
if(temp=='G') /*输出按平均学分排序的结果*/
{
printf("\t\t\t班级\t学号\t姓名\t平均学分\n");
while(p1)
{
printf("\n\t\t\t %s\t %s\t%s\t %3.1f",p1->data.clas,p1->data.classnum,p1->data.name,p1->data.average);
p1=p1->next;
}//while
}//if
printf("\n");
menu4();
printf("\n");
return l;
}//sortH

void sort(Link l) /*排序函数定义*/
{
menu3();
char temp;
scanf("%s",&temp);
switch(temp) /*对要排序的类别进行选择*/
{
case 'A':sortH(l,'A');break;
case 'B':sortH(l,'B');break;
case 'C':sortH(l,'C');break;
case 'D':sortH(l,'D');break;
case 'E':sortH(l,'E');break;
case 'F':sortH(l,'F');break;
case 'G':sortH(l,'G');break;
default:printf("\n\a\a系统提示:您输入错误!\n");getchar();break;
}//switch
}//sort

void modify(Link l) /*修改函数定义*/
{
char temp;
char find[10];
Node *p; /*定义节点p*/
if(!l->next)
{
printf("\n\a\a对不起,无信息可修改!");
printf("\n");
return;
}//if
printf("\n\t\t1:按学号修改\t 2:按姓名修改\n");
printf("\n请输入您要修改的方式:");
scanf("%s",&temp);
if(temp!='1'&&temp!='2')
{
printf("\n\a\a系统提示:您输入错误!\n");
return;
}//if
else if(temp=='1') /*按学号修改*/
{
printf("请输入要修改的学号:");
scanf("%s",find);
p=Locate(l,find,"classnum"); /*按学号查找匹配*/
}//else if
没有空间了 邮箱给我 发你邮箱去
温馨提示:答案为网友推荐,仅供参考
相似回答