用户界面——屏幕和键盘

用户界面——屏幕和键盘,第1张

用户界面——屏幕和键盘,第2张

考试编辑器整理C++编程知识。

一个实用的程序必须通过某种方式将其结果或需求传达给用户。为了实现这种与用户的交流,C语言提供了丰富的函数库,即标准输入/输出库。本章重点介绍这些函数,并回答一些常见问题。

7.1为什么直到程序结束才看到屏幕输出?

有时,根据使用的编译器和操作系统,系统会缓冲输出。“缓冲”是指要发送到设备的任何输出,无论该设备是屏幕、磁盘还是打印机,都会被存储,直到输出足够大,可以有效输出。当存储了足够的输出信息时,它将作为一个整体输出到指定的设备。

这个过程会给不懂其功能的程序员带来两个问题。首先,程序发出输出后,可能需要一段时间才会显示在屏幕上。如果程序员试图跟踪程序当前的运行状态,他会被这种效果所困扰。

其次,更可怕的是,当程序显示提示信息,等待用户输入时,很可能会出现问题。当程序试图从用户那里获取输入信息时,输出缓冲区可能还没有“填满”,因此发送到屏幕的提示信息可能不会显示出来,用户也不会知道程序一直在等待他的输入——他所能画出的只是这个“可爱”的程序突然停止了工作。

如何解决这个问题?有两种方法。第一种方法是在程序的开头、任何输出之前添加以下语句:

setvbuf(stdout,NULL,_IONBF,O);

该语句的作用是实现程序对屏幕的无缓冲输出。当执行这个命令时,发送到屏幕上的每个字符都会立即显示出来。

这样解决这个问题比较方便,但是不太理想。我不想在这里对屏幕输入和输出进行技术讨论,但是我想指出,缓冲屏幕输出有很好的理由,并且您会希望这样做。

这假装是解决输出缓冲问题的另一种方法。当fflush()命令作用于一个输出缓冲区时,它将使缓冲区“pour 空”本身,无论它是否已被填充。因此,为了解决屏幕缓冲问题,当你需要“反转空”输出缓冲时,你只需要插入以下命令:

fflush(标准输出):

" Invert 空"在程序要求用户输入之前,或者在程序开始耗时的大规模计算之前,输出缓冲区。这样,当程序暂时停止时,你可以清楚地知道原因。

7.2如何在屏幕上定位光标?

C标准没有提供在屏幕上定位光标的方法有很多原因。c语言是为在各种计算机上工作而设计的,其中许多计算机有不同的屏幕类型。例如,在行式打印终端上,光标不能上移;一个嵌入式系统甚至可能是用C写的,但是在它的应用中可能根本就没有屏幕。

尽管如此,将光标放在屏幕上对你的程序还是有用的。你可能想给用户一个吸引人的视觉效果,只有移动光标才能实现;您可能还想用相应的输出命令尝试一些动画效果。虽然没有处理这个问题的标准方法,但是有几种方法可以解决它。

首先编译器开发者会提供一个函数库,基于他们的编译器来处理屏幕输出操作,肯定会有定位光标的函数。但是,很多人认为这是最坏的解决方案,因为每个开发者都可以自由地开发自己的实现方法,所以当一个编译器上开发的程序被移到另一个编译器上时,几乎肯定会被重写,更不用说移到另一台计算机上了。

其次,可以定义一组标准库函数,编译器开发者可以在他的编译器中实现这组函数。流行的Curses软件包源于这个想法。Curses可以在大多数计算机和编译器中使用。因此,使用Curses实现屏幕输出的程序可以在大多数计算机和编译器中工作。

第三,您可以利用这样一个事实,即您要打印到的设备将以特定的方式解释您发送的字符。终端(或屏幕)应该被设计成以一种标准的方式解释给它们的字符,这就是ANSI标准。如果你认为你的电脑符合ANSI标准,你可以通过打印相应的字符来控制屏幕将光标定位在需要的位置,并且你可以将这个操作与其他操作结合起来。

7.3向屏幕写入数据最简单的方法是什么?

c语言包含了大约上百个向屏幕写入数据的函数,所以很难决定在某个时刻哪个函数最适合向屏幕写入数据。很多程序员只是简单的选择一两个打印功能,以后只使用这些功能。这是一种可以接受的编程风格,尽管这样的程序员可能并不总是写代码。

一个程序员要做的就是回顾一下每个打印函数的设计目的和用法,这样当他需要在屏幕上打印数据的时候,就可以选择函数,甚至可以自己编写一些打印函数。

要成为一名真正熟练的程序员,首先要做的一步是学会正确使用标准C语言库中的打印函数。让我们仔细分析其中的几个函数。

printf(,变量);

Printf()是使用最广泛的打印函数。有些程序员只在向屏幕输出文本时使用这个函数。但是,该功能仅设计用于在屏幕上打印格式化文本。实际上,“printf”是“打印格式”的缩写。带格式的文本意味着文本不仅包含写入代码的字符串,还包含程序动态生成的数字、字符和其他数据。此外,它的内容可以以特定的方式显示,例如,它可以通过指定小数点前后的位数来显示实数。正是由于这个原因

printf()函数是必不可少的!

那么,为什么有时候不用printf()呢?这有几个原因。

第一个原因是程序员想更清楚地表达自己的意图。程序员可能只对printf()函数提供的众多函数中的一小部分感兴趣。在这种情况下,他可能想使用只提供这一小部分功能的功能,例如:

putchar(char);

该函数向屏幕发送一个字符。如果你只需要做这部分工作,那么它非常适合。另外,也不一定好。但是,通过使用这个函数,你可以非常清楚地表达相应部分代码的意图,也就是将单个字符发送到屏幕上。

