标题:关于结构体的学生管理系统
只看楼主
育帝
Rank: 2
来 自:黑龙江哈尔滨
等 级:论坛游民
帖 子:75
专家分:43
注 册:2016-10-16
结帖率:87.5%
已结贴  问题点数:10 回复次数:10 
关于结构体的学生管理系统



#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define PASS 123
int i,j;
struct student
{
    int num;
    char name[11];
    char sex[5];
    int age;
    double score[5];
    double total;
};
typedef struct student ST;
//void menu(ST *st,int tail);//菜单
//int  password();//密码
void type(ST *st,int tail);//录入
void query(ST *st,int tail);//输出
void chart(ST *st,int tail);//排行榜
//void check(ST *st,int *prt);//查询
//void Del(ST *st,int *prt);//删除
int main()
{
    ST *st;
    int tail=5,*prt;
    prt=&tail;
    st=(ST*)malloc(tail*sizeof(ST));
    printf("请输入学生管理系统的密码\n");
         type(st,tail);
       query(st,tail);

       chart(st,tail);
       //check(st,&tail);
       //Del(st,&tail)  ;
    //if (password())

}



/*void menu(ST *st,int tail)//菜单
{
    int n;
    int flag=1;
    while(flag){
    printf("\n1------成绩录入\n");
    printf("2------成绩输出\n");
    printf("3------排行榜\n");
    printf("4------查询\n");
    printf("5------删除\n");
    printf("6------退出\n");
    scanf("%d",&n);
    system("cls");
    switch(n)
    {
        case 1:type(st,&tail);break;
        case 2:query(st,&tail);break;
        case 3:chart(st,&tail);break;
        case 4:check(st,&tail);break;
        case 5:Del(st,&tail)  ;break;
        case 6:flag=0;break;
    }
    }
}*/
/*
int  password()//密码
{
    int pass,n = 3;
    char ch;
    do
    {
        pass = 0;
        for (i = 1; (i <= 6) && ((ch = getch()) != '\r');i++)
        {
               putcha*prtr('*');
               pass = pass * 10 + ch - '0';
        }
        if (pass == PASS)
            break;
        else
        {
            n--;
                printf("密码错误,还有%d次机会!\n", n);
        }
    } while (n>0);
    if (pass == PASS)
        return 1;
    else
        return 0;
}*/

