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 #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 #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 #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 #define HOUR 60

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 #define WEEK 7

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 float cube(float);

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=0;j--) printf(\ printf(\ }

return(0); }

5.编写一个程序打印一个表,表的每一行都给出一个整数、它的平方以及它的立方。要求用户输入表的上限与下限。使用一个for循环。

#include

return(0); }

14.编写一个程序读入一行输入,然后反向打印该行。您可以把输入存储在一个char数组中;假定该行不超过255个字符。回忆一下,您可以使用具有%c说明符的scanf()从输入中一次读入一个字符,而且当您按下回车键时会产生换行字符(\\n)。

#include #define LENGTH 20

int main(void) {

char a[255]; int i;

for(i=0;i=0;i--) printf(\ printf(\ return(0); }

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 //a.基本工资

#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 int get_int(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(\ 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 SINGLE 17850 #define HOST 23900

#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 //需要调用tolower函数

#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 #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 #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 #include 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() ) ); while ( getchar() != '\\n'); return ch; }

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

#include #include 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(\ 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 #include float get_float(void); char get_first(void);

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 #include int ABC(char ch);

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)

本文来源:https://www.bwwdw.com/article/oe4p.html

Top