【NOI】C++入门之char字符


前言

在编程的世界中,理解和掌握不同的数据类型是构建坚实基础的关键步骤。到目前为止,我们已经探索了多种数据类型,包括整型 int、浮点型 double 和布尔型 bool 等等。然而,在处理文本信息时,我们需要一种新的数据类型来表示单个字符,这就是 char 类型的由来。本篇文章旨在为《C++从零基础到信奥赛入门级(CSP-J)》系列提供一个深入浅出的指南,帮助初学者了解并掌握字符类型及其相关操作。我们将通过具体的例子和练习题,一步步引导您理解如何使用 char 类型存储和操作字符,以及如何利用 ASCII 码进行字符间的转换。

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》

学习路线:C++从入门到NOI学习路线

学习大纲:C++全国青少年信息学奥林匹克竞赛(NOI)入门级-大纲


一、概念

1.导入

在前面我们已经学习了多种数据类型,整型int、浮点型double、布尔型bool等等。

在学习的过程中不知道大家是否有这样的疑惑——数字和逻辑值都有专门的类型用来表示,文字有吗?

在这里插入图片描述

所以今天要来学习新的一种数据类型——字符。

1.1 char 字符

char属于基础数据类型,其功能是存储单个字符。通常,它占用 1 个字节的存储空间,并且借助 ASCII 码来表示对应的字符。

在这里插入图片描述

它的创建方式和初始化依然和前面的其他类型相同,可以通过将字符放在单引号之间来创建一个 char 变量。

例如 char letter = 'A';

1.2 ASCII 码

ASCII(American Standard Code for Information Interchange)码是一种用于将文本转换为计算机可理解的数字形式的标准编码系统。它使用 7 位二进制数(即 0-127)来表示 128 种不同的字符,包括英文字母(大小写)、数字、标点符号以及一些控制字符。

请添加图片描述

ASCII 码分为两个主要部分:

  • 控制字符(0-31 和 127):用于控制计算机设备的操作,例如换行符(LF, 10)、回车符(CR, 13)、退格符(BS, 8)等。
  • 可打印字符(32-126):包括空格、数字、字母和标点符号。其中:
    • 32-47:标点符号和特殊字符(如 !@#$%^&*())
    • 48-57:数字 0-9
    • 65-90:大写字母 A-Z
    • 97-122:小写字母 a-z
    • 其他:各种符号(如 [, ], {, } 等)

因此我们可以记住一些字符,来推理出其他字符。例如数字0是48,那么数字7就在48的基础上加7,55就是它的ascii码。

1.3 字符数组(C 风格字符串)

字符数组是连续存储字符的数组,以空字符’\0’(ASCII 码为 0)作为字符串结束标志。例如:

char c[6] = {'H', 'e', 'l', 'l', 'o', '\0'};  // 显式初始化,必须包含'\0'

更常见的初始化方式是字符串字面量:

char c[] = "Hello";  // 自动计算数组大小为6(包含'\0')

字符串字面量(如"Hello")默认以'\0'结尾,编译器会自动添加。

1.4 基本操作

  1. 字符与 ASCII 值的相互转换
    // 字符转 ASCII 值
    char ch = 'A';
    int ascii = ch;  // 直接赋值给整数类型

    // ASCII 值转字符
    int code = 97;
    char c = code;   // 直接赋值给 char 类型
  1. 检查字符类型
	char ch = 'B';
	if (ch >= 'A' && ch <= 'Z') {
	    cout << ch << " 是大写字母" << endl;
	}
  1. 大小写转换
	char upper = 'A';
	char lower = upper + 32;  // 大写转小写
	cout << "大写 " << upper << " 转小写是 " << lower << endl;

二、例题讲解

1967 - 输出字符的ascii码

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP - J)》。在这篇博客中,我们将详细探讨一个字符基础问题:计算并输出字符的ASCII码。

问题描述

从键盘读入一个字符,请计算并输出该字符的ASCII码。例如,字符 ‘A’ 的ASCII码输出是 65 ,‘a’ 的ASCII码输出是 97 ,‘0’ 的ASCII码输出是 48 。

输入

一个字符。

输出

一个整数,代表字符对应的ASCII码。

样例

输入:

A

输出:

65

在这里插入图片描述

