C++ワークブック 演習問題解答

Step 02 Step 03 Step 04 Step 05 Step 06 Step 07 Step 08 Step 09 Step 10 Step 11 Step 12 Step 13 Step 14 Step 15 Step 16 Step 17 Step 18 Step 19 Step 21 Step 24 Step 26 Step 30

Step 02

(1) (2)

#include <iostream>
using namespace std;

int main()
{
    cout << "勝戸太郎" << '\n';//名前です
    cout << "平成17年12月10日" << '\n';//生年月日です
    cout << "18歳です" << '\n';//年齢です
    cout << "東京都新宿区です" << '\n';//名前です

    return 0;
}

Step 03

(1) 出力結果例

234.4532928466797
234.453290453294

結果として,float型では元に代入した数値が表示されない.理由は,図3.1のように型により入れられる数値の長さが異なるためで,float型では今回のような長さの数値は入れることができなかった(あふれてしまった)ために,小数点6桁目から間違った表示となっている.

(2)

#include <iostream>
using namespace std;

int main()
{
    char a,c;
    a = 'b';
    c = 'd';
    cout << a << c << '\n';

    return 0;

}

Step 04

(1) (2)

sample4-2.cppの08行目を参考に書いてみてください.

(3)

#include <iostream>
using namespace std;

int main()
{
    float a,b,c,d;
    a = 3; b = 4; c = 2;
    d = (( a + b ) * c - a * ( b - c )) / (( c / b ) * a + a * b * c - c * a);
    cout << "a=" << a << " b=" << b << " c=" << c <<"での答えは" << d << "です\n";
    a = 3; b = 4.3; c = 2.5;
    d = (( a + b ) * c - a * ( b - c )) / (( c / b ) * a + a * b * c - c * a);
    cout << "a=" << a << " b=" << b << " c=" << c <<"での答えは" << d << "です\n";
    a = 32.6; b = 57.82; c = 2.543;
    d = (( a + b ) * c - a * ( b - c )) / (( c / b ) * a + a * b * c - c * a);
    cout << "a=" << a << " b=" << b << " c=" << c <<"での答えは" << d << "です\n";

    return 0;
}
    

ポイントは,整数で計算する目的以外の場合には,floatdoubleで計算しないと,特にc/bは意図しない結果になりますので,注意が必要です.また,計算する式と同じにするには,模範解答のように括弧やかけ算記号(*)が必要です.

(4)

num1=3num2=1num3=2」と出力されます.これはnum1->num2,num2->num3,num3->num1と,数値を循環して入れ替えるためのプログラムです.最初num1を一時的に別の変数に逃げるように代入をしておき(08行目のように逃げないと,09行目でnum1の値が消えてしまいます),最後にその変数の中身を該当の変数に入れる,というものです.

Step 05

(1)

a+=3;」が答えです.「a+=a;」は間違えです.「a = 3 + a;」は「a = a + 3;」と書いても同じですので,この形の式だとp.22の形と同じなので書き換えられます.

(2)

example5-1.cppの08行と10行を参考にして確かめてみてください.

(3)

5.3の「①10/4は,計算結果が2になる.②10.0/4.0,10.0/4,10/4.0は,いずれも計算結果が2.5になる.」や,「①i_value1/i_value2は,答えは整数型になる.②f_value1/f_value2f_value1/i_value1i_value1/f_value1は,いずれも答えがfloat型になる.」の式の部分をプログラムに入れ込んで確かめてみてください.

(4)

a=3 b=2
c=4 d=6

Step 06

(1)

4 1.38462 2
7.14286 7
6 9

(2)

error:assinment of read-only variable 'pi'」と表示され,コンパイルができません.これはpiが読み取り専用の変数として割り当てられています,というエラーメッセージです.

Step 07

(1)

sqrt(2.0)sqrt(3.0)sqrt(4.0)を利用して計算をしてみてください.精度を指定しないと演習の答えが正確か確かめられないので,その場合には次のプログラムで確かめてみてください.

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

int main()
{
    cout << setprecision(9) << sqrt(2.0) << ' ' << sqrt(3.0) << ' ' << sqrt(4.0) << '\n';

    return 0;

}

(2)

sample7-2.cppの05行目および18行目を参考にプログラムしてみてください.

Step 08

(1)

#include <iostream>
using namespace std;

