目录
(5)用函数实现字符串逆序,不能使用C函数库中的字符串操作函数(对称的字符交换)
(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