程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C/C++學習手札(一)

C/C++學習手札(一)

編輯:關於C++

出於需要,最近研究C/C++.簡單熟悉一下這個讓我遺忘多年的語言。作為學習,在這裡記錄。同時對比C與C++的差別。

C的代碼:

#include <stdio.h>
#include <stdlib.h>

/**
 *  定義一個結構體
 */
struct Location {
    int x; // 橫坐標
    int y; // 縱坐標
} location;

int main(void) {
    printf("輸入X坐標:\t\n");

    int x;
    scanf("%d", &x);

    location.x = x;

    printf("輸入Y坐標:\t\n");

    int y;
    scanf("%d", &y);
    location.y = y;

    printf("X坐標是:\t%d\n", location.x);
    printf("Y坐標是:\t%d\n", location.y);

    //  做倒三角打印
    int i;

    for (i = 0; i < y; i++) {
        printf("%d\t", i + 1);

        int j;
        for (j = i; j < x; j++) {
            printf("* ");
        }
        printf("\n");
    }

    return EXIT_SUCCESS;
}

這裡使用了結構體Location,並生成了一個實例location.通過scanf向x、y輸入數字。以location.x = x;方式將數值賦值給結構體location的變量x.由此可以看出結構體就是現在面向對象的基礎,尤其是數據對象的前身。

我們希望打印操作能夠獨立出來,成為一個函數,可以這麼寫:

// 聲明函數
void print(int x, int y);

c是面向過程的計算機語言,要在主函數內調用其他函數,必須要在主函數前聲明函數,要麼就直接把函數按照調用次序逆次由上到下排序。即便是面向對象的C++,也是如此。

/**
 * 倒三角打印
 */
