C++初心者に対するサンプル

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Serdol
記事: 9
登録日時: 7年前

C++初心者に対するサンプル

#1

投稿記事 by Serdol » 6年前

現在C++の勉強を始めようと思い、いろいろ調べたりしているのですが、いまいちピンときません。
サンプルプログラムを読んでも何だかちんぷんかんぷんです。正直メンバ関数からしてもう怪しいです。
例えば以下の2点間の距離を計算するプログラムCのプログラムをC++にするとどうなるのでしょうか。
解説をつけ加えて頂けると助かります。
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

Re: C++初心者に対するサンプル

#2

投稿記事 by purin52002 » 6年前

コード:

#include<iostream>//入出力関係のヘッダ
using namespace std;//名前空間stdを省略します

int main()
{
    point p1, p2 ;
    cout << "始点座標(x y): " << endl ;//printfと同じ感じ、endlはおまじない
    cin >> p1.x >> p1.y ;//scanfと同じ感じ

    cout << "終点座標(x y): " << endl ;
    cin >> p2.x >> p2.y ;

    //変数はプログラムの途中でも宣言できる(最近のCでもできるらしいです^^;)
    //auto は型を推測してくれる 4文字しか打たなくていいから横着しいの人にはお勧め^^
    auto d = calculate_distance(p1, p2) ;

    cout << "距離 = " << d ;//%dとか書かなくてもcoutは表示してくれる
}
距離の計算はcと同じ書き方でいいと思うので入出力だけ変えてみました。
座標入力をpoint内でやるといいかも?

コード:

//c++だとtypedefいらなかったりする
struct point
{
    double x ;
    double y ;

    void Input()
    {
        cout << "座標(x y): " << endl ;
        cin >> this->x >> this->y ;//this->は自分のメンバにアクセスするということ
    }
} ;

int main()
{
    point p1, p2 ;
    p1.Input() ;
    p2.Input() ;

    auto d = calculate_distance(p1, p2) ;

    cout << "距離 = " << d ;//%dとか書かなくてもcoutは表示してくれる
}
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

Serdol
記事: 9
登録日時: 7年前

Re: C++初心者に対するサンプル

#3

投稿記事 by Serdol » 6年前

今クラスおよびメンバ関数を使う練習をしているので、それらを使ったサンプルプログラムにしていただけると助かります。

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

Re: C++初心者に対するサンプル

#4

投稿記事 by purin52002 » 6年前

ネットではオブジェクト指向最強!だとか、このプログラムはオブジェクト指向になってないから駄目だね^^という記事をよく見かけます。

しかし、オブジェクト指向というのもプログラム手法の一つで、使うと便利な場面、別に使わなくてもいい場面があると私は思っています。

今回は使わなくてもいい場面だと思います。

とりあえずクラスにはまとめてみました。

コード:

//c++ではclassもstructも同じ
//デフォルトのメンバ変数の扱いがprivateかpublicかの違い
struct point
{
    double x ;
    double y ;
 
    void Input()
    {
        cout << "座標(x y): " << endl ;
        cin >> this->x >> this->y ;//this->は自分のメンバにアクセスするということ
    }
} ;

struct CalcClass
{
    static double calculate_distance(point point1, point point2)
    {
        return(sqrt((point1.x-point2.x)*(point1.x-point2.x)+(point1.y-point2.y)*(point1.y-point2.y)));
    } 
};

int main()
{
    point p1, p2 ;//pointクラスのp1,p2を宣言
    p1.Input() ;//pointクラスのメンバ関数を使用
    p2.Input() ;
 
    //CalcClassのメンバ関数を使用
    //static修飾子をつけた関数はインスタンス化(実体化)しなくても使用可能
    auto d = CalcClass::calculate_distance(p1, p2) ; 
 
    cout << "距離 = " << d ;//%dとか書かなくてもcoutは表示してくれる
}
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

Re: C++初心者に対するサンプル

#5

投稿記事 by purin52002 » 6年前

クラスの勉強をしているのであれば、分数クラスというのを作ってみてはどうですか?

以前作ったことがあるのですが、結構クラスの基本的な要素が含まれていると思います。
(分数クラスを使う機会があるかは置いといて^^;)

以下仕様になります。
  • 宣言時に値を代入できる
  • 宣言後も値を代入できる
  • 入力は
    • 整数
    • 分子分母
    • 入力なしの場合は0にする
  • 四則演算ができる(c = a+b ;のような感じ)
  • cout << で分数の形で出力できる(a/b と出力)
  • 実数値として出力できる
私はこのクラスで
  • メンバ変数
  • メンバ関数
  • operator
  • friend関数
を勉強しました^^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C++初心者に対するサンプル

#6

投稿記事 by みけCAT » 6年前

こんな感じでしょうか?

コード:

#include <cstdio>
#include <string>
#include <cmath>

class point {
	// メンバ変数
	double x;
	double y;

public: // これ以降の関数(や変数)を公開する

	// コンストラクタ
	// 引数を指定しないとデフォルト引数の0に、指定するとその値に初期化する
	point(double xvalue = 0, double yvalue = 0) : x(xvalue), y(yvalue) {}

	// メッセージを表示して座標を読み込み、その座標を返す
	// staticなのでインスタンスが無くても使える
	static point read(const std::string& name) {
		point result;
		printf("%s(x y): ", name.c_str());
		// fflushで確実にプロンプトが表示されるようにするべきだと思うが、
		// 元のプログラムに合わせて省略
		scanf("%lf %lf", &result.x, &result.y);
		// scanfの戻り値をチェックして正しく読み込めたか確認するべきだが、
		// 元のプログラムに合わせて省略
		return result;
	}

	// この点と他の点の距離を計算する
	// 引数リストの後にconstと書くことで、この関数でこのオブジェクトが変更されないことを示す
	double calculate_distance(const point& other) const {
		return sqrt((x - other.x) * (x - other.x) + (y - other.y) * (y - other.y));
	}
};

// C++ではint main(void)もint main()も同じ
int main() {
	double d;
	point point1, point2;
	point1 = point::read("始点座標");
	point2 = point::read("終点座標");
	d = point1.calculate_distance(point2);
	printf("距離 = %.2f\n", d);
	return 0;
}
オフトピック
public変数はやめましょうと主張する人もいます。 (ログインしていなくても読める日記です)
個人的には別に使ってもいいと思っていますが、殴られる要素は減らしておくと平和かもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1887
登録日時: 11年前

Re: C++初心者に対するサンプル

#7

投稿記事 by usao » 6年前

>今クラスおよびメンバ関数を使う練習をしているので、それらを使ったサンプルプログラムにしていただけると助かります。

どの処理を何のメンバ関数にしたいのかがよくわからない問題です.
そこらへんのことくらいは説明すべきではないでしょうか.

コード:

class Vec2d
{
public:
	double X,Y;

	Vec2d( double x=0, double y=0 ) : X(x),Y(y) {}

	Vec2d operator-( const Vec2d &rhs ) const {	return Vec2d( X-rhs.X, Y-rhs.Y );	}
	double L2Norm() const {	return sqrt( X*X + Y*Y );	}
};

int main()
{//※面倒なので,入力処理は省略しました
	Vec2d a(3,2);
	Vec2d b(5,4);

	std::cout << (a-b).L2Norm() << std::endl;

	std::cin.ignore();
}

Serdol
記事: 9
登録日時: 7年前

Re: C++初心者に対するサンプル

#8

投稿記事 by Serdol » 6年前

解決しました。皆さまありがとございました。

返信

“C言語何でも質問掲示板” へ戻る