文章目录
- printf()和scanf()的*修饰符
- C Primer Plus第4章编程题
1.printf()和scanf()的*修饰符
printf()和scanf()都可以用*修饰符来修改转换说明的含义。
printf()的*修饰符:如果你不想预先指定字段宽度,希望通过程序来指定,那么可以使用*修饰符代替字段宽度。但还是要用一个参数告诉函数,字段宽度应该是多少。也就是说,如果转换说明是%*d,那么参数列表中应该包含*和 d对应的值。
#include<stdio.h>
int main(void)
{
unsigned width,precision;
int number=256;
double weight=242.5;
printf("Enter a field width:\n");
scanf("%d,&width");
printf("The number is:%*d:\n",width,number);
printf("Now enter a width and a precision:\n");
scanf("%d %d",&width,&precision);
printf("Weight=%*.*f\n",width,precision,weight);
printf("Done!\n");
return 0;
}
变量width提供字段宽度,number是待打印的数字。因为转换说明中*在d的前面,所以在printf()的参数列表中,width在number的前面。
结果,用户首先输入6,因此6是程序使用的字段宽度。接下来,用户输入8和3,说明字段宽度是8,小数点后面显示第3委数字。一般而言,程序应该根据weight的值来决定这些变量。
scanf()中*的用法有所不同。把*放在%和转换字符之间,会使得scanf()跳过相应的输出项。
#include<stdio.h>
int main(void)
{
int n;
printf("Please enter three integers:\n");
scanf("%*d%*d%d",&n);
printf("The last integer was %d\n",n);
return 0;
}
运行结果:
1.编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。
//程序的功能是读取用户输入的字符串,并且重新格式化输出。应针对名和姓分别定义对应的字符数组,使用scanf()函数和%s转换说明符读取数据。
#include<stdio.h>
int main(void)
{
char name[40];
char surname[40];
printf("Please enter your first name:");
scanf("%s",name);
printf("Please enter your last name:");
scanf("%s",surname);
printf("%s%s",name,surname);
return 0;
}
运行结果:
2.编写一个程序,提示用户输入名和姓,并执行一下操作:
a.打印名和姓,包括双引号;
b.在宽度为20的字段右端打印名和姓,包括双引号;
c.在宽度为20的字段左端打印名和姓,包括双引号;
d.在比姓名宽度宽3的字段中打印名和姓。
#include<stdio.h>
#include<string.h>
int main(void)
{
char name[40];
int width;
printf("Please enter your name:");
scanf("%s",name);
width=printf("%\"%s\"\n.",name); //通过printf()的返回值获取名字的字符长度
width-=4; //printf()的返回值为打印字符数,因此需要排除两个引号、一个换行符、一个句号
width=strlen(name);
printf("\"%20s\".\n",name);
printf("\"%-20s\".\n",name);
printf("\"%*s\".",(width+3),name);
return 0;
}
运行结果:
3. 编写一个程序,读取一个浮点数,首先以小数点记数法打印,然后以指数记数法打印。用下面
式进行输出(系统不同,指数记数法显示的位数可能不同):
a.输入21.3或2.1e+001;
b. 输入+21.290或 2.129E+001;
#include<stdio.h>
int main(void)
{
float input;
printf("Please enter a number:");
scanf("%f",&input);
printf("The input is %.1f or %.1e\n",input,input);
printf("The input is %+.3f or %.3e\n",input,input);
return 0;
}
运行结果:
4.编写一个程序,提示用户输入身高(单位:英寸)和姓名,然后以下面的格式显示用户刚输入的信息:
Dabney, you are 6.208 feet tall
使用 float 类型,并用/作为除号。如果你愿意,可以要求用户以厘米为单位输入身高,并以米为单位显示出来。
#include <stdio.h>
int main()
{
float heigh;
char name[40];
printf("Enter your name:");
scanf("%s",name);
/*scanf()函数读取用户输入的姓名,存入name[]数组中*/
printf("Hi %s,how tall you (are inch ):",name);
scanf("%f",&heigh);
/*scanf()读取用户输入的英寸数值,存入变量heigh 中*/
printf("%s, you are %.3f feet tall \n",name,heigh/12.0);
/*题目要求显示小数点后3位数字*/
return 0;
}
运行结果:
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.
#include <stdio.h>
int main(void)
{
float speed,size,time;
printf("Pleast input the net speed(megabits per second):");
scanf("%f",&speed);
printf("Pleast input the file size(megabyte):");
scanf("%f",&size);
/*分别读取网络下载速度和文件大小,存入相应变量中*/
time= size*8/speed;
/*计算下载时间,文件大小需要转换成兆字节*/
printf("At %.2f megabits per second, a file of %.2f megabytes download in %.2f seconds.",speed,size,time);
return 0;
}
运行结果:
6.编写一个程序,先提示用户输入名,然后提示用户输入姓。在一行打印用户输入的名和姓,下一行分别打印名和姓的字母数。字母数要与相应名和姓的结尾对齐,如下所示:
Melissa Honeybee
7 8
接下来,再打印相同的信息,但是字母个数与相应名和姓的开头对齐,如下所示:
Melissa Honeybee
7 8
#include <stdio.h>
int main(void)
{
char name[40],surname[40];
int wname, wsurname;
printf("Please input your first name:");
scanf("%s",name);
printf("Please input your last name:");
scanf("%s",surname);
/*通过 scanf()函数分别读取用户的名和姓*/
wname = printf("%s",name);
printf(" ");
wsurname =printf("%s",surname);
/*分别打印用户的名和姓,通过返回值记录其字符数量*/
printf("\n%*d %*d",wname,wname,wsurname,wsurname);
/*打印其字符数量,由于数量不确定,因此使用*号修饰符和参数的形式*如果使用strlen()函数,则可以不用定义wname 和wsurname 变量,*直接使用以下代码
/* printf("\n%*d%*d",strlen(name),strlen(name),strlen(surname),strlen(surname));*/
return 0;
}
运行结果:
7.编写一个程序,将一个 double 类型的变量设置为1.0/3.0,一个float 类型的变量设置为1.0/3.0。分别显示两次计算的结果各3次:一次显示小数点后面6位数字;一次显示小数点后面12 位数字;一次显示小数点后面16位数字。程序中要包含float.h 头文件,并显示 FLTDIG和DBL_DIG的值。1.0/3.0的值与这些值一致吗?
8,编写一个程序,提示用户输入旅行的里程和消耗的汽油量。然后计算并显示消耗每加仑汽油行驶的英里数,显示小数点后面一位数字。接下来,使用1 加仑大约3.785 升,1 英里大约为1.609千米把单位是英里/加仑的值转换为升/100 公里(欧洲通用的燃料消耗表示法),并显示结果,显示小数点后面1位数字。注意,美国采用的方案测量消耗单位燃料的行程(值越大越好),而欧洲则采用单位距离消耗的燃料测量方案(值越低越好)。使用#define创建符号常量或使用const限定符创建变量来表示两个转换系数。
感觉好多还没有学会,明天再补充一些后面两个题吧。好困,早睡早起!明天继续加油!