文档章节

C Primer Plus 第8章 字符输入/输出和输入确认 8.11 编程练习答案

idreamo
 idreamo
发布于 2016/07/05 07:04
字数 1715
阅读 381
收藏 0

1、设计一个程序,统计从输入到文件结尾为止的字符数。

#include <stdio.h>

int main(void)
{
 int i;
 for(i=0; getchar() != EOF; i++);
 printf("There are %d char",i);
 return 0;
}

2、编写一个程序,把输入作为字符流读取,直到遇到EOF。令该程序打印每个输入字符及其ASCII编码的十进制值。注意在ASCII序列中空格字符 前面的字符 是非打印字符,要特殊处理这些字符。如果非打印字符是换行符或制表符,则分别打印\n或\t。否则,使用控制字符符号。例如,ASCII 的1是ctrl+A,可以显示为^A。注意A的ASCII值是ctrl+A的值加64。对其他非打印字符也保持相似的关系。除每次遇到一个换行符时就开始一个新行之外,每行打印10对值。

#include <stdio.h>

int main(void)
{
 char ch;
 int i;
 for(i=1; (ch=getchar()) != EOF; i++)
 {
  if (ch >= ' ' || ch == '\n' || ch == '\t')
    printf("%-5c",ch);
  else
    printf("^%-4c",ch+64);
  printf("%-5d",ch);
  if(i%8 == 0) printf("\n");
 }
 return 0;
}

3、编写一个程序,把输入作为字符流读取,直到遇到EOF。令其报告输入中的大写字母个数和小写字母个数。假设小写字母 的数值是连续的,大写字母也是如此。或者你可以使用ctype.h库中合适的函数来区分大小写。

#include <stdio.h>
#include <ctype.h>
int main(void)
{
    char ch;
    int i,l=0,u=0;

    for (i=0;(ch=getchar())!='#';i++)
        {
        if(islower(ch))
            l++;
        else if (isupper(ch))
            u++;
        else printf("%c is not a char !\n",ch);
        }

    printf("There are %d chars, lower is %d,upper is %d.\n",i,l,u);

    return 0;
}

4、 编写一个程序,把输入作为字符流读取,直到遇到EOF。令其报告每个单词的平均字母数。不要将空白字符记为单词中的字母。实际上标点符号也不应该计算,但现在不必考虑这一点(如果您想做的好一些,可以考虑使用ctype.h中的ispunct()函数)。

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
#define STOP '|'
int main (void)
{
    char c;              //读入字符
    char prev;           //前一个读入字符
    long n_chars = 0L;   //字符数
    int n_lines = 0;     //行数
    int n_words = 0;     //单词数
    int p_lines = 0;     //不完整的行数
    bool inword = false; //标志:如果c在一个单词中,则inword等于true

    printf("Enter text to be analyzed (| to terminate): \n");
    prev='\n';           //用于识别完整的行
    while ((c=getchar())!=STOP)
    {
        n_chars++;       //统计字符
        if (c=='\n')
            n_lines++;   //统计行数
        if(!isspace(c) && !inword)//如果c不是空白字符,且c不在一个单词里
        {
            inword = true;//开始一个新单词
            n_words++;    //统计单词
        }
        if(isspace(c) && inword)
            inword = false;//到达单词尾部
        prev = c;          //保存字符值
    }

    if(prev!='\n')
        p_lines = 1;
    printf("characters = %ld,words = %d,lines = %d ",
           n_chars,n_words,n_lines);
    printf("partial lines = %d\n",p_lines);
    return 0;
}

5、修改程序清单8.4中的猜测程序,使其使用更智能的猜测策略。例如,程序最初猜50,让其询问用户该猜测值是大是小还是正确。如果该猜测值小,则下一次猜测值为50和100的中值,即75.如果75大,则下一次猜测75和50的中值,等等。使用这种二分搜索策略。起码如果用户没有欺骗,该程序很快会获得正确答案。

#include <stdio.h>
int main (void)
{
    int guess,max=100,min=1;
    char response;
    printf("Pick an integer from 1 to 100.I will try to guess ");
    printf("it.\nRespond with a b if my guess is big and with");
    printf("\nan l if it is little.\n");
    printf("Also,Respond a y if it is right.\n");
    printf("Uh...is your number %d?\n", guess = ( max + min ) / 2 );
    while ((response=getchar())!='y')
    {
        if(response=='b')
        {
            max=guess-1;
            printf("Well,then,is it %d?\n",guess = ( max + min ) / 2 );
        }
        else if (response=='l')
        {
            min=guess+1;
            printf("Well,then,is it %d?\n",guess = ( max + min ) / 2 );
        }
        else
            printf("Sorry,I understand only y or n.\n");
        while(getchar() != '\n');
    }
    printf("I know I cloud do it.\n");
    return 0;
}

6、修改程序清单8.8中的get_first()函数,使其返回遇到的第一个非空白字符,在一个简单的程序中测试该函数。

#include <stdio.h>
char get_first(void);
int main (void)
{
    char ch;

    while ((ch=get_first())!=EOF)
    {
        putchar(ch);
    }
    return 0;
}

char get_first(void)
{
    int ch;
    while (isspace(ch=getchar())); /*获取一个字符并赋给ch,如果是空白字符则被丢弃*/
    while (getchar()!='\n');/*跳过本行剩余部分*/
    return ch;
}

7、修改第7单中的练习8,使菜单选项由字符代替数字进行标记。

#include<stdio.h>
#include<ctype.h>
char get_first(void);

