C语言——函数练习

本文介绍了C语言中函数的传值调用与传址调用,通过具体示例讲解了如何交换两个整型变量、判断素数、实现二分查找等。接着探讨了函数递归的概念,包括递归调用的限制条件,举例展示了如何按顺序打印整型数值的每一位、计算阶乘和斐波那契数、字符串反转等递归问题。同时,讨论了递归可能导致的栈溢出问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

提示:

一、传值调用和传址调用

1.写一个函数能够交换两个整型变量的内容

2.写一个函数可以判断一个数是不是素数。

3.写一个函数,实现一个整形有序数组的二分查找。

4.写一个函数,每调用一次这个函数,就会将 num 的值增加1。

二、函数递归

1.接受一个整型值(无符号),按照顺序打印它的每一位。

2.编写函数不允许创建临时变量,求字符串的长度。

3.求n的阶乘(递归和迭代分别实现)。(不考虑溢出)

4.求第n个斐波那契数。(不考虑溢出)

5.编写一个函数 reverse_string(char * string)(递归实现)

6.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

7.编写一个函数实现n的k次方,使用递归实现

结束语!


提示:

1)函数功能尽量单一,高内聚,低耦合

2)先写函数怎么用,需要哪些参数,然后再写函数

一、传值调用和传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。

传值调用:函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。

1.写一个函数能够交换两个整型变量的内容

注:只能用传址调用,如果用传值调用的话不可以,因为形参是实参的一份临时拷贝,对形参的改变不会传递给实参.

void Swap(int* px, int* py)
{
        int z = 0;
        z = *px;
        *px = *py;
        *py = z;
}
int main()
{
        int a = 0, b = 0;
        scanf("%d %d", &a, &b);
        //交换
        printf("%d %d\n", a, b);//交换前
        Swap(&a,&b);
        printf("%d %d\n", a, b);//交换后
}

2.写一个函数可以判断一个数是不是素数。

普通版:
//打印100-200之间的素数
//素数只能被1和它本身整除的数
#include<math.h>
int main()
{
        int i = 0;
        int count = 0;
        //除了2之外偶数不可能是素数,所以直接从奇数上找
        for (i = 101; i <= 200; i+=2)
        {
               //判断i是否为素数
               //是素数就打印
               //拿2~i-1之间的数字去试除i
               int flag = 1;//flag是1,表示是素数
               int j = 0;
               //若i不是素数i=a*b,而且a和b中一定有一个数字是<=sart(i)
               //sqrt是数学库函数(开平方),头文件是#include<math.h>
               for (j = 2; j <= sqrt(i); j++)
               {
                       if (i % j == 0)
                       {
                              flag = 0;
                              break;
                       }
               }
               if (flag == 1)
               {
                       count++;
                       printf("%d ", i);
               }
        }
        printf("\n%d\n", count);
        return 0;
}

函数版:
//写一个函数判断是不是素数
//是素数返回1,不是素数返回0
int is_prime(int x)
{
        int j = 0;
        for (j = 2; j <= sqrt(x); j++)
        {
               if (x % j == 0)
               {
                       return 0;
               }       
        }
        return 1;
}
int main()
{
        int i = 0;
        int count = 0;
        //除了2之外偶数不可能是素数,所以直接从奇数上找
        for (i = 101; i <= 200; i += 2)
        {
               //判断i是否为素数
               //是素数就打印
               //拿2~i-1之间的数字去试除i
               int flag = 1;//flag是1,表示是素数
               if (is_prime(i))
               {
                       count++;
                       printf("%d ", i);
               }
        }
        printf("\n%d\n", count);
        return 0;
}

3.写一个函数,实现一个整形有序数组的二分查找。

binary_search()二分查找函数:

//先写函数怎么用,需要哪些参数,然后再写函数
//数组传参实际上传递的是数组首元素地址
//而不是整个数组
//所以在函数内部计算一个函数参数部分的数组的元素个数是不靠谱的
int binary_search(int arr[], int k, int sz)//数组传参不会创建新的数组,只是把首地址传了过去,形参arr看上去是                                               数组,本质上是指针变量
{
        //int sz = sizeof(arr) / sizeof(arr[0]);//arr是指针变量大小是4or8,所以sz=1,
        int left = 0;
        int right = sz - 1;
        while (left <= right)
        {
               int mid = (right - left) / 2 + left;
               if (k > arr[mid])
               {
                       left = mid + 1;
               }
               else if (k < arr[mid])
               {
                       right = mid - 1;
               }
               else
### C语言函数练习题 #### 函数作为参数传递 编写一个通用的排序函数 `sort`,该函数接受两个额外的参数:一个是数组长度,另一个是比较函数。比较函数用于决定如何排列元素。 ```c #include <stdio.h> // 比较函数模板 int compare_int(const void *a, const void *b); void sort(int array[], size_t length, int (*compare)(const void *, const void *)) { for (size_t i = 0; i < length - 1; ++i) { for (size_t j = 0; j < length - i - 1; ++j) { if ((*compare)((void *)&array[j], (void *)&array[j + 1]) > 0) { // Swap elements int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } } int compare_int(const void *a, const void *b) { return (*(int *)a - *(int *)b); } int main() { int numbers[] = {5, 2, 9, 1, 5, 6}; size_t num_length = sizeof(numbers) / sizeof(numbers[0]); sort(numbers, num_length, compare_int); printf("Sorted list: "); for (size_t i = 0; i < num_length; ++i) printf("%d ", numbers[i]); putchar('\n'); } ``` 此代码展示了如何通过自定义比较器来控制排序逻辑[^1]。 #### 使用静态局部变量计数调用次数 设计一个简单的计算器模拟程序,在每次执行加法操作时记录下已进行了多少次计算,并打印当前累计次数。 ```c #include <stdio.h> void add_and_count(double x, double y) { static unsigned long call_counter = 0UL; call_counter++; printf("Addition result is %.2f. This function has been called %lu times.\n", x + y, call_counter); } int main() { while(1){ char input[80]; fgets(input,sizeof(input),stdin); sscanf(input,"%lf%*c%lf",&x,&y); add_and_count(x,y); } } ``` 这段代码利用了静态局部变量的特点——即使函数返回后仍然保持上次赋给它的值不变[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值