C语言入门经典第4版课后练习参考答案.docx
《C语言入门经典第4版课后练习参考答案.docx》由会员分享,可在线阅读,更多相关《C语言入门经典第4版课后练习参考答案.docx(81页珍藏版)》请在冰豆网上搜索。
C语言入门经典第4版课后练习参考答案
《C语言入门经典(第4版)》课后练习参考答案
第1章C语言编程
练习1.1编写一个程序,用两个printf()语句分别输出自己的名字和地址。
#include
intmain(void){
printf("姓名:
小狮子\n");
printf("地址:
月亮之上\n");
return0;
}
练习1.2将上一个练习修改成所有的输出只用一个printf()语句。
#include
intmain(void){
printf("姓名:
小狮子\n地址:
月亮之上\n");
return0;
}
练习1.3编写一个程序,输出下列文本,格式如下所示:
"It'sfreezinginhere,"hesaidcoldly.
#include
intmain(void){
printf("\"It'sfreezinginhere,\"hesaidcoldly.\n");
return0;
}
第2章编程初步
习题2.1编写一个程序,提示用户用英寸输入一个距离,然后将该距离值输出为码、英尺和英寸的形式。
#include
/*
*1码=3英尺=36英寸
*/
intmain()
{
floatlen_inch=0.0f;//英寸
floatlen_foot=0.0f;//英尺
floatlen_yard=0.0f;//码
//提示用户用英寸输入一个距离
printf("请用英寸输入一个距离:
");
scanf("%f",&len_inch);
//计算英尺
len_foot=len_inch/12;
//计算码
len_yard=len_foot/3;
//输出计算后的结果
printf("%.2f英寸=%.2f英尺=%.2f码\n",len_inch,len_foot,len_yard);
return0;
}
习题2.2编写一个程序,提示用户用英尺和英寸输入一个房间的长和宽,然后计算并输出面积,单位是平方码,精度为小数点后两位数。
#include
intmain()
{
floatlength_in_foot=0.0f;//房间的宽度单位英尺
floatwidth_in_inch=0.0f;//房间的宽度单位英寸
floatarea_in_yard=0.0f;//房间的面积单位平方码
//提示用户输入房间的长度
printf("请输入房间的长度(单位:
foot):
");
scanf("%f",&length_in_foot);
//提示用户输入房间的宽度
printf("请输入房间的宽度(单位:
inch):
");
scanf("%f",&width_in_inch);
//计算房间的面积1码=3英尺=36英寸
area_in_yard=(length_in_foot/3)*(width_in_inch/36);
//输出房间的面积
printf("房间的面积是:
%.2f平方码。
\n",area_in_yard);
return0;
}
习题2.3一个产品有两个版本:
其一是标准版,价格是$3.5,其二是豪华版,价格是$5.5。
编写一个程序,使用学到的知识提示用户输入产品的版本和数量,然后根据输入的产品数量,计算并输出价格。
#include
intmain()
{
floatprice_of_normal=3.5;//普通版单价
floatprice_of_deluxe=5.5f;//豪华版单价
intnumber_of_normal=0;//普通版的数量
intnumber_of_deluxe=0;//豪华版的数量
floattotal_price=0.0f;//总价
//提示用户输入产品的数量
printf("请输入普通版的数量:
");
scanf("%d",&number_of_normal);
printf("请输入豪华版的数量:
");
scanf("%d",&number_of_deluxe);
//计算总价
total_price=number_of_normal*price_of_normal+number_of_deluxe+price_of_deluxe;
//输出总价
printf("总价为:
$%.2f\n",total_price);
return0;
}
习题2.4编写一个程序,提示用户从键盘输入一个星期的薪水(以美元为单位)和工作时数,它们均为浮点数,然后计算并输出每个小时的平均时薪,输出格式如下所示:
Youraveragehourlypayrateis7dollarsand54cents.
#include
intmain()
{
floatsalary=0.0f;//一个星期的薪水(以美元为单位)
floathours=0.0f;//工作时数
floatsalary_per_hour=0.0f;//每个小时的平均时薪
//提示用户输入一个星期的薪水
printf("请输入一个星期的薪水(以美元为单位):
");
scanf("%f",&salary);
//提示用户输入工作时数
printf("请输入工作时数:
");
scanf("%f",&hours);
//计算每个小时的平均时薪
salary_per_hour=salary/hours;
//输出结果
printf("Youraveragehourlypayrateis%ddollarsand%dcents.\n",(int)salary_per_hour,(int)(salary_per_hour*100)%100);
return0;
}
第3章条件判断
习题3.1编写一个程序,首先给用户以下两种选择:
(1)将温度从摄氏度转换为华氏度。
(2)将温度从华氏度转换为摄氏度。
接着,程序提示用户输入温度值,并输出转换后的数值。
从摄氏度转换为华氏度,可以乘以1.8再加上32。
从华氏度转换为摄氏度,可以先减去32后,再乘以5,除以9。
#include
#include
intmain()
{
floattemperature=0.0f;//用户输入的温度值
charch='\0';
floatresult=0.0f;//转换后的温度值
//提示用户都有哪种转换方式
printf("程序提供如下两种转换方式:
\n");
printf("A.将温度从摄氏度转换为华氏度\nB.将温度从华氏度转换为摄氏度\n");
//提示用户输入选择的转换方式
printf("请选择转换方式(AorB):
");
scanf("%c",&ch);
if(tolower(ch)=='a')
{
printf("请输入温度值:
");
scanf("%f",&temperature);
result=temperature*1.8+32;
printf("%.2f摄氏度=%.2f华氏度\n",temperature,result);
}
elseif(tolower(ch)=='b')
{
printf("请输入温度值:
");
scanf("%f",&temperature);
result=(temperature-32)*5/9;
printf("%.2f华氏度=%.2f摄氏度\n",temperature,result);
}
else
{
printf("选择错误\n");
}
return0;
}
习题3.2编写一个程序,提示用户输入3个整数值,分别代表月、日、年。
例如用户输入了12、31、2003,程序就以31stDecember2003的格式输出该日期。
必须在日期值的后面加上th、nd、st和rd。
例如1st、2nd、3rd、4th、11th、12th、13th、14th、21st、22nd、23rd、24th。
#include
intmain()
{
intyear=0;
intmonth=0;
intday=0;
//定义一个代表12个月份的枚举类型,枚举器值从1开始
enumMonth{January=1,February,March,April,May,June,July,August,September,October,November,December};
//提示用户输入月、日、年
printf("请输入月、日、年:
");
scanf("%d%d%d",&month,&day,&year);
//输出日
if(day<1||day>31)
{
printf("输入日期有误");
}
elseif(day%10==1&&day!
=11)
{
printf("%dst",day);
}
elseif(day%10==2&&day!
=12)
{
printf("%dnd",day);
}
elseif(day%10==3&&day!
=13)
{
printf("%drd",day);
}
else
{
printf("%dth",day);
}
//输出月
switch(month)
{
caseJanuary:
printf("January");
break;
caseFebruary:
printf("February");
break;
caseMarch:
printf("March");
break;
caseApril:
printf("April");
break;
caseMay:
printf("May");
break;
caseJune:
printf("June");
break;
caseJuly:
printf("July");
break;
caseAugust:
printf("August");
break;
caseSeptember:
printf("September");
break;
caseOctober:
printf("October");
break;
caseNovember:
printf("November");
break;
caseDecember:
printf("December");
break;
default:
printf("输入月份有误");
break;
}
//输出年
printf("%d\n",year);
return0;
}
习题3.3编写一个程序,根据从键盘输入的一个数值,计算总价(单价是$5),数值超过30的折扣是10%,数值超过50的折扣是15%。
#include
intmain()
{
floatunit_price=5.0f;//商品单价
floatdiscount=0.0f;//商品折扣
intnumber=0;//商品数量
//提示用户输入商品数量
printf("请输入商品数量:
");
scanf("%d",&number);
//计算折扣
if(number<=30)
{
discount=0.0f;
}
elseif(number<=50)
{
discount=0.1f;
}
else
{
discount=0.15f;
}
//输出总价
printf("商品的总价为:
%.2f\n",number*unit_price*(1-discount));
return0;
}
习题3.4修改本章最后的计算器例子,让用户选择输入y或Y,以执行另一个计算,输入n或N就结束程序。
(注意:
这需要实用goto语句,下一章将介绍一个更好的方法。
)
#include
intmain()
{
doublenumber1=0.0;
doublenumber2=0.0;
charoperation=0;
charchoice=0;
begin:
printf("Enterthecaculation\n");
scanf("%lf%c%lf",&number1,&operation,&number2);
switch(operation)
{
case'+':
printf("=%lf\n",number1+number2);
break;
case'-':
printf("=%lf\n",number1-number2);
break;
case'*':
printf("=%lf\n",number1*number2);
break;
case'/':
if(number2==0)
printf("\n\n\aDivisionbyzeroerror!
\n");
else
printf("=%lf\n",number1/number2);
break;
case'%':
if((long)number1==0)
printf("\n\n\aDivisionbyzeroerror!
\n");
else
printf("=%ld\n",(long)number1%(long)number2);
break;
default:
printf("\n\n\aIllegaloperation!
\n");
break;
}
printf("Doyouwanttocontinue?
(yorn):
");
scanf("%c",&choice);//注意:
%c前面的空格不能去掉
if(choice=='y'||choice=='Y')
gotobegin;
return0;
}
第4章循环
习题4.1编写一个程序,生成一个乘法表,其大小由用户输入来决定。
例如,如果表的大小是4,该表就有4行4列。
行和列标记为1~4.表中的每一个单元格都包含行列之积,因此第三行第4列的单元格包含12。
#include
intmain()
{
intnum_row=0;
intnum_col=0;
printf("请输入行数和列数:
");
scanf("%d%d",&num_row,&num_col);
printf("");
for(inti=1;i<=num_col;i++)
{
printf("%3d",i);
}
printf("\n");
for(inti=1;i<=num_row;i++)
{
printf("%-4d",i);
for(intj=1;j<=num_col;j++)
{
printf("%3d",i*j);
}
printf("\n");
}
return0;
}
习题4.2编写一个程序,为0~127之间的字符码输出可打印的字符。
输出每个字符码和它的符号,这两个字符占一行。
列要对齐(提示:
可以使用在ctype.h中声明的isgraph()函数,确定哪个字符是可以打印的)。
#include
#include
intmain()
{
for(inti=0;i<=127;i++)
{
if(isgraph(i))
{
printf("%d%c\n",i,i);
}
}
return0;
}
习题4.3扩展上一题,给每个空白字符输出对应的名称,例如newline,space,tab等。
//本题略
习题4.4使用嵌套循环输出一个用星号绘制的盒子,与程序4.2类似,但是它的宽和高由用户输入。
#include
intmain()
{
intheight=0;
intwidth=0;
printf("请输入盒子的宽和高:
");
scanf("%d%d",&width,&height);
for(inti=1;i<=height;i++)
{
for(intj=1;j<=width;j++)
{
if(i==1||i==height)
{
printf("*");
}
else
{
if(j==1||j==width)
{
printf("*");
}
else
{
printf("");
}
}
}
printf("\n");
}
return0;
}
习题4.5修改程序4.7的猜谜游戏,在玩家猜错数字后,可以用一个选项让玩家继续玩下去,且想玩多久就玩多久。
#include
#include
#include
#include
intmain()
{
intchosen=0;
intguess=0;
intlimit=20;
charanother_game='Y';
srand(time(NULL));
chosen=1+rand()%limit;
printf("\nThisisaguessinggame."
"\nIhavechosenanumberbetween1and20whichyoumustguess.\n");
do
{
printf("\nEnteraguess:
");
scanf("%d",&guess);
if(guess==chosen)
{
printf("\nYouguessedit!
\n");
return0;
}
if(guess<1||guess>20)
{
printf("\nIsaidbetween1and20.\n");
}
else
{
printf("\nSorry.%diswrong.\n",guess);
}
printf("\nDoyouwanttoplayagain(y/n)?
");
scanf("%c",&another_game);
}while(toupper(another_game)=='Y');
return0;
}
第5章数组
习题5.1编写一个程序,从键盘上读入5个double类型的值,将它们存储到一个数组中。
计算每个值的倒数(值x的倒数是1.0/x),将结果存储到另一个数组中。
输出这些倒数,并计算和输出倒数的总和。
#include
intmain()
{
doubleoriginal[5]={0.0};
doubleresult[5]={0.0};
doublesum=0.0;
for(inti=0;i<5;i++)
{
printf("%d->",i+1);
scanf("%lf",&original[i]);
}
for(inti=0;i<5;i++)
{
result[i]=1.0/original[i];
}
for(inti=0;i<5;i++)
{
printf("result[%d]=%lf\n",i,result[i]);
sum+=result[i];
}
printf("sum=%lf\n",sum);
return0;
}
习题5.2定义一个数组data,它包含100个double类型的元素。
编写一个循环,将以下的数值序列存储到数组的对应元素中:
1/(2*3*4)1/(4*5*6)1/(6*7*8)...upto1/(200*201*202)
编写另一个循环,计算:
data[0]-data[1]+data[2]-data[3]+...-data[99]
将这个结果乘以4.0,加3.0,输出最后的结果。
#include
intmain()
{
doubledata[100]={0.0};
doublesum=0.0;
doubleresult=0.0;
for(inti=1;i<=100;i++)
{
data[i-1]=1.0/((2*i)*(2*i+1)*(2*i+2));
}
for(inti=0;i<100;i++)
{
sum+=(i%2?
-1:
1)*data[i];
}
result=sum*4.0+3.0;
printf("计算结果为:
%lf\n",result);
return0;
}
习题5.3编写一个程序,从键盘上读入5个值,将它们存储到一个float类型的数组amounts中。
创建两个包含5个long元素的数组dollars和cents。
将amounts数组元素的整数部分存储到dollars的对应元素中,amounts数组元素的小数部分存储到cents中,只保存两位