C语言程序设计–课程信息管理系统
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 50 //定义一个足够大容量的课程号和名称字符数
#define N 255 //最大的课程数目
//01定义课程信息结构体
struct course
{
char num[LEN+1]; //课程号
char name[LEN+1]; //课程名称
char department[LEN+1]; //课程系别
char nature[LEN+1]; //课程性质
float score; //课程学分
}subject[N];
int k=1,n,m; //k在后面起到调用主菜单函数的作用,n为课程的总数目,m为课程的最大数目
//函数声明
void read(); //刷新
void menu(); //主菜单
void input(); //使用帮助
void show(); //课程信息显示
void find(); //课程信息查找
void remove(); //课程信息删除
void amend(); //课程信息修改
void sort(); //课程信息排序
void save(); //课程信息保存
//通过前面定义了一个k变量,达到调用后面的菜单menu函数
int main ()
{
while(k)
{
menu();
}
system("pause");
return 0;
}
//02对 系统使用帮助 功能进行实现
void help()
{
printf("欢迎使用系统帮助\n");
printf("1.按照菜单提示键输入想要实现的功能的数字代号;\n");
printf("2.增加学生信息后,记得保存;\n");
printf("谢谢您使用系统帮助!\n");
}
//03对 课程信息排序 功能进行实现(根据课程号大小排序)
void sort()
{
int i,j;
char temp[LEN+1]; //temp数组通过在两个课程号之间的数据交换作为中间变量
float *p,*q,s; //效果同上
for(i=0;i<n-1;i++)
{
for(j=n-1;j>i;j--)
{
if(strcmp(subject[j-1].num,subject[j].num)>0) //从第一个课程与倒数第二个课程的课程号进行比较,然后从第二个课程与倒数第三个课程的课程号进行比较......以此类推进行排序
{
strcpy(temp,subject[j-1].num); //
strcpy(subject[j-1].num,subject[j].num); //这三行使得课程号大的排序在后面
strcpy(subject[j].num,temp); //
strcpy(temp,subject[j-1].name); //
strcpy(subject[j-1].name,subject[j].num); //这三行使得对应的课程名字随课程号变动而变动
strcpy(subject[j].name,temp); //
strcpy(temp,subject[j-1].department); //
strcpy(subject[j-1].department,subject[j].department); //这三行使得对应的课程系别随课程号变动而变动
strcpy(subject[j].department,temp); //
strcpy(temp,subject[j-1].nature); //
strcpy(subject[j-1].nature,subject[j].nature); //这三行使得对应的课程性质随课程号变动而变动
strcpy(subject[j].nature,temp); //
p=&subject[j-1].score; //
q=&subject[j].score; //
s=*q; //这五行使得对应的课程所占学分通过指针来随课程号变动而变动
*q=*p; //
*p=s; //
}
}
}
}
//04对 课程信息录入 功能进行实现
void input()
{
int i=n,j,flag;
printf("请输入要增加的课程数目:\n");
scanf("%d",&m);
if(m>0)
{
do //运用do-while循环结构,因为其特点是无论是否符合条件都会进行一次循环,从而判断并告知使用者输入的课程号是否已存在,如果存在则重新输入,不存在则继续后续程序
{
flag=1;
while(flag)
{
flag=0;
printf("请输入第%d门课程的课程号:\n",i+1);
scanf("%s",subject[i].num);
for(j=0;j<i;j++)
{
if(strcmp(subject[i].num,subject[j].num)==0)
{
printf("该课程号已存在!");
flag=1;
break;
}
}
}
printf("请输入第%d门课程的名称:\n",i+1);
scanf("%s",subject[i].name);
printf("请输入第%d门课程的系别:\n",i+1);
scanf("%s",subject[i].department);
printf("请输入第%d门课程的性质:\n",i+1);
scanf("%s",subject[i].nature);
printf("请输入第%d门课程所占的学分:\n",i+1);
scanf("%f",&subject[i].score);
if(0==flag)
{
i++;
}
}
while(i<n+m);
n+=m; //及时更新总课程数目
printf("新课程信息增加完毕!\n\n");
sort(); //在录入时就调用03 void sort函数对课程进行排序
system("pause");
}
}
//05对 新增课程信息的保存 功能进行实现
void save()
{
char filename[LEN+1];
FILE *fp; //定义一个FILE结构体变量,fp称为指向一个文件的指针
int i=0;
printf("请输入课程信息将要保存的文件名:\n");
scanf("%s",filename);
fp=fopen(filename,"w"); //
for(i=0;i<n;i++)
{
fprintf(fp,"%s\t %s\t %s\t %s\t %.1f\n",subject[i].num,subject[i].name,subject[i].department,subject[i].nature,subject[i].score); //fprintf给定的格式输出到fp所指定的文件中
}
printf("保存成功!\n");
fclose(fp);
system("pause");
}
//06课程信息的修改
void amend()
{
int i=0,item,e= -1;
char s1[LEN+1],s2[LEN+1],s3[LEN+1],s4[LEN+1];
float score1,temp;
printf("请输入要修改的课程的课程号:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
{
if(strcmp(subject[i].num,s1)==0)
{
e=i;
}
}
if(e!=-1)
{
printf("1.修改课程名\n");
printf("2.修改课程系别\n");
printf("3.修改课程性质\n");
printf("4.修改课程所占学分\n");
printf("5.退出本菜单\n");
while(1)
{
printf("请选择子菜单编号:");
scanf("%d",&item);
switch(item) //根据switch-case语句实现对定向课程信息的修改
{
case 1:
printf("请输入新的课程名:\n");
scanf("%s",&s4);
strcpy(subject[e].name,s4);break;
case 2:
printf("请输入新的课程系别:\n");
scanf("%s",&s2);
strcpy(subject[e].department,s2);break;
case 3:
printf("请输入新的课程性质:\n");
scanf("%s",&s3);
strcpy(subject[e].nature,s3);break;
case 4:
printf("请输入新的课程所占学分:\n");
scanf("%f",score1);
temp=score1;
score1=subject[e].score;
subject[e].score=temp;break;
case 5:return;
default:printf("请在1-5之间选择\n");
}
}
printf("修改成功!");
}
else
{
printf("该课程号不存在!\n");
system("pause");
}
}
//07对 课程信息的刷新 功能进行实现
void read()
{
char filename[LEN+1];
FILE *p;
int i=0;
printf("请输入课程信息保存的文件名:\n");
scanf("%s",filename);
if((p=fopen(filename,"r"))==NULL)
{
printf("打开%s失败!",filename);
printf("请先选择主菜单1输入学生信息并保存");
system("pause");
return;
}
while(fscanf(p,"%s %s %s %s %f\n",subject[i].num,subject[i].name,subject[i].department,subject[i].nature,subject[i].score)==5)
{
i++;
}
n=i;
if(0==1)
{
printf("文件为空");
}
else
{
printf("读入完成\n");
fclose(p);
system("pause");
}
}
//08课程信息查找
void find()
{
int i,item,flag;
char s1[50]; //通过s1的与课程号,课程名称分别比较大小实现查找到想要的课程信息
printf("-------1.按课程号查询-----------\n");
printf("-------2.按课程名称查询---------\n");
printf("-------3.退出本菜单-------------\n");
while(1)
{
printf("请选择子菜单编号:");
scanf("%d",&item);
flag=0;
switch(item)
{
case 1:
printf("请输入要查询的课程的课程号:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
{
if(strcmp(subject[i].num,s1)==0)
{
flag=1;
printf("课程号 课程名称 系别 性质 学分\n");
printf("-------------------------------------------\n");
printf("%5s %5s %5s %5s %10.1f\n",subject[i].num,subject[i].name,subject[i].department,subject[i].nature,subject[i].score);
}
}
if(0==flag)
{
printf("该课程号不存在!\n");
break;
}
case 2:
printf("请输入要查询的课程的名称:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
{
if(strcmp(subject[i].name,s1)==0)
{
flag=1;
printf("课程号 课程名称 系别 性质 学分\n");
printf("-------------------------------------------\n");
printf("%5s %5s %5s %5s %10.1f\n",subject[i].num,subject[i].name,subject[i].department,subject[i].nature,subject[i].score);
}
}
if(0==flag)
{
printf("该课程名称不存在!\n");
break;
}
case 3:
return;
default:
printf("请在1-3之间选择\n");
}
}
}
//09对 课程信息显示 功能进行实现
void show()
{
int i;
printf("共有%d门课程的信息:\n",n);
if(0!=n)
{
printf("课程号 课程名称 系别 性质 学分\n");
printf("-------------------------------------------\n");
for(i=0;i<n;i++)
{
printf("%5s %5s %5s %5s %10.1f\n",subject[i].num,subject[i].name,subject[i].department,subject[i].nature,subject[i].score);
}
}
system("pause");
}
//对 课程信息删除 功能进行实现
void remove()
{
int i,j,flag=0;
char s1[LEN+1];
printf("请选择要删除的课程的课程名:\n");
scanf("%s",s1);
for(i=0;i<n;i++)
{
if(strcmp(subject[i].name,s1)==0)
{
flag=1;
for(j=i;j<n-1;j++)
subject[j]=subject[j+1];
}
}
if(0==flag)
{
printf("该课程不存在!\n");
}
if(1==flag)
{
printf("删除成功,显示结果请选择菜单\n");
n--;
}
system("pause");
}
//00设计好初始界面函数
void menu()
{
int x;
printf(" 课程信息管理系统 \n");
printf(" 设计者:新能源1901 魏浩 \n");
printf(" 指导老师:曹桂红 \n");
printf(" |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| \n");
printf(" | 请选择功能 | \n");
printf(" | 系统使用帮助:0 | \n");
printf(" | 课程信息录入:1 | \n");
printf(" | 课程信息显示:2 | \n");
printf(" | 课程信息查找:3 | \n");
printf(" | 课程信息删除:4 | \n");
printf(" | 课程信息修改:5 | \n");
printf(" | 课程信息排序:6 | \n");
printf(" | 课程信息保存:7 | \n");
printf(" | 课程信息刷新:8 | \n");
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \n");
printf("请选择想要实现的功能:");
scanf("%d",&x);
//使用 switch-case语句 开始对功能进行选择
switch (x)
{
case 0:help();break; //帮助
case 1:input();break; //录入
case 2:show();break; //显示
case 3:find();break; //查找
case 4:remove();break; //删除
case 5:amend();break; //修改
case 6:sort();break; //排序
case 7:save();break; //保存
case 8:read();break; //刷新
default:
printf("选择错误:请在0-8之间选择\n");
来源:CSDN
作者:qq_45818573
链接:https://blog.csdn.net/qq_45818573/article/details/104091579