当前位置: 首页 > news >正文

蓝桥杯之c++入门(二)【输入输出(上)】

目录

  • 前言
    • 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类型)。
%Lflong double 类型浮点数。
%c字符。
%S字符串。
%a十六进制浮点数,字母输出为小写。
%A十六进制浮点数,字母输出为大写。
%e使用科学计数法的浮点数,指数部分的e为小写。
%E使用科学计数法的浮点数,指数部分的E为大写。
%i整数,基本等同于%d。
%g6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的e 为小写。
%G等同于%g,唯一的区别是指数部分的E为大写。
%hd十进制short int类型。
%ho八进制short int类型。
%hx十六进制short int类型。
%huunsigned short int类型。
%ld十进制 long int类型。
%lo八进制long int类型。
%lx十六进制long int类型。
%luunsigned long int 类型。
%llo八进制long long int类型。
%llx十六进制 long long int类型。
%lluunsigned long long int 类型。
%Le科学计数法表示的long double类型浮点数。
%n已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。
八进制整数。
%p指针。
%u无符号整数(unsigned int)。
%x十六进制整数。
%zdsize_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整数。
%ffloat类型浮点数。
%lfdouble类型浮点数。
%Lflong 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; //以最后⼀次输⼊为准//添加换⾏endlcin >> 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 = 20cout << 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,我们不仅学习了它们的使用方法,还通过大量实例展示了如何在实际编程中灵活运用这些工具。


相关文章:

蓝桥杯之c++入门(二)【输入输出(上)】

目录 前言1&#xff0e;getchar和 putchar1.1 getchar()1.2 putchar() 2&#xff0e;scanf和 printf2.1 printf2.1.1基本用法2.1.2占位符2.1.3格式化输出2.1.3.1 限定宽度2.1.3.2 限定小数位数 2.2 scanf2.2.1基本用法2.2.2 占位符2.2.3 scanf的返回值 2.3练习练习1&#xff1a…...

消息队列应用示例MessageQueues-STM32CubeMX-FreeRTOS《嵌入式系统设计》P343-P347

消息队列 使用信号量、事件标志组和线标志进行任务同步时&#xff0c;只能提供同步的时刻信息&#xff0c;无法在任务之间进行数据传输。要实现任务间的数据传输&#xff0c;一般使用两种方式&#xff1a; 1. 全局变量 在 RTOS 中使用全局变量时&#xff0c;必须保证每个任务…...

算法题(55):用最少数量的箭引爆气球

审题&#xff1a; 本题需要我们找到最少需要的箭数&#xff0c;并返回 思路: 首先我们需要把本题描述的问题理解准确 &#xff08;1&#xff09;arrow从x轴任一点垂直射出 &#xff08;2&#xff09;一旦射出&#xff0c;无限前进 也就是说如果气球有公共区域&#xff08;交集&…...

谭浩强C语言程序设计(4) 8章(下)

1、输入三个字符串按照字母顺序从小到大输出 #include <cstdio> // 包含cstdio头文件&#xff0c;用于输入输出函数 #include <cstring> // 包含cstring头文件&#xff0c;用于字符串处理函数#define N 20 // 定义字符串的最大长度为20// 函数&#xff1a;…...

AlexNet论文代码阅读

论文标题&#xff1a; ImageNet Classification with Deep Convolutional Neural Networks 论文链接&#xff1a; https://volctracer.com/w/BX18q92F 代码链接&#xff1a; https://github.com/dansuh17/alexnet-pytorch 内容概述 训练了一个大型的深度卷积神经网络&#xf…...

62.病毒在封闭空间中的传播时间|Marscode AI刷题

1.题目 问题描述 在一个封闭的房间里摆满了座位&#xff0c;每个座位东西向和南北向都有固定 1 米的间隔。座位上坐满了人&#xff0c;坐着的人可能带了口罩&#xff0c;也可能没有带口罩。我们已经知道房间里的某个人已经感染了病毒&#xff0c;病毒的传播速度是每秒钟感染距…...

Elixir语言的安全开发

Elixir语言的安全开发 引言 在当今这个互联网高度发展的时代&#xff0c;软件的安全性变得越来越重要。随着网络攻击的增多&#xff0c;软件漏洞的频繁暴露&#xff0c;开发者面临着前所未有的安全挑战。Elixir&#xff0c;作为一种现代化的函数式编程语言&#xff0c;以其高…...

Rust 条件语句

Rust 条件语句 在编程语言中&#xff0c;条件语句是进行决策和实现分支逻辑的关键。Rust 语言作为一门系统编程语言&#xff0c;其条件语句的使用同样至关重要。本文将详细介绍 Rust 中的条件语句&#xff0c;包括其基本用法、常见场景以及如何避免常见错误。 基本用法 Rust…...

小红的合数寻找

A-小红的合数寻找_牛客周赛 Round 79 题目描述 小红拿到了一个正整数 x&#xff0c;她希望你在 [x,2x] 区间内找到一个合数&#xff0c;你能帮帮她吗&#xff1f; 一个数为合数&#xff0c;当且仅当这个数是大于1的整数&#xff0c;并且不是质数。 输入描述 在一行上输入一…...

使用等宽等频法进行数据特征离散化

在数据分析与处理的过程中,特征离散化是一种常见的操作。通过将连续的数值型数据转换为离散类别,能够更好地处理数据,尤其是在机器学习模型中进行分类问题的建模时。离散化能够简化数据结构,减少数据噪声,并提高模型的解释性。 本文将详细介绍如何使用 pandas 库中的 cut…...

解析 Oracle 中的 ALL_SYNONYMS 和 ALL_VIEWS 视图:查找同义词与视图的基础操作

目录 前言1. ALL_SYNONYMS 视图2. ALL_VIEWS 视图3. 扩展 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. ALL_SYNONYMS 视图 在 Oracle 数据库中&#xff0c;同义词&#xff08;Synonym&#xff09;是对数…...

AI协助探索AI新构型的自动化创新概念

训练AI自生成输出模块化代码&#xff0c;生成元代码级别的AI功能单元代码&#xff0c;然后再由AI组织为另一个AI&#xff0c;实现AI开发AI的能力&#xff1b;用AI协助探索迭代新构型AI将会出现&#xff0c;并成为一种新的技术路线潮流。 有限结点&#xff0c;无限的连接形式&a…...

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(OLED设备层封装)

目录 OLED设备层驱动开发 如何抽象一个OLED 完成OLED的功能 初始化OLED 清空屏幕 刷新屏幕与光标设置1 刷新屏幕与光标设置2 刷新屏幕与光标设置3 绘制一个点 反色 区域化操作 区域置位 区域反色 区域更新 区域清空 测试我们的抽象 整理一下&#xff0c;我们应…...

【Redis】Redis 经典面试题解析:深入理解 Redis 的核心概念与应用

Redis 是一个高性能的键值存储系统&#xff0c;广泛应用于缓存、消息队列、排行榜等场景。在面试中&#xff0c;Redis 是一个高频话题&#xff0c;尤其是其核心概念、数据结构、持久化机制和高可用性方案。 1. Redis 是什么&#xff1f;它的主要特点是什么&#xff1f; 答案&a…...

TensorFlow 示例摄氏度到华氏度的转换(一)

TensorFlow 实现神经网络模型来进行摄氏度到华氏度的转换&#xff0c;可以将其作为一个回归问题来处理。我们可以通过神经网络来拟合这个简单的转换公式。 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 …...

7.DP算法

DP 在C中&#xff0c;动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一种通过将复杂问题分解为重叠子问题来高效求解的算法设计范式。以下是DP算法的核心要点和实现方法&#xff1a; 一、动态规划的核心思想 重叠子问题&#xff1a;问题可分解为多个重…...

Baklib构建高效协同的基于云的内容中台解决方案

内容概要 随着云计算技术的飞速发展&#xff0c;内容管理的方式也在不断演变。企业面临着如何在数字化转型过程中高效管理和协同处理内容的新挑战。为应对这些挑战&#xff0c;引入基于云的内容中台解决方案显得尤为重要。 Baklib作为创新型解决方案提供商&#xff0c;致力于…...

在C语言多线程环境中使用互斥量

