目录
- 前言
- 1.getchar和 putchar
- 1.1 getchar()
- 1.2 putchar()
- 2.scanf和 printf
- 2.1 printf
- 2.1.1基本用法
- 2.1.2占位符
- 2.1.3格式化输出
- 2.1.3.1 限定宽度
- 2.1.3.2 限定小数位数
- 2.2 scanf
- 2.2.1基本用法
- 2.2.2 占位符
- 2.2.3 scanf的返回值
- 2.3练习
- 练习1:浮点除法
- 练习2:甲流疫情死亡率
- 练习3:温度表达转化
- 练习4:计算并联电阻的阻值
- 练习5:与圆相关的计算
- 练习6:对齐输出
- 练习7:糖果游戏
- 3.cin和 cout
- 3.1基本用法
- 3.2 连续输入输出
- 3.3 cout的格式输出(加餐)
- 3.3.1 控制宽度和填充(加餐)
- 3.3.2 控制数值格式 (加餐)
- 3.3.3 控制整数格式(加餐)
- 3.3.4 控制对齐方式(加餐)
- 3.4 练习
- 练习1:数字反转
- 练习2:三⻆形⾯积
- 总结
前言
编程的世界里,输入与输出是程序与用户交互的桥梁。无论是简单的数据处理,还是复杂的算法实现,输入输出始终是不可或缺的环节。本章将深入探讨C/C++语言中输入输出的多种方式,从基础的getchar和putchar函数,到功能强大的scanf和printf,再到C++特有的cin和cout流对象,我们将逐步剖析它们的使用方法、特点以及适用场景。
正文开始
1.getchar和 putchar
getchar()getchar()和 putchar() 是属于C语言的库函数,C++是兼容C语言的,所以C++中只要正确包含头文件也可以正常使用这两个函数。
1.1 getchar()
函数原型如下:
int getchar ( void);
**getchar()**函数返回用户从键盘输入的一个字符,使用时不带有任何参数。
程序运行到这个命令就会暂停,等待用户从键盘输入,等同于使用cin或scanf() 方法读取一个字符。
它的原型定义在头文件<cstdio>。
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int ch;
ch = getchar();
cout << ch << endl;
cout << (char)ch << endl;
return 0;
}
getchar()不会忽略起首的空白字符,总是返回当前读取的第一个字符,无论是否为空格。
换行算不算字符呢?答案是肯定的;
我们来看下面的代码:
#include <iostream>
using namespace std;
int main()
{
int ch = getchar();
cout << (char)ch << endl;
cout << ch << endl;
ch = getchar();
cout << (char)ch;
cout << ch << endl;
cout << "xxxxx" << endl;
return 0;
}
运行结果:
上面的代码我们输入了一个a回车,getchar先读取一个字符a打印a和其的ASCII码值97,再读取换行,打印换行,和其ASCII码值10;
如果读取失败,返回常量EOF,由于EOF通常是-1,所以返回值的类型要设为int,而不是char。
如何让getchar()函数读取失败,返回-1呢?其实需要在输入字符之前,直接按Ctrl+z就可以。
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int ch;
ch = getchar();
cout << ch << endl;
return 0;
}
getchar() 通常和 putchar() 是一对儿,配合使用的。
1.2 putchar()
函数原型如下:
int putchar( int character );
putchar()函数将它的参数字符输出到屏幕,它的原型定义在头文件<cstdio>。
#include <cstdio>
int main()
{
int ch = 0;
ch = getchar();
putchar(ch);
return 0;
}
操作成功时, putchar()返回输出的字符,否则返回常量 EOF。
小提示:
当用到快速读写,就会用到这两个函数。
2.scanf和 printf
scanf() 和 printf()是属于C语言的库函数,C++是兼容C语言的,所以C++中只要正确包含头文件也可以正常使用这两个函数。而且这两个函数在算法竞赛题目中使用的非常频繁,尤其是在输出格式控制中,所以接下来我们这里认真学习一下。
对printf和scanf有更深入的了解可以看看小编的这篇文章:
C语言的 printf 与 scanf
2.1 printf
printf() 函数原型如下:
int printf ( const char * format, ... );
2.1.1基本用法
printf()的作用是将参数文本输出到屏幕。
它名字里面的f代表format(格式化),表示可以定制输出文本的格式。
#include <cstdio>
int main()
{
printf("Hello World");
return 0;
}
上面命令会在屏幕上输出一行文字“Hello World”。
printf() 不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行。
为了让光标移到下一行的开头,可以在输出文本的结尾,添加一个换行符\n。
#include <cstdio>
int main()
{
printf("Hello World\n");
return 0;
}
如果文本内部有换行,也是通过插入换行符来实现,如下方代码:
#include <cstdio>
int main()
{
printf("Hello\nWorld");
return 0;
}
2.1.2占位符
printf() 可以在输出文本中指定占位符。
所谓“占位符”,就是这个位置可以用其他值代入。
#include <cstdio>
// 输出 There are 3 apples
int main()
{
printf("There are %d apples\n", 3);
return 0;
}
上面示例中,There are %d apples\n是输出文本,里面的%d就是占位符,表示这个位置要用其他值来替换。占位符的第一个字符一律为百分号%,第二个字符表示占位符的类型,%d表示这里代入的值必须是一个整数。
printf() 的第二个参数就是替换占位符的值,上面的例子是整数3替换%d。执行后的输出结果就是 There are 3 apples。
常用的占位符除了%d,还有%s表示代入的是字符串。
#include <cstdio>
int main()
{
printf("%s will come tonight\n", "zhangsan");
return 0;
}
上面示例中,%s表示代入的是一个字符串,所以printf() 的第二个参数就必须是字符串,这个例子是zhangsan。执行后的输出就是zhangsan will come tonight。
输出文本里面可以使用多个占位符。
#include <cstdio>
int main()
{
printf("%s says it is %d o'clock\n", "lisi", 21);
return 0;
}
上面示例中,输出文本%s says it is %d o'clock 有两个占位符,第一个是字符串占位符%s,第二个是整数占位符%d,分别对应printf()的第二个参数(lisi)和第三个参数(21)。执行后的输出就是lisi says it is 21 o'clock。
printf()参数与占位符是一一对应关系,如果有n个占位符,printf()的参数就应该有n+1个。如果参数个数少于对应的占位符,printf() 可能会输出内存中的任意值。
占位符列举:
printf() 的占位符有许多种类,与数据类型相对应。
下面列出常用的占位符,方便查找,具体含义在后面章节介绍。
占位符 | 介绍 |
%d | 十进制整数。 |
%lld | 十进制long long int类型。 |
%f | 小数(包含float类型和double类型)。 |
%Lf | long double 类型浮点数。 |
%c | 字符。 |
%S | 字符串。 |
%a | 十六进制浮点数,字母输出为小写。 |
%A | 十六进制浮点数,字母输出为大写。 |
%e | 使用科学计数法的浮点数,指数部分的e为小写。 |
%E | 使用科学计数法的浮点数,指数部分的E为大写。 |
%i | 整数,基本等同于%d。 |
%g | 6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的e 为小写。 |
%G | 等同于%g,唯一的区别是指数部分的E为大写。 |
%hd | 十进制short int类型。 |
%ho | 八进制short int类型。 |
%hx | 十六进制short int类型。 |
%hu | unsigned short int类型。 |
%ld | 十进制 long int类型。 |
%lo | 八进制long int类型。 |
%lx | 十六进制long int类型。 |
%lu | unsigned long int 类型。 |
%llo | 八进制long long int类型。 |
%llx | 十六进制 long long int类型。 |
%llu | unsigned long long int 类型。 |
%Le | 科学计数法表示的long double类型浮点数。 |
%n | 已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。 |
‰ | 八进制整数。 |
%p | 指针。 |
%u | 无符号整数(unsigned int)。 |
%x | 十六进制整数。 |
%zd | size_t类型。 |
%% | 输出一个百分号。 |
2.1.3格式化输出
printf() 可以定制占位符的输出格式。
2.1.3.1 限定宽度
printf()允许限定占位符的最小宽度。
#include <cstdio>
int main()
{
printf("%5d\n", 123); // 输出为 " 123"
return 0;
}
上面示例中,%5d表示这个占位符的宽度至少为5位。如果不满5位,对应的值的前面会添加空格。输出的值默认是右对齐,即输出内容前面会有空格;
如果希望改成左对齐,在输出内容后面添加空格,可以在占位符的%的后面插入一个’-'号。
int main()
{
printf("%-5d\n", 123); // 输出为 " 123"
return 0;
}
上面示例中,输出内容123的后面添加了空格。
对于小数,这个限定符会限制所有数字的最小显示宽度。
#include <cstdio>
// 输出 " 123.450000"
int main()
{
printf("%12f\n", 123.45);
return 0;
}
上面示例中,%12f表示输出的浮点数最少要占据12位。由于小数的默认显示精度是小数点后6位,所以123.45输出结果的头部会添加2个空格。
2.1.3.2 限定小数位数
输出小数时,有时希望限定小数的位数。举例来说,希望小数点后面只保留两位,占位符可以写成%.2f。
#include <cstdio>
// 输出 Number is 0.50
int main()
{
printf("Number is %.2f\n", 0.5);
return 0;
}
上面示例中,如果希望小数点后面输出3位(0.500),占位符就要写成%.3f。
这种写法可以与限定宽度占位符,结合使用。
// 输出为 " 0.50"
int main()
{
printf("%6.2f\n", 0.5);
return 0;
}
上面示例中,%6.2f表示输出字符串最小宽度为6,小数位数为2。所以,输出字符串的头部有两个空格。
最小宽度和小数位数这两个限定值,都可以用*代替,通过printf() 的参数传入。
#include <cstdio>
int main()
{
printf("%*.*f\n", 6, 2, 0.5);
return 0;
}
// 等同于printf("%6.2f\n", 0.5);
上面示例中, %★.★f的两个星号通过printf() 的两个参数6和2传入。
2.2 scanf
scanf() 函数原型如下:
int scanf ( const char * format,...);
2.2.1基本用法
scanf() 函数用于读取用户的键盘输入。
程序运行到scanf() 这个语句时,会停下来,等待用户从键盘输入。
用户输入数据、按下回车键后,scanf() 就会处理用户的输入,将其存入变量。
scanf()的语法跟printf() 类似。
请看下面的代码:
#include <cstdio>
int main()
{
int i = 0;
scanf("%d", &i);
printf("%d\n", i);
return 0;
}
小提示:
特别注意,scanf函数的占位符后面一般不会加\n,\n是换行,一般在输出的时候才使用
它的第一个参数是一个格式字符串,里面会放置占位符(与printf()的占位符基本一致),告诉编译器如何解读用户的输入,需要提取的数据是什么类型。这是因为C语言的数据都是有类型的,scanf() 必须提前知道用户输入的数据类型,才能处理数据。
它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。
上面示例中,scanf()的第一个参数%d,表示用户输入的应该是一个整数。%d就是一个占位符,%是占位符的标志,d表示整数。第二个参数&i表示,将用户从键盘输入的整数存入变量i。
小提示:
scanf函数中存储数据的变量前面必须加上&运算符(指针变量除外),因为scanf()需要的是地址,必须将变量i的地址取出来传给scanf函数。
如果这里的变量i是数组,那就不用加&运算符。(后期慢慢介绍)
下面是一次从键盘读取多个变量的例子:
先来一个简单的:
#include <cstdio>
int main()
{
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
printf("%d %d %d %d\n", a, b, c, d);
return 0;
}
小提示:
scanf 函数中指定的格式和给程序输入的数据格式要严格的匹配,否则可能不能得到想要的值。
再换一个例子:
#include <cstdio>
int main()
{
int i = 0;
int j = 0;
float x = 0;
float y = 0;
scanf("%d%d%f%f", &i, &j, &x, &y);
printf("i = %d\n", i);
printf("j = %d\n", j);
printf("x = %f\n", x);
printf("y = %f\n", y);
return 0;
}
上面示例中,格式字符串%d%d%f%f,表示用户输入的前两个是整数,后两个是浮点数。
比如键盘输入1-20 3.4-4.0e3,这四个值依次放入i、j、x、y四个变量。
scanf()处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。
所以,用户输入的数据之间,有一个或多个空格不影响scanf()解读数据。另外,用户使用回车键,将输入分成几行,也不影响解读。
1
-20
3.4
-4.0e3
上面示例中,用户分成四行输入,得到的结果与一行输入是完全一样的。每次按下回车键以后,scanf()就会开始解读,如果第一行匹配第一个占位符,那么下次按下回车键时,就会从第二个占位符开始解读。
scanf() 处理用户输入的原理是:
用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读。解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。
#include <cstdio>
int main()
{
int x = 0;
float y = 0;
// 用户输入 " -13.45e12# 0"
scanf("%d", &x);
printf("%d\n", x);
scanf("%f", &y);
printf("%f\n", y);
return 0;
}
上面示例中,scanf() 读取用户输入时,%d占位符会忽略起首的空格,从-处开始获取数据,读取到-13停下来,因为后面的.不属于整数的有效字符。这就是说,占位符%d会读到-13。
第二次调用scanf() 时,就会从上一次停止解读的地方,继续往下读取。这一次读取的首字符是.,由于对应的占位符是%f,会读取到.45e12,这是采用科学计数法的浮点数格式。后面的#不属于浮点数的有效字符,所以会停在这里。
由于scanf() 可以连续处理多个占位符,所以上面的例子也可以写成下面这样。
#include <stdio.h>
int main()
{
int x = 0;
float y = 0;
// ⽤⼾输⼊ " -13.45e12# 0"
scanf("%d%f", &x, &y);
printf("%d %f\n", x, y);
return 0;
}
2.2.2 占位符
scanf() 常用的占位符如下,与 printf()的占位符基本一致。
占位符 | 介绍 |
%c | 字符。 |
%d | 整数。 |
%f | float类型浮点数。 |
%lf | double类型浮点数。 |
%Lf | long double类型浮点数。 |
%s | 字符串。 |
%[] | 在方括号中指定一组匹配的字符(比如%[0-9]),遇到不在集合之中的字符,匹配将会停止。 |
上面所有占位符之中,除了%c以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。
如果要强制跳过字符前的空白字符,可以写成scanf(" %c", &ch) ,即%c前加上一个空格,表示跳过零个或多个空白字符。
#include <cstdio>
int main()
{
char ch = 0;
scanf("%c", &ch);
printf("--%c--\n", ch);
return 0;
}
结果演示:
为了避免在读取这些空⽩字符,可以换⼀种⽅式:
#include <cstdio>
int main()
{
char ch = 0;
scanf(" %c", &ch);
//%c前的空格会让scanf强制跳过空白字符,去读取非空白字符
printf("--%c--\n", ch);
return 0;
}
结果演⽰:
了解这一点后,当‰c和%d等占位符连续使用的时候,也要注意,%c默认不会跳过空白字符的,所以在输入的时候,要非常小心,比如:
#include <cstdio>
int main()
{
int a;
char ch;
scanf("%d%c", &a, &ch);
printf("%d %c\n", a, ch);
return 0;
}
如果在输入的时候,就是想在整数和字符之间加上空格,那么scanf中的格式串中%c的前面就要加上空格。
#include <cstdio>
int main()
{
int a;
char ch;
scanf("%d %c", &a, &ch);
printf("%d %c\n", a, ch);
return 0;
}
正确的输入:
总之要注意,scanf中规定的输入格式和控制台输入数据的格式要保持一致才可能得到正确的结果。
2.2.3 scanf的返回值
scanf() 的返回值是一个整数,表示成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回0。如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)。
#include <cstdio>
int main()
{
int a = 0;
int b = 0;
float f = 0.0f;
int r = scanf("%d %d %f", &a, &b, &f);
printf("a=%d b=%d f=%f\n", a, b, f);
printf("r = %d\n", r);
return 0;
}
输入输出测试:
如果输⼊2个数后,按 ctrl+z ,提前结束输⼊:
在Dev-C++中按下ctrl+z,才结束了输入,我们可以看到r是2,表示正确读取了2个数值。
如果输入的数据一个都不能匹配成功的话,则输出的r是0.
如果一个数字都不输入,直接按ctrl+z ,输出的r是-1,也就是EOF.
掌握了scanf的返回值,我们一般会通过scanf的返回值来处理多组数据输入的竞赛题目,在后期的课程中大家都会一一见到的。
2.3练习
练习1:浮点除法
#include <iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
float c = (float)a/b;
printf("%.3f",c);
return 0;
}
练习2:甲流疫情死亡率
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
float c = b*1.0/a*100.0;
printf("%.3f%%", c);
return 0;
}
小提示:
1.百分号%可以这样输出:printf("%%");
2.注意a和b的取值范围
3.百分比不是直接b/a,是需要乘以100.0的,因为需要得到小数,所以要是小数除法
4.有时候:先乘100再除a,还是先除a再乘100是有差异的。
比如:4/8*100和4*100/8的结果就有差异的。
练习3:温度表达转化
#include <cstdio>
int main()
{
double f = 0;
scanf("%lf", &f);
double c = 5 * (f - 32) / 9.0;
printf("%.5lf\n", c);
return 0;
}
练习4:计算并联电阻的阻值
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double r1,r2;
cin >> r1 >> r2;
printf("%.2lf", 1/((1/r1)+(1/r2)));
return 0;
}
练习5:与圆相关的计算
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double r = 0;
double p = 3.14159;
cin >> r;
printf("%.4lf %.4lf %.4lf",2*r,2*p*r,r*r*p);
return 0;
}
练习6:对齐输出
#include <iostream>
using namespace std;
#include <cstdio>
int main()
{
int a, b, c;
cin >> a >> b >> c;
printf("%8d %8d %8d",a,b,c);
return 0;
}
练习7:糖果游戏
#include <iostream>
using namespace std;
#include <cstdio>
int main()
{
int a, b, c, d, e;
cin >> a >> b >> c >> d >> e;
//1号
a /= 3;
b += a;
e += a;
//2号
b /= 3;
c += b;
a += b;
//3号
c /= 3;
b += c;
d += c;
//4号
d /= 3;
c += d;
e += d;
//5号
e /= 3;
d += e;
a += e;
printf("%5d%5d%5d%5d%5d\n", a, b, c, d, e);
return 0;
}
3.cin和 cout
前面我们已经提到过在C++中提供了:cin和cout两个流对象。
cin是C++中提供的标准输入流对象,一般针对的是键盘,也就是从键盘上输入的字符流,使用cin来进行数据的提取,cin一般是和>>(流提取运算符)配合使用的。cin的功能和scanf 是类似的。
cout是C++中提供的标准输出流对象,一般针对的控制台的窗口,也就是将数据以字符流的形式输出到控制台窗口上显示。cout 一般是和<<(流插入运算符)配合使用。cout的功能和printf|是类似的。
我们在写程序的时候,经常需要处理数据,不管什么类型的数据都是以字符流的形式输入和输出的,也就是不管在键盘上输入什么类型的数据,还是将程序中的各种类型的数据输出显示到控制台屏幕上,都是以字符流的形式处理的。
cin和cout的输入输出非常的方便,不需要手动控制格式,能够自动识别变量类型。
3.1基本用法
#include <iostream>
using namespace std;
int main()
{
int a;
char c;
float f;
cin >> a; // 读取⼀个整数
cin >> c; // 读取⼀个字符
cin >> f; // 读取取⼀个浮点数
cout << "打印结果:"<<endl;
cout << a << endl;
cout << c << endl;
cout << f << endl;
return 0;
}
当我们在键盘输入数据的时候,输入的数据不能被cin解读为对应类型的数据,那么读取也就结束了。
比如:
cin 使用细节:
cin 在读取的时候是根据用户的输入,从前往后,从上往下依次扫描。
cin在读取的过程中遇到空格,自动会跳过,所以不要担心在想要的字符前输入空白字符。
当一行读取结束的时候,会自动换行,读取下一行的内容。
cin后面不可以跟换行endl
3.2 连续输入输出
如果我们一次要输入/输出多个数据,那cin和cout能做到吗?可以!
在上面的代码中,使用cout 进行变量的输出,实质上是将变量插入到cout 对象里,并以cout 对象作为返回值返回,因此我们还可以用<<在后面连续输出多个内容,通过连续输入输出的方式对代码进行编写,效果如下:
cin举例:
#include <iostream>
using namespace std;
int main()
{
int a = 0;
int b = 0;
//同类型变量连续输⼊
cin >> a >> b; //以最后⼀次输⼊为准
//添加换⾏endl
cin >> a >> endl; //代码编译报错
return 0;
}
#include <iostream>
using namespace std;
int main()
{
//不同类型变量的连续输⼊
int a = 0;
char ch = 0;
float f = 0;
cin >> a >> ch >> f;
return 0;
}
cout举例:
#include <iostream>
using namespace std;
int main()
{
//对同⼀类型变量连续输出
int a = 10;
int b = 20
cout << a << " " << b << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
//⽀持相同/不同类型变量的连续输⼊
char ch = 0;
float f = 0.1;
cout << ch << f << endl;
//格式化输出:添加(任意)空格和字符串
cout << "ch:" << ch << " f:" << f << endl;
//格式化输出:多次换⾏
cout << ch << endl << endl;
return 0;
}
cin 的好处:
当输入若干个变量(也就是数据量很少)的时候,我们就可以通过>>把所有的数据用一行代码完成接收,而且无需关心数据的类型,和scanf函数比起来代码的书写非常简洁明了。
cout的好处:
cout 也可以用来连续输出多个数值,而且无需考虑数值的类型,因为它本身会做类型处理,和printf比起来比较方便。
3.3 cout的格式输出(加餐)
printf 函数在输出数据的时候,可以指定格式来输出,比如:指定宽度,比如指定小数点后的位数,对齐方式等等。那么cout 在数据的时候能否指定格式呢?答案是可以的!cout 结合<iomanip>(I0 manipulators)头文件中的操纵符,可以灵活控制输出格式,从而满足各种格式化需求。
3.3.1 控制宽度和填充(加餐)
-
setw:设置字段宽度(只对紧接着的输出项有效)。
-
setfill:设置填充字符。
#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
int a = 123;
cout << "默认宽度: " << a << endl;
cout << "宽度设置为10: " << setw(10) << a << endl;
cout << "宽度为10,不够时填充*: " << setw(10) << setfill('*') << a << endl;
return 0;
}
结果演示:
3.3.2 控制数值格式 (加餐)
- fixed :以固定⼩数点表⽰浮点数,设置后就不会以科学计数法展示了。
- scientific :以科学计数法表⽰浮点数。
- setprecision :设置浮点数的精度,以控制⼩数点后的数字位数,⼀般先固定⼩数点,再设置精度。
#include <iomanip>
int main()
{
float a = 12.349584521314;
cout << "默认:" << a << endl;
cout << "固定小数点方式: " <<fixed << a << endl;
cout << "科学计数法方式: " << scientific << a << endl;
cout << "固定小数点,小数点后2位有效数字: " << fixed << setprecision(2) << a << endl;
return 0;
}
3.3.3 控制整数格式(加餐)
- dec :以⼗进制格式显示整数(默认)。
- hex :以⼗六进制格式显示整数。
- oct :以⼋进制格式显示整数。
#include <iostream>
using namespace std;
#include <iomanip>
int main() {
int n = 255;
cout << "十进制 : " << dec << n << endl;
cout << "十六进制: " << hex << n << endl;
cout << "十进制 : " << oct << n << endl;
return 0;
}
3.3.4 控制对齐方式(加餐)
- left :左对⻬。
- right :右对⻬(默认)。
#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
int n = 123;
cout << "右对齐: " << setw(10) << right << n << endl;
cout << "左对齐: " << setw(10) << left << n << endl;
return 0;
}
3.4 练习
练习1:数字反转
#include <iostream>
using namespace std;
#include <cstdio>
int main()
{
char a,b,c,d,e;
cin >> a >> b >> c >> d >> e;
cout << e << d << c << b << a << endl;
return 0;
}
⼩提⽰:
从题⽬的中可以看出,想要输⼊⼩数,然后反转输出,如果真按照这样的思路往下⾛,也能解决问题,但是可能就复杂了。其实在不管什么类型的数据都是以字符流的形式输⼊和输出的,那我们就可以把输⼊的这个⼩数和⼩数点,都当做字符依次读取,然后再按照想要的顺 序输出就⾏。
如果使⽤ scanf 和 printf函数要指定好占位符,如果使⽤ cin/cout 要指定好变量的类型;
练习2:三⻆形⾯积
#include <iostream>
using namespace std;
#include <cstdio>
#include <cmath>
#include <iomanip>
int main()
{
double a, b, c;
cin >> a >> b >> c;
double p = (a + b + c)/2;
double s = sqrt(p*(p - a)*(p - b)*(p - c));
cout << fixed << setprecision(1) << s << endl;
return 0;
}
总结
本章对C/C++中的输入输出进行了全面而深入的讲解。从基础的字符输入输出函数getchar和putchar,到功能强大的格式化输入输出函数scanf和printf,再到C++中灵活的流对象cin和cout,我们不仅学习了它们的使用方法,还通过大量实例展示了如何在实际编程中灵活运用这些工具。