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
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.如果两个字符串长度不同,则更长的字符串为大
在主函数中输入两个字符串,并调用该函数进行判断,在判断函数中必须使用函数参数的指针进行字符比较
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.成绩查询(指针运算)
题目描述
已知一组学生成绩,然后根据输入的序号查询成绩
要求:
-
使用一个整数数组存储学生成绩
-
使用一个指针指向数组中间元素
-
求出数组中间元素的前一个成绩和后一个成绩
-
输入一个序号,然后计算这个序号的元素和中间元素的距离,然后使用指针去访问
例如有11个学生,指针指向中间的学生也就是第6个学生,若输入序号3,即查询第3个学生的成绩,第3和第6之间距离为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
| #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一样
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就跳回密钥头
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; }
|