Форум программистов, компьютерный форум, киберфорум
Теория и практика программирования
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Заблокирован
1

Правда ли, что "Goto: за и против" от Дейкстры - явная и сознательная монополизация рынка?

06.05.2023, 19:06. Показов 603. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ведь с помощью гото программировать мог каждый школьник, ДА нечитабельно и ДА не программу управления полетом на Марс, а простые задачи, но де-факто МОГ! А пусть тот же школьник 1-2 класса попробует написать хотябы самый простой самый классический хафман, без арифметиков и прочей хрени - следуя высоким идеалам Структурного Программирования... да уж...
Только посмотрите на этот прекрасный код (на абстрактном ЯП т.к. первый конкретный пока только изучаю):
Код
if decoding=yes goto decoding
int[256] frequency
int counter=1

l1:
if counter>len(file) goto exit1
++frequency[file[counter]] //Волшебное сочетание квадратных скобок!
++counter
goto l1

exit1:
counter=1
l2:
if counter>256 goto exit2
if frequency[counter]=0 frequency[counter]=99999999999999
++counter
goto l2

exit2:
list<char>[256] codes
list<tree<char>> trees=[1, 256]
l3:
if len(trees)=1 goto exit3
add(codes[min(trees)], 0)
add(codes[min2(trees)], 1)
add(trees, createtree(min(trees), min2(trees)))
remove(trees, min(trees) && min2(trees))
goto l3

exit3:
counter=1
l4:
if counter>len(file) goto exit101
add(output, codes[file[counter]])
++counter
goto l4

decoding:
//Тут только не придумал что написать, моих знаний не хватает...
exit101:
close(file)
close(output)
exit(0)
А вот код без гото из нета:
C++
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <queue>
#include <iostream>
#include <sstream>
using namespace std;
 
struct Node {
    string value, code;
    unsigned amount;
    Node * left;
    Node * right;
    // компаратор
    bool operator() (const Node& x, const Node& y) const {
        return x.amount > y.amount;
    }
    // конструктор по умолчанию нужен для создания объекта-компаратора
    Node (const string& value = "", unsigned amount = 0, Node * left = 0, Node * right = 0) {
        this->value = value; // множество символом узла
        this->code = ""; // строковое представление битового кода узла
        this->amount = amount; // сколько раз втретилось
        this->left = left; // левый ребенок
        this->right = right; // правый ребенок
    }
    // генерация DOT-описания полученного дерева 
    string to_str() {
        ostringstream x;
        if (left != 0 || right != 0) { // дерево таково, что либо есть оба ребенка либо нет ни одного
            x << "\t\"" << code << ": " << value << "[" << amount << "]\" -> \""  << left->code << ": " << left->value << "[" << left->amount << "]\";\n";
            x << left->to_str();
            x << "\t\"" << code << ": " << value << "[" << amount << "]\" -> \""  << right->code << ": " << right->value << "[" << right->amount << "]\";\n";
            x << right->to_str();
        } else {
            x << "\t\"" << code << ": " << value << "[" << amount << "]\" [shape=box, style=filled, fillcolor=green];\n";
        }
        return x.str();
    }
    //  объединение деревьев
    Node * join (Node x) {
        return new Node(x.value + value, x.amount + amount, new Node(x), this);
    }
    // проход по дереву с генерацией кода
    void traversal_code(string code) {
        this->code = code;
        if (left != 0 || right != 0) {
            left->traversal_code(code + "1");
            right->traversal_code(code + "0");
        }
    }
    // строим дерево по алгоритму Хаффмана
    static Node * builder(priority_queue<Node, vector<Node>, Node> graph) {
        while (graph.size() > 1) {
            Node *n = new Node(graph.top());
            graph.pop();
            graph.push(*n->join(*new Node(graph.top())));
            graph.pop();
        }
        return new Node(graph.top());
    }
};
 
unsigned amounts[256]; // массив счетчиков встречаемости символов
int main() {
    string s;
    getline (std::cin, s); // читаем строку вместе с пробелами
    for(auto i: s) amounts[i]++;
    priority_queue<Node, vector<Node>, Node> graph;
    for(int i = 'a'; i <= 'z'; i++) // записываем в очередь с приоритетами 
        if (amounts[i] > 0) graph.emplace(s=(char)i, amounts[i]);
    Node *n = Node::builder(graph);
    n->traversal_code("");
    // генерируем ссылку на сервис Google для генерации изображений по описанию графа
    cout << "http://chart.apis.google.com/chart?cht=gv&chl=" << endl;
    // генерируем DOT-описание полученного дерева для отрисовки
    cout << "Digraph G {\n" << n->to_str() << "}";
    // Если вывод программы скопировать и вставить в адресную строку браузера, то увидим картинку.  
}
Вопрос: какой код короче? А какой читабельнее?
И я ж НЕ ГОВОРЮ, что надо применять гото безрассудно. Например, внутрь цикла или в другую процедуру - это безрассудно. Но ни один адекватный компилятор и не позволит этого сделать. А насчет "на метку управление может прийти черт знает откуда, хоть из соседнего файла" - в любой нормальной иде есть волшебная кнопочка "Ссылки сюда", позволяющая забыть об этой надуманной "проблеме" до скончания веков.
И еще. Я вовсе не против обходиться без гото. Но я против ДОГМ! Что "это нельзя, и все", без объяснения причин или по надуманным причинам. Если завтра скажут "нельзя применять процедуры" по надуманной причине, я тоже буду против. Не потому, что я фанат процедур, а потому, что я ненавижу догмы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2023, 19:06
Ответы с готовыми решениями:

