Skip to content

Latest commit

 

History

History
146 lines (113 loc) · 4.97 KB

File metadata and controls

146 lines (113 loc) · 4.97 KB

TD0 - 复习

准备工作: 重读IF1和IF3课程,noteCpp.pdf

练习1:

1-a 编写一个(C++)用户友好的程序,要求用户输入2个整数。
程序然后显示:这2个数字的和、差、积、商、整数除法的余数。

1-b 修改这个程序,询问用户想要执行哪种运算。
计算将在函数中进行(传递2个数字和要执行的操作)。

程序执行示例:

输入第一个数字:12
输入第二个数字:2
要执行的操作?(+, -, *, /, %):*
12*2 = 24

练习2:数组和函数

2-a 编写一个程序,允许输入实数数组的内容。
程序然后显示输入的值。要输入的值的数量(元素数量)由用户提供(暂时使用静态内存分配:double tab[100];)。

2-b 创建过程AfficherTableau,允许显示数组的所有元素(数组的元素数量必须作为参数传递)。
修改程序以使用此函数。

2-c 创建函数SaisirNbElements,询问用户要输入的元素数量。在前面的程序中使用此函数。

2-d 在前面的程序中添加过程SaisirTableau

2-e 修改程序以对数组使用动态分配:要输入的元素数量将等于数组的大小。

动态分配示例:

int nb;
double *tab = NULL; // 指针声明 + 赋值
cout << "元素数量?";
cin >> nb;
tab = new double[nb]; // 分配内存空间
... // 使用数组
...
delete[] tab; // 释放内存空间

2-f 编写函数AdditionneTableaux,允许对两个相同大小的数组进行逐项求和。用2个数组(tab1 + tab2)测试此函数,然后用3个数组(目标是对三个数组进行逐项求和)。


TD1 - Tableau类

目标: 实现一个自动管理double动态数组的类。
使用: 封装(一个类)、动态分配、引用传递。
理解C++的默认机制、operator=、拷贝构造函数。
调试的作用和意义。
使用QtCreator。

准备工作: TD0和练习1

练习1:TableauDouble类建模

在这个练习中,要建模TableauDouble类,以便管理double的动态数组。

1-a 用UML建模TableauDouble类。字段将是:

  • Pt:指向double的指针
  • Taille:存储的double数量
  • Nom:数组的名称(用于显示值)

类的基本功能将是:

  • 对数组大小的读写访问(参见问题1-d)
  • 对数组每个元素的读写访问
  • 对数组名称的读写访问
  • 与另一个TableauDouble对象的标量积
  • 显示数组内容和名称
  • 用户构造函数,传递数组大小
  • 拷贝构造函数
  • 析构函数

1-b 什么关系和多重性建模TableauDouble类与其字段类之间的链接?请说明理由。

1-c TableauDouble的3个字段应使用什么可见性?

1-d 在C++中,Taille字段的写访问方法需要实现哪些步骤?

1-e 在C++中,为什么不应该使用参数值传递来传递TableauDouble类型的对象?

1-f 在C++中,为什么需要在这个类中编写析构函数?在UML类图中显示它有什么意义?

练习2:实现和测试

2-a 获取提供的源代码(框架),在QtCreator中创建项目,并为函数TableauDouble::Copie(...)添加注释。

2-b 在TableauDouble.cpp中完成函数GetTailleSetNom。使用提供的main来测试你的方法并调试。以下是main的执行示例:
(粗体:用户输入的值)

输入数组名称:Toto
输入Toto的大小:4
输入Toto的4个值:
Toto[0]= 1
Toto[1]= 2
Toto[2]= 3
Toto[3]= 4
-----
Toto[4] = [1, 2, 3, 4]

2-c 参考函数TableauDouble::Copie编写函数TableauDouble::SetTaille。通过取消注释main来测试函数。

2-d 仍然参考函数TableauDouble::Copie,创建拷贝构造函数。为什么它对TableauDouble类是必需的?

2-e 添加并实现成员函数Plus,实现两个相同大小数组的逐项求和。它的使用(在main中)将是:

TableauDouble a(10),b(10);
// 初始化数组的值
...
TableauDouble v( a.Plus(b) );
v.Affiche();

2-e' 按照相同的使用原则,添加并实现成员函数ProduitScalaire来计算两个数组的标量积。)

2-f Plus函数的使用不太方便...我们更希望使用以下行:

TableauDouble w(1);
w = a.Plus(b);
w.Affiche();

逐步执行(调试)前面的行,确定这3行代码执行了哪些方法(时间顺序)?为什么这个代码不工作?

2-g 为了解决前面的问题,我们建议重载C++的操作符=。它的作用是在内存中复制对象。C++的机制要求此操作符返回对当前对象的引用。以下是它的声明:

TableauDouble & operator=(const TableauDouble &t);

它的定义遵循推荐的operator=模型,如下所示:

TableauDouble & TableauDouble::operator=(const TableauDouble &t)
{ 
    if( this != &t )
    { 
        // 释放当前对象的指令
        // 然后重新分配为't'的大小
        // 然后逐值复制t的元素
    }
    return (*this);
}

→ 实现并测试你的operator=。