int main() {

    int age,year,number;

    cout << "年齢を入力してください\n";
    cin >> age;
    cout << "生まれた年を入力してください\n";
    cin >> year;
    cout << "好きな数字を入力してください\n";
    cin >> number;
    cout << "あなたは" << year << "年生まれの" << age << "才で," << number << "が好きですね.\n";

    return 0;
}

(2)

#include <iostream>
using namespace std;

int main() {

    int age,year,number;

    cout << "年齢,生まれた年,好きな数字を入力してください\n";
    cin >> age >> year >> number;
    cout << "あなたは" << year << "年生まれの" << age << "才で," << number << "が好きですね.\n";

    return 0;
}

(3)

(1)を応用して作成してみてください.

(4)

(1)のintcharとして作成してみてください.

(5)

(1)を応用して作成してみてください.

(6)

#include <iostream>
using namespace std;

int main() {

    int bill,person;

    cout << "お勘定を入力してください\n";
    cin >> bill;
    cout << "割り勘する人数を入力してください\n";
    cin >> person;
    cout << "一人あたり" << bill/person << "で端数が" << bill%person << "円出ます." << "\n";

    return 0;
}

変数は整数(int)で宣言するのがポイントです.また%は“余り”を計算できる演算子です.

(7)

#include <iostream>
using namespace std;

int main() {

    int bill;

    cout << "金額を入力してください\n";
    cin >> bill;

    cout << "10000円札が" << bill/10000 << "必要です." << "\n";
    cout << "5000円札が" << (bill%10000)/5000 << "必要です." << "\n";
    cout << "1000円札が" << (bill%5000)/1000 << "必要です." << "\n";
    cout << "500円玉が" << (bill%1000)/500 << "必要です." << "\n";
    cout << "100円玉が" << (bill%500)/100 << "必要です." << "\n";
    cout << "50円玉が" << (bill%100)/50 << "必要です." << "\n";
    cout << "10円玉が" << (bill%50)/10 << "必要です." << "\n";
    cout << "5円玉が" << (bill%10)/5 << "必要です." << "\n";
    cout << "1円玉が" << bill%5 << "必要です." << "\n";

    return 0;
}

整数の割り算と余りを計算する演算子を駆使するとできます.特に整数÷整数の答えが整数になることを利用します.

【お詫び】入力する数値に“,”はあってはいけません.削除して入力してください.

Step 09

本文中の書き方を参考に自分で考えてみてください.

Step 10

(1)

#include <iostream>
using namespace std;

int main() {

    char a;

    cout << "小文字のアルファベットを入力して下さい\n";
    cin >> a;
    if( a == 'a' ){
        cout << "aが格納されています\n";
    }
    else{
        cout << "'a'でない文字が格納されています\n";
    }

    return 0;
}

(2)

#include <iostream>
using namespace std;

int main() {

    int a,b;

    cout << "2つの整数を入力してください\n";
    cin >> a >> b;
    if( a < b ){
        cout << "最初の数の方が小さいです.\n";
    }
    else{
        cout << "後の数の方が小さいです.\n";
    }

    return 0;
}

この場合,最初と最後の数が同じ場合は「後の数の方が小さいです.」と表示されます.(同じ場合を別に表示する場合はStep11の演習(1)を参照して下さい.)

(3)

たくさんの問題がありますから,if文を理解するためにたくさんプログラムしてみてください.

Step 11

(1)

#include <iostream>
using namespace std;

int main() {

    int a,b;

    cout << "2つの整数を入力してください\n";
    cin >> a >> b;
    if( a > b ){
        cout << "最初の数の方が大きいです.\n";
    }
    else if( a == b ){
        cout << "両方は等しいです.\n";
    }
    else{
        cout << "2番目の数の方が大きいです.\n";
    }

    return 0;
}

(2)

#include <iostream>
using namespace std;

int main() {

    int a;

    cout << "整数を入力してください\n";
    cin >> a ;
    if( a <= 9 ){
        cout << "入力した値は1桁です\n";
    }
    else if( a >= 100 ){
        cout << "入力した値は3桁以上です.\n";
    }
    else{
        cout << "入力した数値は2桁です.\n";
    }

    return 0;
}

Step 12

(1)

09行目と10行目の間に,

if ( value < 0 ){
    cout "負の整数が入力されました.";
}

を挿入し,10行目のifelse ifとすれば実現できます.

