学C51的基础6 《 输入输出函数及控制流程语句 》

发布者:HarmonyJoy最新更新时间:2015-03-12 来源: laogu关键字:C51  输入输出函数  控制流程语句 手机看文章 扫描二维码
随时随地手机看文章
输入输出函数及控制流程语句

    本节主要介绍Turbo C2.0标准输入输出函数和文件的输入输出函数。通过本节的学习可以使读者掌握Turbo C2.0的屏幕输出、
键盘输入输出以及磁盘文件的读写函数, 并能开始进行一些简单的程序的编写。
    控制流程语句主要包括: 条件语句、循环语句和开关语句。

    1.1  标准输入输出函数

    1.1.1 格式化输入输出函数
    Turbo C2.0 标准库提供了两个控制台格式化输入、 输出函数printf( ) 和scanf(), 这两个函数可以在标准输入输出设备上
以各种不同的格式读写数据。printf()函数用来向标准输出设备(屏幕)写数据;  scanf() 函数用来从标准输入设备(键盘)上读数
据。下面详细介绍这两个函数的用法。
    一、printf()函数
    printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()
函数的调用格式为:
      printf("<格式化字符串>", <参量表>);
    其中格式化字符串包括两部分内容: 一部分是正常字符,  这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始,
后跟一个或几个规定字符, 用来确定输出内容格式。
    参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用","分开, 且顺序一
一对应,  否则将会出现意想不到的错误。
    1. 格式化规定符
    Turbo C2.0提供的格式化规定符如下:
━━━━━━━━━━━━━━━━━━━━━━━━━━
   符号                  作用
──────────────────────────
    %d              十进制有符号整数
    %u              十进制无符号整数
    %f              浮点数
    %s              字符串
    %c              单个字符
    %p              指针的值
    %e              指数形式的浮点数
    %x, %X          无符号以十六进制表示的整数
    %0              无符号以八进制表示的整数
    %g              自动选择合适的表示法
━━━━━━━━━━━━━━━━━━━━━━━━━━
    说明:
    (1). 可以在"%"和字母之间插进数字表示最大场宽。
     例如:  %3d   表示输出3位整型数, 不够3位右对齐。
            %9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6,小数点占一位, 不够9位右对齐。
            %8s   表示输出8个字符的字符串, 不够8个字符右对齐。

    如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。但对浮点数, 若整数部分位数超过了说明的整数位
宽度, 将按实际整数位输出; 若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。
    另外, 若想在输出值前加一些0, 就应在场宽项前加个0。
    例如:   %04d  表示在输出一个小于4位的数值时, 将在前面补0使其总宽度为4位。
    如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度, 小数点前的数字代表最小宽度。
    例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。
    (2). 可以在"%"和字母之间加小写字母l, 表示输出的是长型数。
    例如:   %ld   表示输出long整数
            %lf   表示输出double浮点数
    (3). 可以控制输出左对齐或右对齐, 即在"%"和字母之间加入一个"-" 号可说明输出为左对齐,否则为右对齐。
    例如:   %-7d  表示输出7位整数左对齐
            %-10s 表示输出10个字符左对齐
    2. 一些特殊规定字符
━━━━━━━━━━━━━━━━━━━━━━━━━━
    字符                           作用
──────────────────────────
                        换行
     f                   清屏并换页
                        回车
                        Tab符
     xhh                 表示一个ASCII码用16进表示,
                          其中hh是1到2个16进制数
━━━━━━━━━━━━━━━━━━━━━━━━━━
    由本节所学的printf()函数, 并结合上一节学习的数据类型,编制下面的程序, 以加深对Turbo C2.0数据类型的了解。

    例1

     #include
     #include
     int main()
     {
          char c, s[20], *p;
          int a=1234, *i;
          float f=3.141592653589;
          double x=0.12345678987654321;
          p="How do you do";
          strcpy(s, "Hello, Comrade");
          *i=12;
          c=''x41'';
          printf("a=%d ", a);     /*结果输出十进制整数a=1234*/
          printf("a=%6d ", a);    /*结果输出6位十进制数a=  1234*/
          printf("a=%06d ", a);   /*结果输出6位十进制数a=001234*/
          printf("a=%2d ", a);    /*a超过2位, 按实际值输出a=1234*/
          printf("*i=%4d ", *i);  /*输出4位十进制整数*i=  12*/
          printf("*i=%-4d ", *i); /*输出左对齐4位十进制整数*i=12*/
          printf("i=%p ", i);     /*输出地址i=06E4*/
          printf("f=%f ", f);     /*输出浮点数f=3.141593*/
          printf("f=6.4f ", f);   /*输出6位其中小数点后4位的浮点数 f=3.1416*/
          printf("x=%lf ", x);    /*输出长浮点数x=0.123457*/
          printf("x=%18.16lf ", x);/*输出18位其中小数点后16位的长浮点数 x=0.1234567898765432*/
          printf("c=%c ", c);     /*输出字符c=A*/
          printf("c=%x ", c);     /*输出字符的ASCII码值c=41*/
          printf("s[]=%s ", s);   /*输出数组字符串s[]=Hello, Comrade*/
          printf("s[]=%6.9s ", s);/*输出最多9个字符的字符串s[]=Hello, Co*/
          printf("s=%p ", s);     /*输出数组字符串首字符地址s=FFBE*/
          printf("*p=%s ", p);    /* 输出指针字符串p=How do you do*/
          printf("p=%p ", p);     /*输出指针的值p=0194*/
          getch();
          retunr 0;
     }

    上面结果中的地址值在不同计算机上可能不同。

    例1.中第一条语句#include的含义是调用另一个文件stdio.h, 这是一个头文件, 其中包括全部标准输入输出库函数
的数据类型定义和函数说明。 Turbo C2.0对每个库函数便用的变量及函数类型都已作了定义与说明, 放在相应头文件"*.h"中, 用
户用到这些函数时必须要用#include<*.h>或#include"*. h" 语句调用相应的头文件, 以供连接。若没有用此语句说明, 则连接时
将会出现错误。

二、scanf()函数
    scanf()函数是格式化输入函数, 它从标准输入设备(键盘) 读取输入的信息。 其调用格式为:
      scanf("<格式化字符串>", <地址表>);
    格式化字符串包括以下三类不同的字符;
    1. 格式化说明符: 格式化说明符与printf()函数中的格式说明符基本相同。
    2. 空白字符: 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。
    3. 非空白字符: 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。地址表是需要读入的所有变
       量的地址, 而不是变量本身。这与printf()函数完全不同, 要特别注意。各个变量的地址之间同","分开。

    例2:

     main()
     {
          int i, j;
          printf("i, j=? ");
          scanf("%d, %d", &i, &j);
     }

    上例中的scanf()函数先读一个整型数, 然后把接着输入的逗号剔除掉, 最后读入另一个整型数。如果","这一特定字符没有找
到, scanf()函数就终止。若参数之间的分隔符为空格, 则参数之间必须输入一个或多个空格。
    说明:
    (1). 对于字符串数组或字符串指针变量, 由于数组名和指针变量名本身就是地址, 因此使用scanf()函数时, 不需要在它们前
面加上"&"操作符。

    例3

     mian()
     {
          char *p, str[20];
          scanf("%s", p);          /*从健盘输入字符串*/
          scanf("%s", str);
          printf("%s ", p);       /*向屏幕输出字符串*/
          printf("%s ", str);
     }

    (2). 可以在格式化字符串中的"%"各格式化规定符之间加入一个整数, 表示任何读操作中的最大位数。如例3中若规定只能输入
10字符给字符串指针p, 则第一条scanf() 函数语句变为
          scanf("%10s", p);
    程序运行时一旦输入字符个数大于10, p就不再继续读入, 而后面的一个读入函数即scanf("%s", str)就会从第11个字符开始
读入。实际使用scanf()函数时存在一个问题, 下面举例进行说明:
    当使用多个scanf()函数连续给多个字符变量输入时, 例如:

     main()
     {
          char c1, c2;
          scanf("%c", &c1);
          scanf("%c", &c2);
          printf("c1 is %c, c2 is %c", c21, c2);
     }

    运行该程序, 输入一个字符A后回车 (要完成输入必须回车), 在执行scanf("%c", &c1)时, 给变量c1赋值"A", 但回车符仍然
留在缓冲区内, 执行输入语句scanf("%c", &c2)时, 变量c2输出的是一空行,如果输入AB后回车, 那么输出结果为:
       c1 is A, c2 is B。
    要解决以上问题, 可以在输入函数前加入清除函数fflush()( 这个函数的使用方法将在本节最后讲述)。修改以上程序变成:

     #include
     main()
     {
          char c1, c2;
          scanf("%c", &c1);
          fflush(stdin);
          scanf("%c", &c2);
          printf("c1 is %c, c2 is %c", c1, c2);
     }
[page]
    1.1.2 非格式化输入输出函数
    非格式化输入输出函数可以由上面讲述的标准格式化输入输出函数代替, 但这些函数编译后代码少, 相对占用内存也小, 从而
提高了速度, 同时使用也比较方便。下面分别进行介绍。
    一、puts()和gets()函数
    1. puts()函数
    puts()函数用来向标准输出设备(屏幕)写字符串并换行, 其调用格式为:
        puts(s);
    其中s为字符串变量(字符串数组名或字符串指针)。
    puts()函数的作用与语printf("%s ", s)相同。

    例4:

     main()
     {
          char s[20], *f;                 /*定义字符串数组和指针变量*/
          strcpy(s, "Hello! Turbo C2.0"); /*字符串数组变量赋值*/
          f="Thank you";                  /*字符串指针变量赋值*/
          puts(s);
          puts(f);
     }

    说明:
    (1). puts()函数只能输出字符串, 不能输出数值或进行格式变换。
    (2). 可以将字符串直接写入puts()函数中。如:
          puts("Hello, Turbo C2.0");

    2. gets()函数
    gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束, 但回车符不属于这个字符串。其调用格式为:
        gets(s);
    其中s为字符串变量(字符串数组名或字符串指针)。
    gets(s)函数与scanf("%s", &s)相似, 但不完全相同, 使用scanf("%s", &s)函数输入字符串时存在一个问题, 就是如果输入
了空格会认为输入字符串结束, 空格后的字符将作为下一个输入项处理, 但gets() 函数将接收输入的整个字符串直到回车为止。

    例5

     main()
     {
          char s[20], *f;
          printf("What''s your name? ");
          gets(s);                      /*等待输入字符串直到回车结束*/
          puts(s);                      /*将输入的字符串输出*/
          puts("How old are you?");
          gets(f);
          puts(f);
     }

    说明:
    (1). gets(s)函数中的变量s为一字符串。如果为单个字符, 编译连接不会有错误, 但运行后会出现"Null pointer asignmemt"
的错误。

    二、putchar()、getch()、getche()和getchar()函数
    1. putchar()函数
    putchar()函数是向标准输出设备输出一个字符, 其调用格式为:
       putchar(ch);

    其中ch为一个字符变量或常量。
    putchar()函数的作用等同于printf("%c", ch);

    例6:

     #include
     main()
     {
          char c:             /*定义字符变量*/
          c=''B'';              /*给字符变量赋值*/
          putchar(c);         /*输出该字符*/
          putchar(''x42'');    /*输出字母B*/
          putchar(0x42);      /*直接用ASCII码值输出字母B*/
     }

    从本例中的连续四个字符输出函数语句可以分清字符变量的不同赋值方法。

    2. getch()、getche()和getchar()函数
    (1) getch()和getche()函数
    这两个函数都是从键盘上读入一个字符。其调用格式为:
        getch();
        getche();
    两者的区别是: getch()函数不将读入的字符回显在显示屏幕上, 而getche()函数却将读入的字符回显到显示屏幕上。
    例7:

     #include
     main()
     {
          char c, ch;
          c=getch();     /*从键盘上读入一个字符不回显送给字符变量c*/
          putchar(c);    /*输出该字符*/
          ch=getche();   /*从键盘上带回显的读入一个字符送给字符变量ch*/
          putchar(ch);
     }

    利用回显和不回显的特点, 这两个函数经常用于交互输入的过程中完成暂停等功能。

    例8:

     #include
     main()
     {
          char c, s[20];
          printf("Name:");
          gets(s);
          printf("Press any key to confinue...");
          getch();  /*等待输入任一键*/
     }

    (2) getchar()函数
    getchar()函数也是从键盘上读入一个字符, 并带回显。它与前面两个函数的区别在于:getchar()函数等待输入直到按回车才
结束,  回车前的所有输入字符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。
    getchar()函数的调用格式为:

        getchar();

    例9:
     #include
     main()
     {
          char c;
          c=getchar();   /*从键盘读入字符直到回车结束*/
          putchar(c);    /*显示输入的第一个字符*/
          getch();       /*等待按任一健*/
     }
关键字:C51  输入输出函数  控制流程语句 引用地址:学C51的基础6 《 输入输出函数及控制流程语句 》

上一篇:学C51的基础7《 文件的输入输出函数 》
下一篇:学C51的基础5《 运算符 》

推荐阅读最新更新时间:2024-03-16 13:54

