C Primer Plus (中文版)第8章编程练习答案(供参考~)

C Primer Plus (中文版)第8章编程练习 参考答案

🌴 C Primer Plus 这本书是很多学习C语言小白的入门书籍~ 很经典 目前我也正在学习~ 后期也会把写的题上传上来 大家一起交流学习!! 加油加油!🍭
⭐️代码资源在这儿打包好了,大家可以免费下载领取~
☘️欢迎大家讨论 批评指正~

第1题

🍎1.设计一个程序,统计在读到文件结尾之前读取的字符数。

#include<stdio.h>
int count(void);
int main(void){
    char c;
    int cnt=0;//remember gives an initial value
    printf("please enter:");
    while((c=getchar())!=EOF){
        cnt+=1;
    }
    printf("done!\n");
    printf("the charcters of the files are :%d\n",cnt);
    return 0; 
}
}

第2题

🍐 2.编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。程序打印每个输入的字符及其相应的ASCII十进制值。注意,在ASCII序列中,空格字符前面的字符都是非打印字符,要特殊处理这些字符。如果非打印字符是换行符或制表符,则分别打印\n或\t。否则,使用控制字符表示法。
例如,ASCII的1 是Ctrl+A,可显示为^A。注意,A的ASCII值 是Ctrl+A的值加上 64。其他非打印字符也有类似的关系。 除每次遇到换行符打印新的一行之外,每行打印10对值。(注意:不同的操作系统其控制字符可能不同。)

/*
 * @Description:  编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。
    程序打印每个输入的字符及其相应的ASCII十进制值。

    注意,在ASCII序列中,空格字符前面的字符都是非打印字符,要特殊处理这些字符。
    如果非打印字符是换行符或制表符,则分别打印\n或\t。否则,使用控制字符表示法。
    
    例如,ASCII的1 是Ctrl+A,可显示为^A。注意,A的ASCII值 是Ctrl+A的值加上
    64。其他非打印字符也有类似的关系。
    
    除每次遇到换行符打印新的一行之外,每行打印10对值。
    (注意:不同的操作系统其控制字符可能不同。)

 * @Author: ~光~~
 * @Date: 2023-11-30 11:23:55
 * @LastEditTime: 2023-11-30 11:25:20
 * @LastEditors:  
 */
#include<stdio.h>
void change(int ascii);
int main(void){
    char c;
    int cnt=0;
    printf("please enter:");
    while((c=getchar())!=EOF){
        if(cnt%10==0) printf("\n");
        putchar(c);
        putchar('-');
        change(c);
        cnt++;
    }
    return 0; 
}
void change(int ascii){
    if(ascii=='\t') printf("\\t");
    else if(ascii=='\n') printf("\\n");
    else if (ascii<' ')printf("^%c", ascii + 64);
    else printf("%c ", ascii);
}

第3题

🍌3.编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。该程序
要报告输入中的大写字母和小写字母的个数。假设大小写字母数值是连续
的。或者使用ctype.h库中合适的分类函数更方便。

/*
 * @Description:  编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。该程序
要报告输入中的大写字母和小写字母的个数。假设大小写字母数值是连续
的。或者使用ctype.h库中合适的分类函数更方便。
ctype.h库:
https://blog.csdn.net/qq_23827747/article/details/79705576
 * @Author: ~光~~
 * @Date: 2023-11-30 15:51:01
 * @LastEditTime: 2023-11-30 15:58:30
 * @LastEditors:  
 */
#include<stdio.h>
#include<ctype.h>
int main(void){
    char c;
    int low=0,up=0;
    printf("please enter:");
    while((c=getchar())!=EOF){
        if(islower(c)) low+=1;
        else if(isupper(c)) up+=1;
        else continue;

    }
    printf("done!\n");
    printf("the capital letters are:%d\n the lowercase letters are :%d\n",up,low);
    return 0; 
}

第4题

🍑4.编写一个程序,在遇到EOF之前,把输入作为字符流读取。
该程序要报告平均每个单词的字母数。不要把空白统计为单词的字母。实际上,标点符号也不应该统计,但是现在暂时不同考虑这么多(如果你比较在意这点,考虑使用ctype.h系列中的ispunct()函数)

