数组结构第一周做题总结_基础练习

news2024/9/19 10:34:56
  1. 错误的原因是写了无参构造函数但是没有实现

id:8 A. 月份查询(指针数组)

题目描述

已知每个月份的英文单词如下,要求创建一个指针数组,数组中的每个指针指向一个月份的英文字符串,要求根据输入的月份数字输出相应的英文单词
1月 January
2月 February
3月 March
4月 April
5月 May
6月 June
7月 July
8月 Aguest
9月 September
10月 October
11月 November
12月 December

输入

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

接着每行输入一个月份的数字

依次输入t行

输出

每行输出相应的月份的字符串,若没有这个月份的单词,输出error

输入样例

3
5
11
15

输出样例

May
November
error

题解

  • 创建一个指针数组的方法是用char *mon[12] = {"January", "February", "March", "April", "May", "June", "July", "Aguest", "September", "October", "November", "December"};
  • 为什么字符类型的指针数组可以存储几个字符串,这是因为一个指针可以指向一个字符串,实际上它指向的是这个字符串的第一个字符的地址,即字符串的首地址,因此可以代表整个字符串,从而能存储整个字符串
  • 为什么写char* mon[12] = { "January", "February", "March", "April", "May", "June", "July", "Aguest", "September", "October", "November", "December" };,系统报错,而const char* mon[12] = { "January", "February", "March", "April", "May", "June", "July", "Aguest", "September", "October", "November", "December" };就能正确,这是因为在C++中,字符串字面量(例如 "January")是常量字符数组(const char[]),它们的类型是 const char*。当你使用 char* 来声明数组时,编译器会报错,因为你试图将 const char* 类型的字符串字面量赋值给 char* 类型的指针,这会违反常量性。
    使用 const char* 来声明数组是正确的做法,因为它表示数组中的每个元素都是指向常量字符的指针,这与字符串字面量的类型相匹配。

代码实现

#include <iostream>
using namespace std;

int main()
{
    int i, t, x;
    const char* mon[12] = { "January", "February", "March", "April", "May", "June", "July", "Aguest", "September", "October", "November", "December" };
    cin >> t;

    for (i = 0; i < t; i++)
    {
        cin >> x;
        if (x > 12 || x < 1)
        {
            cout << "error" << endl;
        }
        else
        {
            cout << mon[x - 1] << endl;
        }
    }

    return 0;
}

id:9 B. 成绩查询(指针运算)

题目描述

已知一组学生成绩,然后根据输入的序号查询成绩

要求:

  1. 使用一个整数数组存储学生成绩

  2. 使用一个指针指向数组中间元素

  3. 使用++和–运算符,求出数组中间元素的前一个成绩和后一个成绩

  4. 输入一个序号,然后计算这个序号的元素和中间元素的距离,然后使用指针去访问

例如有11个学生,指针指向中间的学生也就是第6个学生,若输入序号3,即查询第3个学生的成绩,第3和第6之间距离为3,那么指针应该怎么运算呢???

  1. 整个程序除了输入时可以使用数组下标,其他部分都不能使用,都必须使用指针进行访问,且只能定义一个指针变量。

输入

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

第二行先输入n,表示有n个学生,然后再输入n个成绩(正整数)

第三行输入1个序号,表示要查询成绩的学生的序号。

依次输入t个实例

按自然意义,序号是从1开始计算

提示:在数组中是从…

输出

对于每个测试实例:

第一行输出数组中间元素的前一个成绩和后一个成绩(若为偶数,取中间右边的数为中间数)

第二行根据序号输出1个成绩

输入样例

2
7 66 99 88 44 77 33 11
2
11 60 80 50 20 90 35 70 40 10 95 30
9

输出样例

88 77
99
90 70
10

题解

  • 首先把数据输入进数组中
  • 然后找到数组的中间数,让这个指针指向这个中间数
  • 指针减一,指向前一位,并输出
  • 指针加二,指向中间位的后一位
  • 然后指针减一,指回中间数
  • 输入需要输出的序号的数,这个指针加上这个序号减去中间数就能把指针指向这个序号的数,再输出

代码实现

#include <iostream>
using namespace std;

