/*********************************
*主题:学生选修课程系统设计
*
*设计要求:
*1.添加功能:程序能够任意添加课程和学生记录,可提供选择界面供用户选择所需要添加的类别,要求编号要唯一,如果添加了重复编号的记录是,则提示数据添加重复并取消添加。
*2.查询功能:可根据编号、姓名等信息对已添加的同学和课程记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。
*3.显示功能:可显示当前系统中所有学生和课程的记录,每条记录占据一行。
*4.编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。
*5.删除功能:主要实现对已添加的学生和课程记录进行删除。如果当前系统中没有对应的记录,则提示“记录为空!”并返回操作。
*6.统计功能:能根据多种参数进行统计。能统计学生人数、课程门数、选修某门课程的学生的相关信息。
*
*********************************/
/*
* Verson:2.0(basic)
*
* History: 完成课程信息的录入,查询等操作;完成选课功能(2017-05-05 20:30:00-01:20:00)
*
* Author:universes
*
*
*********************************/
/*
* Verson:1.9
*
* History:完成了学生信息的查询操作 (2017-05-04 22:00:32-01:11:00)
*
* Author:universes
*
*
********************************/
/*
* Verson:1.5
*
* HIstory2:添加查重功能 (2017-05-02 23:39:19-01:06:05)
* History1:完成了用户对课程和学生信息的添加操作(没有查重功能)(2017-05-02 22:06:13-23:39:19)
*
* Author:universes
*
*
********************************/
/*
* Verson:1.0
*
* History:完成了用户的选择功能框架(2017-04-19 22:06:13-22:40:47)
*
* Author:universes
*
*
********************************/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h> #define SIZE_STU 10
#define SIZE_COU 10
#define SIZE_SEL 10
//////////////函数声明部分
void home(void);
void stu_operate(void);
void cou_operate(void);
void statistic(void);
void choose(void);
void delete_sel(int);
//--学生信息部分:
void input_stu(void);
void search_stu(void);
void search_stu_id(void);
void search_stu_name(void);
void show_stu(void);
void edit_stu(void);
void renew_stu(void);
void delete_stu(void);
//--课程信息部分:
void input_cou(void);
void search_cou(void);
void search_cou_id(void);
void search_cou_name(void);
void show_cou(void);
void edit_cou(void);
void renew_cou(void);
void delete_cou(void); /*学生信息结构体*/
struct student_info {
char stu_ID[];
char stu_name[];
char sex[];
char age[];
char collage[];
char grade[];
char contact[];
}stu[SIZE_STU]; /*课程信息结构体*/
struct course_info {
char course_ID[];
char course_name[];
char property[];
char period[];
char credit[];
char time[];
int people;
}cou[SIZE_COU]; /*选课记录结构体*/
struct select {
int s;//存放学生信息的数组下标
int c;//存放课程信息的数组下标
}sel[SIZE_SEL]; //全局变量i,j,x分别是学生,课程,选课信息数组下标
int i = -;
int j = -;
int x = -; int main(void){
//进入欢迎界面
home();
return ;
} //欢迎界面
void home(void) {
printf("\n-------------------------欢迎进入选课系统!----------------------");
int h;
printf("\n\n 请选择你要进行的操作:");
printf("\n\n 1.学生操作");
printf("\n 2.课程操作");
printf("\n 3.开始选课");
printf("\n 4.选课统计");
printf("\n 5.退出系统");
printf("\n ");
printf("\n 请输入:");
scanf("%d",&h);
system("cls");
switch(h){
case :
stu_operate();
break;
case :
cou_operate();
break;
case :
choose();
break;
case :
statistic();
break;
default:
system("cls");
printf("BYE!");
break;
}
}
/*开始选课*/
void choose(void){
char stu_id[],cou_id[];
printf("\n-------------------------欢迎进入选课系统!----------------------");
//输入选课学生信息
printf("\n\n 请输入选课人学号:");
fflush(stdin);
scanf("%s",stu_id);
int h,flag = ;
for(h = ;h <= i;h++){
if(strcmp(stu[h].stu_ID,stu_id)==){
flag = ;
break;
} else {
flag = ;
}
}
if(flag||i==-){
printf("\n 不存在此学号\n");
system("pause");
system("cls");
home();
}
//录入姓名信息
x++;
sel[x].s = h;
//输入课程信息
printf("\n\n 请输入选修课程号:");
fflush(stdin);
scanf("%s",cou_id);
flag = ;
for(h = ;h <= j;h++){
if(strcmp(cou[h].course_ID,cou_id)==){
flag = ;
break;
} else {
flag = ;
}
}
if(flag||j==-){
printf("\n 不存在此课程号\n");
x--;
system("pause");
system("cls");
home();
}
//录入课程信息
sel[x].c = h;
cou[h].people++;
printf("\n 录入成功!\n");
system("pause");
system("cls");
home();
}
/*删除选课记录*/
void delete_sel(int q){//删除第q+1条记录
/*注意!本函数没有将x减1,请在函数外手动减1(考虑外层函数循环的需要)*/
int h;
cou[sel[q].c].people--;
for(h = q;q < x;h++){
q++;
sel[h].c = sel[q].c;
sel[h].s = sel[q].s;
} }
//对学生记录进行操作
void stu_operate(void) {
printf("\n-------------------------欢迎进入选课系统!----------------------");
printf("\n\n 请选择你要对学生记录进行的操作:");
printf("\n\n 1.添加");
printf("\n 2.查询");
printf("\n 3.显示");
printf("\n 4.返回主页面");
printf("\n ");
printf("\n 请输入:");
int i;
scanf("%d",&i);
system("cls");
switch(i){
case ://添加学生信息
input_stu();
break;
case ://查询学生信息
search_stu();
break;
case ://显示所有学生信息
show_stu();
break;
case :
home();
break;
}
}
//对课程记录进行操作
void cou_operate(void) {
printf("\n-------------------------欢迎进入选课系统!----------------------");
printf("\n\n 请选择你要对课程记录进行的操作:");
printf("\n\n 1.添加");
printf("\n 2.查询");
printf("\n 3.显示");
printf("\n 4.返回主页面");
printf("\n ");
printf("\n 请输入:");
int i;
scanf("%d",&i);
system("cls");
switch(i){
case :
input_cou();
break;
case :
search_cou();
break;
case :
show_cou();
case :
home();
break;
}
}
//选课信息统计记录
void statistic(void){
printf("\n-------------------------欢迎进入选课系统!----------------------");
printf("\n\n 共有学生信息:%d 条",i+);
printf("\n 共有课程信息:%d 条",j+);
if(x == -){
printf("\n 选课记录:0 条");
printf("\n\n ");
system("pause");
system("cls");
home();
} else {
printf("\n\n 选课记录 %d 条:",x+);
int m;
for(m = ;m <= x;m++){
printf("\n ================");
printf("\n 第%d条",m+);
printf("\n 学生学号:%s",stu[sel[m].s].stu_ID);
printf("\n 学生姓名:%s",stu[sel[m].s].stu_name);
printf("\n 课程号:%s",cou[sel[m].c].course_ID);
printf("\n 课程名:%s",cou[sel[m].c].course_name);
}
printf("\n\n ");
system("pause");
system("cls");
home();
} } //--------------------------------------学生信息插入--------------------------------------
void input_stu(void){
char flag;
FILE * fp;
//--判断文件是否为空
fp = fopen("student.txt","r+");
flag = fgetc(fp);
if(flag==EOF){
fprintf(fp,"学号\t姓名\t性别\t年龄\t系别\t班级\t联系方式\n");
}
fclose(fp);
//--
fp = fopen("student.txt","a+");
if(fp == NULL){
printf("打开文件失败!");
system("cls");
stu_operate();
}
printf("学号\t姓名\t性别\t年龄\t系别\t班级\t联系方式\n");
while(){
i++;
scanf("%s %s %s %s %s %s %s",&stu[i].stu_ID,&stu[i].stu_name,&stu[i].sex,&stu[i].age,&stu[i].collage,&stu[i].grade,&stu[i].contact);
//--数据查重
int h;
for(h = ;h < i;h++){
if(i == ) break;//第一条数据不需要查重
if (strcmp(stu[h].stu_ID,stu[i].stu_ID)==) {
printf("该学号已存在,请重新输入!\n");
scanf("\n%s %s %s %s %s %s %s",&stu[i].stu_ID,&stu[i].stu_name,&stu[i].sex,&stu[i].age,&stu[i].collage,&stu[i].grade,&stu[i].contact);
h = -;
}
}
//--
fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\n",stu[i].stu_ID,stu[i].stu_name,stu[i].sex,stu[i].age,stu[i].collage,stu[i].grade,stu[i].contact);
printf("\n录入成功,继续录入输入y,返回上一级请按任意键:");
fflush(stdin);
scanf("%c",&flag);
fclose(fp);
if(flag!='y'&&'Y') break;
fp = fopen("student.txt","a");
}
renew_stu();
system("cls");
stu_operate();
}
/*查询学生信息*/
void search_stu(void){
system("cls");
printf("\n请选择查询方式:");
printf("\n 1.学号查询");
printf("\n 2.姓名查询");
printf("\n请选择:");
int h;
scanf(" %d",&h);
switch(h){
case :
search_stu_id();
break;
case :
search_stu_name();
break; }
}
/*学号查询*/
void search_stu_id(void){
system("cls");
char id[];
printf("\n输入学生的学号:");
fflush(stdin);
scanf("%s",id);
int h;
for(h = ;h <= i;h++){
if(strcmp(stu[h].stu_ID,id)==){
system("cls");
printf("查找成功!");
printf("\n\n\t学号\t姓名\t性别\t年龄\t系别\t班级\t联系方式");
printf("\n\t-----------------------------------------------------------------");
printf("\n\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",stu[h].stu_ID,stu[h].stu_name,stu[h].sex,stu[h].age,stu[h].collage,stu[h].grade,stu[h].contact);
system("pause");
system("cls");
stu_operate();
}
}
system("cls");
printf("没有此学号!\n");
system("pause");
system("cls");
stu_operate();
}
/*姓名查询*/
void search_stu_name(void){
system("cls");
char name[];
printf("\n输入学生的姓名:");
fflush(stdin);
scanf("%s",name);
int h;
for(h = ;h <= i;h++){
if(strcmp(stu[h].stu_name,name)==){
system("cls");
printf("查找成功!");
printf("\n\n\t学号\t姓名\t性别\t年龄\t系别\t班级\t联系方式");
printf("\n\t---------------------------------------------------------");
printf("\n\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",stu[h].stu_ID,stu[h].stu_name,stu[h].sex,stu[h].age,stu[h].collage,stu[h].grade,stu[h].contact);
system("pause");
system("cls");
stu_operate();
}
}
system("cls");
printf("没有此姓名!");
system("pause");
system("cls");
stu_operate();
}
/*显示所有学生信息*/
void show_stu(void){
int h;
if(i == -){
printf("\n还没有录入信息!\n");
system("pause");
system("cls");
stu_operate();
}
system("cls");
printf("\n\n\t学号\t姓名\t性别\t年龄\t系别\t班级\t联系方式");
printf("\n\t---------------------------------------------------------");
for(h = ;h <= i;h++){
printf("\n\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",stu[h].stu_ID,stu[h].stu_name,stu[h].sex,stu[h].age,stu[h].collage,stu[h].grade,stu[h].contact);
}
//
fflush(stdin);
printf("\n\t1.修改");
printf("\n\t2.删除");
printf("\n\t3.返回");
printf("\n\n 选择要进行的操作:");
int flag;
fflush(stdin);
scanf("%d",&flag);
switch(flag){
case :
edit_stu();
break;
case :
delete_stu();
break;
default:
system("cls");
stu_operate();
break; }
}
/*编辑学生信息*/
void edit_stu(void){
printf("\n输入需要编辑的学生的学号:");
char id[];
getchar();
scanf("%s",id);
int h;
for(h = ;h <= i;h++){
if(strcmp(stu[h].stu_ID,id)==){//找到需要编辑的行
system("cls");
printf("\n\n\t学号\t姓名\t性别\t年龄\t系别\t班级\t联系方式");
printf("\n\t---------------------------------------------------------");
printf("\n\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",stu[h].stu_ID,stu[h].stu_name,stu[h].sex,stu[h].age,stu[h].collage,stu[h].grade,stu[h].contact);
printf("\n这是修改前的数据,请依次输入修改值:\n\t");
fflush(stdin);
scanf("%s %s %s %s %s %s %s",&stu[h].stu_ID,&stu[h].stu_name,&stu[h].sex,&stu[h].age,&stu[h].collage,&stu[h].grade,&stu[h].contact);
int k;
for(k = ;k <= i;k++){
if(strcmp(stu[k].stu_ID,stu[h].stu_ID)==){
if(k==h){
continue;
} else {//学号不唯一
printf("\n此学号已存在!重新输入学号:");
fflush(stdin);
scanf("%s",&stu[h].stu_ID);
k = -;
}
}
}
/*将修改信息写入文件*/
//思想:将原文件重新写入一遍
renew_stu();
system("cls");
printf("修改成功!\n");
system("pause");
system("cls");
stu_operate();
}
}
printf("\n此学号不存在!\n");
system("pause");
system("cls");
stu_operate();
}
/*删除学生信息*/
void delete_stu(void){
printf("\n输入需要编辑的学生的学号:");
char id[];
getchar();
scanf("%s",id);
int h;
for(h = ;h <= i;h++){
if(strcmp(stu[h].stu_ID,id)==){//找到需要编辑的行
system("cls");
//检查他/她是否选课了
int a;
for(a = ;a <= x;a++){
if(h==sel[a].s){//选课了则将对应课程记录减1,以及选课数组减1
delete_sel(a);
a = -;
x--;
continue;
}
}
//如果只有一条记录
if(i==){
i = -;
renew_stu();
printf("修改成功!\n");
system("pause");
system("cls");
stu_operate();
} int k;
for(k = h+;k <= i;k++,h++){//将数组直接向前移动
strcpy(stu[h].stu_ID,stu[k].stu_ID);
strcpy(stu[h].stu_name,stu[k].stu_name);
strcpy(stu[h].sex,stu[k].sex);
strcpy(stu[h].grade,stu[k].grade);
strcpy(stu[h].contact,stu[k].contact);
strcpy(stu[h].collage,stu[k].collage);
strcpy(stu[h].age,stu[k].age);
}
/*将修改信息写入文件*/
//思想:将原文件重新写入一遍
renew_stu();
i--;
system("cls");
printf("修改成功!\n");
system("pause");
system("cls");
stu_operate();
}
}
printf("\n此学号不存在!\n");
system("pause");
system("cls");
stu_operate();
}
//--------------------------------------课程信息插入--------------------------------------
void input_cou(void){
char flag;
FILE * fp;
//--判断文件是否为空
fp = fopen("course.txt","r+");
flag = fgetc(fp);
if(flag==EOF){
fprintf(fp,"代码\t名称\t性质\t总学时\t学分\t开课学期\t选修人数\n");
}
fclose(fp);
//--
fp = fopen("course.txt","a+");
if(fp == NULL){
printf("打开文件失败!");
system("cls");
cou_operate();
}
printf("代码\t名称\t性质\t总学时\t学分\t开课学期\n");
while(){
j++;
scanf("%s %s %s %s %s %s",&cou[j].course_ID,&cou[j].course_name,&cou[j].property,&cou[j].period,&cou[j].credit,&cou[j].time);
//--数据查重
int h;
for(h = ;h < j;h++){
if(j == ) break;//第一条数据不需要查重
if (strcmp(cou[h].course_ID,cou[j].course_ID)==) {
printf("该课程号已存在,请重新输入!\n");
scanf("\n%s %s %s %s %s %s",&cou[j].course_ID,&cou[j].course_name,&cou[j].property,&cou[j].period,&cou[j].credit,&cou[j].time);
h = -;
}
}
//--
fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t\t%d\n",cou[j].course_ID,cou[j].course_name,cou[j].property,cou[j].period,cou[j].credit,cou[j].time,cou[j].people);
printf("\n录入成功,继续录入输入y,返回上一级请按任意键:");
fflush(stdin);
scanf("%c",&flag);
fclose(fp);
if(flag!='y'&&'Y') break;
fp = fopen("course.txt","a");
}
renew_cou();
system("cls");
cou_operate();
}
/*查询课程信息*/
void search_cou(void){
system("cls");
printf("\n请选择查询方式:");
printf("\n 1.课程号查询");
printf("\n 2.课程名查询");
printf("\n请选择:");
int h;
scanf(" %d",&h);
switch(h){
case :
search_cou_id();
break;
case :
search_cou_name();
break; }
}
/*课程号查询*/
void search_cou_id(void){
system("cls");
char id[];
printf("\n输入课程号:");
fflush(stdin);
scanf("%s",id);
int h;
for(h = ;h <= j;h++){
if(strcmp(cou[h].course_ID,id)==){
system("cls");
printf("查找成功!");
printf("\n\n\t代码\t名称\t性质\t总学时\t学分\t开课学期\t选修人数");
printf("\n\t-----------------------------------------------------------------");
printf("\n\t%s\t%s\t%s\t%s\t%s\t%s\t\t%d\n",cou[h].course_ID,cou[h].course_name,cou[h].property,cou[h].period,cou[h].credit,cou[h].time,cou[h].people);
system("pause");
system("cls");
cou_operate();
}
}
system("cls");
printf("没有此课程号!\n");
system("pause");
system("cls");
cou_operate();
}
/*课程名查询*/
void search_cou_name(void){
system("cls");
char name[];
printf("\n输入课程名:");
fflush(stdin);
scanf("%s",name);
int h;
for(h = ;h <= j;h++){
if(strcmp(cou[h].course_name,name)==){
system("cls");
printf("查找成功!");
printf("\n\n\t代码\t名称\t性质\t总学时\t学分\t开课学期\t选修人数");
printf("\n\t---------------------------------------------------------");
printf("\n\t%s\t%s\t%s\t%s\t%s\t%s\t\t%d\n",cou[h].course_ID,cou[h].course_name,cou[h].property,cou[h].period,cou[h].credit,cou[h].time,cou[h].people);
system("pause");
system("cls");
cou_operate();
}
}
system("cls");
printf("没有此课程名!");
system("pause");
system("cls");
cou_operate();
}
/*显示所有课程信息*/
void show_cou(void){
int h;
if(j == -){
printf("\n还没有录入信息!\n");
system("pause");
system("cls");
cou_operate();
}
system("cls");
printf("\n\n\t代码\t名称\t性质\t总学时\t学分\t开课学期\t选修人数");
printf("\n\t-------------------------------------------------------------");
for(h = ;h <= j;h++){
printf("\n\t%s\t%s\t%s\t%s\t%s\t%s\t\t%d\n",cou[h].course_ID,cou[h].course_name,cou[h].property,cou[h].period,cou[h].credit,cou[h].time,cou[h].people);
}
//
fflush(stdin);
printf("\n\t1.修改");
printf("\n\t2.删除");
printf("\n\t3.返回");
printf("\n\n 选择要进行的操作:");
int flag;
fflush(stdin);
scanf("%d",&flag);
switch(flag){
case :
edit_cou();
break;
case :
delete_cou();
break;
default:
system("cls");
cou_operate();
break; }
}
/*编辑课程信息*/
void edit_cou(void){
printf("\n输入需要编辑的课程号:");
char id[];
getchar();
scanf("%s",id);
int h;
for(h = ;h <= j;h++){
if(strcmp(cou[h].course_ID,id)==){//找到需要编辑的行
system("cls");
printf("\n\n\t代码\t名称\t性质\t总学时\t学分\t开课学期");
printf("\n\t-------------------------------------------------------------");
printf("\n\t%s\t%s\t%s\t%s\t%s\t%s\n",cou[h].course_ID,cou[h].course_name,cou[h].property,cou[h].period,cou[h].credit,cou[h].time);
printf("\n这是修改前的数据,请依次输入修改值:\n\t");
fflush(stdin);
scanf("%s %s %s %s %s %s",&cou[h].course_ID,&cou[h].course_name,&cou[h].property,&cou[h].period,&cou[h].credit,&cou[h].time);
int k;
for(k = ;k <= j;k++){
if(strcmp(cou[k].course_ID,cou[h].course_ID)==){
if(k==h){
continue;
} else {//课程号不唯一
printf("\n此课程号已存在,重新输入:");
fflush(stdin);
scanf("%s",&cou[h].course_ID);
k = -;
}
}
}
/*将修改信息写入文件*/
//思想:将原文件重新写入一遍
renew_cou();
system("cls");
printf("修改成功!\n");
system("pause");
system("cls");
cou_operate();
}
}
printf("\n此课程号不存在!\n");
system("pause");
system("cls");
cou_operate();
}
/*删除课程信息*/
void delete_cou(void){
printf("\n输入需要编辑的课程号:");
char id[];
getchar();
scanf("%s",id);
int h;
for(h = ;h <= j;h++){
if(strcmp(cou[h].course_ID,id)==){//找到需要编辑的行
system("cls");
//如果只有一条记录
if(j==){
j = -;
renew_cou();
printf("修改成功!\n");
system("pause");
system("cls");
cou_operate();
}
//查看是否有人选课
if(cou[h].people!=){//有人选课时
int a;
for(a = ;a <= x;a++){
if(sel[a].c == h){
delete_sel(a);
a = -;
x--;
continue;
}
}
}
int k;
for(k = h+;k <= j;k++,h++){//将数组直接向前移动
strcpy(cou[h].course_ID,cou[k].course_ID);
strcpy(cou[h].course_name,cou[k].course_name);
strcpy(cou[h].property,cou[k].property);
strcpy(cou[h].period,cou[k].period);
strcpy(cou[h].credit,cou[k].credit);
strcpy(cou[h].time,cou[k].time);
}
/*将修改信息写入文件*/
//思想:将原文件重新写入一遍
renew_cou();
j--;
system("cls");
printf("修改成功!\n");
system("pause");
system("cls");
cou_operate();
}
}
printf("\n此课程号不存在!\n");
system("pause");
system("cls");
cou_operate();
} //--功能函数
/*更新系统数据至文件*/
void renew_stu(void){
FILE * fp;
fp = fopen("student.txt","w+");
if(fp == NULL){
printf("\n打开文件失败,无法保存至文件。\n");
fclose(fp);
return ;
}
fprintf(fp,"学号\t姓名\t性别\t年龄\t系别\t班级\t联系方式\n");
if(i == -){
fclose(fp);
return;
}
int h;
for(h = ;h <= i;h++){
fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\n",stu[h].stu_ID,stu[h].stu_name,stu[h].sex,stu[h].age,stu[h].collage,stu[h].grade,stu[h].contact);
}
fclose(fp); }
void renew_cou(void){
FILE * fp;
fp = fopen("course.txt","w+");
if(fp == NULL){
printf("\n打开文件失败,无法保存至文件。\n");
fclose(fp);
return ;
}
fprintf(fp,"代码\t名称\t性质\t总学时\t学分\t开课学期\t选修人数\n");
if(j == -){
fclose(fp);
return;
}
int h;
for(h = ;h <= j;h++){
fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t\t%s\n",cou[h].course_ID,cou[h].course_name,cou[h].property,cou[h].period,cou[h].credit,cou[h].time,cou[h].people); }
fclose(fp); }

第一次发博客,挺激动的。写的是学生选课系统,也算是自己的第二个小项目,第一个是算术表达式,不怕丢人哈哈,写的过程中都是非常艰难,经常写到一半就写不下去了,因为一开始的构思就是错误的。当然,也谈不上什么构思,就是简单的想了一下大体的方向。所以到后面越来越难做,只好重新修改一遍。包括这次也是如此。以后这方面要小心,一定要先认真的构思一下。也有一部分原因是好久没有写c了,好几个月了,结构体和指针的一些知识都还给老师了,所以这次也算是边写边学了吧,哈哈~

我编程的时间不长,所以这里面肯定有一些错误,或者存在更好的解决方案,欢迎上课!谢谢!

ps:寻找一起学习的小伙伴!

04-28 00:54