void type(ST *st,int tail)//录入
{
    printf("请依次录入学生的:\n");
    printf("  学号    姓名   性别   年龄     高数   线代    英语    C语言   军理\n");
    for(i=0;i<tail;i++){
        scanf("%d%s%s%d",&st[i].num,st[i].name,st[i].sex,&st[i].age);
    for(j=0;j<5;j++)
        scanf("%lf",&st[i].score[j]);
    }
}
void query(ST *st,int tail)//输出
{
    for(i=0;i<tail;i++)
     st[i].total=0;
     for(i=0;i<tail;i++)
     for(j=0;j<5;j++)
     st[i].total+=st[i].score[j];
   printf("  学号   | 姓名  |性别 | 年龄  |  高数 | 线代  | 英语  | C语言 | 军理   |  总成绩  |\n");
   printf("____________________________________________________________________________________\n");
    for(i=0;i<tail;i++){
        printf("%d | %s  | %s  |  %d",st[i].num,st[i].name,st[i].sex,st[i].age);
    for(j=0;j<5;j++)
        printf("   | %.1lf",st[i].score[j]);
        printf("    |  %.1lf    |",st[i].total);
        printf("\n____________________________________________________________________________________\n");
    }
}
void chart(ST *st,int tail)//排行榜
{
     int z,k;
     ST temp;

     for(k=0;k<tail-1;k++)
        for(z=0;z<tail-k;z++)
        if(st[z].total<st[z+1].total){
        temp=st[z];
        st[z]=st[z+1];
        st[z+1]=temp;
        }
       printf("  学号   | 姓名  |性别 | 年龄  |  高数 | 线代  | 英语  | C语言 | 军理   |  总成绩  |\n");
   printf("____________________________________________________________________________________\n");
    for(i=0;i<tail;i++){
        printf("%d | %s  | %s  |  %d",st[i].num,st[i].name,st[i].sex,st[i].age);
    for(j=0;j<5;j++)
        printf("   | %.1lf",st[i].score[j]);
        printf("    |  %.1lf    |",st[i].total);
        printf("\n____________________________________________________________________________________\n");
    }
}
/*
void check(ST *st,int *prt)//查询
{
    bool flag=0;
    int k=3;
    char ch;
    int Student_NO;
    do
    {
        flag=1;
        printf("请输入要查询的学号:");
        scanf("%d",&Student_NO);
    for(i=0;i<(*prt)&&flag;){
    if(Student_NO==st[i].num){
        printf("  学号    姓名   性别   年龄    高数    线代    英语    C语言   军理      总成绩\n");
       printf("%d  %s   %s     %d ",st[i].num,st[i].name,st[i].sex,st[i].age);
      for(j=0;j<5;j++)
        printf("     %.1lf",st[i].score[j]);
        printf("        %.1lf",st[i].total);
        printf("\n");
        flag=0;
    }
    else
        i++;
     }
    if(i==(*prt)){
        printf("此人不存在!\n你还剩余查错机会(%d)\n",k);
        k--;
        flag=0;
    }

        printf("是否继续查询(y/任意键退出(except\"y\")\n");
        getchar();
        scanf("%c",&ch);
    if(ch=='y')
        flag=0;
    else if(ch=='n')
        flag=1;
        else flag=1;
}while(flag==0&&k>=0);
}
void Del(ST *st,int *prt)//删除
{
    int id;
    int flag=1;
    printf("请输入要删除学生的学号(每次仅限删除一个学生信息):\n");
    scanf("%d",&id);
    printf("你删除的学生信息为:\n");
    for(i=0;i<(*prt)&&flag;){
    if(id==st[i].num){
        printf("  学号    姓名   性别   年龄    高数    线代    英语    C语言   军理      总成绩\n");
       printf("%d  %s   %s     %d ",st[i].num,st[i].name,st[i].sex,st[i].age);
      for(j=0;j<5;j++)
        printf("     %.1lf",st[i].score[j]);
        printf("        %.1lf",st[i].total);
        printf("\n");
        flag=0;
        printf("删除完成\n");
        for(;i<(*prt);i++)
            st[i]=st[i+1];
        (*prt)--;
    }
    else
        i++;
     }
     if(i==(*prt))
        printf("信息错误,此人不存!自动退出!\n");

}
*/
上面代码主要是排行榜的问题,只有录入,输出,和排行榜做了,其他的用/*   */给去掉了,在编译器里就能很好的看清楚了,但是我的问题是我排行榜那个子函数有问题,可以运行,但是排行输出时有一段乱码,不知道怎么弄的,而且排行榜部分用vc编译好使,但是codeblocks上就乱码了。我是在codeblocks上运行的




[此贴子已经被作者于2016-12-6 17:51编辑过]

搜索更多相关主题的帖子: password 管理系统 include 排行榜 double 
2016-12-06 13:12
marlow
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:125
专家分:419
注 册:2016-7-18
得分:1 
你这个有不少小问题,其中一个大的问题是录入的信息没地方存储,结构里没有指针,是打算以数组的形式存储吧?应该添加一行:ST st[50];然后调用fopen()等函数把数据保存的磁盘上面。
看到了你的那一段乱码,等会有空再修改一下。。。


[此贴子已经被作者于2016-12-6 15:27编辑过]


一切都在学习、尝试、摸索中
2016-12-06 15:25
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:0 
楼上答主,还是看清楚了再发言的好!人家“p=(ST*)malloc(n*sizeof(ST));”这句不是吃素的。
不知道题主所说的乱码是什么样的,有图为证可能有大神帮你对症下药。另记得申请内存用完后释放。
2016-12-06 16:21
育帝
Rank: 2
来 自:黑龙江哈尔滨
等 级:论坛游民
帖 子:75
专家分:43
注 册:2016-10-16
得分:0 
回复 3楼 xzlxzlxzl
嗯,我疏忽了,我截图

