《C语言程序设计:问题与求解方法》——2.11节数据输出—格式化输出函数 printf()的用法

简介:

本节书摘来自华章社区《C语言程序设计:问题与求解方法》一书中的第2章,第2.11节数据输出—格式化输出函数 printf()的用法,作者:何 勤,更多章节内容可以访问云栖社区“华章社区”公众号查看

2.11 数据输出—格式化输出函数 printf()的用法
变量的值如果不从内存单元中取出来,通过输出设备送到计算机的外部,这个值对外界就不起任何作用,程序本身的运行也就失去了意义。
1.变量值的输出
格式化输出库函数printf()用来在某些常用的输出设备(PC的显示器或打印机)上输出双引号括住的格式控制串中的字符序列。
但是,printf()不仅可以像例题2.3那样,将格式串中的字符序列按照原样输出,还可以通过格式串的设置和控制,输出n个(n≥1)变量的值,其格式为:
printf("占位符1占位符2......占位符n*",变量1,变量2,......,变量n) ;
“占位符1”的类型要与“变量1”的类型匹配,“占位符2”的类型要与“变量2”的类型匹配,……,“占位符n”的类型要与“变量n”的类型匹配。
在上式中使用了位于占位符左右两边的“ *” 号表示:在此处可以出现0个或任意多个按照原样输出的普通字符或者转义字符。
占位符也称为格式符,由符号“%”和转换说明符构成。常用的占位符有%d、%f或%c,它们与要输出的变量类型之间的简单对应关系如表2-3所示。


b51316f2cfbc7c71ecf81a007030f63d27563622

【例题2.4】示例程序。

1  #nclude<stdio.h>
2  int main(void)
3  {
4   int    num= 123 ; 
5   float  x=34.678 ;
6   char   ch='+';
7   printf("%d %f %c\n", num, x,ch); //将三个变量的值从对应内存单元中取出来输出
8   return  0;
9  }
程序运行结果为:
123 34.678000 +

此题的格式控制串是:"%d %f %cn"。
注意:在格式串中的三个占位符之间都加了一个空格字符。如果将格式串中的占位符连在一起书写“%d%f%c”,则几个输出项的数据就会紧密地连在一起,即12334.678000+,这是绝对不可取的。
本题中由于三个输出变量顺序已定(num, x,ch),所以格式串中的三个占位符之间的顺序绝不能调换。但是,可以在此题的格式串中加入任意多个普通字符(即按照原样输出的非空白字符)和转义字符。
如果变量num代表车牌号,x表示车速,而ch表示车辆是否要加油的话,那么,使用以下的printf()函数调用语句来替换以上程序的第7行,会变得更有实际意义:
printf("车牌号为:%d,车速是:%f千米/小时,加油标志: %cn", num ,x ,ch);
输出结果为:
车牌号为:123, 车速是:34.678000千米/小时, 加油标志: +
由此可见,“占位符”所起的作用是为所对应的、要输出的变量的值,在格式串中事先占据一个适当位置。
换句话说,在调用printf()函数时,所有输出变量的值都必须插入格式控制串中去,插入的位置是所对应的占位符事先为它占据的,与原样输出的普通字符(还包括必须转义输出的转义字符)结合起来,最终形成输出到显示(或打印机)上的信息。
【练习】将例题2.4中第7行的语句printf("%d %f %cn", num, x,ch);分别改为以下的形式,重新编译运行,看看会怎样?错在哪里?

1)printf("%d %f \n", num, x,ch);
2)printf("%d %f %c\n, num, x,ch");

2.对浮点型数据更精细的输出控制
对于小数形式的实型量,格式符 %f 默认规定小数点后面一共显示6位。要想改变默认规定的显示位数,可将占位符书写为: %.nf , n是你想要显示的小数点后经过四舍五入的位数。
例如,对于以下程序:

1 #include<stdio.h>
2 main(void)
3  {
4    x=34.6789 ; 
5    printf("x=%.2f",x);
6  }
输出结果为: 
       x=34.68      // x=是普通字符

如想控制数据输出的宽度,可以用%m.nf这种形式。m为数据占据的输出总宽度(包括整数部分、小数部分和小数点)。比如,将以上程序第5行改为“printf(“x=%6.2f”,x);”,那么输出结果为x= 34.68,不足部分将在左边填充空格。
3.占位符与变量类型的匹配问题
初学者经常犯的编程错误是类型不匹配,如将%d与浮点型数据匹配,将%f 与整型数据匹配。
例如,有如下定义“int i ; float x ;”,则以下两条语句都是错误的:
printf("%f" , i ); //错! 正确的是: printf("%d" , i );
printf("%d" , x ); //错! 正确的是: printf("%f" , x );
格式化输出库函数printf()的功能其实很强大,不仅可用它来输出多个变量的值,还可用它来输出多个表达式的值。它的用法也很复杂,容易用错。比较深入的讲解请参见下一章。
有了以上这些必要知识,现在我们终于可以开始编写一个简单程序了。
【例题2.5】求住宅的每月物管费用。 已知某住宅小区每平方米每个月的物管费用是1.3元人民币,求86.5平方米的一套住宅每月要交的物管费用是多少。
程序分析:每月的单位面积物管费用1.3元是一个常量,很少会改变,我们不妨用常量表示。住宅面积要用一个float型的变量tenement_area来表示,这是因为程序要处理的每套住宅的面积都可能不一样,而且不一定都是整数。
该住宅每月应交的物管费用也还要用一个变量来表示。显然还是应该用float类型来定义,该变量不妨用标识符management_cost 来命名。
一套住宅每月的物管费用应当是:1.3×tenement_area。
经过上述分析,我们可以编写出如下程序:

