#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
/*一个求最大值的子函数
* int max(int x,int y) 定义函数名,输入参数,输出参数,返回值
* {
* int m;
* if(x>y)
* m=x;
* else
* m=y;
* return m;//返回结果
}
*/
/*
int add(int a, int b)//a和b 都是形式参数
{
return a + b;
}
int main()
{
int n, a = 1, b = 2, c, d;
c = 1, d = 2;
n = add(c, d);//c,d是实际参数
n = add(a, b);//a,b是实际参数
printf("a=%d,b=%d,c=%d,d=%d,n=%d", a, b, c, d, n);
return 0;
}*/
//如果调用函数在main函数之前,那么就无需声明
/*float Square(float m);//声明函数
float GetBevel(float a, float b)
{
return sqrt(Square(a) + Square(b));//求两个直角边长度对应的斜边长度,sqrt函数是开根号,这里先用Square函数让3和4变成9和16再开根号
}
int main()
{
printf("%f\n", Square(1.5));
printf("%f\n", GetBevel(3, 4));//函数可以在不同的地方调用
}
float Square(float m)
{
return m * m;//返回一个浮点数的平方
}*/
/*
int max(int, int); //声明函数
int main()
{
int i1, i2;
int imax;
scanf("%d,%d",&i1,&i2);
imax = max(i1,i2);
printf("max=%d\n", imax);
return 0;
}
int max(int x, int y)
{
int m;
if (x > y)
m = x;
else
m = y;
return m;
}*/
/*函数嵌套调用
void fun1();
void fun2();
void fun3();
int main()
{
printf("我是在主函数中\n");
fun1(); //调用函数fun1
printf("我最后返回到主函数中");
}
void fun1()
{
printf("我是在第一层fun1函数中\n");
fun2(); //在fun1函数中调用fun2函数
printf("我返回到了fun1函数中\n");
}
void fun2()
{
printf("我现在fun2函数中\n");
fun3();//在fun2函数中调用fun3函数
printf("我现在返回到fun2函数中\n");
}
void fun3()
{
printf("我现在在fun3函数中\n");
}
*/
/*函数也可以调用自己本身
有5个小树在一起
问第5个小树多少岁?他说比第4个小树大2岁。
问第4个小树多少岁?他说比第3个小树大2岁。
问第3个小树多少岁?他说比第2个小树大2岁。
问第2个小树多少岁?他说比第1个小树大2岁。
问第1个小树多少岁?他说是10岁。
age(5)= age(4)+2 age(5)=18
age(4)=age(3)+2 age(4)=16
age(3)=age(2)+2 age(3)=14
age(2)=age(1)+2 age(2)=12
age(1)=10
回溯阶段 递推阶段
公式 age(n)=age(n-1)+2 (n>1)
age(1)=10 (n=1)
int age(int n)
{
int NL;//年龄
if (n == 1)
NL = 10; //如果是递推到第一个小树就是10岁
else
NL = age(n - 1) + 2;//如果递推到其他小树就套公式
return NL;
}
int main()
{
int n;
scanf_s("%d", &n);
int iAge;
iAge = age(n);
printf("NO.%dage:%d\n", n, iAge);
}
*/
/*用递归方法求求n!
n! 1,n=0,1;
n*(n-1)!;
*/
/*
float fac(int n)//fac为阶乘的英文factorial
{
float f;
if (n < 0)
printf("n<0 data error!!!");
else if (n == 0 || n == 1)
f = 1;
else
f = fac(n - 1) * n;
return f;
}
int main()
{
int n;
float y;
printf("please input an inter number:");
scanf("%d", &n);
y = fac(n);
printf("%d!=%10.0f\n", n, y);
return 0;
}*/
/*
数组作为函数的参数
判别一个整数数组中各元素的值,若大于0,则输出该值。若小于等于0,则输出0值。
*/
/*
void nzp(int v)//形参为整形变量
{
if (v > 0)
printf("%d", v);
else
printf("%d", 0);
}
int main()
{
int arr[5];
int i;
printf("input 5 numbers\n");
for (i = 0; i < 5; i++)
{
scanf("%d", arr[i]);
nzp(arr[i]);
}
printf("\n");
return 0;
}
*/
/*数组小知识
int main()
{
int arr[5];
int i;
printf("input 5 numbers\n");
for (i = 0; i < 5; i++)
{
scanf("%d",arr+i); //这样写可以不用&
}
for (i = 0; i < 5; i++)
{
printf("%d", arr[i]);
}
}
*/
/* 数组函数 输入5个数据并且输出平均值
float aver(float a[5])
{
int i;
float fAver, s = a[0];
for (i = 1; i < 5; i++)
s = s + a[i];
fAver = s / 5;
return fAver;
}
int main()
{
float b[5], av;
int i;
printf("输入5门成绩:\n");
for (i = 0; i < 5; i++)
scanf("%f", &b[i]);
av = aver(b);//函数调用
printf("average score is%5.2f\n", av);
return 0;
}*/
/*自动变量,在函数内定义的局部变量默认是自动的,被分配在内存的动态存储区中。
这里for循环2次 第一次系统为m和n动态分配内纯空间,到后面收回为m和n动态分配的内存空间。for循环两次,则系统两次为m和n分配存储
空间,并两次回收存储空间。因此,m和n的值并没有累加,均从初值0开始
int main()
{
int x = 5, y = 10;
for (int k = 1; k <= 2; k++)
{
auto m = 0, n = 0;//"auto”不能与任何其他类型说明符组合,因为新版C++定义auto不能和任何类型进行组合,
//直接写作auto b=2,就表示把b自动转换成整型
m = m + 1;
n = n + x + y;
printf("m=%d,n=%d", m, n);//输出m=1,n=1,m=1,n=15
}
return 0;
}
*/
/*寄存器变量,用寄存器类型关键词register说明的变量为寄存器变量,属于动态局部变量
register int a,b=3;*/
/*外部变量 用外部类型关键词extern说明的全局变量是外部变量
int max(int x, int y);//函数声明
extern int a = 6, b = 5;//说明外部变量a和b
int main()
{
int c;
c = max(a, b);//在主函数中使用外部变量a和b
printf("max=%d\n", c);
return 0;
}
int max(int x, int y)
{
printf("a=%d,b=%d", a, b);//在max()函数中使用外部变量a和b
return x > y ? x : y;
}//输出a=6,b=5 max=6
*/
/*静态变量用关键词static说明
static 变量在内存的静态存储区占用固定的内存单元,即使它所在的函数调用结束,也不释放存储单元,他所在单元的值会继续保留,即static
变量不会重新分配内存及初始化
void f(int x, int y);//函数声明
int main()
{
int i = 5, j = 10, k;
for (k = 1; k <= 3; k++)
f(i, j);//调用函数
return 0;
}
void f(int x, int y)
{
auto m = 0;//定义自动变量m 和Int m=0的效果一样
static int n = 0;//定义静态变量n
m = m + x + y;//使用自动变量m求和
n = n + x + y;//使用静态变量n求和
printf("m=%d,n=%d", m, n);//输出m=15 n=15;m=15,n=30;m=15,n=45;
}
*/
/*宏定义 带参数的宏定义会进行参数替换如果在程序执行时输入3.0,赋值语句s=S(r)会被替换为s=3.1415926*3.0*3.0
#define PI 3.1415926
#define S(a) PI*a*a
void main()
{
float s, r;
printf("Please intput a radius:");
scanf("%f", &r);
s = S(r);
printf("s=%f;r=%f\n", s, r);
}*/
/*宏定义的注意点
#define PI 3.1415926
#define S(a) PI*a*a
void main()
{
float s,r1,r2;
printf("Please intput a radius:");
scanf("%f%f", &r1,&r2);
s = S(r1+r2);//执行程序会变成3.1415926*r1+(r2*r1)+r2 所以我们在宏定义的时候需要变成PI*(a)*(a)
printf("s=%f;r=%fr=%f\n", s, r1,r2);
}*/
//
long f1(int n, int k)
{
long h=1;//用来存储n^k
int i;
for (i = 1; i <=k; i++)
h *= n;//在k的范围呢 n一直相乘就是n^k
return h;
}
long f2(int n, int k)
{
long sum = 0;
int i;
for (i = 1; i <=n; i++)
sum += f1(i, k);
return sum;
}
int main()
{
int n, k;
int sum;
printf("请输入n和k:\n");
scanf("%d%d", &n, &k);
printf("你输入的n和k是%d和%d\n", n, k);
sum = f2(n, k);
printf("和是%d\n", sum);
return 0;
}