C Primer Plus 第8章 字符輸入/輸出和輸入確認 8.11 編程練習答案

一、設計一個程序,統計從輸入到文件結尾爲止的字符數。ide

#include <stdio.h>

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

二、編寫一個程序,把輸入做爲字符流讀取,直到遇到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;
}

三、編寫一個程序,把輸入做爲字符流讀取,直到遇到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;
}

四、 編寫一個程序,把輸入做爲字符流讀取,直到遇到EOF。令其報告每一個單詞的平均字母數。不要將空白字符記爲單詞中的字母。實際上標點符號也不該該計算,但如今沒必要考慮這一點(若是您想作的好一些,能夠考慮使用ctype.h中的ispunct()函數)。ui

#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;
}

五、修改程序清單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;
}

六、修改程序清單8.8中的get_first()函數,使其返回遇到的第一個非空白字符,在一個簡單的程序中測試該函數。spa

#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單中的練習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;
}

八、編寫一個程序,顯示一個菜單,爲您提供加法、減法、乘法或除法的選項。得到您的選擇後,該程序請求兩個數,而後執行您選擇的操做。該程序應該只接受它所提供的菜單選項。它應該使用float類型的數,而且若是用戶未能輸入數字應容許其從新輸入。在除法的狀況中,若是用戶輸入0做爲第二個數,該程序應該提示用戶輸入一個新的值。code

#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;
}
相關文章
相關標籤/搜索