Ex12Ans
From Prog0
演習第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; }