C++期末复习(自用)实验二

  1. 目录

    三数论大小(指针)

    货币兑换(指针与常量)

    动态数组(指针与数组)

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

    矩阵左转(指针与数组)


A. 三数论大小(指针) 

题目描述

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

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

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

输入

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

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

输入t行

输出

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

输入样例1

3
2 4 6
88 99 77
111 333 222

输出样例1

6 4 2
99 88 77
333 222 111

 

#include <iostream>
using namespace std;

void exchange(int& a, int& b)//不能直接访问这三个整数
{
    int temp;
    temp = a;
    a = b;
    b = temp;

}
void compare(int& a, int& b, int& c)
{
    if (a < b)
    {
        exchange(a, b);
    }
    if (a < c)
    {
        exchange(a, c);
    }
    if (b < c)
    {
        exchange(b, c);
    }
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int a, b, c;
        cin >> a >> b >> c;
        compare(a, b, c);
        cout << a << " " << b << " " << c << endl;

    }
    return 0;
}

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

题目描述

设定以下汇率常量

美元汇率为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 <iostream>

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

using namespace std;

int main( )

{ double a =3.141596;

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

}

输入样例1

4
Y 10000
D 88.3
H 200
E 73.1

输出样例1

516.0000
552.9258
161.3000
487.8986

#include <iostream>
#include <iomanip> //必须包含这个头文件
using namespace std;

int main()
{
    int t;
    cin >> t;
    char type;
    float m;
    float f;
    const float* p;//常量指针
    float D = 6.2619, E = 6.6744, Y = 0.0516, H = 0.8065;
    while (t--)
    {
        cin >> type;
        cin >> m;
        if (type == 'D')
        {
            p = &D;
        }
        else if (type == 'E')
        {
            p = &E;
        }
        else if (type == 'Y')
        {
            p = &Y;
        }
        else
        {
            p = &H;
        }
        f = *p * m;
        cout << fixed << setprecision(4) << f << endl;

    }
    return 0;
}

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

题目描述

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

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

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

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

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

提示:使用new关键字

输入

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

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

第三行输入n个数据

依次输入t个实例

输出

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

 

输入样例1 

3
C 5
A D E B C
I 6
22 55 77 33 88 55
F 4
3.1 1.9 6.5 4.8

输出样例1

E
55
1.9 

 

#include <iostream>
using namespace std;

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        char type;
        cin >> type;
        int n;
        cin >> n;
        if (type == 'I')
        {
            int* av = new int[n];
            int sum = 0;
            for (int i = 0; i < n; i++)
            {
                cin >> *(av + i);
                sum += *(av + i);
            }
            int a = 0;
            a = sum / n;
            cout << a << endl;
            
        }
        else if (type == 'C')
        {
            char* wo = new char[n];
            char max;
            for (int i = 0; i < n; i++)
            {
                cin >> *(wo + i);
                if (i == 0)
                    max = *(wo + i);
                else
                {
                    if (*(wo + i) > max)
                    {
                        max = *(wo + i);
                    }
                }
                
            }
            cout << max << endl;
            
        }
        else
        {
            float* nu = new float[n];
            float min;
            for (int i = 0; i < n; i++)
            {
                cin >> *(nu + i);
                
                if (i == 0)
                    min = *(nu + i);
                else
                {
                    if (*(nu + i) < min)
                    {
                        min = *(nu + i);
                    }
                }
                
            }
            cout << min << endl;
            
        }

    }
    return 0;
}

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

题目描述

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

要求:

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

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

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

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

输入

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

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

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

依次输入t个实例

输出

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

输入样例1

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

 输出样例1

cdeBCDEFdee
AABBhhiiFGGHHI

#include <iostream>
using namespace std;

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        char g1[10];
        char g2[10];
        char g3[10];
        for (int i = 0; i < 10; i++)
        {
            cin >> g1[i];
        }
        for (int i = 0; i < 10; i++)
        {
            cin >> g2[i];
        }
        for (int i = 0; i < 10; i++)
        {
            cin >> g3[i];
        }
        int a1, b1, a2, b2, a3, b3;
        cin >> a1 >> b1 >> a2 >> b2 >> a3 >> b3;
        char* f1 = g1;
        char* f2 = g2;
        char* f3 = g3;
        for (int i = a1 - 1; i < b1; i++)
        {
            cout << *(f1 + i);
        }
        for (int i = a2 - 1; i < b2; i++)
        {
            cout << *(f2 + i);
        }
        for (int i = a3 - 1; i < b3; i++)
        {
            cout << *(f3 + i);
        }
        cout << endl;
    }
    return 0;
}

E. 矩阵左转(指针与数组)

题目描述

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

比如现在有2*3矩阵 :

1 2 3

4 5 6 

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

3 6

2 5

1 4

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

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

输入

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

连续两行输入一个2*3的矩阵的数据

依次输入t个实例

输出

依次输出左转后的矩阵结果

在输出的每行中,每个数据之间都用空格隔开,最后一个数据后面也带有空格

输入样例1 

2
1 2 3
4 5 6
4 5 6
7 8 9

 输出样例1

3 6 
2 5 
1 4 
6 9 
5 8 
4 7 

//这个懒得写了,这样太麻烦了,复制了我当时写的
#include <iostream>
using namespace std;
void left(int* m, int* n)
{
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            *(n + (2 - j) * 2 + i) = *(m+ i * 3 + j);
        }
    }
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int m[2][3], n[3][2];
        for (int i = 0; i < 2; i++)
            for (int j = 0; j < 3; j++)
                cin >> m[i][j];
        left(*m, *n);
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 2; j++)
                cout << *(*(n + i) + j) << ' ';
            cout << endl;
        }
    }
    return 0;
}

(PS:可能会有雷同,如果需要请私信我删除,抱歉 

(PS2.0:如果存在bug与错误,请指出

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ryan-%

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值