鱼C论坛

 找回密码
 立即注册
查看: 1419|回复: 1

按性别进行统计、各成绩的排序,作业今天要交,酬劳私聊

[复制链接]
发表于 2021-2-27 20:20:09 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 时而动摇 于 2021-2-28 10:20 编辑

//学生成绩管理系统
//需要自己建一个名为Information的txt文件来存储数据
//txt文件与cpp文件路径相同
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define LEN sizeof(struct student)
#include <windows.h>
//学生信息结构体
struct student
{
        char name[10];//学生姓名
        char id[15];//学生学号
        char sex[5];//学生性别
               float score[3];//学生三科成绩
        float Total;//总分
                float Ave;//平均分
                struct student *next;
};

typedef struct student stu;

//声明函数
stu* enter(stu *h);//成绩录入函数
stu* initialize();//初始化链表头函数
void menu();//菜单
void print(stu *h);//成绩打印函数
void modify(stu *h);//成绩修改函数
void statistics(stu *h);//查找统计信息
void del(stu *h);//删除函数
void sortEglish(stu *h);//排序函数,用于对英语成绩排序
void sortmath(stu *h);//排序函数,用于对数学成绩排序
void sortcomputer(stu *h);//排序函数,用于对计算机成绩排序
void sortTotal(stu *h);//排序函数,用于对总成绩排序
void quit(stu *h);//退出函数
void save(stu *h);//保存文件函数
void open(stu *h);//打开文件读取信息建立链表函数


//主函数
int main()
{
        stu *data;//指向链表头,建立成绩链表,所有学生信息存放 在此链表
        int function;//功能选项
        char flag;//判断变量
        int t=0;
        data=initialize();//初始化头结点
        open(data);//读取文件内的数据,并建立链表
        while(1)
        {
                menu();//打开菜单
                printf("请选择操作:");
                scanf("%d",&function);//输入你想要实现的功能
                switch(function)//构建多个功能分支
                {
                        case 1:while(1)
                        {
                                enter(data);//输入一个数据并连接在链表的后面
                                printf("是否继续输入(y/n)");
                                scanf("%s",&flag);
                                if(flag=='N'||flag=='n')break;
                        }system("cls");break;
                        case 2:print(data);_getch();system("cls");break;
                        case 3:modify(data);system("cls");break;
                        case 4:statistics(data);_getch();system("cls");break;
                        case 5:del(data);_getch();system("cls");break;
                        case 6:sortmath(data);system("cls");break;
                                                case 7:sortEglish(data);system("cls");break;
                                                case 8:sortcomputer(data);system("cls");break;
                                                case 9:sortTotal(data);system("cls");break;
                                                case 10:quit(data);break;
                                                default:printf("error!!!请重新输入:");
                        break;
                                 }//switch结束
        }
        return 0;
}
                                                
//系统界面显示
void menu()
{
        printf("          ***********************************************             \n");
        printf("            **********学生成绩管理系统*****************               \n");
        printf("          ***********************************************             \n");
        printf("                       1.录入和添加成绩                               \n");
        printf("                       2.输出成绩                                     \n");
        printf("                       3.修改成绩                                     \n");
        printf("                       4.查找学生信息                                 \n");
        printf("                       5.删除学生信息                                 \n");
        printf("                       6.数学成绩排序                                 \n");
                printf("                       7.英语成绩排序                                 \n");
                printf("                       8.计算机成绩排序                               \n");
            printf("                       9.总成绩排序                                   \n");
                printf("                       10.退出系统并保存                              \n");
        printf("          ***********************************************             \n");
}

//初始化头节点函数
stu* initialize()
{
        stu *head;
        head=(stu*)malloc(LEN);
        if(head==NULL)
        {
                printf("error!");
                exit(1);
        }
        head->next=NULL;//使头结点指针域为空
        return head;
}