Goto - за и против
С удивлением обнаружил на форуме аж двух сторонников оператора goto. Посему объявляю опрос.

Goto - за и против (2)
Продолжение темы.

Оператор GOTO: за и против
Люди, по ходу, газет не читают: Оператор GOTO в языках высокого уровня является объектом критики,...

Конечно-разностные схемы, Лакса явная и Мак-Кормака явная на C++
Здравствуйте, дорогие форумчане, дали задание на создание численной модели и появилось несколько...

Метод конечных разностей. Явная и не явная схема
Помогите пожалуйста методом конечных разностей решить уравнения с заданными начальными и граничными...

8
фрилансер
5520 / 5112 / 1051
Регистрация: 11.10.2019
Сообщений: 13,396
06.05.2023, 20:22 2
Novichok888, без goto конечно же лучше, тут не о чем рассуждать.

другое дело, что приведённый код на C++ тоже далёк от идеала. Написан чайником
0
Заблокирован
07.05.2023, 09:02  [ТС] 3
Цитата Сообщение от Алексей1153 Посмотреть сообщение
без goto конечно же лучше, тут не о чем рассуждать.
Что значит "лучше"? Для следующего догмам наверное "лучше". Но я спросил не какой "лучше", а какой КОРОЧЕ и какой ЧИТАБЕЛЬНЕЕ. Может кто нить ответить аргументировано?
0
Модератор
Эксперт функциональных языков программирования
3055 / 2197 / 459
Регистрация: 26.03.2015
Сообщений: 8,482
07.05.2023, 12:56 4
Построение кода Хаффмана
0
фрилансер
5520 / 5112 / 1051
Регистрация: 11.10.2019
Сообщений: 13,396
07.05.2023, 14:38 5
Цитата Сообщение от Novichok888 Посмотреть сообщение
какой ЧИТАБЕЛЬНЕЕ
однозначно - без goto
0
Модератор
Эксперт функциональных языков программирования
3055 / 2197 / 459
Регистрация: 26.03.2015
Сообщений: 8,482
07.05.2023, 22:53 6
Есть мнение, что каждая функция должна отображать одну идею. Поэтому (в рамках этой идеи) размер функции редко превышает 4 строки.
0
4396 / 2246 / 252
Регистрация: 28.10.2011
Сообщений: 8,578
Записей в блоге: 6
08.05.2023, 16:16 7
Цитата Сообщение от Novichok888 Посмотреть сообщение
Но я спросил не какой "лучше", а какой КОРОЧЕ и какой ЧИТАБЕЛЬНЕЕ.
Коды отличаются не только наличием или отсутствием Goto, но и многим другим, включая разные ЯП. Сравнение некорректно.
Напишите два полностью идентичных кода на одном и том же ЯП, за исключением того что в первом будет Goto, а во втором нет. Тогда и обсудим эту тему.
1
Эксперт .NET
10592 / 6515 / 1508
Регистрация: 25.05.2015
Сообщений: 19,751
Записей в блоге: 14
08.05.2023, 16:19 8
Go to MISRA C
0
646 / 522 / 72
Регистрация: 20.09.2014
Сообщений: 3,367
08.05.2023, 16:58 9
Я проанализовал код. Вывод: вместо goto следовало использовать четыре цикла while и один условный переход if-else. Этот код линейный, не годится для сравнения структурного и императивного подхода.
0
08.05.2023, 16:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2023, 16:58
Помогаю со студенческими работами здесь

Найти номер рынка, где цена земляники минимальна, если человек не хочет идти до рынка, удаленного от дома на расстояние большее, чем R
На N рынках продают землянику. Расстояние от дома до рынка известно. Найти номер рынка, где цена...

Ответ в виде "правда" или "ложь" на "а правда ли что" с определенным условие №2
Нужна помощь с екселем

Ответ в виде "правда" или "ложь" на "а правда ли что" с определенным условие №1
Нужна помощь с екселем

Что являются функциями рынка
4. Функциями рынка являются: а) обеспечение эффективности производства; б) обеспечение социальной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru