• 文章
  • 为什么我们是一群严厉的“爱人”。
发布
2010年11月4日 (上次更新: 2011年6月22日)

为什么我们是一群严厉的“爱人”。

得分: 4.1/5 (48 票)
*****
嘻嘻嘻... 我称我们为“爱人”!O_o
各位女性,男性,变性人,天然雌雄同体,以及无性者们...

这是一篇关于我们拒绝回答作业问题和解决作业问题的文章。

我预计绝大多数发布过如下内容的人...
嗨,大家
编写一个程序,实现埃拉托斯特尼筛法。该程序应该从控制台获取要搜索素数的范围 1-n 的上限,并输出素数的数量。

...都被直接拒绝提供问题的解决方案,而那些得到解决方案的人可能看到解决方案提供者因提供解决方案而受到谴责。 如果您是解决方案提供者或解决方案寻求者,那么我很抱歉,但简单的方法和正确的方法之间存在差异,在这篇文章中,我希望解释为什么我们如此反对提供问题的解决方案。

假设对于上述问题,我发布了解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <math.h>

using namespace std;
int size;
int* primes;
bool checkprimeness(int i)
{
	for (int j = 0; j < size; j++) 
		if (i % primes[j] == 0) return false;
	return true;
}

void main()
{
    int max;
    printf("Enter your number: ");
    cin >> max;
	system("cls");
	
    if (max < 2) {
	printf("What the fortran do you take me for?\nThere are no positive primes here!\n");
		exit(0);
    }
	else {
		primes = (int*)malloc(4*max);
		size = 0;
		primes[size] = 2, size++;
	}
	
	int i;
    for (i = 2; i < max+1; i++) {
		if (checkprimeness(i))
			primes[size] = i, size++; 
	}
	
	cout << "\n";
    for (i = 0; i < size; i++) 
		cout << primes<i> << "\n";
	
    system("pause");
}


随便想想,这样做有五个问题。

1:OP(原始发帖人)可能不会通读代码。
我们无法保证 OP 不会快速地奉承一下然后带着这个解决方案逃跑,在没有先检查的情况下将它作为他/她自己的解决方案呈现给讲师。 这是一个问题,因为

1.1: 我们将浪费时间创建解决方案(上面花了我大约 5 分钟,但仍然是浪费时间),因为 OP 不会学到任何积极的东西,除非这对您来说是一个好的练习,否则您只是花了一些时间编写一段不会教任何积极东西的代码。 :)

1.2: 我们这些密切关注的人会注意到,这段代码实际上不是问题的解决方案。 可能会发生误读,如果学生不够注意,他/她不会注意到我“意外”地让程序输出了素数列表,而不是要求的素数数量。
此外,正如 tition 在本文的线程版本中 3 个月后正确地注意到,我使用的算法不是埃拉托斯特尼筛法; 它永远不会从完整列表中划掉任何数字。 如果这出现在我给 OP 的解决方案中,它可能很容易被忽视,并且如果将这段代码作为解决方案给出,他/她可能会因此问题损失大量学分。

1.3: 如果有人试图提交这个例子来获得学分,他们可能会因为我编写的丑陋风格而损失大量的学分。 第 5 点将详细介绍这一点。

2:这会助长大学期间的懒惰。
在某些情况下,OP 可能会了解到其他人会为他/她做他/她的工作,这可能会导致一些......不幸的改变,以及强化懒惰。 这只是一种可能性,就像上面一样,但它仍然存在; 我见过它发生过。

3:没有注释。
如果 OP 实际上试图从我的例子中学习,由于缺乏解释性注释,可能很难理解。 我们中的一些人会添加注释,但我承认其他人可能不会,因此当给定的解决方案没有解释性注释时,OP 会浪费时间,而且可能只是解决问题会花费更少的时间,并且会带来更好的理解。

4:这会助长大学毕业后的懒惰。
(受到 cnoeval 的回应启发)如果 OP 以某种方式通过作弊完成了大学学业并获得了在计算机科学行业工作的合理学位,那么他/她将至少浪费了他/她生命中的两个美好时光,并且在实际工作方面也会遇到很大的麻烦。 有些人可能也会在这方面帮助他们,可能持续多年,但即使是最慷慨的人也有一个限度。

5:它像疾病一样传播不良的编码习惯。
这段代码的风格实际上非常糟糕,但更糟糕的是,一个 C++ 经验不足的人可能会将其作为解决方案提供给他人。 我会祝贺这项努力,但如果 OP 确实试图从代码中学习,他/她可能会养成在 C++ 中不仅糟糕而且难以消除的习惯。 通常我们会尝试指出这一点,但我们并非无处不在,也并非一直活跃。 请不要提供解决方案,以防您的习惯不理想!

注意:如果严格遵循 C++ 标准,该示例甚至无法编译。 此外,该程序存在内存泄漏,因为 primes 指向的内存永远不会被释放。 我不建议在不先修复它的情况下运行此程序!
如果您通过并排查看问题及其解决方案来更好地学习,请询问论坛成员是否可以创建一个类似的问题并解决它,以便您可以并排查看问题和解决方案。 如果我们中的一个人有时间,我们会很乐意这样做或链接到已完成的示例。 :)

有关创建好问题的几条准则,请参见此处的文章。

祝您编码愉快!

-Albatross

EDIT1:对问题描述进行了一些小修改,使其更加逼真,并添加了第 4 点。 还使控制台暂停更优雅但更难理解。
EDIT2:添加了第 1.2.1 点(现在是 1.2 的一部分)
EDIT3:进行了一些小的更改。
EDIT4:用一桶纯粹的邪恶倾注了这个例子,并添加了第 5 点。
EDIT5:添加了一些对示例的反向改进。
EDIT6:进行了一些小的措辞更改,更改了文章以利用新文章部分的特性。