請問依學生成績做名次排列印出的問題

Home Home
引用 | 編輯 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來做排序,

如果sum[1]的值,和sum[2]交換的時候~
就把a[1][ * ]的所有值,和a[2][ * ]的所有值交換(*表示所有的陣列元素)~

.......

不好意思....有點不太懂
能請您說得詳細一點嗎?

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發表的 :
你的陣列sum是用來存放總分的~
sum[0]是第1個人的,sum[1]是第2個人的.......

而你的陣列a是存放每個人的各科成績~
a[0][0]、a[0][1]、 a[0][2]、a[0][3]分別存放=>第1位、國文、英文、數學~
.......
哈哈...剛剛才發現我誤會意思了....我之前寫的是固定編號所名次沒有照順序
原來他要照順序的喔...那就比較容易了~ 表情

獻花 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