解题思路分析

1. 分析问题
  • 已知:我们已知输入是一个字符。在C++中,字符是一种基本的数据类型,它可以存储单个字符,例如字母、数字或者标点符号等。
  • 未知:我们需要找出这个字符对应的ASCII码值。ASCII码是一种用于表示字符的标准编码系统,它为每个字符分配了一个唯一的整数值。
  • 关系:在C++中,字符类型和整数类型之间存在着隐式的转换关系。我们可以通过将字符转换为整数类型来获取其ASCII码值。这是因为在计算机内部,字符是以其对应的ASCII码值的二进制形式存储的。
2. 定义变量
char c;

在这段代码中,我们定义了一个char类型的变量cchar类型用于存储单个字符,它在内存中通常占用一个字节的空间。我们使用这个变量来存储用户从键盘输入的字符。

3. 输入数据
cin>>c;

cin是C++标准库中的输入流对象,用于从标准输入(通常是键盘)读取数据。>>是输入流运算符,它将输入的数据存储到指定的变量中。在这里,我们使用cin>>c从键盘读取一个字符,并将其存储到变量c中。

4. 数据计算
int i = int(c);

在这行代码中,我们将字符变量c显式地转换为整数类型,并将结果存储在整数变量i中。这种转换是通过强制类型转换实现的,int(c)表示将字符c转换为其对应的ASCII码整数值。这样,变量i就存储了输入字符的ASCII码值。

5. 输出
cout<<i;

cout是C++标准库中的输出流对象,用于向标准输出(通常是屏幕)输出数据。<<是输出流运算符,它将指定变量的值输出到标准输出。在这里,我们使用cout<<i将变量i中存储的ASCII码值输出到屏幕上。

完整代码如下

#include<bits/stdc++.h> // 包含C++标准库中的所有头文件,这是一种方便但非标准的做法。
using namespace std;    // 使用std命名空间,避免每次调用标准库函数时都需要加上std::前缀。

int main(){ // 主函数入口,程序从这里开始执行。
    //一、分析问题
    //已知:一个字符。
    //未知:字符对应的 ascii 码
    //关系:通过将字符转换为整数类型来获取其ASCII码值

    //二、数据定义
    char c; // 定义一个char类型的变量c,用于存储用户输入的字符。

    //三、数据输入
    cin>>c; // 从标准输入(通常是键盘)读取一个字符并存储到变量c中。

    //四、数据计算
    int i = int(c); // 将字符c转换为其对应的ASCII码整数值,并将其赋值给整型变量i。

    //五、输出结果
    cout<<i; // 输出变量i的值,即输入字符的ASCII码值。

    return 0; // 返回0,表示程序正常结束。
}

1968. 输出ascii码对应的字符

问题描述

从键盘读入一个整数(ASCII码),请计算并输出该ASCII码对应的字符。例如,ASCII码 65 对应的字符是 ‘A’,97 对应的字符是 ‘a’,48 对应的字符是 ‘0’。

输入

一个整数(值在ASCII码表的范围内)。

输出

该ASCII码对应的字符。

样例

输入:

65

输出:

A

在这里插入图片描述

解题思路分析

1. 分析问题
  • 已知:我们已知输入是一个整数,这个整数代表的是某个字符的ASCII码。ASCII码是一套基于拉丁字母的字符编码标准,它为每个字符分配了一个唯一的整数值,范围从 0 到 127。
  • 未知:我们需要找出这个整数对应的字符。在计算机中,字符以其对应的ASCII码的二进制形式存储,我们要做的就是将这个整数转换为对应的字符。
  • 关系:在C++中,整数类型和字符类型之间存在着隐式的转换关系。我们可以通过将整数转换为字符类型来获取其对应的字符。这是因为在计算机内部,字符是以其对应的ASCII码值的二进制形式存储的,所以可以通过这种转换来实现从ASCII码到字符的映射。
2. 定义变量
int i;

在这段代码中,我们定义了一个int类型的变量iint类型用于存储整数,它在内存中通常占用 4 个字节的空间。我们使用这个变量来存储用户从键盘输入的ASCII码值。

3. 输入数据
cin>>i;

