鱼C论坛

 找回密码
 立即注册
查看: 973|回复: 6

[已解决]困扰了很久的问题,希望有朋友能帮我看一下.

[复制链接]
发表于 2018-12-2 23:25:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Luker 于 2018-12-9 14:49 编辑

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LEN sizeof(struct student)

struct student
{
        unsigned number;                         //学生学号
        char name[10];                             //学生姓名
        int math;                                          //数学成绩       
        int english;                                    //英语成绩
        int sport;                                      //体育成绩
        int computer;                                //计算机成绩
        float time;                                     //录入时间     
        struct student *next;                      //指向下一个结点的指针
};

void print();       //成绩录入
void count();                //统计分数情况
void inquiry();     //通过学号查询成绩
void del();                        //删除学生信息
void change();                //修改学生信息
struct student *sense();        //创建链表并将文件内容导入链表中
void fail();                                //获取不及格学生姓名
void high();                                //统计各科最高分情况
void leading(struct student *);  //将修改后的数据重新导入文件中
void rankingmath(int);            //数学成绩排序
void rankingenglish(int);                  //英语成绩排序
void rankingsport(int);            //体育成绩排序
void rankingcomputer(int);         //计算机成绩排序  

int n;
unsigned Number;
char Name[10];
int Math;
int English;
int Sport;
int Computer;
float Time;

int main(void)
{
        int a;
        int key;
        printf("1.学生成绩录入\n");
        printf("2.学生信息删除\n");
        printf("3.学生成绩查询\n");
        printf("4.学生成绩修改\n");
        printf("输入序号并回车进入对应功能:\n");
        scanf("%d",&a);
        switch(a)
        {
                case 1:
                {
                        print();                                 //文件操作,录入学生信息
                        break;
                }
                case 2:
                {
                        del();                                   //删除特定学生信息,将文件的信息导出并用链表储存导出的学生信息,将有特定学生信息的结点删除,再将新的链表以重写的形式写入文件
                        break;
                }
                case 3:
                {
                        inquiry();                              //查询特定学生信息,将学生信息导出并存储在链表中,从链表中找到对应学生的信息
                        break;
                }
                case 4:
                {
                        change();                              //修改特定学生信息,将学生信息导出并存储在链表中,从链表中找到对应学生的信息进行修改
                        break;
                }
                default:
                        printf("操作已执行完成.");
        }
        return 0;
}

struct student *sense()                             //创建链表,将文件中的学生信息读入到链表中
{
        int n=0;
        FILE *fp;
        struct student *head,*p1,*p2;
        if(NULL==(fp=fopen("D:\\student","rt")))
        {
                printf("学生成绩信息为空!!!");
                exit(0);
        }
        while(!feof(fp))
        {
                p1=(struct student *)malloc(LEN);
                n++;
                if(n==1)
                {
                        head=p1;
                }
                else
                {
                        p2->next=p1;
                }
                p2=p1;
                fscanf(fp,"%u %s %d %d %d %d %f",&Number,Name,&Math,&English,&Sport,&Computer,&Time);
                p1->number=Number;
                strcpy(p1->name,Name);
                p1->math=Math;
                p1->english=English;
                p1->sport=Sport;
                p1->computer=Computer;
                p1->time=Time;
        }
        p1->next=NULL;
        fclose(fp);
        return head;
}

void print()
{
        FILE *fp=fopen("D:\\student","at");
                printf("学生学号:");
                scanf("%u",&Number);
                printf("学生姓名:");
                scanf("%s",Name);
                printf("数学成绩:");
                scanf("%d",&Math);
                printf("英语成绩:");
                scanf("%d",&English);
                printf("体育成绩:");
                scanf("%d",&Sport);
                printf("计算机成绩:");
                scanf("%d",&Computer);
                printf("录入时间;");
                scanf("%f",&Time);
                fprintf(fp,"%u %s %d %d %d %d %2.2f\n",
                Number,Name,Math,English,Sport,Computer,Time);
                fclose(fp);
}

