找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 8887|回复: 5

[ROBOTC教程]ROBOTC中的格式输出

[复制链接]
发表于 2014-5-29 23:30:37 | 显示全部楼层 |阅读模式
本帖最后由 夜冥 于 2014-5-29 23:50 编辑

如果你曾经不得不在ROBOTC在屏幕上输出任何东西,你可能已经使用nxtDisplayTextLine()或它的许多兄弟姐妹的其中的一个。您的代码可能会,也可能不会看起来像这样:
  1. task main()
  2. {
  3.   int num_apples   = 10;
  4.   int num_pears    = 8;
  5.   int num_cherries = 116; //这个单词是樱桃,PS:不要纠结细节!

  6.   nxtDisplayCenteredTextLine(0, "ROBOTC");
  7.   nxtDisplayCenteredTextLine(1, "Fruit Stand");   
  8.   nxtDisplayTextLine(3, "%d apples", num_apples);
  9.   nxtDisplayTextLine(4, "%d pears", num_pears);
  10.   nxtDisplayTextLine(5, "%d cherries", num_cherries);
  11.   wait1Msec(5000);
  12. }
复制代码
屏幕将类似于下面的一个画面,这还可以吧,如果你不关心的布局。

image_thumb.png


这个程序排列的不是很整齐,多数人认为不当时那么重要。但是,考虑当项目的数量迅速改变的会发生的话,你认为“苹果”,“梨”和“樱桃”是怎样输出的情?试试下面的程序,你就会明白我的意思:
  1. task main()
  2. {
  3.   int num_apples   = 0;  //
  4.   int num_pears    = 0;
  5.   int num_cherries = 0;

  6.   nxtDisplayCenteredTextLine(0, "ROBOTC");
  7.   nxtDisplayCenteredTextLine(1, "Fruit Stand");

  8.   while (true)
  9.   {
  10.     num_apples   = abs(rand()) % 200;
  11.     num_pears    = abs(rand()) % 200;
  12.     num_cherries = abs(rand()) % 200;

  13.     nxtDisplayTextLine(3, "%d apples", num_apples);
  14.     nxtDisplayTextLine(4, "%d pears", num_pears);
  15.     nxtDisplayTextLine(5, "%d cherries", num_cherries);
  16.     wait1Msec(200);
  17.   }
  18. }
复制代码

rand():0~32,767 随机取值,abs:返回一个数的绝对值。公式rand()%N是求范围随机数的公式,%求余,对正整数N的求余结果肯定在0~N-1之间,也就是rand()%200的结果在0~199之间。
这个时候你会发现,苹果”,“梨”和“樱桃”这三行在来回的跳,显得很乱。但有方法可以让他们的位置固定下来。
来看看下一个程序,看看你能发现的细微差别。当你理解了它,运行它,并检查出的结果。
  1. task main()
  2. {
  3.   int num_apples   = 0;  // how do you like them apples?
  4.   int num_pears    = 0;
  5.   int num_cherries = 0;

  6.   nxtDisplayCenteredTextLine(0, "ROBOTC");
  7.   nxtDisplayCenteredTextLine(1, "Fruit Stand");

  8.   while (true)
  9.   {
  10.     num_apples   = abs(rand()) % 200;
  11.     num_pears    = abs(rand()) % 200;
  12.     num_cherries = abs(rand()) % 200;

  13.     nxtDisplayTextLine(3, "%3d apples", num_apples);
  14.     nxtDisplayTextLine(4, "%3d pears", num_pears);
  15.     nxtDisplayTextLine(5, "%3d cherries", num_cherries);
  16.     wait1Msec(200);
  17.   }
  18. }
复制代码
image_thumb1.png
现在岂不是看起来更好?robotC中支持很多格式符


支持格式符
  • %c – a single character * 单个字符
  • %s – a string or char array 一个字符串或字符数组
  • %f – a signed or unsigned float * 一个符号或无符号浮点数
  • %d – a signed or unsigned long or int *有符号或无符号long或int型
  • %i – a signed or unsigned long or int  有符号或无符号long或int型
  • %o – unsigned octal int or long 无符号八进long或int型
  • %u – unsigned decimal int or long  无符号十进制long或int型
  • %x – unsigned hex int or long (lower case, e.g. 67ad) 无符号的十六进制long或int型(小写,如67ad)
  • %X – unsigned hex int or long (upper case, e.g. 67AD) *无符号的十六进制long或int型(大写,如67AD)
  • %p – address of a pointer *地址指针
  • %% – the actual percentage sign * 实际的百分号


前导零所以,你还能用这些方式的转变,您打印的变量看?
说你是做一个转速计数器,就像你的车(不是墨西哥餐厅),你想的位数显示的是一样的。在汽车,他们看起来像这样。有5位数字加上前导零。使用输格式符即可实现相同的。


下面这段代码会简单地从0开始计数,并与前导零显示一个5位数的数字:
  1. task main()
  2. {
  3.   int counter = 0;
  4.   while (true)
  5.   {
  6.     nxtDisplayCenteredBigTextLine(4, "%05d", counter++);
  7.     wait1Msec(100);
  8.   }
  9. }
复制代码
过一小会儿
它应该像这样
image_thumb2.png

前导零的事情还将与一些其他类型的工作。
现在,我们就来看看彩车。你可以做一些很酷的东。考虑以下几点:
  1. float pie = 3.1415926535
复制代码
当我们打印出来,我们实际上只关心小数点后显示的第2号。那么,如何才能做到这一点?一起来看看:

  1. task main()
  2. {
  3.   float pie = 3.1415926535;
  4.   nxtDisplayCenteredBigTextLine(4, "%.2f", pie);
  5.   wait1Msec(10000);
  6. }
复制代码
实际值并未改变,中位数只有正在显示的数目。
image_thumb3.png


0x十六进制
我用%X修改显示数据,而是使它明显,这是一个十六进制数,我喜欢的0X添加到它,并确保他们有前导零,这样让他们排列整齐
  1. task main()
  2. {
  3.   long pie = 3141593;
  4.   long foo = 871839011;
  5.   long meh = 781;

  6.   nxtDisplayCenteredTextLine(2, "0x%08X", pie);  
  7.   nxtDisplayCenteredTextLine(4, "0x%08X", foo);
  8.   nxtDisplayCenteredTextLine(6, "0x%08X", meh);
  9.   wait1Msec(10000);
  10. }
复制代码
"0x": 普通字符 配合显示16进制格式
"%08x": 8位对齐的16进制格式,少于8位则前补0

第一个图是我的代码给出的,是不是很整齐?
image_thumb4.png image_thumb5.png

支持的功能其实还有很多格式输出的函数

  • nxtDisplay*()
  • writeDebuStream*()
  • sprintf()
  • snprintf()
  • StringFormat()
还有一个叫的sscanf(功能)不在这里讲。






评分

参与人数 1乐币 +10 人气 +1 收起 理由
糖伯虎 + 10 + 1 中文乐高有你更给力:)

查看全部评分

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
 楼主| 发表于 2014-5-29 23:31:29 | 显示全部楼层
本帖最后由 夜冥 于 2014-5-29 23:44 编辑

第一次发~~~
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2014-5-29 23:36:09 | 显示全部楼层
本帖最后由 夜冥 于 2014-5-29 23:46 编辑

大家多来捧捧场~~~

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2014-5-29 23:37:02 | 显示全部楼层
本帖最后由 夜冥 于 2014-5-29 23:47 编辑

以后还会写一些关于robotC的教程的~~~
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-5-30 08:55:52 | 显示全部楼层
很棒的东东,支持楼主以后的教程!~
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-7-5 12:24:41 | 显示全部楼层
学习学习
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-12-22 11:26 , Processed in 0.141479 second(s), 24 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表