• 1. 函数www.mingribook.com
  • 2. 计算任意两个整数的积 要求从键盘上任意输入两个数,计算这两个数的乘积,并将其结果输出。#include int mul(int x,int y) /*自定义求积函数*/ { int z; z=x*y; return z; /*将所求的积返回*/ } main() { int a,b,c; printf("请输入a和b:\n"); scanf("%d,%d",&a,&b); c=mul(a,b); /*调用mul函数*/ printf("a和b的乘积是:%d\n",c); }
  • 3. 计算任意两个数的积 本程序中mul函数就是用户自定义函数,它所要实现的功能就是计算出两数的相乘的结果。mul函数同时也是有参函数,在主调函数main和被调用函数mul之间传递数据a和b,使之完成两个整数乘积的操作。
  • 4. 求最大公约数与最小公倍数 本例要求设计两个函数,分别计算两个整数的最大公约数和最小公倍数。并在主函数中将结果输出。(范例位置:光盘\TM\fl\6\2) #include int hf(int u,int v) { int t,r; /*声明两个变量*/ if(v>u) /*判断两个数大小*/ {t=u;u=v;v=t;} /*使u大于v*/ while((r=u%v)!=0) /*求最大公约数*/ { u=v; v=r; } return(v); /*返回最大公约数*/ } int ld(int u,int v, int h) { return(u*v/h); /*求最小公倍数*/ }
  • 5. 求最大公约数与最小公倍数 main() { int u, v, h, l; /*声明变量*/ printf("请输入两个整数:\n"); /*输出字符串*/ scanf("%d%d",&u,&v); /*输入两个整数*/ h=hf(u,v); /*调用求最大公约数的自定义函数*/ l=ld(u,v,h); /*调用求最小公倍数的自定义函数*/ printf("最大公约数为: %d\n",h); /*输出最大公约数*/ printf("最小公倍数为: %d\n",l); /*输出最小公倍数*/ } 本例要求计算两个数的最大公约数和最小公倍数,在计算最大公约数时,采用的是辗转相除的方法。最小公倍数和最大公约数之间的关系是:两数相乘的积除以这两个数的最大公约数就是最小公倍数。知道这层关系后用辗转相除法求出最大公约数,那么最小公倍数便随之算出。
  • 6. 求任意两个数的平均数 自定义一个函数,要求计算两个整数的平均数。 #include int ave(int a,int b) /*自定义求平均值函数*/ { int c; c=(a+b)/2; return c; /*将所求平均值返回*/ } main() { int x,y,z; printf("请输入x和y:\n"); scanf("%d,%d",&x,&y); /*输入两个整数赋给x和y*/ z=ave(x,y); /*调用ave函数*/ printf("这两个数的平均数是:%d\n",z); }
  • 7. 求任意两个数的平均数本实例非常简单,首先自定义了一个函数用于求两个整数的平均数,此处是在调用自定义函数之前对函数进行定义的,故不需要声明,然后在主函数中调用求出平均数并输出。通过本例可以发现函数的返回值可以赋值,也可以不使用。
  • 8. 判断素数 编写一个判断素数的函数,实现输入一个整数,使用判断素数的函数进行判断,然后输出是否是素数的信息。#include /*引用头文件*/ int isprime(int num) /*自定义判断素数的函数*/ { int flag=1,i; /*定义变量*/ if (num <= 1) /*小于1的数不是素数*/ return 0; if (num == 2) /*2是素数*/ return 1; for(i=2;i
  • 9. 判断素数 void main() { int n; /*声明变量*/ printf("请输入想要判断整数:\n"); /*在屏幕上输出提示字符串*/ scanf("%d",&n); /*接收一个输入的数*/ if(isprime(n)) /*调用自定义函数*/ printf("%d是素数\n", n); /*输出结果*/ else printf("%d不是素数\n", n); }
  • 10. 判断素数 本例要求判断素数,其设计思路如下:函数有一个参数,为整型的num,函数的返回值表示n的判断结果,有两种情况(1或者0),1表示num为素数,0表示num不是素数,故返回值类型为整型。函数体通过循环判断是否存在能被num整除的数据,若存在,返回0,若不存在返回1。返回值由return语句带回到main()函数中。  注意:如果程序没有返回值,可以利用return语句来结束函数的调用流程。
  • 11. 求字符串中字符个数 输入一个字符串,要求使用函数调用的方法计算出该字符串共含有多少个字符。#include main() { int len; /*定义len为基本整型变量*/ char *str[100]; /*定义字符型指针数组str*/ printf("请输入字符串:\n"); gets(str); /*gets函数将输入的字符串放入数组str中*/ len=length(str); /*调用length函数*/ printf("这个字符串有%d个字符.\n",len); /*将结果输出*/ } int length(char *p) /*自定义函数length*/ { int n=0; /*定义变量n为基本整型*/ while(*p!='\0') /*当指针未指到字符串结束标志时执行循环体语句*/ { n++; /*长度加1*/ p++; /*指针向后移*/ } return n; /*返回最终长度*/ }
  • 12. 求字符串中字符个数本例自定义一个函数length,用于统计字符串中字符的个数,最终将统计的个数n返回。在编写主函数时,定义数组了str,使用gets函数获得字符串,以数组str作为函数的实参调用函数length,最终将得到的长度值输出。
  • 13. 求学生的平均身高 从键盘上输入学生人数,并逐个输入学生的身高,计算其身高的平均值并输出显示。 float average(float array[],int n) /*自定义求平均身高函数*/ { int i; float aver,sum=0; for(i=0;i
  • 14. 求学生的平均身高本实例主要采用了数组名做函数参数,有以下几点需要说明一下: (1)用数组名作参数,应该在主调函数和被调用函数中分别定义数组,像本例中主调函数定义的数组为height,被调用函数定义的数组为array。 (2)实参数组与形参数组类型应一致,本实例中都为float。 (3)形参数组也可以不指定大小,在定义数组时在数组名后面跟一个空的方括弧。本实例就没有指定形参数组的大小。 (4)用数组名作函数实参时,不是把数组元素的值传递给形参,而是把实参数组的起始地址传递给形参数组。
  • 15. 分数计算器 本实例是想要实现分数计算器程序,分别能够实现加、减、乘、除四种运算。 #include /*引用头文件*/ int gys(int x,int y) /*定义求最大公约数函数*/ { return y?gys(y,x%y):x; /*递归调用gys,利用条件语句返回最大公约数*/ } int gbs(int x,int y) /*定义求最小公倍数函数*/ { return x/gys(x,y)*y; } void yuefen(int fz,int fm) /*定义约分函数*/ { int s=gys(fz,fm); fz/=s; fm/=s; printf("其运算结果为:%d/%d\n",fz,fm); }
  • 16. 分数计算器void add(int a,int b,int c,int d) /*定义加法函数*/ { int u1,u2,v=gbs(b,d),fz1,fm1; u1=v/b*a; u2=v/d*c; fz1=u1+u2; fm1=v; yuefen(fz1,fm1); } void mul(int a,int b,int c,int d) /*定义乘法函数*/ { int u1,u2; u1=a*c; u2=b*d; yuefen(u1,u2); } void sub(int a,int b,int c,int d) /*定义减法函数*/ { int u1,u2,v=gbs(b,d),fz1,fm1; u1=v/b*a; u2=v/d*c; fz1=u1-u2; fm1=v; yuefen(fz1,fm1); }
  • 17. 分数计算器void div(int a,int b,int c,int d) /*定义除法函数*/ { int u1,u2; u1=a*d; u2=b*c; yuefen(u1,u2); } void main() { char op; int a,b,c,d; printf("请输入想要参加运算的表达式:\n"); scanf("%ld,%ld,%c,%ld,%ld",&a,&b,&op,&c,&d); switch(op) /*根据输入的符号选择不同函数的调用*/ { case '+':add(a,b,c,d);break; /*调用加法函数*/ case '*':mul(a,b,c,d);break; /*调用乘法函数*/ case '-':sub(a,b,c,d);break; /*调用减法函数*/ case '/':div(a,b,c,d);break; /*调用除法函数*/ } }
  • 18. 分数计算器在实际应用中有很多时候我们希望计算机给出的结果是分数而不是小数,本程序就是在这个前提下产生的,具体要求如下:如果用户输入形式是3,5,*,2,6则代表3/5*2/6,要求运算结果以分数形式体现。
  • 19. 递归解分鱼问题 A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。第二天,A第一个醒来,他将鱼分成五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条扔掉,拿走自己的一份,C、D、E依次醒来,也按同样的方法拿鱼。问他们合伙至少捕了多少条鱼? #include int sub(int n) /*定义函数递归求鱼的总数*/ { if (n == 1) /*当n等于1时递归结束*/ { static int i = 0; do { i++; } while (i % 5 != 0); return (i + 1); /*5人平分后多出一条*/ } else { int t; do { t = sub(n - 1); } while (t % 4 != 0); return (t / 4 * 5+1); } }
  • 20. 递归解分鱼问题 main() { int total; total=sub(5); /*调用递归函数*/ printf("The total number of fish is %d\n",total); return 0; } 根据题意假设鱼的总数是x,那么第一次每人分到的鱼的数量可用(x-1)/5表示,余下的鱼数为4*(x-1)/5,将余下的数量重新赋值给x,依然调用(x-1)/5,如果连续五次x-1后均能被5整除,则说明最初的x值便是本题目的解。  注意:本实例采用了递归的方法来求解鱼的总数,这里有一点需要强调,用递归求解时一定要注意要有递归结束的条件。本实例中n=1时便是递归程序的出口。
  • 21. 最大值与最小值对调 从键盘中输入一组数据,找出这组数据中最大数与最小数,将最大数与最小数位置互换,将互换后的这组数据再次输出。 #include int min=10000,max=0; void change(int a[],int n) { int i,j,k; for (i = 0; i < n; i++) /*找出数组中最小的数*/ if (a[i] < min) { min = a[i]; j = i; /*将最小数所存储的位置赋给j*/ } for (i = 0; i < n; i++) /*找出这组数据中的最大数*/ if (a[i] > max) { max = a[i]; k = i; /*将最大数说存储的位置赋给k*/ } a[k] = min; /*在最大数位置存放最小数*/ a[j] = max; /*在最小数位置存放最大数*/ printf("\nthe position of min is:%3d\n", j);
  • 22. 最大值与最小值对调printf("the position of max is:%3d\n", k); /*输出原数组中最大数所在的位置*/ printf("Now the array is:\n"); for (i = 0; i < n; i++) printf("%5d", a[i]); } main() { int a[20], i, n; /*定义数组及变量数据类型为基本整型*/ printf("please input the nunber of elements:\n"); scanf("%d", &n); /*输入要输入的元素个数*/ printf("please input the element:\n"); for (i = 0; i < n; i++) /*输入数据*/ scanf("%d", &a[i]); change(a,n); printf("\nmax=%5d\nmin=%5d",max,min); }
  • 23. 最大值与最小值对调本例的主要思路如下: 首先是要确定最大数与最小数的具体位置,用min和数组中其它元素比较,有比min小的,则将这个较小的值赋给min,同时将其所在位置赋给j,当和数组中元素均比较一次后,此时j中存放的就是数组中最小元素所在的位置。最大元素位置的确定同最小元素。当确定具体位置后将这两个元素位置互换,最后将互换后的数组以及最值输出。 说明:在本例中max、min是全局变量,所以在函数change和main中都可以引用,在main函数中调用max和min输出的结果与在change函数中max和min的值是一致的。
  • 24. 使用register定义局部变量 本例实现的是求1-100之间的素数,并以每6个数一行进行输出显示。#include int prime (int n) /*定义函数prime*/ { register int m; /*定义寄存器变量m*/ for (m=2;m
  • 25. 使用register定义局部变量 本实例中,定义的循环变量要对1-100之间的数据进行多次访问,因此可以设置为寄存器类型的变量,变量在程序运行中使用非常频繁,则存取该变量要消耗的时间就会很多,为了提高执行效率,C语言允许将局部变量的值存放在CPU中的寄存器中,寄存器变量占用CPU的高速寄存器,不占用内存单元。 说明:如果某个变量被频繁访问,如执行循环或者函数调用等,可以将其定义为寄存器变量。
  • 26. 小数分离 利用数学函数实现以下功能:从键盘中输入一个小数,将其分解成整数部分和小数部分并将其显示在屏幕上。#include #include main() { float number; double f, i; printf("input the number:"); scanf("%f", &number); /*输入要分解的小数*/ f = modf(number, &i); /*调用modf函数进行分离*/ printf("%f=%f+%f", number, i, f); /*将分离后的结果按指定格式输出*/ getch(); return 0; }
  • 27. 小数分离 本程序中用到了modf()函数,具体使用说明如下: double modf(double num,double *i) 该函数的作用是把num分解成整数部分和小数部分,该函数的返回值为小数部分,把分解出的整数部分存放到由i所指的变量中。该函数的原型在math.h中。
  • 28. 求任意数n次幂 利用数学函数实现以下功能:分别从键盘中输入底数及次幂,求出从该次幂开始的连续五个结果,要求每次次幂数加1。(范例位置:光盘\TM\fl\6\12) #include #include main() { float x, n; int i; printf("Please input the base:\n"); scanf("%f", &x); /*输入底数x*/ printf("Please input the power:\n"); scanf("%f", &n); /*输入次幂数*/ for (i = 1; i <= 5; i++) { printf("%.1f^%.1f is %.3f\n", x, n, pow(x, n)); /*将求出的结果输出*/ n += 1; } getch(); }
  • 29. 求任意数n次幂本程序中用到了pow()函数,具体使用说明如下: double pow(double base,double exp) pow()函数的作用是计算以参数base为底的exp次幂baseexp。pow()函数的原型在math.h中。  注意:如果参数base为零,或者exp小于零,则会出现定义域错误。如果参数base上溢,则会出现数出界错误。
  • 30. 某日是该年的第几天 本实例要求编写一个计算天数的程序,即从键盘中输入年、月、日,在屏幕中输出此日期是该年的第几天。(范例位置:光盘\TM\fl\6\13) #include int leap(int a) /*自定义函数leap用来指定年份是否为闰年*/ { if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0) /*闰年判定条件*/ return 1; /*是闰年返回1*/ else return 0; /*不是闰年返回0*/ } int number(int year, int m, int d) /*自定义函数number计算输入日期为该年第几天*/ { int sum = 0, i, j, k, a[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /*数组a存放平年每月的天数*/ int b[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /*数组b存放闰年每月的天数*/
  • 31. 某日是该年的第几天 if (leap(year) == 1) /*判断是否为闰年*/ for (i = 0; i < m - 1; i++) sum += b[i]; /*是闰年,累加数组b前m-1个月份天数*/ else for (i = 0; i < m - 1; i++) sum += a[i]; /*不是闰年,累加数组a钱m-1个月份天数*/ sum += d; /*将前面累加的结果加上日期,求出总天数*/ return sum; /*将计算的天数返回*/ } void main() { int year, month, day, n; /*定义变量为基本整型*/ printf("请输入年月日\n"); scanf("%d%d%d", &year, &month, &day); /*输入年月日*/ n = number(year, month, day); /*调用函数number*/ printf("第%d天\n", n); }
  • 32. 某日是该年的第几天 要实现本实例要求的功能主要有以下两个技术要点: 1.判断输入的年份是否是闰年,这里我们自定义函数leap来进行判断。该函数的核心内容就是闰年的判断条件即能被4整除但不能被100整除,或能被400整除。 2.如何求此日期是该年的第几天。这里将12个月每月的天数存到数组中,因为闰年2月份的天数有别于平年,故采用两个数组a和b分别存储。当输入年份是平年,月份为m的时就累加存储着平年每月天数的数组的前m-1个元素,将累加的结果加上输入的日便求出了最终结果,闰年的算法类似。
  • 33. 递归解决年龄问题 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第1个人大两岁。最后问第1个人,他说是10岁。编写程序当输入第几个人时求出其对应年龄。#include int age(int n) /*自定义函数age*/ { int f; if(n==1) f=10; /*当n等于1时,f等于10*/ else f=age(n-1)+2; /*递归调用age函数*/ return f; /*将f值返回*/ } main() { int i,j; /*定义变量i,j为基本整型*/ printf("你想知道第几个人的你年龄,请输入:\n"); scanf("%d",&i); /*输入i的值*/ j=age(i); /*调用函数age求年龄*/ printf("他的年龄是%d岁\n",j); /*将求出的年龄输出*/ }
  • 34. 递归解决年龄问题 要实现本实例要求的功能主要有以下两个技术要点: 本实例中age函数被递归调用,这里详细分析下递归调用的过程,递归的过程分为两个阶段: 第一阶段是“回推”,由题可知,要想求第5个人的年龄必须知道第4个人的年龄,要想知道第4个人的年龄必须知道第3个人的年龄……直到第1个人的年龄,这时age(1)的年龄已知,就不用再推。“回推”的过程可以用图
  • 35. 递归解决年龄问题 本实例中age函数被递归调用,这里详细分析下递归调用的过程,递归的过程分为两个阶段: 第一阶段是“回推”,由题可知,要想求第5个人的年龄必须知道第4个人的年龄,要想知道第4个人的年龄必须知道第3个人的年龄……直到第1个人的年龄,这时age(1)的年龄已知,就不用再推。“回推”的过程可以用图
  • 36. 递归解决年龄问题 第二阶段是“递推”,从第2个人推出第3个人的年龄……一直推到第5个人的年龄为止。这里要注意必须要有一个结束递归过程的条件,本实例中就是当n=1时f=10也就是age(1)=10,否则递归过程会无限制进行下去。总之递归就是在调用一个函数的过程中又出现直接或间接第调用该函数本身。因此“回推”可以看成是个“下楼梯”的过程而“递推”则是个“上楼梯”的过程,将这两个结合起来就是递归。
  • 37. 一数三平方 有这样一个六位数,它本身是一个整数的平方,其高三位和低三位也分别是一个整数的平方,例如225625=4752,225=152,625=252,求满足上述条件的所有六位数。(范例位置:光盘\TM\fl\6\15) #include #include main() { long i, n, n1, n2, n3, n4, count = 0; /*定义变量为长整形*/ printf("The result is:\n"); for (i = 100000; i <= 999999; i++) /*遍历所有的六位数*/ { n = (long)sqrt(i); /*对i值开平方得到一个长整型数值n*/ if (i == n *n) /*判断n的平方是否等于i*/ { n1 = i / 1000; /*求出高三位数*/ n2 = i % 1000; /*求出低三位数*/ n3 = (long)sqrt(n1); /*对n1值开平方得到一个长整型数值n3*/ n4 = (long)sqrt(n2); /*对n2值开平方得到一个长整型数值n4*/
  • 38. 一数三平方 if (n1 == n3 *n3 && n2 == n4 *n4) /*判断是否同时满足n1等于n3的平方,n2等于n4的平方*/ { count++; /*count作为计数器,记录满足条件的个数*/ printf("%ld,", i); } /*将最终满足条件的i值输出*/ } } printf("\nTotal is :%d\n", count); /*输出满足条件的个数*/ }要实现本题目中的要求有许多方法,本实例也只是其中的一种,下面来介绍下具体的求解思路:程序中用到了sqrt函数,该函数的一般形式如下: double sqrt(double num); 函数的作用是返回参数num的平方根,这里我们可以发现sqrt的返回值是一个double型,程序中我们将sqrt的返回值强制转换成长整形,这样会使开平方后得到的小数(小数点后不为0)失去其小数点后面的部分,那么再对这个强制转换后的数再平方所得的结果将不会等于原来开平方前的数。若开平方后得到的小数其小数点后的部分为0则将其强制转换为长整型也不会产生数据流失,那么再对这个强制转换后的数再平方所得的结果就将等于原来开平方前的数。我们利用这个方法就能很好的判断出一个数开平方后得到的数是否是整数。
  • 39. 一数三平方
  • 40. Thank youwww.mingribook.com