/*
 * @Description:  编写一个程序,在遇到EOF之前,把输入作为字符流读取。
该程序要报告平均每个单词的字母数。不要把空白统计为单词的字母。实际上,标点
符号也不应该统计,但是现在暂时不同考虑这么多(如果你比较在意这点,
考虑使用ctype.h系列中的ispunct()函数)

ispunct	检查 ch 是否为标点字符,即除字母,数字和空格以外的所有可打印字符

 * @Author: ~光~~
 * @Date: 2023-11-30 16:03:31
 * @LastEditTime: 2023-11-30 17:04:09
 * @LastEditors:  
 */

#include<stdio.h>
#include<ctype.h>
int main(void){
    char c;
    int cnt=0, sum=0;
    int pr=0;//记录字母前一个是不是字母
    //cnt 单词的个数 sum字母的总数
    printf("please enter:");
    while((c=getchar())!=EOF){
        if(isalpha(c)){
            pr++;
            sum+=1;
        }else{
            if(c==' '||c=='\t'){
                if (pr>=1) cnt+=1; 
            }
            pr=0;
        }
       
    }
    printf("done!\n");
    printf("the numbers of the  total letters are:%d\n",sum); 
    printf("the numbers of the the average letters are :%d\n",sum/cnt);
    printf("the number of the words are:%d",cnt); 
    return 0; 
}

第5题

🌿5.修改程序清单8.4的猜数字程序,使用更智能的猜测策略。例如,程序
最初猜50,询问用户是猜大了、猜小了还是猜对了。如果猜小了,那么下一
次猜测的值应是50和100中值,也就是75。如果这次猜大了,那么下一次猜
测的值应是50和75的中值,等等。使用二分查找(binary search)策略,如
果用户没有欺骗程序,那么程序很快就会猜到正确的答案。

/*
 * @Description:  修改程序清单8.4的猜数字程序,使用更智能的猜测策略。例如,程序
最初猜50,询问用户是猜大了、猜小了还是猜对了。如果猜小了,那么下一
次猜测的值应是50和100中值,也就是75。如果这次猜大了,那么下一次猜
测的值应是50和75的中值,等等。使用二分查找(binary search)策略,如
果用户没有欺骗程序,那么程序很快就会猜到正确的答案。
 * @Author: ~光~~
 * @Date: 2023-11-30 17:05:24
 * @LastEditTime: 2023-11-30 17:29:41
 * @LastEditors:  
 */
#include<stdio.h>//使用sleep
#include <unistd.h>
#define NUM  20
int main(void){
    int n=50;
    printf("the correct number is %d\n",NUM);
    printf("=============================\n");
    printf("please enter the number that you want to guess.\n");
    printf("ok~ that's begin!\n");
    while(1){

        printf("the number is %d,",n);
        printf("smaller or bigger?\n");
       
        if(n>NUM){
            printf("the number is bigger!\n");
            n=(NUM+n)/2;
            
        }else if (n<NUM) {
            printf("the number is smaller!\n");
            n=(NUM+n)/2;
        }
        else {
            printf("ok,correct!\n");
            break;
        }
        printf("==============\n");
        sleep(1);
    }
    

    return 0; 
}

第6题

🌺6.修改程序清单8.8中的get_first()函数,让该函数返回读取的第1个非空白字符,并在一个简单的程序中测试。
char get_first(void)
{
int ch;
ch = getchar();
while (getchar() != ‘\n’)
continue;
return ch;
}

/*
 * @Description:  修改程序清单8.8中的get_first()函数,让该函数返回读取的第1个非空
白字符,并在一个简单的程序中测试。
char get_first(void)
{
    int ch;
    ch = getchar();
    while (getchar() != '\n')
    continue;
    return ch;
}
 * @Author: ~光~~
 * @Date: 2023-11-30 17:29:57
 * @LastEditTime: 2023-11-30 18:34:30
 * @LastEditors:  
 */
 #include<stdio.h>
 #include<ctype.h>
 char get_first(void);

 int main(void){
    char t;
    printf("please enter:");
    t=get_first(); 
    printf("t is %c\n",t);
    return 0; 
 }
 
char get_first(void)
{
    int ch;
    while((ch=getchar())!=EOF){
        if (!(ispunct(ch)||isspace(ch))) return ch;
    }
    
}

第7题