如果有十个银行账号通过不同的十条线程同时向同一个账号转账时&#xff0c;如果没有很好的机制保证十个账号依次存入&#xff0c;那么这些转账可能出问题。我们可以通过互斥量来解决。 C标准库提供了这个互斥量&#xff0c;只需要引入threads.头文件。 互斥量就像是一把锁&am…...

项目练习:重写若依后端报错cannot be cast to com.xxx.model.LoginUser

文章目录 一、情景说明二、解决办法 一、情景说明 在重写若依后端服务的过程中 使用了Redis存放LoginUser对象数据 那么&#xff0c;有存就有取 在取值的时候&#xff0c;报错 二、解决办法 方法1、在TokenService中修改如下 getLoginUser 方法中&#xff1a;LoginUser u…...

代码随想录刷题笔记

数组 二分查找 ● 704.二分查找 tips&#xff1a;两种方法&#xff0c;左闭右开和左闭右闭&#xff0c;要注意区间不变性&#xff0c;在判断mid的值时要看mid当前是否使用过 ● 35.搜索插入位置 ● 34.在排序数组中查找元素的第一个和最后一个位置 tips&#xff1a;寻找左右边…...

AI智慧社区--人脸识别

前端 人脸的采集按钮&#xff1a; 首先对于选中未认证的居民记录&#xff0c;进行人脸采集 前端的按钮 <el-form-item><el-button v-has"sys:person:info" type"info" icon"el-icon-camera" :disabled"ids.length < 0" …...

对象的实例化、内存布局与访问定位

一、创建对象的方式 二、创建对象的步骤: 一、判断对象对应的类是否加载、链接、初始化: 虚拟机遇到一条new指令&#xff0c;首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已经被加载、解析和初始化…...

React基础知识回顾详解

以下是React从前端面试基础到进阶的系统性学习内容&#xff0c;包含核心知识点和常见面试题解析&#xff1a; 一、React基础核心 JSX原理与本质 JSX编译过程&#xff08;Babel转换&#xff09;虚拟DOM工作原理面试题&#xff1a;React为何使用className而不是class&#xff1f;…...

开发第一个安卓页面

一&#xff1a;在java.com.example.myapplication下创建MainActivity的JAVA类 里面的代码要把xml的页面名字引入 二&#xff1a;如果没有这两个&#xff0c;可以手动创建layout文件夹和activity_main.xml activity_main.xml使用来做页面的。 三、找到这个文件 把你的JAVA类引入…...

物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

一、MQTT介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;是一种基于发布/订阅模式的轻量级通讯协议&#xff0c;构建于TCP/IP协议之上。它最初由IBM在1999年发布&#xff0c;主要用于在硬件性能受限和网络状况不佳的情…...

微服务-配置管理

配置管理 到目前为止我们已经解决了微服务相关的几个问题&#xff1a; 微服务远程调用微服务注册、发现微服务请求路由、负载均衡微服务登录用户信息传递 不过&#xff0c;现在依然还有几个问题需要解决&#xff1a; 网关路由在配置文件中写死了&#xff0c;如果变更必须重…...

基于SpringBoot的智慧康老疗养院管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

100.1 AI量化面试题:解释夏普比率(Sharpe Ratio)的计算方法及其在投资组合管理中的应用,并说明其局限性

目录 0. 承前1. 夏普比率的基本概念1.1 定义与计算方法1.2 实际计算示例 2. 在投资组合管理中的应用2.1 投资组合选择2.2 投资组合优化 3. 夏普比率的局限性3.1 统计假设的限制3.2 实践中的问题 4. 改进方案4.1 替代指标4.2 实践建议 5. 回答话术 0. 承前 如果想更加全面清晰地…...

LLMs之OpenAI o系列:OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略

LLMs之OpenAI o系列&#xff1a;OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之o3&#xff1a;《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读 LLMs之OpenAI o系列&#xff1a;OpenAI o3-mini的简介、安…...

深度解析:网站快速收录与网站安全性的关系

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/58.html 网站快速收录与网站安全性之间存在着密切的关系。以下是对这一关系的深度解析&#xff1a; 一、网站安全性对收录的影响 搜索引擎惩罚&#xff1a; 如果一个网站存在安全隐患&am…...