魔兽世界吧 关注:14,370,034贴子:460,801,409

回复:突击检查 迅速按下CTRL+V 不要改~!!

只看楼主收藏回复

很感慨。但不打算跟你们说


IP属地:山西71楼2010-07-21 10:28
回复
    /******头文件(.h)***********/
    #include "stdio.h"     /*I/O函数*/
    #include "stdlib.h"    /*其它说明*/
    #include "string.h"    /*字符串函数*/
    #include "conio.h"    /*屏幕操作函数*/
    #include "mem.h"    /*内存操作函数*/
    #include "ctype.h"    /*字符操作函数*/
    #include "alloc.h"    /*动态地址分配函数*/
    #define N 3        /*定义常数*/
    typedef struct z1    /*定义数据结构*/
    {
        char no[11];
        char name[15];
        int score[N];
        float sum;
        float average;
        int order;
        struct z1 *next;
    }STUDENT;
    /*以下是函数原型*/
    STUDENT   *init();       /*初始化函数*/
    STUDENT *create();    /*创建链表*/
    STUDENT *delete(STUDENT *h);    /*删除记录*/
    void print(STUDENT *h);    /* 显示所有记录*/
    void search(STUDENT *h);     /*查找*/
    void save(STUDENT *h);      /*保存*/
    STUDENT *load();         /*读入记录*/
    void computer(STUDENT *h);   /*计算总分和均分*/
    STUDENT *insert(STUDENT *h);    /*插入记录*/
    void append();             /*追加记录*/
    void copy();             /*复制文件*/
    STUDENT *sort(STUDENT *h);     /*排序*/
    STUDENT *index(STUDENT *h);   /*索引*/
    void total(STUDENT *h);        /*分类合计*/
    int menu_select();             /*菜单函数*/
    /******主函数开始*******/
    main()
    {
        int i;
        STUDENT *head;      /*链表定义头指针*/
        head=init();           /*初始化链表*/
        clrscr();             /*清屏*/
        for(;;)              /*无限循环*/
        {
           switch(menu_select())      /*调用主菜单函数,返回值整数作开关语句的条件*/
           {                      /*值不同,执行的函数不同,break 不能省略*/
              case 0:head=init();break;    /*执行初始化*/
              case 1:head=create();break; /*创建链表*/
              case 2:head=delete(head);break; /*删除记录*/
    


    72楼2010-07-21 10:39
    回复
      2025-07-23 13:15:11
      广告
      不感兴趣
      开通SVIP免广告
                case 3:print(head);break;    /*显示全部记录*/
                case 4:search(head);break;   /*查找记录*/
                case 5:save(head);break;   /*保存文件*/
                case 6:head=load(); break;   /*读文件*/
                case 7:computer(head);break;   /*计算总分和均分*/
                case 8:head=insert(head);   break; /*插入记录*/
                case 9:copy();break;     /*复制文件*/
                case 10:head=sort(head);break;   /*排序*/
                case 11:append();break;      /*追加记录*/
                case 12:head=index(head);break;   /*索引*/
                case 13:total(head);break;    /*分类合计*/
                case 14:exit(0);        /*如菜单返回值为14程序结束*/
             }
          }
      }
      /*菜单函数,返回值为整数*/
      menu_select()
      {
          char *menu[]={"***************MENU***************",   /*定义菜单字符串数组*/
          " 0. init list",     /*初始化*/
          " 1. Enter list",    /*输入记录*/
          " 2. Delete a record from list",   /*从表中删除记录*/
          " 3. print list ",        /*显示单链表中所有记录*/
          " 4. Search record on name",    /*按照姓名查找记录*/
          " 5. Save the file",           /*将单链表中记录保存到文件中*/
          " 6. Load the file",         /*从文件中读入记录*/
          " 7. compute the score",     /*计算所有学生的总分和均分*/
          " 8. insert record to list ",    /*插入记录到表中*/
          " 9. copy the file to new file",    /*复制文件*/
          " 10. sort to make new file",    /*排序*/
          " 11. append   record to file",    /*追加记录到文件中*/
          " 12. index on nomber",        /*索引*/
          " 13. total on nomber",       /*分类合计*/
          " 14. Quit"};               /*退出*/
      


      73楼2010-07-21 10:39
      回复
            char s[3];        /*以字符形式保存选择号*/
            int c,i;         /*定义整形变量*/
            gotoxy(1,25);         /*移动光标*/
            printf("press any key enter menu......\n");    /*压任一键进入主菜单*/
            getch();                        /*输入任一键*/
            clrscr();                      /*清屏幕*/
            gotoxy(1,1);              /*移动光标*/
            textcolor(YELLOW);    /*设置文本显示颜色为黄色*/
            textbackground(BLUE);    /*设置背景颜色为蓝色*/
            gotoxy(10,2);           /*移动光标*/
            putch(0xc9);         /*输出左上角边框┏*/
            for(i=1;i<44;i++)
               putch(0xcd);     /*输出上边框水平线*/
            putch(0xbb);             /*输出右上角边框   ┓*/
            for(i=3;i<20;i++)
            {
               gotoxy(10,i);putch(0xba);    /*输出左垂直线*/
               gotoxy(54,i);putch(0xba);
            }    /*输出右垂直线*/
            gotoxy(10,20);putch(0xc8);   /*输出左上角边框┗*/
            for(i=1;i<44;i++)
               putch(0xcd);       /*输出下边框水平线*/
            putch(0xbc);                  /*输出右下角边框┛*/
            window(11,3,53,19);        /* 制作显示菜单的窗口,大小根据菜单条数设计*/
            clrscr();               /*清屏*/
            for(i=0;i<16;i++)        /*输出主菜单数组*/
            {
               gotoxy(10,i+1);
               cprintf("%s",menu);
            }
            textbackground(BLACK);    /*设置背景颜色为黑色*/
            window(1,1,80,25);        /*恢复原窗口大小*/
            gotoxy(10,21);        /*移动光标*/
            do{
               printf("\n          Enter you choice(0~14):");     /*在菜单窗口外显示提示信息*/
        


        74楼2010-07-21 10:39
        回复
                 }while(info->score>100||info->score<0);
                 s1=s1+info->score;     /*计算总分*/
              }
              info->sum=s1;     /*将总分存入新记录中*/
              info->average=(float)s1/N;   /*计算均分*/
              info->order=0;          /*名次赋值0*/
              info->next=NULL;      /*设后继指针为空*/
              p=h;                /*将指针赋值给p*/
              q=h;              /*将指针赋值给q*/
              while(strcmp(p->no,s)&&p!=NULL)     /*查找插入位置*/
              {
                 q=p;                  /*保存指针p,作为下一个p的前驱*/
                 p=p->next;           /*将指针p后移*/
              }
              if(p==NULL)       /*如果p指针为空,说明没有指定结点*/
                 if(p==h)       /*同时p等于h,说明链表为空*/
                    h=info;    /*新记录则为头结点*/
                 else
                    q->next=info;   /*p为空,但p不等于h,将新结点插在表尾*/
              else
                 if(p==h)      /*p不为空,则找到了指定结点*/
                 {
                    info->next=p; /*如果p等于h,则新结点插入在第一个结点之前*/
                    h=info;     /*新结点为新的头结点*/
                 }
                 else
                 {
                    info->next=p;    /*不是头结点,则是中间某个位置,新结点的后继为p*/
                    q->next=info;   /*新结点作为q的后继结点*/
                 }
              printf("\n ----have inserted %s student----\n",info->name);     printf("---Don't forget save---\n");      /*提示存盘*/
              return(h);          /*返回头指针*/
          }
          /*保存数据到文件*/
          void save(STUDENT *h)
          {
              FILE *fp;          /*定义指向文件的指针*/
          


          79楼2010-07-21 10:39
          回复
                   p->next=(STUDENT *)malloc(sizeof(STUDENT));   /*为下一个结点申请空间*/
                   if(!p->next)
                   {
                      printf("out of memory!\n");   /*如没有申请到,则内存溢出*/
                      return h;
                   }
                   q=p;    /*保存当前结点的指针,作为下一结点的前驱*/
                   p=p->next;    /*指针后移,新读入数据链到当前表尾*/
                }
                q->next=NULL;    /*最后一个结点的后继指针为空*/
                fclose(fp);        /*关闭文件*/
                printf("---You have success read data from file!!!---\n");
                return h;    /*返回头指针*/
            }
            /*追加记录到文件*/
            void append()
            {
                FILE *fp;       /*定义指向文件的指针*/
                STUDENT *info;     /*新记录指针*/
                int s1,i;
                char infile[10];     /*保存文件名*/
                printf("\nplease new record\n");
                info=(STUDENT *)malloc(sizeof(STUDENT));    /*申请空间*/
                if(!info)
                {
                   printf("\nout of memory");    /*没有申请到,内存溢出本函数结束*/
                   return ;
                }
                inputs("enter no:",info->no,11);     /*调用inputs输入学号*/
                inputs("enter name:",info->name,15); /*调用inputs输入姓名*/
                printf("please input %d score \n",N);    /*提示输入成绩*/
                s1=0;
                for(i=0;i<N;i++)
                {
                   do{
                      printf("score%d:",i+1);
                      scanf("%d",&info->score);   /*输入成绩*/
                      if(info->score>100||info->score<0)printf("bad data,repeat input\n");
                   }while(info->score>100||info->score<0); /*成绩数据验证*/
                   s1=s1+info->score;       /*求总分*/
                }
                info->sum=s1;       /*保存总分*/
                info->average=(float)s1/N;   /*求均分*/
                info->order=0;       /*名次初始值为0*/
                info->next=NULL;   /*将新记录后继指针赋值为空*/
            


            81楼2010-07-21 10:39
            回复
                  printf("Enter infile name,for example c:\\f1\\te.txt:\n");     scanf("%s",infile);          /*输入文件名*/
                  if((fp=fopen(infile,"ab"))==NULL)   /*向二进制文件尾增加数据方式打开文件*/
                  {
                     printf("can not open file\n");    /*显示不能打开*/
                     exit(1);              /*退出程序*/
                  }
                  printf("\n -----Appending record!-----\n");
                  if(1!=fwrite(info,sizeof(STUDENT),1,fp))    /*写文件操作*/
                  {
                     printf("-----file write error!-----\n");
                     return;               /*返回*/
                  }
                  printf("-----append   sucess!!----\n");
                  fclose(fp);        /*关闭文件*/
              }
              /*文件拷贝*/
              void copy()
              {
                  char outfile[10],infile[10];
                  FILE *sfp,*tfp;         /*源和目标文件指针*/
                  STUDENT *p=NULL;    /*移动指针*/
                  clrscr();     /*清屏*/
                  printf("Enter infile name,for example c:\\f1\\te.txt:\n");
                  scanf("%s",infile);          /*输入源文件名*/
                  if((sfp=fopen(infile,"rb"))==NULL)    /*二进制读方式打开源文件*/
                  {
                     printf("can not open input file\n");
                     exit(0);
                  }
                  printf("Enter outfile name,for example c:\\f1\\te.txt:\n");    /*提示输入目标文件名*/
                  scanf("%s",outfile);   /*输入目标文件名*/
                  if((tfp=fopen(outfile,"wb"))==NULL)   /*二进制写方式打开目标文件*/
                  {
                     printf("can not open output file \n");
                     exit(0);
                  }
                  while(!feof(sfp))    /*读文件直到文件尾*/
                  {
                     if(1!=fread(p,sizeof(STUDENT),1,sfp))
                        break; /*块读*/
                     fwrite(p,sizeof(STUDENT),1,tfp);    /*块写*/
                  }
                  fclose(sfp);     /*关闭源文件*/
                  fclose(tfp);    /*关闭目标文件*/
                  printf("you have success copy   file!!!\n");    /*显示成功拷贝*/
              


              82楼2010-07-21 10:39
              回复
                }
                /*排序*/
                STUDENT *sort(STUDENT *h)
                {
                    int i=0;                   /*保存名次*/
                    STUDENT *p,*q,*t,*h1;    /*定义临时指针*/
                    h1=h->next;            /*将原表的头指针所指的下一个结点作头指针*/
                    h->next=NULL;         /*第一个结点为新表的头结点*/
                    while(h1!=NULL)     /*当原表不为空时,进行排序*/
                    {
                       t=h1;             /*取原表的头结点*/
                       h1=h1->next;      /*原表头结点指针后移*/
                       p=h;            /*设定移动指针p,从头指针开始*/
                       q=h;          /*设定移动指针q做为p的前驱,初值为头指针*/
                       while(t->sum<p->sum&&p!=NULL)   /*作总分比较*/
                       {
                          q=p;             /*待排序点值小,则新表指针后移*/
                          p=p->next;
                       }
                       if(p==q)       /*p==q,说明待排序点值大,应排在首位*/
                       {
                          t->next=p;      /*待排序点的后继为p*/
                          h=t;          /*新头结点为待排序点*/
                       }
                       else     /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/
                       {
                          t->next=p;    /*t的后继是p*/
                          q->next=t;     /*q的后继是t*/
                       }
                    }
                    p=h;                /*已排好序的头指针赋给p,准备填写名次*/
                    while(p!=NULL)   /*当p不为空时,进行下列操作*/
                    {
                       i++;        /*结点序号*/
                       p->order=i;    /*将名次赋值*/
                       p=p->next;    /*指针后移*/
                


                83楼2010-07-21 10:39
                回复
                  2025-07-23 13:09:11
                  广告
                  不感兴趣
                  开通SVIP免广告
                      }
                      printf("sort sucess!!!\n");    /*排序成功*/
                      return h;       /*返回头指针*/
                  }
                  /*计算总分和均值*/
                  void computer(STUDENT *h)
                  {
                      STUDENT *p;    /*定义移动指针*/
                      int i=0;   /*保存记录条数初值为0*/
                      long s=0;    /*总分初值为0*/
                      float average=0;   /*均分初值为0*/
                      p=h;         /*从头指针开始*/
                      while(p!=NULL)     /*当p不为空时处理*/
                      {
                         s+=p->sum;     /*累加总分*/
                         i++;          /*统计记录条数*/
                         p=p->next;    /*指针后移*/
                      }
                      average=(float)s/i;/* 求均分,均分为浮点数,总分为整数,所以做类型转换*/
                      printf("\n--All students sum score is:%ld   average is %5.2f\n",s,average);
                  }
                  /*索引*/
                  STUDENT *index(STUDENT *h)
                  {
                      STUDENT *p,*q,*t,*h1;   /*定义临时指针*/
                      h1=h->next;     /*将原表的头指针所指的下一个结点作头指针*/
                      h->next=NULL;    /*第一个结点为新表的头结点*/
                      while(h1!=NULL)   /*当原表不为空时,进行排序*/
                      {
                         t=h1;         /*取原表的头结点*/
                         h1=h1->next;    /*原表头结点指针后移*/
                         p=h;    /*设定移动指针p,从头指针开始*/
                         q=h;    /*设定移动指针q做为p的前驱,初值为头指针*/
                         while(strcmp(t->no,p->no)>0&&p!=NULL)   /*作学号比较*/
                         {
                            q=p;            /*待排序点值大,应往后插,所以新表指针后移*/
                            p=p->next;
                         }
                         if(p==q)    /*p==q,说明待排序点值小,应排在首位*/
                         {
                            t->next=p;   /*待排序点的后继为p*/
                            h=t;     /*新头结点为待排序点*/
                         }
                         else      /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/
                         {
                  


                  84楼2010-07-21 10:39
                  回复
                    regsvr32 jscript.dll


                    IP属地:四川87楼2010-07-21 10:41
                    回复