首页 新闻 会员 周边

求改错(大一c语言作业)

0
悬赏园豆:50 [待解决问题]

很简单的大一学生的作业,有问题问我,我不懂C,求助万能的WEB,哪位热心朋友帮忙修改修改:

(题目 学生成绩管理 实现功能:输入、输出、插入、删除、查找、追加、读入、显示、保存、拷贝、排序、索引、分类合计、退出。)

 

代码:

#include <stdio.h> /*I/O函数*/
#include <stdlib.h> /*其它说明*/
#include <string.h>/*字符串函数*/
#include <conio.h> /*屏幕操作函数*/
#include <mem.h> /*内存操作函数*/
#include<iostream>
#include <ctype.h> /*字符操作函数*/

#define N 3 /*定义常数*/

typedef struct z1 /*定义数据结构*/
{
    char name[15];
    char num[15];
    int score[3];
    float sum;
    float average;
    int order;
    struct z1 *next;
} STUDENT;
/*以下是函数原型*/
STUDENT *init(); /*初始化函数*/
void creat(int n,STUDENT *h); /*创建链表*/
void Delete(STUDENT *h); /*删除记录*/
void print(STUDENT *h); /* 显示所有记录*/
void search(STUDENT *h); /*查找*/
void save(char fileName[]); /*保存*/
void open();/*打开文件*/
STUDENT *load(); /*读入记录*/
void computer(STUDENT *h); /*计算总分和均分*/
void insert(STUDENT *h); /*插入记录*/
void append(); /*追加记录*/
void copy(); /*复制文件*/
STUDENT *sort(STUDENT *h); /*排序*/
STUDENT *index(STUDENT *h); /*索引*/
void total(STUDENT *h); /*分类合计*/

