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); }