文档章节

C Primer Plus 第8章 字符输入/输出和输入确认 8.6 输入确认

idreamo
 idreamo
发布于 2016/06/30 06:34
字数 1054
阅读 52
收藏 0

程序清单8.7  使用两个函数来向一个算术函数传送整数,该函数计算特定范围内所有整数的平方和。程序限制这个特定范围的上界不应该超过1000,下界不应该小于-1000。

/*checking.c --输入确认*/
#include <stdio.h>
#include <stdbool.h>
//确认输入了一个整数
int get_int(void);
//确认范围的上下界是否有效
bool bad_limits (int begin,int end,int low,int high);
//计算从a到b之间的整数的平方和
double sum_squares(int a,int b);
int main (void)
{
    const int MIN = -1000;  //范围的下界限制
    const int MAX = +1000;  //范围的上界限制
    int start;              //范围的下界
    int stop;               //范围的上界
    double answer;

    printf("This program computes the sum of the squares of "
           "integers in a range.\nThe lower bound should not "
           "be less than -1000 and \nthe upper bound should not "
           "be more than +1000.\nEnter the limits (enter 0 for "
           "both limits to quit):\nlower limit: ");  //注意printf()的换行方式
    start = get_int();
    printf("upper limit:");
    stop = get_int();
    while(start!=0 || stop!=0)
    {
        if(bad_limits(start,stop,MIN,MAX))
            printf("please try again.\n");
        else
        {
            answer = sum_squares(start,stop);
            printf("The sum of the squares of the integers from ");
            printf("from %d to %d is %g\n",start,stop,answer);
        }
        printf("Enter the limits (enter 0 for both limits to quit): \n");
        printf("lower limit: ");
        start = get_int();
        printf("upper limit: ");
        stop = get_int();
    }
    printf("Done.\n");

    return 0;
}

int get_int (void)
{
    int input ;
    char ch;

    while(scanf("%d",&input)!=1)
    {
        while((ch=getchar())!='\n')
            putchar(ch);  //剔除错误的输入
        printf(" is not an integer .\nPlease enter an ");
        printf("integer value ,such as 25, -178, or 3: ");
    }
    return input;
}

double sum_squares (int a ,int b)
{
    double total = 0;
    int i ;

    for(i=a;i<=b;i++)
        total += i*i;

    return total;
}

bool bad_limits(int begin,int end,int low,int high)
{
    bool not_good = false;
    if(begin>end)
    {
        printf("%d isn't smaller than %d.\n",begin,end);
        not_good=true;
    }
    if(begin<low || end<low)
    {
        printf("Values must be %d or greater.\n",low);
        not_good = true;
    }
    if(begin>high || end>high)
    {
        printf("Values must be %d or less.\n",high);
        not_good = true;
    }
    return not_good;
}

8.6.1 分析程序

首先集中讨论程序的整体结构。

我们已经遵循了一种模块化的方法,使用独立的函数(模块)来确认输入和管理显示。程序越大,使用模块化的方法进行编程就越重要。

main()函数管理流程,为其他函数指派任务。它使用get_int()来获取值,用while循环来处理这些值,用bad_limits()函数来检查值的有效性,sum_squares()函数则进行实际的计算;

8.6.2 输入流和数值

考虑如下输入 :

is    28  12.4

在您的眼中,该 输入是一串字符后面跟着一个整数,然后是一个浮点值。对C程序而言,该 输入 是一个字节流。第一个字节是字母i的字符编码,第二个字节是字母s的字符编码,第三个字节是空格字符的字符编码,第四个字节是数字2的字符编码,等等。所以如果get_int()遇到这一行,则下面的代码将读取并丢弃整行,包括数字,因为这些数字只是该行中的字符而已:

while((ch=get())!='\n')  putchar(ch);

虽然输入流由字符组成,但如果您指示了scanf()函数,它就可以将这些字符转换成数值。例如,考虑下面的输入:

42

如果您在scanf()中使用%c说明符,该函数将只读取字符4并将其存储在一个char类型的变量中。如果您使用%s说明符,该 函数会读取两个字符,即字符4和字符2,并将它们存储在一个字符串中。如果使用%d说明 符,则scanf()读取同样的两个字符,但是随后它会继续计算与它们相应的整数值为4X10+2,即42然后将该 整数的二进制表示保存在一个int 变量中。如果使用%f说明符,则scanf()读取这两个字符,计算它们对应的数值42,然后以内部浮点表示法表示该 值,并将结果保存在一个float变量中。

简言之,输入由字符组成,但scanf()可以将输入转换成整数或浮点值。使用像%d或%f这样的说明符能限制可接受的输入的字符类型,但getchar()和使用%c的scanf()接受任何字符。

© 著作权归作者所有

idreamo
粉丝 18
博文 139
码字总数 224743
作品 0
青岛
产品经理
私信 提问
C Primer Plus 第8章 字符输入/输出和输入确认 8.5 创建更友好的界面

8.5.1 使用缓冲输入 问题在于缓冲输入需要您按下回车键来提交您的输入。这一动作还传输一个程序必须处理的换行符。您必须使程序至少能够处理这种情况 。 程序清单8.4 guess.c程序 8.5.2 混合...

idreamo
2016/06/29
72
0
C Primer Plus(5版)第8章编程题1_重定向实现

小伙伴们,对C语言编程有疑问的,可以加微信交流:poo_poo或者扫描我的头像,验证时请注明是“知友” 一、题目描述 本题是第8章编程题的第一道题,题目如下: 二、题目及思路分析 从题述来看...

石家的鱼
2017/07/11
0
0
C Primer Plus 第8章 字符输入/输出和输入确认 8.3 重定向和文件

输入和输出涉及到函数、数据和设备。例如,考虑echo_eof.c程序。该程序使用了输入函数getchar()、输入设备(我们已经假设)是键盘,输入数据流由单独的字符组成。假设您希望保持相同的输入函...

idreamo
2016/06/28
164
0
C Primer Plus(5版)第8章习题讲解(三)

小伙伴们,对C语言编程有疑问的,可以加微信交流:poo_poo或者扫描我的头像,验证时请注明是“知友” 第8章的复习题还剩下6、7、8三题没有讲解了。本文讲下第6、8题,第7题先不讲了。 1. 第6...

石家的鱼
2017/07/11
0
0
C Primer Plus 第8章 字符输入/输出和输入确认 8.1 单字符I/O

8.1 单字符I/O:getchar()和putchar() getchar()和putchar()每次输入和输出一个字符。 程序8.1 echo.c程序 ANSI C 将stdio.h头文件与使用getchar()和putchar()相关联,这就是我们在程序中将该...

idreamo
2016/06/26
15
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部