Hello everybody!今天我们不讲新的语法,来讲两道数组的练习,巩固一下上节课学习的数组的语法知识。好了,让我们开始吧。
数组练习
多个字符从两端移动,向中间汇聚
分析: 首先我们先要创建两个整数来记录左右两端的下标,接着通过这两个整数来交换两个字符数组中的内容,接着我们需要调整这两个整数来重复上述工作。所以这题我们需要一个循环来解决,那么循环的结束条件是什么呢?应该是左边的整数要小于右端。这里我再来介绍三个新的知识,
-
strlen函数可以求字符串的长度
-
Sleep函数可以让当前的线程暂停一段时间,它的单位是毫秒。
-
system(“cls”): system函数是库函数,cls是控制台屏幕清空指令。
分析完毕,让我们来实践吧。
#include <stdio.h>
#include <string.h>
#include <Windows.h>
int main()
{
char arr1[] = "hello world!";
char arr2[] = "????????????";
//定义两个整数进行记录
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
Sleep(1000);
//两个数组中的内容进行交换
arr2[left] = arr1[left];
arr2[right] = arr1[right];
//整数的调整
left++;
right--;
printf("%s\n", arr2);
Sleep(1000);
system("cls");
}
printf("%s\n", arr2);
return 0;
}
二分查找
题目描述:在一个升序的数组中查找指定的数字n。
分析: 首先我们和上个题目一样先要创建两个整数来记录左右两端的下标,接着我们要创建一个整数来记录中间位置元素的下标。接着根据中间元素和指定的数组进行比较,根据不同的结果调整左右两端。然后我们再来定义一个变量来记录是否找到了,找到的话就修改变量的值,然后根据这个变量的值来校验是否成功找到了指定的数字。显然这题的循环的结束条件还是左边的整数要小于右端。分析完毕,我们直接来实践一下。
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int key = 2;//目标数字
//定义两个整数记录左右两端的下标
int left = 0;
int len = sizeof(arr) / sizeof(arr[0]);
int right = len - 1;
int find = 0;//如果找到了我们就修改变量的值为1
while (left < right)
{
int mid = (left + right) / 2;
if (arr[mid] > key)
{
right = mid - 1;
}
else if (arr[mid] > key)
{
left = mid + 1;
}
else
{
//修改变量的值并跳出循环
find = 1;
break;
}
}
if (find == 1)
{
printf("找到了!\n");
}
else
{
printf("没找到!\n");
}
return 0;
}
最后,这里还有一个小细节,如果left和right比较大的时候mid可能存在问题,所以我们可以采用这种方式:
int mid = left + (right - left)/2;
好了,这节课我们就上到这里,下节课不见不散。