Ex05Ans

From Prog0

Jump to: navigation, search

演習第5回

Contents

解答例

A問題

A-1 インクリメント・デクリメント

ファイル名: ex05a1.txt

最初の"3"は、前置インクリメントによって出力よりも前にiに1が足されるため、3が出力される。出力後のiの値は3である。
2番目の"3"は、後置インクリメントによって出力の後にiに1が足されるため、3が出力される。出力後のiの値は4になる。  
3番目の"3"は、前置デクリメントによって出力よりも前にiから1が引かれるため、3が出力される。出力後のiの値は3である。
最後の"3"は、後置デクリメントによって出力の後にiから1が引かれるため、3が出力される。出力後のiの値は2である。

A-2 コラッツの問題

ファイル名: ex05a2.c

#include <stdio.h>
int main()
{
  int n;
  
  printf("0でない自然数nを入力して下さい ");
  scanf("%d", &n);
  
  while(n != 1) {
    
    if (n%2 == 0) {
      n = n / 2;
    } else {
      n = n * 3 + 1;
    }
    
    printf("n = %d\n", n);
  }
  
  printf("終了\n");
  return 0;   
}

A-3 九九の表示

ファイル名: ex05a3.c

#include <stdio.h>

int main() {
  int s, x, y;

  x = 1;
  while(x < 10) {
    y = 1;
    while(y < 10) {
      s = x*y;
      printf("%3d", s);
      y++;
    }
    printf("\n");
    x++;
  }

  return 0;
}

B問題

B-1 試験結果の集計

ファイル名: ex05b1.c

#include <stdio.h>

int main() {

  int student = 0; /* 受験者数 */
  int pass = 0, fail = 0; /* pass:合格者数、fail:不合格者数 */
  int score, total_score = 0; /* score:得点、total_score:得点の合計 */
  double average;
  
  while(1) {
    printf("得点を入力して下さい: ");
    scanf("%d", &score);
    
    if (score < 0) break;
    
    student++;
    total_score += score;
    if (score >= 50 ) pass++;
    else fail++;
  }
  
  average = (double) total_score / student;
  printf("受験者数 %d 名,平均点 %f 点\n", student, average);
  printf("合格者数 %d 名,不合格者数 %d 名\n", pass, fail);

  return 0;
}

B-2 温度計の目盛り

ファイル名: ex05b2.c

#include <stdio.h>

int main() {

    int min, max, deg;

    printf("最低温度? ");
    scanf("%d", &min);
    printf("最高温度? ");
    scanf("%d", &max);

    /* 数字を表示 */
    deg = min;
    while (deg <= max) {
        printf("%3d ", deg); // 空白を加えて4文字幅で表示
        deg += 10;
    }
    printf("\n");

    /* 線を表示 */
    deg = min;
    while (deg <= max) {
        printf("--+-"); // 数字に合わせて4文字
        deg += 10;
    }
    printf("\n");

    return 0;
}

B-3 カレンダーの表示

ファイル名: ex05b3.c

#include <stdio.h>

int main() {
  int b, i;
  int day;

  scanf("%d", &b);

  printf(" 月 火 水 木 金 土 日\n");

  i = 1;
  while(i <= b - 1) {
    printf("   ");
    i++;
  }

  day = 1;
  while(day <= 31) {
    printf("%3d", day);
    day++;
    if (b == 7) {
      printf("\n");
      b = 1;
    } else {
      b++;
    }
  }
  printf("\n");

  return 0;
}

Extra問題

E-1 クレジットカードのリボ払い返済

ファイル名: ex05e1.c

#include <stdio.h>

int main()
{
  int loan, pay, month=0;
  double yrate=15.0, rate; /* yrate:年率(%), rate:1月当たりの金利 */
  int total=0;

  rate=yrate/12/100;  /* 1月当たりの金利(%では無い) */

  loan=200000; /* 借入れ額 */
  printf("月毎の返済額を入力して下さい : ");
  scanf("%d",&pay);
  printf("%d円を定額リボ払いで月%d円ずつ返済します。\n",loan,pay);

  while(loan>0) {
    month++;
    loan=loan*(1+rate);
    if (loan<pay) pay=loan;
    
    total+=pay;

    printf("%2d ヵ月: 金利手数料込残金:%6d円 支払後残金:%6d円 返済総額:%6d円\n",month, loan, loan-pay, total);
    loan=loan-pay;
  }
  printf("返済期間 %2dヵ月  総返済額:%6d円\n",month, total);

  return 0;
}

Personal tools