1. 学习内容

1.1 参考
  1. 《程序设计基础》6.1.3 字符数组的定义、初始化和赋值
1.2 参考程序
#include <iostream>
using namespace std;

int main()
{
    //字符数组可以直接初始化
    char a[] = "hello world"; //不指定数组大小,自动分配长度为12;a[11]为结束符合\0
    cout << "length of a: " << sizeof(a)/sizeof(a[0]) << endl; //输出:12
    
    char b[100] = "hello, char array"; //指定数组大小
    cout << "length of b: " << sizeof(b)/sizeof(b[0]) << endl; //输出:100

    a[0] = 'H'; //直接修改字符数组,注意用的是字符,单引号 
    cout << a << endl; //输出第一个字符变成了大写H

    //字符数组通过输入初始化
    // 假定后面两个例子的输入都是"hello world"然后回车
    char c[100];
    
    cout << "using cin.getline()..." << endl;
    cin.getline(c, 100); //读取最多99个字符,碰过回车结束。输入串中可以包括空格。
    cout << c << endl; //输出hello world
    
    cout << "using standard cin..." << endl;
    cin >> c; //在确定不需要空格的情况下,建议用这个。
    cout << c << endl; //输出hello
}

2. 编程

  1. 统计数字字符个数
  2. 找第一个只出现一次的字符
  3. 基因相关性
  4. 石头剪子布
  5. 输出亲朋字符串
  6. 配对碱基链
  7. 字符替换
  8. 密码翻译
  9. 简单密码
  10. 潜伏者
  11. 判断字符串是否为回文
  12. 大整数的运算

3. 作业

(知识点:数组初始化)
1、有字符数组char encoder[26] = {'C','S','P',0};encoder[2], encoder[3], encoder[9]的值分别是?
  A. ‘S’, ‘P’, ‘C’       B. ‘S’, ‘P’, 0       C. ‘P’, 0, ‘S’       D. ‘P’, 0, 0

2、以下程序,输出的结果是?( )

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;

char encoder[26] = {'C','S','P',0};

int main()  {
  int k = 0;
  for (int i = 0; i < 26; ++i)
    if (encoder[i] != 0) ++k;
  cout << k << endl;
}

3、以下程序,输出的结果是?( )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <cstdlib>
#include <iostream>
using namespace std;

char encoder[26] = {'C','S','P',0};

int main()  {
  int k = 0;

  for (int i = 0; i < 26; ++i)
    if (encoder[i] != 0) ++k;

  for (char x ='A'; x <= 'Z'; ++x) {
    bool flag = true;
    for (int i = 0; i < 26; ++i)
      if (encoder[i] ==x) {
        flag = false;
        break;
      }
      
    if (flag) {
      encoder[k]= x;
      ++k;
    }
  }
  
  for (int i = 0; i < 26; ++i)
    cout << encoder[i];
}

4、以下程序,输出的结果是?( )

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

int main()  {
  char encoder[26] = {'C','H','I','N','A','B','D','E','F','G','J','K','L','M',
                      'O','P','Q','R','S','T','U','V','W','X','Y','Z'};
  char decoder[26];
  for (int i = 0; i < 26; ++i)
     decoder[encoder[i]- 'A'] = i + 'A';

  for (int i = 0; i < 26; ++i)
    cout << decoder[i];
}
5、

【CSP 2020 入门组第一轮 q16】阅读程序(程序输入不超过数组或字符串定义的范围)

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

char encoder[26] = {'C','S','P',0};
char decoder[26];

string st;

int main()  {
  int k = 0;
  for (int i = 0; i < 26; ++i)
    if (encoder[i] != 0) ++k;
  for (char x ='A'; x <= 'Z'; ++x) {
    bool flag = true;
    for (int i = 0; i < 26; ++i)
      if (encoder[i] ==x) {
        flag = false;
        break;
      }
      if (flag) {
        encoder[k]= x;
        ++k;
      }
  }
  for (int i = 0; i < 26; ++i)
     decoder[encoder[i]- 'A'] = i + 'A';
  cin >> st;
  for (int i = 0; i < st.length( ); ++i)
    st[i] = decoder[st[i] -'A'];
  cout << st;
  return 0;
}

1)输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。( )
A. 正确   B. 错误  

2)若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样。()
A. 正确   B. 错误  

3)将第 12 行的“i < 26”改为“i < 16”,程序运行结果不会改变。( )
A. 正确   B. 错误  

4)将第 26 行的”i < 26”改为“i < 16”,程序运行结果不会改变。( )
A. 正确   B. 错误  

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  

6、

【CSP 2019 入门组第一轮 q16】阅读程序(程序输入不超过数组或字符串定义的范围)

#include <cstdio>
#include <cstring>
using namespace std;
char st[100];
int main() {
    scanf("%s", st);
    int n = strlen(st);
    for (int i = 1; i <= n; ++i) {
        if (n % i == 0) {
            char c = st[i - 1];
            if (c >= 'a')
                st[i - 1] = c - 'a' + 'A';
        }
    }
    printf("%s", st);
    return 0;
}		

1)输入的字符串只能由小写字母或大写字母组成。()
A. 正确   B. 错误  

2)若将第8行的“i = 1”改为“i = 0”,程序运行时会发生错误。()
A. 正确   B. 错误  

3)若将第8行的“i <= n”改为“i * i <= n”,程序运行结果不会改变。()
A. 正确   B. 错误  

4)若输入的字符串全部由大写字母组成,那么输出的字符串就跟输入的字符串一样。()
A. 正确   B. 错误  

5)若输入的字符串长度为18,那么输入的字符串跟输出的字符串相比,至多有()个字符不同。
A. 18   B. 6   C. 10   D. 1  

6)若输入的字符串长度为(),那么输入的字符串跟输出的字符串相比,至多有36个字符不同。
A. 36   B. 100000   C. 1   D. 128  

7、

【NOIP 2018 普及组初赛 q18】阅读程序写结果:

#include <stdio.h>
char st[100];

int main() {
	scanf("%s", st);
	for (int i = 0; st[i]; ++i) {
		if ('A' <= st[i] && st[i] <= 'Z')
		st[i] += 1;
	}
	printf("%s\n", st);
	return 0;
}

输入:QuanGuoLianSai

8、

【NOIP 2017 普及组初赛 q23】阅读程序写结果:

#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
输出:_____