cin是C++标准库中的输入流对象,用于从标准输入(通常是键盘)读取数据。>>是输入流运算符,它将输入的数据存储到指定的变量中。在这里,我们使用cin>>i从键盘读取一个整数,并将其存储到变量i中。

4. 数据计算
char c = char(i);

在这行代码中,我们将整数变量i显式地转换为字符类型,并将结果存储在字符变量c中。这种转换是通过强制类型转换实现的,char(i)表示将整数i转换为其对应的字符。这样,变量c就存储了输入ASCII码对应的字符。

5. 输出
cout<<c;

cout是C++标准库中的输出流对象,用于向标准输出(通常是屏幕)输出数据。<<是输出流运算符,它将指定变量的值输出到标准输出。在这里,我们使用cout<<c将变量c中存储的字符输出到屏幕上。

完整代码如下

#include<bits/stdc++.h>
using namespace std;
int main(){
    //一、分析问题
    //已知:一个整数(ascii 码)
    //未知:该 ascii 码对应的字符。
    //关系:通过将整数转换为字符类型来获取其对应的字符

    //二、数据定义
    int i;
    //三、数据输入
    cin>>i;
    //四、数据计算
    char c = char(i);
    //五、输出结果
    cout<<c;
    return 0;
}

1970. 判断是什么字符

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP - J)》。在本篇博客中,我们将解决一个字符类型的编程问题:从键盘读入一个字符,判断它是大写字母、小写字母还是数字,并输出相应的结果。

问题描述

从键盘读入一个字符,该字符有可能是大写字母、小写字母、数字中的一种。编程判断该字符具体是什么字符,如果是大写字母请输出 upper,如果是小写字母请输出 lower,如果是数字请输出 digit

输入

一个字符。

输出

按题意输出是哪种字符。

样例

输入:

A

输出:

upper

在这里插入图片描述

解题思路分析

1. 分析问题
  • 已知:我们已知输入是一个字符,并且这个字符只可能是大写字母、小写字母或者数字中的一种。
  • 未知:我们需要判断这个字符具体属于哪一种类型,即它是大写字母、小写字母还是数字。
  • 关系:在ASCII码表中,大写字母的范围是 A(65)到 Z(90),小写字母的范围是 a(97)到 z(122),数字的范围是 0(48)到 9(57)。我们可以通过比较输入字符的ASCII码值来判断它的类型。
2. 定义变量
char c;

在这段代码中,我们定义了一个 char 类型的变量 cchar 类型用于存储单个字符,它在内存中通常占用一个字节的空间。我们使用这个变量来存储用户从键盘输入的字符。

3. 输入数据
cin>>c;

cin 是C++标准库中的输入流对象,用于从标准输入(通常是键盘)读取数据。>> 是输入流运算符,它将输入的数据存储到指定的变量中。在这里,我们使用 cin>>c 从键盘读取一个字符,并将其存储到变量 c 中。

4. 数据计算
if(c>='A'&&c<='Z'){
    cout<<"upper";
}else if(c>='a'&&c<='z'){
    cout<<"lower";
}else{
    cout<<"digit";
}

在这段代码中,我们使用了条件判断语句 if-else if-else 来判断输入字符的类型。首先,我们检查字符 c 是否在大写字母的范围内(c>='A'&&c<='Z'),如果是,则输出 upper。如果不是大写字母,我们接着检查字符 c 是否在小写字母的范围内(c>='a'&&c<='z'),如果是,则输出 lower。如果既不是大写字母也不是小写字母,那么我们可以推断该字符是数字,输出 digit

5. 输出

根据上述的条件判断,程序会输出相应的结果,即 upperlowerdigit

完整代码如下(带注释)

#include<bits/stdc++.h> // 包含C++标准库中的所有头文件,方便使用各种标准库函数和对象
using namespace std;    // 使用std命名空间,避免每次调用标准库函数时都需要加上std::前缀

