从C语言的使用转换到C++(上篇)——刷题、竞赛篇

简介: 从C语言的使用转换到C++(上篇)——刷题、竞赛篇

 本文章讲述的内容是放弃C语言使用C++进行刷题。当熟练掌握C语言时,转换到C++是很简单的,并不需要花费太大的精力。为什么要使用C++进行刷题呢?首先,C++拥有丰富的STL标准模版库,这也是PAT甲级、LeetCode等题目中经常需要用到的,早纯使用C语言解决问题会比C++的STL解决该问题麻烦很多。其次,C++的string十分好用。比c语言里面的char数组好用多啦。C++可以在某一变量使用前随时定义该变量,非常方便。同时,C++向下兼容c,c语言里面的语法完全可以在C++文件中运行,所以字习C++对刷身法时漏在后司的表达能力进行扩充有益无害,例如c语言的输入输出( scanf和 printf )比C++快,那么就可以在使用C++刷算法同时使用scanf和printf 提高代码运行效率。具体细节我们都会介绍到。由于内容细节较多,所以我们分为两篇来详细介绍。本篇文章我们会讲述到基础语法和常用的一些函数。



一、C++的基础语法详解

1、1 输入、输出流

 什么是输入输出流呢?我们先来看一段代码:

#include <iostream>
using namespace std;
int main() 
{
    int n;
    cin >> n;
    cout << "hello, liuchuo" << n + 1 << endl;
    return 0;
}



