Ex05Ans

From Prog0

Jump to: navigation, search

演習第5回

Contents

解答例

A問題

A-1 whileループ

ファイル名: ex05a1.c

#include <stdio.h>

int main() {

  int n, r, count = 0;

  printf("初期値の入力 : ");
  scanf("%d", &n);
  while (n > 0) {  /* n!=0でも可 */
    count = count + 1;
    r = n%2;
    n = n/2;
    printf("%d回目ループ 商 %d  余り %d\n", count, n, r);
  } 

  return 0;
}

A-2 インクリメント・デクリメント・代入演算子

ファイル名: ex05a2.c

#include <stdio.h>

int main() {

  int n, r, count = 0;

  printf("初期値の入力 : ");
  scanf("%d",&n);
  while(n > 0) {
    count++; /* ++count や count+=1 でも可 */
    r = n%2;
    n /= 2;
    printf("%d回目ループ 商 %d  余り %d\n", count, n, r);
  }

  return 0;
}

A-3 無限ループによる書き換え(口頭採点)

ファイル名: ex05a3.c

#include <stdio.h>

int main() {

  int n, r, count = 0; 

  printf("初期値の入力 : ");
  scanf("%d",&n);
  while(1) {
    count++; 
    r = n%2;
    n /= 2;
    printf("%d回目ループ 商 %d  余り %d\n", count, n, r);
    
    if(n<1) break; /* n==0 も可 */
  }

  return 0;
}

B問題

B-1 コラッツの問題

ファイル名: ex05b1.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;   
}

B-2 コラッツの問題プログラムの改良

ファイル名: ex05b2.c

#include <stdio.h>
int main()
{
  int n, count;
  count = 1;
  
  printf("0でない自然数nを入力\n");
  scanf("%d", &n);
  
  while (n != 1) {
    
    printf("%d回目\n",count);
    
    if (n%2 == 0) {
      printf("%dは偶数\n",n);
      n = n / 2;
    } else {
      printf("%dは奇数\n",n);
      n = n * 3 + 1;
    }
    
    printf("次の n = %d\n\n", n);
    
    count++;
  }
  
  printf("%d回目で n = %d になりました\n", count-1, n);
  return 0;
}

B-3 試験結果の集計

ファイル名: ex05b3.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-4 インクリメント・デクリメント

ファイル名: ex05b4.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である。

Extra問題

E-1 ユークリッドの互除法

ファイル名: ex05e1.c

#include <stdio.h>

int main() {

  int m, n, new_n;

  printf("m nを入力して下さい:");
  scanf("%d%d", &m, &n);

  while(n != 0) {
    new_n = m%n;
    printf("%d %% %d = %d\n", m, n, new_n);
    m = n;
    n = new_n;
  }
  printf("最大公約数は %d です\n", m);

  return 0;
}
Personal tools