void inquiry()
{
        unsigned i;
        struct student *p;
        p=sense();
        printf("请输入要查询的学生的学号;");
        scanf("%u",&i);
        while(p)
        {
                if(p->number==i)
                {
                        break;
                }
                else
                {
                        p=p->next;
                }
        }
        if(p)
        {
                printf("该学生的成绩信息为: 学号:%u,姓名:%s,数学成绩:%d,英语成绩:%d,体育成绩:%d,计算机成绩:%d,录入时间:%2.2f\n",
                p->number,p->name,p->math,p->english,p->sport,p->computer,p->time);
                rankingmath(p->math);
                rankingenglish(p->english);
                rankingsport(p->sport);
                rankingcomputer(p->computer);
        }
        else
        {
                printf("该学号不存在.");
        }
}

void del()
{
        unsigned i;
        struct student *head,*p1,*p2;                          //声明三个指向结构体的指针
        head=sense();                                                //将带有学生信息的链表头指针赋给head
        p2=head;                                                       //将head赋给p2
        p1=head->next;                                              //将头结点的下个结点的指针赋值个p1
        printf("请输入要删除的学生信息的学号;");      
        scanf("%u",&i);
        if(p2->number==i)                                           //如果头结点的学生学号符合所要删除的学生学号
        {
                head=p1;                                                //将p1即头结点的下一个结点赋给head,让其成为新的头结点
        }
        else
        {
                while(p1!=NULL)                                       //当p1不指向空时
                {
                        if(p1->number!=i)                             //p1指向的结点的学生学号不为所要的学生学号
                        {
                                p2->next=p1;                           //将p2移动到下一个结点
                                p1=p1->next;                           //将p1移动到下一个结点
                        }
                        else                                                  //当p1指向的结点的学生学号尾所要的学生学号
                        {
                                p2->next=p1->next;                  //删除该结点
                                       break;                                       //跳出循环
                        }
                }
        }
        leading(head);                                                   // 将删除后的链表重新导入文件的函数
}

void change()                                                      //修改学生信息
{
        unsigned i;                                       
        struct student *head,*p1;                              //声明两个指向结构体的指针
        p1=sense();                                                 //将从文件中读取到学生信息的链表表头指针赋给p1   
        head=p1;                                                     //将p1赋给head
        printf("请输入要修改的学生的学号:");
        scanf("%u",&i);                                    
        while(p1->number!=i && p1->next!=NULL)            //当结点的学号不为输入的 i 且该节点不为尾结点时
        {
                p1=p1->next;                                                 //移动到下一结点
        }
        if(p1->next==NULL)                                                //如果移动到了尾节点
        {
                printf("该学号不存在,请重新输入!!!");            
        }
        else                                                                          //如果找到对应所要寻找的学生信息的结点
        {
                printf("请重新输入该学生的成绩信息:");                  //修改该学生的信息
                printf("数学成绩:");
                scanf("%d",&Math);
                printf("英语成绩:");
                scanf("%d",&English);
                printf("体育成绩:");
                scanf("%d",&Sport);
                printf("计算机成绩:");
                scanf("%d",&Computer);
                printf("录入时间;");
                scanf("%.2f",&Time);
                p1->math=Math;
                p1->english=English;
                p1->sport=Sport;
                p1->computer=Computer;
                p1->time=Time;
        }
        leading(head);                                                       // 将修改后的链表重新导入文件的函数
}

void count()
{
        struct student *p;
        int n,m,e,s,c,toalmath,toalenglish,toalsport,toalcomputer,passmath,passenglish,passsport,passcomputer;
        n=m=e=s=c=0;
        p=sense();
        do
        {
                toalmath+=p->math;
                if(p->math>60)
                {
                        passmath+=p->math;
                        m++;       
                }
                toalenglish+=p->english;
                if(p->english>30)
                {
                        passenglish+=p->english;
                        e++;
                }
                toalsport+=p->sport;
                if(p->sport>60)
                {
                        passsport+=p->sport;
                        s++;
                }
                toalcomputer+=p->computer;
                if(p->computer>60)
                {
                        passcomputer+=p->computer;
                        c++;
                }
                n++;
                p=p->next;
        }while(p);
        printf("学生成绩平均分为:%d\n",(toalmath+toalenglish+toalsport+toalcomputer)/n);
        printf("各科及格情况:数学及格人数为%d,英语及格人数为%d,体育及格人数为%d,计算机及格人数为%d\n",m,e,s,c);
        printf("各科平均分情况:数学平均分为%d,英语平均分为%d,体育平均分为%d,计算机平均分为%d\n",toalmath/n,toalenglish/n,
                        toalsport/n,toalcomputer/n);
        printf("各科目及格率情况:数学及格率为%.2f,英语及格率为%.2f,体育及格率为%,2f,计算机及格率为%.2f\n",m/n,e/n,s/n,c/n);
        high();
        fail();
}

