⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 051150008.cpp

📁 C语言编写的课程设计是一个师生管理系统的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include<dos.h>          /*dos接口函数*/
#include<stdio.h>        /*I/O函数*/
#include<string.h>       /*字符串函数*/
#define N 66             /*控制学生记录的容量*/
struct student           /*定义结构体数组用于缓存数据*/
{char num[11];           /*学号*/
 char name[20];          /*姓名*/
 int score[3];           /*成绩分数*/
 float ave;
}stu[N];
/*全新保存函数*/
save(int n)              /*保存函数,保存n个记录*/
{FILE *fp;
 int i;
 if((fp=fopen("score.txt","wb"))==NULL)    /*以输出打开方式,在此前的记录被覆盖*/
  {printf("\nCannot open file\n");
   return NULL;
  }
 for(i=0;i<n;i++)
   if(stu[i].ave!=0)                        /*stu[i].ave=0表此记录已删除*/
     if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
       printf("file write error\n");
 fclose(fp);
}
/*加载记录或可以计算记录个数的函数*/
load()                                      /*加载记录或可以计算记录个数的函数*/
{FILE *fp;
 int i;
 if((fp=fopen("score.txt","rb"))==NULL)     /*以输出打开方式,在此前的记录被覆盖*/
  {printf("\nCannot open file\n");
   return NULL;
  }
 for(i=0;!feof(fp);i++)
  fread(&stu[i],sizeof(struct student),1,fp);
 fclose(fp);
 return(i-1);                               /*返回记录个数*/
}
/*一个任务结束时的选择浏览还是返回的函数*/
void printf_back()                          /*一个任务结束时的选择浏览还是返回*/
{int k,w;
 printf("\n\n\tSuccessful. ^_^\n\n");
 printf("What do you want to do? \n\n\t1).Browse all now\t2).Back:  [ ]\b\b");
 scanf("%d",&w);
 if(w==1) browse();
 else menu();
}
/*显示数据结构项目函数*/
void printf_face()                          /*显示数据结构项目*/
{printf("\n\tNO.  name                score1   score2   score3  average\n");
}
average(int i)                              /*对第i个记录的分数求平均值*/
{int j,sum;
 for(sum=0,j=0;j<3;j++)
   sum+=stu[i].score[j];
 stu[i].ave=sum/3.0;
}
/*学号输入函数*/
no_input(int i,int n)                       /*i表示第i个的学生信息,n表示比较到第n个学生*/
{int j,k,w1;
  do
  {w1=0;
   printf("NO.:");
   scanf("%s",stu[i].num);
   for(j=0;stu[i].num[j]!='\0';j++)          /*学号输入函数,作了严格规定*/
     if(stu[i].num[j]<'0'||stu[i].num[j]>'9')     /*判断学号是否为数字*/
       {puts("Input error! Only be made up of (0-9).Please reinput!\n");
        w1=1;break;
       }
   if(w1!=1)
    for(k=0;k<n;k++)                         /*比较到第n个学生*/
      /*排除第i个学生记录即你要修改的*/
      if(k!=i&&strcmp(stu[k].num,stu[i].num)==0)    /*判断学号是否有雷同*/
       {puts("This record is exist. please reinput!\n");
        w1=1;break;
       }
  }
  while(w1==1);
}
/*对分数输入*/
score_input(int i)
{int j;
 for(j=0;j<3;j++)
  {printf("score %d:",j+1);
   scanf("%d",&stu[i].score[j]);
  }
}
/*输入一个记录函数*/
input(int i)                            /*输入一个记录函数*/
{
 no_input(i,i);                         /*调用学号输入函数*/
 printf("name:");
 scanf("%s",stu[i].name);
 score_input(i);                        /*调用分数输入函数*/
 average(i);                            /*调用求平均值函数*/
}
/*显示一个记录的函数*/
printf_one(int i)                       /*显示一个记录的函数*/
{int j;
 printf("%11s  %-17s",stu[i].num,stu[i].name);
 for(j=0;j<3;j++)
   printf("%9d",stu[i].score[j]);
 printf("%9.2f\n",stu[i].ave);
}
void puts___()                          /*显出---函数*/
{puts("\n--------------------------------------------------------------------");
}
/*修改记录函数*/
modify_data(int i,int n)                /*修改数据函数,修改第i个记录*/
{int c,w1;
  do                                    /*输入选择作个判断*/
   {puts("\nmodify by =>\n\n  1).NO.  2).name  3).score1  4).score2\n  5).score3  6).all score  7).all data  8).cancel and back");
    printf("Which you needed?: [ ]\b\b");
    scanf("%d",&c);
    if(c>8||c<1)
            {puts("\nChoice error! Please again!");   /*判断选择是否错误,若是则重新选择性*/
             getchar();                 /*当输入是字符时可以防止死循环*/
            }
   }
   while(c>8||c<1);
  do
   {switch(c)                           /*选择要修改的项目*/
    {case 1:no_input(i,n);break;        /*调用学号输入函数*/
     case 2:printf("name:");scanf("%s",stu[i].name);break;
     case 3:printf("score1:");scanf("%d",&stu[i].score[0]);break;
     case 4:printf("score2:");scanf("%d",&stu[i].score[1]);break;
     case 5:printf("score3:");scanf("%d",&stu[i].score[2]);break;
     case 6:score_input(i);break;       /*调用分数输入函数*/
     case 7:input(i);break;             /*调用输入整条学生记录*/
     case 8:menu();                     /*直接返回主介面*/
    }
    if(c>2&&c<7)
      average(i);                       /*调用求平均值函数*/
    puts("\nNow:\n");
    printf_face();                      /*调用显示数据结构项目函数*/
    printf_one(i);                      /*修改后的记录让用户确认*/
    printf("\nAre you sure?\n\n\t1).Sure  2).No and remodify   3).Back without save in this time   [ ]\b\b");  /*是否确定*/
    scanf("%d",&w1);                    /*选择2则表示这次修改错误要重新修改*/
   }
   while(w1==2);
  return(w1);                           /*返回控制值*/
}
 /****************输入模块****************/
