本篇文章将使用数组实现,字符串向两边逐渐浮现、二分查找。使用到了C语言的一维数组与while循环。一维数组与while循环可参考下面的博客:
C语言(15)-------------->一维数组-CSDN博客
C语言(12)--------->for循环-CSDN博客
一、字符串向两边逐渐浮现
字符串向两边浮现指的是:
一串星号,每一次让星号最左边与最右边显示一个字母。
例如:
//需要显示的内容:
//Welcome to NJU!
//***************
//W*************!
//We***********U!
//...
//Welcome to NJU!
为了实现这个功能,我们可以使用两个一维数组,一个数组存放我们需要显示的字符串,另一个数组存放我们的星号。每一次让未显示最左边的星号显示我们未显示的字母即可。
需要注意的是:需要显示的字符串和我们的星号长度一样。
(1)使用strlen计算右下标
参考代码:
#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "Welcome to NJU!";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);left++;right--;}return 0;
}
运行结果:
为了让读者可以更加理解这个过程,我使用了Sleep函数和system函数逐渐显示每一步运行过程:
参考代码:
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>int main()
{char arr1[] = "Welcome to NJU!";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(1000);//睡眠1000mssystem("cls");//清空控制台的信息left++;right--;}return 0;
}
最终的运行结果:
(2)使用sizeof计算右下标
计算数组长度时,上面的实现方法使用的时strlen函数,可以直接计算出数组的长度大小。(计算到\0以前的字符,例如"abc"的实际存放是:a b c \0,它的实际长度是3)
也可以使用sizeof计算,使用sizeof计算时会将\0给计算进去,此时会比实际的计算长度大1。
不清楚这个的可以参考我的博客:
C语言(1)--------->初始C语言_c语言是什么-CSDN博客
博客中第九部分对此有所介绍:
代码:
#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "Welcome to NJU!";char arr2[] = "***************";int left = 0;//定义最左边的下标int sz = sizeof(arr1) / sizeof(arr1[0]);int right = sz - 2;//定义最右边的下标while (left <= right){arr2[left] = arr1[left];arr2[right] = arr1[right];printf("%s\n", arr2);left++;right--;}return 0;
}
运行结果:
二、二分查找
有一天走在街上,你看见好朋友的衣服很好看,询问了他的价格。
FRIENG:你猜一下。
YOU:100元。
FRIENG:不对,这个价格高了。
这个时候,你会从1一直猜到99吗?当然不会,我们的反应可能是猜个50。这个就是二分查找.
YOU:50元。
..........
在编程中,二分查找是一个非常经典的算法,后续的教程中我们会逐渐深入地探讨这个算法。
二分查找算法通常用于在一些有顺序的数字查找某个特定的数字。例如,在一群升序的数字和降序的数字,我们可以用二分查找来查找数字,这个的效率是比较高的,效率是log2N(以2为底,N的对数)
为什么要使用二分查找呢?如果不用二分查找查找一个我们要的数字怎么做呢,它的最差的情况要查找几次呢?
代码:
#include <stdio.h>int main()
{int arr1[] = {1,2,3,4,5,6,7,8,9,10};int k = 0;int flag = 0;//标志位scanf("%d",&k);//输入我们要查找的数字int sz = sizeof(arr1) / sizeof(arr1[0]);int i = 0;for (i = 0; i < sz; i++){if (arr1[i] == k){printf("找到了,我们要查找的数字的下标是:%d\n",i);flag = 1;break;}}if (flag == 0){printf("抱歉,没有找到我们需要的数字\n");}return 0;
}
运行结果:
(1)数字不在我们的数组中的情况:
(2)数字在我们的数组中的情况:
使用二分查找算法实现查找过程:
1.确定被查找的范围
2.确定被查找范围左右下标
3.根据左右下标计算中间下标
4.根据中间元素和要找元素比较
代码:
#include <stdio.h>int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int k = 0;int flag = 0;//标志位int sz = sizeof(arr1) / sizeof(arr1[0]);scanf("%d", &k);//输入我们要查找的数字int left = 0;int right = sz - 1;while (left <= right){int mid = (left + right) / 2;//mid一定要定义在while循环的内部,因为每一次都需要重新计算下标if (arr1[mid] == k){printf("找到了,我们要查找的数字的下标是:%d\n",mid);flag = 1;break;}else if (arr1[mid] < k){left = mid + 1;}else{right = mid - 1;}}if (flag == 0){printf("抱歉,没有找到我们需要的数字\n");}return 0;
}
运行结果: