引用 | 編輯
Kain
2005-06-14 10:52 |
樓主
▼ |
||
x0
不好意思...我有個期中考的考題延伸卡在不會排序跟比較傳值的部份 想請大家幫忙解答一下 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 == 我會用氣泡排列 但是只會用在一維陣列(就是一堆數字比大小) 二維陣列該怎麼用我就不知道了 我用二維陣列只寫得出上面那個 下面那個就 .. 訪客只能看到部份內容,免費 加入會員 x0
|
引用 | 編輯
Freelife
2005-06-14 15:18 |
1樓
▲ ▼ |
那你可以用陣列sum來做排序,
如果sum[1]的值,和sum[2]交換的時候~ 就把a[1][ * ]的所有值,和a[2][ * ]的所有值交換(*表示所有的陣列元素)~ 當你把sum變成由大排到小,二維陣列a的值,也會依照總分作排序~ 然後再印出來,就是答案了~ x0 |
引用 | 編輯
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 x0 |
引用 | 編輯
Kain
2005-06-14 23:55 |
3樓
▲ ▼ |
下面是引用Freelife於2005-06-14 15:18發表的 : 不好意思....有點不太懂 能請您說得詳細一點嗎? sum是直行陣列值....請問這樣的話該怎麼排序呢 x0 |
引用 | 編輯
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重新排列(由大排到小)~ x1 |
引用 | 編輯
codeboy
2005-06-15 14:24 |
5樓
▲ ▼ |
下面是引用Freelife於2005-06-15 10:35發表的 :哈哈...剛剛才發現我誤會意思了....我之前寫的是固定編號所名次沒有照順序 原來他要照順序的喔...那就比較容易了~ x1 |
引用 | 編輯
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;} } x1 |