A. 三数论大小(指针)
题目描述
输入三个整数,然后按照从大到小的顺序输出数值。
要求:用三个指针分别指向这三个整数,排序过程必须通过这三个指针来操作,不能直接访问这三个整数
输出时,必须使用这三个指针,不能使用存储三个整数的变量
输入
第一行输入t表示有t个测试实例
第二行起,每行输入三个整数
输入t行
输出
每行按照从大到小的顺序输出每个实例
在每行中,每个数据输出后都带有一个空格,即使该行最后一个数据输出后也要再输出一个空格
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int t;
cin >> t;
int a[3];
while (t--) {
for (int i = 0; i < 3; i++) {
cin >> a[i];
}
int *p = &a[0];
int *q = &a[1];
int *r = &a[2];
if (*p < *q) {
t = *p;
*p = *q;
*q = t;
}
if (*p < *r) {
t = *p;
*p = *r;
*r = t;
}
if (*q < *r) {
t = *q;
*q = *r;
*r = t;
}
cout << *p << " " << *q << " " << *r << " " << endl;
}
return 0;
}
B. 数字判断(指针为函数参数)
题目描述
输入一个字符串,判断这个字符串是否一个完全整数值的字符串,例如输入"1234",那么表示整数1234,输入"12a3"就表示只是一个字符串,不是一个整数
要求编写函数isNumber,参数是一个字符指针,返回值是整数类型
如果字符串表示一个整数,则计算出这个整数并且返回
如果字符串不是表示一个整数,则返回-1
主函数必须调用isNumber来判断字符串,不能使用任何C++自带或第三方的类似函数
输入
输入t表示有t个测试实例
每行输入一个字符串
依次输入t行
输出
每行输出判断结果
#include <iostream>
using namespace std;
#include<cstdlib>
int isNumber(char *str);
int main()
{
int t;
char str[30];
cin>>t;
while(t--)
{
cin>>str;
cout<<isNumber(str)<<endl;
}
return 0;
}
int isNumber(char *str)
{
int i=0,s=0;
while(str[i])
{
if(!isdigit(str[i]))
return -1;
s=s*10+str[i]-'0';
i++;
}
return s;
}
C. 成绩查询(指针运算)
题目描述
已知一组学生成绩,然后根据输入的序号查询成绩
要求:
1. 使用一个整数数组存储学生成绩,假设元素数是n。
2. 使用一个指针指向数组中间元素,即n/2的位置。
3. 使用++和--运算符,求出数组中间元素的前一个成绩和后一个成绩
4. 输入一个序号,然后计算这个序号的元素和中间元素的距离,然后使用指针去访问
例如有11个学生,指针指向中间的学生也就是第6个学生,若输入序号3,即查询第3个学生的成绩,第3和第6之间距离为3,那么指针应该怎么运算呢???
如果有两个中间学生,则将后面那个看为中间学生。
5. 整个程序除了输入时可以使用数组下标,其他部分尽量使用使用指针进行访问。
输入
第一行输入t表示有t个测试实例
第二行先输入n,表示有n个学生,然后再输入n个成绩(正整数)
第三行输入1个序号,表示要查询成绩的学生的序号。
依次输入t个实例
按自然意义,序号是从1开始计算
提示:在数组中是从........
输出
对于每个测试实例:
第一行输出数组中间元素的前一个成绩和后一个成绩
第二行根据序号输出1个成绩
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int *a = new int[n];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int x;
cin >> x;
int *p = a;
p = p + n / 2;
p--;
int *l = p ;
p++;
p++;
int *r = p ;
p--;
int cha = n / 2 - x;
cout << *l << " " << *r << endl;
cout << *(p - cha - 1) << endl;
}
delete []a;
return 0;
}
D. 动态数组(指针与数组)
题目描述
一开始未知数组长度,根据要求创建不同类型的指针,并且使用指针创建相应长度的数组,然后再完成不同的要求
若要求创建整数数组,计算数组内所有数据的平均值
若要求创建字符数组,找出数组内的最大字母
若要求创建浮点数数组,找出数组的最小值
要求程序整个过程不能使用数组下标,从数组创建、输入到搜索、比较、计算,到输出都必须使用指针
提示:使用new关键字
输入
第一行输入t表示有t个测试实例
第二行先输入一个大写字母表示数组类型,I表示整数类型,C表示字符类型,F表示浮点数类型;然后输入n表示数组长度。
第三行输入n个数据
依次输入t个实例
输出
每个根据不同的数组类型输出相应的结果
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int main() {
int t;
cin >> t;
char ch;
int n;
while (t--) {
cin >> ch >> n;
if (ch == 'I') {
int *a = new int[n];
int sum = 0;
for (int i = 0; i < n; i++) {
cin >> *(a + i);
}
for (int i = 0; i < n; i++) {
sum += *(a + i);
}
cout << sum / n << endl;
} else if (ch == 'F') {
float *b = new float[n];
float min = 1e9;
for (int i = 0; i < n; i++) {
cin >> *(b + i);
}
for (int i = 0; i < n; i++) {
if (*(b + i) < min) {
min = *(b + i);
}
}
printf("%.1f\n", min);
} else if (ch == 'C') {
char *c = new char[n];
char m = -1e9;
for (int i = 0; i < n; i++) {
cin >> *(c + i);
}
for (int i = 0; i < n; i++) {
if (*(c + i) > ch) {
m = *(c + i);
}
}
cout << m << endl;
}
}
return 0;
}
E. 三串合一(指针与字符数组)
题目描述
输入三个字符串,通过指针读取各个字符串的子串(子串是指字符串中连续的一小部分),把它们合并成一个新字符串
要求:
1. 三个字符串的创建和输入可以使用数组,也可以不用
2. 输入后,根据三个字符串的子串的长度,计算出新字符串的长度
3. 使用动态数组的方法创建新的字符串,并且使用指针读取三个字符串的不同部分,并且复制到新字符串中,要求整个过程都不能使用数组下标
4. 使用指针输出新的字符串
输入
第一行输入t表示有t个测试实例
连续三行输入三个字符串,每个字符串都包含10个字符
连续三行,每行输入数字a和b,表示每个子串的开始和结束位置。注意字符串的位置是按照一般意义从1开始计算,和编程中的数组位置不同。例如字符串abcdefg,开始位置是3,结束位置是5,那么子串就是cde
依次输入t个实例
输出
每行输出合并后的新字符串
#include <iostream>
#include <string>
using namespace std;
int main() {
int t;
char *a = new char(10), *b = new char(10), *c = new char(10);
cin >> t;
while (t--) {
int a1, a2, b1, b2, c1, c2;
char aa[30] = {0};
cin >> a >> b >> c;
cin >> a1 >> a2 >> b1 >> b2 >> c1 >> c2;
char *x1 = a, *x2 = b, *x3 = c;
int jishu1 = 0;
char *p1 = aa;
int len = 0;
for (int i = a1 - 1; jishu1 < a2 - a1 + 1; i++) {
*p1 = *(x1 + i);
p1++;
len++;
jishu1++;
}
int jishu2 = 0;
for (int i = b1 - 1; jishu2 < b2 - b1 + 1; i++) {
*p1 = *(x2 + i);
p1++;
len++;
jishu2++;
}
int jishu3 = 0;
for (int i = c1 - 1; jishu3 < c2 - c1 + 1; i++) {
*p1 = *(x3 + i);
p1++;
len++;
jishu3++;
}
cout << aa << endl;
delete []a;
delete[]b;
delete []c;
}
return 0;
}
F. 密钥加密法(指针应用)
题目描述
有一种方式是使用密钥进行加密的方法,就是对明文的每个字符使用密钥上对应的密码进行加密,最终得到密文
例如明文是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个测试实例
第二行输入一个字符串,表示第一个实例的明文
第三行输入一个数字串,表示第一个实例的密钥
依次输入t个实例
输出
每行输出加密后的密文
#include <iostream>
using namespace std;
int main()
{
int t;
char s[3][30],*p0,*p1,*p2;
cin>>t;
while(t--)
{
cin>>s[0]>>s[1];
p0=s[0];
p1=s[1];
p2=s[2];
while(*p0)
{
if(!(*p1))
p1=s[1];
if(isupper(*p0))
*p2=(*p0-'A'+(*p1-'0'))%26+'A';
else
*p2=(*p0-'a'+(*p1-'0'))%26+'a';
p0++;
p1++;
p2++;
}
*p2='\0';
cout<<s[2]<<endl;
}
return 0;
}