速習 CプログラマのためのC++プログラミング入門 サンプルプログラム集

コンピュータを学習する人の学校:パソコンキャンパス、プログラミングキャンパス

ここでは、 The Office Uchida, School of Computerの e-Learningシステム 「速習 CプログラマのためのC++プログラミング入門」のためのサンプルプログラムを紹介しています。

この中に記載されているプログラムをブラウズあるいはカットアンドペーストしてください。

目次に戻る


第1章 Cに対して拡張された部分

内容
Sample list 1-1 最も簡単なプログラム
Sample list 1-2 完全なCのプログラム
Sample list 1-3 ネームスペースの利用
Sample list 1-4 変数の定義
Sample list 1-5 コメントの利用
Sample list 1-6 const(定数)の例
Sample list 1-7 論理を表すbool型
Sample list 1-8 インライン関数
Sample list 1-9 リファレンスによる参照
Sample list 1-10 ポインタ(C言語)
Sample list 1-11 リファレンスによるswap関数
Sample list 1-12 swap関数(C関数版)
Sample list 1-13 デフォルト引数
Sample list 1-14 さまざまなデフォルト引数
Sample list 1-15 関数のオーバロード
Sample list 1-16 C++での構造体
Sample list 1-17 C言語でのメモリ割り当て
Sample list 1-18 C++におけるメモリの割り当て
Sample list 1-19 C++のメモリ割り当て(配列版)
Sample list 1-20 C言語では通るがC++ではエラーとなる例
Sample list 1-21 NULLポインタ
Sample list 1-22 グローバル変数やstatic変数の初期化で関数を呼ぶ
Sample list 1-22 初期化がエラーとなる例

Sample list 1-1  最も簡単なプログラムhello.cpp
#include<iostream>

int main()
{
	std::cout << "こんにちは、C++の世界へようこそ!" << std::endl;

	return 0;
}
Sample list 1-1の実行結果(cygwin)

% c++ hello.cpp
% ./a
こんにちは、C++の世界へようこそ!

目次に戻る, 先頭に戻る


C++言語は、C言語をほぼ包含していますから、次のプログラムもC++言語のコンパイラでコンパイルすることができます。

Sample list 1-2 完全なCのプログラムhelloc.c
#include<stdio.h>

int main( void )
{
	printf( "ようこそC(++)言語の世界へ\n" );

	return 0;
}
Sample list 1-2の実行結果(cygwin)

% c++ hello.c
% ./a
ようこそC(++)言語の世界へ

目次に戻る, 先頭に戻る


Sample list 1-3 ネームスペースの利用hello_ns.cpp
#include<iostream>
using namespace std;

int main()
{
	cout << "こんにちは、C++の世界へようこそ!" << endl;

	return 0;
}

目次に戻る, 先頭に戻る


Sample list1-4 変数の定義dec.cpp
#include<iostream>
using namespace std;

int main()
{
	int a;
	int b;

	a = 5;
	b = -3;

	int c;

	c = a + b;

	cout << "c=" << c << endl;
}

目次に戻る, 先頭に戻る


Sample list 1-5 コメントの利用comment.cpp
/* 消費税
     計算プログラム
     Copyright (c) Satoshi Uchida */

#include<iostream>
using namespace std;

int main()
{
	int thePrice = 10000;     // 価格
	int thePriceIncludingTax; // 税込み価格

	thePriceIncludingTax = (int)( thePrice * 1.05 );

	cout << "価格" << thePrice << "円の商品は、税込みで" 
	     << thePriceIncludingTax << "円になります" << endl;

	return 0;
}
Sample list 1-5の実行結果(cygwin)

% c++ comment.cpp
% ./a
価格10000円の商品は、税込みで10500円になります

目次に戻る, 先頭に戻る


Sample list 1-6 const(定数)の例const.cpp
#include<iostream>
using namespace std;

int main()
{
	const int N = 10;
	const int STOP = 5;
	
	int x[ N ];

	for( int k=0; k<N; k++ )
		x[ k ] = k;

	for( int k=0; k<N; k++ )
	{
		switch( x[ k ] )
		{
		case STOP: cout << "STOP=" << k << endl;
		}
	}

	return 0;
}
Sample list 1-6の実行結果(cygwin)

% c++ const.cpp
% ./a
STOP=5

目次に戻る, 先頭に戻る


Sample list 1-7 論理を表すbool型bool.cpp
// bool型

#include<iostream>
using namespace std;

int main()
{
	int a = 10;
	int b = 5;

	bool b1 = true;
	bool b2 = false;

	bool b3 = a == b;

	cout << "b1:" <<  (b1?"YES":"NO") << endl;
	cout << "b2:" <<  (b2?"YES":"NO") << endl;
	cout << "b3:" <<  (b3?"YES":"NO") << endl;

	return 0;
}
Sample list 1-7の実行結果(cygwin)

% c++ bool.cpp
% ./a
b1:YES
b2:NO
b3:NO

目次に戻る, 先頭に戻る


Sample list 1-8 インライン関数inline.cpp
#include<iostream>
#include<cmath>
using namespace std;

inline double sqrt2( double, double );

int main()
{
	double a = 4.5;
	double b = 6.4;

	double c = sqrt2( a, b );

	cout << "c=" << c << endl;
}

inline double sqrt2( double x, double y )
{
	double c = sqrt( x + y );

	return c;
}
Sample list 1-8の実行結果(cygwin)

% c++ inline.cpp
% ./a
c=3.30151

目次に戻る, 先頭に戻る


Sample list 1-9 リファレンスによる参照refer.cpp
#include<iostream>
using namespace std;

int main()
{
	int n = 20;
	int &p = n;

	p = 100;

	cout << "n = " << n << endl;

	return 0;
}
Sample list 1-9の実行結果(cygwin)

% c++ refer.cpp
% ./a
n = 100

目次に戻る, 先頭に戻る


Sample list 1-10 ポインタ(C言語)pointer.c
#include<stdio.h>

int main( void )
{
	int n = 20;
	int *p = &n;

	*p = 100;

	printf( "n=%d\n", n );

	return 0;
}

目次に戻る, 先頭に戻る


Sample list 1-11 リファレンスによるswap関数swap.cpp
#include<iostream>
using namespace std;

void swap( int &, int & );

int main()
{
	int a = 10;
	int b = 90;

	cout << "a = " << a << ", b = " << b << endl;

	swap( a, b );

	cout << "a = " << a << ", b = " << b << endl;

	return 0;
}

void swap( int &x, int &y )
{
	int temp = x;
	x = y;
	y = temp;
}
Sample list 1-11の実行結果(cygwin)

% c++ swap.cpp
% ./a
a = 10, b = 90
a = 90, b = 10
Sample list 1-12 swap関数(C関数版)swap.c
#include<stdio.h>

void swap( int *, int * );

int main( void )
{
	int a = 10;
	int b = 90;

	printf( "a = %d, b = %d\n", a, b );

	swap( &a, &b );

	printf( "a = %d, b = %d\n", a, b );

	return 0;
}

void swap( int *x, int *y )
{
	int temp = *x;
	*x = *y;
	*y = temp;
}

目次に戻る, 先頭に戻る


Sample list 1-13 デフォルト引数default.cpp
#include<iostream>
using namespace std;

void up( int &, int = 1 );
	
int main()
{
	int a = 10;

	up( a, 10 );

	cout << "a = " << a << endl;

	up( a );

	cout << "a = " << a << endl;

	return 0;
}

void up( int &base, int value )
{
	base += value;
}
Sample list 1-13の実行結果(cygwin)

% c++ default.cpp
% ./a
a = 20
a = 21
Sample list 1-14 さまざまなデフォルト引数default_samp.cpp
#include<iostream>
using namespace std;

void func1( int x, int y, int z = 1 );
void func2( int x, int y, int z = 1, int w = 2 );
void func3( int x = 1, int y = 2, int z = 3 );
	
int main()
{
	func1( 1, 2 ); func1( 1, 2, 3 );
	func2( 1, 2 ); func2( 1, 2, 3 ); func2( 1, 2, 3, 4 );
	func3( ); func3( 1 ); func3( 1, 2 ); func3( 1, 2, 3 );

	return 0;
}

void func1( int x, int y, int z )
{
}

void func2( int x, int y, int z, int w )
{
}

void func3( int x, int y, int z )
{
}

目次に戻る, 先頭に戻る


Sample list 1-15 関数のオーバロードfover.cpp
#include<iostream>
#include <iomanip>
using namespace std;

void pr( char *, int );
void pr( char *, double );

int main()
{
	int a = 15;
	double x = 3.141592653589793;

	pr( "a", a );
	pr( "x", x );
	pr( "a", a );

	return 0;
}

void pr( char *name, int a ) // int型の表示
{
	cout << name << " = " << dec << a << hex << ", hex(" << a << ")" << endl;
}

void pr( char *name, double x ) // double型の表示
{
	cout << name << " = " << setprecision(20) << x << endl;
}
Sample list 1-15の実行結果(cygwin)

% c++ fover.cpp
% ./a
a = 15, hex(f)
x = 3.141592653589793116
a = 15, hex(f)

目次に戻る, 先頭に戻る


Sample list 1-16 C++での構造体struct.cpp
#include<iostream>
using namespace std;

struct point
{
	double x;
	double y;
};

int main()
{
	point p;

	p.x = 10.2;
	p.y = -2.34;

	cout << "p=(" << p.x << ", " << p.y << ")" << endl;

	return 0;
}
Sample list 1-16の実行結果(cygwin)

% c++ struct.cpp
% ./a
p=(10.2, -2.34)

目次に戻る, 先頭に戻る


