学生选修系统---优快云博客

本文详细介绍了如何使用C语言开发一个学生选修系统,涵盖了系统设计、关键代码实现及遇到的问题和解决方案,适合初学者进阶学习。
								学生选修系统
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;
}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值