指针基础(实验1)

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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值