就如同scanf和printf 在 stdio.h头文件中一样,cin和 cout在头文件 iostream里面,看名字就知道, io是输入输出 input和output的首字母,stream是流,所以这个iostream头文件里包含的方法就是管理一些输入输出流的。cin和cout比较方便,不用像C语言里的 scanf 、 printf 那样写得那样繁琐, cin >> n;和scanf(%d", &n)一样的意思(而且用cin再也不用担心像scanf 一样忘记写取地址符&了),注意cin是向右的箭头,表示将内容输入到n 中。同样, cout << n和 printf("%d", n)一样的意思,此时cout是向左的两个箭头,注意和cin区分开来。而且不管n是double还是 int或者是char类型,只用写cin >> n和cout <<n这样简单的语句就好,不用像c语言中需要根据n的类型对应地写%lf 、%d 、%c。


 我们看到上术代码中有using namespace std。这句话是使用"std”这个名称空间( namespace )的意思。因为有的时候不同厂商定义的函数名称彼此之间可能会重复,为了避免冲突,就给所有的函数都封装在各自的名称空间里面,使用这个函数的时候就在main函数前面写明用了什么名称空间,几乎在C++中使用到的一些方法如cin .cout 都是在std名称空间里面的,所以可以看到using namespace std这句话几乎成了我每段C++代码的标配,就和return 0一样必须有。



1、2 C++中头文件的使用

 C++的头文件一般是没有像c语言的.h这样的扩展后缀的,一般情况下c语言里面的头文件去掉.h然后在前面加个c就可以继续在C++文件中使用c语言头文件中的函数。比如:

#include <cmath>  //相当于C语言里面的#include <math.h>
#include <cctype>)  //相当于C语言里面的#include <ctype.h>
#include <cstring>  //相当于C语言里面的#include <string.h>
#include <cstdio>  //相当于C语言里面的#include <stdio.h>



1、3 C++中变量的声明


C语言的变量声明一般都在函数的开头,但是C++在首次使用变量之前声明即可。(当然也可以都放在函数的开头),而且一般C语言里面会在 for 循环的外面定义变量,但是C++里面可以在 for 循环内部定义。而且在 for 循环里面定义的局部变量,在循环外面就失效了(就是脱离这个局部作用域就会查无此变量的意思),所以一个main函数里面可以定义好多次局部变量i,不用担心写的循环太多变量名i、j 、k不够用。我们看如下代码:

#include <iostream>
using namespace std;
int main() 
{
    int n;
    cin >> n;
    cout << "hello, liuchuo" << n + 1 << endl;
    int m;
    cin >> m;
    for (int i = 0; i < n; i++) 
    { 
        cout << i;
    }
    for (int i = 0; i < m; i++)
    { 
        cout << i + 2;
    }
    return 0;
}


1、4 C++中的string类


以前用char[]的方式处理字符串很繁琐,现在有了string类,定义、拼接、输出、处理都更加简单。不过string只能用cin和cout处理,无法用scanf和printf 处理。我们看如下代码:

string s = "hello world"; //赋值字符串
string s2 = s;
string s3 = s + s2; // 字符串拼接直接用+
string s4;
cin >> s4; // 输入字符串
cout << s; // 输出字符串



用cin读入的字符串是以空格为分隔符的,要想读入一行字符串的话,可以用getline()函数。s的长度可以用s.length()获取(有几个字符就是长度多少,不存在char[]里面的什么末尾的结束符之类的)。


1、5 C++中的引用&


这个引用符号&要和c语言里面的取地址运算符&区分开来,他们没有什么关系,C++里面的引用是指在变量名之前加一个&符号,比如在函数传入的参数中int &a ,那么对这个引用变量a做的所有操作都是直接对传入的原变量进行的操作,并没有像原来int a一样只是拷贝一个副本(传值),举两个例子:

//例1
void func(int a) 
{
    a = 99; //a在这里是形参,是对实参的一份临时拷贝
}
int main() 
{
    int n = 0;
    func(n); //n并不会改变
}
//例2
void func(int a) 
{
    a = 99; //a在这里是形参,是对实参的一份临时拷贝
}
int main() 
{
    int n = 0;
    func(n); //n并不会改变
}


二、C++中常见函数使用详解

2、1 排序sort函数详解



sort函数在头文件#include <algorithm>里面,主要是对一个数组进行排序(int arr[]数组或者vector数组都行) , vector是容器,要用v.begin()和 v.end()表示头尾;而int arr[]用arr 表示数组的首地址,arr+n表示尾部。我们结合代码一起理解一下,代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a, int b) 
{ 
  return a > b; //从小到大
}
int main() 
{
  vector<int> v(10);
  for (int i = 0; i < 10; i++) 
  {
    cin >> v[i];
  }
  sort(v.begin(), v.end());  //默认从小到大
  int arr[10];
  for (int i = 0; i < 10; i++) 
  {
    cin >> arr[i];
  }
  sort(arr, arr + 10, cmp);
  return 0;
}

2、2 cctype头文件中的函数


刚刚在头文件那一段中也提到,#include <cctype>本质上来源于c语言标准函数库中的头文件 #include<ctype.h> ,其实并不属于C++新特性的范畴,在刷PAT一些字符串逻辑题的时候也经常用到,但是很多人似乎不了解这个头文件中的函数,所以在这里单独提一下。


 可能平时我们判断—个字符是否是字母,可能会写︰  

char c;
cin >> c;
if (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') 
{
    cout << "c is alpha";
}

 但是在cctype中已经定义好了判断这些字符应该所属的范围,直接引入这个头文件并且使用里面的函数判断即可,无需自己手写(自己手写有时候可能写错或者漏写) 。代码如下:

#include <iostream>
#include <cctype>
using namespace std;
int main() 
{
    char c;
    cin >> c;
    if (isalpha(c)) 
    {
        cout << "c is alpha";
    }
    return 0;
}



不仅仅能判断字母,还能判断数字、小写字母、大写字母等.C++官方文档中对这些函数归纳成了一个表格,如下图:

251b3331d95a4637b8e6eb594f4d3e42.png


三、总结

  我们本章的内容相对来说基础一些,也是很容易掌握的。下篇文章我们会讲述C++STL库中的一些容器。前提是我们要掌握本片章节的内容。

 希望本篇文章会对你有所帮助,感谢观看ovo~

相关文章
|
2月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
69 2
|
20天前
|
算法 编译器 C语言
【C语言】C++ 和 C 的优缺点是什么?
C 和 C++ 是两种强大的编程语言,各有其优缺点。C 语言以其高效性、底层控制和简洁性广泛应用于系统编程和嵌入式系统。C++ 在 C 语言的基础上引入了面向对象编程、模板编程和丰富的标准库,使其适合开发大型、复杂的软件系统。 在选择使用 C 还是 C++ 时,开发者需要根据项目的需求、语言的特性以及团队的技术栈来做出决策。无论是 C 语言还是 C++,了解其优缺点和适用场景能够帮助开发者在实际开发中做出更明智的选择,从而更好地应对挑战,实现项目目标。
44 0
|
2月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
67 10
|
2月前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
17 0
|
3月前
|
算法 机器人 C语言
ROS仿真支持C++和C语言
ROS仿真支持C++和C语言
91 1
|
2月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
26 0
|
3月前
|
编译器 C语言 C++
从C语言到C++
本文档详细介绍了C++相较于C语言的一些改进和新特性,包括类型检查、逻辑类型 `bool`、枚举类型、可赋值的表达式等。同时,文档还讲解了C++中的标准输入输出流 `cin` 和 `cout` 的使用方法及格式化输出技巧。此外,还介绍了函数重载、运算符重载、默认参数等高级特性,并探讨了引用的概念及其应用,包括常引用和引用的本质分析。以下是简要概述: 本文档适合有一定C语言基础的学习者深入了解C++的新特性及其应用。
|
25天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
38 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
83 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
80 4