第2回 プログラミング入門 演習(解答)

【演習の注意事項】を良く読んで解答してください
【演習室1〜6以外で課題を解く場合の注意】も参考にしてください

Cプログラミングの初歩
 --( はじめてのCプログラミング)---
(その1)

【主な内容】

プログラムの動作を予測したり、実際にプログラムを作成し実行してもらいます。

演習課題

初級レベル

(A-1)
次のプログラムを実行したときに得られる出力結果を 予想し、ファイルに記述しなさい。
なお、記述後、実際にプログラムを実行し確認してみること。

ファイル名:ex02a1.txt

#include <stdio.h>

main()
{
    printf("I am");
    printf("a\n");
    printf("student.");
}
解答
I ama
student.


(A-2)
自分の学籍番号と名前を表示するプログラムを作成しなさい。

ファイル名:ex02a2.c

解答
#include <stdio.h>
main()
{
    printf("s11xxxxx\n");  /* 表示形式は自由 */
    printf("  Taro Yamada\n");
}


(A-3)
以下の変数宣言について、正しいものには○を、間違っているものには×をつけなさい。 また、間違っているものについては具体的にどのような理由によるのかを書きなさい。 なお、実際に確認用プログラムを作成し、コンパイル・実行して、確認すること。
(以下の問題項目はコピー&ペーストができます)

ファイル名:ex02a3.txt

解答
(×) int 1st;           1文字目が数字
() int _1st;
(×) int while;         "while"は予約語です
() int ave ;
(×) int result#2;      #が入っている
() int no1, no2;
(×) int no3  no4;      変数が,で区切られていない
            または 変数名"no3  no4"に空白を使用している
(×) int sum-ave ;      -を使っている
() int sum_ave ;


(A-4)
以下の式について、正しいものには○を、間違っているものには×をつけなさい。ただし、i、j、k、q、r は整数型の変数であるものとします。 なお、実際に確認用プログラムを作成し、コンパイル・実行して、確認すること。
(以下の問題項目はコピー&ペーストができます)

ファイル名:ex02a4.txt

解答
() r=i+j;
(×) i+j=r;
() i+j;
() r=(j*i)%(i-j)/k;
() q=r=i+j;
(×) q=i**j;
最後の問題(q=i**j;)に対しての補足です。
プログラミングIで習いますが、もしjがポインタとして宣言してあれば、 この式は正しいものとなります。



中級レベル

(B-1)
以下のprintf文について、正しく表示されるものには○を、コンパイルエラーになるものには×、正しく表示されないものには△をつけなさい。 ただし、i、j は整数型の変数とし、適当な値が代入されているものとします。 なお、実際にテストプログラムを作成し、コンパイル・実行を試してみること。
(以下の問題項目はコピー&ペーストができます)

ファイル名:ex02b1.txt

解答
() printf("今日は%d日です。\n",i);
() printf("今日は%d日です。\n,i");	%dに対応する変数がない
(×) printf("今日は%d日です。\n" i);	,がない
() printf("今日は%d日です。\n");	%dに対応する変数がないのでデタラメな数値が表示される
() printf("今日は%d日です。\n",22);	%dに対応するのが数値でもOK
() printf("今日は22日です。\n");
() printf("今日は%d日です。\n",i+1);	%dに対応するのが式でもOK
() printf("%d日は%d度でした。\n");	%dに対応する変数がないのでデタラメな数値が表示される
() printf("%d日は%d度でした。\n",i);	%dに対応する変数が足りないので一部デタラメな数値が表示される
() printf("%d日は%d度でした。\n,j",i);%dに対応する変数が足りないので一部デタラメな数値が表示される
() printf("%d日は%d度でした。\n",j,i);
(×) printf(%d日は%d度でした。,j,i);	"がない


(B-2)
以下のプログラムを、コンパイルエラーがなくなり、正しく動作するように修正しなさい。

ファイル名:ex02b2.c