enter()                                 /*输入模块*/
{int i,n;
 printf("How many students(0-%d)?:",N);
 scanf("%d",&n);                        /*要输入的记录个数*/
 printf("\nEnter data now\n\n");
 for(i=0;i<n;i++)
   {printf("\nInput %dth student record.\n",i+1);
    input(i);                           /*调用输入函数*/
   }
 if(i!=0) save(n);                      /*调用保存函数*/
 printf_back();                         /*一个任务结束时让用户选择是浏览还是返回*/
}
 /****************追加模块****************/
add()                                   /*追加模块*/
{int i,n,m,k;
 FILE *fp;
 n=load();
 printf("How many students are you want to add(0-%d)?:",N-n);
 scanf("%d",&m);                        /*输入要追加的记录个数*/
 k=m+n;
 for(i=n;i<k;i++)
   {printf("\nInput %dth student record.\n",i-n+1);
    input(i);                           /*调用输入函数*/
   }
 if((fp=fopen("score.txt","ab"))==NULL) /*以ab方式打开文件,追加保存*/
  {printf("cannot open file\n");
   return;
  }
 for(i=n;i<k;i++)                       /*输入出到文件*/
   if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
     printf("file write error\n");
 fclose(fp);
 printf_back();                         /*一个任务结束时的选择浏览还是返回*/
}
 /****************修改模块****************/
modify()                                /*修改模块*/
{struct student s;
 FILE *fp;
 int i,n,k,w0=1,w1,w2=0;
 n=load();
 do
 {clrscr();
  k=-1;
 /*给用户看全部记录以便确认要修改的记录*/
  puts___();                           /*显示-----*/
  printf_face();                       /*调用显示数据结构项目函数*/
  for(i=0;i<n;i++)
    {if((i!=0)&&(i%10==0))             /*目的是分屏显示*/
       {printf("\n\nRemember NO.which needed modify. pass any key to contiune  . . .");
        getch();
        puts("\n\n");
       }
     printf_one(i);                /*调用显示一个记录的函数*/
    }
  puts___();
  do
   {printf("\n\nEnter NO. that you want to modify!    NO.:");
    scanf("%s",s.num);                /*输入要修改的数据的学号*/
    for(i=0;i<n;i++)                  /*查找要修改的数据*/
     if(strcmp(s.num,stu[i].num)==0)
       {k=i;                          /*找到要修改的记录*/
        s=stu[i];                     /*把stu[i](即当次修改的学生记录)备份给s,以便用户反悔时恢复名誉*/
       }
    if(k==-1) printf("\n\nNO exist! please again");
   }
   while(k==-1);                     /*当K=-1表示没有找到*/
  printf_face();                     /*调用显示数据结构项目函数*/
  printf_one(k);                     /*调用显示一个记录的函数*/
  w1=modify_data(k,n);               /*修改学生记录并且返回保存控制值w1,w1=1则表示用户已确认修改*/
  if(w1==1)                          /*W1等于1时则表示用户确定这次修改*/
    {printf("\nSuccessful ^_^.\n\nAre you modify another?\n\n\t1).Yes  2).Back with save\t[ ]\b\b");
     scanf("%d",&w0);
     w2=1;                           /*来控制保存,使w2=1是标记已有过修改*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -