C++ 基础练习题四(引用+结构)

1.三数论大小(使用引用)

题目描述:

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

要求:定义一个函数,无返回值,函数参数是三个整数参数的引用,例如int &a, int &b, int &c。在函数内对三个参数进行排序。主函数调用这个函数进行排序。

要求:不能直接对三个整数进行排序,必须通过函数而且是引用的方法。

要求:输出必须在主函数进行。

输入:

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

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

输入t行

输出:

每行按照从大到小的顺序输出每个实例,三个整数之间用单个空格隔开

输入样例:

3
2 4 6
88 99 77
111 333 222

输出样例:

6 4 2
99 88 77
333 222 111

结果代码:

#include <iostream>
using namespace std;
void swap(int& x, int& y);
int main()
{
    int t, i, a, b, c;
    cin >> t;
    for (i = 0; i < t; i++)
    {
        cin >> a >> b >> c;
        if (a < b)
            swap(a, b);
        if (a < c)
            swap(a, c);
        if (b < c)
            swap(b, c);
        cout << a << " " << b << " " << c << endl;
    }
    return 0;
}
void swap(int& x, int& y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}

2.求最大值最小值(使用引用)

题目描述:

编写函数void find(int *num,int n,int &minIndex,int &maxIndex),求数组num(元素为num[0],num[1],...,num[n-1])中取最小值、最大值的元素下标minIndex,maxIndex(若有相同最值,取第一个出现的下标。)

输入n,动态分配n个整数空间,输入n个整数,调用该函数求数组的最小值、最大值下标。

改变函数find功能不计分。

要求:在main函数中按样例格式输出结果,不能直接在find函数中输出。

输入:

测试次数

每组测试数据一行:数据个数n,后跟n个整数

输出:

每组测试数据输出两行,分别是最小值、最大值及其下标。具体格式见样例。多组测试数据之间以空行分隔。

输入案例:

2
5 10 20 40 -100 40
10 23 12 -32 4 6 230 100 90 -120 15

输出案例:

min=-100 minindex=3
max=40 maxindex=2

min=-120 minindex=8
max=230 maxindex=5

结果代码:

#include <iostream>
using namespace std;

void find(int* num, int n, int& minIndex, int& maxIndex);
int main()
{
    int k, t, n,i;
    cin >> t;
    for (k = 0; k < t; k++)
    {
        cin >> n;
        int* p = new int[n];
        for (i = 0; i < n; i++)
            cin >> p[i];
        int max = 0;
        int min = 0;
        find(p, n, min, max);
        cout << "min=" << p[min] << " " << "minindex=" << min << endl;
        cout << "max=" << p[max] << " " << "maxindex=" << max << endl;
        delete[] p;
    }
    return 0;
}
void find(int* num, int n, int& minIndex, int& maxIndex)
{
    int i;
    for (i = 0; i < n; i++)
    {
        if (num[minIndex] > num[i])
        {
            num[minIndex] = num[i];
            minIndex = i;
        }
        if (num[maxIndex] < num[i])
        {
            num[maxIndex] = num[i];
            maxIndex = i;
        }
    }
}

3.职工信息(使用结构体)

题目描述:

编写程序,定义一个职工信息结构包括职工姓名、工作年限、工资总额。定义一个存放职工信息的结构数组

程序实现初始化5名职工的信息,并对工作年限大于等于30年的职工每人加100元工资,分别输出工资变化之前和之后的所有职工的信息。

输入:

输入5个员工的职工姓名、工作年限、工资总额,姓名的最大长度不超过20

输出:

输出两部分,第一部分输出工资变化之前所有职工的信息,第二部分输出工资变化之后的所有职工的信息

输入案例:

zhang1 5 1000
zhang2 10 2000
zhang3 20 3000
zhang4 40 4000
zhang5 50 5000

输出案例:

原始工资
姓名 年限 工资
zhang1 5 1000
zhang2 10 2000
zhang3 20 3000
zhang4 40 4000
zhang5 50 5000
加薪后工资
姓名 年限 工资
zhang1 5 1000
zhang2 10 2000
zhang3 20 3000
zhang4 40 4100
zhang5 50 5100

结果代码:

#include <iostream>
using namespace std;

struct message
{
    char name[20];
    int year;
    int money;
};
int main()
{
    int k, i;
    message person[5];
    for (i = 0; i < 5; i++)
    {
        cin >> person[i].name >> person[i].year >> person[i].money;
    }
    cout << "原始工资" << endl;
    cout << "姓名" << " " << "年限" << " " << "工资" << endl;
    for (i = 0; i < 5; i++)
    {
        cout << person[i].name << " " << person[i].year << " " << person[i].money << endl;
    }
    cout << "加薪后工资" << endl;
    for (i = 0; i < 5; i++)
    {
        if (person[i].year >= 30)
            person[i].money += 100;
        cout << person[i].name << " " << person[i].year << " " << person[i].money << endl;
    }
    return 0;
}

4.谁是老二(使用结构体)

题目描述:

定义一个结构体,包含年月日,表示一个学生的出生日期。然后在一群学生的出生日期中找出谁的出生日期排行第二

要求:出生日期的存储必须使用结构体,不能使用其他类型的数据结构。

要求程序全过程对出生日期的输入、访问、输出都必须使用结构。

输入:

第一行输入t表示有t个出生日期

每行输入三个整数,分别表示年、月、日

依次输入t个实例

输出:

输出排行第二老的出生日期,按照年-月-日的格式输出

输入案例:

6
1980 5 6
1981 8 3
1980 3 19
1980 5 3
1983 9 12
1981 11 23

输出案例:

1980-5-3

结果代码:

#include <iostream>
using namespace std;

struct birth {
    int year;
    int month;
    int day;
};
int main()
{
    int k, t, i, j;
    cin >> t;
    struct birth* p = new struct birth[t];
    //输入日期
    for (k = 0; k < t; k++)
    {
        cin >> (p+k)->year >> (p + k)->month >> (p + k)->day;
    }
    //排序年份
    int temp;
    for (i = 1; i < t; i++)
    {
        for (j = 0; j < t - i; j++)
        {
            if ((p + j)->year > (p + j + 1)->year)
            {
                temp = (p + j)->year;
                (p + j)->year = (p + j + 1)->year;
                (p + j + 1)->year = temp;
            }
        }
    }
    //在相同年份中排序月份
    int m=0;
    for (k = 0; k < t; k++)
    {
        if ((p + k)->year == (p + k + 1)->year)
            m++;
        int mon;
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < m - i; j++)
            {
                if ((p + j)->month > (p + j + 1)->month)
                {
                    mon = (p + j)->month;
                    (p + j)->month = (p + j + 1)->month;
                    (p + j + 1)->month = mon;
                }
            }
        }
    }
    //在相同年份,相同月份中排天数
    int d;
    for (k = 0; k < t; k++)
    {
        if (((p + k)->year == (p + k + 1)->year) && ((p + k)->month == (p + k + 1)->month))
        {
            if ((p + k)->day > (p + k + 1)->day)
            {
                d = (p + k)->day;
                (p + k)->day = (p + k + 1)->day;
                (p + k + 1)->day = d;
            }
        }
    }
    cout << "-----------------" << endl;
    //输出日期
    for (k = 0; k < t; k++)
        cout << (p + k)->year << "-" << (p + k)->month << "-" << (p + k)->day << endl;
    cout << "---------------" << endl;
    cout << (p +1)->year << "-" << (p + 1)->month << "-" << (p + 1)->day << endl;
    return 0;
}

以上是结构体相关习题,下一章节是关于指针的习题练习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值