Файл: Задача по следующим критериям Сравнить получившиеся коды программ.docx

ВУЗ: Не указан

Категория: Решение задач

Дисциплина: Не указана

Добавлен: 05.12.2023

Просмотров: 185

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Алгоритм выполнения задачи (блок-схема)



Описание задачи


Данная программа должна вывести все простые числа в заданном диапазоне (от 0 до n) при помощи алгоритма «Решето Эратосфена».

Сравнение кода программ по метрике Холстеда


Python:

NUOprtr (Number of Unique Operators) — число уникальных операторов программы на Python: 4

NUOprnd (Number of Unique Operands) — число уникальных операндов программы кода программы на Python: 4.

Noprtr (Number of Operators) — общее число операторов в программе на Python: 64.

Noprnd (Number of Operands) — общее число операндов в программе на Python: 4.
(Halstead Program Vocabulary, HPVoc): HPVoc = NUOprtr + NUOprnd = 5 + 5 = 8.

(Halstead Program Length, HPLen): HPLen = Noprtr + Noprnd = 64 + 4 = 64.

(Halstead Program Volume, HPVol): HPVol = HPLen log2 HPVoc = 87 log2 10 = 221.

(Halstead Difficulty, HDiff): HDiff = (NUOprtr/2) × (NOprnd / NUOprnd) = (64/2) × (4/4) = 32.

HEff = HDiff × HPVol = 32 × 221 = 7072.
Java:

NUOprtr (Number of Unique Operators) — число уникальных операторов программы на Java: 5.

NUOprnd (Number of Unique Operands) — число уникальных операндов программы кода программы на Java: 3

Noprtr (Number of Operators) — общее число операторов в программе на Java: 11.

Noprnd (Number of Operands) — общее число операндов в программе на Java: 39.
(Halstead Program Vocabulary, HPVoc): HPVoc = NUOprtr + NUOprnd = 9.

(Halstead Program Length, HPLen): HPLen = Noprtr + Noprnd = 50.

(Halstead Program Volume, HPVol): HPVol = HPLen log2 HPVoc = 54.

(Halstead Difficulty, HDiff): HDiff = (NUOprtr/2) × (NOprnd / NUOprnd) = (6/2) × (39 / 3) = 39.

HEff = HDiff × HPVol = 2106.
C++:

NUOprtr (Number of Unique Operators) — число уникальных операторов программы на С++: 7.

NUOprnd (Number of Unique Operands) — число уникальных операндов программы кода программы на С++: 3.

Noprtr (Number of Operators) — общее число операторов в программе на С++: 48.

Noprnd (Number of Operands) — общее число операндов в программе на С++: 13.
(Halstead Program Vocabulary, HPVoc): HPVoc = NUOprtr + NUOprnd = 10.

(Halstead Program Length, HPLen): HPLen = Noprtr + Noprnd = 61.

(Halstead Program Volume, HPVol): HPVol = HPLen log2 HPVoc = 60.

(Halstead Difficulty, HDiff): HDiff = (NUOprtr/2) × (NOprnd / NUOprnd) = (7/2) × (13/3) = 14.

HEff = HDiff × HPVol = 840.

Решение задачи


  1. Все четные числа, кроме двойки, - составные, т. е. не являются простыми, так как делятся не только на себя и единицу, а также еще на 2.

  2. Все числа кратные трем, кроме самой тройки, - составные, так как делятся не только на самих себя и единицу, а также еще на 3.

  3. Число 4 уже выбыло из игры, так как делится на 2.

  4. Число 5 простое, так как его не делит ни один простой делитель, стоящий до него.

  5. Если число не делится ни на одно простое число, стоящее до него, значит оно не будет делиться ни на одно сложное число, стоящее до него.


Последний пункт вытекает из того, что сложные числа всегда можно представить как произведение простых. Поэтому если одно сложное число делится на другое сложное, то первое должно делиться на делители второго. Например, 12 делится на 6, делителями которого являются 2 и 3. Число 12 делится и на 2, и на 3.