int main(){
    // 一、分析问题
    // 已知:一个字符,有可能是大写字母、小写字母、数字中的一种
    // 未知:该字符具体是什么字符,如果是大写字母请输出 upper,如果是小写字母请输出 lower,如果是数字请输出 digit。
    // 关系:通过比较字符的ASCII码值来判断其类型

    // 二、数据定义
    char c; // 定义一个char类型的变量c,用于存储用户输入的字符

    // 三、数据输入
    cin>>c; // 从标准输入(通常是键盘)读取一个字符并存储到变量c中

    // 四、数据计算
    if(c>='A'&&c<='Z'){ // 判断字符c是否为大写字母
        cout<<"upper"; // 如果是大写字母,输出upper
    }else if(c>='a'&&c<='z'){ // 判断字符c是否为小写字母
        cout<<"lower"; // 如果是小写字母,输出lower
    }else{ // 如果既不是大写字母也不是小写字母,则认为是数字
        cout<<"digit"; // 输出digit
    }

    // 五、输出结果
    // 结果已经在上述的条件判断中输出

    return 0; // 返回0,表示程序正常结束
}

1971. 大小写转换

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP - J)》。在本篇博客中,我们将解决一个字符类型的编程问题:实现字母的大小写转换。

问题描述

从键盘读入一个字母,这个字母可能是大写字母,也可能是小写字母。若输入的是大写字母,需要输出其对应的小写字母;若输入的是小写字母,则要输出其对应的大写字母。例如,‘a’ 对应的大写字母是 ‘A’,‘M’ 对应的小写字母是 ‘m’。

输入

一个字母。

输出

根据输入字母的大小写情况,输出对应的转换后的字母。

样例

输入:

A

输出:

a

在这里插入图片描述

解题思路分析

1. 分析问题
  • 已知:输入为一个字母,且该字母仅存在大写和小写两种情况。
  • 未知:需要明确输入字母的大小写状态,并将其转换为相反的大小写形式。
  • 关系:在 ASCII 码表中,大写字母和小写字母是连续排列的,且同一字母的小写形式的 ASCII 码值比大写形式大 32。例如,大写字母 ‘A’ 的 ASCII 码值是 65,小写字母 ‘a’ 的 ASCII 码值是 97,差值为 32。利用这一特性,我们可以通过对 ASCII 码值进行加减操作来实现大小写转换。
2. 定义变量
char c;

我们定义了一个 char 类型的变量 cchar 类型用于存储单个字符,在内存中通常占用一个字节的空间。此变量用于存储用户从键盘输入的字母。

3. 输入数据
cin>>c;

cin 是 C++ 标准库中的输入流对象,用于从标准输入(通常是键盘)读取数据。>> 是输入流运算符,它将输入的数据存储到指定的变量中。这里使用 cin>>c 从键盘读取一个字母,并将其存储到变量 c 中。

4. 数据计算
if(c>='A'&&c<='Z'){
    c=c + 32;
}else{
    c=c - 32;
}

在这段代码中,我们使用 if-else 条件判断语句来确定输入字母的大小写状态。首先,检查字母 c 是否在大写字母的范围内(c>='A'&&c<='Z')。如果是大写字母,将其 ASCII 码值加上 32,从而将其转换为对应的小写字母;如果不是大写字母,即输入的是小写字母,将其 ASCII 码值减去 32,转换为对应的大写字母。

5. 输出
cout<<c;

cout 是 C++ 标准库中的输出流对象,用于向标准输出(通常是屏幕)输出数据。<< 是输出流运算符,它将指定变量的值输出到标准输出。这里使用 cout<<c 输出转换后的字母。

完整代码如下

#include<bits/stdc++.h>
using namespace std;
int main(){
    //一、分析问题
    //已知:一个字母,可能是大写字母也可能是小写字母。
    //未知:如果是大写字母,输出其对应的小写字母,如果是小写字母,输出其对应的大写字母。
    //关系:利用 ASCII 码表中大小写字母的差值进行转换

    //二、数据定义
    char c;
    //三、数据输入
    cin>>c;
    //四、数据计算
    if(c>='A'&&c<='Z'){
        c=c + 32;
    }else{
        c=c - 32;
    }
    //五、输出结果
    cout<<c;
    return 0;
}

1969. 求下一个字母

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP - J)》。在本篇博客中,我们将解决一个关于字母处理的编程问题:根据输入的字母,输出该字母的下一个字母。如果输入的是字母表的最后一个字母,则输出第一个对应的字母。

问题描述

从键盘读入一个字母,这个字母可能是大写字母,也可能是小写字母。需要输出该字母的后一个字母,如果输入的是 ‘z’,则输出 ‘a’;如果输入的是 ‘Z’,则输出 ‘A’。例如,‘a’ 的下一个字母是 ‘b’,‘X’ 的下一个字母是 ‘Y’。

