跳转至

C/C++基本语法

一、C基本输入输出

1.putchar()

putchar函数字符输出函数,其功能是在终端(显示器)输出单个字符。其函数原型为:

C++
int putchar(int ch)

ch表示要输出的字符内容,返回值作用为:如果输出成功返回一个字符的ASC码,失败则返回EOF即-1,如代码:

C
putchar('A'); /*输出大写字母A */
putchar(x); /*输出字符变量x的值*/
putchar('\n'); /*换行*/

2.getchar()

getchar函数的功能是接收用户从键盘上输入的一个字符。其一般调用形式为:

C
getchar();

getchar会以返回值的形式返回接收到的字符。即该字符的ASC码,通常的用法如下:

C
char c;  /*定义字符变量c*/
c=getchar();  /*将读取的字符赋值给字符变量c*/

3.printf()

printf函数叫做格式输出函数,其功能是按照用户指定的格式,把指定的数据输出到屏幕上,printf函数的格式为:

C
printf("格式控制字符串",输出表项);

格式字符串是以%打头的字符串,在“%”后面跟不同格式字符,用来说明输出数据的类型、形式、长度、小数位数等。格式字符串的形式为:% [输出最小宽度] [.精度] [长度] 类型

在输出最小宽度中,正数表示右对齐,负数表示左对齐

常用的输出格式及含义如下:

格式字符
d , i 以十进制形式输出有符号整数(正数不输出符号)
o 以八进制形式输出无符号整数(不输出前缀0)
x 以十六进制形式输出无符号整数(不输出前缀0x)
u 以十进制形式输出无符号整数
f 以小数形式输出单、双精度类型实数
e 以指数形式输出单、双精度实数
g 以%f或%e中较短输出宽度的一种格式输出单、双精度实数
c 输出单个字符
s 输出字符串

关于printf()的返回值

printf函数的返回值是返回所打印的字符的数目。如有输出错误,那么printf()会返回一个负数(printf()的一些老版本会有不同的值)。

4.scanf()

scanf函数称为格式输入函数,即按照格式字符串的格式,从键盘上把数据输入到指定的变量之中。scanf函数的调用的一般形式为:

C
scanf("格式控制字符串",输入项地址列表);

其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表项中的地址给出各变量的地址,地址是由地址运算符“&”后跟变量名组成的。

scanf函数中格式字符串的构成与printf函数基本相同,但使用时有几点不同。 (1)格式说明符中,可以指定数据的宽度,但不能指定数据的精度。例:

C
float a
scanf(%10f”,&a);  //正确
scanf(%10.2f,&a);  //错误

(2)输入long类型数据时必须使用%ld,输入double数据必须使用%lf或%le

scanf()函数所用的转换说明符与printf()所用的几乎完全相同。主要区别在于printf()把%f、%e、%E、%g、%G同时用于float类型和double类型,而scanf()只是把他们用于float类型,而用于double类型时要求使用l(字母l)修饰符

转换说明符
%c 把输入解释成一个字符
%d 把输入解释成一个有符号十进制整数
%e,%f,%g,%a 把输入解释成一个浮点数(%a是C99的标准)
%E,%F,%G,%A 把输入解释成一个浮点数(%A是C99的标准)
%i 把输入解释成一个有符号十进制整数
%o 把输入解释成一个有符号的八进制整数
%p 把输入解释成一个指针(一个地址)
%s 把输入解释成一个字符串:输入的内容以第一个非空白字符作为开始,并且包含直到下一个空白字符的全部字符
%u 把输入解释成一个无符号十进制整数
%x,%X 把输入解释称一个有符号十六进制整数

