#M8010. 数据类型

数据类型

程序基础之数据类型


近4年CSP-J初赛考察:

题号 题型 分值
2022 第16题 阅读程序
第18题

难易度:简单


基本数据类型及其占位符

输入占位符 输出占位符 所占字节数 数据范围
unsigned int %d %d 4 00 ~ 23212^{32}-1
int %d %d 4 231-2^{31} ~ 23212^{32}-1
long long %lld %lld 8 263-2^{63} ~ 26312^{63}-1
float %f %f 4 实际精度6~7位
double %lf %lf 8 实际精度15~16位
char %c %c%d(输出ASCII码) 1 0 ~ 127
bool %d(输出 0 或 1) 1 0、1

字符串

字符串的存储有两种方式:字符数组、string


使用字符数组存字符串

char str[100]; 可以存储最长为99个字符的字符串,因为最后的空字符 '\0' 也要存进来。

char str[100];  //定义字符数组存储字符串
scanf("%s", str); //输入字符串,不加取地址符
printf("%s", str);//输出字符串

二维字符数组每行都可以存放一个字符串

char a[3][5];   //3行二维字符数组,每行最多存放4个字符的字符串
for(int i=0; i<=2; i++){        
    scanf("%s", a[i]);  //a[i]是二维数组中第i行的地址
}    
for(int i=0; i<=2; i++){        
    printf("%s\n", a[i]);    
}

字符数组里的字符串,可以进行如下操作:(ab为字符数组里的字符串)

操作 函数 头文件
求长度 strlen(字符串); #include < cstring >
字符串拷贝 strcpy(b, a);
字符串比较 strcmp(a, b);

补充:

  • strcpy(b, a); 将字符串 a 的内容拷贝到字符数组 b 中。
  • strcmp(a, b); 基于字典序比较字符串ab的大小。该函数有返回值,若a的字典序更大,则返回大于0的值;若b的字典序更大,则返回小于0的值;若ab的字典序相同,则返回0。
  • 字典序​:一个字符串在字典的位置。位置越靠后,字典序越大。一般比较字典序时,会先比较第一对字母,如果字母一样,那么就比较第二对、第三对。当找到字母不相同的字母对时,按照26个字母的字母表顺序比较,哪个字母靠后,他所在的字符串的字典序就越大。如:字符串"abc"和字符串"abd",是"abd"的字典序更大。如果比到最后两个单词不一样长(比如sigh和sight),那么把短者排在前,sigh的字典序小。


⚡快问快答

1、为了精确读入一个小数点后有10位的小数,应该使用下列哪种数据类型?

{{ select(1) }}

  • int
  • char
  • float
  • double

2、以下程序会输出什么?

char a[5] = "Lily";
char b[5] = "Nana";
int t = strcmp(a, b); 
printf("%d", t);

{{ select(2) }}

  • 正数
  • 负数
  • 0
  • 1


使用string存字符串

string是C++存储字符串的方法,输入输出只能用cin、cout。

#include <string> // STL中存字符串的头文件
#include <iostream>
using namespace std;
string str;
cin >> str;
cout << str;

string存储的字符串,也可以进行如下操作:(ab为string的字符串)

操作 函数 头文件
求长度 str.length();str.size(); #include < string >
字符串拷贝 b = a; //使用赋值进行拷贝
字符串比较 a < b //使用关系运算符比较,

此外,string类型的字符串还可以进行复杂的操作:(ss1s2a为string的字符串)

操作 函数 意义
求子串 s.substr(n); 会从第n位开始截取到末尾
s.substr(n, m); 会从第n位开始截取m位
字符串比较 s1.compare(s2); s1、s2基于字典序进行字符串的比较;如果s1字典序大,会返回1;如果s1字典序小,会返回-1;如果两字符串相同,会返回0。
删除字符 a.erase(n); 从第n位开始全部删除(利用下标)
a.erase(n, m); 从第n位开始删除m位(利用下标)
a.erase(a.begin()+n); 删除第n位(利用迭代器)
a.erase(a.begin()+n, a.begin()+m); 从第n位删到第m - 1位(包括第n位,不包括第m位)(利用迭代器)

举一反三:

string s = "abcde", k = "defgh";
string s1 = s.substr(2); //则s1等于"cde",从s的第2位开始截到末尾
string s2 = s.substr(1, 3); //则s2等于"bcd",从s的第1位开始截取3位
int a = s1.compare(s2); //因为s1的字典序更大,则a的结果为1
string s3 = s.erase(2); // s3为ab,从下标2开始把全部的字符删除
string s4 = s2.erase(1, 1); //s4为bd,从下标1开始只删除一个位
s1.erase(s1.begin()); // 删除s1的第0位,得到de
k.erase(k.begin()+2, k.begin()+3); // k为"degh"
```<br><br>

# **📜历年真题**

3、填空题

```cpp
01 #include <iostream>
02
03 using namespace std;
04
05 int main()
06 {
07     unsigned short x, y;
08     cin >> x >> y;
09     x = (x | x << 2) & 0x33;
10     x = (x | x << 1) & 0x55;
11     y = (y | y << 2) & 0x33;
12     y = (y | y << 1) & 0x55;
13     unsigned short z = x | y << 1;
14     cout << z << endl;
15     return 0;
16 }

假设输入的 x、y 均是不超过 15 的自然数,完成下面的判断题和单选题:

判断题

3、删去第 7 行与第 13 行的 unsigned,程序行为不变。 {{ select(3) }}

4、将第 7 行与第 13 行的 short 均改为 char,程序行为不变。 {{ select(4) }}

5、程序总是输出一个整数“0”。 {{ select(5) }}

6、 当输入为“2 2”时,输出为“10”。 {{ select(6) }}

7、 当输入为“2 2”时,输出为“59”。 {{ select(7) }}

8、当输入为“13 8”时,输出为? {{ select(4) }}

  • “0”
  • “209”
  • “197”
  • “226”