计算机科学:程序分析

学习计算机科学的概念,示例问题和解释

大学导师应用商店 大学导师安卓商店

例子问题

←之前 1 3. 4 5

问题1:程序分析

这个函数有趣的定义如下:

Public int fun(int[] a)
{
一个一个。长度- 1]=一个[0];
返回一个[0]+(一个[0]% 2);
}
的值是多少一个[0]在执行以下代码段之后?
Int [] a = {3,6,9,12};
A [0] = fun(A);
可能的答案:

3.

6

9

13

12

正确答案:

12

解释

第一部分有趣的将数组最后一个位置的值赋给第一个位置。然后,它返回A [0] + (A [0] % 2)。最后一部分将是"1“如果一个[0]很奇怪,而且"0“如果一个[0]是偶数。自A [0] == 12,它是偶数,则表达式的计算结果为12 + 0,也就是12

问题2:程序分析

的值是什么xy,z在执行以下代码之后?
Int x = 4, y = 3, z;
For (int I = 0;I < 5;我+ +)
{
Z = x + y;
Y = x - Y;
X = z;
}
可能的答案:

X == 16 y == 12 z== 16

X == 28 y == 4 z== 28

X == 28 y == 4 z== 4

X == 32 y == 24 z == 32

X == 14 y == 2 z == 14

正确答案:

X == 28 y == 4 z== 28

解释

循环将运行5次。的值xy,z每次运行后将如下:

  • I == 0: x == 7 y == 1 z == 7
  • I == 1: x == 8 y == 6 z == 8
  • I == 2: x == 14 y == 2 z == 14
  • I == 3 x == 16 y == 12 z == 16
  • I == 4 x == 28 y == 4 z == 28

最后,等于5,并且值不再改变。

问题3:程序分析

考虑方法
公共字符串神秘(字符串s)
{
字符串s1 = s.substring(0,1);
字符串s2 = s.substring(1,2);
字符串s3 = s.substring(2, s.length() - 2);
s.length() - 2, s.length() - 1);
字符串s5 = s.substring(s.length() - 1);
If (s.length() <= 5)
返回s5 + s4 + s3 + s2 + s1;
其他的
返回s1 + s2 + mystery(s3) + s4 + s5;
}

的输出是什么

System.out.println(神秘(“异常”));

可能的答案:

SEITRMALIONBA

异常

ABNOILAMRTIES

这些答案都不正确。

SEITILAMRONBA

正确答案:

ABNOILAMRTIES

解释

.substring ()方法接受参数中第一个数字处的字符,并遍历String,直到到达参数中的第二个数字,而不复制第二个数字处的字符。

在第一部分神秘(),生成并填充字符串s1、s2、s3、s4和s5。如果n = #个字符在s中,s1得到s中的第一个字符,s2得到s中的第二个字符,s3得到第三个到n-2个字符,s4得到n-1个字符,s5得到最后一个字符。

字符串s1 = s.substring(0,1);
字符串s2 = s.substring(1,2);
字符串s3 = s.substring(2, s.length() - 2);
s.length() - 2, s.length() - 1);
字符串s5 = s.substring(s.length() - 1);

我们来看第二部分神秘()。

If (s.length() <= 5)
返回s5 + s4 + s3 + s2 + s1;
其他的
返回s1 + s2 + mystery(s3) + s4 + s5;

如果语句检查s的长度,如果小于或等于5,则返回一个由s5组成的String,后面跟着s4,以此类推。如果s等于abcde,那么如果将求值为true,并返回"edcba"。在递归中,这被称为“基本情况”。

其他的语句用于长度大于5个字符的字符串。它返回s1,然后是s2,然后是mystery的结果(s3),然后是s4和s5。它调用自己的事实导致了这个递归。

让我们逐步了解这个示例。的理由神秘(), s代表“异常”。在第一部分之后,结果如下:

s1 = "A"
s2 = "B"
s3 = "NORMALITI"
s4 = "E"
5 = "S"
因为s大于5个字符,我们取其他的,因此它返回以下内容:
A + B +神秘(NORMALITI) + E + S
接下来,我们用新的论点重复。s = NORMALITI,所以在第一部分之后,结果是:
s1 = "N"
s2 = " 0 "
s3 = "RMALI"
s4 = "T"
5 = "I"
因为s比5个字符长,我们取其他的,因此它返回以下内容:
N + O + mystery(RMALI) + T + I
它被添加到之前的返回中,使其成为:
A + B + N + O + mystery(RMALI) + T + I + E + S
我们再次使用参数s = RMALI进行重复。在第一部分之后,结果是:
s1 = "R"
s2 = "M"
s3 = "A"
s4 = "L"
5 = "I"
因为s的长度小于等于5个字符,我们取如果这一次。它返回以下内容:
I + l + a + m + r
我们可以用上面的代码替换所有的mystery(RMALI)实例,所以原始返回结果是这样的:
A + b + n + o + I + l + A + m + r + t + I + e + s
它被打印为ABNOILAMRTIES,答案。

