个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【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<stdio.h>
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<stdio.h>
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);//把数组初始化为0
Print(arr, sz);//打印
Reverse(arr,sz);//实现数组逆置
Print(arr, sz);//打印
return 0;
}
4.编程题:将数组A的内容和数组B中的内容进行交换(数组一样大)。
//交换数组
//通过创建临时变量的方式
#include<stdio.h>
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<stdio.h>
int i;//全局变量-不初始化-默认是0
int main()
{
i--;
if (i > sizeof(i))//sizeof()-计算变量/类型所占内存的大小
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
6.编写一个函数实现n的k次方(使用递归实现)
#include<stdio.h>
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<stdio.h>
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<stdio.h>
#include<string.h>
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<stdio.h>
#include<string.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
#include<math.h>
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<stdio.h>
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;
}