输入

一个字母,可能是大写,也可能是小写。

输出

输出该字母的后一个字母,若输入为 ‘z’ 则输出 ‘a’,若输入为 ‘Z’ 则输出 ‘A’。

样例

输入:

A

输出:

B

在这里插入图片描述

解题思路分析

1. 分析问题
  • 已知:输入是一个字母,且该字母可能为大写或小写。
  • 未知:需要确定该字母的下一个字母是什么。
  • 关系:在 ASCII 码表中,字母是按顺序排列的,同一大小写的相邻字母的 ASCII 码值相差 1。例如,‘A’ 的 ASCII 码值是 65,‘B’ 的 ASCII 码值是 66。同时,我们需要处理字母表末尾的特殊情况,即 ‘z’ 和 ‘Z’ 要分别转换为 ‘a’ 和 ‘A’。
2. 定义变量
char c;

我们定义了一个 char 类型的变量 cchar 类型用于存储单个字符,在内存中通常占用一个字节的空间。此变量用于存储用户从键盘输入的字母。

3. 输入数据
cin>>c;

cin 是 C++ 标准库中的输入流对象,用于从标准输入(通常是键盘)读取数据。>> 是输入流运算符,它将输入的数据存储到指定的变量中。这里使用 cin>>c 从键盘读取一个字母,并将其存储到变量 c 中。

4. 数据计算
if(c!='Z'&&c!='z'){
    c += 1;
}else{
    c = c > 'Z'? 'a' : 'A';
}

在这段代码中,我们使用 if-else 条件判断语句来处理不同情况。首先,检查字母 c 是否既不是 ‘Z’ 也不是 ‘z’。如果满足条件,说明该字母不是字母表的最后一个字母,将其 ASCII 码值加 1,即可得到下一个字母。如果字母 c 是 ‘Z’ 或 ‘z’,则使用三元运算符 c > 'Z'? 'a' : 'A' 来判断是大写还是小写的最后一个字母,并分别将其转换为 ‘a’ 或 ‘A’。

5. 输出
cout<<c;

cout 是 C++ 标准库中的输出流对象,用于向标准输出(通常是屏幕)输出数据。<< 是输出流运算符,它将指定变量的值输出到标准输出。这里使用 cout<<c 输出转换后的字母。

完整代码如下(带注释)

#include<bits/stdc++.h> // 包含 C++ 标准库中的所有头文件,方便使用各种标准库函数和对象
using namespace std;    // 使用 std 命名空间,避免每次调用标准库函数时都需要加上 std:: 前缀

int main(){
    // 一、分析问题
    // 已知:一个字母,可能是大写字母,也可能是小写字母
    // 未知:该字母的后一个字母是什么
    // 关系:利用 ASCII 码表中字母的顺序关系进行处理,特殊处理字母表末尾的字母

    // 二、数据定义
    char c; // 定义一个 char 类型的变量 c,用于存储用户输入的字母

    // 三、数据输入
    cin>>c; // 从标准输入(通常是键盘)读取一个字母,并将其存储到变量 c 中

    // 四、数据计算
    if(c!='Z'&&c!='z'){ // 如果输入的字母不是 'Z' 也不是 'z'
        c += 1; // 将字母的 ASCII 码值加 1,得到下一个字母
    }else{ // 如果输入的字母是 'Z' 或 'z'
        c = c > 'Z'? 'a' : 'A'; // 判断是大写还是小写的最后一个字母,并转换为对应的第一个字母
    }

    // 五、输出结果
    cout<<c; // 输出转换后的字母
    return 0; // 返回 0,表示程序正常结束
}

三、总结

本文详细介绍了 C++ 中 char 字符类型的使用方法,包括其基本概念、ASCII 码的介绍、字符数组的应用及字符的基本操作。此外,还提供了几个实际的例子和练习题,如计算并输出字符的 ASCII 码值、根据给定的 ASCII 码值输出对应的字符、判断字符类型以及实现大小写字母之间的转换等。这些例子不仅加深了对字符类型的理解,同时也提高了解决实际问题的能力。

四、感谢

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》

如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。

每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月别枝惊鹊丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值