//成绩录入
stu* enter(stu *h)
{
        stu *p,*q=h;
        char name[10],id[15],sex[5];
        int math, English,computer;
        p=(stu*)malloc(LEN);//为学生信息申请节点
        printf("请依次输入学生信息:\n");
        printf("姓名 学号 性别 数学 英语 计算机\n");
        scanf("%s %s %s %d %d %d",name,id,sex,&math,&English,&computer);
        
        for(;q->next!=NULL;q=q->next){;}//移动到尾结点

//将输入的内容赋值给链表中的相应位置
        strcpy(p->name,name);
        strcpy(p->id,id);
        strcpy(p->sex,sex);
        p->score[0]=math;
        p->score[1]=English;
        p->score[2]=computer;//赋值完毕
        p->Total = p->score[0]+ p->score[1]+p->score[2];        //计算总分
                p->Ave = p->Total / 3.0f;        //计算平均分
                //移动指针
        p->next=NULL;
        q->next=p;
        q=p;
        return h;
}


//成绩打印
void print(stu *h)
{
        stu *p=h->next;//从头结点之后的结点开始输出
        printf("%-15s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","学号","姓名","性别","数学","英语","计算机","总分","平均分");//左对齐的方式输出
        while(p!=NULL)//输出链表的全部内容
        {
                printf("%-15s%-10s%-10s%-10d%-10d%-10d%-10d%-10d\n",p->id,p->name,p->sex,p->score[0],p->score[1],p->score[2],p->Total,p->Ave);
                p=p->next;
        }
}



//成绩修改
void modify(stu *h)
{
        stu *p=h->next;
        char name[10],id[15],sex[5];
        int math,English,computer;
        printf("请输入学生学号:");
        scanf("%s",id);
        
        while(p)
        {
                if(strcmp(p->id,id)==0)
                {
                        printf("当前学生信息:\n");
                        printf("%-15s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","学号","姓名","性别","数学","英语","计算机","总分","平均分");
                        printf("%-15s%-10s%-10s%-10d%-10d%-10d%-10d%-10d\n",p->id,p->name,p->sex,p->score[0],p->score[1],p->score[2],p->Total,p->Ave);
                        printf("请输入更正后的数学成绩:");
                        scanf("%d",&math);
                        printf("请输入更正后的英语成绩:");
                        scanf("%d",&English);
                        printf("请输入更正后的计算机成绩:");
                        scanf("%d",&computer);
                        p->score[0]=math;
                        p->score[1]=English;
                        p->score[2]=computer;
                        p->Total = p->score[0]+ p->score[1]+p->score[2];
                                                p->Ave = p->Total / 3.0f;
                        printf("更改完成!\n");
                        system("pause");
                        break;
                }
                else
                {
                        p=p->next;
                }
        }//while循环结束
}


//查询统计
void statistics(stu *h)
{
        while(1)
        {
        int z;//选项变量
        system("cls");//清屏
        printf("请输入查找方式:\n11.按学号查找\n.12退出\n") ;
        scanf("%d",&z);
        system("cls");
        switch(z)
        {
                case 11:{
                        stu *p=h->next;
                char name[10],id[15],sex[5];
                printf("请输入学生学号:");
                scanf("%s",id);
                 while (p)
            {
                     if(strcmp(p->id,id)==0)//比较学号
                    {
                        printf("当前学生信息:\n");
                        printf("%-15s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","学号","姓名","性别","数学","英语","计算机","总分","平均分");
                        printf("%-15s%-10s%-10s%-10d%-10d%-10d%-10d%-10d\n",p->id,p->name,p->sex,p->score[0],p->score[1],p->score[2],p->Total,p->Ave);
                        break;
                    }
                    else
                    {
                        p=p->next;
                    }
                }//while循环结束
                }system("pause");system("cls");break;
               
                case 12:goto label1;//跳出双重循环
                default:break;
        }
    }
    label1:printf("已退出\n");
}



//删除函数
void del(stu *h)
{
        stu *p=h,*q;
        q=p->next;
        char id[15];
        printf("请输入学生学号:");
        scanf("%s",id);
        while(q)
        {
                if(strcmp(q->id,id)==0)
                {
                        p->next=q->next;
                        free(q);//删除p结点
                        printf("删除成功\n");
                        break;
                }
                else
                {
                        p=p->next;
                        q=q->next;
                }
         }//while循环结束
}



//退出系统
void quit(stu *h)
{
        save(h);//退出时保存信息
        exit(0);
}



//打开文件
void open(stu *h)
{
        stu *p=h;
        stu *q;//临时变量,用于保存从文件中提取的信息
        FILE*file=fopen("./Information.txt","rb");
        if(!file)
        {
                printf("文件打开失败!");
                return ;
        }
        
        
        q=(stu*)malloc(LEN);//开辟内存
        fread(q,LEN,1,file);//进入循环前先读取一个结点
        while(!feof(file))//判断是否到达文件结尾,如果没有就进入或继续循环
        //否则,就绕过或结束循环
        {
                //代码执行到这里,说明没有到达文件结尾,本次读取的节点数据有效
                p->next=q;//更新链表数据,把新的节点纳入链表
                p=q;//更新链表数据,把新的节点纳入链表
                q=(stu*)malloc(LEN);//分配内存,准备读取下一个结点
                fread(q,LEN,1,file);//读取下一个结点,执行完此句,返回到while循环入口
        }//while循环结束
         
        p->next=NULL;//使尾结点指向空,结束链表
        fclose(file);
}


//保存信息到文件中
void save(stu *h)
{
        stu *p=h->next;
        int flag;
        FILE *file=fopen("./information.txt","wb");
        if(!file)
        {
                printf("文件打开失败!");
                return ;
        }
        while (p!=NULL)
        {
                flag=fwrite(p,LEN,1,file);//依次将p所指向的链表中的内容写入到文件中
                if(flag!=1)
                {
                        break;
                }
                p=p->next;
        }
        fclose(file);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-2-27 20:26:20 | 显示全部楼层
#include<stdio.h>
#include<malloc.h>
struct Node{
        int data;
        Node *next;
};
int createlist(Node **p,int i);
int pop_sort(Node *p);
int main()
{
        int i=0;
        Node *p,*head,*ph;
//        head = (Node*)malloc(sizeof(Node)); //如果传入指针需要先在此分配空间
        createlist(&head,5);
        ph=head;
        pop_sort(head);
        while(head->next)
        {
        //        printf("... ");
                printf("%d ",head->next->data);
                head=head->next;
        }
        
        free(ph);
        ph=NULL;
        return 0;
}
int createlist(Node **p,int i)    //此处头指针还没分配空间,需要传入指针地址;如果已分配空间,可以传入
{
        Node *pp,*temp;
        int j;
        int k;
        *p=(Node*)malloc(sizeof(Node));
        temp=*p;       //此处需要临时变量,防止传入指针值被修改
        for(j=0;j<i;j++)    //也可采用递归,递归调用 createlist(p->next,i) 来创建链表
        {
                pp = (Node*)malloc(sizeof(Node));
                scanf("%d",&k);
                pp->data=(k);
               
                temp->next=pp;
                temp=pp;
        }
         temp->next= NULL;
        return 0;
}
int pop_sort(Node *head)   //链表冒泡排序,节点交换法(还有换值法);传入头节点指针
{                                                        //排序中没有修改头节点指针值,只是修改指针内容head->next的值
        Node *pre,*p,*tail,*temp;
        tail=NULL;
        pre=head;
        
        while((head->next->next)!=tail)//(head->next)!=tail同样适用 ,多执行最后一个步比较
        {
                p=head->next;
                pre=head;
                while(p->next!=tail)
                {
                        if((p->data)>(p->next->data))
                        {
                        /*        pre->next=p->next; //交换节点方法一
                                p->next = p->next->next;
                pre->next->next = p;
                p = pre->next; */
               
                pre->next=p->next; //交换节点方法二
                temp=p->next->next;
                p->next->next=p;
                p->next=temp;
                p=pre->next;  //p回退一个节点
               
                        }
                        p=p->next;  //p再前进一个节点
                        pre=pre->next;        
                }
                tail=p;
        }
        return 0 ;
}
附链表排序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 13:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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