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