例子问题
问题21:面向对象程序设计
考虑下面的代码:
私有静态类哲人{
私有字符串名称;
私有字符串favoritessubject;
公共哲学家(字符串n,字符串f) {
Name = n;
favoritessubject = f;
}
公共字符串getName() {
返回名称;
}
getfavoritessubject () {
返回favoriteSubject;
}
Public void speak() {
system . out。println(“Hello, World !我的名字是“+name +”。我最喜欢的科目是“+ favoritessubject”;
}
}
私有静态类Nominalist扩展哲学家{
布尔方济会的;
public Nominalist(String n,boolean frank) {
超级(n,“逻辑”);
方济各=坦率;
}
Public void speak() {
super.speak ();
如果(方济会修士){
system . out。println(“我是方济会教徒”);
} else {
system . out。println(“我不是方济各会教徒”);
}
}
公共字符串谁的ighthavetaughtme () {
如果(方济会修士){
回复“也许是奥卡姆的威廉?....”;
} else {
“也许是圣波拉达兰的杜兰杜斯——一个丑八怪,一个多明尼加的唯名论者!”
}
}
}
如果你想做一个toString ()两种方法哲学家和唯名论的,使用与每个类的电流相同的输出说话()方法,组织代码的最佳方式是什么?
我有toString()调用两个类。说()方法。
2有说()方法调用newtoString()方法。
3创建一个新的子类并编写toString ()方法。
我
3
2
I和III
2
的toString ()方法必须返回字符串值。因此,让这个方法生成当前生成的输出是最有意义的说()。那么,你可以说()调用toString ()方法输出相同的字符串数据。
问题1:使用功能分解
给定一个类Thing和代码:
一件事,二件事;
下面的函数调用等价于什么?
thingTwo = thingOne;
运算符= (thingTwo thingOne);
thingOne使用了thingTwo的复制构造函数
stream& Thing::operator=(const Thing& rhs);
thingTwo。operator = (thingOne);
以上皆非
thingTwo。operator = (thingOne);
给我们的是,thingOne和thingTwo已经被创建了,这是一个至关重要的信息。我们来看看每个选项
运算符= (thingTwo thingOne);
这行代码毫无意义,而且在语法上是错误的。
stream& Thing::operator=(const Thing& rhs);
这行代码表示从“Thing”类访问“operator=”方法并将其放入ostream,这与将thingOne赋值给thingTwo无关。
当我们遇到选择复制构造函数的问题时,我们必须记住,只有当对象使用to创建另一个对象时才使用复制构造函数,例如我们有一个名为Foo的给定类:
Foo Foo;
Foo foobar = Foo;
在本例中,我们使用foo来创建foobar。
唯一有效的选择是:
thingTwo.operator = (thingOne);
这行代码意味着thingOne对象被分配给了thingTwo。
问题1:识别类层次结构
考虑一下以下流行编程语言的历史:
PHP
Java
objective - c
Python
下面哪一种是所有这些语言共同的最接近的祖先?
Smalltalk
艾达
鲁比(人名)
C
口齿不清
C
所有这些语言都是基于c语言的。
- Ruby是在1995年发明的,和PHP同年,所以它不可能影响像Objective-C和Python这样的早期语言。
- Lisp确实影响了至少一种语言,Python,但它没有影响任何其他语言。
- Ada直接影响了Java,因为它影响了C语言,所以可以认为它是这些其他语言的祖先;然而,正因为如此,艾达并不是最近的祖先。
- Smalltalk影响了Objective-C,但在这个列表中没有其他语言。
一个线索是答案“目标——”C,它是C的严格超集,增加了面向对象功能。
问题1:识别类层次结构
运行以下代码后,字符串kitchen的值是什么?
- 班回家
- {
- 公众:
- 回家(字符串);
- 空白searchhome ();
- int buyhome ();
- 私人:
- 字符串厨房();
- };
- ::家庭(字符串)
- {
- 厨房= c;
- }
- int main ()
- {
- str =“大”;
- 回家(str);
- }
c
“小”
“大”
str
无效
“大”
类定义第4行中的构造函数是棘手的地方。在构造函数的初始化中,我们注意到输入是一个字符串。
往下看第10行,在定义构造函数的地方,我们看到一个输入为c的构造函数,它被定义为一个字符串,将把kitchen的值设置为c。
最后,回到main代码,我们看到main中构造函数的值是'big',定义在str中。
所以厨房=‘大’。
问题1:选择合适的数据结构
将函数声明为void和将其声明为int有什么区别?
没有区别。
int函数需要在函数内部声明一个整型变量,而void函数则不需要。
void声明不期望输出到该函数,而int函数声明期望输出一个整型值。
void函数没有输入,而int函数至少有一个整数输入。
void函数可以有任何返回类型,而int函数只能有一种返回类型。
void声明不期望输出到该函数,而int函数声明期望输出一个整型值。
函数声明非常重要,因为必须定义函数的返回类型。void函数不需要返回类型,而int函数必须以整数值作为其返回类型。
问题1:选择合适的数据结构
下面的代码有什么问题?
空白printsometext ()
{
cout < <“印刷文本\ n”;
(int i = 0; < 3;我=我+ 1)
{
我cout < < < <“\ n”
}
返回2;
}
void函数不能返回输出。
Cout不能输出数字。
在函数声明之后需要分号。
循环格式不正确。
字符\n不存在。
void函数不能返回输出。
在创建函数时选择返回类型是非常重要的。如果你希望你的函数返回一个整数,你可以在你的函数前加上"int"来表示这个函数期望一个整数输出。在这种情况下,函数被声明为void,这意味着没有输出。但是,代码指出返回值为2,这与void关键字冲突。要解决此问题,要么删除返回语句,要么将void更改为int。
问题2:程序设计
选择循环
想象一下,我想为一家银行写一段代码,询问用户他/她是想取款、存款还是退出。为了确保用户在按下quit结束程序之前能够执行尽可能多的事务,最好使用哪种类型的循环?
一个延伸的循环。
一个无限循环。
一个为循环。
一个而循环。
一个延伸的循环。
在我们的问题中,程序必须至少运行一次才能向用户呈现所有选项。由于这个原因,最好的选择是do-while循环,因为该循环中的语句至少执行一次,并且退出循环的条件在末尾。在本例中,退出条件是用户按下quit(在选项至少显示一次之后)。
在这种情况下,while循环可能会起作用;然而,这并不一定是最明智的选择。这是因为在循环内执行任何操作之前都要测试条件。这意味着,无论while循环内是什么,都不一定要执行。
对于这个问题,for循环也不是一个好的选择,因为for循环要执行一定的次数。在这种情况下,我们不知道用户是想做1个事务还是10个事务。因此,for循环不是最好的选择。
无限循环也不是我们想要的,因为它会永远运行下去。在我们的示例中,我们希望代码停止提示用户并在“quit”之后结束。
问题311:计算机科学
使用指针
研究下面的伪代码。
Int * var1;
Int foo = 63;
Var1 = &foo;
Var2 = *var1;
var1和var2的值是多少?
Var1被赋值为63
Var2被赋值为63
Var1被分配给foo的内存地址值
Var2被分配了var1的内存地址值
Var1被赋值为63
Var2被分配了var1的内存地址值
Var1被分配给foo的内存地址值。
Var2被赋值为63
Var1被分配给foo的内存地址值。
Var2被赋值为63
指针存储另一个变量的地址。指针的声明方式是先命名类型,然后加上星号,最后加上变量名。在我们的例子中,var1被声明为一个指向整数的指针:
Int * var1;
接下来在代码中,我们看到创建了一个名为“foo”的整型变量,并将其赋值为63。
然后使用寻址运算符(&)来获取变量的地址。现在让我们看看下一行代码:
Var1 = &foo;
这里的&符号用于在内存中获取foo的地址。这意味着var1包含foo在内存中存储的地址值。
接下来,在代码中,我们有以下语句:
Var2 = *var1;
这里使用了解引用操作符(*)。每当需要获取指针所指向的变量的值(而不是地址)时,就使用该操作符。在本例中,var1存储foo的地址。但是,通过使用解引用操作符,我们可以获得地址存储在var1中的变量的实际值。在本例中,对var1解引用,我们得到foo的实际值63。因此,var2 = 63。
问题1:选择合适的数据结构
二维阵列
给定以下初始化数组:
int第四;
int[][] myArray = {{1,2,3},
{4,5,6},
{7,8,9}};
使用myArray,我如何存储在变量“第四”,数字4?
第四= myArray[2][1];
第四= myArray[1][0];
= myArray[0][1];
[1][1];
第四= myArray[1][0];
当创建和初始化二维数组时,访问矩阵内部项目的方式是通过调用行和列的数组(即myArray[row][column])。记住,数组从0开始,数字4应该在第1行,第0列。因此,为了将该数字保存到变量“fourth”中,我们将执行以下操作:
第四= myArray[1][0];
*注意:myArray[1][0]与myArray[0][1]不同。
myArray[1][0] =4,因为它是位于行=1和列= 0的项。
myArray[0][1] =12,因为它是位于行=0和列=1的项。
问题1:选择合适的数据结构
对于库来说,最好的数据结构是什么?数据以标题和标题副本的形式存在。
散列映射
静态值
ArrayList
数组
散列映射
哈希映射-键是标题,值是副本的数量
哈希映射是(键,值)对的集合。
哈希映射有O(1)个访问,所以这将是存储数据的最快和最好的方法。