引用 | 编辑
Kain
2005-06-14 10:52 |
楼主
▼ |
||
![]() 卡在不会排序跟比较传值的部份 想请大家帮忙解答一下 Q:求四位同学2科成绩之总分,并排分数高低排序,标名次 (这一段总分是程式自己算的,我是用二维阵列方式代出总分) 国 英 总分 (一) 80 70 150 (二) 70 90 160 (三) 80 90 170 (四) 40 50 90 ---------------------------------------- 但最后印出时应如下:(以总分做排名,相同分数以国文优先) 国 英 总分 名次 (三) 80 90 170 1 (二) 70 90 160 2 (一) 80 70 150 3 (四) 40 50 90 4 == 我会用气泡排列 但是只会用在一维阵列(就是一堆数字比大小) 二维阵列该怎么用我就不知道了 我用二维阵列只写得出上面那个 下面那个就 .. 访客只能看到部份内容,免费 加入会员 ![]()
|
引用 | 编辑
Freelife
2005-06-14 15:18 |
1楼
▲ ▼ |
那你可以用阵列sum来做排序,
如果sum[1]的值,和sum[2]交换的时候~ 就把a[1][ * ]的所有值,和a[2][ * ]的所有值交换(*表示所有的阵列元素)~ 当你把sum变成由大排到小,二维阵列a的值,也会依照总分作排序~ 然后再印出来,就是答案了~ ![]() ![]() |
引用 | 编辑
codeboy
2005-06-14 16:11 |
2楼
▲ ▼ |
图 1. ![]() 刚好有空就稍微写了一下...用的方法比较笨一些..你可以参考一下! ![]() 应该有更好的方法!在想想搂~ ![]() 复制程式 #include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { int a[4][4]={{1,70,80,88},{2,88,78,90},{3,92,70,86},{4,86,90,60}}; int b[4]={1,2,3,4}; int g; float sum[4],sum2[4],aveg[4],temp; for(int c=0;c<4;c++) { sum[c]=a[c][1]+a[c][2]+a[c][3]; sum2[c]=sum[c]; aveg[c]=sum[c]/3; } for(int j=0;j<4;j++) { for(int k=j;k<4;k++) { if(sum2[j]<sum2[k]) { temp=sum2[j]; sum2[j]=sum2[k]; sum2[k]=temp; g=b[j]; b[j]=b[k]; b[k]=g; } } } cout<<"编号| 国文 | 英文 | 数学 | 总合 | 平均 | 排名"<<endl; for(int n=0;n<4;n++) { int tempI; cout<<a[n][0]<<" | "<<a[n][1]<<" | "<<a[n][2]<<" | "<<a[n][3]<<" | "<<sum[n]<<" | "<<aveg[n]; for(int d=0;d<4;d++) { if(b[d]==(n+1)) { tempI=(d+1); } } cout<<" | "<<tempI<<endl; } system("PAUSE"); return EXIT_SUCCESS; } coding by dev-c++ 4.9.9.1 ![]() |
引用 | 编辑
Kain
2005-06-14 23:55 |
3楼
▲ ▼ |
下面是引用Freelife于2005-06-14 15:18发表的 : 不好意思....有点不太懂 能请您说得详细一点吗? sum是直行阵列值....请问这样的话该怎么排序呢 ![]() |
引用 | 编辑
Freelife
2005-06-15 10:35 |
4楼
▲ ▼ |
你的阵列sum是用来存放总分的~
sum[0]是第1个人的,sum[1]是第2个人的....... 而你的阵列a是存放每个人的各科成绩~ a[0][0]、a[0][1]、 a[0][2]、a[0][3]分别存放=>第1位、国文、英文、数学~ a[1][0]、a[1][1]、 a[1][2]、a[1][3]分别存放=>第2位、国文、英文、数学~ : : 假设阵列sum排序的结果是,sum[2]、sum[1]、sum[0]、sum[3] 并且把这个结果重新存入阵列sum之中~ 也就是把sum[0]的值,和sum[2]的值交换~ 同一时间,你也把a[0][0]、a[0][1]、a[0][2]、a[0][3]的值和 a[2][0]、a[2][1]、a[2][2]、a[2][3]的值交换~ 排完之后,再把阵列内的值印出来, 自然就会印出: 第3位................................名次1 第2位................................名次2 第1位................................名次3 第4位................................名次4 这个前提是,你自己会将阵列sum重新排列(由大排到小)~ ![]() |
引用 | 编辑
codeboy
2005-06-15 14:24 |
5楼
▲ ▼ |
下面是引用Freelife于2005-06-15 10:35发表的 :哈哈...刚刚才发现我误会意思了....我之前写的是固定编号所名次没有照顺序 原来他要照顺序的喔...那就比较容易了~ ![]() ![]() |
引用 | 编辑
andyz
2005-06-22 00:09 |
6楼
▲ |
复制程式
#include <iostream.h> void main() { cout<<" 国文 "<<"英文 "<<"数学 "<<" 总分 "<<"平均 "<<endl; float a[4][6]={{1,70,80,88,0,0},{2,88,78,90,0,0},{3,92,70,86,0,0},{4,86,90,60,0,0}},b[4][6]; int j,k; for ( k=0;k<4;k++){ for ( j=1;j<4;j++){ a[k][4]+=a[k][j];} a[k][5]=a[k][4]/3; } for (k=0;k<6;k++){ b[0][k]=a[0][k];} for(j=0;j<3;j++){//因为a只[4]所以做到3就可以了 if(b[j][4]>a[j+1][4]){ for (k=0;k<6;k++){ b[j+1][k]=a[j+1][k];}} else if(b[j][4]<a[j+1][4]){ for (k=0;k<6;k++){ b[j+1][k]=b[j][k]; b[j][k]=a[j+1][k]; }} else if(b[j][4]==a[j+1][4]){ if(b[j][1]>a[j+1][1]){ for (k=0;k<6;k++){ b[j+1][k]=a[j+1][k];}} else if(b[j][1]<a[j+1][1]){ for (k=0;k<6;k++){ b[j][k]=a[j+1][k]; b[j+1][k]=a[j][k];}}} } for ( k=0;k<4;k++){ for ( j=0;j<6;j++){ cout<<b[k][j]<<" ";} cout<<endl;} } 好像只适用于本题 改数字后就... 改天再修改吧 复制程式 #include <iostream.h> void main() { cout<<" 国文 "<<"英文 "<<"数学 "<<" 总分 "<<"平均 "<<endl; float a[4][6]={{1,70,80,88,0,0},{2,88,78,90,0,0},{3,92,70,86,0,0},{4,86,90,60,0,0}},temp[6]; int i,j,k,flag; for ( k=0;k<4;k++){ for ( j=1;j<4;j++){ a[k][4]+=a[k][j];} a[k][5]=a[k][4]/3; } flag=0; for (i=0;i<4&&(!flag);i++) { flag=1; for (j=0;j<3-i;j++){ if (a[j][4]<a[j+1][4]) { for (k=0;k<6;k++){ temp[k]=a[j][k]; a[j][k]=a[j+1][k]; a[j+1][k]=temp[k];} flag=0;}} } for ( k=0;k<4;k++){ for ( j=0;j<6;j++){cout<<a[k][j]<<" ";} cout<<endl;} } ![]() |