C++day06(scanf、printf)
学习目标
- 格式化输入函数scanf
- 格式化输出函数printf
- 输出精度和对齐的控制
数据、变量与内存
计算机中的数据放在变量里,变量存在于内存中,内存好像一排排小抽屉一样。
不同的变量分配到不同位置的抽屉,抽屉的位置就是变量在内存的地址。
01.格式化输入与输出函数
printf();格式化输出数据
scanf();格式化输入数据
1.1格式化输入函数scanf()
scanf(“格式字符串”,&变量1);
- 从键盘输入一个数据给变量1
- 格式字符串是包含格式控制符的字符串,用一对双引号"括起来
- 格式控制符描述输入的数据类型,例如**%d是整型int的格式控制符**
- &是取地址运算符号,比如,&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 常用数据类型与格式控制符对照表
- %表示格式的起始符号,不可缺少
- 整型数据类型都必须有d
- 浮点型都必须有f参数
- 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
课堂总结
本次课程的知识点
- 格式化输入函数scanf的语法
- 格式化输入函数printf的语法
- 基本数据类型和格式控制符的对应关系
- 用于控制输出宽度、对齐方式、小数精度等的辅助格式控制符
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
课堂总结
本次课程的知识点
- 格式化输入函数scanf的语法
- 格式化输入函数printf的语法
- 基本数据类型和格式控制符的对应关系
- 用于控制输出宽度、对齐方式、小数精度等的辅助格式控制符
更多推荐


所有评论(0)