C primer plus(第五版)课后编程练习答案(完整)
更新时间:2024-04-16 01:18:01 阅读量: 综合文库 文档下载
第一章 概览
编程练习
1.您刚刚被MacroMuscle有限公司(Software for Hard Bodies)聘用。该公司要进入欧洲市场,需要一个将英寸转换为厘米(1英寸=2.54 cm)的程序。他们希望建立的该程序可提示用户输入英寸值。您的工作是定义程序目标并设计该程序(编程过程的第1步和第2步)。
1.将英寸值转化为厘米值
2.显示“输入英寸值”->得到该值->转换为厘米值->存储->告知用户已结束
第二章 C语言概述
编程练习
1.编写一个程序,调用printf()函数在一行上输出您的名和姓,再调用一次printf()函数在两个单独的行上输出您的名和姓,然后调用一对printf()函数在一行上输出您的名和姓。输出应如下所示(当然里面要换成您的姓名):
Anton Bruckner Anton Bruckner Anton Bruckner 第一个输出语句 第二个输出语句 仍然是第二个输出语句 第三个和第四个输出语句
#include
int main(void) {
printf(\ printf(\ printf(\ printf(\
return(0); }
2.编写一个程序输出您的姓名及地址。
#include
int main(void) {
printf(\ printf(\ return(0); }
3.编写一个程序,把您的年龄转换成天数并显示二者的值。不用考虑平年( fractional year)和闰年(leapyear)的问题。
#include
int main(void) {
int age=22;
printf(\ printf(\ return(0); }
4.编写一个能够产生下面输出的程序: For he's a jolly good fellow! For he's a jolly good fellow! For he's a jolly good fellow!
Which nobody can deny!
程序中除了main()函数之外,要使用两个用户定义的函数:一个用于把上面的夸奖消息输出一次:另一个用于把最后一行输出一次。
#include
void printf1(void); void printf2(void);
int main(void) {
printf1(); printf1(); printf1(); printf2(); return(0); }
void printf1(void) {
printf(\}
void printf2(void) {
printf(\}
5.编写一个程序,创建一个名为toes的整数变量。让程序把toes设置为10。再让程序计算两个toes的和以及toes的平方。程序应该输出所有的3个值,并分别标识它们。
#include
int main(void) {
int toes=10; int toes_add;
int toes_square; toes_add=toes+toes; toes_square=toes*toes;
printf(\ return(0); }
6.编写一个能够产生下列输出的程序: Smile ! Smile ! Smile Smile ! Smile ! Smile !
在程序中定义一个能显示字符串smile卜一次的函数,并在需要时使用该函数。
#include
void display(void);
int main(void) {
display(); display(); display(); printf(\ display(); display(); printf(\ display(); printf(\ return(0); }
void display(void) {
printf(\}
7.编写一个程序,程序中要调用名为one_three()的函数。该函数要在一行中显示单词\,再调用two()函数,然后再在另一行中显示单词\。函数two()应该能在一行中显示单词\。main()函数应该在调用one_three()函数之前显示短语\:\,函数调用之后要显示\!\这样,最后的输出结果应如下所示:
starting now one two three done !
#include
void one_three(void); void two(void);
int main(void) {
printf(\ one_three(); printf(\ return(0); }
void one_three(void) {
printf(\ two();
printf(\}
void two(void) {
printf(\}
第三章 数据和C 编程练习
1.通过试验的方法(即编写带有此类问题的程序)观察系统如何处理整数上溢、浮点数上溢和浮点数下溢的情况。
#include
int main(void) {
unsigned int a=4294967295; float b=3.4E38; float c=b*10; float d=0.1234E-2; printf(\ printf(\ printf(\ return(0); }
2.编写一个程序,要求输入一个ASCII码值(如66),然后输出相应的字符。
#include
int main(void) { char a;
scanf(\ printf(\ return(0); }
3.编写一个程序,发出警报声,并打印下列文字:
Startled by the sudden sound, Sally shouted, \
#include
int main(void) {
printf(\by the sudden sound,Sally shouted,\\\the Great pumpkin,what was
that!\\\
return(0); }
4.编写一个程序,读入一个浮点数,并分别以小数形式和指数形式打印。输出应如同下面格式(实际显示的指数位数也许因系统而不同):
The input is 21.290000 or 2.129000e+001.
#include
int main(void) { float a; scanf(\
printf(\ return(0); }
5.一年约有3.156×l07S。编写一个程序,要求输入您的年龄,然后显示该年龄合多少秒。
#include
int main(void) { float a;
printf(\ scanf(\
printf(\ return(0); }
6.1个水分子的质量约为3.0×10^-23g,l夸脱水大约有950g。编写一个程序,要求输入水的夸脱数,
然后显示这么多水中包含多少个水分子。
#include
int main(void) { float a;
printf(\ scanf(\
printf(\ return(0); }
7. 1英寸等于2.54cm。编写一个程序,要求输入您的身高(以英寸为单位),然后显示该身高值等于
多少厘米。如果您愿意,也可以要求以厘米为单位输入身高,然后以英寸为单位进行显示。
#include
int main(void) { float a;
printf(\ scanf(\
printf(\ return(0); }
第4章 字符串和格式化输入/输出 编程练习
1.编写一个程序,要求输入名字和姓氏,然后以“名字,姓氏”的格式打印。
#include
int main(void) {
char surname[20],firstname[20];
printf(\ scanf(\ scanf(\
printf(\ return(0); }
2.编写一个程序,要求输入名字,并执行以下操作: a.把名字引在双引号中打印出来。
b.在宽度为20个字符的字段内打印名字,并且整个字段引在引号内。 c. 在宽度为20个字符的字段的左端打印名字,并且整个字段引在引号内。 d.在比名字宽3个字符的字段内打印它。
#include
int main(void) {
char name[20]; int width;
printf(\ scanf(\
printf(\ printf(\ printf(\ width=strlen(name)+3;
printf(\对应width return(0); }
3.编写一个程序,读取一个浮点数,并且首先以小数点记数法,然后以指数记数法打印之。输出使用下列形式(在指数位置显示的数字的位数可能会随系统而不同):
a. The input is 21.3 or 2.1e+001.
b. The input is +21.290 or 2.129E+001.
#include
int main(void) { float a;
printf(\ scanf(\
printf(\ printf(\ return(0); }
4.编写—个程序,要求输入身高(以英寸为单位)和名字,然后以如下形式显示: Dabney, you are 6.208 feet tall
使用float类型,使用/作为除号。如果您愿意,可以要求以厘米为单位输入身高,并以米为单位进行显示。
#include
int main(void) {
float height; char name[20];
printf(\ scanf(\
printf(\ scanf(\
printf(\ return(0); }
5.编写一个程序,首先要求用户输入名字,然后要求用户输入姓氏。在一行打印输入的姓名,在下
行打印每个名字中字母的个数。把字母个数与相应名字的结尾对齐,如下所示:
Melissa Honeybee 7 8
然后打印相同的信息,但是字母个数与相应单词的开始对齐。
#include
int main(void) {
char surname[20],firstname[20];
printf(\ scanf(\ scanf(\
printf(\
printf(\%*d\\n\对应宽度变量
printf(\
printf(\%-*d\\n\*对应宽度变量
return(0); }
6.编写一个程序,设置一个值为1.0/3.0的double类型变量和一个值为1.0/3.0的float类型变量。每个变量的值显示三次:一次在小数点右侧显示4个数字,一次在小数点右侧显示12个数字,另一次在小数点右侧显示16个数字。同时要让程序包括float.h文件,并显示FLT—DIG和DBL_DIG的值。1.0/3.0的显示值与这些值一致吗?
#include
int main(void) {
double a=1.0/3.0;
float b=1.0/3.0;
printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\
printf(\ printf(\ return(0); }
7.编写一个程序,要求用户输入行驶的英里数和消耗汽油的加仑数。接着应该计算和显示消耗每加仑汽油行驶的英里数,显示方式是在小数点右侧显示一个数字。然后,根据l加仑约等于3.785升,l英里约等于1.609公里的规则,它应该把每加仑英里数转换成每100公里的升数(欧洲通用的燃料消耗表示法),并显示结果,显示方式是在小数点右侧显示一个数字(请注意,美国方案测量每单位距离消耗的燃料数,而欧洲方案测量每单位燃料的行驶距离)。用符号常量表示两个转换系数(使用const或#define)。
#include
#define GALLON 3.785 //1 gallon = 2.785 litre #define MILE 1.609 //1 mile = 1.609 kilometer
int main(void) {
float mile,gallon;
printf(\ scanf(\
printf(\
printf(\ return(0); }
第5章 运算符、表达式和语句 编程练习
1.编写一个程序。将用分钟表示的时间转换成以小时和分钟表示的时间。使用#define或者const来创建一个代表60的符号常量。使用while循环来允许用户重复键入值,并且当键入一个小于等于0的时间时终止循环。
#include
int main(void) {
int minutes;
printf(\ scanf(\ while(minutes>0) {
printf(\ printf(\ scanf(\ }
return(0); }
2.编写一个程序,此程序要求输入一整数,然后打印出从(包括)输入的值到(包括)比输入的值大10的所有整数值(也就是说,如果输入为5,那么输出就从5到15)。要求在各个输出值之间用空格、制表符或换行符分开。
#include
int main(void) {
int num,i=0;
printf(\ scanf(\
while(i++<11) {
printf(\ }
return(0); }
3.编写一个程序,该程序要求用户输入天数,然后将该值转换为周数和天数。例如,此程序将把18天转换成2周4天。用下面的格式显示结果:
使用一个while循环让用户重复输入天数;当用户输入一个非正数(如0或-20)时,程序将终止循环。
#include
int main(void) {
int days;
printf(\ scanf(\ while(days>0) {
printf(\ printf(\ scanf(\ }
return(0); }
4.编写一个程序让用户按厘米输入一个高度值,然后,程序按照厘米和英尺英寸显示这个高度值。允许厘米和英寸的值出现小数部分。程序允许用户继续输入,直到用户输入一个非正的数值。程序运行的示例如下面所示:
Enter a height in centimeters: 182 182.0 cm = 5 feet, 11.7 inches
Enter a height in centimeters(<=O to quit): 168 168.0 cm = 5 feet, 6.1 inches
Enter a height in centimeters(<=O to quit): 0
bye
#include
#define INCH 2.54 // 1 inch = 2.54cm
int main(void) {
float cm;
printf(\ scanf(\ while(cm>0) {
printf(\cm = %d feet, %.1f inches\\n\ printf(\ scanf(\ }
printf(\ return(0); }
5.改写用来找到前20个整数之和的程序addemup.c(程序清单5.13)(如果您愿意,可以把addemup.c程序看成是一个计算如果您第一天得到$l,第二天得到$2,第三天得到$3,以此类推,您在20天里会挣多少钱的程序)。修改该程序,目的是您能交q地告诉程序计算将进行到哪里。也就是说,用一个读入的变量来代替20。
#include
int main(void) {
int count,sum,max;
count=0; sum=0;
printf(\ scanf(\ while(count++ < max) sum = sum + count; printf(\ return(0);
}
6.现在修改编程练习5中的程序,使它能够计算整数平方的和(如果您喜欢,可以这样认为:如果您第一天得到$l,第二天得到$4,第三天得到$9,以此类推您将得到多少钱。这看起来像一个很好的买卖)。C没有平方函数,但是您可以利用n的平方是n*n的事实。
#include
int main(void) {
int count,sum,max;
count=0; sum=0;
printf(\ scanf(\ while(count++ sum = sum + count * count; printf(\ return(0); } 7.编写一个程序,该程序要求输入一个float型数并打印该数的立方值。使用您自己设计的函数来计算该值的立方并且将它的立方打印出来。main()程序把输入的值传递给该函数。 #include int main(void) { float number; printf(\ scanf(\ printf(\ return(0); } float cube(float num) { return(num * num * num); } 8.编写一个程序,该程序要求用户输入一个华氏温度。程序以double类型读入温度值,并将它作为一个参数传递给用户提供的函数Temperatures()。该函数将计算相应的摄氏温度和绝对温度,并以小数点右边有两位数字的精度显示这三种温度。它应该用每个值所代表的温度刻度来标识这3个值。下面是将华氏温度转换成摄氏温度的方程: 通常用在科学上的绝对温度的刻度是0代表绝对零,是可能温度的下界。下面是将摄氏温度转换为绝对温度的方程: Kelvin=Celsius+273.16 Temperatures()函数使用const来创建代表该转换里的3个常量的符号。main()函数将使用一个循环来允许用户重复地输入温度,当用户输入q或其他非数字值时,循环结束。 #include void Temperatures(double); int main(void) { double Fahrenheit; printf(\ while(scanf(\的返回值代表成功输入的变量的数目,非数字不会被成功输入 { Temperatures(Fahrenheit); printf(\ } printf(\ return(0); } void Temperatures(double Fahrenheit) { const double a=1.8,b=32.0,c=273.16; printf(\ printf(\ printf(\} 第6章 C控制语句:循环 编程练习 1.编写一个程序,创建一个具有26个元素的数组,并在其中存储26个小写字母。并让该程序显示该数组的内容。 #include int main(void) { char ABC[26]; int i; for(i=0;i<26;i++) ABC[i] = 'a' + i; for(i=0;i<26;i++) printf(\ printf(\ return(0); } 2.使用嵌套循环产生下列图案: S $$ $$$ $$$$ $$$$$ #include int main(void) { int i,j; for(i=0;i<5;i++) { for(j=0;j<=i;j++) printf(\ printf(\ } return(0); } 3.使用嵌套循环产生下列图案: F FE FED FEDC FEDCB FEDCBA 请注意:如果您的系统不使用ASCⅡ或其他以数字顺序编码的码,您可以把一个字符数组初始化为字母表中的字母: char lets[26]=\ 然后就可以使用数组索引来选用单个的字母,例如lets[0]是'A',等等。 #include int main(void) { int i,j; for(i=0;i<6;i++) { for(j=0;j<=i;j++) printf(\ printf(\ } return(0); } 4.让程序要求用户输入一个大写字母,使用嵌套循环产生像下面这样的金字塔图案: A ABA ABCBA ABCDCDA ABCDEDCBA 这种图案要扩展到用户输入的字符。例如,前面的图案是在输入E时需要产生的。提示:使用一个外部循环来处理行,在每一行中使用三个内部循环,一个处理空格,一个以升序打印字母,一个以降序打印字母。如果您的系统不使用ASCII或类似的以严格数字顺序表示字母的编码,请参见在编程练习3中给出的建议。 #include int main(void) { int i,j,k; char letter; printf(\ scanf(\ k=letter-'A'+1; for(i=0;i for(j=0;j return(0); } 5.编写一个程序打印一个表,表的每一行都给出一个整数、它的平方以及它的立方。要求用户输入表的上限与下限。使用一个for循环。 #include return(0); } 14.编写一个程序读入一行输入,然后反向打印该行。您可以把输入存储在一个char数组中;假定该行不超过255个字符。回忆一下,您可以使用具有%c说明符的scanf()从输入中一次读入一个字符,而且当您按下回车键时会产生换行字符(\\n)。 #include int main(void) { char a[255]; int i; for(i=0;i 15. Daphne以10%的单利息投资了100美元(也就是说,每年投资赢得的利息等于原始投资的10%)。Deirdre则以每年5%的复合利息投资了10O美元(也就是说,利息是当前结余的5%,其中包括以前的利息)。编写一个程序,计算需要多少年Deirdre的投资额才会超过Daphne,并且显示出到那时两个人的投资额。 #include int main(void) { double Daphne=100,Deirdre=100; int i=0; while(Daphne>=Deirdre) { Daphne += 100 * 0.1; Deirdre += Deirdre * 0.05; i++; } printf(\ return(0); } 16. Chuckie Lucky赢了100万美元,他把它存入一个每年赢得8%的帐户。在每年的最后一天,Chuckie取出10万美元。编写一个程序,计算需要多少年Chuckie就会清空他的帐户。 #include int main(void) { double investment = 100; int i=0; while(investment > 0) { investment += investment * 0.08; investment -= 10; i++; } printf(\ return(0); } %d years,Deirdre's investment is %lf,Daphne's investment is %lf\\n\ 第七章 C控制语句:分支和跳转 编程练习 1.编写一个程序。该程序读取输入直到遇到#字符,然后报告读取的空格数目、读取的换行符数目以及读取的所有其他字符数目。 #include int main(void) { int space=0,newline=0,others=0; char a; printf(\ while((a=getchar()) != '#') if(a == ' ') space++; else if (a == '\\n') newline++; else others++; printf(\ return(0); } 2.编写一个程序,该程序读取输入直到遇到#字符。使程序打印每个输入的字符以及它的十进制ASCII码。每行打印8个字符,编码对。建议:利用字符计数和模运算符(%)在每8个循环周期时打印一个换行符。 #include int main(void) { char a; int i; printf(\ for(i = 1; (a = getchar()) != '#'; i++) { printf(\ if(i%8 == 0) printf(\ } printf(\ return(0); } 3.编写一个程序。该程序读取整数,直到输入0。输入终止后,程序应该报告输入的偶数(不包括0)总个数、偶数的平均值,输入的奇数总个数以及奇数的平均值。 #include int main(void) { int i_even = 0, sum_even = 0, i_odd = 0, sum_odd = 0, num; printf(\ while(1) { scanf(\ if (num == 0) break; if (num % 2 == 0) {i_even++; sum_even += num;} else {i_odd++; sum_odd += num;} } printf(\ printf(\ printf(\ printf(\ return(0); } 4.利用if else语句编写程序读取输入,直到#。用一个感叹号代替每个句号,将原有的每个感叹号用两个感叹号代替,最后报告进行了多少次替代。 #include int main(void) { int a=0,b=0; char ch; printf(\ while((ch = getchar()) != '#') { if(ch == '.') {putchar('!'); a++;} else if(ch == '!') {putchar('!');putchar('!'); b++;} else putchar(ch); } printf(\ printf(\ return(0); } 5.用switch重做练习3。 #include int main(void) { int i_even = 0, sum_even = 0, i_odd = 0, sum_odd = 0, num; printf(\ while(1) { scanf(\ if (num == 0) break; switch(num % 2) { case 0: i_even++; sum_even += num; break; case 1: i_odd++; sum_odd += num; } } printf(\ printf(\ printf(\ printf(\ return(0); } 6.编写一个程序读取输入,直到#,并报告序列ei出现的次数。 此程序必须要记住前一个字符和当前的字符。用诸如“Receive your eieio award.”的输入测试它。 #include int main(void) { char former=0,present; int count=0; while((present=getchar()) != '#') { if((former == 'e') && (present == 'i')) count++; former = present; } printf(\ return(0); } 7.编写程序,要求输入一周中的工作小时数,然后打印工资总额、税金以及净工资。作如下假设: a.基本工资等级=10.00美元//J,时 b.加班(超过40小时)=1.5倍的时间 c.税率 前300美元为15% 下一个150美元为20% 余下的为25% 用#define定义常量,不必关心本例是否符合当前的税法。 #include #define BASIC 10.00 //基本工资等级=BASIC美元/小时 //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 hours,gross,tax; printf(\ scanf(\ if (hours > 40) hours = 40 + (hours - 40) * 1.5; gross = hours * BASIC; printf(\ 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(\ printf(\ return(0); } 8.修改练习7中的假设a,使程序提供一个选择工资等级的菜单。用switch选择工资等级。程序运行的开头应该像这样: Enter the number corresponding to the desired pay rate or action: 1) $8.75/hr 2) $9.33/hr 3) $lO.OO/hr 4) $11.20/hr 5) quit 如果选择l到4.那么程序应该请求输入工作小时数。程序应该一直循环运行,直到输入5。如果输入l到5以外的选项,那么程序应该提醒用户合适的选项是哪些,然后再循环。用#define为各种工资等级和税率定义常量。 #include //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(\ printf(\ printf(\ printf(\ switch( get_int() ) { 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(\退出程序 } printf(\ printf(\ scanf(\ if (hours > 40) hours = 40 + (hours - 40) * 1.5; gross = hours * basic; printf(\ 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(\ printf(\ return(0); } int get_int(void) //得到一个合适的整数,滤除非法数 { int num; char str[40]; while(scanf(\ { gets(str); printf(\ } while ( getchar() != '\\n'); return num; } 9.编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数。 #include int isprime(int); int main(void) { int num,i; printf(\ scanf(\ printf(\ for(i=2;i<=num;i++) if( isprime(i) ) printf(\ printf(\ return(0); } int isprime(int n) //如果n是素数 返回1,反之 返回0 { int div; for(div = 2; div * div <= n; div++) if (n % div == 0) return 0; return 1; } 10. 1988年United States Federal Tax Schedule是近期最基本的。它分为4类,每类有两个等级。下面是其摘要;美元数为应征税的收入。 ┏━━━━━━┳━━━━━━━━━━━━━━━━━━┓ ┃ 种 类 ┃ 税 金 ┃ ┣━━━━━━╋━━━━━━━━━━━━━━━━━━┫ ┃单身 ┃前17·850美元按15%,超出部分按28% ┃ ┣━━━━━━╋━━━━━━━━━━━━━━━━━━┫ ┃户主 ┃前23,900美元按15%,超出部分按28%┃ ┣━━━━━━╋━━━━━━━━━━━━━━━━━━┫ ┃已婚,共有 ┃前29,750美元按15%,超出部分按28% ┃ ┣━━━━━━╋━━━━━━━━━━━━━━━━━━┫ ┃已婚,离异 ┃前14,875美元按l5%,超出部分按28% ┃ ┗━━━━━━┻━━━━━━━━━━━━━━━━━━┛ 例如,有20 000美元应征税收入的单身雇佣劳动者应缴税金0.15×17 850美元+0.28×(20 000美元-17 850美元)。编写一个程序,让用户指定税金种类和应征税收入,然后计算税金。使用循环以便用户可以多次输入。 #include #define MARRIED_SHARE 29750 #define MARRIED_DIVORCE 14875 #define RATE1 0.15 #define RATE2 0.28 int main(void) { double type,pay,tax; char ch; while(1) { printf(\ printf(\ while((ch = getchar()) == '\\n') continue; //滤掉回车 switch(ch) { case '1': type = SINGLE; break; case '2': type = HOST; break; case '3': type = MARRIED_SHARE; break; case '4': type = MARRIED_DIVORCE; break; case '5': printf(\退出程序 default : printf(\ } printf(\ printf(\ scanf(\ if (pay <= type) tax = pay * RATE1; else tax = type * RATE1 + (pay - type) * RATE2; printf(\ } } 11. ABC Mail Order Grocery朝鲜蓟的售价是1.25美元/磅,甜菜的售价是0.65美元/磅,胡萝卜的售价是0.89美元/磅。在添加运输费用之前,他们为100美元的订单提供5%的打折优惠。对5磅或以下的定单收取3.50美元的运输和装卸费用;超过5磅而不足20磅的定单收取1O.OO美元的运输和装卸费用:加磅或以上的运输,在8美元基础上每磅加收0.1美元。编写程序,在循环中使用switch语句,以便对输入a的响应是让用户输入所需的朝鲜蓟磅数,b为甜菜的磅数,c为胡萝卜的磅数,而q允许用户退出订购过程。然后程序计算总费用、折扣和运输费用(如果有运输费的话),以及总数。随后程序应该显示所有的购买信息:每磅的费用、订购的磅数、该订单每种蔬菜的费用、订单的总费用、折扣,如果有的话加上运输费用,以及所有费用的总数。 #include #include #define ARTICHOKE 1.25 //单价 #define BEET 0.65 #define CARROT 0.89 #define DISCOUNT_LIMIT 100 #define DISCOUNT_RATE 0.05 #define FREIGHT_FEE1 3.50 #define FREIGHT_LIMIT1 5 #define FREIGHT_FEE2 10.00 #define FREIGHT_LIMIT2 20 #define FREIGHT_FEE3 8 #define FREIGHT_RATE 0.1 int main(void) { char ch; double artichoke=0,beet=0,carrot=0; //磅数 double sum,discount,freight; printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ while( ( ch = tolower( getchar() ) ) != 'q') //tolower:大写转小写 { switch(ch) { case 'a': printf(\ scanf(\ printf(\ continue; case 'b': printf(\ scanf(\ printf(\ continue; case 'c': printf(\ scanf(\ printf(\ continue; default: break; } } printf(\ printf(\ printf(\ printf(\carrot); sum = ARTICHOKE * artichoke + BEET * beet + CARROT * carrot; if (sum > DISCOUNT_LIMIT) discount = sum*DISCOUNT_RATE; else discount = 0; printf(\ if (artichoke + beet + carrot <= 5) freight = 3.50; else if (artichoke + beet + carrot <20) freight = 10; else freight = 8 + (artichoke + beet + carrot) * 0.1; printf(\ sum = sum - discount + freight; printf(\ return 0; } 第8章 字符输入/输出和输入确认 编程练习 下面的一些程序要求输入以EOF终止。如果您的操作系统难以使用或不能使用重定向,则使用一些其他的判断来终止输入,例如读取&字符。 1.设计一个程序,统计从输入到文件结尾为止的字符数。 #include int main(void) { int i; for(i=0; getchar() != EOF; i++); printf(\ 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(\ else printf(\ printf(\ if(i%8 == 0) printf(\ } return 0; } 3.编写一个程序,把输入作为字符流读取,直至遇到EOF。令其报告输入中的大写字母个数和小写字母个数。假设小写字母的数值是连续的,大写字母也是如此。或者你可以使用ctypc,h库中的合适的函数来区分大小写。 #include int main(void) { char ch; int lower=0,upper=0; while ( (ch=getchar()) != EOF ) { if ( islower(ch) ) lower++; if ( isupper(ch) ) upper++; } printf(\ return 0; } 4.编写一个程序,把输入作为字符流读取,直至遇到EOF。令其报告每个单词的平均字母数。不要将空白字符记为单词中的字母。实际上,标点符号也不应该计算,但现在不必考虑这一点(如果您想做得好一些,可以考虑使用ctype.h系列中的ispunct()函数)。 #include int main(void) { int num=0; char ch; bool word=0; while ( (ch=getchar()) != EOF ) { if ( isalpha(ch) && !word ) { word = 1; num++; } if ( !isalpha(ch) ) { word = 0; } } printf(\ return 0; } 5,修改程序清单8,4中的猜测程序,使其使用更智能的猜测策略。例如,程序最初猜50,让其询问用户该猜测值是大、小还是正确。如果该猜测值小,则令下一次猜测值为50和100的中值,也就是75。如果75大,则下一次猜测值为75和50的中值,等等。使用这种二分搜索(binary search)策略,起码如果用户没有欺骗,该程序很快会获得正确答案。 #include int main(void) { int guess, max = 100, min = 1; char response; printf(\ printf(\ printf(\ printf(\ printf(\ while((response = getchar()) != 'y') { if (response == 'b') { max = guess - 1; printf(\ } else if (response == 'l') { min = guess + 1; printf(\ } else printf(\ while (getchar() != '\\n'); } printf(\ return 0; } 6.修改程序清单8.8中的get_first()函数,使其返回所遇到的第一个非空白字符。在一个简单的程序中测试该函数。 #include int main(void) { char ch; while((ch = get_first() ) != EOF) { putchar(ch); } return 0; } char get_first(void) { int ch; while( isspace( ch = getchar() ) ); while ( getchar() != '\\n'); return ch; } 7.修改第7章的练习8,使菜单选项由字符代替数字进行标记。 #include //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(\ printf(\ printf(\ printf(\ 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(\退出程序 } printf(\ printf(\ scanf(\ if (hours > 40) hours = 40 + (hours - 40) * 1.5; gross = hours * basic; printf(\ 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(\ printf(\ return(0); } char get_first(void) //得到字符串中的第一个非空字符 { int ch; while( isspace( ch = getchar() ) ); while ( getchar() != '\\n'); return ch; } 8.编写一个程序,显示一个菜单,为您提供加法、减法、乘法或除法的选项。获得您的选择后,该程序请求两个数,然后执行您选择的操作。该程序应该只接受它所提供的菜单选项。它应该使用float类型的数,并且如果用户未能输入数字应允许其重新输入。在除法的情况中,如果用户输入O作为第二个数,该程序应该提示用户输入一个新的值。一个典型的程序运行应该如下所示: Enter the operation of your choice: a. add s. subtract m. multiply d. divide q. quic Enter first number: 22.4 Enter second number: one one is not an number. Please enter a number, such as 2.5. -1.78E8, or 3. 1 22.4 + 1 = 23.4 Enter the operation of your choice: a. add s. subtract m. multiply d. divide q. quit Enter first number: 18.4 Enter second number: O Enter a number other than 0: 0.2 18.4 / 0.2 = 92 Enter the operation of your choice: a. add s. subtract m. multiply d. divide q. quit q Bye. #include int main(void) { char select; float num1,num2; while(1) { printf(\ printf(\ printf(\ printf(\ select = get_first(); if( select != 'a' && select != 's' && select != 'm' && select != 'd') { printf(\ break; } printf(\ num1 = get_float(); printf(\ num2 = get_float(); while( select == 'd' && num2 == 0) { printf(\ num2 = get_float(); } switch(select) { case 'a': printf(\ case 's': printf(\ case 'm': printf(\ case 'd': printf(\ default : break; } } return(0); } float get_float(void) //得到一个合适的浮点数,滤除非法数 { float num; char str[40]; while(scanf(\ { gets(str); printf(\ printf(\ } while ( getchar() != '\\n'); return num; } char get_first(void) //得到字符串中的第一个字符,滤除其他字符 { int ch; while( isspace( ch = getchar() ) ); while ( getchar() != '\\n'); return ch; } 第9章 函 数 编程练习 1.设计函数 min(x,y),返回两个double数值中较小的数值,同时用一个简单的驱动程序测试该函数。 #include double min(double ,double ); int main(void) { double x,y; printf(\ scanf(\ printf(\ return(0); } double min(double a,double b) { return a 2.设计函数chline(ch, i, j),实现指定字符在i列到j列的输出,并用一个简单的驱动程序测试该函数。 #include void chline(char , int , int ); int main(void) { int x,y; char ch; printf(\ scanf(\ printf(\ scanf(\ chline(ch,x,y); return 0; } void chline(char ch, int i, int j) { int k; for(k=1; k for( ; k<=j; k++) printf(\ printf(\} 3.编写一个函数。函数的3个参数是一个字符和两个整数。字符参数是需要输出的字符。第一个整数说明了在每行中该字符输出的个数,而第二个整数指的是需要输出的行数。编写一个调用该函数的程序。 #include void chline(char , int , int ); int main(void) { int x,y; char ch; printf(\ scanf(\ printf(\ scanf(\ chline(ch,x,y); return 0; } void chline(char ch, int column, int row) { int x,y; for(y=0; y for(x=0; x 4.两数值的谐均值可以这样计算:首先对两数值的倒数取平均值,最后再取倒数。编写一个带有两个double参数的函数,计算这两个参数的谐均值。 #include double calculate(double ,double ); int main(void) { double a,b; printf(\ scanf(\ printf(\ return 0; } double calculate(double x,double y) { return 1/( (1/x+1/y) / 2 ); } 5.编写并测试函数larger_of(),其功能是将两个double类型变量的数值替换成它们中的较大值。例如,larger_of(x,y)会把x和y中的较大数值重新赋给变量x和y #include void large_of(double *,double *); int main(void) { double a,b; printf(\ scanf(\ large_of(&a,&b); printf(\ return 0; } void large_of(double *x,double *y) { *x = *y = *x>*y? *x:*y; } 6.编写一个程序,使其从标准输入读取字符,直到遇到文件结尾。对于每个字符,程序需要检查并报告该字符是否是一个字母。如果是的话,程序还应报告该字母在字母表中的数值位置。例如,c和C的字母位置都是3。可以先实现这样一个函数:接受一个字符参数,如果该字符为字母则返回该字母的数值位置,否则返回-1。 #include int main(void) { char ch; printf(\ scanf(\ printf(\ return 0; } int ABC(char ch) { if(isalpha(ch)) return tolower(ch) - 'a' + 1 ; else return -1; } 7.在第6章“C控制语句:循环”的程序清单6.20中,函数power()的功能是返回一个double类型数的某个正整数次幂。现在改进该函数,使其能正确地计算负幂。同时,用该函数实现0的任何次幂为0,并且任何数值的0次幂为l。使用循环的方法编写该函数并在一个程序中测试它。 #include double power(double , int ); int main(void) { double x; int exp; printf(\ scanf(\ printf(\ return 0; } double power(double n, int p) { int i; double pow=1; if (p>0) for(i=1;i<=p;i++) pow *= n; else if(p<0) for(i=-1;i>=p;i--) pow /= n; else if(n != 0) pow = 1; else pow = 1 / n; //0的0次幂无意义,所以用1/0这个无意义数(1.#INF)代替 return pow; } 8.使用递归函数重做练习7。 #include double power(double , int ); int main(void) { double x; int exp; printf(\ scanf(\ printf(\ return 0; } double power(double n, int p) { int i; double pow=1; if (p>0)
正在阅读:
C primer plus(第五版)课后编程练习答案(完整)04-16
内资公司注册04-12
上海市长宁区2016届高三第一学期教学质量检测生命科学试卷08-29
河北省《商品房销售明码标价规定》实施细则09-24
2014年9月份考试机械原理第三次作业09-30
中小学易误读的字词及解释分析03-08
中国汽车锁行业研究分析报告03-24
第三章 市场营销环境06-07
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 课后
- 练习
- 答案
- 完整
- 编程
- primer
- plus
- 电子商务概论复习重点
- 浙江省杭州市萧山区戴村片2016届九年级(上)月考数学试卷(10月
- 张家港市党政领导干部任前公示
- 2014-2019年中国粗粮饮料市场监测与发展前景研究报告 - 图文
- 2017年高考生物总复习资《必修1》 - 图文
- 2016-2021年中国生物技术行业发展预测与投资预测分析报告(目录
- 平阳中学高二校本课程选修报名单0810
- 农耕文化解释
- 城市轨道交通概论综合练习题001
- 财务分析模拟试题(一)
- 2017年云南省曲靖市中考语文试卷(解析版)
- 河堤开挖、出水池、出水箱涵、穿堤管道施工方案
- GCMS内标定量法 - 图文
- 398支气管肺癌外科治疗(县级医院版)临床路径
- 2011年下半年公司活动策划方案
- 中国纺织服装市场发展分析与投资价值评估报告(2014-2019)
- 2018年国家公务员考试行测真题及答案解析(省级)
- 谭富荣公开课《马说》教学设计
- 手术室流程
- 临床生化检验 名解