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