Ex02

From Prog0

Jump to: navigation, search

Contents

演習第2回

主な内容

  • 変数の宣言・初期化・代入
  • 演算子・四則演算
  • 入出力

以下の問題を解いて期限内に解答を提出してください。もし演習のやり方を忘れたり、第1回の演習を欠席した場合は、<こちら>をクリックして「演習第1回」のページを読んでください。わからないことがあれば教員またはTA/SAに質問してください。

出席確認

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


A問題

A-1 変数名の規則

ファイル名: ex02a1.txt

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

(  ) int total;
(  ) int while;
(  ) int hashtag#prog0;
(  ) int kep1er;
(  ) int new jeans;
(  ) int stayHungry, stayFoolish;
(  ) int 5th_avenue;
(  ) int _6th_sense;
(  ) int state-of-the-art;
(  ) int /* heikin */ average;

[確認用プログラム]

#include <stdio.h>

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

A-2 値の入出力

ファイル名: ex02a2.c

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

[プログラム]

#include <stdio.h>

int main()
{
  int a;
  
  printf("整数値を入力して下さい: ");
  scanf("___",___);
  printf("入力された値は___で、これを5で割った余りは___です。___", __, ____);

  return 0;
}

[実行例]


% ./a.out 
整数値を入力して下さい: 7
入力された値は 7 で、これを5で割った余りは 2 です。
% ./a.out 
整数値を入力して下さい: 18
入力された値は 18 で、これを5で割った余りは 3 です。
% 

A-3 演算と演算子

ファイル名: ex02a3.txt

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

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

[確認用プログラム]

#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

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

[実行例]


% ./a.out 
年を平成で入力して下さい [1-31]: 16
平成 16 年は西暦 2004 年です。
平成 16 年に生まれた人は今年 19 才です。
% ./a.out 
年を平成で入力して下さい [1-31]: 20
平成 20 年は西暦 2008 年です。
平成 20 年に生まれた人は今年 15 才です。
% 

B-2 直方体の体積と表面積の計算

ファイル名: ex02b2.c

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

% ./a.out
縦の長さを入力して下さい 1
横の長さを入力して下さい 2
高さを入力して下さい 3
体積:6
表面積:22
%

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, res);

 printf("\n");

 printf("Compute (2 * a + b) %% c\n");
 /* printfで%を表示させたい場合は%%と書く */
 printf("(2 * %d + %d) %% %d = %d\n", a, b);
 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
%

Extra問題

E-1 等差級数の計算

ファイル名: ex02e1.c

以下のように初項a1、公差d、項数n をキーボードから入力し、等差数列の第 n 番目の項 an と、a1 から an までの和 Sn を計算するプログラムを作成しなさい。

% ./a.out
Enter a1 d n -> 10 3 8
an = 31
Sn = 164
%


課題提出上の注意事項

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

% ~prog0/bin/menu

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

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

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

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

Personal tools