问题1:程序分析

考虑数组

Int [] arr = {1,2,3,4,5};

里面的值是什么加勒比海盗在执行以下代码之后?

For (int I = 0;I < r。长度- 2;我+ +)
{
Int temp = arr[i];
Arr [i] = Arr [i+1];
Arr [i+1] = temp;
}
可能的答案:

23451

OutOfBoundsException

54321

15432

12345

正确答案:

23451

解释

我们从一个数组开始,加勒比海盗,大小为5的,包含{1,2,3,4,5}。

代码中的循环,

For (int I = 0;I < r。长度- 2;我+ +)

循环遍历数组直到倒数第二个单元格加勒比海盗。长度- 2是倒数第二个单元格的索引,它从第一个单元格开始。

让我们看看循环中的代码。

Int temp = arr[i];
Arr [i] = Arr [i+1];
Arr [i+1] = temp;
当i = 0时,
Arr [0] == 1
r[1] == 2
温度= 1
Arr [0] = 2
Arr [1] = 1
Arr [] == {2,1,3,4,5}
当i = 1时
Arr [1] == 1
Arr [2] == 3
温度= 1
Arr [1] = 3
Arr [2] = 1
Arr [] == {2,3,1,4,5}

当i = 2时

Arr [2] == 1
Arr [3] == 4
温度= 1
Arr [2] = 4
Arr [3] = 1
Arr [] == {2,3,4,1,5}
当i = 3时
Arr [3] == 1
Arr [4] == 3
温度= 1
Arr [3] = 3
Arr [4] = 1
Arr [] == {2,3,4,5,1}

随着循环的进行,它移动其中的值加勒比海盗[0]一直到数组的最后。

问题1:识别边界案例

识别可能在此程序中发生的用户错误

UserInput ui = new UserInput();//用户输入

int s = (Integer)ui;

System.out.println(年代);

可能的答案:

用户输入不能是整数

parseInt语句不正确

用户永远不会做错任何事情

没什么不对的

正确答案:

用户输入不能是整数

解释

用户可以输入字符串,转换为(Integer)会导致运行时异常。如果存在运行时异常,程序将停止并为黑客打开漏洞。一旦黑客知道如何停止程序,他们就可以开始输入错误数据以查看数据库模式以收集数据。解决这个问题的一种方法是使用实用程序方法,如parseInt(ui)。

问题1:程序分析

考虑下面的代码:

公共静态类矩形{

私人双宽、高;

公共矩形(双w,双h) {

宽度= w;

高度= h;

}

public double getArea() {

返回宽度*高度;

}

public double getPerimeter() {

返回2 *宽度+ 2 *高度;

}

}

公共静态类Square扩展矩形{

公共广场(双s) {

超级(s, s);

}

}

public static void main(String[] args) {

矩形[]rects = new Rectangle;

For (int I = 0;I < 6;我+ +){

If (i % 2 == 0) {

rects[i] = new Rectangle(i+10,i + 20);

} else {

rects[i] = new Square(i+20);

}

}

正方形s = rects[1];

}

上面代码中的错误是什么?

可能的答案:

你不能分配广场对象的数组矩形对象。

你需要为类使用“implements”,而不是“extends”广场

不能执行最后的赋值操作。

的声明中有一个错误矩形数组中。

有一个数组溢出。

正确答案:

不能执行最后的赋值操作。

解释

这段代码用交替的矩形和正方形对象填充6个成员的数组。你可以这样做,因为Square类是Rectangle的子类。也就是说,因为正方形是矩形,您可以将Square对象存储在Rectangle变量中。然而,即便如此矩形[1]是一个正方形,你不能立即将它重新赋值给一个正方形对象。代码现在已经开始考虑数组中的所有对象都是矩形对象。你需要显式地对这行进行类型转换才能使这行正常工作:

正方形s =(正方形)(矩形[1]);

问题7:程序分析

下面代码中的错误是什么?

Int val1 = -14,val2 = 4;

Final int val3 = 9;

Double val4 = 4.1;

双val5 = 3.1;

Val1 = val2 * val3

Val3 = val1 * 12;

Val5 = val1 - val3;

Val4 = val2 + val5;

可能的答案:

你必须定义val2在它自己的线上。

不能对双精度和整数执行混合加法或减法。

不能将整数减法的结果赋值给val5

不能将新的整数值赋值给val3

不能相乘val3通过val2

正确答案:

不能将新的整数值赋值给val3

解释

给出的选项中唯一的错误是这段代码给变量赋了一个新值val3,它被定义为常数。(这是由关键字表示的最后在声明的其余部分之前。)一旦声明了常量,就不能更改它们。因此,下面这行代码将导致编译时错误:

Val3 = val1 * 12;

问题8:程序分析

public static void main(String[] args) {

Int [] x = {3,4,4,5,17,4,3,1};

Int [] y = remove(x,4);

For (int I = 0;I < y.length;我+ +){

system . out。Print (y[i] + " ");

}

}

公共静态布尔移除(int[] arr, int val) {

布尔值found = false;

int我;

For (i = 0;I < r。长度&& !找到;我+ +){

如果(arr[i] == val) {

Found = true;

}

}

如果(发现){

For (int j = i;J < arr.length;j++) {

[j - 1] = [j];

}

arr (arr)。长度- 1]= 0;

}

返回发现;

}

上面代码中的错误是什么?

可能的答案:

有多个选项可以删除,这是不支持的功能

代码中没有错误

其中一个赋值中存在类型不匹配

中的输出循环主要会溢出数组y

删除方法时,存在一个在使用前未初始化的变量

正确答案:

其中一个赋值中存在类型不匹配

解释

有问题的一行是这样的:

Int [] y = remove(x,4);

注意变量y定义为数组。现在,人们很容易认为(没有仔细观察)删除方法在删除完成后返回数组;但是,逻辑不是这样工作的删除方法。相反,它返回一个布尔值,指示删除是否成功(也就是说,它告诉你是否真的找到了值)。因此,不能像上面那样赋值,因为这两种类型不相同。也就是说,y是一个整数数组,而删除返回一个布尔值!

问题1:程序分析

公共接口ServerInstance

byte [] readBytes ();

布尔writeBytes (byte [] b);

布尔维克();

布尔状态();

无效的睡眠();

}

MyHost实现ServerInstance

布尔运行= false;

公共布尔唤醒(){

//这里的其他逻辑代码…

返回运行;

}

公共布尔状态(){

//这里的其他逻辑代码…

返回运行;

}

public byte[] readBytes() {

Byte [] buffer = null;

//这里的其他逻辑代码…

返回缓冲区;

}

Public void sleep() {

//这里的其他逻辑代码…

Running = false;

}

public byte[] writeBytes(byte[] b) {

//这里的其他逻辑代码…

返回b;

}

//其他方法…

}

上面代码中的错误是什么?

可能的答案:

readBytes方法初始化变量缓冲为空

没有错误

writeBytes方法没有正确定义

睡眠方法不返回任何东西

这个词扩展应该用,不是吗实现了

正确答案:

writeBytes方法没有正确定义

解释

当您实现一个接口时,在该接口中定义的所有方法都必须写入提议实现该接口的类中。(或者,如果它们没有在那里实现,则需要涉及抽象类——但这不是我们这里要讨论的。)这些方法必须匹配接口中提出的原型。在示例代码中,ServerInstance有一个方法writeBytes返回一个布尔值。然而,并且类已将此方法实现为返回byte []价值。由于对于具有相同参数集的方法不能有不同类型的返回值,因此Java将其解释为建议的实现writeBytes (byte [] b),并且此方法必须返回一个布尔if并且就是执行ServerInstance

问题1:程序分析

Public static void foo() {

Int x = 10;Y = 21, z = 30;

Int [] r = null;

For (int I = 0;I < y;I += 4) {

Arr = new int[i / 5];

}

For (int I = 0;I < x;我+ +){

Arr [i] = z / i;

}

For (int I = 0;I < z;我+ +){

Arr [i] = z * i;

}

}

下面哪行代码会导致a编译时错误呢?

可能的答案:

加勒比海盗(] =z/

加勒比海盗=int(/ 5];

这些行都不会引起a编译时错误

intx= 10;y= 21z= 30;

加勒比海盗(] =z*

正确答案:

intx= 10;y= 21z= 30;

解释

编译中的错误甚至在任何代码试图执行之前就发生了。因此,这主要是代码中的语法错误。在上面的选择中,行

Int x = 10;Y = 21, z = 30;

后面有分号吗10这将导致在此代码后面的代码中出现错误

Y = 21, z = 30;

是无效的Java代码。

这段代码中还有其他错误。加勒比海盗(] =z/会在什么时候造成除以0的错误是0。同时,加勒比海盗(] =z*会超出数组的边界吗加勒比海盗。然而,这些都不是编译时错误。在代码能够运行之前发生的错误!

←之前 1 3. 4 5
大学导师提供的学习工具