前言:
只要是c++有關於指標的都會記錄在這裡,不定期新增內容。
2016/12/21
10035 - Primary Arithmetic
這是我自己的寫法,沒想到竟然寫得出來,盡管彈性不好,但自己動手寫一次思考一下很重要。
再來看看書上的寫法:
值得學習的地方有....
第11行while:把判斷0 0的狀況寫在這一行。
第3~8行與15、16行的函式寫法:另外寫個函式把值存入陣列做處理,注意該函式for迴圈中的n!=0,也可這樣寫,和第三個參數int &cnt,這是用來存這個值有幾個位數用的,假設值為4889,第6行每除一次少一個位數,直到這個位數除到變0為止,所以會做4次,而&cnt參考至lenA的記憶體位址,等於最後lenA的值也是4。
第17行:max()函數會取最大的值。
第19~26行:其實第22行可以省略,這行只是把相加的值存入陣列而已,但題目只需判斷進位次數。這迴圈就是判斷相加的進位次數,可看到第19行 i<lenM,試問,我們要怎麼知道我們判斷進位次數的for迴圈要做幾次?還是直接給它設一個固定且夠的值就好?所以我們需要知道兩數裡面位數最多的數是誰,並且有幾位數,第17行及divide函式cnt就是在做這件事。
#include <iostream>
using namespace std;
int PTT(int d,int array[]){
for(int i=0;i<=3;i++){
array[i]=d%10;
d=d/10;
}
}
int main() {
int arr[5]={};
int brr[5]={};
int r=0,m=0;//r為第一個數,m為第二個數
while(cin>>r>>m){
if(r==0 && m==0) break;
int carryok[10]={0};
int count=0;
PTT(r,arr);
PTT(m,brr);
for(int i=0;i<4;i++){//判斷進位的迴圈
if(arr[i]+brr[i]+carryok[i]>= 10){
carryok[i+1]++;
count++;
}
}
/*if(arr[0]+brr[0] >= 10){//個位數
carryok++;
count++;
}
if(arr[1]+brr[1]+carryok>=10){//十位數
carryok_2++;
count++;
}
if(arr[2]+brr[2]+carryok_2>=10){//百位數
carryok_3++;
count++;
}
if(arr[3]+brr[3]+carryok_3>=10){//千位數
carryok_4++;
count++;
}*/
switch(count){
case 0:
cout<<"No carry operation."<<endl;
break;
case 1:
cout<<count<<" carry operation."<<endl;
break;
case 2:
cout<<count<<" carry operations."<<endl;
break;
case 3:
cout<<count<<" carry operations."<<endl;
break;
}
}
}
再來看看書上的寫法:
#include <iostream>
using namespace std;
int divide(int n,int arr[],int &cnt){
for(cnt=0;n!=0;cnt++){
arr[cnt]=n%10;
n=n/10;
}
}
int main() {
int a,b;
while(cin>>a>>b && (a!=0 || b!=0)){
int lenA=0,lenB=0;
int arrA[11]={0},arrB[11]={0};
int sum[12]={0};
divide(a,arrA,lenA);
divide(b,arrB,lenB);
int lenM=max(lenA,lenB);
int ans=0;
for(int i=0;i<lenM;i++){
sum[i]=sum[i]+(arrA[i]+arrB[i]);
if(sum[i]>=10){
sum[i]=sum[i]-10;
sum[i+1]++;
ans++;
}
}
if(ans==0){
cout<<"No carry operation."<<endl;
}
else if(ans==1){
cout<<"1 carry operation."<<endl;
}
else cout<<ans<<" carry operation."<<endl;
}
}
這樣寫法很彈性。值得學習的地方有....
第11行while:把判斷0 0的狀況寫在這一行。
第3~8行與15、16行的函式寫法:另外寫個函式把值存入陣列做處理,注意該函式for迴圈中的n!=0,也可這樣寫,和第三個參數int &cnt,這是用來存這個值有幾個位數用的,假設值為4889,第6行每除一次少一個位數,直到這個位數除到變0為止,所以會做4次,而&cnt參考至lenA的記憶體位址,等於最後lenA的值也是4。
第17行:max()函數會取最大的值。
第19~26行:其實第22行可以省略,這行只是把相加的值存入陣列而已,但題目只需判斷進位次數。這迴圈就是判斷相加的進位次數,可看到第19行 i<lenM,試問,我們要怎麼知道我們判斷進位次數的for迴圈要做幾次?還是直接給它設一個固定且夠的值就好?所以我們需要知道兩數裡面位數最多的數是誰,並且有幾位數,第17行及divide函式cnt就是在做這件事。
2016/12/16
C++ 像陣列的Vector
- Vector可代替陣列,也可當加強版陣列
- 可用陣列形式操作Vector
- 使用前,加入表頭檔#include <vector>
- 使用前先設定好長度、型態 vector<int> ivector(10);//表型態為int,長度為10
- 可用size()看自己長度
- 可用empty()看是否空
2016/12/15
2016/11/30
M90H023:三角形重心
//公式:(a1+a2+a3/3,b1+b2+b3/3)
#include <iostream>
using namespace std;
int main(){
double a1=0,a2=0,a3=0;
double b1=0,b2=0,b3=0;
double x=0,y=0;
cin>>a1;
cin>>b1;
cin>>a2;
cin>>b2;
cin>>a3;
cin>>b3;
x=(a1+a2+a3)/3;
y=(b1+b2+b3)/3;
cout <<"("<<x<<","<<y<<")";
}
M90H011:整數商餘
#include <iostream>
using namespace std;
int main(){
int a=0,b=0,c=0,t=0;
cin>>a;
cin>>b;
c=a/b;
t=a%b;
cout << endl;
cout <<a<<" / "<<b<<"="<<c<<"\n";
cout <<a<<" mod "<<b<<"="<<t;
}
F020:計算BMI
#include <iostream>
using namespace std;
int main(){
double w,h,bmi;
cin>>h;
cin>>w;
bmi=w/(h*h);
cout << bmi<<"\n";
if(bmi<18.5)cout << "too thin";
else if(bmi>=18.5&&bmi<24)cout << "standard";
else cout <<"too fat";
return 0;
}
M90H007:考試調分(低成60高100)
#include <iostream>
using namespace std;
int main(){
int a,minScore=9999,maxScore=-9999;
int scores[60];
for(int i=0;i<60;i++){
cin >>a;
scores[i]=a;
if(a>maxScore) maxScore=a;
if(a<minScore) minScore=a;
}
for(int i=0;i<60;i++){
int ans=(100-60)*(scores[i]-minScore)/(maxScore-minScore)+60;
cout <<ans<<"\n";
}
return 0;
}
2016/06/02
徹底修改Android 套件、應用程式ID、專案名稱
以Android Studio為例,我們要把一個舊的專案名稱,都改成新的專案名稱。
與專案名稱、ID有關的有3個地方:
- 專案資料夾
- 套件名稱
- Gradle的應用程式ID
- string.xml
2016/06/01
2016/05/28
台南裕農路 清淡爽口的老主顧滷味
來台南讀書也待了四年,覺得台南真是一個隨處都有美食的地方
尤其是台南的滷味,選擇真的很多,時常晚餐宵夜配著滷味看著連續劇真是人生一大享受
今天就來介紹一家滷味,這家老主顧滷味位在台南東區裕農路上,自己也吃了很多次, 真心覺得好吃的東西要推薦給大家!
尤其是台南的滷味,選擇真的很多,時常晚餐宵夜配著滷味看著連續劇真是人生一大享受
今天就來介紹一家滷味,這家老主顧滷味位在台南東區裕農路上,自己也吃了很多次, 真心覺得好吃的東西要推薦給大家!
2016/05/24
2016/05/21
2016/05/20
PHP PDO Select 從資料庫中查詢資料
發現之前學一陣子的PHP,太久沒碰差點忘掉了,而好不容易也玩過PDO,怎可以就這樣忘光光呢,發現會的東西一定要保持住,所以想寫篇文章來做個筆記。
本篇主要就是講基本的用PDO從資料庫中讀取資料至網頁來。
本篇主要就是講基本的用PDO從資料庫中讀取資料至網頁來。
2016/05/17
2016/05/12
匿名內部類別(Anonymous inner class)
例1,static class A就是匿名內部類別,用參考名稱z,去呼叫showMe()。
package anonymous1;
public class Anonymous1 {
static class A{
int i =0;
public String showMe(){
return "This is X";
}
}
public static void main(String[] args) {
final String ff="final"; //如果要在內部匿名類別中使用某個方法中的變數,它必須宣告為 final
A z = new A(){ //匿名類別override showMe方法
public String showMe(){
return "This is Z"+i+ff; //可存取A類別的成員
}
}; //注意分號別漏掉
System.out.println(z.showMe());
}
}
//run:
//This is Z0final
2016/05/11
C++的#include <iostream> 與名稱空間namespace
前言:
這篇主要是討論C++底層的一些觀念的東西。
我覺得在學一個新東西前,一定要先了解他的來由始末,而不是只懂皮毛,初學者也別小看C++一開始的Hello World,這麼一小段程式背後還是有很多東西可以學,至少要懂它每段語法結構,和它運作的概念。
ps..這篇文章實際標題是C++的#include <iostream> 與名稱空間namespace,因為<iostream>含特殊字元,不然不能直接顯示出來,幸好上次有碰過這問題,所以這網站真的好用。
Code::Blocks建立C++專案 :第一隻Hello World!
工欲善其事,必先利其器。
覺得Code::Blocks這IDE比DevC++好用多了,各位不要再用DevC++,光不用打System pause就贏一半了。
這裡就先來個創C++專案的紀錄和寫第一隻Hello World吧!
2016/05/10
interface介面:Java為例
接下來討論interface介面這東西,先假設我們要做一個海洋樂園遊戲,也假設我們不會用interface,也許你會先定義fish這類別且有swim():
public abstract class Fish {
protected String name;
public Fish(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract void swim();
}
每種魚游泳方式可能不一樣,所以swim()為abstract,那class也要abstract了。2016/05/09
在Blogger中貼程式碼
以下是成果
public class Shape2D { // define super class
public double area() { // all Shape2D have their own area
return 0;
}
}
public class Rectangle extends Shape2D {
private double length, width;
public Rectangle(double l, double w) { // define constructor
length = l;
width = w;
}
public double area() { // Override
return length * width;
}
}
public class Circle extends Shape2D {
private double radius;
public Circle(double r) {
radius = r;
}
public double area() { // Override
return 3.141592654 * radius * radius;
}
}
public class Parallelogram extends Shape2D {
private double top, bottom, height;
public Parallelogram(double t, double b, double h) {
top = t;
bottom = b;
height = h;
}
public double area() { // Override
return (top + bottom) * height / 2.0;
}
}
publicclass Main {
public static double sum(Shape2D[] shapes) {
double total = 0;
for (int i = 0; i < shapes.length; i++) {
total += shapes[i].area(); // use Virtual Function to calculate area of Shape2D
// Without Virtual Function, value of Shape2D.area() will be 0
}
return total;
}
public static void main(String[] argv) {
Shape2D[] data; // array of reference to Shape2D
data = new Shape2D[5]; // create array object
data[0] = new Rectangle(2.4, 3.8); // Polymorphism
data[1] = new Circle(3.9);
data[2] = new Parallelogram(3.5, 6.7, 10.2);
data[3] = new Rectangle(5.3, 7.2);
data[4] = new Circle(4.6);
System.out.println("Sum of all Shape2D is "+sum(data));
}
}
2016/05/08
protected:Java為例
本篇參考良葛格-protected 成員
拿之前RPG遊戲拿說,現在我們想顯示角色細節,要這樣寫:
拿之前RPG遊戲拿說,現在我們想顯示角色細節,要這樣寫:
1 2 3 4 | SwordsMan swordsMan = new SwordsMan(); ...略 System.out.printf("劍士 (%s, %d, %d)%n", swordsMan.getName(), swordsMan.getLevel(), swordsMan.getBlood()); |
2016/05/06
抽象類別與方法abstract
承上篇:多型(Polymorphism):重新定義實作@Override
並參考1:良葛格-抽象方法、抽象類別
參考3:Gossip@Openhome
abstract method宣告方式:不用{},直接 ; 結束即可。
並參考1:良葛格-抽象方法、抽象類別
參考3:Gossip@Openhome
參考4:Davidou's Blog-[Java]6.抽象(Abstract)與介面(Interface)
參考5:Java 介面(Interface)與抽象類別(Abstract class)的差異
參考5:Java 介面(Interface)與抽象類別(Abstract class)的差異
如果一個class裡有一個抽象方法abstract method,那這個類別就必須定義為抽象類別abstract class 。
1 2 3 4 5 6 | package Cast; public abstract class Role { ...... public abstract void fight(); ...... } |
abstract class宣告方式:一定要在class前加abstract關鍵字。
2016/05/04
多型(Polymorphism):重新定義實作@Override
承上篇:OOP:多型(Polymorphism) 以Java為例、protected:Java為例
前言:這篇主要是探討Java中重新定義Override,根據參考資料自己做的筆記與心得,如日後有新發現都會陸續增加。
2016/05/03
OOP:多型(Polymorphism) 以Java為例
參考2暨南教科書多型基本觀念
參考3什麼是物件導向(3):Polymorphism
參考4Java 快速導覽 - 物件導向概念 多型
參考5劉逸-論物件導向part 5:Polymorphism
參考6程式設計俱樂部-OOP 中對 "多型" 的理解
參考7歐萊禮-多型
這裡主要是討論OOP多型的概念,爬了些資料自己做些整理。
首先看到參考1良葛格所寫,它把多型想成「is-a 關係」(是一種關係)來看,讓初學者很容易初步的理解多型的概念,與什麼時候的多型寫法會編譯失敗
參考3什麼是物件導向(3):Polymorphism
參考4Java 快速導覽 - 物件導向概念 多型
參考5劉逸-論物件導向part 5:Polymorphism
參考6程式設計俱樂部-OOP 中對 "多型" 的理解
參考7歐萊禮-多型
這裡主要是討論OOP多型的概念,爬了些資料自己做些整理。
首先看到參考1良葛格所寫,它把多型想成「is-a 關係」(是一種關係)來看,讓初學者很容易初步的理解多型的概念,與什麼時候的多型寫法會編譯失敗
2016/05/01
NetBeans IDE 8.1 更換主題theme
參考資料 http://codesleepshred.com/dark-netbeans-themes-oblivion-revival-and-monokai/
這網址提供兩個主題一個sublime的monokai和Oblivion Revival ?
我選sublime的monokai
附上成果
結果我是覺得還可以,只是它那綠底的反白我不太喜歡,但應該是可以調改天研究
monokai套進去後,不是那樣反白橘色的,反白後的文字也不是白的,我另外調的,稍微筆記一下...畢竟也是找了下....
NetBeans IDE>上排工具>選項>Fonts&Colors>Highlighting>Selected Text
Foreground:反白後的文字顏色
Background:反白的背景顏色
Effects:反白後是否要有底線之類的,可自玩玩看
這網址提供兩個主題一個sublime的monokai和Oblivion Revival ?
我選sublime的monokai
附上成果
結果我是覺得還可以,只是它那綠底的反白我不太喜歡,但應該是可以調改天研究
monokai套進去後,不是那樣反白橘色的,反白後的文字也不是白的,我另外調的,稍微筆記一下...畢竟也是找了下....
NetBeans IDE>上排工具>選項>Fonts&Colors>Highlighting>Selected Text
Foreground:反白後的文字顏色
Background:反白的背景顏色
Effects:反白後是否要有底線之類的,可自玩玩看
OOP:繼承(Inheritance) 以Java為例
本篇參考 http://openhome.cc/Gossip/Java/Inheritance.html
繼承的目的就是為了避免多個類別重複相同的實作。
先假設今天要開發一個RPG遊戲,一開始角色有劍士和魔法師,先定義劍士:
再來是魔法師:
可看到上面粗體+斜體+底線的地方與劍士重複了?重複的東西幹嘛一直寫呢?所以繼承就出現了
現在開始實作繼承(Inheritance)
步驟一:把重複的地方"拿出"去,當父類別,並且給父類一個新名字
步驟二:把子類別繼承父類別
現在來開始做
步驟一:把重複的地方"拿出"去,當父類別,並且給父類一個新名字叫Role
步驟二:把子類別繼承父類別
關鍵字extends繼承,把SwordsMan類別繼承Role類別,前面是子類別繼承父類別
Magician也一樣繼承Role:
如此一來,Role中定義的程式碼,SwordsMan與Magician中都有了
如何確定有真的繼承?試試看知:
注意,如果demoMagician與demoSwordsMan method沒有加static會編譯錯誤,因為main是static宣告,只有static能用static,還有final宣告的類別不能被繼承,否則會編譯錯誤!
換句話說,如果你不想你的類別被其他子類別繼承,那就請你把類別宣告成final
final class classname{
//...
}
還有,Java中,子類別只能繼承一個父類別,所以基本上你不會看到這種東西:
問題1:private成員可繼承嗎?可以
問題2:private成員繼承後,子類別可存取它嗎?不能,除非父類別提供method給子存取
反白看答案
繼承的目的就是為了避免多個類別重複相同的實作。
先假設今天要開發一個RPG遊戲,一開始角色有劍士和魔法師,先定義劍士:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
再來是魔法師:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
可看到上面粗體+斜體+底線的地方與劍士重複了?重複的東西幹嘛一直寫呢?所以繼承就出現了
現在開始實作繼承(Inheritance)
步驟一:把重複的地方"拿出"去,當父類別,並且給父類一個新名字
步驟二:把子類別繼承父類別
現在來開始做
步驟一:把重複的地方"拿出"去,當父類別,並且給父類一個新名字叫Role
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package Cast; public class Role { private String name; private int level; private int blood; public int getBlood() { return blood; } public void setBlood(int blood) { this.blood = blood; } public int getLevel() { return level; } public void setLevel(int level) { this.level = level; } public String getName() { return name; } public void setName(String name) { this.name = name; }} |
步驟二:把子類別繼承父類別
1 2 3 4 5 6 | package Cast; public class SwordsMan extends Role { public void fight() { System.out.println("揮劍攻擊"); }} |
關鍵字extends繼承,把SwordsMan類別繼承Role類別,前面是子類別繼承父類別
Magician也一樣繼承Role:
1 2 3 4 5 6 7 8 9 10 | package Cast; public class Magician extends Role{ public void fight() { System.out.println("魔法攻擊"); } public void cure() { System.out.println("魔法治療"); }} |
如此一來,Role中定義的程式碼,SwordsMan與Magician中都有了
如何確定有真的繼承?試試看知:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package rpg; import Cast.Magician; import Cast.SwordsMan; public class RPG { public static void main(String[] args) { demoSwordsMan(); demoMagician(); } static void demoSwordsMan() { SwordsMan swordsMan = new SwordsMan(); swordsMan.setName("Justin"); swordsMan.setLevel(1); swordsMan.setBlood(200); System.out.printf("劍士:(%s, %d, %d)%n", swordsMan.getName(), swordsMan.getLevel(), swordsMan.getBlood()); } static void demoMagician() { Magician magician = new Magician(); magician.setName("Monica"); magician.setLevel(1); magician.setBlood(100); System.out.printf("魔法師:(%s, %d, %d)%n", magician.getName(), magician.getLevel(), magician.getBlood()); }} |
注意,如果demoMagician與demoSwordsMan method沒有加static會編譯錯誤,因為main是static宣告,只有static能用static,還有final宣告的類別不能被繼承,否則會編譯錯誤!
換句話說,如果你不想你的類別被其他子類別繼承,那就請你把類別宣告成final
final class classname{
//...
}
還有,Java中,子類別只能繼承一個父類別,所以基本上你不會看到這種東西:
package Cast;
public class Magician extends Role,Role2,...{
.............................
}
問題1:private成員可繼承嗎?可以
問題2:private成員繼承後,子類別可存取它嗎?不能,除非父類別提供method給子存取
反白看答案
NetBeans IDE 8.1 好用快捷鍵 筆記
區塊註解/反註解CTRL+SHIFT+C(已自訂為ALT+W)
批次修改變數名稱 CTRL+R
刪除整行CTRL+E
切換至前一個分頁或後一個分頁Previous Tab/Next Tab Ctrl+PgUp/PgDn
切換至上一個瀏覽的分頁 Ctrl+Tab
關閉目前分頁 Ctrl+w
打開剛剛關閉的分頁 Ctrl+Shift+t
以下是Mac OS:
程式碼提示(自動完成)⌘+\
單行註解 ⌘+/ (再按一次 解除註解)
多行註解⌘+shift+c (已自訂為⌃+A)
刪除這行 ⌘+E
選取所有同名變數,集體更換變數(好用!)⌃+R
幫你格式化程式碼 ⌃+Shift+f
清除Output內容 ⌘+L
切換標籤頁面 Fn+⌘+↓or↑
選擇目前這個字Select Word(像Sublime的⌘+D)⌘+D ,這功能需而外在Keymap設定,因Netbeans預設沒幫你設
設定部分:
關閉自動雙引號:Preference>Editor>Insert Closing Brackets Automatically>不要打勾
NetBeans MacOS快速鍵
批次修改變數名稱 CTRL+R
刪除整行CTRL+E
切換至前一個分頁或後一個分頁Previous Tab/Next Tab Ctrl+PgUp/PgDn
切換至上一個瀏覽的分頁 Ctrl+Tab
關閉目前分頁 Ctrl+w
打開剛剛關閉的分頁 Ctrl+Shift+t
以下是Mac OS:
程式碼提示(自動完成)⌘+\
單行註解 ⌘+/ (再按一次 解除註解)
多行註解⌘+shift+c (已自訂為⌃+A)
刪除這行 ⌘+E
選取所有同名變數,集體更換變數(好用!)⌃+R
幫你格式化程式碼 ⌃+Shift+f
清除Output內容 ⌘+L
切換標籤頁面 Fn+⌘+↓or↑
選擇目前這個字Select Word(像Sublime的⌘+D)⌘+D ,這功能需而外在Keymap設定,因Netbeans預設沒幫你設
設定部分:
關閉自動雙引號:Preference>Editor>Insert Closing Brackets Automatically>不要打勾
NetBeans MacOS快速鍵
2016/04/30
不定長度引數
http://www.codedata.com.tw/book/java-basic-source/ch11-2.htm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
訂閱:
文章 (Atom)
