Ex12Ans

From Prog0

Jump to: navigation, search

演習第12回

Contents

解答例

A問題

A-1 一次関数

ファイル名: ex12a1.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-2 大きな桁数の表示

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

A-3 ニュートン法

ファイル名: ex12a3.c

#include <stdio.h>
#define EPS 1.0e-6

double f(double, double);
double df(double);

int main()
{
    double a, x, fx, dfx;

    a = 2.0;
    x = a;
    printf("x(k-1)\t\tfx\t\tdfx\t\tx(k)\t\tf(x,%f)\n", a);
    while ((fx = f(x, a)) > EPS)
    {
        dfx = df(x);
        printf("%f\t%f\t%f", x, fx, dfx);
        x = x - fx / dfx;
        printf("\t%f\t%12.10f\n", x, f(x, a));
    }
    printf("sqrt(%f): %12.10f\n", a, x);

    return 0;
}

double f(double x, double a)
{
    return x * x - a;
}

double df(double x)
{
    return 2.0 * x;
}

B問題

B-1 10進数から2進数への変換

ファイル名: ex12b1.c

#include <stdio.h>
#define DIGIT 8

void d2b(int);

int main()
{
    int n;

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

    return 0;
}

void d2b(int n)
{
    int i, bin[DIGIT];
    for (i = 0; i < DIGIT; i++)
    {
        bin[i] = n % 2;
        n /= 2;
    }
    for (i = 0; i < DIGIT; i++)
        printf("%d", bin[DIGIT - 1 - i]);
    printf("\n");
}

B-2 黄金数の計算

ファイル名: ex12b2.c

#include <stdio.h>

double fib(int);

double fib(int i) {
  int k;
  double F0 = 0.0;
  double F1 = 1.0;

  if (i == 0) return F0;
  if (i == 1) return F1;

  double F2;
  for(k = 0; k < i-1; k++) {
    F2 = F0 + F1;
    F0 = F1;
    F1 = F2;
  }

  return F2;
}

int main() {
  int i;
  double phi = 1.618033988749895;
  double r;

  for(i = 0; i <= 9; i++) {
    printf("F(%i)=%.0f  ", i, fib(i));
  }
  printf("\n\n");

  for(i = 10; i <= 30; i++) {
    r = fib(i+1)/fib(i);
    printf("%i %20.12e %20.12e\n", i, r, r-phi);
  }

  return 0;
}

B-3 10進数を16進数で表示

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

Extra問題

E-1 逐次平均

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