Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 9

Оценка кода

09.02.2020, 08:11. Показов 1363. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть задачи описал вначале кода, хотелось бы услышать, что можно было сделать лучше, где можно было бы написать/описать "правильнее", "как по учебнику", но в рамках реализации односвязного линейного списка через структуру. Список делал через структуру, не класс, потому что на первом курсе еще не было темы stl и классов. Потому не трогал vector, list и классы. Хотел написать все вручную. В основном хотел бы узнать, есть ли жесткие "нарушения", на подобии неправильного выделения памяти и очистки оной. Говнокод ли у меня вышел или пойдет?)
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/////////////////////////////////////////////////////////////////////////////////////////
//Игра в «пьяницу».В игре в «пьяницу» карточная колода раздается поровну двум игрокам.
//Далее они вскрывают по одной верхней карте, и тот,чья карта старше, забирает себе обе
//вскрытые карты, которые кладутся под низ его колоды. Тот, кто остается без карт –  проигрывает.
//
//Для простоты будем считать, что все карты различны по номиналу, а также, что самая 
//младшая карта побеждает самую старшую карту("шестерка берет туза").Игрок, который 
//забирает себе карты, сначала кладет под низ своей колоды карту первого игрока,
//затем карту второго игрока(то есть карта второго игрока оказывается внизу колоды).
//
//Напишите программу, которая моделирует игру в пьяницу и определяет, кто выигрывает.
//В игре участвует 10 карт, имеющих значения от 0 до 9, большая карта побеждает меньшую,
//карта со значением 0 побеждает карту 9.
//
//Входные данные Программа получает на вход две строки : первая строка содержит 5 чисел,
//разделенных пробелами—номера карт первого игрока, вторая – аналогично 5 карт второго игрока.
//Карты перечислены сверху вниз, то есть каждая строка начинается с той карты, которая будет
//открыта первой.
//
//Выходные данные.Программа должна определить, кто выигрывает при данной раздаче,и вывести
//слово first или second, после чего вывести количество ходов, сделанных до выигрыша.
//Если на протяжении 106 ходов игра не заканчивается, программа должна вывести слово botva.
//
//Примеры входные данные 1 3 5 7 9 2 4 6 8 0 выходные данные second 5
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream> 
#include <string>   
///////////////////////////////////////////////////////////////////////////////////////////
using namespace std;
///////////////////////////////////////////////////////////////////////////////////////////
// объявление структуры узла списка
struct TNode { 
    int data;
    TNode* next;
};
typedef struct TNode* PNode; 
///////////////////////////////////////////////////////////////////////////////////////////
// функция проверки на пустой список
bool isEmpty(PNode& Head) { 
    return Head ? 0 : 1;
}
///////////////////////////////////////////////////////////////////////////////////////////
// функция вставки в начало списка
void push(PNode &Head, PNode &Tail, int value) { 
    PNode Temp;
    if (isEmpty(Head)) { // проверка на пустой список
        Head = new TNode;
        Tail = Head;
        Tail->next = NULL;
    }
    else {
        Temp = new TNode;
        Temp->next = Head;
        Head = Temp;
    }
    Head->data = value;
}
///////////////////////////////////////////////////////////////////////////////////////////
// функция вставки в конец списка
void pushToEnd(PNode& Tail, int value) { 
    PNode Temp;
    Temp = new TNode;
    Temp->data = value;
    Tail->next = Temp;
    Temp->next = NULL;
    Tail = Temp;
}
///////////////////////////////////////////////////////////////////////////////////////////
// функция удаления узла из списка с возвратом его значения
int pop(PNode &Head) {  
    int value;
    value = Head->data; 
    Head = Head->next;  
 
    return value;
}
///////////////////////////////////////////////////////////////////////////////////////////
// функция вывода списка
void show(PNode& Head) {           
    while (!isEmpty(Head))         
    {
        cout << Head->data << " "; 
        Head = Head->next;
    }
    cout << endl;
}
///////////////////////////////////////////////////////////////////////////////////////////
// функция "игры"
int play(PNode &FirstHead, PNode& SecondHead, PNode& FirstTail, PNode& SecondTail, int &step) {
    while (!isEmpty(FirstHead) && !isEmpty(SecondHead) && step <= 106) { 
        int value_first = pop(FirstHead);
        int value_second = pop(SecondHead);
        if (value_first == 0 && value_second == 9) {
            pushToEnd(FirstTail, value_first);
            pushToEnd(FirstTail, value_second);
        }
        else if (value_first == 9 && value_second == 0) {
            pushToEnd(SecondTail, value_second);
            pushToEnd(SecondTail, value_first);
        }
        else if (value_first > value_second) {
            pushToEnd(FirstTail, value_first);
            pushToEnd(FirstTail, value_second);
        }
        else if (value_first < value_second) {
            pushToEnd(SecondTail, value_second);
            pushToEnd(SecondTail, value_first);
        }
        step++;
    }
    if (isEmpty(FirstHead))
        return 2;
    if (isEmpty(SecondHead))
        return 1;
    if (step >= 106)
        return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////
int main() {
    setlocale(LC_ALL, "ru");
 
    PNode first_hand_head = NULL,  // объявляем и определяем голову и хвост 
          second_hand_head = NULL, // списка(карточной руки) первого и второго игрока
          first_hand_tail = NULL,
          second_hand_tail = NULL;
 
    const int count_of_card = 10; // количество карт в игре
    const int hand_count = 5;     // количество карт одного игрока
 
    string hand_of_first,         // строка для получения набора карт первого игрока
           hand_of_second;        // строка для получения набора карт второго игрока
 
    getline(cin, hand_of_first);  // получаем набор карт первого игрока и записываем в строку
    getline(cin, hand_of_second); // получаем набор карт второго игрока и записываем в строку
 
    int a[count_of_card];         // массив для дальнейшей записи карт в списки (да, в два шага сделал, не хотел париться) )
 
    for (int i = 0, j = 0; i < hand_of_first.length(); i = i + 2, j++) {    // запись в массив карт первого игрока
        a[j] = (int)hand_of_first[i] - '0';
    }
    for (int i = 0, j = 5; i < hand_of_second.length(); i = i + 2, j++) {   // запись в массив карт второго игрока
        a[j] = hand_of_second[i] - '0';
    }
 
    for (int i = hand_count, j = hand_count * 2; i > 0 && j > 0; i--, j--) { // заполнение списков
        push(first_hand_head, first_hand_tail, a[i - 1]);
        push(second_hand_head, second_hand_tail, a[j - 1]);
    }
    
    int step = 0; // счетчик шагов
    cout << endl;
    int result = play(first_hand_head, second_hand_head, first_hand_tail, second_hand_tail, step); // Сыграть и присвоить результат переменной result
    
    switch (result) { // вывод результата игры 
    case 0:
        cout << "Ботва" << endl;
        break;
    case 1:
        cout << "Выиграл первый игрок за " << step << " ходов" << endl;
        break;
    case 2:
        cout << "Выиграл второй игрок за " << step << " ходов" << endl;
        break;
    }
 
    show(first_hand_head); //вывести карты на руках у первого игрока
    show(second_hand_head); //вывести карты на руках у второго игрока
 
    cout << endl;
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2020, 08:11
Ответы с готовыми решениями:

Советы по ускорению работы кода + оценка самого кода
Вчера вечером сел написать 3 консольные программки для работы с шаблонами размножения текста: 1.Выборка групп синонимов(создание словаря)...

Оценка кода
Добрый день! Есть задание в ВУЗе: Я сделал следующий код: #include &lt;iostream&gt; #include &lt;conio.h&gt; int...

оценка кода
Дайте оценку моему коду (https://onlinegdb.com/r1i-i8Cqm), укажите на ошибки

10
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
09.02.2020, 08:19
C++
1
2
3
bool isEmpty(PNode& Head) { //Зачем здесь ссылка? Убрать!
    return Head ? 0 : 1;//!Head или Head == nullptr
}
Ну и работа со списком какая-то странная.
1
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 9
09.02.2020, 08:35  [ТС]
Странно pushToEnd? Просто обычно в односвязном списке не держут указатель на tail. А так, как список односвязный, я решил, чтобы не ходить каждый раз от head в его конец, держать указатель на этот самый конец. Плохая реализация?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.02.2020, 08:41
Вот это странно:
Цитата Сообщение от Kain69 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
// функция вывода списка
void show(PNode& Head) {           
    while (!isEmpty(Head))         
    {
        cout << Head->data << " "; 
        Head = Head->next; // <-- вот тут вы постепенно теряете(затираете) данные вашего списка
    }
    cout << endl;
}
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
09.02.2020, 08:45
Цитата Сообщение от Kain69 Посмотреть сообщение
Странно pushToEnd?
Нет, вообще вся работа со списком.
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.02.2020, 08:48
Цитата Сообщение от zayats80888 Посмотреть сообщение
// <-- вот тут вы постепенно теряете(затираете) данные вашего списка
Пардон, мне из-за ссылки почудилось, что вы не указатель, а объект передаёте
Но если Head в единственном экземпляре, то вы всё равно теряете данные
1
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 9
09.02.2020, 12:08  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Но если Head в единственном экземпляре, то вы всё равно теряете данные
Действительно, даже не заметил из-за того, что юзал один раз и только в конце, спасибо, переписал
0
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 9
11.02.2020, 12:42  [ТС]
zayats80888, не подскажите, а вот тут у меня случайно не происходит утечка?(не удаляю из памяти узел)
Цитата Сообщение от Kain69 Посмотреть сообщение
// функция удаления узла из списка с возвратом его значения
int pop(PNode &Head) {  
    int value;
    value = Head->data;
    Head = Head->next;  
return value;
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
11.02.2020, 12:45
Цитата Сообщение от Kain69 Посмотреть сообщение
а вот тут у меня случайно не происходит утечка?
происходит

Добавлено через 49 секунд
а еще проверки на Head == nullptr нет
0
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 9
11.02.2020, 12:47  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
происходит
Так будет корректно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
// функция удаления узла из списка с возвратом его значения
int pop(PNode &Head) { 
 
    PNode Temp; //*
    Temp = Head; //*
 
    int value;
    value = Head->data;
    Head = Head->next;
    delete Temp; //*
    return value;
}
P.S. проверки не очень важны(хотя конечно лучше добавить) т.к я проверяю в итерациях, где использую pop. Конкретно в этой задаче
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
11.02.2020, 12:51
Лучший ответ Сообщение было отмечено Kain69 как решение

Решение

Цитата Сообщение от Kain69 Посмотреть сообщение
Так будет корректно?
добавь вначале
C++
1
if (!Head) throw std::runtime_error("Head was nullptr");
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2020, 12:51
Помогаю со студенческими работами здесь

Оценка кода
Здравствуйте, прошу вас всех оценить мой код , по возможности дать советы что так , а что не так и как это исправить либо в каком...

Оценка стиля кода
Народ, есть предложение. Оцените мой код. Не в смысле функционала - в смысле стиля написания. Значится, вот тут есть некий код: bool...

Оценка кода динамического двумерного массива
Доброго времени суток. Прошу оценить правильность выделения и удаления памяти, а также заполнения массива. Два примера. Вот первый. В...

Список учеников имеет следующую структуру: фамилия – класс - оценка по алгебре - оценка по физике - средний балл
Задание такое Список учеников имеет следующую структуру: фамилия – класс - оценка по алгебре - оценка по физике - средний балл. При...

Оценка стиля написания кода
Здравствуйте! Я к вам пожаловал не с очередной проблемой. Код у меня рабочий. Меня интересует то, насколько стандартен мой стиль...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru