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

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

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回车

输出结果:

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

假设输入原始数据:

9073-3-221-056 2 100回车

9072-2-222-055 1 200回车

输出结果:

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

好了这次我们就写到这里了。

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

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

目录
相关文章
|
1月前
|
C语言 C++
C/C++ 自定义头文件,及头文件结构详解
还是从"stdio.h"说起,这是C语言中内置的标准库,也就是说,头文件很多时候其实就是一个“库”,类似于代码的仓库,也就是说将某些具有特定功能的常量、宏、函数等归为一个大类,然后放进这个“仓库”,就像stdio.h就是一个标准输入/输出的头文件
32 1
|
2月前
|
存储 算法 数据库
【C++ 软件设计思路】学习C++中如何生成唯一标识符:从UUID到自定义规则
【C++ 软件设计思路】学习C++中如何生成唯一标识符:从UUID到自定义规则
122 0
|
4天前
|
算法 Go 数据库
数据结构/C++:位图 & 布隆过滤器
数据结构/C++:位图 & 布隆过滤器
11 0
|
4天前
|
存储 算法 C++
数据结构/C++:哈希表
数据结构/C++:哈希表
8 2
|
4天前
|
存储 算法 Java
数据结构/C++:红黑树
数据结构/C++:红黑树
12 3
|
4天前
|
存储 算法 C++
数据结构/C++:AVL树
数据结构/C++:AVL树
8 2
|
4天前
|
存储 C语言 C++
数据结构/C++:二叉搜索树
数据结构/C++:二叉搜索树
11 1
|
6天前
|
SQL 缓存 安全
【C++入门到精通】异常 | 异常的使用 | 自定义异常体系 [ C++入门 ]
【C++入门到精通】异常 | 异常的使用 | 自定义异常体系 [ C++入门 ]
11 2
|
6天前
|
存储 数据库 C++
高效处理大规模数据集的概率型数据结构—— 布隆过滤器 [C++入门]
高效处理大规模数据集的概率型数据结构—— 布隆过滤器 [C++入门]
13 0
|
18天前
|
C++
C++虚函数学习笔记
C++虚函数学习笔记
16 0