学习目标

  1. 格式化输入函数scanf
  2. 格式化输出函数printf
  3. 输出精度和对齐的控制

数据、变量与内存

计算机中的数据放在变量里,变量存在于内存中,内存好像一排排小抽屉一样。

不同的变量分配到不同位置的抽屉,抽屉的位置就是变量在内存的地址。

01.格式化输入与输出函数

printf();格式化输出数据
scanf();格式化输入数据

1.1格式化输入函数scanf()

scanf(“格式字符串”,&变量1);
  1. 从键盘输入一个数据给变量1
  2. 格式字符串是包含格式控制符的字符串,用一对双引号"括起来
  3. 格式控制符描述输入的数据类型,例如**%d是整型int的格式控制符**
  4. &是取地址运算符号,比如,&a表示变量a在内存的地址
int a;
scanf("%d", &a);

格式字符串里有一个%d,变量名a前加&,表示需要输入一个整数变量a的内存地址

scanf(“格式字符串”,&变量1,&变量2,);

●从键盘输入多个数据给多个变量,变量地址之间用逗号隔开
●变量类型和格式控制符必须一一对应
●变量地址之间用逗号,隔开

int a,b;
scanf("%d%d", &a, &b); 

2个%d表示需要输入两个整数第一个数据给变量a,第二个数据给变量b一一对应

1.2格式控制符

数据类型 整型 浮点型 字符型
int long float double long double char
%d %lld %f %lf %Lf %c

表1 常用数据类型与格式控制符对照表

  1. %表示格式的起始符号,不可缺少
  2. 整型数据类型都必须有d
  3. 浮点型都必须有f参数
  4. I、L是长度修饰符

别慌,也不用现在背这些,遇到不同的情况我们慢慢积累就好。

#include<iostream>
using namespace std;
int main()
{
	int num;
	float flt;
	char ch;
	scanf("%d%f%c",&num,&flt,&ch) ;//输入一个整数、一个浮点数和一个字符
	cout<<num<<","<<flt<<","<<ch; 
	return 0;
}
12空格23.04不加空格a
输入:12 23.04a
输出:12,23.04,a
12空格23.04加空格a
输入:12 23.04a
输出:12,23.04→空格

scanf从键盘输入多个数据时
●如果是整型或浮点型,必须用分隔符(空格或回车)隔开
●数值与字符之间,字符和字符之间不要加分隔符 (否则会把分隔符当做需要输入的字符)

2.格式化输出函数Printf

