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燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP