数组练习之:字符跳动显现字符

概要

编写代码,演⽰多个字符从两端移动,向中间汇聚:

技术名词解释

   这里为大家解释一下题目的意思:比方说我们想要显示“I love you”这一字符串,但不能直接简单地一下子就全部显现,而是分为多次实现,并且刚开始是用‘*’来掩盖所有字符,每一次显示都只显示第一个字符和最后一个字符,就像缓慢揭开布盖一样,一点点地显现在我们眼前,效果图如下:

整体架构流程

1.观察效果图得出设计思路:

(1)由效果图我们不难发现,我们最终想要的内容与刚开始的*个数上一致的。

(2)众所周知,字符串通常是用数组储存的,我们可以将*字符串与最终内容分别用两个数组储存。即:

char a[]={I love you!!!!};

char b[]={**************};

需要注意的是字符个数必须一致!

(3)每一次显现都像是“改头换尾”,将第一个*和最后一个*分别替换成了字母字符串的首和尾,要意识到这是由数组a中的元素赋值给了数组b中对应下标的元素实现的,例如:b[0]=a[0].b[13]=a[13];

(4)设出left作为左下标递增,right作为右下标递减,在最终显示之前,left始终小于等于right

(5)通过循环实现多次“改头换尾”,每循环一次left和right都会递增和递减。

2.参考代码

#define _CRT_SECURE_NO_WARNINGS 1
//多个字符从两端移动,向中间汇聚

#include <stdio.h>
#include <string.h>

int main()
{
	char a[] = "I love you!!!!";
	char b[] = "**************";//确保字符个数一致
	int right = strlen(a) - 1;//最后一个!的下标
	int left = 0;//左下标从0开始

	printf("%s\n", b);
	while (left <= right)
	{
		 b[left]=a[left];
		 b[right]=a[right];
		printf("%s\n", b);
		
		left++;
		right--;
	}

	return 0;
}

   左下标毫无疑问是从0开始的,但由于我们没有规定数组大小,因此右下标不能直接得出,对于字符串,我们可以利用strlen函数计算出字符串的有效长度(排除‘\0’),而下标总是比个数少一个,所以最后一个!对应的下标就是字符串的有限长度-1,

   当然,利用sizeof函数也未尝不可,不过sizeof计算出的结果是包含‘\0’在内的所有字符个数(比strlen求出的结果大1),因此需要sizeof(a)/sizeof(a[0])-2才能得到我们想要的右下标。

  有人可能会问了,为什么不规定一下数组的大小呢?那是因为你只看到了我这篇代码要显示的字符串,为了保证代码的通用性(可以显示不同长度的字符串),我们就不规定数组的大小,毕竟我们不知道你每一次想要显示的字符串有多少个字符嘛。

代码细节

  诚然,只靠上述的代码就足以实现开头的效果图了,但它分明是不够完美的,你会发现,程序显示结果的速度太快了,以至于一次性就在屏幕上显示出了所有的流程,观赏度不行,我们想要每一步的程序显示得慢一些,以体现字符是从两端向中间“跳动”的过程,可以利用Sleep函数(包含在windows.h头文件中)此函数的对象是毫秒大小,在peintf函数的下面加上Sleep(1000),就可以实现每一秒显示一行了。

   另外,显示过程中会出现过多的“过去式”结果,这可能会显得过于冗杂,如果想要避免此弊端,不妨试试另一个同样包含在windows.h的函数——systme("cls");他可以清除之前显示的内容,让你的屏幕始终只显示一行慢慢变换的结果,更能体现出过程的变化性。优化后的代码和效果如下:

#include <stdio.h>
#include <string.h>
#include<windows.h>
int main()
{
	char a[] = "I love you!!!!";
	char b[] = "**************";//确保字符个数一致
	int right = strlen(a) - 1;//最后一个!的下标
	int left = 0;//左下标从0开始

	printf("%s\n", b);
	while (left <= right)
	{
		 b[left]=a[left];
		 b[right]=a[right];
		printf("%s\n", b);
		Sleep(1000);
		system("cls");
		
		left++;
		right--;

	}

	return 0;
}

……

懂的都懂,嘿嘿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值