A.月份查询(指针数组)
已知每个月份的英文单词如下,要求创建一个指针数组,数组中的每个指针指向一个月份的英文字符串,要求根据输入的月份数字输出相应的英文单词
1月 January
2月 February
3月 March
4月 April
5月 May
6月 June
7月 July
8月 Aguest
9月 September
10月 October
11月 November
12月 December
输入:
第一行输入t表示t个测试实例
接着每行输入一个月份的数字
依次输入t行
#include <iostream>
using namespace std;
int main()
{
const char* pmonth[12] = {"January","February","March","April","May","June","July","Aguest","September","October","November","December"};
int t;
int ch;
cin >> t;
for (int i = 0; i < t; i++)
{
cin >> ch;
if (ch <= 12 && ch >= 1)
{
cout << pmonth[ch - 1] << endl;
}
else
cout << "error" << 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.如果两个字符串长度不同,则更长的字符串为大
在主函数中输入两个字符串,并调用该函数进行判断,在判断函数中必须使用函数参数的指针进行字符比较
输入:
输入t表示有t个测试实例
接着每两行输入两个字符串,字符串的最大长度不超过20
依次输入t个实例
#include <iostream>
#include <string.h>
using namespace std;
int bijiao( char* s, char* t)
{
if (strlen(s) == strlen(t))
{
int temp1 = 0, temp2 = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] > t[i])
temp1++;
else if (s[i] < t[i])
temp2++;
}
if (temp1 > temp2)
return 1;
else if (temp1 < temp2) return -1;
else return 0;
}
else if (strlen(s) > strlen(t))
return 1;
else
return -1;
}
int main()
{
int t, sum;
char* S = new char[100];
char* T = new char[100];
cin >> t;
for (int i = 0; i < t; i++)
{
cin >> S >> T;
sum = bijiao(S, T);
cout << sum << endl;
}
return 0;
}
C. 成绩查询(指针运算)
已知一组学生成绩,然后根据输入的序号查询成绩
要求:
1. 使用一个整数数组存储学生成绩
2. 使用一个指针指向数组中间元素
3. 使用++和--运算符,求出数组中间元素的前一个成绩和后一个成绩
4. 输入一个序号,然后计算这个序号的元素和中间元素的距离,然后使用指针去访问
例如有11个学生,指针指向中间的学生也就是第6个学生,若输入序号3,即查询第3个学生的成绩,第3和第6之间距离为3,那么指针应该怎么运算呢???
5. 整个程序除了输入时可以使用数组下标,其他部分尽量使用使用指针进行访问。
输入
第一行输入t表示有t个测试实例
第二行先输入n,表示有n个学生,然后再输入n个成绩(正整数)
第三行输入1个序号,表示要查询成绩的学生的序号。
依次输入t个实例
按自然意义,序号是从1开始计算
提示:在数组中是从........
输出
对于每个测试实例:
第一行输出数组中间元素的前一个成绩和后一个成绩
第二行根据序号输出1个成绩
#include <iostream>
using namespace std;
int main()
{
int t, n, xuhao;
int* scores;
int* p2;
cin >> t;
for (int i = 0; i < t; i++)
{
cin >> n;
scores = new int[n];
int *p1 = scores + n / 2;
for (int j = 0; j < n; j++)//7
cin >> scores[j];
cout << *--p1 << ' ';//*p1-- 先赋值后减
p1++;
cout << *++p1 << endl;
cin >> xuhao;
p2 = &scores[xuhao - 1];
cout << *p2 << endl;
}
return 0;
}
D. 动态矩阵(指针与堆内存分配)
未知一个整数矩阵的大小,在程序运行时才会输入矩阵的行数m和列数n
要求使用指针,结合new方法,动态创建一个二维数组,并求出该矩阵的最小值和最大值,可以使用数组下标法。
不能先创建一个超大矩阵,然后只使用矩阵的一部分空间来进行数据访问、
创建的矩阵大小必须和输入的行数m和列数n一样
输入:
第一行输入t表示t个测试实例
第二行输入两个数字m和n,表示第一个矩阵的行数和列数
第三行起,连续输入m行,每行n个数字,表示输入第一个矩阵的数值
依次输入t个实例
输出:
每行输出一个实例的最小值和最大值
#include <iostream>
using namespace std;
int main()
{
int m, n,t;
int** array;
cin >> t;
for (int k = 0; k < t; k++)
{
cin >> m >> n;
array = new int* [m];
for (int i = 0; i < m; i++)
{
array[i] = new int[n];
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
cin >> array[i][j];
}
int max = array[0][0];
int min = array[0][0];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (array[i][j] > max) max = array[i][j];
if (array[i][j] < min) min = array[i][j];
}
}
cout << min <<' '<< max << endl;
for (int i = 0; i < m; i++)
{
delete[]array[i];
}
delete[]array;
}
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就跳回密钥头
输入:
第一行输入t表示有t个测试实例
第二行输入一个字符串,表示第一个实例的明文, 字符串的最大长度不超过20
第三行输入一个数字串,表示第一个实例的密钥,数字串的最大长度不超过20
依次输入t个实例
输出:
每行输出加密后的密文
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int t;
char s1[50];
char s2[50];
cin >> t;
for (int i = 0; i < t; i++)
{
cin >> s1;
cin >> s2;
char* p = &s1[0];
char* q = &s2[0];
int temp = 0;
char* s =new char[50];
for (int j = 0; j < strlen(s1); j++)
{
if (*(p + j) >= 'a' && *(p + j) <= 'z')//abc 123 bdf
{
temp = (*(p + j) - 'a') + ((*(q + j % strlen(s2)) - '0')) % 26;
while (temp > 26)
{
temp %= 26;
}
*(s + j) = temp + 'a';
}
if (*(p + j) >= 'A' && *(p + j) <= 'Z')
{
temp = (*(p + j) - 'A') + ((*(q + j % strlen(s2)) - '0')) % 26;
while (temp > 26)
{
temp %= 26;
}
*(s + j) = temp + 'A';
}
}
for (int k = 0; k < strlen(s1); k++)
{
cout << *(s + k);
}
cout << endl;
delete[]s;
}
return 0;
}