作者game0416 (凤狼)
看板NTUE-CS102
标题Re: [闲聊] 程设作业
时间Sun Jan 3 22:17:49 2010
拖稿中(?)
因为那作业没要交,所以想说慢慢来就拖到现在了(思)
先来复习一下上了什麽...
1.二维阵列
2.字串处理
3.泡沫排序法
先来看看这个二维阵列...先从一维开始讲好了
首先,我会解释一维阵列是 "宣告复数个同样类型的变数"
从同样的角度看待二维阵列,可以解释成"宣告复数个同样大小、类型的阵列"
比如下面这页.....
--
这是
int a
┌—┐
| |
└—┘
这是
int a[
10]
┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐
|0|1|2|3|4|5|6|7|8|9|
├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤
|?|?|?|?|?|?|?|?|?|?|
└—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘
这是
int a[
2][
10]
┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐
|0|1|2|3|4|5|6|7|8|9|
├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤
|?|?|?|?|?|?|?|?|?|?|
└—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘
┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐
|0|1|2|3|4|5|6|7|8|9|
├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤
|?|?|?|?|?|?|?|?|?|?|
└—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘
--
大概是这样的感觉跟用法,多维可以用同样的方式去扩张解释
我自己看待、处理二维阵列大概有种XY平面的感觉就是了
只是前面是Y值、後面是X值,不然概念会乱掉(死)
再来是字串处理,所谓的字串就只是一个字元阵列(摆字元的阵列)
用
char a[
10];
像这样的阵列,就能够用来摆字串
输入字串时大概用cin或cin.getline()
比如说
cin >> a;
输入ABCDEFG(enter)
阵列内容就会装进这样的内容
┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐
|0|1|2|3|4|5|6|7|8|9|
├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤
| A| B| C| D| E| F| G|\0|?|?|
└—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘
--
如果是用cin.getline(a,10,'\n')也会是一样的结果
: 嗯..cin.getline标准用法上,好像是不加最後一个标示字串结束在哪个字元就是
cin.getline函式内引用值分别是(阵列名称,最大字串范围,结束字元)
换行的enter同时带有蛮多东西...不过先用\n就可以了
最後是个泡排
这样去解释泡排...有N个未经排序的数值
把最大(或最小)丢到最末端(最首)
然後把次大(次小),摆到次末(次首),然後不断重复这样行为N-1次
就能让这些数值变成一个经过排序的数值,称为泡沫排序法
如同泡沫会往上浮一样,让你的数值(泡沫)往上浮到最顶端(阵列最末端)
这里可以拿出课本7-11、7-12页的地方有图例
它的四个loop内容就是一次一次把阵列中的最大值、次大值由大而小排序
--
范例code的部份..
大概是
int a[
10];
for (
int i=
0;i<
10;i++)
cin >>a[i];
for (
int i=
0;i<
10;i++)
for (
int j=i;j<
10;j++)
if (a[i]<a[j])
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
好,我决定就这样草草带过(咦)
--
再来看这个作业目标...
1.输入姓名、成绩
2.照成绩排序
3.输出名次、姓名、成绩
同样不论没意义的介面...
首先是输入姓名、成绩
如果都用cin来写应该没什麽问题,反正分隔就很直观的判断
这部份用cin写的问题,大多是不知道二维阵列怎麽用
回顾一下如何使用cin输入字串
char a[
10];
cin >>a;
再来看二维...就像前面说过的,二维就是宣告复数个阵列而已
所以用法很单纯只是
--
char a[
10][
10];
cin >>a[
0];
像这样,cin>>阵列名称 就好,不要想太多变成cin >> a[
0][
0];
另外一方面,使用cin.getline(a[
0],10)又有另外一个问题...
照题目要求,所以用getline一定是分行输入,假设有另外一个grade[10]来装成绩
cin.getline (a[
0],
10);
cin >> grade[
0];
cin.getline (a[
1],
10);
cin >> grade[
1];
通常会写成这样,或与之等价的for回圈等
而输入
aaa
99
bbb
98
就会发现到
输入完的a[
1]会是空的或是根本就乱码化、执行错误...为什麽呢?
--
理由是这样的...
虽然看不到,可是系统中,我们输入这段的实际内容是
aaa\n
99\n
bbb\n
98\n
回头跟code比较,一开始aaa\n可以正常输入进a[
0]
然後99也进去了...可是cin不会把99後面这个\n吃掉,也不会摆进grade[
0]里面
所以这个\n自然被下一行指令处理
由a[
1]接受,後面的bbb被硬塞进grade[
1]里面...当然就造成执行错误了
解决方式很简单...另外宣告一个char变数,多使用一个cin.getline将那个\n吸收掉
如下页
--
char b[
5];
cin.getline (a[
0],
10);
cin >> grade[
0];
cin.getline (b,
5);
cin.getline (a[
1],
10);
cin >> grade[
1];
像这样,就能够正常输入了,那个没有被接受的\n也会被使用掉
再来是排序...单单排序我想不会是太大问题
这有问题我也不知道怎麽救了(囧a)
这里有问题的大概就是不知道怎样把分数、名字一起排
其实就只是分数要交换时,名字在一起交换就是了
记得善用strcpy去做交换就可以了
--
乱写的范例...
char a[
10][
10];
int grade[
10];
for (
int i=
0;i<
10;i++)
cin >>a[i] >>grade[i];
for (
int i=
0;i<
10;i++)
for (
int j=i;j<
10;j++)
if (grade[i]<grade[j])
{
int tmp=grade[i];
char tmpa[
10];
strcpy (tmpa,a[i])
grade[i]=grade[j];
strcpy (a[i],a[j]);
grade[j]=tmp;
strcpy (a[j],tmpa);
}
有点恶心,不过大概就是这样
--
最後的输出..
排名跟排序方向不同的话两种作法
以范例来说倒是没这种问题,有的人把最大值摆到最後面就会有这样的问题
1.反过来排,这个最直观...
2.输出做处理
什麽意思呢...比如说,今天10个人,排第一的放在a[9]、排第二的放在a[8]
相反的,第一名的名次=10-9,第二名=10-8
像这样就能形成一个规律,所以我可以
for (
int i=
9;i>=
0;i--)
cout <<10-i <<' ' <<a[i] <<' ' <<grade[i];
像是这样去做列出名次这样
类似的用法会用在旁边风娘出的基本练习题里面
大家就加油吧(远目)
--
红白本命
○楽园の巫女
博丽 霊梦 职业:博丽神社の巫女さん
Hakurei Reimu 能力:主に空を飞ぶ程度の能力
@东方project系列
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 58.114.76.199
1F:→ CaptainWill:强大推(CDing 囧 01/03 22:21
2F:推 pk873:说好了不想打 结果还是打了 矛盾可爱的凤狼大大-ˇ- 01/03 22:44
3F:推 Arashinoon:凤郎越来越专业了...连PAGEDOWN都那麽完美 01/03 22:46
4F:→ game0416:那个明明一直都有在做编排QQ 01/03 22:55
5F:→ gcobc12632:我记得这只是练习不算作业不是吗= =? 01/03 23:20
6F:推 gingkoginkgo:二楼 那个叫傲娇= W= 01/03 23:59
7F:推 Genya0:是男的,所以叫骄傲!(挺~ 01/04 00:53