新问题,为什么成绩大小排序,排完以后,名字顺序还是有问题?运行程序的结果也是错的。
该程序是输入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]