int main()
{
	int i, t, n, j, x[50], num, * p, m;
	cin >> t; // 测试样例

	for (i = 0; i < t; i++)
	{
		cin >> n;
		for (j = 1; j <= n; j++)
		{
			cin >> x[j]; // 成绩
		}
		cin >> num; // 序号
		m = n / 2; // 中间数
		if (m == 0)
		{
			p = &x[m];
		}
		else
		{
			m++;
			p = &x[m];
		}
		p--;
		cout << *p << " ";
		p += 2;
		cout << *p << endl;
		p--;
		p += (num - m);
		cout << *p << endl;
	}

    return 0;
}

id:15 C. 矩阵左转

题目描述

输入一个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个实例

输出

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

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

输入样例

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

输出样例

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

题解

  • 题目的提示是关键,找到输出的数字顺序与输出的数字的位置与首数字的距离关系即可
  • 将数据输入进数组后,将指针指向数组的第一个元素
  • 指针定义回顾,首先定义一个数组,输入值后,再定义一个指针,假设都是整数类型,此时需要给指针进行定义,假设我们是int *p;,此时的指针是需要指向一个整数,假设一个一维数组a,单单一个a表示的是指向数组的第一个元素,即指向一个整数,所以等同于一个整数类型的指针,所以指针可以指向a,因为类型相同,但是&a是指向整个数组的指针,所以指针p不能指向&a,因为类型不匹配,而&a[0]就更好理解,a[0]是数组的第一个元素,所以我们可以使用&a[0]来获取这个指针;再假设一个二维数组b,同理我们也要找到能指向二维数组第一个元素的有关b的指针,先但看一个b,由于数组是一个二维数组,所以单单一个b是一个指向包含 3 个int元素的数组的指针,所以类型不匹配,而&a是一个指向整个数组的指针,所以类型也不匹配,所以我们需要找到数组的第一个元素b[0][0],然后&b[0][0]即可获取这个指针
  • 经过观察我们可以发现,矩阵左转后首先遍历原数组的行,在遍历数组的列,及两重循环,内层循环遍历行,外层循环遍历列,行从0开始遍历,每次加一,列从2开始遍历,每次减一
  • 注意公式的列是3,所以公式是*3,因为p是指向数组的第一个元素,所以p加上要输出距离的值即可指向要输出的元素,直接输出,不用改变p指针

代码实现

#include <iostream>
using namespace std;

int main()
{
    int i, t, a[2][3], j, k;
    cin >> t;

    for (i = 0; i < t; i++)
    {
        for (j = 0; j < 2; j++)
        {
            for (k = 0; k < 3; k++)
            {
                cin >> a[j][k];
            }
        }
        int* p = &a[0][0];

        // 先列后行
        for (k = 2; k >= 0; k--)
        {
            for (j = 0; j < 2; j++)
            {
                cout << *(p + j * 3 + k) << " ";
            }
            cout << endl;
        }
    }


    return 0;
}

id:10 D. Date(类与对象)

题目描述

下面是一个日期类的定义,请在类外实现其所有的方法,并在主函数中生成对象测试之。
在这里插入图片描述
注意,在判断明天日期时,要加入跨月、跨年、闰年的判断

例如9.月30日的明天是10月1日,12月31日的明天是第二年的1月1日

2月28日的明天要区分是否闰年,闰年则是2月29日,非闰年则是3月1日

输入

测试数据的组数t

第一组测试数据的年 月 日

要求第一个日期的年月日初始化采用构造函数,第二个日期的年月日初始化采用setDate方法,第三个日期又采用构造函数,第四个日期又采用setDate方法,以此类推。

输出

输出今天的日期

输出明天的日期

输入样例

4
2012 1 3
2012 2 28
2012 3 31
2012 4 30

输出样例

Today is 2012/01/03
Tomorrow is 2012/01/04
Today is 2012/02/28
Tomorrow is 2012/02/29
Today is 2012/03/31
Tomorrow is 2012/04/01
Today is 2012/04/30
Tomorrow is 2012/05/01

题解

  • 在类中实现一个方法是在当前日期上加一天,首先是定义一个月份天数的数组,存储一般情况下的天数,判断是否是闰年,决定二月份的天数,在判断是否为月末或者年末,执行相应的操作
  • 在主函数中,创建一个类的对象,然后调用类的函数输出即可

代码实现

#include <iostream>
#include <iomanip>
using namespace std;

class Date
{
private:
    int year, month, day;
public:
    Date();
    Date(int y, int m, int d);
    int getY();
    int getM();
    int getD();
    void setDate(int y, int m, int d);
    void print();
    void addoneDay(); // 在当前日期上加一天
};

Date::Date(int y, int m, int d)
{
    year = y;
    month = m;
    day = d;
}

void Date::print()
{
    cout << "is " << year << "/" << setfill('0') << setw(2) << month << "/" << setfill('0') << setw(2) << day << endl;
}

void Date::addoneDay()
{
    int da[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) // 是闰年
    {
        da[1]++;
    }
    if (day == da[month - 1]) // 月末
    {
        day = 1;
        if (month == 12)
        {
            month = 1;
            year++;
        }
        else
        {
            month++;
        }
    }
    else
    {
        day++;
    }
}

int main()
{
    int i, t, y, m, d;
    cin >> t;

    for (i = 0; i < t; i++)
    {
        cin >> y >> m >> d;
        Date d1(y, m, d);
        cout << "Today ";
        d1.print();

        d1.addoneDay();
        cout << "Tomorrow ";
        d1.print();
    }

    return 0;
}

id:12 E. Point_Array

题目描述

在这里插入图片描述
上面是我们曾经练习过的一个习题,请在原来代码的基础上作以下修改:1、增加自写的拷贝构造函数;2、增加自写的析构函数;3、将getDisTo方法的参数修改为getDisTo(const Point &p);4、根据下面输出的内容修改相应的构造函数。

然后在主函数中根据用户输入的数目建立Point数组,求出数组内距离最大的两个点之间的距离值。

输入

测试数据的组数 t

第一组点的个数

第一个点的 x 坐标 y坐标

第二个点的 x坐标 y坐标

输入

输出第一组距离最大的两个点以及其距离

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

#include <iostream>

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

using namespace std;

void main( )