puts(char *);

该函数将一个字符串写入屏幕。它不能像printf()那样接受额外的数据,也不能处理传递过来的字符串。同样,通过使用这个函数,你可以非常清楚地表达代码相应部分的意图。

程序员不使用printf()的第二个原因是为了提高程序执行的效率。printf()函数的开销太大,也就是说,即使是一个简单的操作也需要大量的工作。它需要检查传递的字符串是否与格式说明符匹配,检查传递的参数的数量,等等。上面提到的另外两个函数没有这些额外的开销,所以可以非常快速地执行。这个因素对于大多数将数据写入屏幕的程序来说并不重要,但是在处理磁盘文件中的大量数据时就变得非常重要了。

不使用printf()的第三个原因是程序员希望减少可执行程序的大小。当您在程序中使用标准C函数时,它们必须被“连接”,也就是说,它们必须包含在生成的可执行文件中。对于putchar()和puts()这样的简单打印函数,对应的程序段很短,而printf()对应的程序段相当长——尤其是因为它必须包含前两个函数。

第二个原因可能是最不重要的一个。但是,如果您使用的是静态连接程序,并且希望保留一个小的可执行文件,那么这是一个重要的技能。例如,尽可能减少TSR和其他程序的大小是值得的。

无论如何,程序员都要根据自己的目的来选择需要使用的函数。

17.4将文本写到屏幕上最快的方法是什么?

通常情况下,你不会太在意程序写屏幕的速度。但是,在某些应用程序中,需要尽可能快地编写屏幕。此类计划可能包括:

文本编辑器。如果不能快速书写屏幕,用户输入文本导致的屏幕滚动等相关操作可能会显得太慢。

活动的文本。在同一区域快速打印字符是获得动画效果的常用手段。如果文字不能快速打印在屏幕上,那么动画就会太慢,视觉效果也不会好。

监控程序。这种程序需要持续监控系统、其他程序或硬件设备,并且可能需要每秒钟在屏幕上打印几次状态更新信息。然而,标准C库函数实现的屏幕打印对于这样的程序来说可能太慢了。

那么,在这些情况下,我们应该怎么做呢?加快程序写屏速度有三种方法:选择开销较小的打印功能;提供快速打印功能的软件包或函数库;跳过操作系统,直接写屏幕。下面将从简单到复杂的分析这些方法。

选择开销较小的打印功能。

有些打印功能的开销比其他功能大。“额外开销”是指一个函数与其他函数相比必须做的额外工作。例如,printf()的开销比puts()大。那么,为什么会这样呢?

puts()函数非常简单。它获取一个字符串并将其写入监视器屏幕。当然,printf()函数可以做同样的工作,但是它仍然需要做很多其他的工作——它必须分析发送给它的字符串,找出指示如何打印内部数据的特殊代码。

也许你的程序中没有特殊字符,你也没有传递过任何这样的字符,但很遗憾,printf()无法知道这一点。它每次都要检查字符串中是否有特殊字符。

函数putch()和puts ()-putch()在只打印单个字符时工作得更好(开销更少)。

遗憾的是,与实际在屏幕上书写字符的额外成本相比,这些C函数本身的额外成本可以忽略不计。所以除了一些特殊情况,这个方法对程序员不会有太大帮助。

使用具有快速打印功能的软件包或函数库。

这可能是最简单的有效提高写屏速度的方法。你可以得到这样一个软件包,它要么用一个更快的版本取代编译器固有的打印功能,要么提供一些更快的打印功能。

这种方法让程序员的工作变得非常轻松,因为他几乎不需要修改自己的程序,就可以使用别人花了很多时间优化的代码。这种方法的缺点是,这些代码可能属于另一个程序员,在你的程序中使用它们可能会很昂贵。此外,您可能无法将您的程序移植到另一个平台,因为该平台上可能没有相应的软件包。

反正这是程序员实用有效的方法。

跳过操作系统,直接写屏幕。

由于许多原因,这种方法有时并不令人满意。其实这种方法在一些电脑和操作系统上是无法实现的。此外,这种方法的具体实现通常因计算机而异,即使在同一台计算机上,编译器之间也会有所不同。

反正为了提高视频输出速度,直接写屏是非常有必要的。对于全屏文本,每秒钟可以写几百个屏幕。如果你需要这样的性能(也许是为了视频游戏),采用这种方式是值得的。

因为每个计算机和操作系统处理这个问题的方式不同,所以编写一个适用于所有操作系统的程序是不现实的。下面将描述如何在MS-DOS下用Borland c实现这种方法。即使你不使用这些系统,你也应该能从下面学到正确的方法,这样你就能在你的电脑和操作系统上编写类似的程序。

首先,你需要某种方式在屏幕上写数据。您可以创建一个指向视频缓冲区的指针。当在MS-DOS下使用Borland C时,这可以通过以下语句实现:

char far*Sereen=MK_FP(0xb800,ox 0000);

远指针指向的地址并不局限于程序的数据段,它可以指向内存中的任何地方。MK_FP()生成一个指向指定位置的远指针。其他编译器和计算机不需要区分指针的类型,或者没有类似的功能。你应该在编译器手册中查找相应的信息。

现在,你有一个指针“指向”屏幕的左上角。只要向指针所指的内存位置写入几个字节,相应的字符就会从屏幕的左上角显示出来。以下程序会执行此操作:

#包括

主()

{

int a:

char far*Screen=MK_FP(Oxb800 .Ox0000):

  for(a=0;a

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 用户界面——屏幕和键盘

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情