点击这里给我发消息 点击这里给我发消息

C/C++ 学习手札(一)

添加时间:2013-12-7
    相关阅读: 程序 C++
副标题#e#

    出于需要,最近研究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;
}

 

#p#副标题#e#

 

    这里的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实现,感觉就是好!

相关C/C++&nbsp;学习手札(一)

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册