库函数
导例1
问题:输出100以内整数的平方根表,要求每行输出10个。
#include <stdio.h>
#include <math.h>
int main()
{
int i;
float m;
for(i = 1; i <= 100; i++)
{
m = sqrt(i);
printf("%.4f ", m);
if(i % 10 == 0)
{
printf("\n");
}
}
return 0;
}
其中sqrt就是一个库函数
导例2
问题:求1+2^2+3^3+4^4+5^5+…+n^n
#include <stdio.h>
#include <math.h>
int main()
{
int n, i, sum = 0, item;
printf("请输入一个正整数:");
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
item = pow(i, i);
sum = sum + item;
}
printf("%d\n", sum);
return 0;
}
pow函数是一个幂函数,pow(i,n)指得是i的n次方
自定义函数
导例1
问题:输入圆柱体的高和半径,求圆柱体积,volume=π*r^2*h。要求定义和调用函数cylinder (r, h)计算圆柱体的体积。
#include <stdio.h>
int main()
{
double r, h, v;
double cylinder(double r, double h);
printf("请输入圆柱体的高和半径:");
scanf("%lf %lf", &r, &h);
v = cylinder(r, h);
printf("%.2lf\n", v);
return 0;
}
double cylinder(double r, double h)
{
double result;
result = 3.14 * r * r * h;
return result;
}
导例2
问题:从键盘输入1个整数,计算1~n的各个数的阶乘的累加和,即1+2!+3!+…+n!。
#include <stdio.h>
int main()
{
double fact(int m);
double sum = 0;
int i, n;
printf("输入一个正整数:");
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
sum = sum + fact(i);
}
printf("%.0f\n", sum);
return 0;
}
double fact(int m)
{
int i;
double fact = 1;
for(i = 1; i <= m; i++)
{
fact = fact * i;
}
return fact;
}
要使用double防止结果过大导致溢出
导例3
问题:表示从m个元素中抽取n个元素的排列数。
#include <stdio.h>
//主函数
int main()
{
double A(int x, int y);
int m, n;
printf("请输入两个正整数:");
scanf("%d %d", &n, &m);
printf("%.0lf\n", A(n, m));
return 0;
}
//计算阶乘的函数
double factorial(int m)
{
int i;
double fact = 1;
for(i = 1; i <= m; i++)
{
fact = fact * i;
}
return fact;
}
//计算排列数的函数
double A(int x, int y)
{
double factorial(int m);
double result;
result = factorial(y) / factorial(y - x);
return result;
}
导例4
问题:输入1个正整数n,计算 1 + 1/2! +....+ 1/n! 的前n项的和(保留4位小数)。
#include <stdio.h>
//主函数
int main()
{
double factorial(int m);
int i, n;
double sum = 0;
printf("请输入一个正整数:");
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
sum = sum + 1.0000 / factorial(i);
}
printf("%.4lf\n", sum);
return 0;
}
//计算的阶乘的函数
double factorial(int m)
{
int i;
double fact = 1;
for(i = 1; i <= m; i++)
{
fact = fact * i;
}
return fact;
}
练习
问题:求a+aa+aaa+aa…a(n个a)。题目要求:输入2个正整数a和n, 求a+aa+aaa+aa…a(n个a)之和。要求定义并调用函数fn(a,n),它的功能是返回aa…a(n个a)。例如,fn(3,2)的返回值是33。
#include <stdio.h>
//主函数
int main()
{
int fn(int a, int n);
int a, n, i, sum = 0;
printf("请输入两个正整数:");
scanf("%d %d", &a, &n);
for(i = 1; i <= n; i++)
{
sum = sum + fn(a, i);
}
printf("%d\n", sum);
return 0;
}
//定义aaaa函数
int fn(int a, int n)
{
int result = 0, i, item = a;
for(i = 0; i < n; i++)
{
result = result + item;
item = item * 10;
}
return result;
}
注意计算aaaa型函数的方法
函数的参数传递与返回值
有参数有返回值
导例1
问题:判断素数
#include <stdio.h>
#include <math.h>
int prime(int m);
int main()
{
int m, count = 0;
for(m = 2; m <= 100; m++)
{
if(prime(m) != 0)
{
printf("%6d", m);
count++;
}
if(count % 10 == 0)
{
printf("\n");
}
}
printf("\n");
return 0;
}
int prime(int m)
{
int i, n, result;
if(m == 1)
{
return 0;
}
if(m == 2)
{
return 1;
}
n = sqrt(m);
for(i = 2; i <= n; i++)
{
if(m % i == 0)
{
return 0;
}
}
return 1;
}
练习1
问题:判断一个区间内有多少个可逆素数
#include <stdio.h>
#include <math.h>
//主函数
int main()
{
int prime(int m);
int anti(int a);
int m, i, x, y, count = 0;
printf("请输入两个整数:");
scanf("%d %d", &x, &y);
for(i = x; i <= y; i++)
{
if(prime(i) != 0 )
{
if(prime(anti(i)) != 0)
{
count++;
}
}
}
printf("%d\n", count);
}
//判断素数的函数
int prime(int m)
{
int i, n, result;
if(m == 1)
{
return 0;
}
if(m == 2)
{
return 1;
}
n = sqrt(m);
for(i = 2; i <= n; i++)
{
if(m % i == 0)
{
return 0;
}
}
return 1;
}
//一个数的反序数
int anti(int a)
{
int result = 0, r;
while(a != 0)
{
result = result * 10 + a % 10;
a = a / 10;
}
return result;
}
注意判断一个数的反序数的方法,利用while函数进行递归
有参数无返回值
导例1
问题:数字金字塔
#include <stdio.h>
int main()
{
void pyramid(int n);
pyramid(5);
return 0;
}
void pyramid(int n)
{
int i, j;
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n - i; j++)
{
printf(" ");
}
for(j = 1; j <= i; j++)
{
printf("%d ", i);
}
printf("\n");
}
}