void high()
{
        struct student *p1,*p2,*p3,*p4;
        int highmath,highenglish,highsport,highcomputer;
        char creat1[10],creat2[10],creat3[10],creat4[10];
        p1=p2=p3=p4=sense();
        highmath=p1->math;
        while(p1->next!=NULL)
        {
                p1=p1->next;
                if(p1->math>highmath)
                {
                        highmath=p1->math;
                        creat1[10]=p1->name[10];
                }
        }
        highenglish=p2->english;
        while(p2->next!=NULL)
        {
                p2=p2->next;
                if(p2->english>highenglish)
                {
                        highenglish=p2->english;
                        creat2[10]=p2->name[10];
                }
        }
        highsport=p3->sport;
        while(p3->next!=NULL)
        {
                p3=p3->next;
                if(p3->sport>highsport)
                {
                        highsport=p3->sport;
                        creat3[10]=p3->name[10];
                }
        }
        highcomputer=p4->computer;
        while(p4->next!=NULL)
        {
                p4=p4->next;
                if(p4->computer>highcomputer)
                {
                        highcomputer=p4->computer;
                        creat4[10]=p4->name[10];
                }
        }
        printf("数学最高分的学生是%s,成绩为%d\n",creat1[10],highmath);
        printf("英语最高分的学生是%s,成绩为%d\n",creat2[10],highenglish);
        printf("体育最高分的学生是%s,成绩为%d\n",creat3[10],highsport);
        printf("计算机最高分的学生是%s,成绩为%d\n",creat4[10],highcomputer);
}

void fail()
{
        struct student *p1,*p2,*p3,*p4;
        p1=p2=p3=p4=sense();
        printf("数学不及格的学生:");
        while(p1->next!=NULL)
        {
                if(p1->math<60)
                {
                        printf("%s ",p1->name);
                }
                p1=p1->next;
        }
        printf("\n");
        printf("英语不及格的学生:");
        while(p2->next!=NULL)
        {
                if(p2->english<60)
                {
                        printf("%s ",p2->name);
                }
                        p2=p2->next;
        }
        printf("\n");
        printf("体育不及格的学生:");
        while(p3->next!=NULL)
        {
                if(p3->sport<60)
                {
                        printf("%s ",p3->name);
                }
                p3=p3->next;
        }
        printf("\n");
        printf("计算机不及格的学生:");
        while(p4->next!=NULL)
        {
                if(p4->computer<60)
                {
                        printf("%s ",p4->name);
                }
                p4=p4->next;
        }
        printf("\n");
}

void leading(struct student *head)
{
        struct student *p;                                 //声明一个指向结构体的指针
        p=head;                                               //将链表头指针赋给p      
        FILE *fp=fopen("D:\\student","wt+");     //以重写的形式打开文件  
        if(fp==NULL)
        {
                perror("fopen");
                exit(0);
        }
        else
        {
                while(p!=NULL)
                {
                        fprintf(fp,"%u %s %d %d %d %d %2.2f\n",                                            //将学生信息写入文件
                        p->number,p->name,p->math,p->english,p->sport,p->computer,p->time);
                        p=p->next;
                }
        }
        printf("该学生信息已删除.\n");
        fclose(fp);
}

void rankingmath(int a)
{
        int i,tmp;
        int n=0;
        int rank=0;
        struct student *head,*p,*p1,*p2;
        head=p=sense();
        p1=head->next;
        p2=head;
        while(p)
        {
                n++;
                p=p->next;
        }
        for(i=1;i<n;i++)
        {
                while(p1!=NULL)
                {
                        if(p2->math<p1->math)
                        {
                                tmp=p1->math;
                                p1->math=p2->math;
                                p2->math=tmp;
                        }
                        p1=p1->next;
                }
                p2=p2->next;
                p1=p2->next;
        }
        if(head->math==a)
        {
                printf("数学排名为1 ");
        }
        else
        {
                while(head->math!=a)
                {
                        rank++;
                        head=head->next;
                }
                printf("数学排名为:%d ",rank+1);
        }
}

