C语言初阶练习3.0

目录

1. 实现一个函数来交换两个整数的内容。

2. 编写代码,演示多个字符从两端移动,向中间汇聚。

3. 编写代码实现,模拟用户登录情景,并且只能登录三次。

4. 字符串逆序

5. 计算一个数的每位之和(递归实现)

6. 递归实现n的k次方


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

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三分苦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值