C prime plus第八章(字符控制)编程练习 --第五版

C prime plus第八章(字符控制)编程练习 –第五版

C 语言编程练习都为本人学习时的编写代码记录或学习笔记,若有不当之处欢迎指正,感激不尽。(其中题型当然可能有其他编程设计方案;因为本人仅在学习中,所以只做个人学习记录。)



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

#include

int main(void)
{
    int i;
    char ch;
    for(i = 0; (ch = getchar()) != EOF; i++);
    printf("COUNT = %d \n", i);
    printf("%d\n", ch);
    return 0;
}


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

#include

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 % 10 == 0)
            printf("\n");
    }
    return 0;
}


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

#include
#include

int main(void)
{
    char ch;
    int l = 0, u = 0;

    printf("Please input some characters:\n");
    while((ch = getchar()) != EOF) {
        if(islower(ch))
            l++;
        if(isupper(ch))
            u++;
    }
    printf("\nlower letter = %d,\nupper letter = %d.\n", l, u);

    return 0;
}


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

#include
#include
#include

int main(void)
{
    char ch;
    int word = 0, i = 0;
    bool inword = false;

    while((ch = getchar()) != EOF) {
        if(!ispunct(ch) && !isspace(ch))
            i++;
        if(isspace(ch) && !inword) {
            inword = true;
            word++;
        }
        if(!isspace(ch) && inword)
            inword = false;
    }
    printf("\ni: %d\nword: %d\naverage: i/word = %f\n", i, word, (float)i / (float)word);
    return 0;
}


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

#include

int main(void)
{
    int guess, max, min;
    min = 0, max = 100;
    char res; /* res-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((res = getchar()) != 'y') /* 获取用户响应并和y比较 */ {
        if(res == 'b') {
            max = guess - 1;
            printf("Well, then, is it %d?\n", guess = (max + min)/2);
        }

        if(res == '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 knew I could do it!\n");

    return 0;
}


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

#include
#include

char get_first(void);

int main(void)
{
    char ch;

    while((ch = getchar()) != EOF) {
        putchar(ch);
    }

    return 0;
}

char get_first(void)
{
    int ch;

    while(isspace(ch = getchar()));

    while(getchar() != '\n');
    return ch;
}


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

#include
#define TIME 40             //正常工作时间
#define ADD 1.5             //加班的折算时间倍数
#define L1 300              //工资额度1
#define RATE1 0.15          //L1的税率
#define L2 150              //工资额度2
#define RATE2 0.20          //L2的税率
#define RATE3 0.25          //余下工资额度的税率
int main(void)
{
    double h, g, t, BASIC;
    int d;
    char n;
    //h-hours,g-gross,t-tax,d-data

    for(d = 0; d < 69; d++)
        printf("*");
    printf("\n\n");

    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\n");

    for(d = 0; d < 69; d++)
        printf("*");
    printf("\n");
    n = getchar();
    while(getchar() != '\n' );
    while(1) {
        while( n < '1' || n > '5') {
            printf("error,it's wrong number,please input again!(1-5):\n");
            n = getchar();
        }
        switch(n) {
            case '1': BASIC = 8.75;
                break;
            case '2': BASIC = 9.33;
                break;
            case '3': BASIC = 10.00;
                break;
            case '4': BASIC = 11.20;
                break;
            case '5': printf("quit!\n");
                return 0;
        }

        printf("input the work hours of a week:\n");
        scanf("%lf", &h);
        if(h > 40)
            h = 40 + (h - 40) * ADD;
        g = h * BASIC;
        if(g <= L1)
            t = g * RATE1;
        else if(g <= L2)
            t = g * RATE1 + (g - L1) * RATE2;
        else
            t = g * RATE1 + (g - L1) * RATE2 + (g - L1 - L2) * RATE3;
        printf("gross income = %lf\n", g);
        printf("tax = %lf\n", t);
        printf("net income = %lf\n", g - t);
        printf("Please input your selection(1~4) again!(type 5 to quit).\n");
        while(getchar() != '\n');
        n = getchar();
    }
    return 0;
}


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

C prime plus第八章(字符控制)编程练习 --第五版_第1张图片

#include
#include

float get_float(void);
char get_first(void);


int main(void)
{
    char se ;       /* select */
    float n1, n2;   /* number1, number2 */

    while(1) {
        printf("Enter the operation of your choice:\n");
        printf("a. add\t\t\ts. subtract\n");
        printf("m. multiply\t\td. divide\n");
        printf("q. quit\n");
        se = get_first();

        if(se != 'a' && se != 's' && se != 'm' && se != 'd') {
            printf("Bye!.\n");
            break;
        }

        printf("Enter first number:");
        n1 = get_float();
        printf("Enter second number:");
        n2 = get_float();

        while(se == 'd' && n2 == 0) {
            printf("Enter a number other than 0:");
            n2 = get_float();
        }
        switch(se) {
            case 'a': printf("%.2f + %.2f = %.2f\n", n1, n2, n1 + n2);
                    break;
            case 's': printf("%.2f - %.2f = %.2f\n", n1, n2, n1 - n2);
                    break;
            case 'm': printf("%.2f * %.2f = %.2f\n", n1, n2, n1 * n2);
                    break;
            case 'd': printf("%.2f / %.2f = %.2f\n", n1, n2, n1 / n2);
                    break;
            default:
                    break;
    }

    return 0;
}

float get_float(void)       /* 得到一个合适的浮点数 */
{
    float n;
    char str[40];
    while(scanf("%f", &n) != 1) {
        fgets(str, 40, stdin);
        printf("%s is not a number.\n", str);
        printf("Please enter a number, such as 3.2 -1.34E5, or 2:");
    }
    while(getchar() != '\n');

    return n;
}

char get_first(void)  /* 只获取字符串首字符 */
{
    int ch;

    while(isspace(ch = getchar()));
    while(getchar() != '\n');
    return ch;
}

你可能感兴趣的:(linux,C,C,prime,--第五,字符串输入/输出和输入确定,GCC编译环境测试)