**printf("格式字符串”,变量1,变量2,,…)**变量名前面不需要加&

  • 格式化输出一个或多个变量的内容
  • 变量名之间用逗号,隔开
  • 格式控制符个数要和变量一一对应
  • 格式控制符同scanf
整数 浮点 字符 混合
输出printf printf(“%d”,num) printf(“%f”,flt) printf(“%c”,ch) printf(“%d%f”,num,flt)
输入scanf scanf(“%d”,&num) scanf(“%f”,&flt) scanf(“%c”,&ch) scanf(“%d%f”,&num,&flt)
不含格式控制符的字符串被原样输出
printf("这里没有格式控制符");这里没有格式控制符
printf("这里没有格式控制符\n");//添加转义字符\n,进行回车换行。类似于cout语句中的endl
输出两行--
这里没有格式控制符

int n=12;	
printf("answer=%d",n);//answer=会原样输出,用变量值12替换格式控制符%d
输出结果
answer=12
printf("%f%%",0.3333333);//想输出字符%,则应该用连续两个%表示
输出结果
0.3333333%
#include <iostream>
using namespace std;
int main()
{
	int num=12;
	float flt=2.34;
	char ch='a';
	printf("输出结果为\n");
	printf("num=%d,flt=%f,ch=%c\n",num,flt,ch);
	return 0;
}
输出结果为
num=12,flt=2.340000,ch=a

Q:为什么2.34输出显示为2.340000?
A:%f格式:整数部分全部输出并输出6位小数
(用o补齐)C

练习

1、空格分隔输出

【编程挑战】编写一个程序,输入两个整数,调换顺序输出,并用空格符分隔。要求用scanf、printf函数
【输入】输入空格分隔的两个整数
【输出】调换顺序输出,并用空格符分隔
【输入样例】12 90
【输出样例】90 12
问题1,整型数据类型的格式控制符是什么?
答:int的格式控制符是%d,long long是%lld。

#include<iostream>
using namespace std;
int main()
{
	int num1,num2;
	//输入两个数
	scanf("%d%d",&num1,&num2);
	//按照要求格式化输出
	printf("%d %d",num2,num1);
	return 0; 
}
输出结果
12 90
90 12

2、 全能计算器

【编程挑战】编写一个程序,输入两个整数,输出这两个数的加减乘除表达式和计算结果。除法表达式的结果以商和余数展示。
【输入】输入1行,两个空格隔开的整数
【输出】输出4行,分别是这两个数的加减乘除表达式和计算结果
【输入样例】
34 4
【输出样例】
34+4=38
34-4=30
34*4=136
34/4=8…
问题1,以加法计算为例,用一句printf输出加法算式?
答:printf(“%d+%d=%d\n”,num1,num2,num1+num2);
用对应位置的变量内容或表达式计算结果替换格式控制符%d
问题2,整数除法的商和余数怎么计算
答:用num1/num2求商,num1%num2求余数
问题3,用一句print输出除法算式?

答:printf(“%d/%d=%d…%d\n”,num1,num2,num1/num2,num1%num2);

#include<iostream>
using namespace std;
int main()
{
	int num1,num2;
	scanf("%d%d",&num1,&num2);
	printf("%d+%d=%d\n",num1,num2,num1+num2);
	printf("%d-%d=%d\n",num1,num2,num1-num2);
	printf("%d*%d=%d\n",num1,num2,num1*num2);
	printf("%d/%d=%d......%d\n",num1,num2,num1/num2,num1%num2);	return 0;
}
输出结果
    34 4
    34+4=38
    34-4=30
    34*4=136
    34/4=8......2

3.辅助控制符

表-2整型数据相关的辅助控制符

参数 说明
%d 按实际长度输出整数
%md 输出m位(不足时左边补空格,大于m位时按照实际长度输出)
%-md 输出左对齐(不足m位时右边补空格),其他同上
%0md 数字0(紧跟%),表示位数不足m位时左补0
long long 类型的辅助控制符,把d换成lld

%md=左补空格=右对齐
%-md=左对齐=右补空格

3.2辅助控制符

表-3浮点数相关的辅助控制符

参数 说明
%f 不指定宽度,整数部分全部输出并输出6位小数
%m.nf 总位数m (含小数点),其中有n位小数。若数值宽度小于m,左端补空格
%-m.nf 右端补空格,其他同上
%.nf 整数部分全部输出,输出小数点后n位
double、long double类型的辅助控制符类似

不用马上背这些参数,熟能生巧,在练习中慢慢积累就好
在这里插入图片描述
在这里插入图片描述

在格式化输出方面,printf比cout更简单直接

4.1、输出右对齐

【编程挑战】编写一个程序,输入三个整数,按每个整数占8个字符的宽度,右对齐输出它们。
【输入】空格分隔的三个整数
【输出】三行,每行一个整数,每个整数占8个字符的宽度,并且右对齐
【输入样例】12 941 1200
【输出样例】

12
941
1200

问题1,题目指定了输出宽度和对齐方式,相应的格式控制符怎么写?
答:%8d:输出宽度8,右对齐(左补空格)

#include<iostream>
using namespace std;
int main()
{
	int x,y,z;
	scanf("%d%d%d",&x,&y,&z);
	printf("%8d\n",x);
	printf("%8d\n",y);
	printf("%8d\n",z);
	return 0;
	
}
输出结果
    12 911 1200
          12
         911
        1200

【注意】
scanf,变量名前不要忘了&符号
输出也可以写成printf(“%8d\n%8d\n%8d\n”,x,y,z);

抽签概率

抽签是中国的民间习俗,是占卜的一种形式。现今的道观、寺庙和民间的庙宇,大多摆上签筒供人抽取签条问卜。在生活中,有时也经常用抽签的方法来决定一件事情。这样做是否公平呢?
其实虽然有先有后,但每个抽签者中签的概率是相等的,也就是说,不会因为抽签的顺序影响其公平性。

例如,在n张相同的票中只有1张奖票,n个人依次从中各抽1张,那么每个人抽到奖票的概率都是 1/n。

2、中签概率

假设总共有n个签,而其中m个是"中"的。每次抽中的概率是m/n,这个值最后一般要用百分数表示。比如,10签中有3个“中"签
中签率 = 3/10 = 0.3 = (0.3*100)% = 30%。
【编程挑战】编写一个程序,输入两个数,一个总签数,一个有奖的签数,计算并输出中签的概率(百分数的形式)保留2位小数。
【输入】空格隔开的两个数 (确保第一个数大于第二个数)
【输出】输出中签的概率(百分数的形式)保留2位小数
【输入、输出样例】
请输入总签数、中签数:
30 4
13.33%

中签率
问题1,总签数和中签数是整数,两个整数的除法有什么特点?
整数除法得到整数,比如3/10=0。所以,为了得到有效的中奖率的数值,建议用浮点变量,进行浮点数的除法运算。
问题2,浮点数保留2位小数的格式控制符怎么写?
答::%.2f
问题3,printf输出百分符号%有什么需要注意的地方?

答:想输出字符%则应该用连续两个%表示printf(“%.2f%%”,rate);

#include<iostream>
using namespace std;
int main()
{
	float m,n;	//总签数 和中签数 
	float rate;	//中签率
	//输出提示语
	printf("请输入总签数、中签数:\n") ;
	//输入总签数和中签数 
	scanf("%f%f",&m,&n);
	//计算中签率
	rate=n/m;
	rate*=100;//转换百分数
	//输出百分数形式的中签率
	printf("%.2f%%",rate); 
	return 0;
}

2.电子时钟格式

【编程挑战】编写一个程序,输入三个数分别表示小时、分钟和秒,

用电子钟的 XX:XX:XX 的格式输出,比如12:02:09。
【输入】输入空格隔开的三个数
【输出】XX:XX:XX 的格式
【输入、输出样例】〉:分隔符
9 10 3

09:10:03

【提示】注意输出格式里的补0和分隔符

#include<iostream>
using namespace std;
int main()
{
	int x,y,z;
	scanf("%d%d%d",&x,&y,&z);
	printf("%02d:%02d:%02d",x,y,z);
	return 0;
}
输出结果
9 10 3
09:10:03

课堂总结

本次课程的知识点

  1. 格式化输入函数scanf的语法
  2. 格式化输入函数printf的语法
  3. 基本数据类型和格式控制符的对应关系
  4. 用于控制输出宽度、对齐方式、小数精度等的辅助格式控制符
    XX:XX:XX 的格式
    【输入、输出样例】〉:分隔符
    9 10 3

09:10:03

【提示】注意输出格式里的补0和分隔符

#include<iostream>
using namespace std;
int main()
{
	int x,y,z;
	scanf("%d%d%d",&x,&y,&z);
	printf("%02d:%02d:%02d",x,y,z);
	return 0;
}
输出结果
9 10 3
09:10:03

课堂总结

本次课程的知识点

  1. 格式化输入函数scanf的语法
  2. 格式化输入函数printf的语法
  3. 基本数据类型和格式控制符的对应关系
  4. 用于控制输出宽度、对齐方式、小数精度等的辅助格式控制符
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