(2)

if ( 条件1 ) { else if( 条件2 ) { }}は,結果的にif( 条件1 && 条件2 )と同じ意味になります.

(3)

文章中と(2)のことから理解してみてください.

(4)

>の場合は<=>=の場合は<(不等号が逆の場合も同じ),!=の場合は==(逆も同じ)にすれば,自然な書き方になります.

Step 13

(1)

#include <iostream>
using namespace std;

int main() {

    int value;

    cin >> value;

    switch( value ) {
        case 1:
            cout << "入力した値は壱です.\n";
            break;
        case 3:
            cout << "入力した値は参です.\n";
            break;
        case 5:
            cout << "入力した値は伍です\n";
            break;
        case 10:
            cout << "入力した値は拾です\n";
            break;
        default:
            cout << "範囲外です\n";
            break;
    }

}

(2)

sample13-2.cppを応用してプログラムを作成してみてください.

(3)

実際にやってみて確認してください.

Step 14

(1)

プログラムはsample14-1.cppを応用して作成してください.また,例1〜4のようにfor文を書いても変化がないのは,ここではfor文を15回実行すれば良く,iの値はどのような値でも良いからです.iの値を利用してプログラムを作成する場合はこれではダメです.Step15で学習してください.

(2)

ヒント通りにプログラムを作成すれば大丈夫です.

Step 15

(1)

ijも9まで変化するようにすれば完全な九九を表示できます.

(2)

sample15-1.cppを参考に作成して下さい.ただしfor文の部分のみを示しておきます.

for(int i=5;i <=13; i++ )

for(int i=100;i >=87; i-- )

(3)

プログラムの一部の部分のみ模範解答を書いておきます.

for( i = 1; i <= 40 ; i++ ){
    cout << i << "番目の成績を入力して下さい.\n";
    cin >> n;//問題文は>>部分が間違っています.
    cout << i << "番は" << n << "点です\n";
}

(4)

#include <iostream>
using namespace std;

int main() {

    int start,end,i,sum;

    cout << "始めの数を入力してください.(整数値)\n";
    cin >> start;
    cout << "終わりの数を入力してください.(整数値)\n";
    cin >> end;
      
    for( i = start,sum = 0; i <= end ; i++ )
        sum += i; 

    cout << start << "から" << end << "の合計は"  << sum << "です.\n";
      
    return 0;
}

(5)

#include <iostream>
#include <cmath>
using namespace std;

int main() {

    float degree;

    for( degree = 0.0; degree <= 90.0 ; degree+=10.0 )
        cout << "sin(" << degree << ")=" << sin(3.141592 / 180.0 * degree) << " cos(" << degree << ")=" << cos(3.141592 / 180.0 * degree) << " tan(" << degree << ")=" << tan(3.141592 / 180.0 * degree) << "\n";
      
    return 0;
}

(6)

for文の前に,

if( start > end ) {
    int tmp = end;
    end = start;
    start = tmp;
}

のように,startendを入れ替えれば良い.ただし,表示も入れ替わります.=の場合は,プログラムそのままで大丈夫です.

Step 16

(1)

dowhileは必ず{}内を実行するという特性があるので,それを実現すれば良い.例えば,

int flag = 1;

