NTUE-CS102 板


LINE

凤狼大大前面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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP