指针入门( ojc+ )

文章介绍了如何在C++中使用指针实现查找数组最大值、对三个数进行冒泡排序以及处理动态数组(整数、字符和浮点数)的操作,同时涉及成绩查询和货币兑换场景,强调了指针在编程中的应用
摘要由CSDN通过智能技术生成

 A. 使用函数找出数组中的最大值 (指针)

主函数参考如下:

#include <iostream>

using namespace std;

int FindArrayMax( int a[], int n );

int main()

{

    const int MAXN=10;

    int i, n;

    int a[MAXN];

    cin>>n;

    for( i=0; i<n; i++ ){

        cin>>a[i];

    }

    cout<<FindArrayMax(a, n)<<endl;

    return 0;

}

/* 请在这里填写答案 */

函数接口定义:

int FindArrayMax( int a[], int n );

其中a是用户传入的数组,n是数组a中元素的个数。函数返回数组a中的最大值。

     代码详解:

题目目的在于找到最大值;所以直接定义新指针*max;而不用重新排序。

B. 三数论大小(指针)

1. 题目描述

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

要求:用三个指针分别指向这三个整数,排序过程必须通过这三个指针来操作,不能直接访问这三个整数

输出时,必须使用这三个指针,不能使用存储三个整数的变量

2. 输入

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

第二行起,每行输入三个整数

输入t行

3. 输出

每行按照从大到小的顺序输出每个实例

4.    代码详解:

   <1>   自写主解:
#include <iostream>
using namespace std;

int main() {
	int t;
	cin >> t;
	while (t--) {
		int a[3];
		for (int i = 0; i < 3; i++) {
			cin >> a[i];
		}
		int* k;
		k = a;
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				if (*(k+j) < *(k + j+1)) {
					int temp = *(k+j);
					*(k+j) = *(k + j+1);
					*(k + j + 1) = temp;
				}
			}
		}
		cout << a[0]<< " " << a[1] << ' ' << a[2] << endl;
		
	}
}

 其中应用到了指针的冒泡排序算法块:

for (int i = 0; i < 3; i++) {
	for (int j = 0; j < 3; j++) {
		if (*(k + j) < *(k + j + 1)) {
			int temp = *(k + j);
			*(k + j) = *(k + j + 1);
			*(k + j + 1) = temp;
		}
	}
}
  <2>   可运用其他方法排序:
 方法一   (转载):
#include <iostream>
using namespace std;
 
void _f(int *x, int *y) {
    if (*x < *y) {
        *x = *x + *y;
        *y = *x - *y;
        *x = *x - *y;
    }
}
 
int main()
{
    int n, f, s, t;
    int * x = &f, * y = &s, * z = &t;
    cin >> n;
    
    while (n--) {
        cin >> f >> s >> t;
 
        _f(x, y);
        _f(x, z);
        _f(y, z);
 
        cout << *x << " " << *y << " " << *z << " " << endl;
    }
    return 0;
}

补充:用常规swag函数进行交换当然可以;

方法二(转载):(引用法)后文会提到
#include <iostream>
using namespace std;
 
void _f(int *x, int *y) {
    if (*x < *y) {
        *x = *x + *y;
        *y = *x - *y;
        *x = *x - *y;
    }
}
 
int main()
{
    int n, f, s, t;
    int * x = &f, * y = &s, * z = &t;
    cin >> n;
    
    while (n--) {
        cin >> f >> s >> t;
 
        _f(x, y);
        _f(x, z);
        _f(y, z);
 
        cout << *x << " " << *y << " " << *z << " " << endl;
    }
    return 0;
}

C.货币兑换(指针与常量)

1.  题目描述

设定以下汇率常量

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

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

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

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

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

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

1.  输入


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

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

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

依次输入t行

2.输出


每行输出兑换后的人民币数量,保留4位小数

在C++中,输出指定精度的参考代码如下:

#include

#include //必须包含这个头文件

using namespace std;

void main( )

{ double a =3.141596;

cout<<fixed<<setprecision(3)<<a<<endl; //输出小数点后3位

}

3. 题目详解:
#include <iostream>
#include <iomanip>     
using namespace std;

int main()
{

    int t;
    cin >> t;
    const float D = 6.2619;
    const float E = 6.6744;
    const float Y = 0.0516;
    const float H = 0.8065;
    while (t--)
    {
        char A;
        float N;
        cin >> A >> N;
        const float* p;
        switch (A)
        {
        case 'D':p = &D; break;
        case 'E':p = &E; break;
        case 'Y':p = &Y; break;
        case 'H':p = &H; break;
        }
        cout << fixed << setprecision(4) << *p * N << endl;
    }
    return 0;
}

D. 成绩查询

1.  题目描述

已知一组学生成绩,然后根据输入的序号查询成绩

要求:

1. 使用一个整数数组存储学生成绩

2. 使用一个指针指向数组中间元素

3. 求出数组中间元素的前一个成绩和后一个成绩

4. 输入一个序号,然后计算这个序号的元素和中间元素的距离,然后使用指针去访问

例如有11个学生,指针指向中间的学生也就是第6个学生,若输入序号3,即查询第3个学生的成绩,第3和第6之间距离为3,那么指针应该怎么运算呢???

5. 整个程序除了输入时可以使用数组下标,其他部分尽量使用使用指针进行访问。

2.  输入

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

第二行先输入n,表示有n个学生,然后再输入n个成绩(正整数)

第三行输入1个序号,表示要查询成绩的学生的序号。

依次输入t个实例

按自然意义,序号是从1开始计算

提示:在数组中是从........

3.  输出

对于每个测试实例:

第一行输出数组中间元素的前一个成绩和后一个成绩

第二行根据序号输出1个成绩

4.  代码详解
 

​
#include<iostream>
using namespace std;
int main() {
	int* a;
	int t, num, search;
	cin >> t;
	while (t--) {
		cin >> num;
		a = new int[num];
		int* p = a + num / 2;
		for (int i = 0; i < num; i++) {
			cin >> a[i];
		}
		cout << *(p-1) << " " << *(p+1) << endl;
		cin >> search;
		cout << *(p + ((search - 1) - num / 2)) << endl;
	}
	return 0;
}

​

E.  动态数组(指针与数组)

题目描述

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

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

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

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

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

提示:使用new关键字

输入

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

第二行先输入一个大写字母表示数组类型,I表示整数类型,C表示字符类型,F表示浮点数类型;然后输入n表示数组长度。

第三行输入n个数据

依次输入t个实例

输出

每个根据不同的数组类型输出相应的结果

#include<iostream>
using namespace std;
int main()
{
	int t,i,n;
	char c;
	cin>>t;
	while(t--)
	{
		cin>>c>>n;
		if(c=='I')
		{
			int *p=new int[n],sum=0;
			for(i=0;i<n;i++)
			{
				cin>>*(p+i);
				sum+=*(p+i);
			}
			cout<<sum/n<<endl;
		}
		else if(c=='C')
		{
			char *p=new char[n];
			int max=0;
			for(i=0;i<n;i++)
			{
				cin>>*(p+i);
				if(*(p+i)>*(p+max))
				max=i;
			}
			cout<<*(p+max)<<endl;
		}
		else
		{
			float *p=new float[n];
			int min=0;
			for(i=0;i<n;i++)
			{
				cin>>*(p+i);
				if(*(p+i)<*(p+min))
				min=i;
			}
			cout<<*(p+min)<<endl;			
		}
	}
}

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值