C++指针题

  • 三数论大小(指针)

输入三个整数,然后按照从大到小的顺序输出数值。

要求:用三个指针分别指向这三个整数,排序过程必须通过这三个指针来操作,不能直接访问这三个整数;输出时,必须使用这三个指针,不能使用存储三个整数的变量

#include <iostream>
using namespace std;

int main()
{
	int t, i,j,* p1, * p2, * p3;
	int a, b, c;
	int temp=0;
	cin >> t;
	for (i = 0; i < t; i++)
	{
		cin >> a >> b >> c;
		p1 = &a; p2 = &b; p3 = &c;
		//123 213 312 321
		if (*p1 < *p2) {
			temp = *p1;
			*p1 = *p2;
			*p2 = temp;

		}
		if (*p1 < *p3) {
			temp = *p1;
			*p1 = *p3;
			*p3 =temp;

		}
		if (*p2 < *p3) {
			temp = *p2;
			*p2 = *p3;
			*p3 = temp;
		}
		cout << *p1 << " " << *p2 << " " << *p3 << endl;
	}

	return 0;
}
  • 货币兑换(指针与常量)

设定以下汇率常量

美元汇率为6.2619,表示1美元兑换6.2619元人民币

欧元汇率为6.6744,表示1欧元兑换6.6744元人民币

日元汇率为0.0516,表示1元日元兑换0.0516元人民币

港币汇率为0.8065,表示1元港币币兑换0.8065元人民币

定义一个常量指针,根据需求指针指向不同的汇率,然后计算出各种货币兑换为人民币的数量

要求:不能直接使用汇率常量进行计算,必须使用常量指针,只能使用一个指针

输入一个t表示有t个测试实例

每行先输入一个字母,表示货币类型,然后再输入一个数字(正浮点数),表示货币数量

D表示美元,E表示欧元,Y表示日圆,H表示港币

依次输入t行

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	double const* p;
	int t, i;
	double x,sum=0;
	char s;
	cin >> t;
	for (i = 0; i < t; i++)
	{
		cin >> s >> x;
		if (s == 'D')
		{
			double a = 6.2619;
			p = &a;
			sum =*p *x;
		}
		else if (s == 'Y') 
		{
			double a = 0.0516;
			p = &a;
			sum = *p * x;
		}
		else if (s == 'E')
		{
			double a = 6.6744;
			p = &a;
			sum = *p * x;

		}
		else if (s == 'H') 
		{

			double a = 0.8065;
			p = &a;
			sum = *p * x;
		}
		cout << fixed << setprecision(4) << sum << endl;  //输出小数点后4位

	}
	return 0;
}

  • 动态数组(指针与数组)

一开始未知数组长度,根据要求创建不同类型的指针,并且使用指针创建相应长度的数组,然后再完成不同的要求

若要求创建整数数组,计算数组内所有数据的平均值

若要求创建字符数组,找出数组内的最大字母

若要求创建浮点数数组,找出数组的最小值

要求程序整个过程不能使用数组下标,从数组创建、输入到搜索、比较、计算,到输出都必须使用指针

提示:使用new关键字

#include <iostream>
using namespace std;

int main()
{
	int t, n, i, j;
	double sum = 0;
	char s;
	cin >> t;
	for (i = 0; i < t; i++)
	{
		cin >> s >> n;
		if (s == 'I')
		{
			int* p = new int[50];
			for (j = 0; j < n; j++)
			{
				cin >> *(p + j);
				sum += *(p + j);
			}
			sum = sum / n;
			cout << sum << endl;
			delete p;

		}
		else if (s == 'C')
		{
			char* p = new char[50];
			for (j = 0; j < n; j++)
			{
				cin >> *(p + j);

			}
			char max = *p;
			for (j = 0; j < n; j++)
			{
				if(*(p+j)>max)
				{
					max = *(p + j);
				}
			}
			cout << max << endl;
			delete p;
		}
		else if (s == 'F')
		{
			float* p = new float[50];
			for (j = 0; j < n; j++)
			{
				cin >> *(p + j);
			}
			float min = *p;
			for (j = 0; j < n; j++)
			{
				if (*(p + j) < min) {
					min = *(p + j);
				}
			}
			cout << min << endl;
			delete p;
		}
	}
	return 0;
}

  •  三串合一(指针与字符数组)

输入三个字符串,通过指针读取各个字符串的子串(子串是指字符串中连续的一小部分),把它们合并成一个新字符串

要求:

1. 三个字符串的创建和输入可以使用数组,也可以不用

2. 输入后,根据三个字符串的子串的长度,计算出新字符串的长度

3. 使用动态数组的方法创建新的字符串,并且使用指针读取三个字符串的不同部分,并且复制到新字符串中,要求整个过程都不能使用数组下标

4. 使用指针输出新的字符串

第一行输入t表示有t个测试实例

连续三行输入三个字符串,每个字符串都包含10个字符

连续三行,每行输入数字a和b,表示每个子串的开始和结束位置。注意字符串的位置是按照一般意义从1开始计算,和编程中的数组位置不同。例如字符串abcdefg,开始位置是3,结束位置是5,那么子串就是cde

依次输入t个实例

#include <iostream>
using namespace std;

int main()
{
	int t, i, j, k, m,c=0,length=0,r=0;
	int a[10], b[10];		
	char* p2 = new char[100100];
	char* p1 = new char [50];
	cin >> t;
	for (k = 0; k < t; k++)
	{
		length = 0;
		int z = 0;
		for (i = 0; i < 30; i++)
		{
			cin >> *(p1 + i);
		}
        *(p1 + 30) = '\0';
		for (i = 0; i < 3; i++)
		{
			cin >> a[i] >> b[i];
		}
		for (i = 0; i < 3; i++)
		{		
			for (m = z+a[i]-1; m <= z+b[i]-1; m++)
			{
				*(p2+c) = *(p1 + m);
				c++;
				length++;
			}
			z += 10;		
		}
		for (c = 0+r; c <length+r; c++)
		{
			cout << *(p2 + c);
		}
		r = length;
		cout << endl;
	}
	delete[]p1;
	delete[]p2;
	return 0;
}

  •  矩阵左转(指针与数组)

输入一个2*3的矩阵,将这个矩阵向左旋转90度后输出

4 5 6 

向左旋转90度后的矩阵变为:

3 6

2 5

1 4

要求:除了矩阵创建和数据输入可以使用数组和数组下标的方法,其他过程对矩阵的任何访问都必须使用指针

提示:m行n列的二维矩阵,第i行第j列的元素与首元素的距离为i*n+j,序号从0开始计算

#include <iostream>
using namespace std;

int main()
{
	int t, i, j, k, sum=0;
	int* p1 = new int[50];
	int* p2 = new int[50];
	cin >> t;
	for (i = 0; i < t; i++)
	{
		for (j = 0; j < 6; j++)
		{
			cin >> *(p1 + j);
		}
		// 0123456  2--0  5--1 1--2 4--3
		*(p2 + 0) = *(p1 + 2);
		*(p2 + 1) = *(p1 + 5);
		*(p2 + 2) = *(p1 + 1);
		*(p2 + 3) = *(p1 + 4);
		*(p2 + 4) = *(p1 + 0);
		*(p2 + 5) = *(p1 + 3);
		for (j = 0; j < 6; j++)
		{
			cout<< *(p2 + j) <<' ';
			sum++;
			if (sum % 2 == 0)
			{
				cout << endl;
			}
		}
	}
	delete p1;
	delete p2;

	return 0;
}

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值