课程信息管理系统

馋奶兔 提交于 2020-01-27 13:21:22

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");
 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!