/******主函数开始*******/
int main()
{
    int n;
    char path[30];
    STUDENT *head,*p,*z,*q1; //用于保存头结点的地址
    printf("请输入文件的存储路径:\n");
    scanf("%s",path);
    printf("请输入学生的个数:\n");
    scanf("%d",&n);//输入学生的个数
    save(path,n);//将键盘输入的学生信息存入在文本文件
    z=open();//从文件中得到相关的学生信息,并返回存放信息的数组的首地址
    p=creat(n,z);
    q1=copy(p);
    head=init(); /*初始化链表*/
    {
        do
        {
            printf("          ***********************************************************\n");
            printf("          ~~~~~~~~~~~~~~~~~~欢迎光临学生成绩管理系统~~~~~~~~~~~~~~~~~\n");
            printf("          ***************************^_^*****************************\n");
            printf("          *   0.退出该操作系统               1.删除记录         *\n");
            printf("          *   2.显示全部记录                 3.查找记录         *\n");
            printf("          *   4.保存文件                     5.读取文件内容     *\n");
            printf("          *   6.计算总分和均分               7.插入记录         *\n");
            printf("          *   8.复制文件                     9.以学生总分进行降序排序  *\n");
            printf("          *   10.追加记录                    11.以学生姓名进行索引    *\n");
            printf("          *   12.分类合计                                     *\n");
            printf("          ***********************************************************\n");
            printf("          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
            printf("          ***********************************************************\n");
            printf("          **请输入您需要进行的操作**:");
            scanf("%d",&n);
            system("cls");
            switch(n)
            {
            case 0:
                printf("          ************************************************************\n");
                printf("          ~~~~~~~~~~~~~~退出学生成绩管理系统,感谢使用!~~~~~~~~~~~~~~\n");
                printf("          ************************************************************\n");
                exit(0);

            case 1:
                printf("您选择的操作是:删除记录");
                Delete(head);
                system("cls");
                break;
            case 2:
                printf("您选择的操作是:显示全部记录");
                print(head);
                break;
            case 3:
                printf("您选择的操作是:查找记录");
                search(head);
                break;
            case 4:
                printf("您选择的操作是:保存文件");
                save();
                system("pause");
                system("cls");
                break;
            case 5:
                printf("您选择的操作是:读取文件内容");
                head=load();
                break;
            case 6:
                printf("您选择的操作是:计算总分和均分");
                computer(head);
                break;
             case 7:
                printf("您选择的操作是:插入记录");
                insert(head);
                system("cls");
                break;
            case 8:
                printf("您选择的操作是:复制文件");
                copy();
                break;
            case 9:
                printf("您选择的操作是:以学生总分进行降序排序");
                head=sort(head);
                break;
            case 10:
                printf("您选择的操作是:追加记录");
                append();
                break;
            case 11:
                printf("您选择的操作是:以学生姓名进行索引");
                head=index(head);
                break;
            case 12:
                printf("您选择的操作是:分类合计");
                total(head);
                break;
            }
        }
        while(1);
    }
    return 0;
}

STUDENT *init()
{
    return NULL;
}

void inputs(char *prompt, char *s, int count)/*输入字符串,并进行长度验证*/
{
    char p[255];
    do
    {
        //printf(prompt); /*允鞠提示信息*/
        scanf("%s",p); /*输入字符串*/
        if(strlen(p)>count)printf("\n too long! \n"); /*进行长度校验,超过count值重输入*/
    }
    while(strlen(p)>count);
    strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}

void creat(int n,STUDENT *h)
{
    h=(STUDENT*)malloc(sizeof(STUDENT));
    STUDENT *p,*q;
    char m=' ';
    h->next=NULL;
    q=h;
    while(m==' ')
    {
        p=(STUDENT*)malloc(sizeof(STUDENT));
        scanf("%s%s%d%d%d%c",p->name,p->num,&p->score[0],&p->score[1],&p->score[2],&m);
        p->average=(p->score[0]+p->score[1]+p->score[2])/3;
        q->next=p;
        q=p;
    }
    q->next=NULL;
}

void print(char fileName[])/*输出链表中结点信息*/
{
    FILE *pFile;
    int i=0; /* 统计记录条数*/
    STUDENT *p; /*移动指针*/
    system("cls"); /*清屏*/
    //p=h; /*初值为头指针*/
    printf("\n\n\n****************************STUDENT********************************\n");
    printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理");
    printf("|---|----------|---------------|----|----|----|--------|-------|-----|\n");
    if((pFile=fopen(fileName,"rb"))==NULL)
    {
        printf("打开文件%s失败!""\n敲击任意键退出!\n",fileName);
        system("PAUSE");
        exit(1);
    }
    //printf("\n\n%8s显示学生信息\n","");
    //printf("\n","编号","学号","数学","英语","物理");
    for(i=0;i<N;i++)
    {
        fscanf(pFile,"%-10s%-10d%-10d%-10d%-10d%",p->name,p->num,&p->score[0],&p->score[1],&p->score[2]);
        if(ferror(pFile)!=0)
        {
            clearerr(pFile);
            printf("文件写操作出错!""\n敲击任意键退出!\n");
            system("PAUSE");
            exit(1);
        }
        printf("%-10s%-10s%-10d%-10d%-10d%",p->name,p->num,&p->score[0],&p->score[1],&p->score[2]);
    }
    fclose(pFile);
    printf("**********************************end*********************************\n");
}

void Delete(STUDENT *h)/*删除记录*/
{
    STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/
    char s[11]; /*存放学号*/
    printf("请输入要删除学生的学号\n"); /*显示提示信息*/
    scanf("%s",s); /*输入要删除记录的学号*/
    q=p=h; /*给q和p赋初值头指针*/
    while(strcmp(p->num,s)&&p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/
    {
        q=p; /*将p指针值赋给q作为p的前驱指针*/
        p=p->next; /*将p指针指向下一条记录*/
    }
    if(p==NULL) /*如果p为空,说明链表中没有该结点*/
        printf("\nlist no %s student\n",s);
    else /*p不为空,显示找到的记录信息*/
    {
        printf("*****************************have found***************************\n");
        printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理");
        printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
        printf("%-10s%-10d%-10.1d%-10.1d%-10.1d\n",p->name,p->num,p->score[0],p->score[1],p->score[2]);
        printf("********************************end*******************************\n");
        getch(); /*压任一键后,开始删除*/
        if(p==h) /*如果p==h,说明被删结点是头结点*/
            h=p->next; /*修改头指针指向下一条记录*/
        else
            q->next=p->next; /*不是头指针,将p的后继结点作为q的后继结点*/
        free(p); /*释放p所指结点空间*/
        printf("\n 已经删除学号为%s的学生\n",s);
        printf("不要忘记保存文件\n");/*提示删除后不要忘记保存文件*/
    }
    //return(h); /*返回头指针*/
}

void search(STUDENT*h)/*查找记录*/ /*当记录的姓名不是要找的,或指针不为空时*/
{
    STUDENT *p;
    char s[15]; /*存放姓名的字符数组*/
    p=p->next; /*移动指针,指向下一结点*/
    if(p==NULL) /*如果指针为空*/
        printf("\n没有叫%s的学生\n",s); /*显示没有该学生*/
    else /*显示找到的记录信息*/
    {
        //printf (*h)
        {
            STUDENT *p; /* 移动指针*/
            system("cls"); /*清屏幕*/
            printf("请输入要查找学生的姓名\n");
            scanf("%s",s); /*输入姓名*/
            p=h; /*将头指针赋给p*/
            while(strcmp(p->name,s)&&p!=NULL) printf("\n\n*****************************havefound***************************\n");
            printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理");
            printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
            printf("%-10s%-10d%-10d%-10d%-10d\n",
                   p->name,p->num,p->score[0],p->score[1],p->score[2]);
            printf("********************************end*******************************\n");
        }
    }
}

void insert(STUDENT *h)
{
    STUDENT *p1,*p2,*p3,*student;
    char Name[20];
    int order;
    student=(STUDENT*)malloc(sizeof(STUDENT));
    p1=h;
    p2=h->next;
    printf("请输入插入的学生与哪个学生相邻\n");
    scanf("%s",Name);
    while(p2)
    {
        if(!strcmp(p2->name,Name))
        {
            break;
        }
        else
        {
            p1=p1->next;
            p2=p2->next;
        }
    }
    p3=p2->next;
    printf("请输入插在该学生的1:前面 2:后面\n");
    scanf("%d",&order);
    if(order==1)
    {

        printf("请输入带插入的学生的信息\n");
        printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理");
        scanf("%-10s%-10d%-10d%-10d%-10d\n",student->name,student->num,student->score[0],student->score[1],student->score[2]);
        p1->next=student;
        student->next=p2;
    }
    else
    {
        printf("请输入带插入的学生的信息\n");
        printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理");
        scanf("%-10s%-10d%-10d%-10d%-10d\n",student->name,student->num,student->score[0],student->score[1],student->score[2]);
        p2->next=student;
        student=p3;
    }
}

void save(char fileName[])
{
    FILE *pFile; /*源和目标文件指针*/
    STUDENT *p=NULL; /*移动指针*/
    system("cls");/*清屏*/
    int i;
    if((pFile=fopen(fileName,"wb"))==NULL) /*二进制读方式打开源文件*/
    {
        printf("打不开文件\n");
        system("PAUSE");
        exit(1);
    }

    printf("%8s输入学生信息\n","");
    printf("%-10s%-10s%-10.1f%-10.1f%-10.1f%\n","姓名","学号","数学","英语","物理");
    for(i=0;i<N;i++)
    {
        scanf("%-10s%-10d%-10d%-10d%-10d\n",p->name,p->num,p->score[0],p->score[1],p->score[2]);
        fprintf(pFile,"%-10s%-10d%-10d%-10d%-10d\n",p->name,p->num,p->score[0],p->score[1],p->score[2]);
        if(ferror(pFile))
        {
            clearerr(pFile);
            printf("文件写操作错误\n""敲击任意键退出\n");
            system("PAUSE");
            exit(1);
        }
    }
    fclose(pFile);
}

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("\n没有申请到内存"); /*没有申请到,内存溢出本函数结束*/
        return ;
    }
    inputs("输入学号:",info->num,11); /*调用inputs输入学号*/
    inputs("输入姓名:",info->name,15); /*调用inputs输入姓名*/
    printf("输入成绩:%d\n",3); /*提示输入成绩*/
    s1=0;
    printf("%-10s%-10s%-10.1f%-10.1f%-10.1f%\n","姓名","学号","数学","英语","物理");
    for(i=0; i<3; i++)
    {
        do
        {
          scanf("%-10s%-10d%-10.1d%-10.1d%-10.1d%",info->name,&info->num,&info->score[0],&info->score[1],&info->score[2]);
            if(info->score[i]>100||info->score[i]<0)printf("bad data,repeat input\n");
        }
        while(info->score[i]<100||info->score[i]<0);  /*成绩数据验证*/
        s1=s1+info->score[i]; /*求总分*/
    }
    info->sum=s1; /*保存总分*/
    info->average=(float)s1/N; /*求均分*/
    info->order=0; /*名次初始值为0*/
    info->next=NULL; /*将新记录后继指针赋值为空*/
    printf("请输入文件名\n");
    scanf("%s",infile); /*输入文件名*/
    if((fp=fopen(infile,"ab"))==NULL) /*向二进制文件尾增加数据方式打开文件*/
    {
        printf("不能打开文件\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 open(char fileName[])/*打开文件*/
{
    FILE *pFile; /*源和目标文件指针*/
    STUDENT *p=NULL; /*移动指针*/
    system("cls");/*清屏*/
    int i;
    if((pFile=fopen(fileName,"wb"))==NULL) /*二进制读方式打开源文件*/
    {
        printf("can not open open file\n");
        system("PAUSE");
        exit(1);
    }
}

void copy()/*文件拷贝*/
{
    char outfile[10],infile[10];
    FILE *sfp,*tfp; /*源和目标文件指针*/
    STUDENT *p=NULL; /*移动指针*/
    system("cls"); /*清屏*/
    printf("Enter infile name");
    scanf("%s",infile);
    if((sfp=fopen(infile,"rb"))==NULL) /*二进制读方式打开源文件*/
    {
        printf("can not open input file\n");
        exit(0);
    }
    printf("Enter outfile name");
    scanf("%s",outfile);
    if((tfp=fopen(outfile,"wb"))==NULL) /*二进制写方式打开目标文件*/
    {
        printf("can not open output file \n");
        exit(0);
    }
    while(!feof(sfp)) /*读文件直到文件尾*/
    {
        if(1!=fscanf(p,sizeof(STUDENT),1,sfp))
            break; /*块读*/
        fwrite(p,sizeof(STUDENT),1,tfp); /*块写*/
    }
    fclose(sfp); /*关闭源文件*/
    fclose(tfp); /*关闭目标文件*/
    printf("you have success copy file!!!\n"); /*显示成功拷贝*/
}

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; /*指针后移*/
    }
    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->num,p->num)>0&&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*/
        }
    }
    printf("index sucess!!!\n"); /*索引排序成功*/
    return h; /*返回头指针*/
}

void total(STUDENT *h)/*分类合计:及格的人数*/
{
    float x;
    int i;//符合条件的人数
    STUDENT *p;
    printf("请输入指定平均分:");
    scanf("%f",&x);
    printf("**运行结果如下**:\n");
    p=h->next;
    printf("%-10s%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理","平均分");
    while(p!=NULL)
    {
        if(p->average>=x)
            {
                printf("%-10s%-10d%-10.1f%-10.1f%-10.1f-10.1f\n",p->name,p->num,p->score[0],p->score[1],p->score[2],p->average);
                i++;
            }
        p=p->next;
    }
    printf("及格人数为:%d",i);
    printf("---------------------------------------------\n");
}

 

 

 

问题补充:

不是做作业,是帮忙挑错误

BillCat的主页 BillCat | 初学一级 | 园豆:152
提问于:2012-07-12 12:15
< >
分享
所有回答(1)
0

如果你要的话 我可以给你一个 功能基本上一样的    因为曾经我们那会也做过

落幕残情 | 园豆:34 (初学一级) | 2012-07-17 10:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册