//b.加班
#define TIME 40  //加班(超过TIME小时) =
#define ADD  1.5  //ADD倍的时间
//c.税率
#define LIMIT1 300  //前LIMIT1美元为RATE1
#define RATE1 0.15 
#define LIMIT2 150  //下一个LIMIT2美元为RATE2
#define RATE2 0.20
#define RATE3 0.25 //余下的位RATE3

int main(void)
{
 double basic,hours,gross,tax;
 printf("Enter the number corresponding to the desired pay rate or action:\n");
 printf("1) $8.75/hr\t\t\t2) $9.33/hr\n");
 printf("3) $10.00/hr\t\t\t4) $11.20/hr\n");
 printf("5) quit\n");
 switch( get_first() )
 {
 case '1': basic = 8.75; break;
 case '2': basic = 9.33; break;
 case '3': basic = 10.00; break;
 case '4': basic = 11.20; break;
 default: printf("quit\n"); return(0); //退出程序
 }
 printf("you have select $%.2lf\n",basic);
 printf("input the work hours of a week:");
 scanf("%lf",&hours);
 if (hours > 40) hours = 40 + (hours - 40) * 1.5;
 gross = hours * basic;
 printf("gross income:\t\t%lf\n",gross);
 if (gross <= LIMIT1) tax = gross * RATE1;
 else if (gross <= LIMIT2) tax = LIMIT1 * RATE1 + (gross - LIMIT1) * RATE2;
 else tax = LIMIT1 * RATE1 + LIMIT2 * RATE2 + (gross - LIMIT1 - LIMIT2) * RATE3;
 printf("tax:\t\t\t%lf\n",tax);
 printf("net income:\t\t%lf\n",gross - tax);
 return(0);
}

char get_first(void) //得到字符串中的第一个非空字符
{
 int ch;
 while( isspace( ch = getchar() ) );
 while ( getchar() != '\n');
 return ch;
}

8、编写一个程序,显示一个菜单,为您提供加法、减法、乘法或除法的选项。获得您的选择后,该程序请求两个数,然后执行您选择的操作。该程序应该只接受它所提供的菜单选项。它应该使用float类型的数,并且如果用户未能输入数字应允许其重新输入。在除法的情况中,如果用户输入0作为第二个数,该程序应该提示用户输入一个新的值。

#include <stdio.h>
char get_choice(void);
char get_first(void);
float get_float(void);
int main(void)
{
    char choice;
    float num1,num2;

    while((choice=get_choice())!='q')
    {
         printf("Enter first number:");
         num1 = get_float();
         printf("Enter second number:");
         num2 = get_float();
         while( choice == 'd' && num2 == 0)
         {
              printf("Enter a number other than 0:");
              num2 = get_float();
         }

        switch (choice)
        {
            case 'a': printf("%.2f + %.2f = %.2f\n",num1, num2, num1 + num2);
                break;
            case 's': printf("%.2f - %.2f = %.2f\n",num1, num2, num1 - num2);
                break;
            case 'm': printf("%.2f * %.2f = %.2f\n",num1, num2, num1 * num2);
                break;
            case 'd': printf("%.2f / %.2f = %.2f\n",num1, num2, num1 / num2);
                break;
            default: break;
        }
    }
    printf("Bye.\n");
    return 0;
}

char get_choice(void)  /*显示选项,并返回选项*/
{
    char choice;
    printf("Enter the operation of your choice:\n");
    printf("a.add            s.subtract:\n");
    printf("m.multiply       d.divide\n");
    printf("q.quit\n");
    choice = get_first();
    while( choice != 'a' && choice != 's' && choice != 'm' && choice != 'd' && choice != 'q')
    {
        printf("Please respond with  a,s,m,d, or q.\n");
        choice=get_first();
    }
    return choice;
}

char get_first(void)
{
    int ch;
    while( isspace( ch = getchar() ) );
    while ( getchar() != '\n');
    return ch;
}

float get_float(void)
{
    float num;
    char str[40];

    while ((scanf("%f",&num))!=1)
    {
        gets(str);
        printf("%s is not a number.\n",str);
        printf("Please enter a number such as 2.5, -1.78E8, or 3:");
    }
    while (getchar()!='\n');  /*不要忘记跳过多余的输入部分*/
    return num;
}

 

© 著作权归作者所有

idreamo
粉丝 18
博文 139
码字总数 224743
作品 0
青岛
产品经理
私信 提问
C Primer Plus(5版)第8章编程题1_重定向实现

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

石家的鱼
2017/07/11
0
0
C Primer Plus 第9章 函数 9.11 编程练习答案

1、设计函数min(x,y)返回两个double数值中较小的数值,同时用一个驱动程序测试该函数。 2、 设计函数chline(ch,i,j),实现指定字符在i列到j列的输出,同时用一个驱动程序测试该函数。 3、编写...

idreamo
2016/07/19
348
0
C Primer Plus 第11章 11.13 编程练习答案

1、设计并测试一个函数,可以从输入读取n个字符(包括空格、制表符和换行符),把结果存储在一个数组中,这个数组的地址通过参数来传递。 2、修改并测试练习1中的函数,使得可以在n个字符后,...

idreamo
2016/09/22
699
0
C Primer Plus 第4章 字符串和格式化输入/输出 编程练习及答案

1、编写一个程序,要求输入名字和姓氏,然后以“名字,姓氏”格式输出。 2、编写一个程序,要求输入名字,并执行以下操作: a.把名字引在双引号中打印出来; b.在宽度为20个字符的字段内打印...

idreamo
2016/05/17
70
0
C Primer Plus(5版)第8章习题讲解(三)

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

石家的鱼
2017/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
4
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
9
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
8
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
7
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
8
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部