c语言函数

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值