| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 850 人关注过本帖
标题:重新发刚才的问题,请大佬看一下,感激不尽
取消只看楼主 加入收藏
q10027272169
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2019-1-3
结帖率:0
收藏
已结贴  问题点数:20 回复次数:0 
重新发刚才的问题,请大佬看一下,感激不尽
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//班级数量 
#define ClassNumber 4

//课程数量 
#define CourseNumber 5

//一个班级的学生数量 
#define StudentNumber 45

 
//菜单 
#define menu "1、随机生成全部学生的成绩\n" \
"2、计算全部学生的平均成绩\n" \
"3、非递增冒泡排序\n" \
"4、非递增选择排序\n" \
"5、显示所有班级的成绩表\n" \
"6、创建非递增单链表\n" \
"7、显示单链表的值\n" \
"0、退出\n请选择一个菜单:"

//表示一个学生的成绩信息 
typedef struct tagScore 
{
    //学号 
    char id[16];
    //姓名  
    char name[32];
    //5门课程的成绩 
    int scores[5];
    //平均成绩 
    float ave; 
    struct tagScore *next;    
}Score; 

//表示一个班级 
typedef struct
{
    //班级名 
    char classname[32];
    //本班所有同学的成绩 
    Score scorearray[StudentNumber];    
}Class; 

//表示一个年级 
typedef struct 
{
    //年级名 
    char gradename[32];
    //4个班级 
    Class a,b,c,d; 
}Grade;

typedef enum
{
    //未执行过任何命令时的状态 
    Ready=-1,
    //命令1执行完后的状态 
    cmd1over,
    //命令2执行完后的状态 
    cmd2over,
    cmd3or4over,
    cmd6over,
}State; 

//唯一的一个有4个班级的年级变量 
Grade agrade;

//执行一个命令前所处的状态 
State s=Ready;

//单链表的头结点,
//为了便于插入,这里创建的是带头结点的单链表 
Score head;

//辅助用的班级指针数组 
Class *clsptarr[4]={&agrade.a,&agrade.b,
    &agrade.c,&agrade.d};

//随机生成全部学生的成绩
void randgeneratescore()
{
    //学号前缀 
    const char IdPrefix[]="1609200";
    //最小分数、最大分数 
    const int Min=0,Max=100;
    //n为学号的起始编号 
    int i,j,k,n=1,t=Max-Min+1;
    char temp[8]; 
    
    srand(time(NULL)); 
    printf("请输入年级名:");
    scanf("%s",agrade.gradename);
    printf("请输入年级\"%s\"的4个班级名:",agrade.gradename);
    for(i=0;i<ClassNumber;i++)
    {
        scanf("%s",(*(clsptarr[i])).classname);
    }
    puts("正在随机生成全部学生的成绩,请等待。。。");
    for(i=0;i<ClassNumber;i++)
    {
        for(j=0;j<StudentNumber;j++)
        {
            //为学生的姓名赋值,
            //学生姓名的格式类似于class1name1 
            sprintf((*(clsptarr[i])).scorearray[j].name,
                "class%d_name%d",
                i+1,j+1);
            //    
            //printf("name=%s\n",(*(clsptarr[i])).scorearray[j].name);    
                
            //为学生的学号赋值,
            //学号为IdPrefix前缀加一个3位的唯一编号 
            sprintf(temp,"%.*d",3,n++);
            strcpy((*(clsptarr[i])).scorearray[j].id,IdPrefix);        
            strcat((*(clsptarr[i])).scorearray[j].id,temp);
            //
            //printf("id=%s\n",(*(clsptarr[i])).scorearray[j].id);    
            //为某一个学生的5门课程的成绩赋值(随机) 
            for(k=0;k<CourseNumber;k++)
            {
                (*(clsptarr[i])).scorearray[j].scores[k]=rand()%t+Min;    
            }
        } 
    }
    s=cmd1over;
    puts("随机生成全部学生的成绩,已完成");     
}

//计算全部学生的平均成绩 
void calavescore()
{
    float  sum;
    int i,j,k;
    
    for(i=0;i<ClassNumber;i++)
    {
        for(j=0;j<StudentNumber;j++)
        {
            sum=0;
            for(k=0;k<CourseNumber;k++)
            {
                sum+=(*(clsptarr[i])).scorearray[j].scores[k];    
            }
            (*(clsptarr[i])).scorearray[j].ave=sum/CourseNumber;
            //
            //printf("ave=%.1f\n",(*(clsptarr[i])).scorearray[j].ave);
        }
    }
    puts("命令已完成");
    s=cmd2over;
}

//实现冒泡排序算法 
void bubbl(Class *c)
{
    int i,swap=1,sorted=0;
    Score tempsc;
    
    while(swap)
    {
        swap=0;
        for(i=0;i<StudentNumber-1-sorted;i++)
        {
            if((*c).scorearray[i].ave<(*c).scorearray[i+1].ave)
            {
                tempsc=(*c).scorearray[i];
                (*c).scorearray[i]=(*c).scorearray[i+1];
                (*c).scorearray[i+1]=tempsc;
            }
            swap=1;
        }
        sorted++;    
    } 
}

//非递增冒泡排序
void bubblesort()
{
    int i;
    
    for(i=0;i<ClassNumber;i++)
        bubbl(clsptarr[i]);    
    s=cmd3or4over;    
    puts("命令已完成");    
}

