学生选修系统
1、需求分析
系统以菜单方式工作,因而要提供键盘式选择菜单以实现功能选择;由于课程 信息要用文件保存,因而要提供文件的输入输出操作;由于要浏览信息,所以要提供显示功能;要实现查询功能,故要提供查找操作。
2、总体设计
整个系统可以设计为信息输入模块、信息查询模块以及信息浏览模块。
3、详细设计
数据结构采用结构体,这里采用课程信息结构体和学生选课信息结构体。
Struct
{
Char courseCode[10]; //课程编号
Char courseName[20]; //课程名称
Char courseType[10]; //课程类别
Int totalPeriod; //总学时
Int classPeriod; //授课学时
Int experiPeriod; //上机学时
Float creditHour; //学分
Int term; //开课学期
}; //课程信息结构体
Struct
{
Int stuNo; //学号;
Char courseCode[10]; //课程编号
}; //学生选课信息结构体
(1) 信息输入模块
从键盘输入课程信息和学生信息,写入文件。
(2)信息浏览模块
分屏显示课程信息,每屏10条课程记录,按任意键继续。从文件中读数据,然 后再显示。
(3)选课模块
学生查询课程信息并选课,将选课信息存入文件。
(4)信息查询模块
通过菜单选择查询字段,可以按照课程编号、课程名称、课程性质、开课学 期、学分对课程信息文件进行查找,查找算法可以选择基本查找、二分查找等算 法。
可以通过菜单选择课程编号,在学生选课信息文件中查询该课程学生选修情况。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 20
#define N 100
int x;
void menu()
{
int n,w=1;
void lesson_information();
void student_information();
void course();
void courseNO();
void credit();
void l_choice_num();
while(w){
puts("\t\t\t\t\tMENU\n\n");
puts("\t\t\t\t 1.课程信息录入");
puts("\t\t\t\t 2.学生选课信息录入");
puts("\t\t\t\t 3.课程信息浏览");
puts("\t\t\t\t 4.按课程号查询");
puts("\t\t\t\t 5.按学分查询");
puts("\t\t\t\t 6.某门课程学生选修情况");
puts("\t\t\t\t 7.退出");
printf("Choice your number(1-7):[ ]\b\b");
scanf("%d",&n);
if(n<1||n>7)
{
w=1;
getchar();
}
else w=0;
}
switch(n){
case 1:lesson_information();break;//课程信息录入
case 2:student_information();break;//学生选课信息录入
case 3:course();break;//课程信息浏览
case 4:courseNO();break;//按课程号查询
case 5:credit();break;//按学分查询
case 6:l_choice_num();//某门课程学生选修情况
case 7:exit(0);//退出
}
}
void main()
{
menu();
}
struct lesson
{
int num; //课程编号
char name[20]; //课程名称
char kind[10]; //课程性质
int stime; //总学时
int ttime; //授课学时
int etime; //实验或上机学时
int score; //学分
int term; //开课学期
int choice_num; //选修该课的学生人数
}les[M];
struct student
{
int number; //学号
int num[20]; //课程编号
}stu[N];
void printf_one(int i) //公共函数2:显示一个课程信息记录
{
printf("\n\t%d %s %s %d %d %d %d %d\n ",les[i].num,les[i].name,les[i].kind,les[i].stime,les[i].ttime,les[i].etime,les[i].score,les[i].term);
}
void l_input(int i){
scanf("%d",&les[i].num);
scanf("%s",&les[i].name);
scanf("%s",&les[i].kind);
scanf("%d",&les[i].stime);
scanf("%d",&les[i].ttime);
scanf("%d",&les[i].etime);
scanf("%d",&les[i].score);
scanf("%d",&les[i].term);
}
l_save(int n) //保存课程信息到文件函数
{
FILE *fp;
int i;
if((fp=fopen("lesrecord.txt","wb"))==NULL)
{
printf("\n Fail to open file!\n");
return NULL;
}
for(i=0;i<n;i++)
fprintf(fp,"%d %s %s %d %d %d %d %d\n ",les[i].num,les[i].name,les[i].kind,les[i].stime,les[i].ttime,les[i].etime,les[i].score,les[i].term);
fclose(fp);
}
void lesson_information() //课程信息录入函数
{
int i,m,k,w1;
printf("总共多少门课(0-%d)?",M-1);
scanf("%d",&m);
printf("\n\tnumber name kind stime etime ttime score term\n");
for(i=0;i<m;i++)
{
printf("\n 请输入第%d条课程信息\n",i+1);
l_input(i);
}
if(i!=0)l_save(m);
printf("请选择下一步操作:<1>返回继续录入课程信息 <2>回到主菜单 <3>退出程序[ ]\b\b");
scanf("%d",&k);
if(k<1||k>3)
{
w1=1;
getchar();
}
else w1=0;
while(w1==1);
switch(k)
{
case 1:lesson_information();break;
case 2:menu();break;
case 3:break;
}
}
//课程信息浏览模块
void course()//课程信息浏览函数
{ int k,w1;
int load_lesson();
void printf_n(int n);
x=load_lesson();//从文件读入课程信息
printf_n(x);//显示课程信息
printf("请选择下一步操作:<1>回到主菜单 <2>退出程序[ ]\b\b");
scanf("%d",&k);
if(k<1||k>2)
{
w1=1;
getchar();
}
else w1=0;
while(w1==1);
switch(k)
{
case 1:menu();break;
case 2:break;
}
}
int load_lesson() //加载课程信息记录并可以计算记录个数
{FILE*fp;
int i;
if((fp=fopen("lesrecord.txt","r"))==NULL)
{ printf("\ncannot open file\n");
return 0;
}
for(i=0;!feof(fp);i++)
fscanf(fp,"%d %s %s %d %d %d %d %d ",&les[i].num,&les[i].name,&les[i].kind,&les[i].stime,&les[i].ttime,&les[i].etime,&les[i].score,&les[i].term);
fclose(fp);
return (i);
}
void printf_n(int x)//显示所有课程信息记录
{
int j;
printf("\n\tnumber name kind stime etime ttime score term\n");
for(j=0;j<x;j++)
{if(j%10==0)
{printf("\n\npass any key to continue>...");
getchar();
puts("\n\n");
}
printf_one(j);
}getchar();
}
void student_information() //学生选课信息录入函数
{
void s_input(int i);
int i,n,k,w1;
x=load_lesson();
printf("\n 总共有多少学生(0-%d)?:",N-1);
scanf("%d",&n);
for(i=0;i<n;i++)
{ printf("\n 请输入第%d个学生学号:\n",i+1);
s_input(i);
}
printf("请选择下一步操作: <1>返回继续录入选课信息 <2>回到主菜单 <3>退出程序[ ]\b\b");
scanf("%d",&k);
if(k<1||k>3)
{
w1=1;
getchar();
}
else w1=0;
while(w1==1);
switch(k)
{
case 1:student_information();break;
case 2:menu();break;
case 3:break;
}
}
void s_input(int i) //输入一个记录到函数
{
int j,k,m,n,w1,total=0;
scanf("%d",&stu[i].number);
printf("\n你想选多少门课[ ]\b\b");
scanf("%d",&m);
printf("现在输入课程编号,依次用空格隔开!\n");
for(j=0;j<m;j++)
{
scanf("%d",&stu[i].num[j]);
for(k=0;k<x;k++)
if(les[k].num==stu[i].num[j])
{total+=les[k].score;
les[k].choice_num++;
}
}
if(total<60)
{
printf("警告:你所选课程总学分不到60!请选择下一步操作:<1>返回重新录入选课信息 <2>回到主菜单 <3>退出程序[ ]\b\b");
scanf("%d",&n);
if(n<1||n>3)
{
w1=1;
getchar();
}
else w1=0;
while(w1==1);
switch(n)
{
case 1:{printf("请重新输入你的学号:");
s_input(i);};break;
case 2:menu();break;
case 3:break;
}
}
}
void courseNO()
{
int i,k,flag=0,w1;
struct lesson s;
printf("\n\n输入你要查询的课程编号:");
scanf("%d",&s.num);
load_lesson();
printf("\n\tnumber name kind stime etime ttime score term\n");
for(i=0;i<x;i++)
if(s.num==les[i].num)
{flag=1;
printf_one(i);
}
if(flag==1)
printf("Found!");
else
printf("Not found!");
printf("请选择下一步操作: <1>返回继续查找课程信息 <2>回到主菜单 <3>退出程序[ ]\b\b");
scanf("%d",&k);
if(k<1||k>3)
{
w1=1;
getchar();
}
else w1=0;
while(w1==1);
switch(k)
{
case 1:courseNO();break;
case 2:menu();break;
case 3:break;
}
}
void credit()
{
int i,k,flag=0,w1;
int mark;
printf("\n\n输入你要查询的课程学分:");
scanf("%d",&mark);
load_lesson();
printf("\n\tnumber name kind stime etime ttime score term\n");
for(i=0;i<x;i++)
if(mark==les[i].score)
{flag=1;
printf_one(i);
}
if(flag==1)
printf("Found!");
else
printf("Not found!");
printf("请选择下一步操作:<1>返回继续查找课程信息 <2>回到主菜单 <3>退出程序[ ]\b\b");
scanf("%d",&k);
if(k<1||k>3)
{
w1=1;
getchar();
}
else w1=0;
while(w1==1);
switch(k)
{
case 1:credit();break;
case 2:menu();break;
case 3:break;
}
}
void l_choice_num()
{
int i,k,flag=0,w1;
struct lesson s;
printf("\n\n输入你要查询的课程编号:");
scanf("%d",&s.num);
x=load_lesson();
for(i=0;i<x;i++)
if(s.num==les[i].num)
{flag=1;
printf("选修这门课的总人数为:%d\n",les[i].choice_num);
}
if(flag==1)
printf("Found!");
else
printf("Not found!");
printf("请选择下一步操作:<1>返回继续查找课程信息 <2>回到主菜单 <3>退出程序[ ]\b\b");
scanf("%d",&k);
if(k<1||k>3)
{
w1=1;
getchar();
}
else w1=0;
while(w1==1);
switch(k)
{
case 1:l_choice_num();break;
case 2:menu();break;
case 3:break;
}
}
学生选修系统---优快云博客
最新推荐文章于 2022-08-25 11:55:15 发布
本文详细介绍了如何使用C语言开发一个学生选修系统,涵盖了系统设计、关键代码实现及遇到的问题和解决方案,适合初学者进阶学习。
3816

被折叠的 条评论
为什么被折叠?



