我希望各位可以在思考之后去看本期练习,并且在观看之后独立编写一遍,以加深理解,巩固知识点。
练习一:编写代码,演⽰多个字符从两端移动,向中间汇聚
我们依旧先上代码
cpp
//编写代码,演⽰多个字符从两端移动,向中间汇聚
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
int main()
{
char arr1[] = { "Learn arrays well, and suffer less in the future!!!" };
char arr2[] = { "###################################################" };
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(500);
system("cls");
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
第一步
对于这道题来说,我们要先搞清楚怎么样让字符从两端向中间移动。既然题目说的是多个字符,那就会用到数组去存放这些字符;移动是一个过程,所以这道题必定要使用循环。那我们先创建出所需要的数组:
cpp
#include<stdio.h>
int main()
{
char arr1[] = { "Learn arrays well, and suffer less in the future!!!" };
char arr2[] = { "###################################################" };
return 0;
}
这里英语句子是有意义的,各位感兴趣可以试着翻译,嘻嘻。
接着我们要创建循环体系,从两端开始,那就要左右各设置一个变量去满足题意。
cpp
#include<stdio.h>
int main()
{
char arr1[] = { "Learn arrays well, and suffer less in the future!!!" };
char arr2[] = { "###################################################" };
int left = 0;
int right = strlen(arr2) - 1;
while (left <= right)
{
}
return 0;
}
注意,right的值应该是字符串长度-1,原因是我们要用的是数组下标,如果不明白可以去看上一篇知识点讲解。从两端开始,当 left 不再<= right 的时候,说明我们的移动也结束了。
第二步
多个字符移动汇聚
cpp
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = { "Learn arrays well, and suffer less in the future!!!" };
char arr2[] = { "###################################################" };
int left = 0;
int right = strlen(arr2) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
left++;
right--;
}
return 0;
}
怎么样,是不是体会到移动的感觉了,接下里我们就要去让他称为一个动态的移动过程了。
第三步
这一步有分两个点:一是在每次打印之间都要设置停顿。
二是在每下一次打印之前都要清理掉前一次的打印。
那我们就要用到新知识了:
第一个是Sleep函数,这个函数的作用是生成停顿,需要包含头文件(windows.h)
形式:Sleep(时间) 单位是毫秒
第二个是系统提供的清屏指令符cls,需要包含头文件(stdlib.h)
形式:stytem("cls");
写出代码就是
cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
int main()
{
char arr1[] = { "Learn arrays well, and suffer less in the future!!!" };
char arr2[] = { "###################################################" };
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(500);
system("cls");
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
这里要注意你两个函数的位置,如果放到了printf 前面的话,就得不到想要的效果了。动态过程不便呈现,各位自行尝试效果。
练习二:二分查找
在有序数组中查找某个数的下标。
老样子,上代码:
cpp
#include<stdio.h>
int main()
{
//创建数组
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//k就是我们要找的元素,这里也可以写成scanf输入变量
int k = 7;
//二分法
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int flag = 0;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("找到了,下标是%d\n", mid);
flag = 1;
break;
}
}
if (flag == 0)
{
printf("找不到\n");
}
return 0;
}
这道题的思路和上一道有相似之处,我们可以对比着来看。注意这道题是有序数组中的查找,在无序的数组中,这种方法不适用。
首先,创建数组和需要查找的变量是必不可少的,注释中也有相应的替换方法,这里不多讲了。
我着重讲一下二分法,根据上面的数组可知,元素下标最大的9,最小的是0,而我们要寻找的元素的下标是6,我们就可以通过(max+min)/2的方法先把所有的元素去掉一半,如果没找到,再重复上一步,这样的方式在数组元素非常多的时候可以极大的减少计算机的执行时间,提高了运行效率。
还有两个细节,第一,中间值mid必须在循环内部,因为在每次改变left 或者 right之后,我们也需要改变中间值。第二 flag 是用于找不到你想查找数时的必要办法。
本期到此就结束了,如果还有不太清楚的地方,欢迎在评论区讨论。