scanf()的返回值:

  1. scanf()函数返回成功读入的项目的个数。
  2. 如果它没有读取任何项目(比如它期望接收一个数字而您却输入的一个非数字字符时就会发生这种情况),scanf()返回0。
  3. 当它检测到“文件末尾”(end of file)时,它返回EOF(EOF在是文件stdio.h中的定义好的一个特殊值,一般,#define指令将EOF的值定义为-1)。

5. gets()

在C语言中,除了用scanf,以%s接收字符串之外,还可以使用gets函数更方便的接收字符串,其函数原型如下:

C
char *gets(char *str);

在包含 include 头文件的情况下,可以用gets直接往字符数组里接收字符串,我们通过观察函数原型,可以看到在gets中传入一个字符指针,也就是存放这个字符串的字符数组地址即可接收,需要主要的是,要保证能存的下。

其运行过程为:当执行gets函数时,程序会等待用户从键盘输入的字符串,一旦遇到结束标志,即回车,那么之前输入在缓冲区中的字符串则会一起输入到gets中str所指向的内存区域里。此过程与scanf函数类似,最主要的不同在于,scanf接收时的结束标志有空格和回车,而gets不包括空格。也就意味着gets可以接收空格本身作为内容的一部分。这在实际解题、开发过程中时很有用的。

不过因为可能造成内存溢出,所以在许多的

二、C++基本输入输出

1. 如何精确控制输出格式

2. 常规文件的读写实现

getline()

<istream>中的getline()

输入流的成员函数。

C++
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

C++标准库函数,作用是: 从istream中读取至多n个字符(包含结束标记符)保存在s对应的数组中。即使还没读够n个字符,如果遇到delim 或 字数达到限制,则读取终止,delim都不会被保存进s对应的数组中。

例如:

C++
#include <iostream>
using namespace std;

int main( )
{
   char line[100];
   cout << " Type a line terminated by 't'" << endl;
   cin.getline( line, 100, 't' );
   cout << line << endl;

   return 0;
}
<string>中的getline()

有四种重载形式

C++
istream& getline (istream&  is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream&  is, string& str);
istream& getline (istream&& is, string& str);

例如:

C++
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
    string s = "123-456+\n789";
    cout << s << endl;
    string a, b;
    stringstream ss(s);
    getline(ss, a, '-');
    getline(ss, b, '+');
    cout << a << endl;
    cout << b << endl;
    return 0;
}

输出

Text Only
123-456+
789
123
456

<iomanip>

cout输出格式控制
Text Only
输出流 中 格式化输出 控制符 :

std::left : 左对齐 ;
std::right : 右对齐 ;
std::internal : 内部对齐 ;
std::dec : 使用十进制数 ;
std::hex : 使用十六进制数 ;
std::oct : 使用 八进制数 ;
std::showbase : 显示符号或前缀 ;
std::showpoint : 显示小数点后的 0 ;
std::showpos : 显示正号 ;
std::fixed : 固定精度 ;
std::scientific : 科学计数法 ;

设置进制

C++
int a = 16;
cout << "八进制" << oct << a << endl;

可以显示前缀

C++
cout << showbase;

也可以用setbase()设置进制

C++
cout << "八进制" << setbase(8) << a << endl;
指定输出宽度setw, setfill

<iomanip>头文件中的 setw() 函数 , 可以设置输出字符宽度

设置输出字符个数 10 个 , 如果不够 10 个 , 使用 * 填充

C++
string buf = "hello";

cout << setw(10) << setfill('*') << buf << endl;

指定浮点数格式 - setprecision / setiosflags

setprecision函数的作用是 控制 浮点数 有效数字个数 , 如 : 浮点数 3.14 的 有效字符个数是 3

setiosflags 函数可以设置 输出格式 , setiosflags(ios::scientific) 设置指数形式输出

三、C++常用函数和头文件

PS:<bits/stdc++.h>包含了几乎所有库

C++
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>

需要注意:命名空间需要是std

1.STL函数

accumulate

头文件:<numeric>

accumulate(beg, end, init)

作用:对一个序列的元素求和

eg.

C++
#include <iostream>
#include <numeric>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    int sum = std::accumulate(numbers.begin(), numbers.end(), 0);
    std::cout << "Sum: " << sum << std::endl;
    return 0;
}

输出结果:

C++
Sum: 15

max / min

头文件:<algorithm>

max 函数用于返回两个给定值中的最大值

eg.

C++
#include <iostream>
#include <algorithm>

int main() {
    int a = 5;
    int b = 10;
    int max_val = std::max(a, b);
    std::cout << "Max value: " << max_val << std::endl;
    return 0;
}

输出结果:

C++
Max value: 10

max_element / min_element

头文件:<algorithm>

max_element 函数用于返回给定范围内的最大元素的迭代器。

C++
// 原型
template< class ForwardIt >
ForwardIt max_element( ForwardIt first, ForwardIt last );

e.g.

C++
#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 3, 2, 5, 4};
    auto max_it = std::max_element(numbers.begin(), numbers.end());
    std::cout << "Max element: " << *max_it << std::endl;
    return 0;
}

输出结果:

C++
Max element: 5

sort

头文件:<algorithm>

sort 函数用于对指定范围内的元素进行排序。

C++
//原型:
template< class RandomIt >
void sort( RandomIt first, RandomIt last );

其中 firstlast 是表示要排序的范围的迭代器,通常是一对迭代器表示的范围。

应用举例

C++
int a[N]; // 普通数组定义
// 对 a 数组的[1, n]位置进行从小到大排序
sort(a + 1, a + 1 + n);

vector<int> b(n + 1); // vector数组定义
sort(b.begin() + 1, b.end());

gcd

头文件:<numeric>

gcd 函数返回两个整数的最大公约数。

C++
template< class T >
T gcd( T m, T n );

请注意,gcd 函数仅在 C++17 及以上版本的标准中可用。

reverse

对序列进行翻转

C++
reverse(begin,end)

2.基本容器

vector

头文件:<vector>

函数 含义
v.front 返回第一个数据$$O(1)$$
v.back 返回数组中的最后一个数据 $$O(1)$$
  • 初始化
C++
std::vector<int> vec; // 创建一个空的整数向量
std::vector<int> vec2 = {1, 2, 3, 4, 5}; // 创建一个包含元素的整数向量
  • 访问元素

  • 添加元素

在向量末尾添加 push_back()

C++
v.push_back(10); ``//插入一个数据10

在向量末尾删除 pop_back

C++
v.pop_back();

在指定位置插入insert()

  • 删除元素erase()
C++
v.erase(v.begin());   ``//删除第一个元素
v.erase(v.begin(),v.begin()+4); ``//删除从第一个开始后4个元素(包括第一个)
  • 获取大小size()
C++
 cout<<v.size()<<endl;  //输出5
  • 遍历向量

  • 清空向量

四、C++面向对象

1. 对象指针,关于“->”

C++
Student *ptr;
Student stu;
ptr = &stu;
ptr -> print() // 对象指针调用函数的方法

2. 虚函数

就是Java中的抽象函数,在Java里面为abstract,C++中声明关键词为virtual

3. 析构函数

在对象销毁的时候调用的函数(回调函数?),一般满足栈的规律,先进后出,先创建的对象后销毁。

定义名称跟构造函数相同,区别是在前面有一个波浪号~

4. 类内的赋值

在C++中,,可以使用this指针来调用本对象中的变量或者函数,例如this -> R

也可以像这样赋值:

C++
(*this).R = R

5. 友元函数

给外部函数访问私有变量的权限,这个外部函数就成了友元函数

定义友元函数的关键字是friend

6. 友元类

类似友元函数,A的友元类里的所有函数都能够调用A的成员

7. const使用大全

C++中常数据的使用及初始化 - C++教程 - C语言网 (dotcpp.com)

五、算法与数据结构

1.并查集(Union-Find)

首先是一篇非常详细的教程指南:https://blog.csdn.net/the_zed/article/details/105126583

并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。