- C++
备战CSP-J初赛21天打卡计划。DAY4-DAY4-数据类型、存储单位、指针3
- 2024-9-3 21:58:22 @
程序基础之数据类型
近4年CSP-J初赛考察:
题号 | 题型 | 分值 | |
---|---|---|---|
2022 | 第16题 | 阅读程序 | 10.5分 |
第18题 | 15分 |
难易度:简单
基本数据类型及其占位符
输入占位符 | 输出占位符 | 所占字节数 | 数据范围 | |
---|---|---|---|---|
unsigned int |
%d |
4 | 00 ~ 232−1232**−**1 | |
int |
−231**−231** ~ 231−1231**−**1 | |||
long long |
%lld |
8 | −263**−263** ~ 263−1263**−**1 | |
float |
%f |
4 | 1.175494351E−381.175494351E**−38 ~ 3.402823466E+383.402823466E+**38(实际精度6~7位) | |
double |
%lf |
8 | 2.2250738585072014E−3082.2250738585072014E**−308 ~ 1.7976931348623158E+3081.7976931348623158E+**308(实际精度15~16位) | |
char |
%c |
%c 或%d (输出ASCII码) |
1 | 00 ~ 127127 |
bool |
无 | %d (输出 0 或 1) |
00、11 |
单选题
1、为了精确读入一个小数点后有10位的小数,应该使用下列哪种数据类型?
- A int
- B char
- C float
- D double
字符串
字符串的存储有两种方式:字符数组、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]);
}
字符数组里的字符串,可以进行如下操作:(a
、b
为字符数组里的字符串)
操作 | 函数 | 头文件 |
---|---|---|
求长度 | strlen(字符串); |
#include < cstring > |
字符串拷贝 | strcpy(b, a); |
|
字符串比较 | strcmp(a, b); |
补充:
strcpy(b, a);
将字符串a
的内容拷贝到字符数组b
中。strcmp(a, b);
基于字典序比较字符串a
、b
的大小。该函数有返回值,若a
的字典序更大,则返回大于0的值;若b
的字典序更大,则返回小于0的值;若a
、b
的字典序相同,则返回0。- 字典序:一个字符串在字典的位置。位置越靠后,字典序越大。一般比较字典序时,会先比较第一对字母,如果字母一样,那么就比较第二对、第三对。当找到字母不相同的字母对时,按照26个字母的字母表顺序比较,哪个字母靠后,他所在的字符串的字典序就越大。如:字符串
"abc"
和字符串"abd"
,是"abd"
的字典序更大。如果比到最后两个单词不一样长(比如sigh和sight),那么把短者排在前,sigh的字典序小。
单选题 1、以下程序会输出什么?
char a[5] = "Lily";
char b[5] = "Nana";
int t = strcmp(a, b);
printf("%d", t);
- A 正数
- B 负数
- C 0
使用string存字符串
string是C++存储字符串的方法,输入输出只能用cin、cout。
#include <string> // STL中存字符串的头文件
#include <iostream>
using namespace std;
string str;
cin >> str;
cout << str;
string存储的字符串,也可以进行如下操作:(a
、b
为string的字符串)
操作 | 函数 | 头文件 |
---|---|---|
求长度 | str.length(); 或 str.size(); |
#include < string > |
字符串拷贝 | b = a; //使用赋值进行拷贝 | |
字符串比较 | a < b //使用关系运算符比较, |
此外,string类型的字符串还可以进行复杂的操作:(s
,s1
,s2
,a
为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"
📜历年真题 数据类型
1、阅读程序题
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 的自然数,完成下面的判断题和单选题:
判断题
16.删去第 7 行与第 13 行的 unsigned,程序行为不变。( )
17.将第 7 行与第 13 行的 short 均改为 char,程序行为不变。( )
18.程序总是输出一个整数“0”。( )
-
当输入为“2 2”时,输出为“10”。( )
-
当输入为“2 2”时,输出为“59”。( )
单选题
21.当输入为“13 8”时,输出为( )。
A. “0”
B. “209”
C. “197”
D. “226”
1.判题时不忽略大小写,如答案为B,而你输入的答案为b,则会被判错! 2.判题时不会忽略你输入答案的前后空格,如答案为B,而你输入的答案为空格B空格,则会被判错! 3.判断题A代表正确、B代表错误
2、阅读程序题
01 #include <iostream>
02
03 using namespace std;
04
05 int n, k;
06
07 int solve1()
08 {
09 int l = 0, r = n;
10 while (l <= r) {
11 int mid = (l + r) / 2;
12 if (mid * mid <= n) l = mid + 1;
13 else r = mid - 1;
14 }
15 return l - 1;
16 }
17
18 double solve2(double x)
19 {
20 if (x == 0) return x;
21 for (int i = 0; i < k; i++)
22 x = (x + n / x) / 2;
23 return x;
24 }
25
26 int main()
27 {
28 cin >> n >> k;
29 double ans = solve2(solve1());
30 cout << ans << ' ' << (ans * ans == n) << endl;
31 return 0;
32 }
假设 int 为 32 位有符号整数类型,输入的 n 是不超过 47000 的自然数、k 是不超过 int表示范围的自然数,完成下面的判断题和单选题:
判断题
28 ) 该算法最准确的时间复杂度分析结果为𝑂(log 𝑛 + 𝑘)。( )
29 ) 当输入为“9801 1”时,输出的第一个数为“99”。( )
30 ) 对于任意输入的 n,随着所输入 k 的增大,输出的第二个数会变成“1”。( )
31 ) 该程序有存在缺陷。当输入的 n 过大时,第 12 行的乘法有可能溢出,因此应当将mid 强制转换为 64 位整数再计算。( )
单选题 32 ) 当输入为“2 1”时,输出的第一个数最接近( )。
A. 1
B. 1.414
C. 1.5
D. 2
33 )当输入为“3 10”时,输出的第一个数最接近( )。
A. 1.7
B. 1.732
C. 1.75
D. 2
34 ) 当输入为“256 11”时,输出的第一个数( )。
A. 等于 16
B. 接近但小于 16
C. 接近但大于 16
D. 前三种情况都有可能
3、阅读程序题
1 #include <cstdlib>
2 #include <iostream>
3 using namespace std;
4
5 char encoder[26] = {'C','S','P',0};
6 char decoder[26];
7
8 string st;
9
10 int main() {
11 int k = 0;
12 for (int i = 0; i < 26; ++i)
13 if (encoder[i] != 0) ++k;
14 for (char x ='A'; x <= 'Z'; ++x) {
15 bool flag = true;
16 for (int i = 0; i < 26; ++i)
17 if (encoder[i] ==x) {
18 flag = false;
19 break;
20 }
21 if (flag) {
22 encoder[k]= x;
23 ++k;
24 }
25 }
26 for (int i = 0; i < 26; ++i)
27 decoder[encoder[i]- 'A'] = i + 'A';
28 cin >> st;
29 for (int i = 0; i < st.length(); ++i)
30 st[i] = decoder[st[i] -'A'];
31 cout << st;
32 return 0;
33 }
•判断题 1) 输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。( )
2) 若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样。()
3) 将第 12 行的“i<26”改为“i<16”,程序运行结果不会改变。( )
4) 将第 26 行的"i<26”改为“i<16”,程序运行结果不会改变。( )
•单选题
5) 若输出的字符串为“ABCABCABCA,则下列说法正确的是( )。
A. 输入的字符串中既有S又有P
B. 输入的字符串中既有S又有B
C. 输入的字符串中既有A又有P
D. 输入的字符串中既有A又有B
6)若输出的字符串为“CSPCSPCSPCSP”,则下列说法正确的是( )。
A. 输入的字符串中既有P又有K
B. 输入的字符串中既有J又有R
C. 输入的字符串中既有J又有K
D. 输入的字符串中既有P又有R
1 条评论
-
xinao015 LV 1 @ 2024-9-4 19:45:44
DC√√×√×D×√××CCB×√√√AC
- 1