目录
1. 实现一个函数来交换两个整数的内容。
法一:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void swap(int* a, int* b)
{
int z = 0;
z = *a;
*a = *b;
*b = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前:a=%d b=%d\n", a, b);
swap(&a, &b);
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
法二:临时变量法,效率高
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
scanf("%d %d", &a, &b);
int c = 0;
printf("交换前a=%d b=%d\n", a, b);
c = a;
a = b;
b = c;
printf("交换后a=%d b=%d\n", a, b);
return 0;
}
法三:(此法存在溢出的问题)
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a + b;
b = a - b;
a = a - b;
printf("a=%d b=%d", a, b);
return 0;
}
法四:异或操作符 (仅限于整数)
//3^3=0
//0^5=5
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a ^ b;
b = a^ b; //即为 a ^ b ^ b = a ^ 0 = a
a = a ^ b; //即为 a ^ a ^ b = 0 ^ b = b
printf("a=%d b=%d", a, b);
}
2. 编写代码,演示多个字符从两端移动,向中间汇聚。
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
char arr1[] = "hello bit!!!!!!";
char arr2[] = "###############";
// "h#############!";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);//睡眠函数,单位是毫秒
//system("cls");//执行系统命令
left++;
right--;
}
return 0;
}
此种情况屏蔽了system("cls")执行系统命令这个语句,展示如下:
若不屏蔽,则字符会一个一个向中间汇聚且在一行实现。
…………
3. 编写代码实现,模拟用户登录情景,并且只能登录三次。
#include<stdio.h>
#include<string.h>
int main()
{
int i = 0;
char password[20] = "";
//假设密码是字符串“123456”
for (i = 0; i < 3; i++)
{
printf("请输入密码:>");
scanf("%s", password);//password不取地址的原因是password是数组名,数组名本来就是地址
if (strcmp(password, "123456") == 0)//比较两个字符串是否相等不能用等号==,而应该使用strcmp这个函数
{
printf("登陆成功\n");
break;
}
else
{
printf("密码错误\n");
}
}
if (i == 3)
{
printf("三次密码均错误退出程序");
}
return 0;
}
4. 字符串逆序
编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
思路:
逆置字符串,循环的方式实现非常简单
1. 给两个指针,left放在字符串左侧,right放在最后一个有效字符位置
2. 交换两个指针位置上的字符
3. left指针往后走,right指针往前走,只要两个指针没有相遇,继续2,两个指针相遇后,逆置结束
法一:参数是数组
#include<stdio.h>
#include <string.h>
int my_strlen(char* s)
{
int count = 0;
while (*s != '\0')
{
count++;
s++;
}
return count;
}
void reverse_string(char arr[])
{
int left = 0;
int right = my_strlen(arr)-1;
//交换
while (left<right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdefg";
reverse_string(arr);
printf("%s\n", arr);//gfedcba
return 0;
}
法二:参数是指针
#include<stdio.h>
#include <string.h>
int my_strlen(char* s)
{
int count = 0;
while (*s != '\0')
{
count++;
s++;
}
return count;
}
void reverse_string(char* str)
{
char* left = str;
char* right = str + my_strlen(str) - 1;
while (left<right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdefg";
reverse_string(arr);
printf("%s\n", arr);//gfedcba
return 0;
}
法三:递归法
#include<stdio.h>
#include <string.h>
int my_strlen(char* s)
{
int count = 0;
while (*s != '\0')
{
count++;
s++;
}
return count;
}
void reverse_string(char* arr)
{
int len = my_strlen(arr);
char tmp = *arr;
*arr = *(arr + len - 1);
*(arr + len - 1) = '\0';
if(my_strlen(arr+1)>1)
reverse_string(arr+1);
*(arr + len - 1) = tmp;
}
int main()
{
char arr[] = "abcdefg";
reverse_string(arr);
printf("%s\n", arr);//gfedcba
return 0;
}
5. 计算一个数的每位之和(递归实现)
#include<stdio.h>
int ret = 1;
int DigitSum(int n)
{
if (n > 9)
{
int m = n % 10;
ret = m + DigitSum(n / 10);
}
return ret;
}
int main()
{
int n = 0;
scanf("%d", &n);
int add = DigitSum(n);
printf("%d", ret);
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;
scanf("%d %d", &n, &k);
double ret = pow(n, k);
printf("%lf\n", ret);
}