void rankingenglish(int a)
{
        int i,tmp;
        int n=0;
        int rank=0;
        struct student *head,*p,*p1,*p2;
        head=p=sense();
        p1=head->next;
        p2=head;
        while(p)
        {
                n++;
                p=p->next;
        }
        for(i=1;i<n;i++)
        {
                while(p1!=NULL)
                {
                        if(p2->english<p1->english)
                        {
                                tmp=p1->english;
                                p1->english=p2->english;
                                p2->english=tmp;
                        }
                        p1=p1->next;
                }
                p2=p2->next;
                p1=p2->next;
        }
        if(a==head->english)
        {
                printf("英语排名为:1 ");
        }
        else
        {
                while(head->english!=a)
                {
                        rank++;
                        head=head->next;
                }
                printf("英语排名为:%d ",rank+1);
        }
}
void rankingsport(int a)
{
        int i,tmp;
        int n=0;
        int rank=0;
        struct student *head,*p,*p1,*p2;
        head=p=sense();
        p1=head->next;
        p2=head;
        while(p)
        {
                n++;
                p=p->next;
        }
        for(i=1;i<n;i++)
        {
                while(p1!=NULL)
                {
                        if(p2->sport<p1->sport)
                        {
                                tmp=p1->sport;
                                p1->sport=p2->sport;
                                p2->sport=tmp;
                        }
                        p1=p1->next;
                }
                p2=p2->next;
                p1=p2->next;
        }
        if(a==head->sport)
        {
                printf("体育排名为:1 ");
        }
        else
        {
                while(head->sport!=a)
                {
                        rank++;
                        head=head->next;
                }       
                printf("体育排名为:%d ",rank+1);
        }
}
void rankingcomputer(int a)
{
        int i,tmp;
        int n=0;
        int rank=0;
        struct student *head,*p,*p1,*p2;
        head=p=sense();
        p1=head->next;
        p2=head;
        while(p)
        {
                n++;
                p=p->next;
        }
        for(i=1;i<n;i++)
        {
                while(p1!=NULL)
                {
                        if(p2->computer<p1->computer)
                        {
                                tmp=p1->computer;
                                p1->computer=p2->computer;
                                p2->computer=tmp;
                        }
                        p1=p1->next;
                }
                p2=p2->next;
                p1=p2->next;
        }
        if(a==head->computer)
        {
                printf("计算机排名为:1 ");
        }
        else
        {
                while(head->computer!=a)
                {
                        rank++;
                        head=head->next;
                }
                printf("计算机排名为:%d ",rank+1);
        }
}

一个学生管理系统,里面有写入,删除,查询,修改学生信息的功能,不过不知道为什么,我不能进行修改与删除,希望有大佬帮我看一下我里面进行信息查询的change函数和del函数,现在调用到它就给我显示文件不存在。
最佳答案
2018-12-9 16:39:01
void leading(struct student *);  函数里打开文件 FILE *fp=fopen("D:\\student","wt+");     //以重写的形式打开文件  
冒号是中文里的冒号。这种文件名建议#define FileName "D:\\student".
屏幕截图(205).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-12-4 12:25:55 | 显示全部楼层
各位大佬帮忙看一下鸭,不要沉了,看一下change函数有什么毛病就好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-8 23:54:08 | 显示全部楼层
真地没人理我吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-9 11:17:59 | 显示全部楼层
没有注释,看的欲望就....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-9 14:51:18 | 显示全部楼层
南宫漠月 发表于 2018-12-9 11:17
没有注释,看的欲望就....

兄嘚,你看现在注释得怎么样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-9 16:39:01 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +5 鱼币

void leading(struct student *);  函数里打开文件 FILE *fp=fopen("D:\\student","wt+");     //以重写的形式打开文件  
冒号是中文里的冒号。这种文件名建议#define FileName "D:\\student".
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-10 16:15:47 | 显示全部楼层
百里狂生 发表于 2018-12-9 16:39
void leading(struct student *);  函数里打开文件 FILE *fp=fopen("D:\\student","wt+");     //以重写的 ...

谢谢兄嘚,我还是太年轻了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 00:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表