Sample list 1-17 C言語でのメモリ割り当てmemory.c
#include<stdio.h>
#include<stdlib.h>

#define N 5

int main( void )
{
	int *p;
	int k;

	if( ( p = (int *)malloc( N*sizeof(int) ) ) == NULL )
	{
		fprintf( stderr, "メモリ割り当て失敗\n" );
		exit( EXIT_FAILURE );
	}

	for( k=0; k<N; k++ )
		p[ k ] = k;

	free( p );

	return 0;
}
Sample list 1-18 C++におけるメモリの割り当てmemory.cpp
#include<iostream>
using namespace std;

int main()
{
	int *pi = new int;
	double *pd = new double;

	if( pi == 0 || pd == 0 )
		cout <<"確保できない" << endl;
	else
	{
		cout << "確保できた" << endl;

		*pi = 5;
		*pd = 3.4;

		cout << "*pi = " << *pi << ", *pd = " << *pd << endl;

		delete pi;
		delete pd;
	}

	return 0;
}
Sample list 1-18の実行結果(cygwin)

% c++ memory.cpp
% ./a
確保できた
*pi = 5, *pd = 3.4

目次に戻る, 先頭に戻る


Sample list 1-19 C++のメモリ割り当て(配列版)m_array.cpp
#include<iostream>
using namespace std;

int main()
{
	int *array;
	int n;

	cout << "確保する要素数>>>";
	cin  >> n;

	array = new int[ n ];

	if( array == 0 )
		cout << n << "個の要素は確保できない" << endl;
	else
	{
		cout << n << "個の要素が確保できた" << endl;

		for( int k=0; k<n; k++ ) array[k] = k;
		for( int k=0; k<n; k++ )
		if( array[k] != k )
			cout <<  k << "番目が変!" << endl;
		delete [] array;
	}

	return 0;
}
Sample list 1-19の実行結果(cygwin)

% c++ m_array.cpp
% ./a
確保する要素数>>>10000
10000個の要素が確保できた

目次に戻る, 先頭に戻る


Sample list 1-20 C言語では通るがC++ではエラーとなる例bug.c
#include<stdio.h>

int f( void ); // 値を返す関数

int main( void )
{
	printf( "fx=%d\n", f() );
	
	return 0;
}

int f(void) // int型の値を返す関数
{
	return; // エラー:本当は値を返さなければならない
}
Sample list 1-20の実行結果(cygwin)

% gcc bug.c       <--- Cコンパイラ(gcc)でコンパイル
                  <--- エラーが出ない
% ./a             <--- 強引に実行すると
fx=0              <--- 適当に実行されてしまう

% rm a.exe        <--- 念のため、実行プログラムを削除
% c++ bug.c       <--- C++コンパイラでコンパイル(エラーが表示される)
bug.c: In function `int f()':
bug.c:14: error: return-statement with no value, in function returning 'int'
% ./a             <--- 実行プログラムが生成されないので実行できない
bash: ./a: No such file or directory

目次に戻る, 先頭に戻る


C++では、NULLポインタを0で表現できます。私は、定数NULLを使ったほうがよいと思いますが、 そのようなコードもあるので覚えて置いてください。

Sample list 1-21 NULLポインタnull.cpp
#include <iostream>
using namespace std;

int main()
{
	char *p = 0; // 0をNULLポインタとして使える

	if( p == NULL )
		cout << "pはNULLである。" << endl;
	else
		cout << "pはNULLでない。" << endl;

	return 0;
}
Sample list 1-21の実行結果(cygwin)

% c++ null.cpp
% ./a
pはNULLである。

目次に戻る, 先頭に戻る


グローバル変数やstatic変数の初期化で関数を呼ぶことができます。

Sample list 1-22 グローバル変数やstatic変数の初期化で関数を呼ぶstatic.cpp
#include <iostream>
using namespace std;

int f( int x, int y ) { return x/y; }

static int s = f( 15, 5 );

int main()
{
	cout << "start program s = " << s << endl;

	return 0;
}
Sample list 1-22の実行結果(cygwin)

% c++ static.cpp
% ./a
start program s = 3

この初期化は、一番最初に行われるので、場合によっては、メイン関数の実行が始まる前にプログラムがクラッシュすることがあります。 以下のプログラムでは、関数f(15,0)の呼び出しでゼロ除算が行われるため、 そこでエラーとなってしまいます。

Sample list 1-23 初期化がエラーとなる例static.cpp
#include <iostream>
using namespace std;

int f( int x, int y ) { return x/y; }

static int s = f( 15, 0 );

int main()
{
	cout << "start program s = " << s << endl;

	return 0;
}
Sample list 1-23の実行結果(cygwin)

% c++ static.cpp
% ./a
Floating point exception (core dumped)

目次に戻る, 先頭に戻る


Copyright (c) 2006 Satoshi Uchida, The Office Uchida, School of Computer