函数习题以及知识点

目录

(1)知识点

(2)函数返回两个变量

(3)打印100-200之内的素数

(4)实现一个函数打印乘法口诀表,行数由自己指定

(5)用函数实现字符串逆序,不能使用C函数库中的字符串操作函数(对称的字符交换)

(6)求一个数字 每位数之和


(1)知识点

(1)return只能返回一个值,不能返回两个 例如:return a,b;这是错误的写法。

(2)数组名本来就是地址

(3)函数的形式参数和实际参数可以同名

(4)函数主调函数和被调函数可以不在一个文件夹 #include ".h那个函数名"

(5)函数设计应该追求高内聚低耦合(函数的独立相对来说比较高)

(6)函数要尽可能的少使用全局变量,参数也不宜过多

(7)内存空间包括栈区(储存局部变量、临时参数等 出程序时就被回收释放 用一会儿就不用了就被销毁了 )、堆区(动态内存分配的)、静态区(静态变量static、全局变量)。所以函数的形式参数在栈中保存。

(2)函数返回两个变量

代码展示:

#include <stdio.h>
void test(int arr[])
{
	arr[0] = 10;
	arr[1] = 20;
}
int main()
{
	int arr[2] = { 0 };
	test(arr);
	printf("%d %d", arr[0], arr[1]);
	return 0;
}

(1)数组名本来就是地址(2)数组传参,传的是首元素的地址,避免空间浪费

(3)打印100-200之内的素数

代码展示:

#include <stdio.h>
int sushu(int n)
{
	int j = 0;
	for (j = 2; j < n; j++)
	{
		if (n % j == 0)
			return 0;
	}
	if (j == n)
		return 1;
}
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		if (sushu(i) == 1)
			printf("%d", i);
		else
			continue;
	}
	return 0;
}

优化代码展示:

#include <stdio.h>
#include <math.h>
int is_prime(int n)
{
	int j = 0;
	for (j = 2; j <= sqrt(n); j++)
	{
		if (n % j == 0)
		{
			return 0;
		}
	}
	return 1;
}
int main()
{
	int i = 0;
	for (i = 100; i < 201; i++)
	{
		if (is_prime(i) == 1)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

注意比较这两个函数,学习一下更加简练的写法

(4)实现一个函数打印乘法口诀表,行数由自己指定

#include <stdio.h>
void chengfa(int n)
{
	int i = 0;
	int j = 0;
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%-2d ", i, j, i * j);
		}
		printf("\n");
	}
}
int main()
{
	int line = 0;
	scanf("%d", &line);
	chengfa(line);
	return 0;
}

(5)用函数实现字符串逆序,不能使用C函数库中的字符串操作函数(对称的字符交换)

代码1展示:(用数组的方法)

#include <stdio.h>
int my_strlen(char* s)
{
	int count = 0;
	while (*s != '\0')
	{
		count++;
		s++;
	}
	return count;
}
void reverse_str(char arr[])
{
	int left = 0;
	int right = my_strlen(arr) - 1;
	while (left < right)
	{
		char a = arr[left];
		arr[left] = arr[right];
		arr[right] = a;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abcdefg";
	reverse_str(arr);
	printf("%s", arr);
	return 0;
}

代码展示:(用指针的方法)


#include <stdio.h>
int my_strlen(char* s)
{
	int count = 0;
	while (*s != '\0')
	{
		count++;
		s++;
	}
	return count;
}
void reverse_str(char* a)
{
	char* left = a;
	char* right = a + my_strlen(a) - 1;
	while (left < right)
	{
		char b = *left;
		*left = *right;
		*right = b;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abcdefg";
	reverse_str(arr);
	printf("%s", arr);
	return 0;
}

代码展示:(用递归的方法)

#include <stdio.h>
int my_strlen(char* s)
{
	int count = 0;
	while (*s != '\0')
	{
		count++;
		s++;
	}
	return count;
}
void reverse_str(char* a)
{
	int b = my_strlen(a);
	char c = *a;
	*a = *(a + b - 1);
	*(a + b - 1) = '\0';
	if (my_strlen(a + 1) > 1)
		reverse_str(a + 1);
	*(a + b - 1) = c;
	
}
int main()
{
	char arr[] = "abcdefg";
	reverse_str(arr);
	printf("%s", arr);
	return 0;
}

这个代码比较难以理解,就是首元素与末元素交换以后,再把末元素换成'\0' ,递归回归的时候,再把末元素一个一个的换成首元素。

(6)求一个数字 每位数之和

写一个递归函数,输入一个非负整数,返回成它的数字之和。

代码展示:

#include <stdio.h>
int DigitSum(size_t n)
{
	if (n < 9)
		return n;
	else
		return DigitSum(n / 10) + n % 10;
}
int main()
{
	size_t n = 0;
	scanf("%u", &n);
	int ret = DigitSum(n);
	printf("%d", ret);
	return 0;
}

非负整数 size_t   %u

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小刘同学啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值