|
呵呵,我们这学期的课程设计,作为一个C语言初学者,在这里先献丑了
要求设计一个学生的学分管理程序。
假设每位学生必须完成基础课50学分、专业课50学分、选修课24学分、人文
类课程8学分、实验性课程20学分才能够毕业。因此在管理学分时,要考虑每
个学分所属于的课程类别。
(6) 提供一些统计各类信息的功能。
CODE
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define MUNMAX 5
struct studentInfo{ //结构类型定义
int num;
float basic;
float spe;
float choose;
float peop;
float lib;
};
struct stuType{
studentInfo stu[MUNMAX];
int num;
};
void DisplayMenu();
int choiceItem();
int f(int);
void putone(struct stuType* as,int num);
void sum(struct stuType *p);
void Init(struct stuType*);
void PrintInfo(struct stuType);
void Print_aInfo(struct stuType,int);
void Input_aInfo(struct studentInfo*);
void Input_allInfo(struct stuType*,int num);
int Search(struct stuType);
void modify(struct stuType*);
void main()
{
struct stuType student;
int choice,index,a;
system(\"color 4e\");
Init(&student);
do{
choice=choiceItem();
switch (choice){
case 0:printf(\"\\n再见!\");break;
case 1:Input_allInfo(&student,MUNMAX);break;
case 2:putone(&student,f(a)); break;
case 3rintInfo(student);break;
case 4:modify(&student);break;
case 5:if ((index=Search(student))!=-1)
Print_aInfo(student,index);
else printf(\"\\n不存在这个学生.\");
break;
case 6:Init(&student);break;
case 7:sum(&student);break;
}
}while(choice);
}
void DisplayMenu() //显示菜单
{
COORD coordScreen = { 25, 3 };
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hCon, coordScreen);
printf(\"========= MENU =========\\n\");
printf(\"\\n (1) 通过键盘输入全部学生的学分;\");
printf(\"\\n (2) 通过键盘修改某位学生的学分;\");
printf(\"\\n (3) 显示该班所有学生学分完成情况;\");
printf(\"\\n (4) 全部课程的学分高低进行排序;\");
printf(\"\\n (5) 给定学号,显示该学生学分完成情况;\");
printf(\"\\n (6) 初始化程序;\");
printf(\"\\n (7) 一些统计信息;\");
printf(\"\\n (0) 退出系统;\");
printf(\"\\nchoice,please:\");
}
int choiceItem() //菜单选择
{
int choice;
do{
DisplayMenu();
scanf(\"%d\",&choice);
}while(choice<0||choice>7);
return choice;
}
int f(int a)
{
do
{
printf(\"请输入要修改学生的学号(1-5):\");
scanf(\"%d\",&a);
}while(a-1<0||a-1>4);
return a-1;
}
void Init(struct stuType* s) //初始化
{
s->num=0;
}
void Print_aInfo(struct stuType s,int index) //输出一个学生的信息
{
printf(\"\\n学号:%d\\n基础课学分:%-6.1f\\n专业课学分:%-6.1f\\n选修课学分:%-6.1f\\n人文类课程学分:%-6.1f\\n实验性课程学分:%-6.1f\\n \",s.stu[index].num,s.stu[index].basic,s.stu[index].spe,s.stu[index].choose,s.stu[index].peop,s.stu[index].lib);
}
void PrintInfo(struct stuType s) //输出所有学生的信息
{
if (s.num==0) {
printf(\"\\n无学生信息.\");
return;
}
for (int i=0;i<s.num;i++){
printf(\"\\n学号:%d\\n基础课学分:%-6.1f\\n专业课学分:%-6.1f\\n选修课学分:%-6.1f\\n人文类课程学分:%-6.1f\\n实验性课程学分:%-6.1f\\n \",s.stu.num,s.stu.basic,s.stu.spe,s.stu.choose,s.stu.peop,s.stu.lib);
}
}
void putone(struct stuType* as,int num)//修改一个学生信息
{
Input_aInfo(&as->stu[num]);
}
void Input_aInfo(struct studentInfo* as) //输入一个学生的信息
{
do
{
printf(\"请输入学生的学号:\");
scanf(\"%d\",&as->num);
}while(as->num<1||as->num>5);
printf(\"请输入学生的基础课成绩:\");
scanf(\"%f\",&as->basic);
printf(\"请输入学生的专业课成绩:\");
scanf(\"%f\",&as->spe);
printf(\"请输入学生的选修课成绩:\");
scanf(\"%f\",&as->choose);
printf(\"请输入学生的人文课成绩:\");
scanf(\"%f\",&as->peop);
printf(\"请输入学生的实验课成绩:\");
scanf(\"%f\",&as->lib);
printf(\"\\n\");
}
void Input_allInfo(struct stuType* s,int num) //输入多个学生的信息
{
printf(\"\\n请输入 %d 组信息.\\n\",num);
for (int i=0;i<num;i++){
if (s->num==MUNMAX){
printf(\"\\n已经输入过成绩,不能重复输入,只能按2更改原始数据!\");
break;
}
Input_aInfo(&s->stu[s->num++]);
}
}
int Search(struct stuType stu) //查找
{
int num;
do
{
printf(\"\\n输入学生学号(1-5):\");
scanf(\"%d\",&num);
}while(num<1||num>5);
for (int i=0;i<stu.num;i++)
if (stu.stu.num==num)
return i;
return -1;
}
void modify(struct stuType *p) //排序
{int i,j;float temp;
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
{if(p->stu[j].basic>p->stu[j+1].basic){
temp=p->stu[j].basic;
p->stu[j].basic=p->stu[j+1].basic;
p->stu[j+1].basic=temp;}
if(p->stu[j].spe>p->stu[j+1].spe){
temp=p->stu[j].spe;
p->stu[j].spe=p->stu[j+1].spe;
p->stu[j+1].spe=temp;}
if(p->stu[j].choose>p->stu[j+1].choose){
temp=p->stu[j].choose;
p->stu[j].choose=p->stu[j+1].choose;
p->stu[j+1].choose=temp;}
if(p->stu[j].peop>p->stu[j+1].peop){
temp=p->stu[j].peop;
p->stu[j].peop=p->stu[j+1].peop;
p->stu[j+1].peop=temp;}
if(p->stu[j].lib>p->stu[j+1].lib){
temp=p->stu[j].lib;
p->stu[j].lib=p->stu[j+1].lib;
p->stu[j+1].lib=temp;}
}
printf(\"全部课程成绩的排序结果为:\\n基础课:\");
for(i=0;i<5;i++)
printf(\"%-6.1f\",p->stu.basic);
printf(\"\\n专业课:\");
for(i=0;i<5;i++)
printf(\"%-6.1f\",p->stu.spe);
printf(\"\\n选修课:\");
for(i=0;i<5;i++)
printf(\"%-6.1f\",p->stu.choose);
printf(\"\\n人文课:\");
for(i=0;i<5;i++)
printf(\"%-6.1f\",p->stu.peop);
printf(\"\\n实验课:\");
for(i=0;i<5;i++)
printf(\"%-6.1f\",p->stu.lib);
}
void sum(struct stuType *p)
{int i,b1=0,b2=0,s1=0,s2=0,c1=0,c2=0,p1=0,p2=0,l1=0,l2=0;
for(i=0;i<4;i++)
{if(p->stu.basic>=90.0)
b1++;
if(p->stu.basic<50.0)
b2++;
if(p->stu.spe>=90.0)
s1++;
if(p->stu.spe<50.0)
s2++;
if(p->stu.choose>=90.0)
c1++;
if(p->stu.choose<24.0)
c2++;
if(p->stu.peop>=90.0)
p1++;
if(p->stu.peop<8.0)
p2++;
if(p->stu.lib>=90.0)
l1++;
if(p->stu.lib<20.0)
l2++;
}
printf(\"\\n基础课程90学分以上的有%d个,不及格的有%d个\",b1,b2);
printf(\"\\n专业课程90学分以上的有%d个,不及格的有%d个\",s1,s2);
printf(\"\\n选修课程90学分以上的有%d个,不及格的有%d个\",c1,c2);
printf(\"\\n人文课程90学分以上的有%d个,不及格的有%d个\",p1,p2);
printf(\"\\n实验课程90学分以上的有%d个,不及格的有%d个\",l1,l2);
}
该程序应该主要具有下列功能:
(1) 通过键盘输入某位学生的学分;
(2) 给定学号,显示某位学生的学分完成情况;
(3) 给定某个班级的班号,显示该班所有学生学分完成情况;
(4) 给定某位学生的学号,修改该学生的学分信息;
(5) 按照某类课程的学分高低进行排序;
PS:本来想用点winAPI来改变字幕显示位置的,可是请教了N多人后还是自己悟性差,咋弄都弄不好.同时该程序有不少bug.希望高手给予指出 |
|