24/3/2

题目一:多个字符从两端移动,向中间汇聚

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
int main()
{
	char arr1[20] = "welcome to my blog.";
	char arr2[20] = "###################";
	int left = 0;
	int right = strlen(arr2) - 1;
	printf("%s\n", arr2);
	while (left <= right)
	{
		Sleep(1000);
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		left++;
		right--;
		printf("%s\n", arr2);
	}
	return 0;
}

运行效果:

改进1:

上面的求right时,本质上是求arr2数组最后一个元素的下标;如果不使用strlen,还可以用sizeof:

int right = sizeof(arr2) / sizeof(arr2[0]) - 1 ;

思考:

如果要把上面"welcome to my blog."改为让用户自己输入一串字符,应该怎么办?

①arr2和 arr1的长度肯定要一样,这样对齐,展示效果会较好.那么arr1长度,那么我希望是用户输入字符串的长度,但是

a.

b.

如果不设定数组的个数,那么就会按照初始化的个数进行分配内存

所以用字符指针和c99标准中的变长数组来解决

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
int main()
{
	printf("请输入一串字符:");
	//用一个字符指针来存输入的字符串
	char* str =NULL ;
	scanf("%s", str);
	//计算输入字符的长度,在用c99标准中的变长数组,创建合适大小的数组
	int ret = strlen(str);
	char arr1[ret] = *str;
	//通过遍历,保证arr2跟arr1长度相等,arr2中全是#号
	char arr2[ret] = { 0 };
	for (int i = 0; i < ret; i++)
	{
		arr2[i] = '#';
	}
	int left = 0;
	int right = strlen(arr2) - 1;
	printf("%s\n", arr2);
	while (left <= right)
	{
		Sleep(1000);
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		left++;
		right--;
		printf("%s\n", arr2);
	}
	return 0;
}

题目二:二分法排序

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0;
	int right = sizeof(arr1) / sizeof(arr1[0]) - 1;
	int mid = 0;
	int key = 7;
	int find = 0;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (arr1[mid] < key)
		{
			left = mid + 1;
		}
		else if (arr1[mid] > key)
		{
			right = mid - 1;
		}
		else
		{
			find = 1;
			break;
		}
	}
	if (find == 1)
		{
			printf("找到了,下标为%d\n", mid);
		}
	else
		{
			printf("没找到!");
		}
}

思考:为什么while条件:left<=right,有等于号?

题目三:冒泡排序

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[], int sz);
void bubble_sort(int arr[], int size1)
{
	for (int i = 0; i < size1 - 1; i++)
	{
		for (int j = 0; j < size1 - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int ret = 0;
				ret = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = ret;
			}
		}
	}
}
int main()
{
	int arr1[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	bubble_sort(arr1, sz);
	for (int i = 0; i < sz ; i++)
		{
			printf("%d\n", arr1[i]);
		}
	return 0;
}

冒泡排序:

1.先确定需要冒多少趟,这个需要判断一下规律,结论:一个有序数组中有n个数,那么需要冒n-1趟

2.每一趟需要比较多少次呢? 总结:

3.写这种这种嵌套循环,需要搞清楚 i 和 j的关系,以防陷入无限循环

4.数组进行传参时,传的是首元素地址,所以不能再bubblesort函数内部去算sz大小,不然结果sz=1,就出现bug;故现在外面把sz算好,再传进去进行计算.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值