Код выполнения программы


  1. Python:

  2. список заполняется значениями от 0 до n

  3. a = []

  4. for i in range(n + 1):

  5. a.append(i)

  6.  

  7. # Вторым элементом является единица,

  8. # которую не считают простым числом

  9. # забиваем ее нулем.

  10. a[1] = 0

  11.  

  12. # начинаем с 3-го элемента

  13. i = 2

  14. while i <= n:

  15. # Если значение ячейки до этого

  16. # не было обнулено,

  17. # в этой ячейке содержится

  18. # простое число.

  19. if a[i] != 0:

  20. # первое кратное ему

  21. # будет в два раза больше

  22. j = i + i

  23. while j <= n:

  24. # это число составное,

  25. # поэтому заменяем его нулем

  26. a[j] = 0

  27. # переходим к следующему числу,

  28. # которое кратно i

  29. # (оно на i больше)

  30. j = j + i

  31. i += 1

  32.  

  33. # Превращая список во множество,

  34. # избавляемся от всех нулей кроме одного.

  35. a = set(a)

  36. # удаляем ноль

  37. a.remove(0)

  38. print(a)

  39. java


mport java.util.ArrayList;

import java.util.List;
public class SieveEratosthenes {

static class PrimePair {

Integer prime;

Integer lastCrossed;
PrimePair(Integer prime, Integer lastCrossed) {

this.prime = prime;

this.lastCrossed = lastCrossed;

}

}
private List
primes;

private SieveEratosthenes() {

primes = new ArrayList<>();

primes.add(new PrimePair(2, 2));

primes.add(new PrimePair(3, 3));

}
private void fillNPrimes(

int n) {

while (primes.size()

addNextPrime();

}

}
private
void addNextPrime() {

int candidate = primes.get(primes.size()-1).prime + 2;

for (int i = 1; i < primes.size(); i++) {

PrimePair p = primes.get(i);

while (p.lastCrossed < candidate) {

p.lastCrossed += p.prime;

}

if (p.lastCrossed == candidate) {

//restart

candidate+=2;

i=-1;

}

}

System.out.println(candidate);

primes.add(new PrimePair(candidate, candidate));

}
public static void main(String[] args) {

SieveEratosthenes test = new SieveEratosthenes();

test.fillNPrimes(1000);

}

}

  1. C++

  2. int n;

  3. vector prime (n+1, true);

  4. prime[0] = prime[1] = false;

  5. for (int i=2; i<=n; ++i)

  6. if (prime[i])

  7. if (i * 1ll * i <= n) //1ll дляпереводав long long

  8. for (int j=i*i; j<=n; j+=i)

  9. prime[j] = false;



Выводы


В данной курсовой работе мною была разработана программа для которая генерируется множество первых n случайных чисел с помощью решета Эратосфена, используя 3 различных языка программирования, а именно Python, Java и C++. Был обоснован выбор каждого из этих языков по нескольким критериям и было проведено сравнение написанных программ по метрике Холстеда.

Сравнение данных программ подтвердило критерии по котором были выбраны данные языки для написания данной задачи и выявило положительные и отрицательные стороны каждого из этих языков программирования.

Список используемой литературы


Учебники, монография, брошюры


  1. Программирование. Принципы и практика с использованием C++ — Бьёрн Страуструп.

  2. Современный Java. Рецепты программирования – Кен Коузен.

  3. Программирование на Python – Марк Лутц.


Электронные источники

  1. Интернет-сайт Википедия- https://ru.wikipedia.org

  2. Интернет-сайт Habr- https://habr.com/ru

  3. Интернет-сайт tproger - https://tproger.ru

  4. Интернет-сайт Oracle -https://www.oracle.com/java/technologies/javacommunity.html

  5. Что пишут на Python: для чего нужен этот язык программирования / Skillbox Media

  6. Моё обучение · Моё обучение · Stepik

  7. Язык Java: зачем нужен, плюсы и минусы, области применения - сравнение с другими языками программирования, с чего начать (yandex.ru)