#include (stdio.h)

main
{
    print("Hello\n")
}
解答
#include <stdio.h>

main()
{
    printf("Hello\n");
}


(B-3)
以下の(a)、(b)の変数宣言は下記プログラムのPart1-3のどこに入れると良いか?実際にプログラム中に入れて完成しなさい。

ファイル名:ex02b3.c

(a) int i,j;
(b) int result;
#include <stdio.h>
main()
/* Part 1 */
{
/* Part 2 */

    i=2;
    j=3;
/* Part 3 */
    result=i*j;
    printf("result = %d\n",result);
}
解答
#include <stdio.h>
main()
/* Part 1 */
{
/* Part 2 */
    int i,j; 	/*(a)*/
    int result;	/*(b)*/

    i=2;
    j=3;
/* Part 3 */
    result=i*j;
    printf("result = %d\n",result);
}



上級レベル

(C-1)
次のプログラムを実行したときに得られる出力結果を予想し、ファイルに記述しなさい。

ファイル名:ex02c1.txt

#include <stdio.h>
main()
{
    int i, j, k, res;

    i=4;
    j=5;
    k=6;
    res=i+(j+i*k)*j;
    printf("%d+(%d+%d*%d)*%d=?\n%d\n",i,j,i,k,j,res);
}
解答
4+(5+4*6)*5=?
149


(C-2)
次のプログラムを実行したときに得られる出力結果を予想し、ファイルに記述しなさい。

ファイル名:ex02c2.txt

#include <stdio.h>
main()
{
    int i, j, k, res;

    i=4;
    j=5;
    k=6;
    res=(i*j+k%i)*i;
    printf("result = %d\n",res);
}
解答
result = 88


(C-3)
以下のプログラムは、ある計算を行ない、その結果を表示するプログラムである。 ところが、コンパイルエラーはでないけれども、プログラムミスがあるようで、正しい値が表示されない。 printfの書式(" "で囲まれた部分)には誤りが無いものとして、正しく動作するようにプログラムを修正しなさい。 なお、ミスの原因をコメント(注釈:/* */で囲む)としてソースプログラム中に書いておくこと。

ファイル名:ex02c3.c

/* ここにミスの原因を記入する */
#include <stdio.h>

main()
{
    int a,b,c,res;
    a=2;
    b=3;
    c=4;
    res=a*b;
    printf("%d * %d = %d\n",a,b,c,res);
    res=(2*a+b)%c;
    printf("(2*%d+%d)%%%d = %d\n",a,b);
    /* printfで%を表示させたい場合は%%を使用する */
}
解答
/* 2つのprintf文の変数の数があっていない */
#include <stdio.h>
main()
{
    int a,b,c,res;
    a=2;
    b=3;
    c=4;
    res=a*b;
    printf("%d * %d = %d\n",a,b,res);
    res=(2*a+b)%c;
    printf("(2*%d+%d)%%%d = %d\n",a,b,c,res);
    /* printfで%を表示させたい場合は%%を使用する */
}


(C-4)
変数 a、b、c、d、e にそれぞれ 8、9、6、5、4 を代入し、それらの合計と平均を計算・表示するプログラムを作成しなさい。 ただし、平均は実行例のように整数すなわち商と余りで表示すること。

ファイル名:ex02c4.c

[実行例]
% ./a.out
合計 = 32
平均(商) = 6
平均(余り) = 2
解答
#include <stdio.h>

main()
{
    int a, b, c, d, e, goukei, syou, amari;
    a=8; b=9; c=6; d=5; e=4;

    goukei=a+b+c+d+e;
    syou=goukei/5;
    amari=goukei%5;
    printf("合計 = %d\n",goukei);
    printf("平均(商) = %d\n",syou);
    printf("平均(余り) = %d\n",amari);
}



何か疑問や間違いがあれば以下に連絡して下さい。
プログラミング入門演習問題担当(prog0)