Ex12Ans

From Prog0

Jump to: navigation, search

演習第12回

Contents

解答例

A問題

A-1 関数における変数の値

ファイル名: ex12a1.txt

出力結果は以下の通りである。

                出力関数         理由    

No.0, n:3       main()          初期値  
No.3, n:3       function1       引数で 3 が渡されるから
No.4, n:9       function1       二乗されるから
No.1, n:3       main()          main では変更されていない
No.5, n:0       function2       初期値
No.6, n:9       function2       引数で 3 が渡され二乗されるから
No.2, n:3       main()          main では変更されていない


  
  #include <stdio.h>
  
  int function1(int);
  int function2(int);
  void print_value(int,int);
  
  int main()
  {
      int n=3;
  
      print_value(0,n);
      function1(n);
      print_value(1,n);
      function2(n);
      print_value(2,n);
      return 0;
  }
  
  int function1(int n)
  {
      print_value(3,n);
      n=n*n;
      print_value(4,n);
      return n;
  }
  
  int function2(int m)
  {
      int n=0;
      print_value(5,n);
      n=m*m;
      print_value(6,n);
      return n;
  }
  
  void print_value(int m, int n)
  {
      printf("No.%d, n:%d\n",m,n);
  }
 

A-2 一次関数

ファイル名: ex12a2.c

#include <stdio.h>
void function(double, double);

int main()
{
  double a, b;

  printf("係数aとbの値を入力してください:");
  scanf("%lf %lf", &a, &b);
  printf("関数の値は以下のとおりです。\n");
  function(a, b);

  return 0;
}

void function(double a, double b)
{
  int x;
  for(x = 1; x <= 4; x++) {
    printf("x = %d のとき y = %.1f\n", x, (a*x+b));
  }
}

A-3 総和

ファイル名: ex12a3.c

#include <stdio.h>
int sum(int);

int main()
{
  int n, S;

  printf("nの値を入力してください。\n");
  scanf("%d", &n);
  S = sum(n);
  printf("1から%dまでの総和は%dです。\n", n, S);

  return 0;
}

int sum(int n)
{
  int i, S = 0;
  for (i = 1; i <= n; i++) {
    S += i;
  }
  return S;
}

/* 和の公式を使用しても良い
int sum(int n)
{
  return (n+1)*n/2;
}
*/

B問題

B-1 逐次平均

ファイル名: ex12b1.c

#include <stdio.h>

double avg(int, double, double);

int main()
{
    double indata, avgdata = 0.0;
    int n = 1;

    printf("データを入力してください\n");  
    while(1) {
        printf("入力値%d= ", n);
        scanf("%lf", &indata); 
        if(indata == 0.0) break;
        avgdata = avg(n, indata, avgdata);
        printf("平均値%d= %.1f\n", n, avgdata);
        n++;
    }

    return 0;
}

double avg(int n, double data, double avgdata)
{
    return (avgdata*(n-1)+data)/n;
}

B-2 大きな桁数の表示

ファイル名: ex12b2.c

#include <stdio.h>

int digits(int);
int get_1_digit(int, int);

int get_1_digit(int x, int pos)
{
  int i, j;

  for(i = 1 ; i < pos ; i++){
    x /= 10;
  }
  j = x % 10;
  return j;
}

int digits(int x)
{
  int keta = 1;

  while( x /= 10 ) {
    keta++;
  }
  return keta;
}

int main()
{
  int i, j, k;

  printf("正の整数を入力してください:");

  scanf("%d",&i);
  j = digits(i);

  printf("%dの桁数は%dです\n", i, j);

  for(k = j; k > 0; k--) {
    printf("%d", get_1_digit(i, k));
    if (k % 3 == 1 && k != 1)
      printf(",");
  }
  printf("\n");

  return 0;
}

B-3 ISBN番号

ファイル名: ex12b3.c

#include <stdio.h>
#include <stdlib.h>

int InputISBN( void );
int InputDigit( void );
int CalcSum( int );
int CalcCD( int );
int GetDigit(int, int);


int main()
{
  int d1, d2, d3; /* ISBN番号の各4桁の格納用 */
  int cd;         /* 13桁目(チェックディジット) */
  int sum, calccd;

  printf( "ISBNの最初の4桁を入力してください: " );
  d1 = InputISBN();
  printf( "ISBNの2つめの4桁を入力してください: " );
  d2 = InputISBN();
  printf( "ISBNの3つめの4桁を入力してください: " );
  d3 = InputISBN();
  printf( "ISBNの最後の数字を入力してください: " );
  cd = InputDigit();

  sum = CalcSum( d1 ) + CalcSum( d2 ) + CalcSum( d3 );
  calccd = CalcCD( sum ); 

  if( calccd == cd ) {
    printf( "正しいISBN番号です\n" );
  } else {
    printf( "不正なISBN番号です\n" );
  }
  return 0;
}

int InputISBN( void ) 
{
  int isbn; 

  scanf( "%d", &isbn ); 

  if( isbn < 0 || isbn > 9999 ) {
    printf( "入力された数字が不正です\n" );
    exit( 1 );
  }
  return isbn;
}

int InputDigit( void ) 
{
  int cd; 

  scanf( "%d", &cd );

  if( cd < 0 || cd > 9 ) {
    printf( "入力された数字が不正です\n" );
    exit( 1 );
  }
  return cd;
}

int CalcSum( int chunk ) 
{
  int a1, a2, a3, a4;
  int cd;

  /* 各桁の数を取り出す */
  a1 = GetDigit(chunk, 1);
  a2 = GetDigit(chunk, 2);
  a3 = GetDigit(chunk, 3);
  a4 = GetDigit(chunk, 4);

  cd = a1 + a2 * 3 + a3 + a4 * 3;
  return cd;
}

int CalcCD( int sum ) 
{
  int cd;

  cd = 10 - sum % 10;

  if( cd == 10 ) {
    return 0;
  }
  return cd;
}

int GetDigit(int value , int no)
{
  int i;

  for (i=no; i<4; i++) {
    value /= 10;
  }
  return value%10;
}

Extra問題

E-1 10進数を16進数で表示

ファイル名: ex12e1.c

#include <stdio.h>

void to_hex(int);

int main()
{
    int keta = 1, x;
    int i, n;
    int h[8];

    while (1)
    {
        printf("10進数を入力してください:");
        scanf("%d", &n);
        if (n < 0)
            printf("負の値が入力されました\n");
        else
            break;
    }

    x = n;
    while(x /= 16) {
      keta++;
    }

    x = n;
    for(i = 0; i < keta; i++) {
      h[i] = x % 16;
      x = x / 16;
    }

    printf("%d の16進数は ", n);
    for(i = keta-1; i >= 0; i--) {
      to_hex(h[i]);
    }
    printf(" です\n");

    return 0;
}

void to_hex(int i)
{
  if (i < 10) {
    printf("%d", i);
  } else {
    switch(i) {
    case 10:
      printf("a");
      break;
    case 11:
      printf("b");
      break;
    case 12:
      printf("c");
      break;
    case 13:
      printf("d");
      break;
    case 14:
      printf("e");
      break;
    case 15:
      printf("f");
      break;
    }
  }
}
Personal tools