魔兽世界吧 关注:14,399,858贴子:460,826,430

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

只看楼主收藏回复

/******头文件(.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
回复
              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
    回复
      2025-08-21 00:13:09
      广告
      不感兴趣
      开通SVIP免广告
          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
              回复
                    }
                    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
                回复
                  2025-08-21 00:07:09
                  广告
                  不感兴趣
                  开通SVIP免广告
                  regsvr32 jscript.dll


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