廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 13325 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
Kain
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x6
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[C/C++] 請問依學生成績做名次排列印出的問題
不好意思...我有個期中考的考題延伸
卡在不會排序跟比較傳值的部份
想請大家幫忙解答一下

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

==
我會用氣泡排列
但是只會用在一維陣列(就是一堆數字比大小)
二維陣列該怎麼用我就不知道了

我用二維陣列只寫得出上面那個
下面那個就 ..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容




獻花 x0 回到頂端 [樓 主] From:未知地址 | Posted:2005-06-14 10:52 |
Freelife
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x2 鮮花 x60
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

那你可以用陣列sum來做排序,

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

當你把sum變成由大排到小,二維陣列a的值,也會依照總分作排序~
然後再印出來,就是答案了~ 表情


獻花 x0 回到頂端 [1 樓] From:台灣中華電信 | Posted:2005-06-14 15:18 |
codeboy 手機
個人文章 個人相簿 個人日記 個人地圖
社區建設獎
小有名氣
級別: 小有名氣 該用戶目前不上站
推文 x6 鮮花 x331
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

圖 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


[ 此文章被codeboy在2005-06-14 16:26重新編輯 ]



連結有問題請來信,我會盡快修正~^^
通報時請附上是"哪一篇失效"...這樣我才能去修正~麻煩各位好心人士了~

[連結失效通報][ 網頁.伺服.程式 討論區]
----------------------在世界中心呼喊愛情----------------------
深深思念一個人的時候,我們不知不覺的地活在世界的中心...
獻花 x0 回到頂端 [2 樓] From: | Posted:2005-06-14 16:11 |
Kain
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x6
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用Freelife於2005-06-14 15:18發表的 :
那你可以用陣列sum來做排序,

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

.......

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

sum是直行陣列值....請問這樣的話該怎麼排序呢


獻花 x0 回到頂端 [3 樓] From:台灣中華電信 | Posted:2005-06-14 23:55 |
Freelife
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x2 鮮花 x60
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

你的陣列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 回到頂端 [4 樓] From:台灣中華電信 | Posted:2005-06-15 10:35 |
codeboy 手機
個人文章 個人相簿 個人日記 個人地圖
社區建設獎
小有名氣
級別: 小有名氣 該用戶目前不上站
推文 x6 鮮花 x331
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用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 回到頂端 [5 樓] From: | Posted:2005-06-15 14:24 |
andyz 手機 會員卡
數位造型
個人文章 個人相簿 個人日記 個人地圖
社區建設獎
頭銜:惡靈退散 o(╬ ̄皿 ̄)=○ &nb ..惡靈退散 o(╬ ̄皿 ̄)=○ &nb ..
分類版主
級別: 分類版主 該用戶目前不上站
版區: 塑膠模型, 電腦資訊
推文 x55 鮮花 x168
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

複製程式
#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;}
}
改成這樣就沒問題了


[ 此文章被andyz在2005-06-28 11:58重新編輯 ]


回文原則(以下只適用在我的管理區)
1.我不回太白目的問題
2.還有娘家文
3.看不懂得也是
4.我很懶得把你的問題(也就是文字敘述)想成我要看到的畫面(也就是螢幕上出現的畫面)。純文字敘述者,看不懂在說啥就不回。想要解答就先下點功夫,來個圖文並茂的文章吧。
5.想到再打

何謂白目問題
1.看不懂英文的,要求翻譯
2.沒經過爬文就問
3.給個問題(題目)就要求解答。例如:請問XXX怎麼寫。自己的CODE都沒有貼上來就要求別人幫你寫,不如你的作業我幫你作、你的書我幫你讀好了
4.想到再打
獻花 x1 回到頂端 [6 樓] From:台灣數位聯合 | Posted:2005-06-22 00:09 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.062705 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言