0  #include<stdio.h>
1 int  main(void)
2 { 
3  float   tenement_area=86.5  ;  /*定义实型变量时初始化为86.5*/ 
4  float   management_cost ;     /*定义实型变量物管费用*/
5  management_cost=1.3 * tenement_area ;  /* 求出每月物管费用*/
6   printf("每月物管费用为:%.2f元\n" , management_cost ) ; 
7  return  0;
8 }

【问题】是否可以把第6行语句中的分号、双引号和圆括号改为中文输入法下的分号、双引号和圆括号?请你亲自试一试。
运行以上程序,得到的结果是:
每月物管费用为:112.45元
程序说明:在C语言程序中,我们要使用C字符集中的 “” 替换“ ×” 表示要做乘法运算。这样一来,就可通过第5行的语句management_cost=1.3 tenement_area ; 求出每月要交的物管费用,并且存放在变量management_cost中。因为这条语句的含义是:计算出式子1.3 * tenement_area的值,并把它保存在变量management_cost所对应的内存单元中(这其实是一条本章后面将要详细讲解的赋值语句)。
但是,此程序还存在一个亟待解决的问题:这个程序不经过修改,只能计算面积为86.5平方米的住宅每月的物管费用。如果要计算其他面积住宅的每月物管费用,必须在每次运行之前修改程序的第3行并且重新编译。这对于程序的使用者来说非常麻烦—万一程序的编写者不在怎么办?
如果在程序每次运行时,能够通过键盘将实际的住宅面积输入变量tenement_area中,那么这个程序每一次运行就可以算出一套实际住宅的每月物管费用,也就可以不必每次都修改程序。
所以,在程序运行时,将程序变量需要的当前值,通过键盘输入内存的对应单元中去是非常重要的、必不可少的。这样增加了程序的适应性和灵活性。
下面一节将讨论如何调用格式化输入库scanf()函数,在程序运行时,通过键盘输入一个或多个变量的值,解决上述至关重要的问题。

相关文章
|
2月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
32 1
一文彻底搞清楚C语言的函数
|
3月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
173 16
|
3月前
|
算法 C语言
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
148 18
|
3月前
|
Serverless C语言
【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;运用迭代公式,编写一个循环程序,求解出数值x的平方根。注意:不能直接用平方根公式/函数求解本题!开始你的任务吧,祝你成功!​ 相关知识 求平方根的迭代公式 绝对值函数fabs() 循环语句 一、求平方根的迭代公式 1.原理 在C语言中,求一个数的平方根可以使用牛顿迭代法。对于方程(为要求平方根的数),设是的第n次近似值,牛顿迭代公式为。 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得越来越接近。
96 18
|
3月前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
95 13
|
3月前
|
存储 安全 C语言
【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】
分支的语句,这可能不是预期的行为,这种现象被称为“case穿透”,在某些特定情况下可以利用这一特性来简化代码,但在大多数情况下,需要谨慎使用。编写一个程序,该程序需输入个人数据,进而预测其成年后的身高。根据提示,在右侧编辑器补充代码,计算并输出最终预测的身高。分支下的语句,提示用户输入无效。常量的值必须是唯一的,且在同一个。语句的作用至关重要,如果遗漏。开始你的任务吧,祝你成功!,程序将会继续执行下一个。常量都不匹配,就会执行。来确保程序的正确性。
176 10
|
3月前
|
小程序 C语言
【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】
目录 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: 任务描述 相关知识 编程编写一个程序,从键盘输入3个变量的值,例如a=5,b=6,c=7,然后将3个变量的值进行交换,使得a=6,b=7,c=5。面积=sqrt(s(s−a)(s−b)(s−c)),s=(a+b+c)/2。使用输入函数获取半径,格式指示符与数据类型一致,实验一下,不一致会如何。根据提示,在右侧编辑器补充代码,计算并输出圆的周长和面积。
100 10
|
3月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
96 3
|
3月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
81 2
|
3月前
|
存储 C语言
【C语言程序设计——循环程序设计】利用数列的累加和求 sinx(头歌实践教学平台习题)【合集】
项的累加和,一般会使用循环结构,在每次循环中计算出当前项的值(可能基于通项公式或者递推关系),然后累加到一个用于存储累加和的变量中。在C语言中推导数列中的某一项,通常需要依据数列给定的通项公式或者前后项之间的递推关系来实现。例如,对于一个简单的等差数列,其通项公式为。的级数,其每一项之间存在特定的递推关系(后项的分子是其前项的分子乘上。,计算sinx的值,直到最后一项的绝对值小于。为项数),就可以通过代码来计算出指定项的值。对于更复杂的数列,像题目中涉及的用于近似计算。开始你的任务吧,祝你成功!
118 6