C Primer Plus(第6版)第九章编程练习答案(最后一题未写)

9.11编程练习

/*
PE 9-1
设计一个函数min(x, y),返回两个double类型值的较小值,在一个简单的驱动程序中测试该函数
*/

#include 
double min(double a, double b);
int main(void)
{
	printf("The min number between 1 and 5 is %.2f \n", min(1.0, 2.0));

	return 0;
}

double min(double a,  double b)
{
	return a <= b ? a : b;
}
/*
PE 9-2
设计一个函数chline(ch, j, i),打印指定的字符j行i列(书又翻译错了)
原文that prints the requested character in columns i through j .
在一个简单的驱动程序中测试该函数。 
*/

#include 
void chline(char ch, int row, int col);
int main(void)
{
	chline('*', 3, 5);
	
	return 0;
}

void chline(char ch, int row, int col)
{
	for (int i = 1; i <= row; i++)
	{
		for (int j = 1; j <= col; j++)
			putchar(ch);
		putchar('\n');
	}
	
	return;
}
/*
PE 9-3
编写一个函数,接受三个参数,一个字符和两个整数。
字符参数是待打印的字符,第1个整数指定一行中打印字符的次数,
第2个整数指定打印指定字符的行数。编写一个调用该程序的函数。
注意:第1个参数是列数,第2个参数是行数
*/

#include 
int main(void)
{
	print_ch('#', 3, 4);

	return 0;
}

void print_ch(char ch, int col, int row)
{
	for (int i = 1; i <= row; i++)
	{
		for (int j = 1; j <= col; j++)
			putchar(ch);
		putchar('\n');
	}
	
	return;
}
/*
EP 9-4
两数的调和平均数这样计算:先得到两数的倒数,然后计算这两个倒数的平均值,
最后取计算结果的倒数,
编写一个函数,接受两个double类型的参数,返回这两个参数的调和平均数
*/

#include 
double harmonic(double d1, double d2);
int main(void)
{
	double x, y;
	double result;

	printf("Enter two numbers and i will return it's harmonic mean: \n");
	scanf("%lf %lf", &x, &y);
	result = harmonic(x, y);
	if (result > 0)
		printf("Harmonic mean is %.2f", result);
	else
		printf("The number have no hamonic mean. \n");
		
    return 0;

}

double harmonic(double d1, double d2)
{
	if (d1 != 0 && d2 != 0)
	{
	return 1.0 / ((1.0/d1 + 1.0/d2) / 2.0);
	}
	else
		return -1;
}

/*
PE 9-5
编写并测试一个函数large_of(),该函数把两个double类型变量的值替换为较大的值。
例如large_of(x, y)会把x,y中较大的值重新赋给两个变量
*/

#include 
void large_of(double*, double*);
int main(void)
{
		double x = 2.0;
		double y = 3.0;
		printf("Original x is %.2f, y is %.2f. \n", x, y);
		large_of(&x, &y);
		printf("After large_of x is %.2f, y is %.2f. \n", x, y);
}

void large_of(double *pa, double *pb)
{
	*pb = *pa >= *pb ? *pa : *pb;
	*pa = *pb;

	return;
}

/*
PE 9-6
编写并测试一个函数,该函数以3个double变量的地址作为参数,
把最小值放入第1个变量(这里书又翻译错了= =!),
中间值放入第2个变量,最大值放入第三个变量。
*/

#include 
int main(void)
{
	double x = 5.0;
	double y = 3.0;
	double z = 6.0;
	printf("Original value x  %.2f, y %.2f, z %.2f. \n", x, y, z);
	change3d(&x, &y, &z);
	printf("After change3d value x  %.2f, y %.2f, z %.2f. \n", x, y, z);

	return 0;
}

void change3d(double * smal, double * mid, double * larg)
{
    double temp;

	if (*smal >= *mid)
	{
		temp = *smal;
		*smal = *mid;
		*mid = temp;
	}
	if (*smal >= *larg)
	{
		temp = *smal;
		*smal = *larg;
		*larg = temp;
	}
	if (*mid >= *larg)
	{
		temp  = *mid;
		*mid = *larg;
		*larg = temp;
	}

	return;
}