{ double a =3.141596;

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

输入样例

2
4
0 0
5 0
5 5
2 10
3
-1 -8
0 9
5 0

输出样例

Constructor.
Constructor.
Constructor.
Constructor.
The longeset distance is 10.44,between p[1] and p[3].
Distructor.
Distructor.
Distructor.
Distructor.
Constructor.
Constructor.
Constructor.
The longeset distance is 17.03,between p[0] and p[1].
Distructor.
Distructor.
Distructor.

题解

  • 在主函数中输入点的个数后就可以new出一个类的类型数组,然后用set方法将点的坐标输入到数组中,遍历用冒泡法找到最大值
  • 注意,用new的方法的出一个数组时,调用的是无参构造函数

代码实现

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

class Point
{
private:
    double x, y;
public:
    Point();
    Point(double x_value, double y_value);
    Point(const Point& p1); // 拷贝构造函数
    ~Point();             // 析构函数
    double getX();
    double getY();
    void setXY(double x1, double y1) { x = x1, y = y1; }
    void setX(double x_value);
    void setY(double y_value);
    double getDisTo(const Point& p); // 计算当前点到参数点p的距离
};

Point::Point()
{
    x = 0;
    y = 0;
    cout << "Constructor." << endl;
}

Point::Point(double x_value, double y_value)
{
    x = x_value;
    y = y_value;
    cout << "Constructor." << endl;
}

Point::Point(const Point& p1)
{
    x = p1.x;
    y = p1.y;
}

Point::~Point()
{
    cout << "Distructor." << endl;
}

double Point::getDisTo(const Point& p)
{
    double dis;
    dis = sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
    return dis;
}

int main()
{
    int i, t, n, j, k, a, b;
    double x1, y1, ans, dis;
    cin >> t;

    for (i = 0; i < t; i++)
    {
        ans = 0; // 最大值
        cin >> n; // 点的个数
        Point *P = new Point[n]; // new一个数组
        // 将点数据输入到数组中
        for (j = 0; j < n; j++)
        {
            cin >> x1 >> y1;
            P[j].setXY(x1, y1); // 用set方法,不是重新构造
        }
        // 遍历数组冒泡找到最大值
        for (j = 0; j < n; j++)
        {
            for (k = j + 1; k < n; k++)
            {
                dis = P[j].getDisTo(P[k]);
                // 找到较大值
                if (ans < dis)
                {
                    ans = dis;
                    a = j; // 第几个点
                    b = k;
                }
            }
        }
        cout << "The longeset distance is " << fixed << setprecision(2) << ans;
        cout << ",between p[" << a << "] and p[" << b << "]." << endl;
        delete[] P;
    }

    return 0;
}

id:14 F. 动态数组

题目描述

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

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

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

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

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

提示:使用new关键字

输入

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

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

第三行输入n个数据

依次输入t个实例

输出

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

输入样例

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

输出样例

E
55
1.9

题解

  • 通过输入的类型创建不同的数组,通过指针存储元素

代码实现

#include <iostream>
#include <climits>
using namespace std;

int main()
{
    int i, t, n, j, sum, ave;
    char type, max;
    double min;
    cin >> t;
    sum = 0;
    max = 'A';
    min = INT_MAX;

    for (i = 0; i < t; i++)
    {
        cin >> type >> n; // 数组长度
        // 整数
        if (type == 'I')
        {
            int* p = new int[n];
            for (j = 0; j < n; j++)
            {
                cin >> *(p + j);
                sum += *(p + j);
            }
            ave = sum / j;
            cout << ave << endl;
        }
        else if (type == 'C')
        {
            char* p = new char[n];
            for (j = 0; j < n; j++)
            {
                cin >> *(p + j);
                if (*(p + j) > max)
                {
                    max = *(p + j);
                }
            }
            cout << max << endl;
        }
        // 浮点数
        else
        {
            double* p = new double[n];
            for (j = 0; j < n; j++)
            {
                cin >> *(p + j);
                if (min > *(p + j))
                {
                    min = *(p + j);
                }
            }
            cout << min << endl;
        }
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

盘点java8 stream中隐藏的函数式接口

shigen坚持更新文章的博客写手&#xff0c;记录成长&#xff0c;分享认知&#xff0c;留住感动。个人IP&#xff1a;shigen 提到函数式接口&#xff0c;最常见的就是lambda表达式&#xff0c;IDEA也有智能的提示&#xff1a; 最后改成这样的就是最简洁的、IDEA希望的风格&#…

机器学习:基于机器学习的中文评论情感分析

通过机器学习技术对中文评论进行情感分析。我们使用了jieba进行中文分词&#xff0c;移除了停用词&#xff0c;并利用词袋模型&#xff08;Bag of Words&#xff09;和多项式朴素贝叶斯分类器对评论进行了情感分类。实验结果表明&#xff0c;该模型在测试集上达到了较高的准确率…

如何构建高效的中药材进存销管理系统?——运用Java SpringBoot和Vue实现库存实时监控,简化销售流程,提升药材管理效率。

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

前端宝典二十一:前端异步编程规范手写Promise、async、await

本文主要探讨前端异步编程的处理方式、处理场景&#xff0c;并且手写Promise的全家桶&#xff0c;介绍async、await方法使用 一、异步处理方式有&#xff1a; 1. 回调函数 function fetchDate(callback) {setTimeout(() > {const date new Date();callback(date);}, 100…

SpringSecurity Oauth2 - 密码模式完成身份认证获取令牌 [自定义UserDetailsService]

文章目录 1. 授权服务器2. 授权类型1. Password (密码模式)2. Refresh Token&#xff08;刷新令牌&#xff09;3. Client Credentials&#xff08;客户端凭证模式&#xff09; 3. AuthorizationServerConfigurerAdapter4. 自定义 TokenStore 管理令牌1. TokenStore 的作用2. Cu…

嵌入式Linux C应用编程指南-高级I/O(速记版)

第十三章 高级I/O 13.1 非阻塞I/O 阻塞其实就是进入了休眠状态&#xff0c;交出了 CPU 控制权。比如 wait()、pause()、sleep()等函数都会进入阻塞。 阻塞式 I/O 顾名思义就是对文件的 I/O 操作&#xff08;读写操作&#xff09;是阻塞式的&#xff0c;非阻塞式 I/O 同理就是对…

SpringSecurity Oauth2 - 访问令牌续期

文章目录 1. 访问令牌的续期2. CustomUserDetailsService3. 配置 AuthorizationServerEndpointsConfigurer4. 测试项目 1. 访问令牌的续期 在Spring Security OAuth2中&#xff0c;访问令牌的续期通常是通过使用**刷新令牌&#xff08;Refresh Token&#xff09;**来实现的。当…

走进酒厂,探寻白酒酿造的奥秘

在华夏大地深处&#xff0c;隐藏着一座座充满神秘色彩的酒厂&#xff0c;它们是白酒酿造的地方&#xff0c;也是中华酒文化的摇篮。今天&#xff0c;就让我们一起走进这些酒厂&#xff0c;探寻白酒酿造的奥秘&#xff0c;感受豪迈白酒&#xff08;HOMANLISM&#xff09;的不同魅…

当网络适配器的Wireless出现感叹号

1.出现如下情况 链接&#xff1a; &#xff1a;一招搞定Intel(R) Wireless-AC 9560显示感叹号&#xff0c;无法打开wifi模块&#xff01;_intel(r)wireless-ac9560感叹号-CSDN博客z 重点&#xff1a; 原因是因为电脑静电的问题。

昇腾AI处理器的计算核心 - AI Core即DaVinci Core

昇腾AI处理器的计算核心 - AI Core即DaVinci Core flyfish 从一段代码的解释开始 template <typename T> class GlobalTensor { public:void setGlobalBuffer(T* buffer, uint32_t buffersize) {// 在这里实现设置全局缓冲区的逻辑} };语法的说明&#xff0c;主要用于…

封装_私有类字段和方法

前言 在 JavaScript 中&#xff0c;封装、私有类字段和方法是面向对象编程的一种重要特性。它们允许你将数据&#xff08;属性&#xff09;和对数据的操作&#xff08;方法&#xff09;组合在一起&#xff0c;并控制访问权限&#xff0c;从而提高代码的安全性和可维护性。私有…

异步编程详解

1.什么是async std::async:是一个函数模板,用于启动一个异步任务。它接受一个可调用的对象(如函数、Lambda表达式、函数对象)作为参数,并在一个单独的线程上异步执行对象。std::async自动管理异步任务的生命周期,并返回一个std::future对象,该对象用于获取异步操作的结果。 2.什…

【Java】—— Java面向对象进阶:继承小练习-Java中实现圆柱体类及其体积计算

目录 1. 定义圆类&#xff08;Circle&#xff09; 2. 定义圆柱体类&#xff08;Cylinder&#xff09; 3. 测试圆柱体类 4. 总结 在Java中&#xff0c;我们可以通过面向对象的方式来模拟现实世界中的物体&#xff0c;比如圆柱体。本篇文章将通过一个简单的示例来展示如何定义…

全国大学生数学建模竞赛系统使用手册

注意&#xff01;国赛是学校统一报名&#xff0c;所以如果在操作上有任何不清楚的地方&#xff0c;一定要在赛前即使询问自己学校组织数模的老师&#xff01;并详细阅读本文和官网通知&#xff0c;以及&#xff1a;数模国赛提交MD5码和论文的坑&#xff01; 数模比赛的建模手、…

【Python报错已解决】“ModuleNotFoundError: No module named ‘timm‘”

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述1.1 报错示例&#xff1a;当我们尝试导入timm库时&#xff0c;可能会看到以下错误信息。…

颠覆传统:基于全文索引驱动下的高效一对多表结构设计!

首发公众号&#xff1a;赵侠客 引言 在数据库表结构设计中&#xff0c;一对多&#xff08;1:N&#xff09;关系的处理是非常常见需求&#xff0c;如一个用户有多个分类或角色。传统关系型数据库表设计方式通常要包括三张表&#xff1a;用户表、分类表、以及用户与分类之间的关…

LC开源电路的学习(一)

TI的升压芯片&#xff0c;电压虽然能升高&#xff0c;但是带来的问题就是最大电流大幅降低&#xff1a; CC1和CC2芯片接快充芯片之后&#xff0c;直接接到单片机的下载口&#xff1a; 这个有点意思&#xff0c;用导线换电阻&#xff1a; 、 PD快充芯片CH224K需要连接typeC的D…

华为云征文|基于Flexus云服务器X实例的应用场景-部署脚手架开源项目若依

&#x1f534;大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 先看这里 写在前面**Flexus X实例**的云服务器简介环境准备若依项目拉取导入数据库启动本地项目&#xff08;后端&#xff09;启动本地项目&#xff08;前端&#xff09;打包后…

图片转为PDF怎么弄?看这里,三款软件助你一键转换!

嘿&#xff0c;朋友们&#xff01;现在信息这么多&#xff0c;图片在我们学习、工作、生活中帮了大忙。但有时候&#xff0c;我们想把图片整理好、分享给别人或者打印出来&#xff0c;PDF格式就特别合适。PDF文件不管在哪儿打开&#xff0c;内容都不会变样&#xff0c;还能加密…

Pandas 9-绘制柱状图

1. 准备数据 首先&#xff0c;需要准备一个DataFrame。 import pandas as pd # 创建一个DataFrame data { Name: [Alice, Bob, Charlie, David], Age: [24, 27, 22, 32], City: [New York, Los Angeles, Chicago, Houston], Score: [85, 92, 78, 88]} df pd.…