首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

新有关问题,为什么成绩大小排序,排完以后,名字顺序还是有有关问题?运行程序的结果也是错的

2012-10-29 
新问题,为什么成绩大小排序,排完以后,名字顺序还是有问题?运行程序的结果也是错的。该程序是输入7个学生的

新问题,为什么成绩大小排序,排完以后,名字顺序还是有问题?运行程序的结果也是错的。
该程序是输入7个学生的成绩,然后利用函数调用,从大到小排列成绩及学生姓名。然后输出最高分和最低分以及平均分。

C/C++ code
#include "stdio.h"#include "string.h"#define N 7float pj(char a[7][7],float b[7]){    int i,j;    float t[N],p;    char f[N][N];    p=0;    for(j=0;j<N-1;j++)        for(i=0;i<N-j;i++)            if(b[i]<b[i+1])            {                t[i]=b[i+1];                strcpy(f[j],a[j+1]);                b[i+1]=b[i];                strcpy(a[j+1],a[j]);                b[i]=t[i];                                strcpy(a[j],f[j]);            }            printf("学生成绩为:\n");            for(i=0;i<N;i++)                printf("%10s\t%.2f\n",a[i],b[i]);            printf("最高成绩为:%.2f\t最低成绩为:%.2f\n",b[0],b[N-1]);            for(i=0;i<N;i++)                p+=b[i];            return p;}void main(){    char a[N][N];    float b[N];    int i;    float m;    printf("请输入学生姓名及成绩:\n");    for(i=0;i<N;i++)        scanf("%s%f",a[i],&b[i]);    printf("学生成绩为:\n");    for(i=0;i<N;i++)        printf("%10s\t%.2f\n",a[i],b[i]);        m=pj(a,b)/N;        printf("学生的平均成绩为:%.2f\n",m);}




目前运行后有两个问题:
问题1:在成绩排序时,里面有个成绩为1的,排序出现了错误,为何?
问题2:成绩是按由大到小的顺序排过来了,但是名字只有第一个和第二个颠倒了,而且第二个因为成绩1的问题,还显示不出来,这是为何?


[解决办法]
float pj(char a[7][7],float b[7])
{
}
子函数的形参没有这样写的吧?
[解决办法]
float pj(char a[7][7],float b[7])中的参数a不能以二维数组的方式出现,参数b勉强可以,但是会有隐患,正确的写法是float pj(char* a, int ar, int ac, float* b, int bc),数组都需要以指针的方式传入,其维数需要明确指定,在函数中进行换算。
[解决办法]
C/C++ code
#include "stdio.h"#include "string.h"#define N 7float pj(char a[7][7],float b[7]){    int i,j;    //float t[N],p;不要分配过多的内存空间    float t,p;    //char f[N][N];    char f[1][N];    p=0;    for(j=0;j<N-1;j++)//冒泡排序    {        for(i=j+1;i<N;i++)            if(b[j] < b[i])            {                t=b[j];                b[i]=b[j];                b[j]=t;                strcpy(f[0],a[i]);                strcpy(a[i],a[j]);                strcpy(a[j],f[0]);                            }  /*          if(b[i]<b[i+1])            {                t[i]=b[i+1];                strcpy(f[j],a[j+1]);                b[i+1]=b[i];                strcpy(a[j+1],a[j]);                b[i]=t[i];                                strcpy(a[j],f[j]);            }*/    }            printf("学生成绩为:\n");            for(i=0;i<N;i++)                printf("%10s\t%.2f\n",a[i],b[i]);            printf("最高成绩为:%.2f\t最低成绩为:%.2f\n",b[0],b[N-1]);            for(i=0;i<N;i++)                p+=b[i];            return p;}void main(){    char a[N][N];    float b[N];    int i;    float m;    printf("请输入学生姓名及成绩:\n");    for(i=0;i<N;i++)        scanf("%s%f",a[i],&b[i]);    printf("学生成绩为:\n");    for(i=0;i<N;i++)        printf("%10s\t%.2f\n",a[i],b[i]);        m=pj(a,b)/N;        printf("学生的平均成绩为:%.2f\n",m);}
[解决办法]
=============================================
t[i]=b[i+1];
strcpy(f[j],a[j+1]);
b[i+1]=b[i];
strcpy(a[j+1],a[j]);
b[i]=t[i];
strcpy(a[j],f[j]);
===========================================
1. t[i] 没有被赋初值
2. 没有必要用t[i] 直接用float就好
3. 学生姓名,没有被交换,没有用到中间变量,可用一个char str_tm[N]

热点排行