函数和数组习题
创始人
2024-04-27 23:42:31
0

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C语言基础习题】
在这里插入图片描述

文章目录

  • 知识点
  • 习题
    • 2.实现一个整型数组的冒泡排序(编程体)。
    • 3.编程题:创建一个整型数组,完成对数组的操作
    • 4.编程题:将数组A的内容和数组B中的内容进行交换(数组一样大)。
    • 5.下列程序的运行结果是什么?
    • 6.编写一个函数实现n的k次方(使用递归实现)
    • 8.写一个递归函数Digitsum(n),输入一个非负整数,返回组成它的数字之和。
    • 9.编写一个函数reverse_string(char * string),用递归实现。
    • 10.写一个函数返回参数二进制中1的个数
      • 法一:
      • 法二:
      • 法三(推荐):
    • 11.求二进制位中不同位的个数
    • 12.打印二进制中的奇数和偶数位。
    • 13.交换两个变量(不创建临时变量)
    • 14.函数判断素数
    • 15.乘法口诀表

知识点

1.函数可以传值调用,传值调用的时候形参是实参的一份临时拷贝。
2.函数可以传址调用,传址调用的时候,可以通过形参操作实参。
3.函数可以嵌套调用,但是不可以嵌套定义。
4.形参和实参可以同名。
5.函数定义是说明函数是怎么实现的。
6.形参在函数调用的时候才实例化,才开辟内存空间。
7.函数调用如果采用传值调用,改变形参不影响实参。
8.函数设计应追求高内聚低耦合(即模块化)。是衡量程序的模块之间独立性的标准。要保证模块(函数,方法)内部高内聚,之间低耦合。比如一个程序有50个函数,这个程序执行得非常好;然而一旦你修改其中一个函数,其他49个函数都需要仍然可以不需要修改,这就说明程序的函数之间保持了较好的独立性,即:低耦合。同时各个模块的变量也是和自己模块保持着紧密的联系。说明也是高内聚的。可以这样理解,一个企业的管理, 最理想的情况就是各个部门各司其职,井然有序,互不干涉, 但是需要沟通交流的时候呢, 各个部门都可以找到接口人专门负责部门沟通以及对外沟通。
9.要尽量少的使用全局变量。(因为全局变量在整个工程中哪里、到处都可以使用,这个地方可以改,那个地方也可以改,此时就乱套了。少的去使用全局变量不至于让代码失控。)
10.函数的参数不易过多。
11.设计函数时,尽量做到谁申请的资源就由谁来释放。
12.库函数的使用必须包含对应的头文件。
13.在不同的函数中可以使用相同名字的变量。
14.函数中的形式参数是在栈中保存的。
15.在一个函数内定义的变量只能在本函数范围内有效。
16.在一个函数内复合语句中定义的变量在本函数范围内无效。

习题

1.函数调用fun((v1,v2),(v3,v4),v5,v6)中,实参的个数是4。(逗号表达式算一个)。

2.实现一个整型数组的冒泡排序(编程体)。

//冒泡排序
void bubble_sort(int arr[], int sz)
{int i = 0;for (i = 0; i < sz - 1; i++){int j = 0;for (j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int tmp = 0;tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
#include
int main()
{int arr[] = { 4,5,6,3,7,2,8,1,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);//进行排序bubble_sort(arr, sz);//打印数据int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

3.编程题:创建一个整型数组,完成对数组的操作

1.实现函数Init()初始化为全0。
2.实现Print()打印数组的每一个元素
3.实现reverse()函数完成数组元素的逆置。

#include
void Init(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){arr[i] = 0;}
}
void Reverse(int arr[], int sz)
{int left = 0;int right = sz - 1;while (left < right){int tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}
}
void Print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);//Init(arr, sz);//把数组初始化为0Print(arr, sz);//打印Reverse(arr,sz);//实现数组逆置Print(arr, sz);//打印return 0;
}

4.编程题:将数组A的内容和数组B中的内容进行交换(数组一样大)。

//交换数组
//通过创建临时变量的方式
#include
int main()
{int arr1[5] = { 1,2,3,4,5 };int arr2[5] = { 6,7,8,9,10 };int tmp = 0;int sz = sizeof(arr1) / sizeof(arr1[0]);int i = 0;for (i = 0; i < sz; i++){tmp = arr1[i];arr1[i] = arr2[i];arr2[i] = tmp;}return 0;
}

在这里插入图片描述

5.下列程序的运行结果是什么?

#include
int i;//全局变量-不初始化-默认是0
int main()
{i--;if (i > sizeof(i))//sizeof()-计算变量/类型所占内存的大小{printf(">\n");}else{printf("<\n");}return 0;
}

在这里插入图片描述

6.编写一个函数实现n的k次方(使用递归实现)

#include
double Pow(int n, int k)
{if (k == 0)return 1;else if (k > 0){return n * Pow(n, k - 1);}else{return 1.0 / Pow(n, -k);}
}
int main()
{int n = 0;int k = 0;double ret = 0.0;scanf("%d %d", &n, &k);ret = Pow(n, k);printf("%lf", ret);return 0;
}

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

#include
int Digitsum(n)
{if (n > 9){return Digitsum(n / 10) + n % 10;}else{return n;}
}
int main()
{int n = 0;scanf("%d", &n);int sum = Digitsum(n);printf("%d", sum);return 0;
}

9.编写一个函数reverse_string(char * string),用递归实现。

#include
#include
void reverse_string(char arr[])
{int l = 0;int r = strlen(arr) - 1;while (l < r){char tmp = arr[l];arr[l] = arr[r];arr[r] = tmp;l++;r--;}
}
int main()
{char arr[] = "abcdef";reverse_string(arr);printf("%s", arr);return 0;
}

在这里插入图片描述

#include
#include
int Strlen(char *str)
{int count = 0;while ((*str) != '\0'){count++;str++;}return count;
}
void reverse_string(char *str)
{int l = 0;int r = Strlen(str) - 1;while (l < r){char tmp = *(str + l);//char tmp = str[l];*(str + l) = *(str + r);//str[l]=str[r];*(str + r) = tmp;//str[r]=tmp;l++;r--;}
}
int main()
{char arr[] = "abcdef";reverse_string(arr);printf("%s", arr);return 0;
}

10.写一个函数返回参数二进制中1的个数

//注意此算法不能解决n是负数的问题
#include
int count_bit_one(int n)
{int count = 0;while (n){if (n % 2 == 1){count++;}n /= 2;}return count;
}
int main()
{int n = 0;scanf("%d", &n);int count = count_bit_one(n);printf("%d", count);return 0;
}

在这里插入图片描述

当输入为负数时:

法一:

#include
int count_bit_one(unsigned int n)
{int count = 0;while (n){if (n % 2 == 1){count++;}n /= 2;}return count;
}
int main()
{int n = 0;scanf("%d", &n);int count = count_bit_one(n);printf("%d", count);return 0;
}

在这里插入图片描述

法二:

#include
int count_bit_one(int n)
{int count = 0;int i = 0;for (i = 0; i < 32; i++){if (((n >> i) & 1) == 1){count++;}}return count;
}
int main()
{int n = 0;scanf("%d", &n);int count = count_bit_one(n);printf("%d", count);return 0;
}

法三(推荐):

#include
int count_bit_one(int n)
{int count = 0;while (n){n = n & (n - 1);count++;}return count;
}
int main()
{int n = 0;scanf("%d", &n);int count = count_bit_one(n);printf("%d", count);return 0;
}

11.求二进制位中不同位的个数

编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入样例:
1999 2299
输出样例:
7

//求二进制位中不同位的个数
#include
int get_diff_bit(m, n)
{int tmp = m ^ n;return count_bit_one(tmp);
}
int count_bit_one(int n)
{int count = 0;while (n){n = n & (n - 1);count++;}return count;
}
int main()
{int m = 0;int n = 0;scanf("%d %d", &m, &n);int count = get_diff_bit(m, n);printf("%d", count);return 0;
}

12.打印二进制中的奇数和偶数位。

获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列。

//12.打印二进制中的奇数和偶数位。
#include
void print(int n)
{int i = 0;printf("奇数位:\n");for (i = 30; i >= 0; i -= 2){printf("%d ", (n >> i) & 1);}printf("\n偶数位:\n");for (i = 31; i >= 1; i -= 2){printf("%d ", (n >> i) & 1);}
}
int main()
{int n = 0;scanf("%d", &n);print(n);return 0;
}

在这里插入图片描述

13.交换两个变量(不创建临时变量)

#include
int main()
{int m = 0;int n = 0;scanf("%d %d", &m, &n);m = m ^ n;n = m ^ n;m = m ^ n;printf("%d %d", m, n);return 0;
}

14.函数判断素数

实现一个函数,判断一个数不是素数
利用上面的函数打印100到200之间的素数。

//函数判断素数
#include
#include
int is_prime(int n)
{int i = 2;for (i = 2; i <= sqrt(n); i++){if (n % i == 0)return 0;}return 1;
}
int main()
{int i = 0;for (i = 100; i <= 200; i++){if (is_prime(i) == 1){printf("%d ", i);}}return 0;
}

在这里插入图片描述

15.乘法口诀表

实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定。
如:输入9,输出9^9口诀表,输入12,输出,…

//实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定。
#include
void print_table(int n)
{int i = 0;for (i = 1; i <= n; i++){int j = 0;for (j = 1; j <= i; j++){printf("%-2d*%-2d=%-3d ", i, j, i * j);}printf("\n");}
}
int main()
{int n = 0;scanf("%d", &n);print_table(n);return 0;
}

在这里插入图片描述

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...