2 数据类型

2 数据类型

位(bit)

位(bit)是计算机能够存储信息的最小单位。

字节(byte)

字节( byte )是计算机存储信息的基本单位。1 字节byte 等于 8 位bit。

更大的存储单位

单位名称 换算关系
千字节(KB) 1 KB = 1024 B
兆字节(MB) 1 MB = 1024 KB
吉字节(GB) 1 GB = 1024 MB
太字节(TB) 1 TB = 1024 GB、

练习

2-1 一个字节(byte)由( )个二进制位组成。

A 8
B 16
C 1024

2-2 一片容量为8G的SD卡能储存大约( )张大小为2MB的数码照片。

A 1600
B 2000
C 4000
D 16000

图像存储

如何计算一张图片大小

一张图片大小(单位为bit) = 水平像素数 × 垂直像素数 × 位深度

位深度:存储图片一个像素需要消耗多少位。可能是4位、8位、24位、32位。


例:存储一张2048 * 1024像素的32位真彩色图像,需要多大内存?

答:2048 * 1024 * 32 bit = 8 MB

分辨率

分辨率是指每英寸图像内像素点的个数,单位为PPI(Pixels Per Inch);像素点越多,分辨率越高,图像越清晰。

练习

2-3 现有一张分辨率为 2048×1024 像素的 32 位真彩色图像。请问要存储这张图像,需要多大的存储空间?( )。

A. 16MB
B. 4MB
C. 8MB
D. 2MB

2-4 1MB 等于( ).

A. 1000 字节
B. 1024 字节
C. 1000×1000 字节
D. 1024×1024 字节

2-5 分辨率为 800x600、16 位色的位图,存储图像信息所需的空间为( )。

A. 937.5KB
B. 4218.75KB
C. 4320KB
D. 2880KB

2-6 地址总线的位数决定了 CPU 可直接寻址的内存空间大小,例如地址总线为 16 位,其最大的可寻址空间为 64KB。如果地址总线是 32 位,则理论上最大可寻址的内存空间为( )。

A. 128KB
B. 1MB
C. 1GB
D. 4GB

基本数据类型及其占位符

字符串

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"

练习

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

A int
B char
C float
D double

2-8 以下程序会输出什么?

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

A 正数
B 负数
C 0

2-9

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”。( )
19. 当输入为“2 2”时,输出为“10”。( )
20. 当输入为“2 2”时,输出为“59”。( )

单选题
21.当输入为“13 8”时,输出为( )。
A. “0”
B. “209”
C. “197”
D. “226”

2-10

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. 前三种情况都有可能

2-11

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

2-12

#include<iostream>
using namespace std;
int main()
{
    string ch;
    int a[200];
    int b[200];
    int n, i, t, res;
    cin >> ch;
    n = ch.length();
    for (i = 0; i < 200; i++)
        b[i] = 0;
    for (i = 1; i <= n; i++)
    {
        a[i] = ch[i - 1] - '0';
        b[i] = b[i - 1] + a[i];
    }
    res = b[n];
    t = 0;
    for (i = n; i > 0; i--)
    {
        if (a[i] == 0)
            t++;
        if (b[i - 1] + t < res)
            res = b[i - 1] + t;
    }
    cout << res << endl;
    return 0;
}

          

输入:1001101011001101101011110001
输出:_________

2-13

#include<iostream>
using namespace std;
int main()
{
    int t[256];
    string s;
    int i;
    cin >> s;
    for (i = 0; i < 256; i++)
        t[i] = 0;
    for (i = 0; i < s.length(); i++)
        t[s[i]]++;
    for (i = 0; i < s.length(); i++)
        if (t[s[i]] == 1)
        {
            cout << s[i] << endl;
            return 0;
        }
    cout << "no" << endl;
    return 0;
}     

输入:xyzxyw
输出:_________

输出:_________

2-14

#include <iostream>
#include <string> 
using namespace std;

int main()
{
	string str;
	int i;
	int count; count = 0;
	getline( cin, str );
	for ( i = 0; i < str.length(); i++ )
		if ( str[i] >= 'a' && str[i] <= 'z' )
			count++;
	cout << "It has " << count << " lowercases" << endl;
	return(0);
}

          

输入:NOI2016 will be held in Mian Yang.
输出:_______

posted @ 2023-09-09 14:50  Jue_Chen  阅读(398)  评论(0)    收藏  举报