C++菜鸟学习笔记系列(5)——自定义数据结构

本文介绍了如何在C++中自定义数据结构,通过创建Sale_data类,包含图书编号、销售状态、单价和收益等属性,演示了如何定义、初始化和使用自定义类,以及如何进行数据输入和计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++菜鸟学习笔记系列(5)

本期主题:自定义数据结构

我们在前面的几篇博客中已经叙述过C++中的一些关于数据类型的知识,包括基本数据类型(整型数、浮点数、字符、布尔型等)还有复合类型(引用、指针)。

这些都属于C++内置类型,其实我们在日常的使用过程中这些已经能够基本满足我们的需要,但是在很多时候我们只靠这些内置类型非常麻烦,例如我们想要写一个关于学生管理系统的程序,那么我们来考虑一下,这个系统肯定是以学生为服务主体,一个学生基本单元包括什么元素呢?显而易见的,学号、姓名、入学日期、毕业日期等都是必不可少的,甚至还要考虑成绩、班级、宿舍房间等元素。这样我们可以发现有没有一种C++内置类型可以描述一个学生个体呢?答案是否定的。我们用整型可能只能表示学号,用浮点数可能只能表示成绩、string表示姓名、班级、宿舍等,这些类型都不能完全描述整个学生个体,但是都能分别表示学生个体的一部分元素。如果我们把每一个学生都分别按照其元素进行定义变量肯定也是可以实现的,但是这样实在是过于复杂。为了解决这种问题的出现,C++为我们提供了自定义数据结构的功能。

从基本的层面理解,数据结构就是把一组相关的数据元素组织起来。

下面我们就以书店售货系统为例,编写一个Sale_data类,简单起见我们这里只介绍了struct关键字,class关键字在后面的博客中也会进行叙述但是今天就不多介绍了。
我们初步假设Sale_data类中包含:
图书编号 : bookNo (string类型)
销售状态 : units_sold (unsinged int 类型)
单价 : price (double 类型)
收益 : revenue (double 类型)

/*
Author: wxc_1998
Date: 2018/9/25
*/

#include <iostream>
#include <string>

using namespace std;

struct Sale_data
{
	string bookNo = "";
	unsigned int unit_sold = 0;
	double price = 0.0;
	double revenue = 0.0;
};

如上述代码中所示,我们已经通过 struct 关键字定义了一个属于我们自己的数据结构类型Sale_data。
注意上面我们引入了string头文件,这是因为我们在自定义的类中包含了string类型数据。
我们可以看到上述自定义类中的成员都进行了初始化,这是C 11 新标准的一个重大改变,我们在VS 2015环境下可以进行初始化操作,但是更早的IDE作者不能保证代码是否会提示错误,我本人在VS 2010环境下提示错误。。。。
我们要记住在写完自己定义的类型之后要记得在最后一个花括号后加上 ; 这样表示声明符的结束。

定义好了我们自己的类之后还要进行使用。下面我们就用已经定义好的数据类型来定义一个Sale_data变量。

void main()
{
	Sale_data data1 , data2 , *salesptr ;
}

与内置类型变量的定义基本相同。
我们定义了data1 和data2 两个变量,那么我们怎么为其输入数据呢?

    cin >> data1.bookNo >> data1.unit_sold >> data1.price ;
	cin >> data2.bookNo >> data2.unit_sold >> data2.price ;

接着我们就可以对其进行计算收益了。

	data1.revenue = data1.unit_sold * data1.price;
	data2.revenue = data2.unit_sold * data2.price;

除此之外,我们还可以考虑一种情况,如果这两本书的编号相同,那么这就代表两本书相同,我们可以把两本书的收益相加后输出,而如果不同我们则可以分别输出。所以我们还需要对两本书的编号进行一个判断运算。

	if ( data1.bookNo == data2.bookNo )
	{
		unsigned int total_num = data1.unit_sold + data2.unit_sold;
		double total_rev = data1.revenue + data2.revenue;
		
		if (total_num != 0)
		{
			cout << "ISBN_Number   "  << "total_number   " << "total_revenue   " << endl;
			cout << data1.bookNo  << "   "  << total_num << "   "  << total_rev << endl ;
		}
	}
	else
	{
		cout << "there is two kinds books" << endl;
		cout << "ISBN_Number   "  << "price   " << "number   " << "revenue   " << endl ;
		cout << data1.bookNo  << "   "  << data1.price << "   "  << data1.unit_sold << "   " << data1.revenue<< endl ;
		cout << data2.bookNo  << "   "  << data2.price << "   "  << data2.unit_sold << "   " << data2.revenue<< endl ;
		cout << "total revenue : " << data1.revenue + data2.revenue ;
	}

	cout << endl << "press any key to continue!" << endl;
	cin.clear();
	cin.sync();
	cin.get();

从上述代码中我们可以看到当我们在使用自定义数据结构中的元素时需要通过 . 符号,来获得自定义数据变量中的具体元素。

通过上述代码的调整输出,我们下面来验证一下程序的正确性。

假设输入原始数据:
9073-3-221-056 2 100回车
9073-3-221-056 2 100回车
输出结果:
相同图书结果

假设输入原始数据:
9073-3-221-056 2 100回车
9072-2-222-055 1 200回车
输出结果:
不同图书结果
好了这次我们就写到这里了。

注:虽然这篇博客的内容十分简单,但是大家若有转载还请标明出处!

还有大家若对博客中的内容有任何问题可以随时联系我提问。

内含资源如下: 1.基本数据结构 1.1.Array ........... 动态数组 1.2.LinkedList ... 链表 1.3.BST .............. 二分搜索树 1.4.MapBST ..... 二分搜索树(用于实现映射) 1.5.AVLTree ...... AVL树 2.接口 2.1.Queue ........... 队列接口 2.2.Stack .............. 栈接口 2.3.Set .................. 集合接口 2.4.Map ............... 映射接口 2.5.Merger .......... 自定义函数接口 2.6.UnionFind ..... 并查集接口 3.高级数据结构 3.1.ArrayQueue .......................... 队列_基于动态数组实现 3.2.LinkedListQueue .................. 队列__基于链表实现 3.3.LoopQueue ........................... 循环队列_基于动态数组实现 3.4.PriorityQueue ....................... 优先队列_基于最大二叉堆实现 3.5.ArrayPriorityQueue ............. 优先队列_基于动态数组实现 3.6.LinkedListPriorityQueue ..... 优先队列_基于链表实现 3.7.ArrayStack ............................. 栈_基于动态数组实现 3.8.LinkedListStack ..................... 栈_基于链表实现 3.9.BSTSet ..................................... 集合_基于二分搜索树实现 3.10.LinkedListSet ....................... 集合_基于链表实现 3.11.BSTMap ................................ 映射_基于二分搜索树实现 3.12.AVLTreeMap ....................... 映射_ 基于AVL树实现 3.13.LinkedListMap .................... 映射_基于链表实现 3.14.MaxHeap ............................. 最大二叉堆 3.15.SegmentTree ...................... 线段树 3.16.Trie ......................................... 字典树 3.17.QuickFind ............................ 并查集_基于数组实现 3.18.QuickUnion ......................... 并查集_基于树思想实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晓晨的博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值