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

トップページ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);
}


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

#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);
}

実行結果:

10 20 30
30 30 30

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

問題②

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

#include <stdio.h>

int main(void)
{
    int num = 90;

    if (num < 100) {
        printf("Less than 100.\n");
    }
    else {
        printf("Over 100.\n");
    }
}


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

#include <stdio.h>

int main(void)
{
    int num = 90;

    printf("%s 100\n", (num < 100) ? ("Less than") : ("Over"));
}

実行結果:

Less than 100

問題③

問題③ 10文字の文字列 “abcdefghij” があります。先頭と末尾の両方から 1文字ずつを取り出して出力するプログラムを、カンマ演算子を使って書いてください。


#include <stdio.h>

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

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

実行結果:

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

末尾の添字が分かりづらいですが、sizeof(str) - 2 で求めています。10文字だと分かっているので、そういう記号定数を作ってもいいですが、どちらかというと、コンパイラに文字数を数えさせる(=配列の要素数を決定させる)方が柔軟で安全です。

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

末尾の '\0' と、0 開始というルールから、末尾の添字は sizeof(str) - 2 となる訳です。


参考リンク


更新履歴

≪さらに古い更新履歴を展開する≫



第27章のメインページへ

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

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る