当前位置:文档之家› 选课系统课程设计

选课系统课程设计

题目:学生选课系统设计一、需求分析根据所学知识,编写指定题目的C语言程序,并规范地完成课程设计报告。

通过课程设计,加深对《C语言程序设计》和《数据结构》课程所学知识的理解,熟练掌握和巩固C语言的基本知识和语法规范,包括:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);库函数应用等;复杂任务功能分解方法(自顶向下逐步求精、模块化设计、信息隐藏等),熟练掌握和巩固三种基本的数据结构(线性结构、树形结构、图形结构)的逻辑结构、存储结构以及相关运算和应用。

具体要求如下:采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理。

学生也可根据自己对题目的理解增加新的功能模块。

系统以菜单界面方式工作,运行界面友好,演示程序以用户和计算机的对话方式进行。

程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强。

编程风格良好(包括缩进、空行、适当注释、变量名和函数名见名知意,程序容易阅读等);假设某学期共有5门课,每门课程有四项基本信息:课程编号、课程名称、学分和选课人数。

学生可自行选课,假设该学期共有8个学生,学生有学号、姓名、所选课程三种基本信息,学生选课要满足每门课最多只能有3个学生选修,每个学生最多只能选2门课,试设计一个学生选课系统。

学生选课系统要求具备以下功能:1.系统以菜单方式工作2.浏览所有的课程信息3.浏览所有的学生选课情况4.任意学生信息的查询和修改功能5.学生选课功能(学生选课时要判断课程是否已经选满,同时还要判断学生是否已经选了2门课,若学生满足选课条件才能选课,注意同一门课一个学生只能选一次)二、概要设计1.本程序中用到的所有数据类型的定义及含义数据类型:一维数组struct course{ int num;char subject[10];int mark;int count;}cour[5]={{1,"C++",3,0},{2,"MATLAB",3,0},{3,"Math",5,0},{4,"English",4,0},{5,"Chinese",3,0}}; ------------课程信息struct student{ long num;char name[10];char order1[10];char order2[10];}stu[8]={{20074001,"guo","NULL","NULL"}, {20074002,"yu","NULL","NULL"},{20074003,"su","NULL","NULL"},{20074004,"hua","NULL","NULL"},{20074005,"du","NULL","NULL"},{20074006,"su","NULL","NULL"},{20074007,"liu","NULL","NULL"},{20074008,"xu","NULL","NULL"},}; ------------------学生信息其余int, char等数据类型在各模块有不同含义,比较简单,不做赘述。

2.主程序的流程以及各程序模块的功能要求及各自之间的层次(调用)关系a)void scan_1(struct course *p)调用储存课程信息的结构体数组,输出所有课程信息b)void scan_2(struct student *p)调用储存学生信息的结构体数组,输出所有学生信息c)void modify(struct student *p,struct course cour[5])分别调用储存课程信息和学生信息的结构体数组,输出任意一个学生的信息,并可以修改学生信息d)void select(struct student *p,struct course cour[5])分别调用储存课程信息和学生信息的结构体数组,为任意一个学生进行选课e)void menu()菜单函数f)void main()主函数三、详细设计#include "stdio.h"#include "conio.h"#include "string.h"#include "stdlib.h"#include "windows.h"struct course // 定义存储课程信息的结构体{ int num; //课程号char subject[10]; //课程名int mark; //学分int count; //已选人数}cour[5]={{1,"C++",3,0},{2,"MATLAB",3,0},{3,"Math",5,0},{4,"English",4,0},{5,"Chinese",3,0}};void scan_1(struct course *p) //所有课程信息的浏览功能{ system("cls");printf(" 课程信息如下: \n");for(p=cour;p<cour+5;p++)printf("课程号--%d 科目--%7s 学分--%d 已选人数--%d\n\n",p->num,p->subject,p->mark,p->count);}struct student // 定义存储学生信息的结构体{ long num; //学号char name[10]; //姓名char order1[10]; //所选课程1 char order2[10]; //所选课程2}stu[8]={{20074001,"guo","NULL","NULL"}, {20074002,"yu","NULL","NULL"}, //选课为空显示"NULL"{20074003,"su","NULL","NULL"},{20074004,"hua","NULL","NULL"},{20074005,"du","NULL","NULL"},{20074006,"su","NULL","NULL"},{20074007,"liu","NULL","NULL"},{20074008,"xu","NULL","NULL"},};void scan_2(struct student *p) //所有学生信息的浏览功能{ system("cls");printf(" 学生选课情况如下:\n");for(p=stu;p<stu+8;p++)printf("学号--%d 姓名--%3s 课程1--%7s 课程2--%7s\n\n",p->num,p->name,p->order1,p->order2);}void modify(struct student *p,struct course cour[5]) //任意学生信息的查询和修改 { int s;int g;char b;char k[10];long n;long m;int i;int j;char name1[20];system("cls");printf("请输入学号(20074001-20074008):");scanf("%d",&n);for(p=stu;p<stu+8;p++){ if(n==p->num) //找到对应的学生{ system("cls");printf("\n\n\n\n 该学生信息如下\n\n\n");printf(" 学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n",p->num,p->name,p->order1,p->order2);printf("\nA.修改退出请按A a外任意字母键\n"); //不区分大小写scanf("%s",&b);{ if(b=='a'||b=='A'){ printf("\n1.修改学号 2.修改姓名 3.修改所选课程\n");//修改菜单 scanf("%d",&s);{ if(s==1){printf(" \n 学号修改为:\n"); //修改学号scanf("%d",&m);p->num=m;system("cls");printf("\n\n\n\n\n\n 修改后如下:\n");printf(" 学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n",p->num,p->name,p->order1,p->order2);}if(s==2){printf(" \n 姓名修改为:\n"); //修改姓名scanf("%20s",name1);strcpy(p->name,name1);system("cls");printf("\n\n\n\n\n\n 修改后如下:\n\n");printf(" 学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n",p->num,p->name,p->order1,p->order2);}if(s==3){ system("cls");printf("\n输入你想修改的课程:区分大小写\n");scanf("%s",&k); //区分大小写{if (strcmp(p->order1,k)==0){ system("cls");printf("\n1.C++ 2.MATLAB 3.Math 4.English5.Chinese\n");printf("\n你想修改为(1-5):\n");scanf("%d",&g);for(i=0;i<5;i++){ if(g==i+1){ if (cour[g-1].count>=3 ){ system("cls");printf("\n\n 该课程已被选满\n");//课程选满,返回主菜单}else{ if(strcmp(p->order2,cour[g-1].subject)==0) printf("\n\n 你已选过这门课\n\n");//重选,返回主菜单else { strcpy(p->order1,cour[g-1].subject);cour[g-1].count++;for(j=0;j<5;j++){if(strcmp(cour[j].subject,k)==0) //被修改课程的count值1cour[j].count--;}system("cls");printf("\n\n 学生信息:\n\n");printf(" 学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n",p->num,p->name,p->order1,p->order2); } }}}}elseif(strcmp(p->order2,k)==0){ system("cls");printf("\n1.C++ 2.MATLAB 3.Math 4.English 5.Chinese\n");printf("\n你想修改为(1-5):\n");scanf("%d",&g);for(i=0;i<5;i++){ if(g==i+1){ if (cour[g-1].count>=3 )printf("\n\n 该课程已被选满\n\n"); //已选满 else{ if(strcmp(p->order1,cour[g-1].subject)==0)printf("\n\n\n 你已选过这门课\n\n"); //重选 else { strcpy(p->order2,cour[g-1].subject);cour[g-1].count++;for(j=0;j<5;j++){if (strcmp(cour[j].subject,k)==0)cour[j].count--; //被修改课程的count值减1 }system("cls");printf("\n\n 学生信息:\n\n");printf(" 学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n",p->num,p->name,p->order1,p->order2); } }}}}else printf("\n\n您还没选这门课或拼写错误\n\n");}}}}}}}}void select(struct student *p,struct course cour[5]) //学生选课功能{ long n; int a;int b; int t=0;int u=0;int i;system("cls");printf("请输入学号(20074001-20074008):");scanf("%d",&n);for(p=stu;p<stu+8;p++){if(n==p->num) //找到对应学生{system("cls");if(strcmp(p->order1,"NULL")!=0) //第一门课不为空t=1;else{system("cls");printf("\n\n\n\n\n\n 请选您的第一门课提示:您最多只能选二门课 \n\n");printf("\n1.C++ 2.MATLAB 3.Math 4.English5.Chinese\n\n");printf("\n请选第一门课:不选请按1-5外任意数字键返回\n\n");scanf("%d",&a); //输入所选课程编号for(i=0;i<5;i++){ if(a==i+1){ if (cour[a-1].count>=3 ){printf("\n\n 该课程已被选满\n"); //课程选满,返回主菜单}else{ if(strcmp(p->order2,cour[a-1].subject)==0) printf("\n\n\n 你已选过这门课\n"); //重选,返回主菜单else { strcpy(p->order1,cour[a-1].subject); //选课成功cour[a-1].count++;system("cls");printf("\n\n\n\n\n\n 学生信息:\n");printf(" 学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n",p->num,p->name,p->order1,p->order2);}}}}}if(strcmp(p->order2,"NULL")!=0) //第二门课不为空u=1;else{printf("\n\n\n\n\n\n 请选您的第二门课提示:您最多只能选二门课 \n\n");printf("\n1.C++ 2.MATLAB 3.Math 4.English5.Chinese\n\n");printf("\n请选第二门课:不选请按1-5外任意数字键返回\n\n");scanf("%d",&b);for(i=0;i<5;i++){if(b==i+1){if(cour[b-1].count>=3) {printf("\n\n 该课程已被选满\n"); //已选满,返回主菜单}else{ if(strcmp(p->order1,cour[b-1].subject)==0) printf("\n\n\n 你已选过这门课\n"); //重选,返回主菜单else { strcpy(p->order2,cour[b-1].subject);cour[b-1].count++;system("cls");printf("\n\n\n\n\n\n 学生信息:\n"); //成功选课printf(" 学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n",p->num,p->name,p->order1,p->order2);}}}}}if(u==1&&t==1)printf("\n您已选满,若想修改请进入菜单3\n"); //已选满,返回主菜单 }}}void menu() //菜单函数{int n;printf("\t\t *** 欢迎来到选课系统 ****\n\n");printf("\t\t ***菜单 ****\n\n");printf("\t\t *** 1 浏览课程信息 ****\n\n");printf("\t\t *** 2 浏览学生选课情况 ****\n\n");printf("\t\t *** 3 学生信息查询和修改 ****\n\n");printf("\t\t *** 4 学生选课 ****\n\n");printf("\t\t *** 5 退出 ****\n\n");printf("请选择(1-5):[ ]\b\b");scanf("%d",&n);switch(n) //用switch语句,建立菜单{case 1:scan_1(cour);break;case 2:scan_2(stu); break;case 3:modify(stu,cour); break;case 4:select(stu,cour);break;case 5:exit(0);}}void main() //主函数{for(;;){menu(); //调用菜单函数}}四、调试分析1.本试验调试最主要是靠输入的数据,如果输入者按照程序提示的要求输入的话,程序会正常运行,得到准确的数据。

相关主题