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 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;
}

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 i;
  int m, d;
  int days;

  printf("月と日を空白で区切って入力してください:");
  scanf("%d %d", &m, &d);

  days = d;
  i = 1;
  while (i < m)
  {
    if (i == 2)
    {
      days += 28;
    }
    else if ((i == 1) || (i == 3) || (i == 5) ||
             (i == 7) || (i == 8) || (i == 10) || (i == 12))
    {
      days += 31;
    }
    else
    {
      days += 30;
    }
    i++;
  }

  printf("2023年%d月%d日は%d日目で", m, d, days);
  switch (days % 7)
  {
  case 0:
    printf("土");
    break;
  case 1:
    printf("日");
    break;
  case 2:
    printf("月");
    break;
  case 3:
    printf("火");
    break;
  case 4:
    printf("水");
    break;
  case 5:
    printf("木");
    break;
  case 6:
    printf("金");
    break;
  }
  printf("曜日です\n");

  return 0;
}
Personal tools