🚀 修改第7章的编程练习8,
让程序可以给出一个供选择的工资等级菜单。 使
用switch完成工资等级选择。 运行程序后, 显示的菜单应该类似这样:
a.基本工资 = 1000美元q/小时


Enter the number corresponding to the desired pay rate or action:

  1. $8.75/hr 2) $9.33/hr
  2. $10.00/hr 4) $11.20/hr q) quit

如果选择 1~4 其中的一个数字, 程序应该询问用户工作的小时数。 程序要通过循环运行, 除非用户输入 5。 如果输入 1~5 以外的数字, 程序应提醒用户输入正确的选项, 然后再重复显示菜单提示用户输入。 使用#define创建符号常量表示各工资等级和税率。

/*
 * @Description:  修改第7章的编程练习8,用字符代替数字标记菜单的选项。用q代替5
作为结束输入的标记。
让程序可以给出一个供选择的工资等级菜单。 使
用switch完成工资等级选择。 运行程序后, 显示的菜单应该类似这样:
a.基本工资 = 1000美元/小时
*****************************************************************
Enter the number corresponding to the desired pay rate or action:
1) $8.75/hr 2) $9.33/hr
3) $10.00/hr 4) $11.20/hr
5) quit
*****************************************************************
如果选择 1~4 其中的一个数字, 程序应该询问用户工作的小时数。 程序要通过循环运行, 除非用户输入 5。 如果输入 1~5 以外的数字, 程序应提醒用户输入正确的选项, 然后再重复显示菜单提示用户输入。 使用#define创建符号常量表示各工资等级和税率。
 * @Author: ~光~~
 * @Date: 2023-11-30 18:36:01
 * @LastEditTime: 2023-11-30 18:36:08
 * @LastEditors:  
 */
#include<stdio.h>
#include<ctype.h>
#define BASIC_SALARY 1000
float t(char n,int hour);//返回tax的值
char get_first(void);//返回第一个非空字符
int get_button(char c);//返回用户输入
int get_hour(void);//返回hour
int main(void){
    int n,hour=0,flag=1;
    float tax,profit;
    char c,k;
    while(flag){
        printf("***************************************\n");
        printf("Enter the number corresponding to the desired pay rate or action:\n");
        printf("1) $8.75/hr     2) $9.33/hr\n");
        printf("3) $10.00/hr    4) $11.20/hr\n");
        printf("q quit\n");
        printf("***************************************\n");
        printf("please enter the hours: ");
        hour=get_hour();
        printf("please enter the number(1-4 and q): ");
        c=get_first();
        k=get_button(c);
        tax=t(k,hour);
        printf("the tax are :%.2f\n",tax);
        printf("would you want to try again?(y/n)\n");
        fflush(stdin);
        flag=2;
        while(flag==2){
            c=get_first();
            if('y'==c) flag=1;
            else if(c=='n') flag=0;
            else{
                printf("incorrect type!please enter again:");
                flag=2;
            }
            fflush(stdin);
        }
        
    }
    printf("ok,bye!");
    
    return 0; 
}


float t(char n,int hour){
    float tax;
    switch(n){
            case'1':{
                tax=8.75*hour;
                break;
            }
            case '2':{
                tax=9.33*hour;
                break;
            }
            case '3' :{
                tax=10.00*hour;
                break;
            }
            case '4' :{
                tax=11.20*hour;
                break;
            }
            case 'q': break;

            default:break;
            
        }
        return tax;
}

char get_first(void)
{
    int ch;
    while((ch=getchar())!=EOF){
        if (!(ispunct(ch)||isspace(ch))) return ch;
    }
}

int get_button(char c){
        int flag=1;
        while(flag){
            if(c=='q') flag=0;
            else if(c>='1'&& c<='4') flag=0;
            else{
                    flag=1;
                    putchar(c);
                    printf(" is incorrect type! please enter again:");   
                    fflush(stdin);
                    c=getchar();
            }
        }
        return c;
}


int get_hour(void){
    int n;
    char ch;
    while(scanf("%d",&n)!=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 n;
}

☘️下面是运行的情况~
第七题界面

第8题

🐬 8. 编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。获得用户选择的选项后,程序提示用户输入两个数字,然后执行用户刚才选择的操作。该程序只接受菜单提供的选项。程序使用float类型的变量储存用户输
入的数字,如果用户输入失败,则允许再次输入。进行除法运算时,如果用户输入0作为第2个数(除数),程序应提示用户重新输入一个新值。该程序的一个运行示例如下:
在这里插入图片描述在这里插入图片描述

/*
 * @Description:  编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。获得
用户选择的选项后,程序提示用户输入两个数字,然后执行用户刚才选择的
操作。该程序只接受菜单提供的选项。程序使用float类型的变量储存用户输
入的数字,如果用户输入失败,则允许再次输入。进行除法运算时,如果用
户输入0作为第2个数(除数),程序应提示用户重新输入一个新值。该程序
的一个运行示例如下:
 * @Author: ~光~~
 * @Date: 2023-11-30 19:31:11
 * @LastEditTime: 2023-11-30 21:02:18
 * @LastEditors:  
 */
#include<stdio.h>
#include<ctype.h>
void show(void);//展示菜单
char get_first(void);//返回第一个非空字符
char get_option(char c);
void get_number(int warm);
int warm;
float a,b;
int main(void){
    char option,c;
    int flag=2;//控制程序整体运行
    while(flag){
        flag=2;//下一轮循环可以继续问 是否要继续 否则直接退出不问
        show();
        printf("please enter your option:");
        //得到正确格式的输入
        option=get_first();
        option=get_option(option);
        //开始运行
        if(option!='q'){
            get_number(warm);//获得a b
            printf("a is %.2f  b is %.2f\n",a,b);
        }else flag=0;
        switch(option){
            
            case 'a':{
                printf("ok,this is add\n");    
                printf("%.2f + %.2f is %.2f\n",a,b,a+b);
                
                break;
            }
            case 's':{
                printf("ok,this is subtract\n");
                printf("%.2f - %.2f is %.2f\n",a,b,a-b);
                break;
            }
            case 'm':{
                printf("ok,this is multiply\n");    
                printf("%.2f * %.2f is %.2f\n",a,b,a*b);            
                break;
            }
            case 'd':{
                printf("ok,this is divide\n");
                printf("%.2f / %.2f is %.2f\n",a,b,a/b);
                break;
            }
            case 'q':{
                flag=0;
                break;
            }
            default:break;
        }
        //是否继续
        
        while(flag==2){
            fflush(stdin);
            printf("would you want to try again?(y/n)\n");
            fflush(stdin);
            c=get_first();
            if('y'==c) flag=1;
            else if(c=='n') flag=0;
            else{
                printf("incorrect type!please enter again:");
                flag=2;
            }
            fflush(stdin);
            
        }
        
        
    }
    printf("Bye!\n");
    
    return 0; 
}

void show(void){

    printf("***************************************\n");
    printf("Enter the the choice:\n");
    printf("a) add     s) subtract\n");
    printf("m) multiply  d) divide\n");
    printf("q) quit\n");
    printf("***************************************\n");

}

char get_option(char c){
     int flag=1;
        while(flag){
            if(c=='a'||c=='s'||c=='m'||c=='q') {
                flag=0;
                warm=0;
            } else if (c=='d'){
                flag=0;
                warm=1;
            }
            else{
                    flag=1;
                    putchar(c);
                    printf(" is incorrect type! please enter again:");   
                    fflush(stdin);
                    c=getchar();
            }
        }
        return c;
}

char get_first(void)
{
    int ch;
    while((ch=getchar())!=EOF){
        if (!(ispunct(ch)||isspace(ch))) return ch;
    }
}


void get_number(int warm){
    // float a[2];
    printf("please enter the numbers you want to operate\n");
    printf("Enter like this (2 3 or 34 5)\n");
    if(warm){
        printf("\nattention! the latter number--b can not be 0. Enter:");
        while(scanf("%f %f",&a,&b)!=2 || b==0){
            fflush(stdin);
            printf("the incorrect type! please enter again:");
        }
           
    }else{
        while(scanf("%f %f",&a,&b)!=2){
            fflush(stdin);
            printf("incorrect type! please enter again:");
        }
    }
    
}


⛵️完成啦~
☘️如果有其他解法~ 欢迎大家讨论 批评指正~
🌈 此编程练习参考答案为本人所写,如有错误欢迎大家批评指正~~ 如转载请说明来源~

🌈ok,完结~(●’◡’●) 看到这里 点个赞叭 (●’◡’●)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~光~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值