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