C言語編 第27章 いろいろな式 解答ページ

先頭へ戻る

問題①

問題① 次のプログラムを、できるだけ短く書き直して下さい。

#include <stdio.h>

int main(void)
{
    int num1 = 10;
    int num2 = 20;
    int num3 = 30;

    printf( "%d %d %d\n", num1, num2, num3 );

    num1 = num3;
    num2 = num3;

    printf( "%d %d %d\n", num1, num2, num3 );

    return 0;
}


例えば次のような感じになります。

#include <stdio.h>

int main(void)
{
    int num1 = 10, num2 = 20, num3 = 30;

    printf( "%d %d %d\n", num1, num2, num3 );

    num1 = num2 = num3;

    printf( "%d %d %d\n", num1, num2, num3 );

    return 0;
}

実行結果:

10 20 30
30 30 30

同じ型の変数はまとめて宣言できますし、同時にそれぞれに初期値を与えることも可能です。 また、同じ値を複数の変数に代入する際には、=演算子を繰り返すことができます。

問題②

問題② 次のプログラムを、条件演算子を使って書き直して下さい。

#include <stdio.h>

int main(void)
{
    int num = 90;

    if( num < 100 ){
        printf( "100未満\n" );
    }
    else{
        printf( "100以上\n" );
    }

    return 0;
}


条件演算子(?:) を使えば、printf関数の実引数のところで、直接条件分岐できます。

#include <stdio.h>

int main(void)
{
    int num = 90;

    printf( "100%s\n", (num < 100) ? ("未満") : ("以上") );

    return 0;
}

実行結果:

100未満

問題③

問題③ 次のプログラムを、複合代入演算子を使って書き直して下さい。

#include <stdio.h>

int main(void)
{
    int num = 15;
    int num2 = 5;
    int num3 = 30;

    num = num - 10;
    num2 = num2 + (num * 4);
    num3 = num3 % (num2 - 5);

    printf( "%d %d %d\n", num, num2, num3 );

    return 0;
}


次のようになります。

#include <stdio.h>

int main(void)
{
    int num = 15;
    int num2 = 5;
    int num3 = 30;

    num -= 10;
    num2 += num * 4;
    num3 %= num2 - 5;

    printf( "%d %d %d\n", num, num2, num3 );

    return 0;
}

実行結果:

5 25 10

複合代入演算子の場合、演算子の右側の ( ) は外してしまえます。 複合代入演算子の優先順位は、通常の代入演算子と同じであるためです。

問題④

問題④ 10文字の文字列 "abcdefghij" があり、先頭と末尾の両方から 1文字ずつを取り出して出力するプログラムを書いて下さい。 ただし、カンマ演算子をうまく使って下さい。
例として、"abcde" と入力された場合、次のように出力されるようにして下さい。

a e
b d
c c
d b
e a
#include <stdio.h>

int main(void)
{
    char str[] = "abcdefghij";
    int i, j;


    /* 先頭と末尾の両方から 1文字ずつ出力する */
    for( i = 0, j = sizeof(str)-2; j >= 0; ++i, --j ){
        printf( "%c %c\n", str[i], str[j] );
    }

    return 0;
}

実行結果:

a j
b i
c h
d g
e f
f e
g d
h c
i b
j a

末尾の添字が分かりづらいですが、sizeof(str)-2 で求めています。 10文字だと分かっているので、そういう記号定数を作ってもいいですが、どちらかというと、

char str[] = "abcdefghij";

のように初期化して、コンパイラに文字数を数えさせる(=配列の要素数を決定させる)方が柔軟で、安全です。

この場合、全体の大きさを sizeof(str) で求められますが、これには末尾の '\0' の分まで含まれています。 また、添字は 0 から始まるので、sizeof で取得できる値では 1 大きいことになります。
末尾の '\0' と、0開始というルールから、末尾の添字は sizeof(str) - 2 となる訳です。



参考リンク

更新履歴

'2018/3/2 全面的に文章を見直し、修正を行った。
章のタイトルを「簡略記法」から「いろいろな式」に変更。

'2010/9/3 問題④の表示例が、問題の解答そのものになってしまっていたのを修正。

'2009/9/2 新規作成。





第27章のメインページへ

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

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS