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:
- $8.75/hr 2) $9.33/hr
- $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,完结~(●’◡’●) 看到这里 点个赞叭 (●’◡’●)