实验二 指针综合

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

题目描述

设定以下汇率常量
美元汇率为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行

输出

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

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

#include

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

using namespace std;

void main( )

{ double a =3.141596;

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

}

输入样例

4
Y 10000
D 88.3
H 200
E 73.1

输出样例

516.0000
552.9258
161.3000
487.8986

参考代码

#include<iostream>
#include <iomanip>
using namespace std;
int main()
{
	int t;
	float m1,res; //m1是输入的外币值 
	float rate[4]={6.2619,6.6744,0.0516,0.8065};
	char a;//表示外币种类 
	cin>>t;
	while(t--)
	{
	    const float *pm=rate;
		cin>>a>>m1;
	    if(a=='E') pm=rate+1;
	    else if(a=='Y') pm=rate+2;
	    else if(a=='H') pm=rate+3;
	    res=(*pm)*m1;
	    cout<<fixed<<setprecision(4)<<res<<endl;
	}
	return 0;
}

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

题目描述

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

要求:

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

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

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

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

输入

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

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

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

依次输入t个实例

输出

每行输出合并后的新字符串

输入样例

2
abcdefghij
ABCDEFGHIJ
aabbccddee
3 5
2 6
8 10
AABBCCDDEE
ffgghhiijj
FFGGHHIIJJ
1 4
5 8
2 7

输出样例

cdeBCDEFdee
AABBhhiiFGGHHI

参考代码

#include<iostream>
using namespace std;
int main()
{
	int t;//测试组数
	cin>>t;
	char s1[15],s2[15],s3[15];
	int in1,in2,in3,in4,in5,in6;
	int len;
	while(t--)
	{
		
		cin>>s1>>s2>>s3;
		char *ps1=s1,*ps2=s2,*ps3=s3;
		cin>>in1>>in2>>in3>>in4>>in5>>in6;
		len=in2-in1+in4-in3+in6-in5+3;//数组长度 
		char *p=new char[len-1];
		char *pa=p;
		for(int i=0;i<len;i++)
		{
			if(i<=in2-in1)//截取第一个字符串 
			{
				*p=*(ps1+in1-1);
				p++;
				ps1++;
			}
			else if(i<=in2-in1+in4-in3+1) 
			{
				*p=*(ps2+in3-1);
				p++;
				ps2++;
			}
			else 
			{
				*p=*(ps3+in5-1);
				p++;
				ps3++;
			}
		}
	for(int i=0;i<len;i++)
	{
		cout<<*(pa+i);
	}
	cout<<endl;
			
	} 
}

C. 数字判断(指针为函数参数)

题目描述

输入一个字符串,判断这个字符串是否一个完全整数值的字符串,例如输入"1234",那么表示整数1234,输入"12a3"就表示只是一个字符串,不是一个整数

要求编写函数isNumber,参数是一个字符指针,返回值是整数类型

如果字符串表示一个整数,则计算出这个整数并且返回

如果字符串不是表示一个整数,则返回-1

主函数必须调用isNumber来判断字符串,不能使用任何C++自带或第三方的类似函数

输入

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

每行输入一个字符串

依次输入t行

输出

每行输出判断结果

输入样例

3
1234
567a
0890

输出样例

1234
-1
890

参考代码

#include<iostream>
#include<cstring>
using namespace std;
int isNumber(char *pa,int len);
int main()
{
	int t;//测试组数
	cin>>t;
	while(t--)
	{
	    char str[100];
		cin>>str;
		int len=strlen(str);
		int rest=isNumber(str,len);
		cout<<rest<<endl;
	}
} 
int isNumber(char *pa,int len)
{
	char *pb=pa;
	int i,res=0;
	for(i=0;i<len;i++,pb++)
	{
		if(*pb>'9'||*pb<'0') return -1;
		else
		{
			res=res*10+*pb-'0';
		}	
	}
	return res;
}

D. 动态矩阵(指针与堆内存分配)

题目描述

