先頭へ戻る

標準入力② 解答ページ | Programming Place Plus C言語編 第7章

Programming Place Plus トップページ -- C言語編 -- 第7章

先頭へ戻る

問題①

問題① scanf関数を2回使って、2つの整数を受け取り、両方を足し合わせた結果を出力するプログラムを作ってください。


scanf関数で整数を受け取るには、"%d" を指定し、受け取る変数の指示も与えます。 このとき、変数の名前の頭に「&」が必要です。

#include <stdio.h>

int main(void)
{
    int num1;
    int num2;

    // 2つの整数を受け取る
    puts( "整数を2回入力してください。" );
    scanf( "%d", &num1 );
    scanf( "%d", &num2 );

    // 加算した結果を出力する
    printf( "%d + %d = %d\n", num1, num2, num1 + num2 );

    return 0;
}

実行結果:

整数を2回入力してください。
50
30
50 + 30 = 80

問題②

問題② 問題①のプログラムを、fgets関数と sscanf関数を組み合わせる方法で書き直してください。


scanf関数を単体で使う方法よりも、fgets関数と sscanf関数を組み合わせる方法を理解しておいた方が良いでしょう。

#include <stdio.h>

int main(void)
{
    char str1[20];
    char str2[20];
    int num1;
    int num2;

    // 2つの整数を受け取る
    puts( "整数を2回入力してください。" );
    fgets( str1, sizeof(str1), stdin );
    sscanf( str1, "%d", &num1 );
    fgets( str2, sizeof(str2), stdin );
    sscanf( str2, "%d", &num2 );

    // 加算した結果を出力する
    printf( "%d + %d = %d\n", num1, num2, num1 + num2 );

    return 0;
}

実行結果:

整数を2回入力してください。
50
30
50 + 30 = 80

問題③

問題③ fgets関数と sscanf関数を使い、入力された整数を3乗した結果を出力するプログラムを作ってください。


#include <stdio.h>

int main(void)
{
    char str[10];
    int num;

    // 整数を受け取る
    puts( "整数を入力してください。" );
    fgets( str, sizeof(str), stdin );
    sscanf( str, "%d", &num );

    // 3乗した結果を出力する
    printf( "%d の3乗は %d\n", num, num * num * num );

    return 0;
}

実行結果:

整数を入力してください。
10
10 の3乗は 1000

非常に大きい値を入力されると、おかしな結果になりますが、今のところは無視していいでしょう。

本来であれば、入力された値が大きすぎないかチェックするべきです。そのためには、第11章で取り上げる分岐処理が必要です。

問題④

問題④ 標準入力から秒数を受け取り、それを時・分・秒に変換して出力するプログラムを書いてください。


除算と剰余を使えば、秒数から変換することが可能です。数値の入力が欲しいので、fgets + sscanf を使います。

#include <stdio.h>

int main(void)
{
    char str[20];
    int second;

    puts( "秒数を入力してください。" );
    fgets( str, sizeof(str), stdin );
    sscanf( str, "%d", &second );

    // ○時間○分○秒 のような形で出力する
    printf( "%d時間", second / 3600 );
    printf( "%d分",   second % 3600 / 60 );
    printf( "%d秒",   second % 60 );
    printf( "\n" );

    return 0;
}

実行結果:

秒数を入力してください。
5432
1時間30分32秒

問題⑤

問題⑤ 標準入力から半径の長さを受け取り、円の面積と、円周の長さを出力するプログラムを書いてください。円周率にどの程度の精度を与えるかは各自の自由としますが、最低でも 3.14 としてください。


円の面積は「半径×半径×円周率」、円周の長さは「直径×円周率」ですね。

#include <stdio.h>

int main(void)
{
    char   str[20];
    double radius;
    double pi = 3.141592;  // 円周率

    puts( "半径を入力してください。" );
    fgets( str, sizeof(str), stdin );
    sscanf( str, "%lf", &radius );


    // 円の面積と、円周の長さを出力
    printf( "面積: %f\n", radius * radius * pi );
    printf( "円周: %f\n", radius * 2 * pi );

    return 0;
}

実行結果:

半径を入力してください。
4.5
面積: 63.617238
円周: 28.274328

円周率は実数になるので、double型を使います。それならば、入力させる値も double型として扱うようにしましょう。sscanf関数で、double型の値を取り出すには "%f" ではなく、"%lf" を使わなければならないことに注意してください。


参考リンク


------------------------------------------------------------------------

更新履歴

'2018/6/15 第8章から練習問題⑥⑪を移動してきて、練習問題④⑤とした。

'2018/2/1 全面的に文章を見直し、修正を行った。

'2010/2/27 main() を main(void) に修正。
練習問題②の解答例に、printf関数の呼び出しが抜けていたのを修正。

'2009/1/24 新規作成。



第7章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー