Ex02

From Prog0

Jump to: navigation, search

演習第2回

Contents

演習問題

主な内容

  • 変数
  • printf/scanf
  • 演算

以下の問題を解いて期限内に解答を提出してください。

出席確認

演習時間中に出席確認をLMS上の「演習出欠」で行ってください。出席確認用のパスワードは演習時間のどこかのタイミングで提示されます。


A問題

A-1 変数名の規則

ファイル名: ex02a1.txt

以下の項目を ex02a1.txt にコピーし、正しいものには括弧内に「o」を、間違っているものには「x」を記入しなさい(マルバツを o(オー)と x(エックス)で代用します)。 なお、間違っているものについてはその具体的な理由を各行の右側に書いた上で、以下のプログラムを使ってどのようなエラーが出力されるか確認すること。 (エラー内容を丸ごと解答に記入する必要はない)

  • ( )int 666pokemon;
  • ( )int _666pokemon;
  • ( )int class.1;
  • ( )int num1, num2;
  • ( )int good-day;
  • ( )int __init__;
  • ( )int for = 0;
  • ( )int a1, a2=0;
  • ( )int speed2fast;
  • ( )int prog@uoa;


[確認用プログラム]

#include <stdio.h>

int main()
{
  int  666pokemon; /* この行を上の各行で置き換える */
  return 0;
}

A-2 値の入出力

ファイル名: ex02a2.c

以下はキーボードから入力した整数値と、それを5倍した結果を表示するプログラムである。下線部を埋めてプログラムを完成させなさい。なお、結果を表示した後は改行されるようにすること。

[プログラム]

#include <stdio.h>

int main()
{
  int  num;
  printf("整数値を入力して下さい:");
  scanf("___",___);
  printf("入力された値は___で、これを5倍した結果は___です。___", __, ____);
  return 0;
}

[実行例]

% ./a.out
整数値を入力して下さい:3
入力された値は 3 で、これを5倍した結果は 15 です。
% ./a.out  
整数値を入力して下さい:15
入力された値は 15 で、これを5倍した結果は 75 です。
%

A-3 演算と演算子

ファイル名: ex02a3.txt

以下の項目を ex02a3.txt にコピーし、コンパイルが通る(成功する)ものには括弧内に「o」を、コンパイルが通らない(失敗する)ものには「x」を記入しなさい。 なお、コンパイルが通ると考えられるものについては予想される計算結果を各行の右側に書いた上で、以下の確認用プログラムを使って実際の出力を確認すること。なお、i, j, k, result の初期値はそれぞれ 1, 2, 3, 0 とする。

  • ( ) result = (i + j) * k;
  • ( ) result = i + (j * k) / (k - 1);
  • ( ) result = (i + (j - k);
  • ( ) i + j + k = result;
  • ( ) result = 3k;
  • ( ) result = (k / (j * 2));
  • ( ) result = j+*k;
  • ( ) result = result + i*j;


[確認用プログラム]

#include <stdio.h>

int main()
{
  int i=1, j=2, k=3, result=0;
  result = (i + j) * k; /* ここを修正してコンパイル */
  printf("result = %d\n", result);

  return 0;
}

B問題

B-1 平成/西暦変換

ファイル名: ex02b1.c

キーボードから入力した年(平成)を西暦にして出力するプログラムを作成しなさい。またその年に生まれた人が今年(西暦2025年)何才になるかも表示しなさい。なお、結果を表示した後は改行されるようにすること。ただし入力は 1 (平成元年)から 31 (平成31年)までの整数が入力されるものとして考えてよい(エラー処理は不要)。

[実行例]

% ./a.out 
年を平成で入力して下さい [1-31]: 3
平成 3 年は西暦 1991 年です。
平成 3 年に生まれた人は今年 34 才です。
% ./a.out 
年を平成で入力して下さい [1-31]: 25
平成 25 年は西暦 2013 年です。
平成 25 年に生まれた人は今年 12 才です。
%

B-2 台形面積の計算

ファイル名: ex02b2.c

以下のように台形の上底・下底・高さをキーボードから入力し、その面積を計算するプログラムを作成しなさい。上底・下底・高さは整数値で与えるものとする。

[実行例]

% ./a.out
上底の長さを整数値で入力しなさい:1
下底の長さを整数値で入力しなさい:2
高さを整数値で入力しなさい:4
面積:6
%

B-3 プログラムのデバッグ(上級編)

ファイル名: ex02b3.c

以下のプログラムはscanfで入力された3つの数値を変数a, b, cに格納した上で、2つの計算

  • a × b
  • (2 × a + b) % c

について内部で計算を行うとともに、画面にも計算式と計算結果双方の表示を行うプログラムである。しかし、プログラム中にミス(バグ)があるため、実行しても意図した動作とならず、表示された計算式と内部での計算内容が一致しない。正しく動作するようにプログラムを修正しなさい。ただし、printfの書式(" "で囲まれた部分)には誤りがないと考えてよい。

#include <stdio.h>

int main()
{
 int a, b, c, res;

 printf("Input a, b, and c: ");
 scanf("%d%d%d", &a, &b, &c);
 printf("\n");

 res = a*b;
 printf("Compute a * b\n");
 printf("%d * %d = %d\n", a, b, c);

 printf("\n");

 printf("Compute (2 * a + b) %% c\n");
 /* printfで%を表示させたい場合は%%と書く */
 printf("(2 * %d + %d) %% %d = %d\n", a, b, c);
 res = (2*a+b)%c;

 return 0;
}


[実行例](バグ修正後の意図通り動作するもの)

% ./a.out 
Input a, b, and c: 2 3 4

Compute a * b
2 * 3 = 6

Compute (2 * a + b) % c
(2 * 2 + 3) % 4 = 3
%

E問題

E-1 二次関数の計算

ファイル名: ex02e1.c

ある整数 a が入力された時、その値とその前後の値 a-2, a-1, a, a+1, a+2 を x として、二次関数y = 3x2 - 4x + 5 の値を実行例のように表示するプログラムを作成せよ。


[実行例]  

% ./a.out
Enter a -> 2
x : y
0 : 5
1 : 4
2 : 9
3 : 20
4 : 37
%

課題提出上の注意事項

解答ファイルはmenuコマンドを使って提出してください。以下のようにmenuコマンドを実行し、表示されるメッセージに沿って操作すること。

% ~prog0/bin/menu

menuコマンドは、解答ファイルが ~/Prog0/Ex## のディレクトリに指定されたファイル名で置かれているものとして処理します。正常に提出された場合は ○ が、何らかのエラーが生じた場合は × が表示されます。

解答の提出期間は以下のとおりです。

問題提出受付開始提出〆切
A問題 演習日の6日前の午後9時演習終了時刻
B, Extra問題 演習日の6日前の午後9時演習日の6日後の午後9時

提出は〆切前であれば何度でもやり直すことができます。再提出すると、前に提出したファイルは新しい内容で上書きされます。

Personal tools