育帝
2016-12-06 17:23
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:9 
错误在冒泡排序上,将for(k=0;k<tail-1;k++)修改为for(k=1;k<tail;k++)即可。
2016-12-06 18:23
育帝
Rank: 2
来 自:黑龙江哈尔滨
等 级:论坛游民
帖 子:75
专家分:43
注 册:2016-10-16
得分:0 
回复 5楼 xzlxzlxzl
经过你的提醒我明白哪错了。但是不是你说的那个地方是  for(z=0;z<tail-k;z++)变为for(z=0;z<tail-1-k;z++);但还是感谢你的提醒,要不我也找不到

育帝
2016-12-06 18:43
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:0 
自己找到的更好!
一个简单的冒泡排序可以很灵活的,如果你非要认为把外循环k从0-5循环改成1-5循环和你把内循环改成5-k-1有好大区别的话,那就有吧。主要就是要避免k=0时,z的循环条件是z<5-0,则z的最大值可以到4,那么z+1=5,把数组外的数据排序进来了。
2016-12-06 19:26
育帝
Rank: 2
来 自:黑龙江哈尔滨
等 级:论坛游民
帖 子:75
专家分:43
注 册:2016-10-16
得分:0 
回复 7楼 xzlxzlxzl
嗯嗯,受教了。

育帝
2016-12-06 22:52
marlow
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:125
专家分:419
注 册:2016-7-18
得分:0 
不好意思,昨天确实没有细看,今天把程序改了一下,觉得这样运行效果会更好一些。下一步研究一下用链表来实现,这样就方便用malloc()了。本人正在学习C语言中,水平浅陋,以下把修改了的程序贴出来,欢迎大家批评指正

一切都在学习、尝试、摸索中
2016-12-07 16:40
marlow
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:125
专家分:419
注 册:2016-7-18
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define PASS 123
#define MAXARRAY 50
struct student
{
    int num;
    char name[15];
    char sex[6];
    int age;
    double score[5];
    double total;
};
typedef struct student ST;

void menu(ST *st);//菜单
int  password();//密码
void type(ST *st);//录入、添加数据
void query(ST *st);//输出
void chart(ST *st);//排行榜
void check(ST *st);//查询
void Del(ST *st);//删除
void save(ST *st, int n);  //保存
int count(ST *st);        //统计人数
 
int main()
{
    ST st[MAXARRAY];
    password();
    menu(st);
    return 0;
}

void menu(ST *st)//菜单
{
    int n;
    int flag=1;
    while(flag){
        printf("\n1------录入、添加\n");
        printf("2------输出、修改\n");
        printf("3------排行榜\n");
        printf("4------查询\n");
        printf("5------删除\n");
        printf("6------退出\n");
        scanf("%d",&n);
        switch(n)
        {
            case 1:type(st); break;
            case 2:query(st); break;
            case 3:chart(st); break;
            case 4:check(st); break;
            case 5:Del(st)  ; break;
            case 6:flag=0; break;
        }
    }
}

int  password()//密码
{
    int pass, i, n = 3;
    char ch;
   
    printf("请输入学生管理系统的密码\n");
    do
    {
        pass = 0;
        for (i = 1; i <= 6 && (ch = getch()) != '\r';i++){
               putchar('*');
               pass = pass * 10 + ch - '0';
        }
        if (pass == PASS)
            break;
        else{
            n--;
            printf("密码错误,还有%d次机会!\n", n);
        }
    } while (n>0);
    if (pass == PASS)
        return 1;
    else
        return 0;
}

void type(ST *st)//score录入、添加
{
    int n, a, m, i, j;
   
    if((a = count(st)) == 0){
        printf("请输入您想录入的数据数目\n");
        scanf("%d", &n);
        if(n > MAXARRAY){
            printf("最大保存数据不得超过%d条", MAXARRAY);
            exit(0);
        }
        printf("请依次录入学生的:\n");
        printf("  学号    姓名   性别   年龄     高数   线代    英语    C语言   军理\n");
        for(i = 0; i < n ; i++){
            scanf("%d%s%s%d",&st[i].num,st[i].name,st[i].sex,&st[i].age);
               for(j = 0; j < 5; j++)
                   scanf("%lf",&st[i].score[j]);
        }
        for(i=0;i<n;i++)
            st[i].total=0;
        for(i=0;i<n;i++)
            for(j=0;j<5;j++)
                st[i].total+=st[i].score[j];
        save(st, n);
        printf("数据保存成功!\n");
    }else{
        printf("当前已录学生数据%d条,请输入要添加的人数:", a);
        scanf("%d",&m);
        if(a + m > MAXARRAY){
            printf("最大保存数据不得超过%d条", MAXARRAY);
            exit(0);
        }
        printf("  学号    姓名   性别   年龄     高数   线代    英语    C语言   军理\n");
        for(i = a; i < a + m; i++){
            scanf("%d%s%s%d",&st[i].num,st[i].name,st[i].sex,&st[i].age);
               for(j = 0; j < 5; j++)
                   scanf("%lf",&st[i].score[j]);
        }
        for(i=a;i<a + m;i++)
            st[i].total=0;
        for(i=a;i<a + m;i++)
            for(j=0;j<5;j++)
                st[i].total+=st[i].score[j];
        save(st,m+a);
        printf("数据保存成功!\n");
    }
}

void query(ST *st)           //输出、修改
{
    int i, j, k, num, c;
    int age, a;
    char ch, name[20], sex[5];
    double score[5];
   
    a = count(st);
    printf("  学号   | 姓名  |性别 | 年龄  |  高数 | 线代  | 英语  | C语言 | 军理   |  总成绩  |\n");
    printf("_______________________________________________________________________________\n");
    for(i = 0; i < a; i++){
        printf("%d | %s  | %s  |  %d",st[i].num, st[i].name, st[i].sex, st[i].age);
        for(j=0; j<5; j++)
            printf("   | %.1lf",st[i].score[j]);
        printf(" |  %.1lf    |",st[i].total);
        printf("\n_________________________________________________________________________\n");
    }
    while((c = getchar()) != '\n')         //清空输入行
        ;
    printf("是否需要修改?同意y不同意按任意键\n");
    scanf("%c",&ch);
    if(ch == 'y'){
         printf("请输入要修改学生的姓名:");
         scanf("%s",name);
         for(i = 0; i < a; i++){
            if(strcmp(st[i].name, name)==0){   
                 printf("该学生信息为:\n");
                 printf("  学号1  | 姓名2 |性别3| 年龄4 | 高数5 | 线代6 | 英语7 | C语言8| 军理9 |  总成绩  |\n");
                 printf("%d | %s  | %s  |  %d", st[i].num, st[i].name, st[i].sex, st[i].age);
                   for(j=0;j<5;j++)
                    printf("   | %.1lf",st[i].score[j]);
                   printf("    |  %.1lf    |\n",st[i].total);
                 printf("请输入您要修改的部分(1-9):\n");
                 scanf("%d",&k);
                 switch(k){
                    case 1:   
                        printf("将学号改为:");   
                        scanf("%d",&num);   
                        st[i].num,num;
                        break;
                    case 2:
                         printf("将姓名改为:");
                         scanf("%s",name);   
                         strcpy(st[i].name,name);
                         break;
                     case 3:
                         printf("将性别改为:");
                         scanf("%s",sex);
                         strcpy(st[i].sex,sex);
                         break;
                    case 4:
                         printf("将年龄改为:");
                         scanf("%d",&age);
                         st[i].age = age;
                         break;
                    case 5:
                         printf("高数改为:");
                         scanf("%lf",score);
                         st[i].score[0] = score[0];
                         break;
                    case 6:
                         printf("线代改为:");
                         scanf("%lf",score+1);
                         st[i].score[1] = score[1];
                         break;
                    case 7:
                         printf("英语改为:");
                         scanf("%lf",score+2);
                         st[i].score[2] = score[2];
                         break;
                    case 8:
                         printf("C语言改为:");
                         scanf("%lf",score+3);
                         st[i].score[3] = score[3];
                         break;
                    case 9:
                         printf("军理改为:");
                         scanf("%lf",score+4);
                         st[i].score[4] = score[4];
                         break;
                    }            
                save(st, a);
                printf("修改成功,已保存!\n");
                break;
           }
        }
        if(i == a){
            printf("无该学生信息!\n");
            printf("请重新输入!\n");
        }
   }
}

