c语言—结构体数组 解决 学生管理系统

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 20
int i =0;//全局变量,记录人数 
struct Student
{
    int num;
    char name[20];
    int c_score;
    int ps_score;
}s[N];

void mainMenu()//主菜单 
{
    printf("***********学生成绩管理系统************\n");
    printf("1--------------增加记录\n");
    printf("2--------------查询人数\n");
    printf("3--------------排序\n");
    printf("4--------------显示\n");
    printf("5--------------删除\n");
    printf("6--------------查询\n");
    printf("7--------------更新\n");
    printf("7--------------统计\n");
    printf("0--------------退出\n");
    printf("*****************************************\n");
    
}

void addStudent(struct Student *s)
{
    printf("请输入序号");
    scanf("%d",&s[i].num);
    
    printf("请输入姓名(20个字符,一个汉字占两个字符)");
    scanf("%s",&s[i].name);
    
    printf("请输入ps的成绩"); 
    scanf("%d",&s[i].ps_score);
    
    printf("请输入c语言成绩");
    scanf("%d",&s[i].c_score) ;
    
    printf("添加完成!\n");
    
    i++;
}

void getNumOfStudents()

    printf("总人数为:%d",i);
}


void show(struct Student *s)
{
    if(i != 0)
    {
        printf("学号\t姓名\tPS\tc语言\t\n");
        for(int n = 0;n<i;n++)
        {
            printf("%d\t",s[n].num);
            printf("%s\t",s[n].name);
            printf("%d\t",s[n].c_score);
            printf("%d\t",s[n].ps_score);
            printf("\n");
        }
    }
    else
    printf("系统中没有学生,请添加学生"); 
    
}


int searchId(struct Student *s,int id)
{
    
    
    for(int n =0 ; n< i; n++)
    {    
        if( s[n].num == s[id].num)
        {
            printf("!!!!"); 
            return n;
        } 
    }
    
    return -1; 
}

int searchName(struct Student *s,char name[])
{
    
    for(int n = 0 ;n<i ;n++)
    {
        if(strcmp(s[n].name,name) == 0)
        {
            return n;
        } 
        
    }
    return -1;
}
int searchPs(struct Student *s,int ps)
{
    
    for(int n =0 ;n< i;n++)
    {
        if( s[n].ps_score == ps)
        {
            return n;
        } 
        
    }
    return -1; 
    
}

int searchcC(struct Student *s,int c)
{
    
    for(int n =0 ;n< i;n++)
    {
        if( s[n].c_score == c)
        {
            return n;
        } 

     
    }
        return -1;
    
}

void searchMenu(struct Student *s)
{
    char ch;
    int num;
    char name[20]; 
    while(1)
    {
    printf("\n********查找子系统******\n");
    printf("1-------按C语言成绩查找\n");
    printf("2-------按数学成绩查找\n");
    printf("3-------按姓名查找\n"); 
    printf("4-------按学号查找") ;
    printf("0-------退出\n");
    printf("************************\n");
    
    switch(ch)
    {
        case '1':
            printf("请输入所要查找学生的C语言成绩:");
            scanf("%d",&num);
            
                printf("学号\t姓名\tPS\tc语言\t\n");
             
                printf("%d\t",s[searchcC(s,num)].num);
                printf("%s\t",s[searchcC(s,num)].name);
                printf("%d\t",s[searchcC(s,num)].c_score);
                printf("%d\t",s[searchcC(s,num)].ps_score);
        break;
        case '2':
            printf("请输入所要查找学生的高数成绩:");
            scanf("%d",&num);
            
                printf("学号\t姓名\tPS\tc语言\t\n");
             
                printf("%d\t",s[searchPs(s,num)].num);
                printf("%s\t",s[searchPs(s,num)].name);
                printf("%d\t",s[searchPs(s,num)].c_score);
                printf("%d\t",s[searchPs(s,num)].ps_score);
        break;
        case '3':
            printf("请输入所要查找学生的姓名:");
            scanf("%s",name);
            
                printf("学号\t姓名\tPS\tc语言\t\n");
                
                printf("%d\t",s[searchName(s,name)].num);
                printf("%s\t",s[searchName(s,name)].name);
                printf("%d\t",s[searchName(s,name)].c_score);
                printf("%d\t",s[searchName(s,name)].ps_score);
        break;
        case '4':
            printf("请输入所要查找学生的序号:");
            scanf("%d",&num);
            
                printf("学号\t姓名\tPS\tc语言\t\n");
             
                printf("%d\t",s[searchPs(s,num)].num);
                printf("%s\t",s[searchPs(s,num)].name);
                printf("%d\t",s[searchPs(s,num)].c_score);
                printf("%d\t",s[searchPs(s,num)].ps_score);
        break;
        case '0':
            return;
        break;
    }
     printf("\n"); 
    } 
}

int avg(struct Student *s,int n)
{
    float avg=0;
    avg=(s[n].ps_score+s[n].c_score)/2;
    return avg;
}
void avgStatistic(struct Student *s)
{
    int a = 0,b = 0,c = 0,d = 0,e=0;
    for(int k =0;k<i;k++)
    {
        if(avg(s,k)>=0&&avg(s,k)<=59)
        a++;
        else if(avg(s,k)<=69)
        b++;
        else if(avg(s,k)<=79)
        c++;
        else if(avg(s,k)<=89)
        d++;
        else if(avg(s,k)<=100)
        e++;
    
        
    }
        printf("90~100分人数:%d\n",e);
        printf("80~89分人数:%d\n",d);
        printf("70~79分人数:%d\n",c);
        printf("60~69分人数:%d\n",b);
        printf("0~59分人数:%d\n",a);
}

void psStatistic(struct Student *s)
{
    int a = 0,b = 0,c = 0,d = 0,e=0;
    for(int k =0;k<i;k++)
    {
        if(s[k].ps_score>=0&&s[k].ps_score<=59)
        a++;
        else if(s[k].ps_score<=69)
        b++;
        else if(s[k].ps_score<=79)
        c++;
        else if(s[k].ps_score<=89)
        d++;
        else if(s[k].ps_score<=100)
        e++;
        
    }
        printf("90~100分人数:%d\n",e);
        printf("80~89分人数:%d\n",d);
        printf("70~79分人数:%d\n",c);
        printf("60~69分人数:%d\n",b);
        printf("0~59分人数:%d\n",a);
        
}

void cStatistic(struct Student *s)
{
    int a = 0,b = 0,c = 0,d = 0,e=0;
    for(int k =0;k<i;k++)
    {
        if(s[k].c_score>=0&&s[k].c_score<=59)
        a++;
        else if(s[k].c_score<=69)
        b++;
        else if(s[k].c_score<=79)
        c++;
        else if(s[k].c_score<=89)
        d++;
        else if(s[k].c_score<=100)
        e++;
        
}
        printf("90~100分人数:%d\n",e);
        printf("80~89分人数:%d\n",d);
        printf("70~79分人数:%d\n",c);
        printf("60~69分人数:%d\n",b);
        printf("0~59分人数:%d\n",a);
}

void statisticsMenu(struct Student *s)
{
    char ch;
//    int num;
    while(1)
    {
    printf("\n********统计子系统******\n");
    printf("1-------按平均分统计\n");
    printf("2-------按数学成绩统计\n");
    printf("3-------按C语言成绩统计\n"); 
    printf("0-------退出\n");
    printf("************************\n");
    printf("请输入选项(0~3):");    
    scanf(" %c",&ch);
    
    switch(ch)
    {
        case '1':avgStatistic(s);break;
        case '2':psStatistic(s);break;
        case '3':cStatistic(s);break;
        case '0':return;break;
        default:printf("输入错误,请重新输入!");break; 
    }
     printf("\n"); 
    }
}
int Sum(struct Student *s,int n)
{
    int sum=0;
    sum = s[n].c_score+s[n].ps_score;
    return sum;
}

