嘻嘻嘻... 我稱我們為“愛人”!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:進行了一些小的措辭更改,更改了文章以利用新文章部分的特性。