void chart(ST *st)//排行榜
{
    int i, j, z, k;
    ST temp;
    int a = count(st);

    for(k=0;k<a-1;k++)
        for(z=0;z<a-k-1;z++)
        if(st[z].total<st[z+1].total){
            temp=st[z];
            st[z]=st[z+1];
            st[z+1]=temp;
        }
    printf("  学号   | 姓名  |性别 | 年龄  |  高数 | 线代  | 英语  | C语言 | 军理   |  总成绩  |\n");
    printf("____________________________________________________________________________________\n");
    for(i=0; i<a; i++){
        printf("%d | %s  | %s  |  %d",st[i].num,st[i].name,st[i].sex,st[i].age);
    for(j=0;j<5;j++)
        printf("  | %.1lf",st[i].score[j]);
        printf("  |  %.1lf |",st[i].total);
        printf("\n___________________________________________________________________________\n");
    }
}


void check(ST *st)//查询
{
    int flag = 0;
    int i, j, k=3;
    char ch;
    int Student_NO;
   
    int a = count(st);
    do{
        flag=1;
        printf("请输入要查询的学号:");
        scanf("%d",&Student_NO);
        for(i=0;i<a && flag;){
            if(Student_NO==st[i].num){
                printf("  学号    姓名   性别   年龄    高数    线代    英语    C语言   军理      总成绩\n");
                printf("%d  %s   %s     %d ",st[i].num,st[i].name,st[i].sex,st[i].age);
                for(j=0;j<5;j++)
                    printf("     %.1lf",st[i].score[j]);
                printf("        %.1lf",st[i].total);
                printf("\n");
                flag=0;
            }
            else
                i++;
        }
        if(i == a){
            printf("此人不存在!\n你还剩余查错机会(%d)\n",k);
            k--;
            flag=0;
        }
        printf("是否继续查询(y/任意键退出(except\"y\")\n");
        getchar();
        scanf("%c",&ch);
        if(ch=='y')
            flag=0;
        else if(ch=='n')
            flag=1;
        else
            flag=1;
    }while(flag==0    &&    k>=0);
}

void Del(ST *st)//删除
{
    int i, j, id;
    int flag=1;
    int a = count(st);
   
    printf("请输入要删除学生的学号(每次仅限删除一个学生信息):\n");
    while(scanf("%d",&id) != 1 && id != EOF){
        if(id == EOF)
            exit(0);
        printf("输入错误,请输入所删除学生的学号(整数)!\n");
    }
    printf("你删除的学生信息为:\n");
    for(i = 0; i < a && flag;){
        if(id==st[i].num){
            printf("  学号    姓名   性别   年龄    高数    线代    英语    C语言   军理      总成绩\n");
            printf("%d  %s   %s     %d ",st[i].num,st[i].name,st[i].sex,st[i].age);
            for(j=0;j<5;j++)
                printf("     %.1lf",st[i].score[j]);
            printf("        %.1lf",st[i].total);
            printf("\n");
            flag=0;
            printf("删除完成\n");
            for(;i < a; i++)
                st[i]=st[i+1];
            a--;
        }else
        i++;
    }
    if(i == a)
        printf("信息错误,此人不存!自动退出!\n");
    save(st, a);
}

 void save(ST *st, int n)      //保存  
 {
     int i;
     FILE *fp;
     
     if((fp=fopen("student.txt","w+"))==NULL)   
     {
         printf("数据无法保存到磁盘上!\n");   
         exit(0);                           
     }
     for(i = 0; i < n; i++)
          if(fwrite(st + i, sizeof(struct student), 1, fp) != 1)
             printf("无数据或数据写入错误!\n");
     fclose(fp);
 }

 int count(ST *st)                   //统计总人数子函数
{
    FILE *fp;
    int i=0;
     
    if((fp=fopen("student.txt","r+"))==NULL){
        printf("无法打开或创建文件~~~~\n");
        exit(0);
    }
    while(fread(st + i, sizeof(struct student), 1, fp) != 0)
        i++;
    fclose(fp);
    return i ;
 }
 

一切都在学习、尝试、摸索中
2016-12-07 16:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-472037-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024394 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved