欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > C语言(17)------------>数组的练习

C语言(17)------------>数组的练习

2025/3/14 23:24:19 来源:https://blog.csdn.net/2303_77568009/article/details/145945782  浏览:    关键词:C语言(17)------------>数组的练习

本篇文章将使用数组实现,字符串向两边逐渐浮现、二分查找。使用到了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;
}

运行结果:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词