/*
PE 9-7
编写一个函数,从标准输入中读取字符,直到遇到文件结尾。程序要报告每个字符是否是字母。
如果是,还要报告该字母在字母表中的位置。
例如,c和C在字母表中的位置都是3。
合并一个函数,以一个字符作为参数,如果该字符是一个字母则返回一个数值位置,否则返回-1
*/

#include 
#include 
int main(void)
{
    char ch;

    while ((ch = getchar()) != EOF)
    {
        int location = ch_loc(ch);
        printf("%c location %d \n", ch, location);
    }
}

int ch_loc(ch)
{
    int back;

    if (isalpha(ch))
    {
        if (islower(ch))
				back = ch - 96;
        if (isupper(ch))
            back = ch - 64;
    }
    else
        back =  -1;

	return back;
}
每次后面都会打印-1是因为键入的换行符
/*
PE 9-8
第6章的程序清单6.20中,power()函数返回一个double类型书的正整数次幂。
改进该函数,使其能正确计算负幂。
另外,函数要处理0的任何次幂都为0,
任何数的0次幂都为1(函数应报告0的0次幂未定义,因此把该值处理为1).
要使用一个循环,并在程序中测试该函数。
*/
//???这不用该也能正确计算负数的幂啊???

#include 
double power(double n, int p);
int main(void)
{
    double x, y;

    printf("Enter tow number such as 2 and 3,\n"
           "and i will show you 2 to the power of 3: ");
    while (scanf("%lf %lf", &x, &y) == 2)
    {

        printf("%f \n", power(x, y));
        printf("Try again: ");
    }
}

double power(double n, int p)
{
	double pow = 1;
	int i;

	if (n == 0 && p == 0)
		printf("0 power of 0 is undefined so it's ");
	for (i = 1; i <= p; i++)
		pow *= n;

	return pow;
}

/*
PE 9-9
使用递归函数重写PE 9-8
*/

#include 
double power_recursion(double n, int p);
int main(void)
{
    double x, y;

    printf("Enter tow number such as 2 and 3,\n"
           "and i will show you 2 to the power of 3: ");
    while (scanf("%lf %lf", &x, &y) == 2)
    {
        printf("%f \n", power_recursion(x, y));
        printf("Try again: ");
    }

}

double power_recursion(double n, int p)
{
    if (n == 0 && p == 0)
        printf("0 power of 0 is undefined so it's ");
    if (p >= 1)
        return n * power_recursion(n,  p - 1);
    else
        return 1;
}


/*
PE 9-10
为了让程序清单9.8中的to_binary()函数更通用,
编写一个to_base_n()函数,接受两个在2~10范围内的参数,
然后以第2个参数中指定的进制打印第1个参数的数值。
例如to_base_n(129, 8)显示的结果为201,也就是129的版进制数。
在一个完整的程序中测试该函数。
*/

#include 
void to_base_n(int , int);
int main(void)
{
    int num, dec;

    printf("Please enter a number, "
           "and the decimal you want to convert. \n");
    printf("Number: ");
    scanf("%d", &num);
    printf("Decimal: ");
    scanf("%d", &dec);
    switch (dec)					//添加常用输出提示,其他进制没有显示= =!
    {
        case 2 : printf("Binary: ");
            break;
        case 8 : printf("Octal: ");
            break;
        case 16 : printf("Hexadecimal: ");
            break;
        default : printf("Just usual decimal can be show the decimal tips,"
                         " but the value is right! \n");
    }
    to_base_n(num, dec);

    return 0;

}
void to_base_n(int num, int dec)
{
	int r;

	r = num % dec;
	if (num >= dec)
		to_base_n(num / dec, dec);
	printf("%d", r);

	return;
}


/*
EP 9-11
编写并测试Fibonacci()函数,该函数用循环代替递归计算斐波那契数。
*/

#include 
int main(void)
{
	
}

int Fibonacci(int loc)
{
	int f1 = 1;
	int f2 = 1;

	while (int i < )
}

你可能感兴趣的:(C,answer,C,Primer,Plus答案)