未知一个整数矩阵的大小,在程序运行时才会输入矩阵的行数m和列数n

要求使用指针,结合new方法,动态创建一个二维数组,并求出该矩阵的最小值和最大值,可以使用数组下标法。

不能先创建一个超大矩阵,然后只使用矩阵的一部分空间来进行数据访问、

创建的矩阵大小必须和输入的行数m和列数n一样

输入

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

第二行输入两个数字m和n,表示第一个矩阵的行数和列数

第三行起,连续输入m行,每行n个数字,表示输入第一个矩阵的数值

依次输入t个实例

输出

每行输出一个实例的最小值和最大值

输入样例

2
2 3
33 22 11
66 88 55
3 4
19 38 45 14
22 65 87 31
91 35 52 74

输出样例

11 88
14 91

参考代码

#include<iostream>
using namespace std;
int main()
{
	int t;//测试组数
	cin>>t;
	int m,n,i,j;
	int max,min;
	while(t--)
	{
		cin>>m>>n;
		int **p=new int*[m];//用new创建一个m行的数组 
		for(i=0;i<m;i++)
		{
			p[i]=new int[n]; //每行数组包含n列元素 
		}
		for(i=0;i<m;i++)
		   for(j=0;j<n;j++) 
		   {
		   	cin>>p[i][j]; 
		   }
		max=p[0][0];
		min=p[0][0];
		for(i=0;i<m;i++)
		   for(j=0;j<n;j++) 
		   {
		   	if(p[i][j]>max) max=p[i][j];
		   	if(p[i][j]<min) min=p[i][j];
		   }
		cout<<min<<' '<<max<<endl;
		for(i=0;i<m;i++) delete []p[i]; 
		delete []p;//释放堆内存 
	}
}

E. 蛇形矩阵(指针与动态内存分配)

题目描述

蛇形矩阵,是由1开始的自然数一次排列成的N*N的正方形矩阵,数字依次由外而内的递增。如 N=3时蛇形矩阵为:
1 2 3
8 9 4
7 6 5

N=6时蛇形矩阵为:
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11

输入蛇形矩阵宽度,动态分配二维数组,设置蛇形矩阵并输出结果。

输入

测试次数t
每组测试数据一行:数组大小N(>0)

输出

对每组测试数据,输出计算得到的蛇形矩阵。每行元素间以空格分隔,最后一个元素后无空格。

每组测试数据之间以空行分隔。

输入样例

3
3
6
2

输出样例

1 2 3
8 9 4
7 6 5

1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11

1 2
4 3

参考代码

#include<iostream>
using namespace std;
const int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int main()
{
	int t;//测试组数
	cin>>t;
	
	while(t--)
	{
		int n;//数组大小 
		cin>>n;
		int i,j;
		int **p=new int *[n];//创建n行的数组
		for(i=0;i<n;i++) 
		 p[i]=new int[n];
		for(i=0;i<n;i++)
		   {
		   	for(j=0;j<n;j++)
		    {
			p[i][j]=0;//初始化:也是便于判断是否被赋值过,自然数不包含0 
			}
		   }
	 i=0,j=0;
	 int m=1;//i,j分别表示行和列 
	 int len=n*n;
	 int ind = 0;
	 
	while(m<=len)//大循环:范围是整个矩阵内数字总数 
	{
		//数字填充
		p[i][j] = m++;
		//判断是否转向
		if (i + dir[ind][0] == n || j + dir[ind][1] == n ||j+dir[ind][1]==-1|| p[i + dir[ind][0]][j + dir[ind][1]] != 0)
			ind = (ind + 1) % 4;
		//坐标变换

		i += dir[ind][0];
		j += dir[ind][1];
	}
		
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				if(j<n-1) cout<<p[i][j]<<' ';
				else cout<<p[i][j]<<endl;
			}
		}
	for(i=0;i<n;i++) delete []p[i]; 
	delete []p;//释放堆内存	 
	cout<<endl;  
	}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值