A.月份查询(指针数组)

题目描述

已知每个月份的英文单词如下,要求创建一个指针数组,数组中的每个指针指向一个月份的英文字符串,要求根据输入的月份数字输出相应的英文单词

1月 January 
2月 February
3月 March
4月 April
5月 May
6月 June
7月 July
8月 August
9月 September
10月 October
11月 November
12月 December

cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
using namespace std;
int main()
{
int t, x;
const char* mouth[12] = { "January","February","March","April","May","June","July","Aguest","September","October","November","December" };

cin >> t;
while (t--) {
cin >> x;
if (x < 1 || x>12)
{
cout << "error" << endl;
}
else
{
cout << *(mouth + x - 1) << endl;
}
}
return 0;
}

B.字符串比较(指针与字符)

题目描述

编写一个函数比较两个字符串,参数是两个字符指针(要求显式定义,例如char *S, char *T),比较字符串S和T的大小。如果S大于T,则返回1,如果S小于T则返回-1,如果S与T相等则返回0。

比较规则:

1.把两个字符串的相同位置上的字符进行比较,字符的大小比较以ASCII值为准

2.在比较中,如果字符串S的字符大于字符串T的字符的数量超过小于的数量,则认为S大于T,如果等于则S等于T,如果小于则S小于T

例如S为aaccdd,T为eebbbb,每个位置比较得到S前两个字母都小于T,但后4个字母都大于T,最终认为S大于T

3.如果两个字符串长度不同,则更长的字符串为大

在主函数中输入两个字符串,并调用该函数进行判断,在判断函数中必须使用函数参数的指针进行字符比较

cpp
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<iostream>
#include<cstring>
using namespace std;
int Compare(char* p1, int long1, char* p2, int long2) {
int count1 = 0;
int count2 = 0;
if (long1 != long2)
{
if (long1 > long2)
{
return 1;
}
if (long1 < long2)
{
return -1;
}
}
else
{
for (int i = 0; i < long1; i++)
{
if (int(*(p1 + i)) > int(*(p2 + i)))
{
count1++;
}
if (int(*(p1 + i)) < int(*(p2 + i)))
{
count2++;
}
}
if (count1 > count2)
{
return 1;
}
else if (count1 < count2)
{
return -1;
}
else
{
return 0;
}
}
}
int main() {
int t;
cin >> t;
while (t--)
{
char str1[100];
char str2[100];
cin >> str1;
cin >> str2;
int long1 = strlen(str1);
int long2 = strlen(str2);
cout << Compare(str1, long1, str2, long2) << endl;

}
return 0;
}

C.成绩查询(指针运算)

题目描述

已知一组学生成绩,然后根据输入的序号查询成绩

要求:

  1. 使用一个整数数组存储学生成绩

  2. 使用一个指针指向数组中间元素

  3. 求出数组中间元素的前一个成绩和后一个成绩

  4. 输入一个序号,然后计算这个序号的元素和中间元素的距离,然后使用指针去访问
    例如有11个学生,指针指向中间的学生也就是第6个学生,若输入序号3,即查询第3个学生的成绩,第3和第6之间距离为3,那么指针应该怎么运算呢???

  5. 整个程序除了输入时可以使用数组下标,其他部分尽量使用使用指针进行访问。

cpp
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
#include<iostream>
using namespace std;
int main()
{
int t, num, n;
cin >> t;
while (t--)
{
cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int* m = new int[n];
m = a + n / 2;
m--;
cout << *m << " ";
m += 2;
cout << *m << endl;
m--;
cin >> num;
m += num - (n / 2 + 1);
cout << *m << endl;

}
return 0;
}

D.动态矩阵(指针与堆内存分配)

题目描述

未知一个整数矩阵的大小,在程序运行时才会输入矩阵的行数m和列数n

要求使用指针,结合new方法,动态创建一个二维数组,并求出该矩阵的最小值和最大值,可以使用数组下标法。

不能先创建一个超大矩阵,然后只使用矩阵的一部分空间来进行数据访问、

创建的矩阵大小必须和输入的行数m和列数n一样

cpp
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<iostream>
using namespace std;
int main()
{
int t, i, j, k, m, n, max, min;
cin >> t;
i = 0;
while (i < t)
{
i++;
cin >> m >> n;
int** a = new int* [m];
for (j = 0; j < m; j++)
{
a[j] = new int[n];
}
for (j = 0; j < m; j++)
{
for (k = 0; k < n; k++)
{
cin >> a[j][k];
}
}
max = **a;
min = **a;
for (j = 0; j < m; j++)
{
for (k = 0; k < n; k++)
{
if (*(*(a + j) + k) > max)
{
max = *(*(a + j) + k);
}
else if(*(*(a+j)+k)<min)
{
min = *(*(a + j) + k);
}
}
}
cout << min << " " << max << endl;
for (j = 0; j < m; j++)
{
delete[]a[j];
}
delete[]a;
}
return 0;
}

E.密钥加密法(指针应用)

题目描述

有一种方式是使用密钥进行加密的方法,就是对明文的每个字符使用密钥上对应的密码进行加密,最终得到密文

例如明文是abcde,密钥是234,那么加密方法就是a对应密钥的2,也就是a偏移2位转化为c;明文b对应密钥的3,就是b偏移3位转化为e,同理c偏移4位转化为g。这时候密钥已经使用完,那么又重头开始使用。因此明文的d对应密钥的2,转化为f,明文的e对应密钥的3转化为h。所以明文abcde,密钥234,经过加密后得到密文是cegfh。

如果字母偏移的位数超过26个字母范围,则循环偏移,例如字母z偏移2位,就是转化为b,同理字母x偏移5位就是转化为c

要求:使用三个指针p、q、s分别指向明文、密钥和密文,然后使用指针p和q来访问每个位置的字符,进行加密得到密文存储在指针s指向的位置。

除了变量定义和输入数据,其他过程都不能使用数组下标法,必须使用三个指针来访问明文、密钥和密文。

提示:当指针q已经移动到密钥的末尾,但明文仍然没有结束,那么q就跳回密钥头

cpp
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
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int t, i=0;
cin >> t;
char* p, * s;
char* q;
while(i<t)
{
i++;
int j = 0;
char plain[21];
char key[21];

cin >> plain;
cin >> key;

s = new char[21];
p = &plain[0];
q = &key[0];

for (int o = 0; o <= strlen(plain); o++) {
j = o % strlen(q);
if (*(p + o) >= 'a' && *(p + o) <= 'z') {
*(s + o) = (*(p + o) + *(q + j) - '0' - 'a') % 26 + 'a';
}
if (*(p + o) >= 'A' && *(p + o) <= 'Z') {
*(s + o) = (*(p + o) + *(q + j) - '0' - 'A') % 26 + 'A';
}
}
for (int o = 0; o < strlen(plain); o++) {
cout << *(s + o);
}
cout << endl;
delete[]s;
}

return 0;
}