第九章関数



1.設計関数min(x,y)は、2つのdouble数値のうち小さい数値を返し、簡単なドライバで関数をテストします.
 
 
//exercise01
#include<stdio.h>

double min(double x,double y);

int main(void)
{
	double x= 0;
	double y = 0 ;
	double min_num = 0;
	printf("enter two double number:");
	while(scanf("%lf %lf",&x,&y) != 2)
	{
		printf("enter error,try again!
"); while(getchar() != '
') continue; } min_num = min(x,y); printf("the minium number is %.2f
",min_num); return 0; } double min(double x,double y) { if( x < y) return x; return y; }
 
 
2.関数chline(ch,i,j)を設計し、指定された文字のi列からj列への出力を実現し、簡単なドライバで関数をテストする.
 
 
 
//exercise02
#include<stdio.h>

void chline(char ch , int i , int j);

int main(void)
{
    int i = 0;
	int j = 0 ;
	char ch = ' ';

	printf("enter the char you want to print:");
	ch = getchar();
	printf("enter i , j:");
    scanf("%d %d",&i,&j);
	chline(ch,i,j);
	return 0;
}


void chline(char ch , int i , int j )
{
	for(int col1 = 1 ; col1 < i ; col1++)
		putchar(' ');
	for(int col2 = i ; col2 <= j ; col2 ++)
		putchar(ch);
	putchar('
'); }
 
 
3.関数を作成します.関数の3つのパラメータは、1文字と2つの整数です.文字パラメータは、出力する文字です.1番目の整数は、各行における文字出力の個数を示し、2番目の整数は、出力する必要がある行数を指す.関数を呼び出すプログラムを作成します.
 
 
*chap9_03.cpp -- exercise02*/
#include<stdio.h>

void chline(char ch , int i , int j);

int main(void)
{
    int rows = 0;
	int cols = 0 ;
	char ch = ' ';

	printf("enter the char you want to print:");
	ch = getchar();
	printf("enter rows and colums:");
    scanf("%d %d",&rows,&cols);
	chline(ch,rows,cols);
	return 0;
}


void chline(char ch , int i , int j )
{
	for(int row = 0 ; row < i ; row++)
	{
		for(int col = 0 ; col < j ; col ++)
			putchar(ch);
		putchar('
'); } }
 
 
 
 
4.2つの数値の調和平均値は、まず2つの数値の逆数に対して平均値を取り、最後に逆数を取ります.2つのdoubleパラメータを持つ関数を作成し、この2つのパラメータの高調平均値を計算します.
 
 
#include<stdio.h>

double meanValue(double x,double y);

int main()
{
	double x = 1;
	double y = 1;
	double result = 0;

	printf("enter two numbers(can not 0):");
	while(scanf("%lf %lf",&x,&y) == 2 && x != 0 && y != 0)
	{
           result = meanValue(x,y);
		   printf("mean value is %.2f
",result); printf("enter two numbers(can not 0,q to quit):"); } return 0; } double meanValue(double x , double y) { double temp = 1; temp = (1 / x + 1 / y) / 2; return 1/temp; }
 
 
 
 
 
 
5.関数larger_の作成とテストof()は、2つのdoubleタイプ変数の数値をそれらの大きな値に置き換える機能です.たとえばlarger_of(x,y)はxとyの大きな数値を変数xとyに再付与する
 
 
//exercise05
#include<stdio.h>

void large_of(double *x, double * y);
int main()
{
	double x = 1;
	double y = 1;
	
	printf("enter two numbers(can not 0):");
	while(scanf("%lf %lf",&x,&y) == 2 )
	{
           large_of(&x,&y);
		   printf("x = %.2f , y = %.2f 
",x , y); printf("enter two numbers(can not 0,q to quit):"); } printf("Done!
"); return 0; } void large_of(double *x , double * y) { if(*x > *y) *y = *x; else *x = *y; }
 
 
 
 
6.ファイルの最後に遭遇するまで、標準入力から文字を読み取るプログラムを作成します.各文字について、プログラムは文字がアルファベットであるかどうかを確認し、報告する必要があります.もしそうであれば、プログラムはアルファベットのアルファベットの数値位置を報告しなければならない.たとえば、cとCのアルファベットの位置は3です.まず、文字パラメータを受け入れ、文字がアルファベットの場合はアルファベットの数値位置を返し、そうでない場合は-1を返します.
 
 
//exercise06
#include<stdio.h>
#include<ctype.h>

int isChar(char ch);

int main(void)
{
    char ch;
	int position;
	printf("printf chars(ctrl + z is end):
"); while(( ch = getchar() ) != EOF) { position = isChar(ch); if(position > 0) printf("%c %d
",ch,position); } printf("Done!
"); return 0; } int isChar(char ch) { if(isalpha(ch)) { ch = toupper(ch); return ch - 64; } return -1 ; }
 
 
 
 
7.第6章「C制御文:ループ」のプログラムリスト6.20において、関数power()の機能は、1つのdoubleタイプ数の正の整数乗を返すことである.この関数を改善して、負のべき乗を正確に計算できるようにします.同時に、この関数を用いて0の任意の乗が0であり、任意の数値の0の乗がlであることを実現する.ループメソッドを使用して関数を記述し、プログラムでテストします.
 
 
//exercise07
#include<stdio.h>

double power(double x, int y);  //  x   y  

int main(void)
{
    double x=0;
	int y = 0 ;
	double result = 0;

	printf("enter base number and exponent number:");
	while(scanf("%lf %d",&x , &y) == 2)
	{
         result = power(x,y);
		 printf("result is %.2f
",result); printf("enter base number and exponent number(q to quit):"); } printf("Done!
"); return 0; } double power(double x, int y) // x y { double result = 1; if( x == 0) return 1; else { if( y > 0) for(int i = 0 ; i < y ; i ++) result *=x; else if ( y < 0) for(int i = 0 ; i < -y ; i ++) result *= 1 / x; else return 1; } return result ; }
 
 
 
 
8.再帰関数を使用して練習7をやり直します.
 
 
#include<stdio.h>
//#include<math.h>

double power(double x , int y); // x   y 

int main(void)
{
	double x=0;
	int y = 0 ;
	double result = 0;

	printf("enter base number and exponent number:");
	while(scanf("%lf %d",&x , &y) == 2)
	{
         result = power(x,y);
		 printf("result is %.2f
",result); printf("enter base number and exponent number(q to quit):"); } printf("Done!
"); return 0; } double power(double x , int y) // x y { double result = 0; if( x == 0 ) return 1 ; if( y > 0) return x * power(x,y-1); else if( y < 0) return ( 1 / x ) * power(x , y + 1); else return 1; return result; }
 
 
 
9.プログラムリスト9を作成するために.八の中の関数to_binary()はより一般化され、新しい関数to_base_n()では2番目のパラメータが使用され、このパラメータの範囲は2〜10である.そして、この新しい関数は、第1のパラメータが第2のパラメータで規定された進数での数値結果を出力する.例えば、to_base_n(129,8)の出力は201,すなわち129の8進数値である.最後に、完全なプログラムで関数をテストします.
 
 
//exercise09
#include<stdio.h>
void convert(int input, int n) ; // input n 

int main(void)
{
	int input = 0;
	int n = 0;

	printf("please enter number and scale: ");
	while(scanf("%d %d", &input, & n) == 2)
	{
       convert(input , n);
	}
	return 0;
}

*input  , n  */
void convert(int input, int n)  
{
     int r ;
	 r = input % n;
	 if(input >= n)
		 convert( input / n, n);
	 putchar('0' + r);
	 return;
}
 
 
10.フィボナッチ数列の計算を再帰的に完了する代わりにループを使用する関数Fibonacci()を記述し、テストする.
 
 
//exercise10
#include<stdio.h>

int Fibonacci(int n) ;
int main(void)
{
    int n = 0;
	
	printf("please input an integer:");
	while(scanf("%d",&n) == 1)
		printf("%d",Fibonacci(n));
	
	return 0 ;
}
int Fibonacci(int n)
{
	if( n <= 2)
		return 1;
	else
	    return Fibonacci(n -1) + Fibonacci( n - 2) ;
}