while( flag == 1 || a > b ){

    flag = 0;

のように,a > bが偽で(間違っていて)も,flag=1なので条件が真(合っている)ため,while文の中には必ず入る.その後すぐにflag=0にすれば,flagの値ではなくabの値で実行されるかされないかが決定する.

(2)

for( i = start ; i < end ; i = i + step )

と同じ動作をするものをwhile文で書くと

i = start;
while( i < end ){
    ⋮
    i = i step;
}

となる.

(3)

#include <iostream>
using namespace std;

int main(){

    int a,kekka=0;

    cin >> a;
      
    do{
        a = a/10;
        kekka++;
    }while(a!=0);
      
    cout << kekka << endl;
      
    return 0;

}

Step 17

(1)

1つの例としては,06行目をninzu = 0として,10行目をninzu+1とすれば良い.

(2)

問題(a)

50が表示されました
51が表示されました
52が表示されました
53が表示されました
54が表示されました
55が表示されました

問題(b)

50が表示されました
51が表示されました
52が表示されました
53が表示されました
54が表示されました
55が表示されました
57が表示されました
58が表示されました
59が表示されました
60が表示されました

(3)

#include <iostream>
using namespace std;

int main(){

    for( int i = 156; i <= 356; i+=2 ){
        if( i == 200 || i == 300) continue;
            cout << i << "\n";
    }

    return 0;

}

Step 18

(1)

「9999」が入力されるまで,入力された整数値の合計を計算して,画面に出力する(ただし回数は100回まで).

さらに,入力された値を呼び出して,それを3倍し,入力された順番に表示する.

※「b=-9999;」は終了値を9999にしたために,それが合計に入ってしまうので,事前に9999を引いておいたもの.

※「i」は人数をカウントするためのもの.

(2)

#include <iostream>
using namespace std;

int main(){

    int i, goukei = 0, suugaku_goukei = 0;
    int kokugo[5],suugaku[5];
    float heikin,suugaku_heikin;

    for( i = 0; i < 5; i++ ) {
        cout << "出席番号" << i + 1<< "番目の国語の成績を入力してください\n";
        cin >> kokugo[i];
        goukei = goukei + kokugo[i];
        cout << "出席番号" << i + 1<< "番目の数学の成績を入力してください\n";
        cin >> suugaku[i];
        suugaku_goukei = suugaku_goukei + suugaku[i];
    }
      
    heikin = (float)goukei / 5.0;
    cout << "国語の平均点は" << heikin << "です\n";
    suugaku_heikin = (float)suugaku_goukei / 5.0;
      
    cout << "数学の平均点は" << suugaku_heikin << "です\n";
    cout << "国語と数学の平均点は" << ( heikin + suugaku_heikin) / 2.0 << "です\n";


    for( i = 0; i < 5; i++ ){
        cout << "出席番号" << i + 1 << "番の国語の成績は" << kokugo[i];
        cout<< "点で平均との差は" << (float)kokugo[i] - heikin << "で";
        cout << "数学の成績は" << suugaku[i];
        cout<< "点で平均との差は" << (float)suugaku[i] - suugaku_heikin << "です\n";
    }

    return 0;

}

※問題文にはありませんが,数学の方も平均との差を求めています.

Step 19

(1)

#include <iostream>
using namespace std;

int main(){

    float w[] = {1.2,2.3,3.4,4.5,5.6};
    float x[] = {4.8,2.6,1.3,9.1,8.7};
    float u = 0.0;
    int i;

    for( i = 0; i < 5; i=i+1)
        u += w[i] * x[i];

    cout << "u =" << u << "です\n";

    return 0;

}

出力結果

u =105.83です

※ベクトルwxをかけて合計を表示するプログラム(ニューロンモデルの内部電位の計算(人工知能プログラムの基本計算))です.

(2)

#include <iostream>
using namespace std;

int main(){

    int i,j;
    int matrix [] [3] = {{1,2,3}, {4,5,6}, {7,8,9}};

    for( i = 0; i < 3; i++) {
        for( j = 0; j < 3; j++ ) {
            cout << matrix[i][j] << ' ';
        }
        cout << '\n';
    }

    return 0;
}

※sample19-1.cppのmatrixの部分

#include <iostream>
using namespace std;

int main(){

    int i,j;
    int matrix [3][3];

    for( i = 0; i < 3; i++) {
        for( j = 0; j < 3; j++ ) {
            cout << "matrix[" << i << "][" << j << "]を入力して下さい\n";
            cin >> matrix[i][j];
        }
    }
      
    for( i = 0; i < 3; i++) {
        for( j = 0; j < 3; j++ ) {
            cout << matrix[i][j] << ' ';
        }
        cout << '\n';
    }

    return 0;
}

※2つめのfor文をコピペして,入力の部分にするのが簡単です.

Step 21

(1)

#include <iostream>
using namespace std;

int main(){

    char *p, dim[7] = {'a','b','c','d','e','f','g'};
    int i;

    cout << *(dim+1) << *dim <<  *(dim+3) << '\n';

    for(p = dim,i = 3; i< 5; i++){
        cout << * (p+i);
    }
    cout << '\n';

    for( p = dim,i = 100; i< 105; i++ )
        p++;

    cout << *p << '\n';

    return 0;
}

出力結果

bad
de
f

Step 24

(1)

#include <iostream>
using namespace std;

void display_name(){
    cout << "私は勝戸太郎です\n";
}

int main(){

    for( int i=0; i < 3; i++ )
        display_name();
      
    return 0;
}

(2)

#include <iostream>
using namespace std;

float calculation(float a,float b, float c){

    float d = (( a + b ) * c - a * ( b - c )) / (( c / b ) * a + a * b * c - c * a);

    return d;
}

int main()
{
    float a,b,c,d;
    a = 3; b = 4; c = 2;
    d = calculation(a,b,c);
    cout << "a=" << a << " b=" << b << " c=" << c <<"での答えは" << d << "です\n";
    a = 3; b = 4.3; c = 2.5;
    d = calculation(a,b,c);
    cout << "a=" << a << " b=" << b << " c=" << c <<"での答えは" << d << "です\n";
    a = 32.6; b = 57.82; c = 2.543;
    d = calculation(a,b,c);
    cout << "a=" << a << " b=" << b << " c=" << c <<"での答えは" << d << "です\n";

    return 0;
}

#include <iostream>
using namespace std;

void calculation(float a,float b, float c){

    float d = (( a + b ) * c - a * ( b - c )) / (( c / b ) * a + a * b * c - c * a);
    cout << "a=" << a << " b=" << b << " c=" << c <<"での答えは" << d << "です\n";

}

int main()
{
    float a,b,c;
    a = 3; b = 4; c = 2;
    calculation(a,b,c);
    a = 3; b = 4.3; c = 2.5;
    calculation(a,b,c);
    a = 32.6; b = 57.82; c = 2.543;
    calculation(a,b,c);

    return 0;
}

Step 26

(1)

Step24 (2) ①がその答えとなります.

(2)

#include <iostream>
using namespace std;

float calc(float b,float a){

    if( b > a )
        return b-a;
    else if( b == a )
        return a+b;
    else 
        return a-b;
}

int main() {

    int b,a;

    cout << "bを入力してください.\n";
    cin >> b;
    cout << "aを入力してください.\n";
    cin >> a;
      
    cout << "答えは" << calc(a,b) << "です\n";
      
}

(3)

#include <iostream>
using namespace std;

int power(int x,int y){

    for( int i = 2; i <= y; i++ )
        x *= x;

    return x;
}

int main() {

    int x,y;

    cout << "xを入力してください.\n";
    cin >> x;
    cout << "yを入力してください.\n";
    cin >> y;

    cout << x << "の" << y << "乗は"<< power(x,y) << "です\n";

}

Step 30

(1)

#include <fstream>
#include <iostream>
using namespace std;

#define OUTPUTFILE "output.data"

int main() {

    int i,data[10];
    ifstream input_file;
    ofstream output_file;

    input_file.open("input.data");
    output_file.open(OUTPUTFILE);

    if(!input_file) {
        cout << "入力ファイルをオープンできませんでした\n";
        return 1;
    }

    if(!output_file) {
        cout << "出力ファイルをオープンできませんでした\n";
        return 1;
    }

    int counter = 0;

    while( !input_file.eof() ){
        input_file >> data[counter];
        counter++;
    }

    for( i = 0; i < counter-1; i++ )
        output_file << data[i] * 2 << '\n';

    input_file.close();
    output_file.close();

    return 0;

}

※教科書p.127のプログラムの一部を利用すればできます.が,教科書の例が間違っております.お詫びして訂正します.正しくは以下の通りです.

while( !input_file.eof() ){		//eofの後に()が必要です.
    input_file >> data[counter];	//iではなくてcounterです.
    counter++;
}

また***.eof()はデータ(行数)+ 1回実行しますので,表示の際には「counter-1」とする必要があります.

(2)

#include <fstream>
#include <iostream>
using namespace std;

#define OUTPUTFILE "output.csv"

int main(){

    int i,j;
    int kuku[10][10];

    ofstream output_file;

    output_file.open(OUTPUTFILE);

    if(!output_file) {
        cout << "出力ファイルをオープンできませんでした\n";
        return 1;
    }

    for( int i = 1; i < 10; i++ ){
        for( int j = 1; j < 10; j++ ){
            kuku[i][j] = i * j;
        }
    }

    for( int i = 1; i < 10; i++ ){
        for( int j = 1; j < 10; j++ ){
            output_file << kuku[i][j] << ',';
        }
        output_file << '\n';
    }

    output_file.close();

    return 0;
}