//实现选择排序算法 
void select(Class *c)
{
    int  max,i,j;
    Score tempsc;
    
    for(i=0;i<StudentNumber-1;i++)
    {
        max=i;
        for(j=i+1;j<StudentNumber;j++)
        {
            if((*c).scorearray[j].ave>(*c).scorearray[max].ave)
                max=j;
        }
        if(max!=i)
        {
            tempsc=(*c).scorearray[i];
            (*c).scorearray[i]=(*c).scorearray[max];
            (*c).scorearray[max]=tempsc;
        }
    }
}

//非递增选择排序
void selectsort()
{
    int i;
    
    for(i=0;i<ClassNumber;i++)
        select(clsptarr[i]);
    s=cmd3or4over;        
    puts("命令已完成");    
}

//显示所有班级的成绩表 
void showallclassscore()
{
    int i,j;
    
    printf("\t\t\t年级\"%s\"各个班级的成绩表\n",agrade.gradename);
    for(i=0;i<ClassNumber;i++)
    {
        printf("%s班:\n",(*(clsptarr[i])).classname);
        printf("%-12s%-15s%-8s%-8s%-8s%-8s%-8s%s\n",
            "学号",
            "姓名",
            "课程1",
            "课程2",
            "课程3",
            "课程4",
            "课程5",
            "平均分"
        );
        for(j=0;j<StudentNumber;j++)
        {
            printf("%-12s%-15s%-8d%-8d%-8d%-8d%-8d",
                (*(clsptarr[i])).scorearray[j].id,
                (*(clsptarr[i])).scorearray[j].name,
                (*(clsptarr[i])).scorearray[j].scores[0],
                (*(clsptarr[i])).scorearray[j].scores[1],    
                (*(clsptarr[i])).scorearray[j].scores[2],    
                (*(clsptarr[i])).scorearray[j].scores[3],    
                (*(clsptarr[i])).scorearray[j].scores[4]        
            );
            //未求出平均成绩前,将平均成绩显示为0.0,
            //否则,显示平均成绩 
            printf("%.1f\n",
                (s>=cmd2over ? (*(clsptarr[i])).scorearray[j].ave : 0.0)    
            );
        }
    }
}

//创建非递增单链表
void createlink()
{
    int i,j;
    Score *q,*p,*cur;
    
    //先将第1个班级的所有学生的成绩链接起来 
    for(i=0;i<StudentNumber-1;i++)
    {
        (*(clsptarr[0])).scorearray[i].next=&((*(clsptarr[0])).scorearray[i+1]);    
    }
    //令第1个班级最后一个学生的成绩的next指针为NULL 
    (*(clsptarr[0])).scorearray[StudentNumber-1].next=NULL;
    //令头结点的next指针指向第1个班级的第1个学生的成绩
    head.next=&(*(clsptarr[0])).scorearray[0]; 
    //链接其它3个班级的所有学生的成绩 
    for(i=1;i<ClassNumber;i++)
    {
        for(j=0;j<StudentNumber;j++)
        {
            //开始时,p指向单链表的第一个结点 
            p=head.next;
            //开始时,q指向头结点(q始终指向p指向结点的前驱结点) 
            q=&head;
            //cur指向当前要插入单链表的结点 
            cur=&(*(clsptarr[i])).scorearray[j];
            while(p&&(*cur).ave<(*p).ave)
            {
                q=p;
                p=(*p).next;
            }
            //插到p所指结点的前面 
            (*cur).next=p;
            (*q).next=cur; 
        }    
    }
    s=cmd6over;
    puts("命令已完成");     
} 

//显示单链表的值
void  showlink()
{
    Score *p=head.next;
    
    if(!p)
        puts("链表为空");
    else
    {
        puts("\t\t\t\t链表的值如下:");
        printf("%-12s%-15s%-8s%-8s%-8s%-8s%-8s%s\n",
            "学号",
            "姓名",
            "课程1",
            "课程2",
            "课程3",
            "课程4",
            "课程5",
            "平均分"
        );
        while(p)
        {
            printf("%-12s%-15s%-8d%-8d%-8d%-8d%-8d%.1f",
                (*p).id,
                (*p).name,
                (*p).scores[0],
                (*p).scores[1],    
                (*p).scores[2],    
                (*p).scores[3],    
                (*p).scores[4],
                (*p).ave        
            );
            p=(*p).next;
            printf("%s",p ? "   ->\n" : "\n");
        }
    }    
}

//处理菜单 
void processmenu(int m)
{
    switch(m)
    {
        case 1:
            randgeneratescore();
            break;
        case 2:
            if(s<cmd1over)
                puts("请先执行命令1\n");
            else
                calavescore();    
            break;
        case 3:
            if(s<cmd2over)
                puts("请先执行命令2\n");    
            else
                bubblesort();
            break;
        case 4:
            if(s<cmd2over)
                puts("请先执行命令2\n");    
            else
                selectsort();
            break;
        case 5:
            if(s<cmd1over)
                puts("请先执行命令1\n");
            else
                showallclassscore();
            break;
        case 6:
            if(s<cmd3or4over)
                puts("请先执行命令3或命令4\n");
            else
                createlink();
            break;
        case 7:
            if(s<cmd6over)
                puts("请先执行命令6\n");
            else
                showlink();
            break;
        case 0:
            exit(0);
            break;
        default:
            puts("无法处理的菜单命令");
            break;                                    
    }
    printf("\n");    
}

int main()
{
    int m;
        
    while(1)
    {
        printf("%s",menu);
        scanf("%d",&m);
        processmenu(m);    
    }
    return 0; 
}


































用vc++运行不了,请问是为什么呢?
搜索更多相关主题的帖子: 学生 成绩 命令 printf for 
2019-01-03 16:16
快速回复:重新发刚才的问题,请大佬看一下,感激不尽
数据加载中...
 
   



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

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