作者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
1F:推 rockmyangel:谢谢学长!!!!!!!!!!!!!!!!!!!!!!!!!!!!!我会尽力看它! 01/09 23:20
2F:推 silufy:cow好好笑.....XD 谢谢学长!!!!!:) 01/09 23:32
3F:推 jim19900412:学长准备被王老大解雇了 01/09 23:34
4F:推 cindy1006:感谢学长!!!:] 01/09 23:36
5F:推 Gary2005123:学长你人太好拉,不推的还是人吗? 01/09 23:39
6F:推 rockmyangel:为什麽说学长要被王老大解雇? 01/09 23:45
7F:推 gavingo15:学长人真好 01/10 00:00
8F:推 sscs:感谢学长啊!! 01/10 00:01
9F:推 jeff33:学长太感谢你啦!!!推推推 01/10 15:33
10F:推 peipei610:学长好棒唷 :) 谢谢!! 01/10 23:15
11F:推 aklewis1128:受益良多~3Q 01/11 00:44
12F:推 aeolus1215: 授液量多~3Q 学长谢谢!! 01/11 01:52
13F:推 StranGhost:学长辛苦了,谢谢! 01/11 02:35
14F:推 linjrming:aeolus1215: 授液量多~3Q 学长谢谢!! 01/11 14:16
15F:推 feather427:耶嘿 , 学长谢谢你!! :) 01/11 14:24
16F:推 casey75489:推受液量多!!!!!!!!!XDXDXD 01/11 15:31
17F:推 casey75489:再推一次受液量多~~~~~ XDXD 谢谢学长!! 01/11 15:48
18F:推 jerry771210:去年我们都没有这种待遇~哭哭 学长人真好 01/12 09:29
19F:推 gurocloudia:wow~虽然我看不懂...不过真的很感谢学长嘿! 01/12 17:42