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