void print(int x, int y) {
    int i;

    for (i = 0; i < y; i++) {
        printf("%d\t", i + 1);

        int j;
        for (j = i; j < x; j++) {
            printf("* ");
        }
        printf("\n");
    }

/**
 * 倒三角打印
 */
void print(int x, int y) {
 int i;

 for (i = 0; i < y; i++) {
  printf("%d\t", i + 1);

  int j;
  for (j = i; j < x; j++) {
   printf("* ");
  }
  printf("\n");
 }

整體代碼如下:

#include <stdio.h>
#include <stdlib.h>

/**
 *  定義一個結構體
 */
struct Location {
    int x; // 橫坐標
    int y; // 縱坐標
} location;

// 聲明函數
void print(int x, int y);

int main(void) {
    printf("輸入X坐標:\t\n");

    int x;
    scanf("%d", &x);

    location.x = x;

    printf("輸入Y坐標:\t\n");

    int y;
    scanf("%d", &y);
    location.y = y;

    printf("X坐標是:\t%d\n", location.x);
    printf("Y坐標是:\t%d\n", location.y);

    //  做倒三角打印
    print(x, y);

    return EXIT_SUCCESS;
}

/**
 * 倒三角打印
 */
void print(int x, int y) {
    int i;

    for (i = 0; i < y; i++) {
        printf("%d\t", i + 1);

        int j;
        for (j = i; j < x; j++) {
            printf("* ");
        }
        printf("\n");
    }
}

對比C++的代碼:

#include <iostream>

using namespace std;

// 定一個類
class Location {
private:
    int x; // 橫坐標
    int y; // 縱坐標
public:
    Location() {
    }
    Location(int x, int y) {
        this->x = x;
        this->y = y;
    }
    int getX() {
        return x;
    }
    void setX(int x) {
        this->x = x;
    }
    int getY() {
        return y;
    }
    void setY(int y) {
        this->y = y;
    }
};

int main() {
    //  聲明
    Location location;

    cout << "輸入X坐標:\t";

    int x;
    cin >> x;
    location.setX(x);

    cout << "輸入Y坐標:\t";

    int y;
    cin >> y;
    location.setY(y);

    cout << "X坐標是:\t" << location.getX() << endl;
    cout << "Y坐標是:\t" << location.getY() << endl;

    //  做倒三角打印
    int i;

    for (i = 0; i < y; i++) {
        cout << i + 1 << "\t";

        int j;
        for (j = i; j < x; j++) {
            cout << "* ";
        }
        cout << endl;
    }

    return 0;
}

這裡的location就是一個類Location的實例了。同樣是賦值操作,對x賦值調用location.setX(x);方法,而內部實現是this->x = x;明顯的指針特色->而不是。。這個時候有了私有變量的概念,上面C的代碼中的location.x就不合適了。必須使用location.getX()方法輸出x的值。仍然讓我使用起來不舒服的是cin 與 cout ,為什麼在C++面向對象的語言裡,卻不能以方法的方式實現,還是要使用這樣的特定的字符串來(>> 與 <<)控制呢?真的很別扭。特別是在熟悉Java的實現後,你會覺得C++有的時候很別扭。如果我要重新定義一個公有的方法,除了上述的方式,可以這樣做:

#include <iostream>

using namespace std;

class Location {
private:
    int x, y;
public:
    Location() {
    }
    Location(int x, int y);
    int getX() {
        return x;
    }
    void setX(int x) {
        this->x = x;
    }
    int getY() {
        return y;
    }
    void setY(int y) {
        this->y = y;
    }
};
Location::Location(int x, int y) {
 this->x = x;
 this->y = y;
}
 // 省略

現在類中定義方法Location(int x, int y);然後在類外實現該方法:

Location::Location(int x, int y) {
 this->x = x;
 this->y = y;
}

上述是一個構造方法,如果要返回值的值類型要定義在方法最前面,如:

int Location::getX() {
 return y;
}

我們把打印操作改成函數實現,注意:在C++裡如果一個函數被高頻度執行,聲明為內聯函數(inline),可以提高執行效率!

// 聲明函數
inline void print(int x, int y);

C++一樣沒有跳出C的特色,要在主函數調用前聲明函數。

/**
* 倒三角打印
*/
inline void print(int x, int y) {
 int i;

 for (i = 0; i < y; i++) {
  cout << i + 1 << "\t";

  int j;
  for (j = i; j < x; j++) {
   cout << "* ";
  }
  cout << endl;
 }
}

給出全部代碼:

#include <iostream>

using namespace std;

/**
 *  定義一個類
 */
class Location {
private:
    int x; // 橫坐標
    int y; // 縱坐標
public:
    Location() {
    }
    Location(int x, int y) {
        this->x = x;
        this->y = y;
    }
    int getX() {
        return x;
    }
    void setX(int x) {
        this->x = x;
    }
    int getY() {
        return y;
    }
    void setY(int y) {
        this->y = y;
    }
};

// 聲明函數
inline void print(int x, int y);

int main() {
    //  聲明
    Location location;

    cout << "輸入X坐標:\t";

    int x;
    cin >> x;
    location.setX(x);

    cout << "輸入Y坐標:\t";

    int y;
    cin >> y;
    location.setY(y);

    cout << "X坐標是:\t" << location.getX() << endl;
    cout << "Y坐標是:\t" << location.getY() << endl;

    //  做倒三角打印
    print(x, y);

    return 0;
}

/**
 * 倒三角打印
 */
inline void print(int x, int y) {
    int i;

    for (i = 0; i < y; i++) {
        cout << i + 1 << "\t";

        int j;
        for (j = i; j < x; j++) {
            cout << "* ";
        }
        cout << endl;
    }
}

學過Java的人覺得很別扭。呵呵,我也一樣。

最後,讓我們看看這2個程序的最終輸出:

console代碼

輸入X坐標:  9
輸入Y坐標:  9
X坐標是:   9
Y坐標是:   9
1   * * * * * * * * *
2   * * * * * * * *
3   * * * * * * *
4   * * * * * *
5   * * * * *
6   * * * *
7   * * *
8   * *
9   *

換成Java實現:

Java代碼:

import javax.swing.JOptionPane;

public class Location {
    private int x;
    private int y;

    /**
     * @return the x
     */
    public int getX() {
        return x;
    }

    /**
     * @param x
     *            the x to set
     */
    public void setX(int x) {
        this.x = x;
    }

    /**
     * @return the y
     */
    public int getY() {
        return y;
    }

    /**
     * @param y
     *            the y to set
     */
    public void setY(int y) {
        this.y = y;
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        Location location = new Location();

        int x = Integer.parseInt(JOptionPane.showInputDialog("輸入X坐標:"));
        int y = Integer.parseInt(JOptionPane.showInputDialog("輸入Y坐標:"));
        location.setX(x);
        location.setY(y);
        location.print(x, y);
    }

    /**
     * 倒三角打印
     *
     * @param x
     * @param y
     */
    public void print(int x, int y) {
        for (int i = 0; i < y; i++) {
            System.out.print(i + 1 + "\t");
            for (int j = i; j < x; j++) {
                System.out.print("* ");
            }
            System.out.println();
        }

    }
}

呵呵,用Java實現,感覺就是好!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved