2016/12/21

C++ 指標

前言:
只要是c++有關於指標的都會記錄在這裡,不定期新增內容。

10035 - Primary Arithmetic

這是我自己的寫法,沒想到竟然寫得出來,盡管彈性不好,但自己動手寫一次思考一下很重要。
#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

C++ 筆記


宣告
建構子
const
unsigned
static_cast
條件運算子
陣列、二維陣列
輸出格式化控制函式與參數
5/10? 5%10?

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/6/2

徹底修改Android 套件、應用程式ID、專案名稱

以Android Studio為例,我們要把一個舊的專案名稱,都改成新的專案名稱。
與專案名稱、ID有關的有3個地方:
  1. 專案資料夾
  2. 套件名稱
  3. Gradle的應用程式ID
  4. string.xml

2016/6/1

Android的OO

把Java的OO大概看過、想過、理解一點後,那就是來應用的時候了。
打鐵趁熱,就來看Android中有哪些東西就是用Java的原理去做的。

2016/5/28

台南裕農路 清淡爽口的老主顧滷味

來台南讀書也待了四年,覺得台南真是一個隨處都有美食的地方
尤其是台南的滷味,選擇真的很多,時常晚餐宵夜配著滷味看著連續劇真是人生一大享受
今天就來介紹一家滷味,這家老主顧滷味位在台南東區裕農路上,自己也吃了很多次, 真心覺得好吃的東西要推薦給大家!

2016/5/24

關鍵字:super

Java中的關鍵字super通常放在已繼承父類別的子類別裡面,用來呼叫父類別的成員

2016/5/21

命名原則

好的命名原則,方便可以馬上辨識,日後也好維護。

2016/5/20

PHP PDO Select 從資料庫中查詢資料

發現之前學一陣子的PHP,太久沒碰差點忘掉了,而好不容易也玩過PDO,怎可以就這樣忘光光呢,發現會的東西一定要保持住,所以想寫篇文章來做個筆記。

本篇主要就是講基本的用PDO從資料庫中讀取資料至網頁來

2016/5/17

Java:TryCatch

TryCatch語法結構是這樣:
try{
    ...
}
catch(物件型態 ex){
    ...
}

Java:流程控制

while(true) { 
    迴圈內容; 
    .... 
}
這樣寫表示無窮迴圈。

2016/5/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/5/11

C++的#include <iostream> 與名稱空間namespace

前言:
這篇主要是討論C++底層的一些觀念的東西。
我覺得在學一個新東西前,一定要先了解他的來由始末,而不是只懂皮毛,初學者也別小看C++一開始的Hello World,這麼一小段程式背後還是有很多東西可以學,至少要懂它每段語法結構,和它運作的概念。
ps..這篇文章實際標題是C++的#include &lt;iostream&gt; 與名稱空間namespace,因為<iostream>含特殊字元,不然不能直接顯示出來,幸好上次有碰過這問題,所以這網站真的好用。

Code::Blocks建立C++專案 :第一隻Hello World!

工欲善其事,必先利其器。
覺得Code::Blocks這IDE比DevC++好用多了,各位不要再用DevC++,光不用打System pause就贏一半了。
這裡就先來個創C++專案的紀錄和寫第一隻Hello World吧!

2016/5/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/5/9

在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/5/8

protected:Java為例

本篇參考良葛格-protected 成員

拿之前RPG遊戲拿說,現在我們想顯示角色細節,要這樣寫:
1
2
3
4
SwordsMan swordsMan = new SwordsMan();
...System.out.printf("劍士 (%s, %d, %d)%n", swordsMan.getName(), 
swordsMan.getLevel(), swordsMan.getBlood());

2016/5/6

抽象類別與方法abstract

承上篇:多型(Polymorphism):重新定義實作@Override
並參考1:良葛格-抽象方法、抽象類別
參考3:Gossip@Openhome
參考4:Davidou's Blog-[Java]6.抽象(Abstract)與介面(Interface)
參考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 method宣告方式:不用{},直接 ; 結束即可。
abstract class宣告方式:一定要在class前加abstract關鍵字。

2016/5/4

多型(Polymorphism):重新定義實作@Override

承上篇:OOP:多型(Polymorphism) 以Java為例protected:Java為例

前言:這篇主要是探討Java中重新定義Override,根據參考資料自己做的筆記與心得,如日後有新發現都會陸續增加。

2016/5/3

OOP:多型(Polymorphism) 以Java為例

參考2暨南教科書多型基本觀念
參考3什麼是物件導向(3):Polymorphism
參考4Java 快速導覽 - 物件導向概念 多型
參考5劉逸-論物件導向part 5:Polymorphism
參考6程式設計俱樂部-OOP 中對 "多型" 的理解
參考7歐萊禮-多型

這裡主要是討論OOP多型的概念,爬了些資料自己做些整理。
首先看到參考1良葛格所寫,它把多型想成「is-a 關係」(是一種關係)來看,讓初學者很容易初步的理解多型的概念,與什麼時候的多型寫法會編譯失敗

2016/5/1

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:反白後是否要有底線之類的,可自玩玩看

OOP:繼承(Inheritance) 以Java為例

本篇參考  http://openhome.cc/Gossip/Java/Inheritance.html

繼承的目的就是為了避免多個類別重複相同的實作。

先假設今天要開發一個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


public class SwordsMan {
    private String name;   // 角色名稱
    private int level;     // 角色等級
    private int blood;     // 角色血量

    public void fight() {
        System.out.println("揮劍攻擊");
    }

    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
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


public class Magician {
    private String name;   // 角色名稱
    private int level;     // 角色等級
    private int blood;     // 角色血量
    
    public void fight() {
        System.out.println("魔法攻擊");
    }
    
    public void cure() {
        System.out.println("魔法治療");
    }

    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;
    }}


可看到上面粗體+斜體+底線的地方與劍士重複了?重複的東西幹嘛一直寫呢?所以繼承就出現了


現在開始實作繼承(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快速鍵

2016/4/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


public class SimpleAdder{
    public int sumOf(int... params){
        int sum = 0;
        for (int i = 0; i < params.length; i++){
            sum = sum + params[i];
        }
        return sum;
    }
 
    public static void main(String[] args){
        SimpleAdder adder = new SimpleAdder();
        System.out.print("1+2+3=");
        System.out.print("1+2+3+4=");
        System.out.print("1+2=");
        System.out.println(adder.sumOf(1, 2));
        System.out.println(adder.sumOf(1, 2, 3));
        System.out.println(
                adder.sumOf(1, 2, 3, 4));
    }}