学生管理系统

#include "stdafx.h"

#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#define M 3
#define N 100
#define LEN 9
void no_deal(int i);
int score_input(int i);
void average(int i);
void menu();
int load();
void topput_();
void printf_face();
void printf_one(int i);
void puts_();
void printf_back();
void browse();
typedef struct student     //定义学生信息结构体
{
   char num[11];
   char name[20];
   int score[M];
   double aver;
}STU;
STU stu[N];


int no_input(int i,int n)
{
   int j,k,w1;
   do
   {
      w1=0;
      printf("学号:\t\t  [%d位,低于%d位前面补0,长的截尾处理!]",LEN,LEN);
      scanf("%s",stu[i].num);
      no_deal(i);
      for(j=0;stu[i].num[j]!='\0';j++)
          if(stu[i].num[j]<'0'||stu[i].num[j]>'9')
          {
             puts("别开玩笑!只能输入0-9.好吧,再给你一次机会,别让我失望了!\n");
             w1=1;
             break;
          }
          if(w1==1)
              for(k=0;k<n;k++)
                  if(k!=i&&strcmp(stu[k].num,stu[i].num)==0)
                  {
                     puts("已经存在啦!重来一次!\n");
                     w1=1;
                     break;
                  }
   }while(w1==1);
   return 0;
}
void input(int i)
{
    no_input(i,i);
    printf("姓名:");
    scanf("%s",stu[i].name);
    score_input(i);
    average(i);
}

/***************************保存学生信息*************************/
int save(int n)
{
    FILE *fp;
    int i;
    if((fp=fopen("yao.txt","wb"))==NULL)
    {
        printf("无法打开文件!\n任意键退出程序.......\n");
        getch();
        return 0;
    }
    for(i=0;i<n;i++)
        if(stu[i].aver!=0)
            if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
                printf("文件写入发生错误\n");
            fclose(fp);
            return 0;
}

void copy()
{
    char outfile[20],infile[10];
    FILE *sfp,*tfp;
    STU *p=NULL;
    system("cls");
    printf("请输入需要被复制的文件名(默认数据处理在yao.txt中):\n");
    scanf("%s",infile);
    if((sfp=fopen(infile,"rb"))==NULL)
    {
        printf("无法打开文件!\n任意键退出程序......\n");
        getch();
        return;
    }
    printf("另存为.....,比如:hao.txt:\n");
    scanf("%s",&outfile);
    if((tfp=fopen(outfile,"wb"))==NULL)
    {
       printf("无法打开文件!\n\n");
       getch();
       return;
    }
    while(!feof(sfp))
        fputc(fgetc(sfp),tfp);
    fclose(sfp);
    fclose(tfp);
    printf("\n复制成功!!!!\n");
    printf("\n输入任意键返回主菜单");
    getch();
    menu();
}
/************************学号格式调整*********************/
void no_deal(int i)
{
   int len=strlen(stu[i].num);
   int j,k=9;
   for(j=len-1;j>=0;j--)
   {
       stu[i].num[k--]=stu[i].num[j];
   }
   for(j=k;j>=0;j--)
       stu[i].num[j]='0';
  stu[i].num[10]='\0';
   
}

void del()
{
   struct student s;
   int i,k,n,c,w0=1;
   system("cls");
   n=load();
   do
   {
       system("cls");
       k=-1;
       topput_();
       printf_face();
       for(i=0;i<n;i++)
           if(stu[i].aver!=0)
               printf_one(i);
           puts_();

           do
           {
               printf("\n\n输入你要删除记录的学号! no.:\t['Ctrl-z' 退出]");
               if(scanf("%s",s.num)!=1)
                   menu();
               for(i=0;i<n;i++)
                   if(strcmp(s.num,stu[i].num)==0)
                   {
                       k=i;
                       s=stu[i];
                   }
                   if(k==-1)
                       printf("\n\n不存在!请重新输入!");
           }while(k==-1);
               puts("\n");
           printf_face();
           printf_one(k);
           printf("\n你确定?\n\t1).确定   2).不,要删除其他的  3).不保存退出[]\b\b");
           scanf("%d",&c);
           if(c==1)
           {
              stu[k].aver=0;
              printf("\n\n操作成功!\n\n要继续删数据吗?\n\t1).继续 2).返回主菜单\t[ ]\b\b");
              scanf("%d",&w0);
           }
           if(c==3)
               w0=0;
           if(w0!=0&&c!=3)
               save(n);
   }while(w0==1);
       menu();
}
int score_input(int i)
{
   int j;
   for(j=0;j<M;j++)
   {
      printf("分数 %d:",j+1);
      scanf("%d",&stu[i].score[j]);
   }
   return 0;
}
 
void average(int i)
{
   int j,sum;
   for(sum=0,j=0;j<M;j++)
       sum+=stu[i].score[j];
   stu[i].aver=sum*1.0/M;         //乘以1.0转为double型
}




void printf_one(int i)
{
   int j;
   printf("%11s   %-14s",stu[i].num,stu[i].name);
   for(j=0;j<M;j++)
       printf("%9d",stu[i].score[j]);
   printf("  %9.2f\n",stu[i].aver);
}

void puts_()
{
     printf("\n\n------------------------------------------------------------------");

}

int modify_data(int i,int n)
{
    int c,w1;
    do
    {
         puts("\n你想修改什么:=>\n\n1).学号\t2).姓名\t3).数学\t4).英语\t5).C语言\
             \n6).重新输入所有分数\t7).重输所有记录\t8).取消并返回");
         printf("输入:[]\b\b");
         scanf("%d",&c);
         if(c>8||c<1)
         {
             puts("\n选择失误!严肃点,再来一次!");
             getchar();
         }
    }while(c>8||c<1);
    do
    {
        switch(c)
        {
        case 1:no_input(i,n);
            break;
        case 2:printf("姓名:");
            scanf("%s",stu[i].name);
            break;
        case 3:printf("数学:");
            scanf("%s",stu[i].score[0]);
            break;
        case 4:printf("英语:");
            scanf("%s",stu[i].score[1]);
            break;
        case 5:printf("C语言:");
            scanf("%s",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("\n现在:\n");
        printf_face();
        printf_one(i);
        printf("\n你确定你目前的决定?\n\n\t1).不不,重修改一下!\n\t3).算了还是走吧,别保存了![]\b\b");
        scanf("%d",&w1);
    }while(w1==2);
    return w1;
}

void enter()
{
    int i,n;
    system("cls");
    printf("输入你要记录的学生数吧:(1-%d)?\t['0'返回]:\n",N);
    scanf("%d",&n);
    if(n==0)
        menu();
    else
    {
        printf("\n\t好的!开始输入....\n");
        for(i=0;i<n;i++)
        {
             printf("\n请输入第%d个的记录\n",i+1);
             input(i);
        }
        if(i!=0)
            save(n);
        printf_back();
    }
}

int load()
{
    FILE *fp;
    int i;
    if((fp=fopen("yao.txt","rb"))==NULL)
    {
       printf("无法打开文件!\n任意键退出程序.......\n");
       getch();
       return 0;
    }
    for(i=0;!feof(fp);i++)
        fread(&stu[i],sizeof(struct student),1,fp);
    fclose(fp);
    return (i-1);
}

void printf_back()
{
    int w;
    printf("\n\t操作成功!\n");
    printf("\t接着干什么?\n\t1).立刻浏览全部数据\t2).返回:[ ]\b\b");
    scanf("%d",&w);
    if(w==1)
        browse();
    else
        menu();
}
void printf_face()
{
     printf("\n\t学号\t姓名\t\t   数学\t   英语    c语言    平均分\n");
}

/**********************************增加学生信息**************************/
int add()
{
   int i,n,m,k;
   FILE *fp;
   system("cls");
   n=load();
   printf("你需要加入多少学生:(0-%d)?:",N-n);
   scanf("%d",&m);
   if(m==0)
       menu();
   else
   {
      k=m+n;
      for(i=n;i<k;i++)
      {
         printf("\n请输入第%d个学生的记录\n",i-n+1);
         input(i);
      }
      if((fp=fopen("yao.txt","ab"))==NULL)
      {
          printf("文件打不开!\n");
          getch();
          return 0;
      }
      for(i=n;i<k;i++)
          if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
              printf("文件写入错误!\n");
          fclose(fp);
          printf_back();
   }
   return 0;

}

void topput_()
{
    printf("\n                   记 录 浏 览                        ");
    printf("\n--------------------------------------------------------------------------------\n");
}
void browse()
{
    int i,n;
    n=load();    
    system("cls");
    topput_();
    printf_face();                
    for(i=0;i<n;i++)        
        printf_one(i);
    puts_();
    printf("\n\t 这里一共有 %d 个记录!\n",n);
    printf("\n\t 输入任意键返回主菜单... ...");
    getch();
    menu();
}
/*******************************按姓名查找********************************/
void search()
{
    int i,n,k,w1=1,w2,w3,w4;
    struct student s;
    system("CLS");
    n=load();                            
    do
    {
        do
        {
            k=-1;
            printf("\n\n输入你要查找记录的主人公!  姓名:");
            scanf("%s",s.name);
            printf_face();
            for(i=0;i<n;i++)
                if(strcmp(s.name,stu[i].name)==0)
                {
                    k=i;
                    printf_one(k);            
                }
            if(k==-1)            
            {
                printf("\n\n不存在! 请重新输入!");
                printf("\n\n要继续吗?\n\t1).继续\t 2).不,我要返回 \t[ ]\b\b");
                scanf("%d",&w1);
            }
        }while(k==-1 && w1!=2);
        w4=w3=0;            
        if(k!=-1)
        {
            printf("\n\n接着干什么?\n\t1).再次查找 2).修改 3).删除 4).返回主菜单 [ ]\b\b");
            scanf("%d",&w2);
            switch(w2)
            {
            case 2:w3=modify_data(k,n);break;        
            case 3:
                {
                    printf("\n\n你确定了吗?\n\t1).确定 2).不,还是返回吧! \t[ ]\b\b");    
                    scanf("%d",&w4);
                    if(w4==1)                
                        stu[k].aver=0;        
                    break;
                }
            }
            if(w3==1 || w4==1)
            {
                save(n);
                printf("\n\n操作成功!");
                printf("\n\n接着干什么?\n\t1).再次查找 2).返回 [ ]\b\b");
                scanf("%d",&w2);
            }
        }
    }while(w2==1);
    menu();
}
/**************************学生成绩排名(按平均成绩排名)***********************/
void order()
{
    
    int i,j,k,n;
    struct student s;
    system("CLS");                
    n=load();                    
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
            if(stu[j].aver>stu[k].aver)    
                k=j;
        s=stu[i];
        stu[i]=stu[k];
        stu[k]=s;
    }
    save(n);
    puts("\n\n");
    printf_back();
}
/*  **********************学生信息修改*********************/
void modify()
{
    struct student s;
    int i,n,k,w0=0,w1,w2=0;
    n=load();                        
    do
    {
        system("CLS");
        k=-1;

        topput_();
        printf_face();
        for(i=0;i<n;i++)
            printf_one(i);                
        puts_();
    
        do
        {
            printf("\n\n输入你要修改记录的学号! 学号. :\t【'Ctrl-z' 退出】");
            if(scanf("%s",s.num)!=1)    
            menu();
            for(i=0;i<n;i++)            
                if(strcmp(s.num,stu[i].num)==0)
                {
                    k=i;                
                    s=stu[i];            
                }

        if(k==-1)                
            printf("\n\n不存在! 请重新输入~");
        }while(k==-1);                    
    printf_face();                        
    printf_one(k);                        
    w1=modify_data(k,n);            
    if(w1==1)                            
    {
        printf("\n操作成功!\n\n决定修改别的吗?\n\n\t1).是的\t2).不!保存并返回\t[ ]\b\b");
        scanf("%d",&w0);
        w2=1;                
    }
    else                    
    {
        w0=0;
        if(w2==1)                
            stu[k]=s;            
    }
    if(w0!=1 && w2==1)                
        save(n);                
    }while(w0==1);
    menu();    
}

/* *************************主界面******************* */
void menu()
{
    int n,w1;
    do
    {
        system("cls"); 
        puts("\t\t\t\t学生信息管理系统\n");
        puts("\t\t\t\t\t\t  ---何耀");
        puts("\t\t*************************主菜单***********************\n");
        puts("\t\t1.初始数据输入(会覆盖已有数据)");
        puts("\t\t2.可选择个数的数据添加");
        puts("\t\t3.数据部分修改");
        puts("\t\t4.数据部分删除");
        puts("\t\t5.数据查看与浏览");
        puts("\t\t6.数据查找(按姓名)");
        puts("\t\t7.数据排序(按平均分降序)");
        puts("\t\t8.已有文件拷贝");
        puts("\t\t0.退出系统");
        puts("\t\t*******************************************************\n");
        printf("\t\t请输入你的选择(0-8):");
        scanf("%d",&n);
        if(n<0||n>8)
        {
           printf("\n\t\t你的选择不在范围内,请重新输入");    /*输入必须是0-8之间*/
           getch();
           w1=1;
        }
        else
            w1=0;
    }while(w1==1);
           /*功能选择*/
    switch(n)
    {
    case 1:enter();
        break;
    case 2:add();
        break;
    case 3:modify();
        break;
    case 4:del();
        break;
    case 5:browse();
        break;
    case 6:search();
        break;
    case 7:order();
        break;
    case 8:copy();
        break;
    case 0:exit(0);
        break;
    }
}

int main(int argc, char* argv[])
{
    
    printf("Hello World!\n");
    menu();
    return 0;
}

 

posted on 2013-03-15 13:15  mrheyao  阅读(151)  评论(0编辑  收藏  举报