作者yantchen (球童Yanting)
看板NTUE-CS101
標題[課業] C++期末
時間Fri Jan 9 23:18:14 2009
期末考可以帶任何紙本資料
課本一定要帶 誰知道會不會發生太緊張把cout拼成cow
依照過去的題目還有王老大洩漏給我的訊息
題目應該是 寫一個計算成績的程式
輸入幾個人的成績(多個科目) 計算總分或平均之類的 然後排序
每年視他教到哪增減要求 像是要用函數啦 要用指標啦 要可以輸入姓名啦 blablabla
今年他有洩題說一定要用一個函數寫一個選擇用什麼分數排序的畫面 等等下面解說
考試時間有
3 個小時 拿到考卷先別緊張
看一下題目的要求
通常他不會像online jugde系統那樣嚴格(對100分錯0分)
他的評分標準會寫在題目卷上
例: 要求陣列怎樣宣告 有做到20% 要求怎樣用函數 有做到20% 可編譯成功 20% 之類的
所以說 盡量寫 寫不出來也至少交個屍體 分數不要掛零
程式分幾個部份
輸入 & 計算總分
先輸入有幾個人 然後宣告陣列
如果你不會宣告動態的陣列大小(就是幾個人就開幾個陣列空間)
那就給他來個int math[99]之類的 反正這次都是鍵盤輸入
我想王老大應該沒那閒工夫故意輸入200人的資料讓你的程式爆炸
還有個要點 : 先要求程式能正常執行 再要求語法、記憶體佔用空間 等等
簡單寫一下程式碼
// only in dev c++
int n;
cout<<"請輸入學生數量:";
cin>>n;
int id[n];
float chinese[n],english[n],math[n],sum[n];
cout<<"請依 學號 國文 英文 數學 的順序輸入 例: 1 99 87 85\n";
for(int i=0;i<n;i++)
{
cout<<"請依序輸入第 "<<i+1<<" 個同學的 座號 國文 英文 數學 成績:";
cin>>id[i]>>chinese[i]>>english[i]>>math[i];
sum[i]=chinese[i]+english[i]+math[i];
}
*PS
青綠色部分 Visual C++ 不支援這個語法 他要用 new ( 指標那邊才會教 )
請改用 int id[1000];float chinese[1000],english[1000],math[1000],sum[1000];
功能選擇畫面
這裡要解說老師要求的那個函數
先想像不用函數的時候怎麼寫
int sortby;
cout<<"請輸入依照什麼分數排序\n[1]總分\n[2]國文\n[3]...\n[4]..:";
cin>>sortby;
switch(sortby)
{
case 1:
// 依照總分
break;
case 2:
// 依照某科成績
break;
case 3:
// 依照另一科
...
}
上面是我星期三看到大多人的寫法
好 再來怎麼拉成函數呢?
其實只要動兩行就好
把 cin>>sortby; 改成 sortby=choose();
然後寫一個函數叫把cout跟cin兩行放進去
int choose()
{
int a;
cout<<"請輸入依照什麼分數排序\n[1]總分\n[2]國文\n[3]...\n[4]..:";
cin>>a;
return a;
}
choose裡面做的事情很簡單
顯示提示語 輸入一個數字存到a 然後把a return 給等號左邊的變數
這樣就搞定囉
排序
想想氣泡排序法之前怎麼排序五個數字的
int a[5]={1,3,5,2,4};
int t;
for(int i=0;i<5;i++)
{
for(int j=i;j<
4;j++)
{
if(a[j+1]>a[j])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=a[j];
}
}
}
注意那個4是怎麼回事
因為判斷式子是寫 a[j+1]>a[j]
j<4 所以 j=0~3
這個式子頂多是 a[4]>a[3]
如果寫 j<5 就會變成 a[5]>a[4] 但 a[5] 並沒有用到
所以會把其他程式留在記憶體上的垃圾數據拿來排序 得到意想不到的結果(?)
再來另外一個重點是
現在每個人有5筆資料(學號、三個成績、總分)
所以比較完之後 要交換一次就要把五個資料一起交換
程式碼:
int t2;
float t;
switch(sortby)
{
case 1: // 總分排序
for(int i=0;i<n;i++)
{
for(int j=i;j<n-1;j++)
{
if(
sum[j+1]>sum[j])
{
t2=id[j];
id[j]=id[j+1];
id[j+1]=t2;
t=chinese[j];
chinese[j]=chinese[j+1];
chinese[j+1]=t;
t=english[j];
english[j]=english[j+1];
english[j+1]=t;
t=math[j];
math[j]=math[j+1];
math[j+1]=t;
t=sum[j];
sum[j]=sum[j+1];
sum[j+1]=t;
}
}
}
break;
case 2: // 依照國文排序
for(int i=0;i<n;i++)
{
for(int j=i;j<n-1;j++)
{
if(
chinese[j+1]>chinese[j])
...
其他排序的選項只要複製case1裡面全部的東西然後改青色部份就好
}
排序結束以後 依照大到小cout出來 這個不用我說了吧
呼 打完了
有什麼問題就MSN或推文問我吧
大家加油
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.167.188.87
推 rockmyangel:謝謝學長!!!!!!!!!!!!!!!!!!!!!!!!!!!!!我會盡力看它! 01/09 23:20
推 silufy:cow好好笑.....XD 謝謝學長!!!!!:) 01/09 23:32
推 jim19900412:學長準備被王老大解僱了 01/09 23:34
推 cindy1006:感謝學長!!!:] 01/09 23:36
推 Gary2005123:學長你人太好拉,不推的還是人嗎? 01/09 23:39
推 rockmyangel:為什麼說學長要被王老大解雇? 01/09 23:45
推 gavingo15:學長人真好 01/10 00:00
推 sscs:感謝學長啊!! 01/10 00:01
推 jeff33:學長太感謝你啦!!!推推推 01/10 15:33
推 peipei610:學長好棒唷 :) 謝謝!! 01/10 23:15
推 aklewis1128:受益良多~3Q 01/11 00:44
推 aeolus1215: 授液量多~3Q 學長謝謝!! 01/11 01:52
推 StranGhost:學長辛苦了,謝謝! 01/11 02:35
推 linjrming:aeolus1215: 授液量多~3Q 學長謝謝!! 01/11 14:16
推 feather427:耶嘿 , 學長謝謝你!! :) 01/11 14:24
推 casey75489:推受液量多!!!!!!!!!XDXDXD 01/11 15:31
推 casey75489:再推一次受液量多~~~~~ XDXD 謝謝學長!! 01/11 15:48
推 jerry771210:去年我們都沒有這種待遇~哭哭 學長人真好 01/12 09:29
推 gurocloudia:wow~雖然我看不懂...不過真的很感謝學長嘿! 01/12 17:42