作者yantchen (球童Yanting)
看板NTUE-CS102
标题[闲聊] 希加佳
时间Sun Jan 17 21:21:45 2010
凤狼大大前面PO过一篇了
这篇就简单讲 如果是我改的话 我会注意的点
跟我看到的问题好了
---
第一题 解ax^2+bx+c=0的x
我想应该没有人用 因式分解 来解题吧
有的话请受小弟一拜 XD
公式解
-b ±√(b^2-4ac)
x = --------------------
2a
这题考的地方有两个
1. 会不会把数学式子转成程式
2. 会不会注意负数开根号 除以零 之类的问题
开根号 请看课本6-30页 ( sqrt 要 #include<cmath> )
大部分的人都做到 1 了 但是 2 却没有注意到
先看一下下面的程式
double a, b, c, d;
cout<<"请输入 a,b,c 程式将解出 ax^2+bx+c=0 的 x :";
cin>>a>>b>>c;
d=sqrt(b*b-4.0*a*c);
if(b*b-4.0*a*c<0)
{
cout<<"无实数解";
}
else
{
cout<<"x= " << (-b+d)/(2*a) <<" or "<< (-b-d)/(2*a);
}
再看程式2
double a, b, c, d;
cout<<"请输入 a,b,c 程式将解出 ax^2+bx+c=0 的 x :";
cin>>a>>b>>c;
d=b*b-4.0*a*c;
if(d<0)
{
cout<<"无实数解";
}
else
{
d=sqrt(d);
cout<<"x= " << (-b+d)/(2*a) <<" or "<< (-b-d)/(2*a);
}
有看出差异吗?
在於 sqrt 使用的时机
因为 sqrt 只能开正的 ( 虚数内建的 sqrt 不支援 课本有说 )
所以 必须在 sqrt 之前 先检查 再开根号
类似的例子例如
double h, w;
cout<<"请输入身高(公尺) 体重 计算BMI :"
cin>>h>>w;
cout<<"你的BMI是"<<w/h/h;
要是哪个家伙他把身高打成0
你就得去跟微软回报了
比较好的作法是
cin>>h>>w;
if(h==0) cout<<"除出来是无限大耶 你一定比神猪还胖";
else cout<<"你的BMI是"<<w/h/h;
---
第二题 字串排序
字典顺序: 比较两字串的第一个字 若有大小差异就是这两字串的大小差异
若相同 则比较第二个字 以此类推
字的大小怎麽比较?
电脑里面 每个字都有个代码 英文的部份叫做 ascii
例如 A=65, B=66, a=96, d=100
所以比较字元的时候
char c1='a', c2='d'
if(c1>c2) // 他会自动转成 96>100 = false
所以字典顺序是这样
char s1[]="june", s2[]="july", s3[]="may", s4[]="may";
去比较 s1跟s3的话
先比较第一个字 s1是j, s3是m, j<m 所以 s1<s3
比较 s1跟s2的话
第一个字 s1是j s2是j j=j 所以要比较第二个字
第二个字 s1是u s2是u u=u 好衰 还要比第三个
第三个字 s1是n s2是l n<l 所以 s1<s2
这样字典顺序懂了吧~
但要是两个字串根本一样勒
比较 s3跟s4
第一个字 s3=m s4=m 比下一个
第二个字 s3=a s4=a 比下一个
第三个字 s3=y s4=y 比玩了 所以 s3==s4
但是 这题根本不用这样做= =+
请看课本 7-19
字典顺序只是个幌子
课本 7-19 有提到 C++ 提供的 strcmp 函数的功能
"函式会取两字串的第一个字元相减, 如果为0则比较下一个字元
直到差不为零便传回差值"
这不就是上面提到的作法吗 XD
回来看题目
排序 -> 请回想两个回圈的气泡排序
先看排序数字
int i,j,n,t;
int a[
1000]; // 最多可存
1000个数字
cout<<"有几个数字?";
cin>>n;
for(i=0;i<n;i++) cin>>a[i];
for(i=0;i<n;i++){
for(j=0;j<n-1;j++){
if(
a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
换成字串 看结果你就会发现根本是一样的作法
int i,j,n;
char a[
1000][
100]; // 最多可存
1000个名子 每个名子
100个空间
char t[
100]; // 交换用
cout<<"有几个名子?";
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n;i++){
for(j=0;j<n-1;j++){
if(
strcmp(a[j],a[j+1])>0){
strcpy(t,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],t);
}
}
}
请看我标色的地方
概念 作法 都是类似的
只是语法需要因地事宜一下
另外请记得 要 #include<cstring>
---
第三题 求数列
他有两个变数
如果先遮掉一个 x, 带数字进去
x=2
1
Σ a[i]*a[1-i]
i=0
这样就会算了吧?
int i, s=0; // 算加总 先设0 ( 连乘设1 )
int a[12];
a[0]=1;
a[1]=1;
for(i=0;i<2;i++)
s+=a[i]*a[1-i];
a[2]=s;
然後 把s替换成a[2]
int i;
int a[12];
a[0]=1;
a[1]=1;
a[2]=0;
for(i=0;i<2;i++)
a[2]+=a[i]*a[1-i];
接下来把 x 拿回来看
现在a里面有0~11
每个元素都跟a[2]一样算法
当然你可以
a[2]=0;
for(i=0;i<2;i++)
a[2]+=a[i]*a[1-i];
a[3]=0;
for(i=0;i<3;i++)
a[3]+=a[i]*a[2-i];
a[4]=0;
for(i=0;i<4;i++)
a[4]+=a[i]*a[3-i];
...
但你有发现吗 她们都是一样的程式码 为什麽不用回圈呢?
int i, x;
int a[12];
a[0]=1;
a[1]=1;
for(x=2;x<12;x++)
{
a[x]=0;
for(i=0;i<x;i++)
a[x]+=a[i]*a[x-i-1];
}
一步一步改成这样
应该了解要怎麽做了吧XD
---
第四题 成绩单
输入跟排序的部份 就不再解释了
直接切到重复排名的部份
如果分数长这样
a 50
b 30
c 30
d 70
e 20
那麽排出来 就会变成
1 d 70
2 a 50
3 b 30
3 c 30
5 e 20
我一样用前面一步一步做的方法 来看怎麽解
首先 如果你已经排好了 你应该会这样cow
for(i=0;i<n;i++)
cout<<"第"<<i+1<<"名"<<'\t'<<name[i]<<'\t'<<ch[i] ... // 输出每科成绩 略
这样排出来会变成
1 d 70
2 a 50
3 b 30
4 c 30
5 e 20
现在引入新的变数 j 计算名次
int j=1;
for(i=0;i<n;i++)
{
cout<<"第"<<j<<"名"<<'\t'<<name[i]<<'\t'<<ch[i] ... // 输出每科成绩 略
j++;
}
排出来的结果 ...
1 d 70
2 a 50
3 b 30
4 c 30
5 e 20
嗯 还是一样 但是如果我动点手脚
int j=1;
for(i=0;i<n;i++)
{
cout<<"第"<<j<<"名"<<'\t'<<name[i]<<'\t'<<ch[i] ... // 输出每科成绩 略
if(sum[i]!=sum[i+1]) j++;
}
齁齁 这时候就有不一样罗
1 d 70
2 a 50
3 b 30
3 c 30
4 e 20
但是这还不是我们想要的
因为重复排名後 e 应该是第五名
请再观察正确的成绩单
1 d 70
2 a 50
3 b 30
3 c 30
5 e 20
有没有发现 其实 不看重复的部份 排名(j)就等於i+1
所以
再改一下就完成罗
int j=1;
for(i=0;i<n;i++)
{
cout<<"第"<<j<<"名"<<'\t'<<name[i]<<'\t'<<ch[i] ... // 输出每科成绩 略
if(sum[i]!=sum[i+1]) j=i+2; // 因为 i+1 是现在这个人的排名 i+2是下一个人
}
大功告成
---
大概是这样
快点动工写一写吧
作业建议还是自己写
交别人的程式 大二还是得拿人家的程式
有问题
可以打下面这支MSN:
[email protected]
会有专人帮你看程式码
但你要先知道你大概bug在哪 或是有bug找不到
我会帮你看程式码 跟你说的bug要怎麽改
如果你是改好了 请自己测试
看程式码找bug那个是打分数的时候才要做的事
寒假来罗 大家加油嘿
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 120.127.36.183
※ 编辑: yantchen 来自: 120.127.36.183 (01/18 01:24)
※ 编辑: yantchen 来自: 120.127.36.183 (01/18 01:41)
1F:推 pk873:那个MSN是人工智慧机器人 跟OPEN小将一样 输入不同的关键字 01/18 02:06
2F:→ pk873:会回答你不同的话喔 揪咪 ^-< ~* 01/18 02:07