c51单片机浮点数及其汇编程序设计
在 单片机 应用系统的数据处理过程中,经常会遇到小数的运算问题,如求解BCD的增量算式、线性化处理等。因此,需要用二进制数来表示小数。表示小数的方法一般有两种,定点数和浮点数。定点数结构简单,与整数的运算过程相同,运算速度快。但随着所表示数的范围的扩大,其位数成倍增加,给运算和存储带来不便,而且也不能保证相对精度不变。浮点数的结构相对复杂,但它能够以固定的字节长度保持相对精度不变,用较少的字节表示很大的数的范围,便于存储和运算,在处理的数据范围较大和要求精度较高时,采用浮点数。 浮点数的概念 常用的科学计数法来表示一个十进制数如 l234.75=1.23475E3=1.23475 103 在数据很大或很小时,采用科学计数避免了
[单片机]
C51单片机对液晶片的驱动
Keil C51编写的192*64液晶片驱动程序,感谢很多网友提供了参考源程序 本程序是在网友们提供的程序基础上改写而成,有很多地方得到高手们的耐 心指导,在此深表谢意。这是一个完整的C51源程序,我觉得对一位初学C51 的人来说,提供一个完整的简单程序比较容易上手。 --------------------------------------------------------------------------------------------------*/ /*写汉字液晶子程 液晶屏分为4行*12列汉字,全部使用模拟接口方式。 /* TGLCMLIMIT64A接口程序(模拟方式) 液晶模块供应商: Email
[单片机]
C51中的 xbyte的使用
The XBYTE macro accesses individual bytes in the external data memory of the 8051. You may use this macro in your programs as follows: #include absacc.h /* Include Macro Definitions */ . . . rval = XBYTE ; XBYTE = 57; . . .This example reads and writes the contents of the byte in external data memory at address 0002h
[单片机]
C51单片机学习笔记(二)——花样流水灯的实现
1.单片机引脚、晶振、复位的作用 复位电路:,复位是单片机的初始化操作。单片机启动时都需要先付薇,其作用是“清零”,也就是CPU和其他部件处于一个确定的初始状态,并从这个初始状态开始。 复位实质上是单片机的复位脚保持很短时间的高电平,按键复位就是通过按键接高电平(按一下的时间已经足够) 时钟电路(晶振):产生时间信号,使单片机按照一定的时间规律进行指令,晶振频率越高,时钟信号的周期就小,单片机运行也就越快。 32个I/O口 P1.0 ~ P1.7 对应1 ~ 8 号引脚 P2.0 ~ P2.7 对应21 ~ 28 号引脚 P3.0 ~ P3.7 对应10 ~ 17 号引脚 P0.0 ~ P0.7 对应39
[单片机]
<font color='red'>C51</font>单片机学习笔记(二)——花样流水灯的实现
Keil C51中的优化级别及优化作用
级别 说明 0 常数合并:编译器预先计算结果,尽可能用常数代替表达式。包括运行地址计算。 优化简单访问:编译器优化访问8051系统的内部数据和位地址。 跳转优化:编译器总是扩展跳转到最终目标,多级跳转指令被删除。 1 死代码删除:没用的代码段被删除。 拒绝跳转:严密的检查条件跳转,以确定是否可以倒置测试逻辑来改进或删除。 2 数据覆盖:适合静态覆盖的数据和位段被确定,并内部标识。BL51连接/定位器可以通 过全局数据流分 ,选择可被覆盖的段。 3 窥孔优化:清除多余的MOV指令。这包括不必要的从存储区加载和常数加载操作。当存 储空间或执行时间可
[单片机]
240x128液晶T6963控制器驱动程序(C51
简介:本文主要介绍了240x128液晶T6963控制器驱动程序(C51)。 #include absacc.h #include math.h #include ASCII816.h //标准ASCII库 #include HZTable.h //汉字点阵库(自做) #include menu.h //菜单库(自做) #define ComPort 0xB101 #define DataPort 0xB000 #define GraphAddr 0x0000 //head of graph //以8*8字符计算,显示屏横向、纵向可以显示的字符个数 //以240*128为例: #define LineChar
[单片机]
基于Keil C51集成开发环境的单片机教学探索
  一、引言   单片机教学改革与实践是为了更好地使学生将所学到的单片机理论知识转化为适应社会发展和就业需要的实际能力的一种教学活动。如今,职业教育的主要任务之一是为社会提供“既懂理论,又懂实践,有一定的研发经验和动手能力的应用型人才”,这种人才当遇到一个开发项目时知道从哪里入手做和怎样做。因此,我们的教学活动就要加强学生实用能力的培养。对于专门培养应用型人才的高职高专院校来讲,更需要重视的是教学中的实际操作训练。   与本科院校相比,离职院校应主要培养应用型人才。高职学院生源质量与本科院校有一定的差距,采用传统的单片机教学方式,不根据课程特点与学生特点,只注重教师讲、学生做,在教学实践中是行不通的。在教学过程中教师应和学生建立良
[单片机]
基于Keil <font color='red'>C51</font>集成开发环境的单片机教学探索
C51 延时程序两种方案
在keil2中修改晶振为22.1184,然后可以测试得到如下两种毫秒延时和秒延时。 方法一: /*实现功能:在22.1184MHZ下的毫秒延时*/ void dmsec (u16 count) { unsigned int i; while (count) { i =230; while (i 0) i--; count--; } } 方法二: /*实现功能:在22.1184MHZ下的大约1秒延时*/ for(i=0;i 1000;i++) { for(j=0;j 230;j++) { ; } } 方法三: /*实现功能:在22.1184MHZ下的大约1秒延时,stc
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved