c语言2-函数练习

64 阅读3分钟

1.写一个函数找出两个整数的最大值

2.写一个函数交换两个整形变量的内容

3.写一个函数判断一个数是不是素数

4.写一个函数判断该年是不是闰年

5.写一个函数输入整型值,按照顺序打印它每一位(嵌套函数)

6.写一个函数求字符串长度

7.求n的k次方

8.求n个斐波那契数列

9.冒泡排序


1.1写一个函数找出两个整数的最大值

 #include<stdio.h>
 int MAX(int x,int y)
 {
     int z;
     if(x>y)
     z=x;
     else
     z=y;
     return z;
 }
 ​
 int main()
 {
     int n,m;
     scanf("%d %d",&n,&m);
     int ret=MAX(n,m);
     printf("%d",ret);
     
     return 0;
 }
 //结果:输入1 3 输出3

2.写一个函数交换两个整形变量的内容

 void SWAP(int* pa,int* pb)
 {
     int tmp=*pa;
     *pa=*pb;
     *pb=tmp;
 }
 ​
 int main()
 {
     int n,m;
     scanf("%d %d",&n,&m);
     SWAP(&n,&m);//传址
     printf("%d %d",n,m);
     return 0;
 }
 //结果:输入1 2 输出2 1

3.写一个函数判断一个数是不是素数

 #include<stdio.h>
 int PRIME(int n)
 {
     int i;
     for (i = 2; i < n; i++)
     {
         if (n % i == 0) 
             return 0;
     }
     if (n == 1)
     {
         return 0;
     }
     return 1;
 }
 ​
 int main()
 {
     int num;
     scanf_s("%d", &num);
     if (PRIME(num) == 1)
     {
     printf("是素数");
     }
     else
     {
     printf("不是素数");
     }
     return 0;
 }
 //结果:输入1 输出不是素数,输入2 输出是素数

4.写一个函数判断该年是不是闰年

 #include<stdio.h>
 int JUDGE(int y)
 {
     if (y % 400 == 0)
         return 1;
     else if(y % 4 == 0 && y % 100 != 0)
         return 1;
     return 0;
 }
 ​
 ​
 int main()
 {
     int year;
     scanf_s("%d", &year);
     if (JUDGE(year) == 1)
         printf("是润年");
     else
         printf("不是闰年");
 ​
     return 0;
 }
 //结果:输入1 输出不是闰年,输入400 输出是闰年

5.写一个函数输入整型值,按照顺序打印它每一位(嵌套函数)

 #include<stdio.h>
 void PRINT(int n)
 {
     if (n > 9)
     {
         PRINT(n/10);
     }
     printf("%d ", n%10);
 }
 ​
 int main()
 {
     int num;
     scanf_s("%d",&num);
     PRINT(num);
     return 0;
 }
 //输入12345 输出1 2 3 4 5
 ​
 //将12345用嵌套函数的方式,分成1234,123,12,1,然后分别%10得到末尾的数字
 //最终由函数内部逐层到函数外部分别打印1 2 3 4 5

6.写一个函数求字符串长度

 int STRLEN(char* str)
 {
     int count=0;
     while(*str!='\0')//对指针所指的地址进行解引用。判断是否为\0
     {
             count++;//计算个数
             str++;//让指针指向下一个地址
     }
     return count;
 }
 ​
 int main()
 {
     char ch[] = "hello";//h e l l 0 \0;
     printf("%d", STRLEN(ch));
 ​
     return 0;
 }
 //结果;5

7.求n的k次方

 #include<stdio.h>
 double POW(int x, int y)//。使用浮点数在进行除法时,结果更加精确。
 {
     if (0 == y)
     {
         return 1.0;
     }
     else if (y > 0)
     {
         return x * POW(x, y - 1);
     }
     else//y<0,等于1.0除以POW(POW的倒数)
     {
         return 1.0 / POW(x, -y);//由于y本身是负数,所以需要在前面加个-。
     }
 }
 ​
 ​
 int main()
 {
     int j,k;
     scanf_s("%d %d", &j,&k);
     double ret = POW(j, k);
     printf("%lf", ret);
     
     return 0;
     }
 //结果:输入2 0,输出1.000000;输入2 2,输出4.000000,输入2 -1,输出0.500000 

8.求n个斐波那契数列

 //法一:
 //缺点:使用递归的方式,当n过大时,运行时间久
 #include<stdio.h>
 int FIB(int n)
 {
     if (n > 2)
     {
         return FIB(n-1) + FIB(n-2);
     }
     else if(2==n)
     {
         return 1;
     }
     else
     {
         return 0;         
     }               
 }     
    
 int main()   
 {
     int num;
     scanf_s("%d", &num);
     printf("%d", FIB(num));
 ​
     return 0;
 }
 ​
 //法二:
 #include<stdio.h> 
  int Fib(int n)
 {
     int a = 0;//数列第一个
     int b = 1;//数列第二个
     int c;
     if (1 == n)
         return 0;
     if (2 == n)
         return 1;
     while (n > 2)//循环两个数相加,并不断向右边移动
     {
         c = a + b;//前两个数相加
         a = b;
 //之后抛弃数列第一个,并将剩下的两个值进行下一次的相加
 //(把数列第二个值当成第一个,把相加的值当成第二个)
         b = c;
         n--;//不断接近n的前两个数列
     }
     return c;
 }
 ​
 int main()
 {
     int num = 0;
     scanf_s("%d", &num);
     printf("%d",Fib(num));
     
     return 0;
 }
 ​
 //这个数列的规律是从第3项开始,后面的每一项都是前两项之和。
 //所以需要把第一项和第二项单独拿出来讨论。

9.冒泡排序

#include<stdio.h>
void bubble_sort(int* arr, int sz)
{
	int k;
	for (k = 0; k < sz - 1; k++)//需要sz-1趟冒泡排序
	{
		int j = 0;
		//一趟冒泡排序,结果会把最大的值放在最后,下一次排序时,不需要考虑最后一个值(最大值)
		for (j = 0; j < sz - 1 - k; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	bubble_sort(arr, sz);//arr是传址(指针接收),sz是传值

	for (i = 0; i < sz; i++)//打印
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
//交换前为9 8 7 6 5 4 3 2 1
//交换后为1 2 3 4 5 6 7 8 9