实验二 指针综合
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. 三串合一(指针与字符数组)
题目描述
输入三个字符串,通过指针读取各个字符串的子串(子串是指字符串中连续的一小部分),把它们合并成一个新字符串
要求:
-
三个字符串的创建和输入可以使用数组,也可以不用
-
输入后,根据三个字符串的子串的长度,计算出新字符串的长度
-
使用动态数组的方法创建新的字符串,并且使用指针读取三个字符串的不同部分,并且复制到新字符串中,要求整个过程都不能使用数组下标
-
使用指针输出新的字符串
输入
第一行输入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;
}
}