电子屏字符循环播出
本帖最后由 风过无痕1989 于 2020-10-8 09:07 编辑学习C语言满一个月了,我用最笨的办法写了下面这段代码,实现了英文的滚动播出 (中文字进入没问题,退出时是乱码)。之前发了一个求助帖,希望得到优化,问题没有解决,已经结帖了,撤不回来了。由于此程序能够正常运行,再发求助有点不合适,故而发技术交流(当然,我自知此程序没有技术含量),算抛砖引玉吧
// 电子屏字符循环播出
#include<stdio.h>
#include<windows.h>
int main()
{
char str;
char strk;
char *p1 = str;
char *p2 = strk;
int i,j,k,m = 32,n =97;
int len = sizeof(strk) / sizeof(char);
for (i = 0;i < len ;i++) // 数组 str 全部格式化为空格
{
str[ i ] = m;
}
for (i = 0;i < len;i++)
{
strk[ i ] = n;
n += 1;
}
while (1)
{
p2 = strk;
for (k = 0;k < len;k++) // 电子屏输出总字符数控制
{
for (i = 0;i < len - k;i++) // 输出空格数
{
printf("%c",*(p1 + i));
}
for (j =0;j <= k;j++) // 输出字符数
{
printf("%c",*(p2 + j));
}
Sleep(300);
system("cls");
}
for (k = 0;k < len;k++) // 电子屏输出总字符数控制
{
for (i = 1;i < len - k;i++) // 输出字符数
{
printf("%c",*(p2 + i));
}
Sleep(300);
p2 += 1;
system("cls");
}
}
printf("\n");
}
PS:发帖时变成了斜体,看着难受,故而改之;同时将越界多出来的一个字符去掉了
#include<stdio.h>
#include<windows.h>
int main()
{
char str;
char strk;
char *p1 = str;
char *p2 = strk;
int i,j,k,m = 32,n =97;
int len = sizeof(strk) / sizeof(char);
for (i = 0;i < len ;i++)// 数组 str 全部格式化为空格 i=len=26时数组越界
{
str = m;
}
for (i = 0;i < len;i++) // 同上 又越界了 len=i=26
{
strk = n;
n += 1;
}
while (1)
{
p2 = strk;
for (k = 0;k < len;k++)// 电子屏输出总字符数控制 0-25 // 当k=len时下面循环会越界
{
for (i = 0;i < len - k;i++)//i<=len-k越界加1 // 输出空格数
{
printf("%c",*(p1 + i));
}
for (j = 0;j <= k;j++) // 输出字符数
{
printf("%c",*(p2 + j));
}
Sleep(300);
system("cls");
}
for (k = 0;k < len;k++) // 电子屏输出总字符数控制
{
for (i = 1;i < len - k;i++) // 输出字符数
{
printf("%c",*(p2 + i));
}
Sleep(300);
p2 += 1;
system("cls");
}
}
printf("\n");
return 0;
} baige 发表于 2020-8-2 20:27
兄弟,越界不是大问题,大问题是我认为一定会有更好的,更优的算法来写此程序 // 电子屏字符循环播出
#include <stdio.h>
#include<windows.h>
#define w 36 // 定义电子屏的宽度
#define kg 10 // 定义中间的空格数量
int main()
{
char str;
char *p;
int i,j;
for(i = 0;i < w;i++) //数组内有 w - kg 个空格
{
if(0 <= i && i < kg)
str=32;
else
str = i - kg + 'a';
}
for(i = 0;i < 1000;i++) //这里i的最大值随便设,就是个循环次数
{
p = str;
for(j = 0;j < w;j++)
{
printf("%c",*(p + (i + j) % w)); //这里是对要显示的数组长度求余
}
Sleep(300);
system("cls");
}
return 0;
}
此方法的优点是少用了一个数组,节约了系统资源,定义了数组长度及空格数量,只需对定义部份进行修改,程序部份可以基本不动。缺点是很难调到前面的刚好出屏,后面的接着显示(我调试了几个小时了,也没有能够达到如上面的程序那样)
如果是刚好出屏后面接着显示,那不应该是调整sleep的时间么 BIYU 发表于 2020-8-3 00:11
如果是刚好出屏后面接着显示,那不应该是调整sleep的时间么
sleep 是用来刷屏的,让字符一个一个出来有钝错感 本帖最后由 Cool_Breeze 于 2020-8-3 16:11 编辑
#BUG 中文字,最后还是会打印!
// 电子屏字符循环播出
#include <stdio.h>
#include<windows.h>
#include<locale.h>
#define w 36 // 定义电子屏的宽度
#define kg 10 // 定义中间的空格数量
int main()
{
char str = "C语言最牛逼_COOL_BREEZE";
char *p;
register int i,j;
// for(i = 0;i < w;i++) //数组内有 w - kg 个空格
// {
// if(0 <= i && i < kg)
// str=32;
// else
// str = i - kg + 'a';
// }
for(i = 0;i <1000 ;i++) //这里i的最大值随便设,就是个循环次数
{
p = str + i % w;
if (*p < 0)
{
printf("%c%c",*p,*(p+1));
i++;
j=1;
}
else j=0;
for(;j < w;j++)
{
p = str + (i + j) % w;
if (*p < 0)
{
printf("%c%c",*p,*(p+1)); //这里是对要显示的数组长度求余
j++;
}
else printf("%c",*p);
}
Sleep(100);
//system("pause >nul");
system("cls");
}
return 0;
}
这样最好了!
// 电子屏字符循环播出
#include <stdio.h>
#include<windows.h>
#define w 36 // 定义电子屏的宽度
#define kg 10 // 定义中间的空格数量
int main(void)
{
static char str = {"C","语","言","最","牛","逼","_","C","O","O","L","_","B",\
"R","E","E","Z","E"};
register int i,j;
for (i=0; i<w; i++) if (! *str) strcpy(str, " ");
for(i = 0;i <1000 ;i++) //这里i的最大值随便设,就是个循环次数
{
printf("\r");
for(j=0;j < w;j++) printf("%s",*(str + (i + j) % w));
Sleep(300);
//system("pause >nul");
}
return 0;
}
使用宽字符 wchar_t Cool_Breeze 发表于 2020-8-3 15:11
#BUG 中文字,最后还是会打印!
前后两个我都试了,前面那一个,文字移动时跳跃太大了,让人看着有不舒适感;后面这个这就好很多了,看着很舒服。但你这么灌文字进去,对用户来说,有点麻烦。比如我要写一句话,就得这样了:{"学","习","C","语","言","满","一","个","月",",","感","谢","小",\
"甲","鱼","老","师","的","精","淇","讲","解",",","感","谢","论",\
"坛","朋","友","们","的","热","心","帮","助","!"};
若是话语再长一点,用户可能要崩溃了。
还有,最好是前一句正好退出屏幕,后一句才开始进入,就像银行、医院等一些服务性行业的电子横幅那样,就最好了。 风过无痕1989 发表于 2020-8-3 16:59
前后两个我都试了,前面那一个,文字移动时跳跃太大了,让人看着有不舒适感;后面这个这就好很多了,看着 ...
我也是去银行,看见了,就想自己写一个 风过无痕1989 发表于 2020-8-3 16:59
前后两个我都试了,前面那一个,文字移动时跳跃太大了,让人看着有不舒适感;后面这个这就好很多了,看着 ...
这个需要分割字符串放入数组 本帖最后由 Cool_Breeze 于 2020-8-3 18:52 编辑
风过无痕1989 发表于 2020-8-3 16:59
前后两个我都试了,前面那一个,文字移动时跳跃太大了,让人看着有不舒适感;后面这个这就好很多了,看着 ...
// 设1个中文占2个字符
// 电子屏字符循环播出
#include <stdio.h>
#include<windows.h>
#define w 36 // 定义电子屏的宽度
#define kg 10 // 定义中间的空格数量
int main(void)
{
static char str;
static char s;
while (1)
{
printf("\r请输入字符串:");
scanf("%s",s);
system("cls");
if (s) break;
}
register int i=0,j=0;
char *p = s;
for (i=0;*p;i++)
{
p = s+i;
if (*(s+i) < 0)
{
strncpy(str,p,2);
j++;
i++;
}
else
{
strncpy(str,p,1);
j++;
}
}
//printf("%s",str);
for (i=0; i<w; i++) if (! *str) strcpy(str, " ");
for(i = 0;i<=w ;i++) //这里i的最大值随便设,就是个循环次数
{
printf("\r");
for(j=0;j < w;j++) printf("%s",*(str + (i + j) % w));
Sleep(100);
if (i==w) i=0;
//system("pause >nul");
}
return 0;
}
页:
[1]