第9章《函数》在这一章中,模块化处理是主要思想,以后面对的程序代码会越来越大,为了能分式高效的完成代码的编写,避免重复编写代码的繁琐,不得不模块化也就是函数,这样也有利于程序的阅读和修改完善。
利用了函数,我们就可以值关注主体部分也就是main()函数,把函数看成“黑盒子”值要直到输入和输出,不需要太纠结"黑盒子”里到底是什么。
好了,编程练习:欢迎讨论交流
1.设计函数min(x,y),返回连个double数值中较小的数值,同时用一个简单的驱动程序测试该函数。
#include <stdio.h>
double min(double x,double y);//比较这个数的大小返回较小的数
//驱动程序
int main(void)
{
double x=3.0,y=4.0;
printf("两者之间较小的数是:%.1f .\n",min(x,y));
return 0;
}
//比较这个数的大小返回较小的数
double min(double x,double y)
{
double dmin;
if(x<y)
dmin=x;
else
dmin=y;
return dmin;
}
2.设计函数chline(ch,i,j),实现指定字符在i列到j列的输出,并用一个简单的驱动程序测试该函数。
#include <stdio.h>
#define SPACE ' '
//指定字符在i列到j列的输出
void chine(char ch,int i,int j);
int main(void)
{
chine('*',3,8);//在第3列到第8列之间打印*号
return 0;
}
//指定字符在i列到j列的输出
void chine(char ch,int i,int j)
{
int temp;
temp=i;
while(temp-->0)//前i列打印空格符
putchar(SPACE);
for (;i<=j;i++)//在i列到j列之间打印指定字符
putchar(ch);
printf("\n");
}
3.编写一个函数。函数的3个参数是一个字符和两个整数。字符参数是需要输出的字符。第一个整数说明了在每行中该字符输出的个数,而第二个整数指的是需要输出的行数。编写一个调用该函数的程序。
#include<stdio.h>
void chline(char ch,int i,int j);//在指定j行上输出i个ch字符
int main (void)
{
chline('$',8,8);//在第8行上打印8个$符号
return 0;
}
void chline(char ch,int i,int j)
{
while(--j>0)
printf("%d\n",j);//到达指定j行,前j行全部打印换行符
while(i-->0)
printf("%c",ch);//连续打印i个ch字符
printf("\n");
}
4.两数值的谐均值可以这样计算:首先对两数值的倒数取平均值,最后再取倒数。编写一个带有两个double参数的函数,计算这两个参数的谐均值。
#include <stdio.h>
#include <math.h>
double xave(double x,double y);//计算谐均值
int main(void)
{
printf("4和8的谐均值是 %.1f\n",xave(4.0,8.0));
return 0;
}
//计算谐均值
double xave(double x,double y)
{
return (1/((1.0/x+1.0/y)/2.0));
}
5.编写并测试韩式larger_of(),其功能是将两个double类型变量的数值替换称它们中的较大值。例如,larger_of(x,y)会把x和y中的较大数值重新赋给变量x和y。
#include <stdio.h>
void larger_of(double * u,double * v);//把较大的数重新赋给两个变量
int main(void)
{
double x=4.0,y=9.0;
printf("原始x=%.1f y=%.1f\n",x,y);
larger_of(&x,&y);//指针传递
printf("经过变换后现在x=%.1f y=%.1f\n",x,y);
return 0;
}
//把较大的数重新赋给两个变量
void larger_of(double * u,double * v)
{
if(*u<*v)
*u=*v;
else
*v=*u;
}
6.编写一个程序,使其从标准输入读取字符,直到遇到文件结尾,对于每个字符,程序需要检查并报告该字符是否是一个字母。如果是的话程序还应该报告字母在字母表中的数值位置。例如,c和C的字母位置都是3。可以先实现这样一个函数:接受一个字符参数,如果该字符为字母则返回字母的数值位置,否则返回-1。
#include<stdio.h>
#include <ctype.h>
int address(char ch);//字母ch在字母表的位置,忽略大小写
int main(void)
{
char ch;
printf("请输入一个字母(#号退出):");
while((ch=getchar())!='#')
{
if('\n'==ch)
continue;//跳过换行符
if(isalpha(ch))
printf("字母%c在字母表的位置是%d\n",ch,address(ch));
else
return -1;
printf("请输入一个字母(#号退出):");
}
}
//字母ch在字母表的位置,忽略大小写
int address(char ch)
{
switch(tolower(ch))
{ case 'a':
return 1;
break;
case 'b':
return 2;
break;
case 'c':
return 3;
break;
case 'd':
return 4;
break;
case 'e':
return 5;
break;
case 'f':
return 6;
break;
case 'g':
return 7;
break;
case 'h':
return 8;
break;
case 'i':
return 9;
break;
case 'j':
return 10;
break;
case 'k':
return 11;
case 'l':
return 12;
case 'm':
return 13;
case 'n':
return 14;
case 'o':
return 15;
case 'p':
return 16;
case 'q':
return 17;
case 'r':
return 18;
case 's':
return 19;
break;
case 't':
return 20;
break;
case 'u':
return 21;
break;
case 'v':
return 22;
break;
case 'w':
return 23;
break;
case 'x':
return 24;
break;
case 'y':
return 25;
break;
case 'z':
return 26;
break;
default:
break;
}
}
7.在第6章“C控制语句:循环”的程序清单6.20中,函数power()的功能是返回一个double类型数的某个正整数次幂。现在改进该函数,使其能正确地计算负幂。同时,用该函数实现0的任何次幂为0,并且任何数值的0次幂为1.使用循环的方法编写该函数并在一个程序中测试它。
#include <stdio.h>
double power(double n,int p);//计算任何数的幂
int main(void)
{
double x,xpow;
int exp;
printf("输入一个数和一个次幂(输入q退出):");
while(scanf("%lf%d",&x,&exp)==2)//利用scanf函数的返回值确定有无正确读入
{
xpow=power(x,exp);
printf("%.3f的%d次幂是 %.5f\n",x,exp,xpow);
printf("输入一个数和一个次幂(输入q退出):");
}
return 0;
}
//计算任何数的幂
double power(double n,int p)
{
double pow=1;
int i;
if(0==n)//0的0任何次幂等于0
pow=0;
else if(0==p)//任何数的0次幂等于1
pow=1;
else
for(i=1;i<=p;i++)
pow*=n;
return pow;
}
8.使用递归函数重做练习7。
//计算任何数的幂
double power(double n,int p)
{
double pow=1;
int i;
if(0==n)//0的0任何次幂等于0
pow=0;
else if(0==p)//任何数的0次幂等于1
pow=1;
else
pow=n*power(n,p-1);//递归做次幂pow=n*n的p-1次方
return pow;
}
9.为了是程序清单9.8中的函数to_binary()更一般化,可以在新的函数to_base_n()中使用第二个从那参数,且该参数的范围从2到10.然手,这个新函数输出第一个参数在第二个参数规定的进制数下的数值结果。例如,to_base_on(129,8)的输出是201,也就是129的八进制数值。最后在一个完整的程序中对该函数进行测试。
#include <stdio.h>
void to_base_n(int p,int n);//把p改成n进制显示
int main(void)
{
int pp,nn;
printf("请输入一个数和一种进制方式(进制数在2~10)按q退出:");
while(scanf("%d%d",&pp,&nn)==2)
{
if(nn<2||nn>10)//进制超出的话,重复循环
{
printf("请输入一个数和一种进制方式(进制数在2~10)按q退出:");
continue;
}
to_base_n(pp,nn);
putchar('\n');
printf("请输入一个数和一种进制方式(进制数在2~10)按q退出:");
}
printf("good job!\n");
return 0;
}
//把p改成n进制显示
void to_base_n(int p,int n)
{
int r;
r=p%n;//求余
if(p>=n)
to_base_n(p/n,n);//递归继续求余数
putchar('0'+r);//putchar输出字符而不是整型
}
10.编写并测试一个函数Fibonacci(),在该函数中使用循环代替递归完成斐波那契数列的计算。
#include <stdio.h>
int main(void)
{
unsigned int n=16;
Fibonacci(16);
printf("\n");
return 0;
}
int Fibonacci( unsigned int n )//从下往上计算。即通过f(0) + f(1) 得到f(2), 再由f(2) + f(1)得到f(3)....直到计算出f(n)
{
int FibN, FibNOne, FibNTwo;
int i;
int result[2] = { 0, 1 };
if( n < 2 )
return result[n];
FibNOne = 0;
FibNTwo = 1;
FibN = 0;
for( i = 2; i <= n; i++ )
{ /*以第一次循环执行过程为例*/
FibN = FibNOne + FibNTwo; /*f(2) = f(0) + f(1)*/
printf("%5d",FibN);
FibNOne = FibNTwo; /*f(1)*/
FibNTwo = FibN; /*f(2)*/
}
return FibN;
}
<转载请注明出处>