帮忙看下这个成绩排序的程序。。。谢谢各位了

1 view
Skip to first unread message

unread,
Mar 29, 2009, 10:29:07 AM3/29/09
to 周立功C语言俱乐部
main()
{
int a[3][3];
int i,m,j,k;
for(i=0;i<3;i++)
{ printf("输入第%d个学生成绩",i+1);
scanf("%d %d",&a[i][0],&a[i][1]);
a[i][3]=(a[i][0]+a[i][2])/2;
}
for(i=0;i<2;i++)
for(j=1;j<3;j++)
{
if(a[j][3]>a[i][3])
for(k=1;k<3;k++)
{
m=a[i][k-1];
a[i][k-1]=a[i][k];
a[i][k]=m;
}
}
for(i=0;i<3;i++)
printf("%4d %4d %4d\n ",a[i][0],a[i][1],a[i][2]);
getch();


}

赵伟

unread,
Mar 29, 2009, 11:27:14 AM3/29/09
to zl...@googlegroups.com


2009/3/29 尚 <snip...@163.com>
呵呵,以后建议把问题和代码一块发出来!!
首先你的数组越界了!
8行的a[i][3],只能到a[i][2]。
我猜你的程序应该是按照平均分数排序,但你的m替换的是一次输入的两个成绩。

liz

unread,
Mar 29, 2009, 11:01:43 AM3/29/09
to 周立功C语言俱乐部
(一)

a[i][3]=(a[i][0]+a[i][2])/2;
这一句中的数组下标有错,申请的数组是a[3][3],那么范围就是从a[0][0]到a[2][2];
这句应该是求平均成绩的,那么就是a[i][2] = (a[i][0] + a[i][1]) / 2;
(二)
排序部分是在对什么排序,是在对全部的成绩按照平均成绩排序吗?是的话这样写:
从大到小排序:
int temp[3];
for (i = 0; i < 2; i++) // 从第一行到倒数第二行
{
for (j = 1; j < 3; j++) // 从第二行到最后一行
{
if (a[i][2] > a[j][2]) // 平均成绩后一个大于前一个,交换
{
temp[0] = a[i][0]; // 交换
temp[1] = a[i][1];
temp[2] = a[i][2];
a[i][0] = a[j][0];
a[i][1] = a[j][1];
a[i][2] = a[j][2];
a[j][0] = temp[0];
a[j][1] = temp[1];
a[j][2] = temp[2];
}
}
}

unread,
Mar 30, 2009, 1:26:21 AM3/30/09
to 周立功C语言俱乐部
谢谢啊。。果然是高手如云~~ 第一次发帖子就有人快速帮忙解决的。。感激不尽~

On 3月29日, 下午11时27分, 赵伟 <windzhao...@gmail.com> wrote:
> 2009/3/29 尚 <sniper...@163.com>

> 我猜你的程序应该是按照平均分数排序,但你的m替换的是一次输入的两个成绩。- 隐藏被引用文字 -
>
> - 显示引用的文字 -

unread,
Mar 30, 2009, 1:27:40 AM3/30/09
to 周立功C语言俱乐部
你的程序很仔细很整齐呀。。我最后的交换还是用k实现了。。给你贴来看看for(i=0;i<2;i++)
for(j=1;j<3;j++)
{
if(a[j][2]>a[i][2])
for(k=0;k<3;k++)
{
m=a[i][k];
a[i][k]=a[j][k];
a[j][k]=m;
}
}。
多指教哈。

Niu Tao

unread,
Mar 31, 2009, 1:23:16 AM3/31/09
to 周立功C语言俱乐部

这样是可以,但如果定义是int a[3][10],也就是说一个学生有9门课(最后一个为平均成绩),
那你的代码如何写?逐个交换可能就不现实了。最主要的一个是,效率会极其低下,因为每次如果发现需要交换,则类似
于"temp[0] = a[i][0]; // 交换"这样的语句就要执行30次,况且还只是3个学生。并且需要额外付出temp
[3][10]个空间的代价。
一个建议是不发生数据的实质性交换,只使用索引来排序,给出我的一个建议:
#include <stdio.h>
#define STU_NUM
3
int main()
{
int a[STU_NUM][3];
int i,j, max ,tmp;
int index[STU_NUM]; /* 存放最大平均成绩的下标 */

printf("请输入%d个学生的成绩...\n", STU_NUM);
for (i = 0; i < STU_NUM; i++) {
printf("输入第%d个学生成绩:", i + 1);
scanf("%d %d", &a[i][0], &a[i][1]);


a[i][2] = (a[i][0] + a[i][1]) / 2;

index[i] = i;
}

for (i = 0; i < STU_NUM; i++) {
max = i; /* 假设a[index[i]][2]最大 */
for (j = i + 1; j < STU_NUM; j++) /* 顺序比较其后是否有更大的 */
if (a[index[j]][2] > a[index[max]][2]) /* 如果有,则
记录其下标 */
max = j;
if (max != i) { /* 如果已经找到一个比当前a[index[i]][2]大的值,则交换其下标
*/
tmp = index[i];
index[i] = index[max];
index[max] = tmp;
}
}

for(i = 0; i < STU_NUM; i++)
printf("%-2d: %-4d %-4d %-4d\n", i + 1, a[index[i]]
[0], a[index[i]][1], a[index[i]][2]);
return 0;
}

lanpe...@gmail.com

unread,
Mar 31, 2009, 3:20:53 AM3/31/09
to 周立功C语言俱乐部
程序正确是一方面,效率更重要!

张辉

unread,
Mar 31, 2009, 5:57:53 AM3/31/09
to 周立功C语言俱乐部
跟帖

On 3月31日, 下午3时20分, "lanpeng...@gmail.com" <lanpeng...@gmail.com>
wrote:

翱翔之鹰

unread,
Mar 31, 2009, 6:34:32 AM3/31/09
to 周立功C语言俱乐部
#include<stdio.h>
void main(void)
{
int a[3][3];
int i,m,j,k;
for(i=0;i<3;i++)
{ printf("输入第%d个学生成绩",i+1);
scanf("%d%d",&a[i][0],&a[i][1]);
a[i][2]=(a[i][0]+a[i][1])/2;
}
for(i=0;i<3;i++)
for(j=i+1;j<3;j++)
{
if(a[j][2]>a[i][2])
for(k=0;k<3;k++)
{
m=a[i][k];
a[i][k]=a[j][k];
a[j][k]=m;
}
}
for(i=0;i<3;i++)
printf("%4d %4d %4d\n ",a[i][0],a[i][1],a[i][2]);
getch();


}/*注意数组的下标的取值范围*/

翱翔之鹰

unread,
Mar 31, 2009, 8:04:25 AM3/31/09
to 周立功C语言俱乐部
如果那样还,我建议还是用"结构体"来实现

On 3月31日, 下午1时23分, Niu Tao <niutao0...@gmail.com> wrote:

> }- 隐藏被引用文字 -
>
> - 显示引用的文字 -- 隐藏被引用文字 -
>
> - 显示引用的文字 -

赵力

unread,
Apr 2, 2009, 9:54:02 AM4/2/09
to zl...@googlegroups.com


2009/3/29 尚 <snip...@163.com>
把你题目说清楚么。。。
Reply all
Reply to author
Forward
0 new messages