void sumSort(struct Student *s)
{
    for(int j = 0;j<i-1;j++)
    {
        int min =j;
        for(int k = j+1; k < i ; k++  )    
        {
            if(Sum(s,k)<Sum(s,min))
            min=k;
            
        }
        if(min!=j)
        {

            int t = s[min].num    ;
            s[min].num =s[j].num;
            s[j].num = t;

            
            
            t = s[min].c_score    ;
            s[min].c_score =s[j].c_score;
            s[j].c_score = t;
            
            t = s[min].ps_score    ;
            s[min].ps_score =s[j].ps_score;
            s[j].ps_score = t;
            
            char name[20];
            strcpy(name,s[min].name);
            strcpy(s[min].name,s[j].name);
            strcpy(s[j].name , name);

        }    
    }
    printf("排序完成\n"); 

void psSort(struct Student *s)
{
    for(int j = 0 ;j<i-1;j++)
    {
        for(int k = 0;k<i-1-j;k++)
        {
            if(s[k].ps_score>s[k+1].ps_score)
            {
            int t = s[k].num    ;
            s[k].num =s[k+1].num;
            s[k+1].num = t;
            
            t = s[k].c_score    ;
            s[k].c_score =s[k+1].c_score;
            s[k+1].c_score = t;
            
            t = s[k].ps_score    ;
            s[k].ps_score =s[k+1].ps_score;
            s[k+1].ps_score = t;
            
            char name[20];
            strcpy(name,s[k].name);
            strcpy(s[k].name,s[k+1].name);
            strcpy(s[k+1].name , name);
            }
        }
    
        
            
    }
    printf("排序完成\n"); 
}


void nameSort(struct Student *s)
{
    for(int j = 0;j<i-1;j++)
    {
        int min =j;
        for(int k = j+1 ; k < i ;k++  )    
        {
            if(strcmp(s[k].name,s[min].name < 0))
            min=k;
        }
        
        if(min!=j)
        {
            int t = s[min].num;
            s[min].num =s[j].num;
            s[min].num = t;
            
            t = s[min].c_score;
            s[min].c_score =s[j].c_score;
            s[min].c_score = t;
            
            t = s[min].ps_score;
            s[min].ps_score =s[j].ps_score;
            s[min].ps_score = t;
            
            char name[20];
            strcpy(name,s[min].name);
            strcpy(s[min].name,s[j].name);
            strcpy(s[j].name , name);
        }    
    }
    printf("排序完成\n"); 
}


void sortMenu(struct Student *s)
{
    char ch;
    while(1)
    {
    printf("\n********排序子系统******\n");
    printf("1-------按总成绩选择排序\n");
    printf("2-------按PS成绩冒泡排序\n");
    printf("3-------按姓名选择排序\n"); 
    printf("0-------退出\n");
    printf("************************\n");
    printf("请输入选项(0~3):");    
    scanf(" %c",&ch);    
    
    switch(ch)
    {
        case '1':sumSort(s);break;
        case '2':psSort(s);break;
        case '3':nameSort(s);break;
        case '0':return ;break;
        default:printf("输入错误,请重新输入!\n"); 
    }
    
    }

void idDelete(struct Student *s,int n)//n表示所要查找id的数组序号 
{

    for(int k=n-1;k<i-1;k++)
    {
        s[k].num = s[k+1].num;
        s[k].c_score = s[k+1].c_score;
        s[k].ps_score = s[k+1].ps_score;
        strcpy(s[k].name,s[k+1].name);
    }
    i--;    

void nameDelete(struct Student *s,int n)
{
    for(int k=n;k<i-1;k++)
    {
        s[k].num = s[k+1].num;
        s[k].c_score = s[k+1].c_score;
        s[k].ps_score = s[k+1].ps_score;
        strcpy(s[k].name,s[k+1].name);
    }
    i--;
}


void DeleteMenu(struct Student *s)
{
    char ch;
    
    int id;
    char name[20];
    while(1)
    {
    printf("\n********删除子系统******\n");
    printf("1-------按Id删除\n");
    printf("2-------按姓名删除\n");
    printf("0-------退出\n");
    printf("************************\n");
    printf("请输入选项(0~2):");    
    scanf(" %c",&ch); 
    
    switch(ch)
    {
        case '1':
        printf("请输入你要删除信息学生的学号:");
        scanf("%d",&id);
        
        
        if(searchId(s,id) != -1)
        {
            idDelete(s,searchId(s,id));
            printf("删除完成!\n");
        }
        else
        printf("当前系统中没有学生,请选择添加学生\n");

        
        break;
        
        case '2':
        printf("请输入你要删除信息学生的名字:");
        scanf("%s",name);
        if(searchName(s,name) != -1)
        {
            nameDelete(s,searchName(s,name));
            printf("删除完成!\n");
        }
        else
        printf("当前系统中没有学生,请选择添加学生\n");
        
        break;
        
        case '0':return;break;
        default:printf("输入错误,请重新输入!");
        
        printf("删除完成!\n");
        break;
        
        
    }
    printf("\n"); 
    }
}

void nameUpdate(struct Student *s,int id)
{
    for(int k = 0;k<i;k++)
    {
        if(id == s[k].num)
        {
            printf("更新前\n");
            printf("学号\t姓名\tPS\tC语言\t\n");
            printf("%d\t",s[k].num);
            printf("%s\t",s[k].name);
            printf("%d\t",s[k].ps_score);
            printf("%d\t",s[k].c_score);
            
            printf("\n请输入更新后的姓名:");
            scanf("%s",&s[k].name);
            
            printf("更新后\n");
            printf("学号\t姓名\tPS\tC语言\t\n");
            printf("%d\t",s[k].num);
            printf("%s\t",s[k].name);
            printf("%d\t",s[k].ps_score);
            printf("%d\t",s[k].c_score);
        }
        break;    }
}

void psUpdate(struct Student *s,int id)
{
    for(int k = 0;k<i;k++)
    {
        if(id == s[k].num)
        {
            printf("更新前\n");
            printf("学号\t姓名\tPS\tC语言\t\n");
            printf("%d\t",s[k].num);
            printf("%s\t",s[k].name);
            printf("%d\t",s[k].ps_score);
            printf("%d\t",s[k].c_score);
            
            printf("\n请输入更新后的Ps的成绩:");
            scanf(" %d",&s[k].ps_score);
            
            printf("更新后\n");
            printf("学号\t姓名\tPS\tC语言\t\n");
            printf("%d\t",s[k].num);
            printf("%s\t",s[k].name);
            printf("%d\t",s[k].ps_score);
            printf("%d\t",s[k].c_score);
        }
        break;
    }
}

void cUpdate(struct Student *s,int id)
{
    for(int k = 0;k<i;k++)
    {
        if(id == s[k].num)
        {
            printf("更新前\n");
            printf("学号\t姓名\tPS\tC语言\t\n");
            printf("%d\t",s[k].num);
            printf("%s\t",s[k].name);
            printf("%d\t",s[k].ps_score);
            printf("%d\t",s[k].c_score);
            
            printf("\n请输入更新后的c语言成绩是:");
            scanf(" %d",s[k].c_score);
            
            printf("更新后\n");
            printf("学号\t姓名\tPS\tC语言\t\n");
            printf("%d\t",s[k].num);
            printf("%s\t",s[k].name);
            printf("%d\t",s[k].ps_score);
            printf("%d\t",s[k].c_score);
        }
        break;
    }
}

void updateMenu(struct Student *s)
{
    char ch;
    int id;
    while(1)
    {
    printf("\n********更新子系统******\n");
    printf("1-------更新姓名\n");
    printf("2-------更新PS成绩\n");
    printf("3-------更新C语言成绩\n");
    printf("0-------退出\n");
    printf("************************\n");
    printf("请输入选项(0~3):");    
    scanf(" %c",&ch); 
    if(ch !='0')
    {
        printf("请输入待更新学生的学号:");
        scanf("%d",&id);
    }
    
    
    switch(ch)
    {
        case '1': nameUpdate(s,id);break;
        case '2': psUpdate(s,id);break;
        case '3': cUpdate(s,id);break;
        case '0':return ;break;
        default:printf("输入错误,请重新输入!");break;
    }
    printf("\n"); 
    }
}


void store()
{
    printf("") 

void read()
{
    
}


int main()
{
    char select;
    while(1)
    {
    mainMenu();
    printf("请输入(0~5):");
    scanf(" %c",&select);//这里加空格,表示可以省略一切空字符 
    
    switch(select)
    {
        case '1':addStudent(s);break;
        case '2':getNumOfStudents();break;
        case '3':sortMenu(s);break;
        case '4':show(s);break;   
        case '5':DeleteMenu(s);break;
        case '6':searchMenu(s);break;
        case '7':updateMenu(s);break;
        case '8':statisticsMenu(s);break;  
        case 's':store();break;
        case 'r':read();break;
        case '0':exit(0);break;
        default:printf("输入错误!");break;
         
    }
    printf("\n");
    
    }
}
    
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值