本人编程小白,正在奋力自学C语言。内容如有错误,欢迎交流。
电子版C primer plus 第6版 中文文字版下载地址
下载地址
以下为课后练习。
使用编译器 vs 2013 。
如使用其他编译器,可将scanf_s()修改为scanf(),同时删除sizeof()。具体原因请学习scanf_s()和scanf()的区别。
4.8.1 编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。
// 4.8.1 姓名打印.cpp 。
#include "stdafx.h" //vs中头文件stdafx.h包括#include 和#include
#include
int _tmain()
{
char ft_name[20];
char lt_name[20];
printf("ENTER YOUR FIRST NAME:");
scanf_s("%s", lt_name, sizeof(lt_name)); //1. scanf_s最后一个参数sizeof(lt_name)是接收缓冲区的大小(即lt_name的容量)。2.如果用scanf()读取基本变量类型的值,在变量名前加上一个&;如果用scanf()把字符串读入字符数组中,不要使用&。
printf("ENTER YOUR LAST NAME:");
scanf_s("%s", ft_name, sizeof(ft_name));
printf("%s,%s", lt_name, ft_name);
return 0;
}
4.8.2 编写一个程序,提示用户输入名字,并执行以下操作:
a. 打印名字,包括双引号;
b. 在宽度为20 的字段右端打印名字,包括双引号;
c. 在宽度为20 的字段左端打印名字,包括双引号;
d. 在比姓名宽度宽3的字段中打印名字。
// 4.8.2 姓名打印.cpp
//
#include "stdafx.h"
#include
#include
int main()
{
char first_name[40];
char last_name[40];
int first_name_length = 0;
int last_name_lenght = 0;
printf("What's your first name:");
scanf_s("%s", first_name, sizeof(first_name));
printf("What's your last name:");
scanf_s("%s", last_name, sizeof(first_name));
first_name_length = strlen(first_name); // strlen()函数的头文件为sting.h
last_name_lenght = strlen(last_name);
printf("a.\"%s,%s\"\n", first_name, last_name);
printf("b.\"%20s,%20s\"\n", first_name, last_name);//%20s中20 控制最小字段宽度,参考教材83页表4.4
printf("c.\"%-20s,%-20s\"\n", first_name, last_name);//%-20s中-号控制左对齐.参考教材84页表4.5
printf("d.%*s,%*s\n", first_name_length + 3, first_name, last_name_lenght + 3, last_name);//%*s中*修饰符替代字段宽度可以通过程序来指定字段宽度。参考教材95页4.4.6.
return 0;
}
4.8.3 编写一个程序,读取一个浮点数,首先以小数点记数法打印,然后以指数记数法打印。用下面的格式进行输出(系统不同,指数记数法显示的位数可能不同):
a.The input is 21.3 or 2.1e + 001;
b.The input is+ 21.290 or 2.129E + 001;
// 4.8.3 浮点打印.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
int _tmain()
{
float f_num;
printf("Please enter a number : ");
scanf_s("%f", &f_num, sizeof(f_num));
printf("a.The input is %.1f or %.1e\n", f_num, f_num);
/*
%.1f 中“.数字”控制字段精度,数字表示小数点后有几位数,如.5表示小数点后5位。
%.1e中e表示使用指数计数法显示。
参考教材83页表4.4
*/
printf("b.The input is %+5.3f or %.3E\n", f_num, f_num);
/*
%+5.3f中 5.3 的5控制字段宽度,.3控制小数位数,5.3即表示字段宽度5字符,小数位数为2。符号+在值前显示加号。
%.3E中E为大写,则打印值为大写,小写则小写。
参考教材83页表4.4和4.5
*/
return 0;
}
4.8.4 编写一个程序,提示用户输入身高(单位:英寸)和姓名,然后以下面的格式显示用户刚输入的信息:
Dabney, you are 6.208 feet tall
使用float类型,并用/作为除号。如果你愿意,可以要求用户以厘米为单位输入身高,并以米为单位显示出来。
// 4.8.4 身高和姓名.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#define INCH_PER_FEET 12 //#define NAME value 定义常量,参考教材76页4.3。C语言传统 符号常量用大写。
int _tmain()
{
float f_height_in, f_height_ft;
char name[20];
printf("Please enter your height:");
scanf_s("%f", &f_height_in, sizeof(f_height_in));
printf("Please enter your name:");
scanf_s("%s", name, sizeof(name));
f_height_ft = f_height_in / INCH_PER_FEET;
printf("%s,you are %.3f feet tall\n", name, f_height_ft);
return 0;
}
4.8.5.编写一个程序,提示用户输入以兆位每秒(Mb/s)为单位的下载速度和以兆字节(MB)为单位的文件大小。程序中应计算文件的下载时间。注意,这里1字节等于8位。使用float类型,并用/作为除号。
该程序要以下面的格式打印 3 个变量的值(下载速度、文件大小和下载时间),显示小数点后面两位数字:
At 18.12 megabits per second, a file of 2.20 megabytes downloads in 0.97 seconds.
// 4.8.5 下载.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
int _tmain()
{
float f_speed, f_size, f_time;
printf("Please enter the speed and file size:");
scanf_s("%f %f", &f_speed, &f_size,sizeof(f_speed), sizeof(f_size));
f_time = f_size / f_speed;
printf("At %.2f megabits per second, a file of %.2f megabytes downloads in %.2f seconds.\n", f_speed, f_size, f_time);
return 0;
}
4.8.6.编写一个程序,先提示用户输入名,然后提示用户输入姓。在一行打印用户输入的名和姓,下一行分别打印名和姓的字母数。字母数要与相应名和姓的结尾对齐,如下所示:
Melissa Honeybee
7 8 (右对齐)
接下来,再打印相同的信息,但是字母个数与相应名和姓的开头对齐,如下所示:
Melissa Honeybee
7 8(左对齐)
// 4.8.6姓名字母数.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include
int _tmain()
{
char given_name[20];
char family_name[20];
int given_name_length = 0;
int family_name_lenght = 0;
printf("Please enter your given name:");
scanf_s("%s", given_name, sizeof(given_name));
printf("Please enter your given name:");
scanf_s("%s", family_name, sizeof(given_name));
given_name_length = strlen(given_name); //strlen()函数的头文件为sting.h
family_name_lenght = strlen(family_name);
//printf("%d\n", given_name_length);
//printf("%d\n", family_name_lenght);
printf("%s %s\n", given_name, family_name);
printf("%*d %*d\n", given_name_length, given_name_length, family_name_lenght, family_name_lenght); //%*s中*修饰符替代字段宽度可以通过程序来指定字段宽度。参考教材95页4.4.6.
printf("%s %s\n", given_name, family_name);
printf("%-*d %-*d\n", given_name_length, given_name_length, family_name_lenght, family_name_lenght);//%-*d中-号控制左对齐.参考教材84页
return 0;
}
4.8.7.编写一个程序,将一个double类型的变量设置为1.0/3.0,一个float类型的变量设置为1.0/3.0。分别显示两次计算的结果各3次:一次显示小数点后面6位数字;一次显示小数点后面12位数字;一次显
示小数点后面16位数字。程序中要包含float.h头文件,并显示FLT_DIG和DBL_DIG的值。1.0/3.0的值与这些值一致吗?
// 4.8.7 double float 显示.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include
int _tmain()
{
float f_num = 1.0 / 3.0;
double d_num = 1.0 / 3.0;
printf("the value of FLT_DIG:%d, the value of DBL_DIG:%d\n", FLT_DIG, DBL_DIG);
printf("the value of float %.6f, the value of double %.6f\n", f_num, d_num);
printf("the value of float %.12f, the value of double %.12f\n", f_num, d_num);
printf("the value of float %.16f, the value of double %.16f\n", f_num, d_num);
return 0;
}
4.8.8.编写一个程序,提示用户输入旅行的里程和消耗的汽油量。然后计算并显示消耗每加仑汽油行驶的英里数,显示小数点后面一位数字。接下来,使用1加仑大约3.785升,1英里大约为1.609千米,把
单位是英里/加仑的值转换为升/100公里(欧洲通用的燃料消耗表示法),并显示结果,显示小数点后面 1 位数字。注意,美国采用的方案测量消耗单位燃料的行程(值越大越好),而欧洲则采用单位距离
消耗的燃料测量方案(值越低越好)。使用#define 创建符号常量或使用 const 限定符创建变量来表示两个转换系数。
// 4.8.8 汽油消耗.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#define KM_PER_MILE 1.609
int _tmain()
{
const double PINT_PER_GALLON = 3.785; //限定常量为只读,作用于difine相同,但更灵活。参考教材4.3.1.
float drive_distance = 0.0;
float gas_consum = 0.0;
double pint_per_hundred_km = 0.0;
double mile_per_gallon = 0.0;
printf("How long have you traveled in kilometer:");
scanf_s("%f", &drive_distance, sizeof(drive_distance));
printf("How much gas have you used in pint:");
scanf_s("%f", &gas_consum, sizeof(gas_consum));
pint_per_hundred_km = gas_consum / drive_distance * 100;
mile_per_gallon = (drive_distance / KM_PER_MILE) / (gas_consum / PINT_PER_GALLON);
printf("Fuel consumptions:%f pint/100km or %f mile/gallon.\n", pint_per_hundred_km, mile_per_gallon);
return 0;
}