365算法特训营笔记1:C++基础1
什么是C++
C++是在C语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言。
不同于C语言,C++是一种面向对象的语言,在C语言的基础上,C++扩充了一些自己的特有的知识,如bool类型、重载函数、模板、STL等。
程序设计入门
第一个C++程序
#include<iostream>
using namespace std;
int main()
{
cout << "hello world!" << endl ;
return 0;
}
头文件
C++中的输入、输出头文件iostream
i ——input输入
o ——output输出
stream———流
C语言中的头文件以.h后缀,C++中头文件不加后缀。C语言中的string.h头文件,C++用cstring,C语言中的math头文件,C++用cmath头文件。这不只是形式上的改变,其实现也有所不同。
命名空间
C++标准库中所有标识符并定义于一个名为std的命名空间中,std称为标准命名空间(standard,标准的)。
引入标准命名空间方法:
using namespace std;
//语句末尾的分号不能少。
主函数
主函数main()是程序的入口,每个程序都需要一个主函数。主函数返回值为int 型。
int main()
{
cout << "hello world!" << endl;
return 0;
}
输入输出、格式
标准输入输出流的对象和操作方法都是由istream和ostream两个类提供的,这两个类继承自ios基类,他们预定义了标准输入输出流对象,并且提供了多种形式的输入输出功能。
C++在进行输入时需要从流中提取数据,在输入时需要向流中插入数据,提取和插入是通过在流类库中重载”>>”和”<<”运算符来实现的。
四个预定义的标准流对象
cin、cout 、cerr 、 clog
其中cin是istream类的对象,用于处理标准输入(即键盘输入) ;cout是ostream类的对象,用于处理标准输出(即屏幕输出),cerr和clog也都是ostream类的对象,用于处理标准出错信息,并将信息显示到屏幕上。
在这四个标准流对象中,除了cerr不支持缓冲外,其余3个都带有缓冲区。
对象名 | 所属类 | 对应设备 | 含义 |
---|---|---|---|
cin | istream | 键盘 | 标准输入,有缓冲 |
cout | ostream | 屏幕 | 标准输出,有缓冲 |
cerr | ostream | 屏幕 | 标准错误输出,无缓冲 |
clog | ostream | 屏幕 | 标准错误输出,有缓冲 |
cin与提取运算符“>>”结合使用,cout、cerr与clog与插入运算符“<<”结合使用,完成了C++中所有的输入输出操作。
cin
cin是istream类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过提取运算符“>>”从流中提取数据,然后送给cin对象,由cin将对象送到指定地方。
cin是带缓冲区的输入流对象,只有在输入完数据按下回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“>>”才能从中提取数据。
int a
cin >> a ;
此时若从键盘上输入10,则10只是存入缓冲区而并不能为“>>”运算符提取,当按下回车键后,相当于执行endl语句,则缓冲区中内容才被刷新形成输入流,被“>>”运算符提取,然后传递给cin对象,由cin对象送到变量a中存储。
从流中读取数据要保证能正常进行。例如,如果针对上述代码从键盘输入“abc”,则提取操作会失败,此时,cin流被置为出错状态。只有在正常状态时才能从输入流中提取数据,这也是C++I/O的安全性体现。
除了单个变量读取,cin对象也可以一次读入多个变量的值,因为“>>”运算符返回的是istream的引用,可连续提取数据。
char c1,c2;
cin >> c1 >> c2;
若从键盘输入’a’、’b’两个字符,上面的cin语句把输入的’a’字符送给变量c1,把输入的’b’字符送给c2。当输入多个数值时,要在数值之间加空格以示区分,cin读到空格时,就能够区别输入中的各个数值。
除了在输入的数据之间加空格,也可以在每输入一个数据后按回车键,这样完全可以正确的读入数据。
采用cin对象也可以对不同类型的变量读入数据。
string s;
float f;
cin >> s >> f;
当从键盘正确输入字符串和float类型的值时,cin将它们分别存储到对应变量中。字符串的读入也可以采用字符数组存储,例如:
char str[10];
cin >> str;
如果用一个字符数组存储字符串,要确保输入的字符串不超出字符数组的大小,否则会发生溢出,破坏内存中的其他数据。
cout
cout是ostream类预定义的对象,对应的标准设备为屏幕,称作标准输出对象或屏幕输出对象,但也可以重定向输出到磁盘文件。用户可以通过cout对象调用ostream类的插入运算符和成员函数来输出信息。
利用cout对象可以直接输出常量值,代码如下所示:
cout << 10 << endl;
cout << 'a' << endl;
cout << "C++" <<endl;
在输出常量值时,直接将要输出的内容放在“<<”运算符后面即可。
利用cout对象输出变量的值,代码如下所示:
int a = 10 ;
string s = "C++";
float f = 1.2;
cout << a << endl; //输出int 类型的变量
cout << s << endl; //输出string类型的变量
cout << f << endl; //输出float类型的变量
在用cout输出变量值时,不必设置以什么格式输出,“<<”运算符会根据变量的数据类型自动调用相匹配的重载函数,而正确输出。这比C语言中的printf()函数用法更简便。
利用cout对象输出变量的值,代码如下所示:
int a = 10 , *p ;
int& b = a ;
p = &a;
string s = "C++";
string* ps = &s;
cout << p << endl; //输出结果是指针p的值,a变量的地址
cout << b << endl; //输出结果是b的值10
cout << *p << endl; //输出结果是指针p指向的变量的值,即a的值10
cout << ps << endl; //输出结果是指针ps的值,s变量的地址
cout << *ps << endl; //输出结果是指针ps指向的变量的值,即s的值"C++"
当输出数据类型为指针或引用时,与printf()函数的用法一致,不加“”符号是输出指针的值,即变量的地址,带有“”符号输出的是指针指向的变量的值,它比printf()的简便之处在于不必设置数据的输出格式。
利用cout对象可以连续输出数据,代码如下所示:
int a = 10 ;
char c = 'a';
cout << a << "," << c << endl;
当用户在程序中包含了头文件iostream时,编译器调用相应的构造函数产生这4个标准流对象,用户在程序中就可以直接使用它们了。
#include <iostream>
using namespace std;
int main()
{
const double pi = 3.14159;
double r , c , s ;
cout << "输入圆的半径:" ;
cin >> r ;
c = 2.0 * pi * r ;
s = pi * r * r ;
cout << "圆的周长为:" << c << endl;
cout << "圆的面积为:" << s << endl;
return 0;
}
精度、域宽、填充字符的设置
浮点数精度设置
#include <iomanip>
操作符 | 功能 |
---|---|
setfill(char c) | 设置以c表示的填充字符 |
setprecision(int n) | 设置以n表示的数值精度 |
setw(int n) | 设置以n表示的域宽 |
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main ()
{
double d = sqrt(2,0);
cout << "精度设置:" << endl;
for(int i = 0 ; i < 5 ; i ++ )
{
cout << setprecision(i) << d << endl; //设置不同的精度
}
cout << "当前精度为:" << cout.precision() << endl;
cout << "当前域宽:" << cout.width() <<endl;
cout << setw(6) << d << endl; //默认是右对齐
cout << "当前填充字符:" <<endl;
cout <<setfill('*') << setw(10) << d << endl; //setfill()函数可以直接插入流中
return 0;
}
操作符 | 功能 |
---|---|
oct | 以八进制格式输出数据 |
dec | 以十进制格式输出数据 |
hex | 以十六进制格式输出数据 |
endl | 插入换行符并刷新输出缓冲流 |
uppercase | 十六进制输出时字母大写 |
skipws | 输出时跳过空白 |
flush | 刷新流 |
基本运算
+加法、-减法、*乘法、/除法、%取余
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n ;
int ge , shi , bai ;
cin >> n ;
ge = n % 10 ;
shi = (n/10) % 10;
bai = (n/100) % 10;
cout << ge << setw(2) << shi << setw(2) << bai << endl;
return 0 ;
}
算术运算符
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | b=4;-b; | -4 |
+ | 加 | 5+5 | 10 |
- | 减 | 6-4 | 2 |
* | 乘 | 3*4 | 12 |
/ | 除 | 5/5 | 1 |
% | 取模 | 7%5 | 2 |
++ | 自增(前) | a=2;b=++a; | a=3;b=3; |
++ | 自增(后) | a=2;b=a++; | a=3;b=2; |
— | 自减(前) | a=2;b=—a; | a=1;b=1; |
— | 自减(后) | a=2;b=a—; | a=1;b=2; |
赋值运算符
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
= | 赋值 | a=3;b=2; | a=3;b=2; |
+= | 加等于 | a=3;b=2;a+=b; | a=5;b=2; |
-= | 减等于 | a=3;b=2;a-=b; | a=1;b=2; |
*= | 乘等于 | a=3;b=2;a*=b; | a=6;b=2; |
/= | 除等于 | a=3;b=2;a/=b; | a=1;b=2; |
%= | 模等于 | a=3;b=2;a%=b; | a=1;b=2; |
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n , a , b , c ;
cin >> n ;
a = n ++ ;
b *= 10 ;
c /= 10 ;
cout << a << setw(2) << b << setw(2) << c << endl;
return 0 ;
}