1 Востаннє редагувалося Joker (18.12.2014 00:43:00)

Тема: Як почати кодити те, що думаю і без багів?

Передслово
Сьогодні був черговий контест https://codeforces.com/ , для мене його результати були жахливими. Після нього я зробив декілька висновків:
1) Не все так страшно, як здавалося. Навіть досить круто, бо присутня атмосфера олімпіади.
Далі скарги на самого себе
2) Мені страшно. Один студент (доречі, у його універі програмування викладає віце-призер світу) допомагає мені готуватися до програмування, і от всі нормальні люди здають задачу А до 10 хвилини ( в загальному ). У мене цей процес був розділений на 2 (задача - https://codeforces.com/contest/496/problem/A) : на аркуші паперу і у голові, кодинг. Так от на аркуші я поняв 80% за 5 хв, але потім виявилось що правильно не докінця і тому весь час на роздуми рішення заняв у мене 15 хвилин. Далі приблизно 45 хвилин я кодив і виправляв велику кількість багів.

Добре, що не опустився у рейтингу, у цьому контесті десь 2000 з 4000 і це була тільки одна задача, більше того вона була здана десь за годину (а там чим довше рішаєш, ти менше балів отримуєш)

Роздуми
Дійшов до висновку, може мені допоможе писати більше коментарів і до написаного у першому спойлері.

Щоб навчитися певного алгоритму, я рішав багато класифікованих задач з певної теми (теорія графів, динаміка ...)
Що робити, щоб покращувати свій кодинг?
Порадьте щось.

Прихований текст

Крім:
Програмуй далі, все прийде з практикою.
Перестань хвилюватися і все буде добре.

Це я і сам розумію

Прихований текст

Чому моя опера не знає "Передслово"?

2

Re: Як почати кодити те, що думаю і без багів?

Я вважаю що ви занадто вимогливі до себе, тому просто вчіть сі++ без олімпіад.

3

Re: Як почати кодити те, що думаю і без багів?

По моєму кома не втому місці , в заголовку.

4

Re: Як почати кодити те, що думаю і без багів?

Blast написав:

По моєму По-моєму, кома не втому місці , в заголовку.

А як на мене, там все правильно. Навіть русизмів нема.

5

Re: Як почати кодити те, що думаю і без багів?

На жаль, для швидкості нічого кращого за практику поки не придумали. І всі методи якісного програмування вимагають часу: подумати, скласти 3-4 UML-діаграми, посидіти над ними, виправити помилки в них, почати кодити, повернутися до діаграм, виправити, знову трохи покодити... Ну і не у всіх виходить швидко в будь-якому разі - багато нормальних програмістів ніколи нічого на олімпіадах не вигравали.
Що ж до того, як кодити те, що думаєте - спробуйте застосовувати функціональну декомпозицію. Перепишіть умову задачі так, щоб вона перетворилася на алгоритм, але лишилася в термінах умови (наприклад: ввести дані - знайти A - знайти з A B - вивести A і B). А потім починайте замінювати загальні слова ("знайти") на дрібніші частини ("для всіх елементів скласти і поділити", наприклад), доки кожне слово не можна буде замінити на вираз мови. Тільки робіть все ретельно, а то багато початківців люблять спочатку написати одне, а потім зробити зовсім інше - адже воно "і так теж працює". Вам же треба досягти того, щоб код працював саме так, як ви думаєте.

Подякували: Joker1

6

Re: Як почати кодити те, що думаю і без багів?

спочатку багацько діаграм, як каже пан koala, а потім я, наприклад, починаю кодірувать (хД) отим низсхідним програмуванням, чи то проектування низсхідне. Ну то коли йдете від здорових абстракцій до низу.
Наприклад, тре мені було сервер писати. І от я створюю клас Сервер, далі думаю, він має стартувати і зупинятись, додаю йому методи Старт і Стоп, роблю конструктор, аби ініціалізувати все, що тре, аби сервак запрацював, а потім методи роблю, прийняти дані, обробити дані, відправити дані.

7

Re: Як почати кодити те, що думаю і без багів?

Я вважаю що ви занадто вимогливі до себе

Хіба в цьому є щось погане?

На жаль, для швидкості нічого кращого за практику поки не придумали. І всі методи якісного програмування вимагають часу: подумати, скласти 3-4 UML-діаграми, посидіти над ними, виправити помилки в них, почати кодити, повернутися до діаграм, виправити, знову трохи покодити... Ну і не у всіх виходить швидко в будь-якому разі - багато нормальних програмістів ніколи нічого на олімпіадах не вигравали.
Що ж до того, як кодити те, що думаєте - спробуйте застосовувати функціональну декомпозицію. Перепишіть умову задачі так, щоб вона перетворилася на алгоритм, але лишилася в термінах умови (наприклад: ввести дані - знайти A - знайти з A B - вивести A і B). А потім починайте замінювати загальні слова ("знайти") на дрібніші частини ("для всіх елементів скласти і поділити", наприклад), доки кожне слово не можна буде замінити на вираз мови. Тільки робіть все ретельно, а то багато початківців люблять спочатку написати одне, а потім зробити зовсім інше - адже воно "і так теж працює". Вам же треба досягти того, щоб код працював саме так, як ви думаєте.

Дякую, так і спобую.

А коментарі варто писати? В якій кількості? Досі я писав їх тільки для тих, хто буде дивитися на мій код. Або код більший за 150 рядків. У олімпіадах взагалі ніколи не використовував їх.

8

Re: Як почати кодити те, що думаю і без багів?

Joker
Ідеальний код - код який не потребує коментування, а так як ідеального нічого не існує, то - коментарі мають допомагати зрозуміти логіку коду написаного. Та і пишуться вони і для Вас також, щоб ви через рік відкривши свій проект не думали, "блін, що я тут намагавсі зробити"

upd: От стаття з хабри про коментарі.

Подякували: Joker1

9

Re: Як почати кодити те, що думаю і без багів?

Добренько, значить треба і треба стільки, щоб було зрозуміло, що цей код має робити.

Щоб навчитися швидко і правильно складати кубік-рубік потрібно робити це регулярно. Здається з програмування те саме.

Значить висновок
1) Писати коментарі до коду;
2) Програмувати частіше;
3) Використовувати функціональну декомпозицію;
4) Добренько подумати;
5) Не хвилюватися;
6) Чекати і тренеруватися.

Нічого не забув?

10

Re: Як почати кодити те, що думаю і без багів?

0) Не спішити;

Подякували: A.N.Onim1

11

Re: Як почати кодити те, що думаю і без багів?

0) Не спішити

Тут є проблемка у мене. Я не боюся програти. Але коли я бачу, що подумавши я розв'яжу цю задачу, тоді я починаю спішити, панікувати, думаю що всі вже рішили її ще пів хвилини тому і всяке таке.

12

Re: Як почати кодити те, що думаю і без багів?

Ні до чого та бігатня не призведе, дух змагальності звичайно піднімає мотивацію, але погіршує якість коду. А програміст це не макака, якість його роботи не в тому хто швидше наіндусить 100 сторінок коду, просто пам'ятайте про це.

13

Re: Як почати кодити те, що думаю і без багів?

написав на карточці "Програміст не макака. Якість краща за швидкість" і приклеїв до принтера (майже перед очима)  :)
Може хоть якась мотивація

14

Re: Як почати кодити те, що думаю і без багів?

Blast написав:

По моєму кома не втому місці , в заголовку.

кома ставиться там, де є пауза (хоча б найменша)
на мою думку, там взагалі кома або зайва, або повинна стояти перед "і" ("Як почати кодити те що думаю" - читається на одному подиху і в кінці очікується логічне завершення речення,  "і без багів?" - йде як доповнення і змінюється трохи інтонація, але не значно, тому кому можна проігнорити)


Ваш хріновий грамар-наци

Подякували: koala1

15

Re: Як почати кодити те, що думаю і без багів?

На олімпіаді коментарі потрібні тільки вам, більше ніхто цей код використовувати не буде. Та й вам завтра цей код не потрібен. Так що можна їх робити тільки в найкритичніших місцях. Ну, або хіба лишати шматки умови в коді, щоб не заплутатися.

16

Re: Як почати кодити те, що думаю і без багів?

Якщо пишеться якийсь сладний кусок, то коментарі бажано написати перед тим як писати код, щоб самому уявляти, що має получитись  на виході.

17

Re: Як почати кодити те, що думаю і без багів?

знов скарги на себе
https://www.hackerrank.com/challenges/lonely-integer
Ну от прочитав. Думаю, що зара рішу за 5 хвилин. Зразу почав кодити. Начудив щось страшне.

Потім тато сів на 5 хвилинок за ноут. Я за той час взяв карточку і почав писати блок-схему до задачі (просто так).
І чомусь получилося норм, все пахає.

18 Востаннє редагувалося Joker (18.12.2014 17:13:42)

Re: Як почати кодити те, що думаю і без багів?

Доречі, ось код
І чомусь я спершу думав, що я це зроблю якось простіше

Прихований текст
#include <iostream>
#include <vector>
using namespace std;

int main()
{

    int n;
    cin >> n;

    vector<int> a(n);
    vector<bool> b(n, true);

    for (int i = 0; i < n; ++i)
        cin >> a[i];

    for (int i = 0; i < n; ++i)
    {
        for (int j = i + 1; j < n; ++j)
        {
            if (a[i] == a[j])
            {
                b[i] = b[j] = false;
                break;
            }
        }
    }


    for (int i = 0; i < a.size(); ++i)
    {
        if (b[i])
            cout << a[i] << endl;
    }


    system("pause");
    return 0;
}

Чи я знов щось начудив?

19

Re: Як почати кодити те, що думаю і без багів?

Cyan написав:
Blast написав:

По моєму кома не втому місці , в заголовку.

кома ставиться там, де є пауза (хоча б найменша)
на мою думку, там взагалі кома або зайва, або повинна стояти перед "і" ("Як почати кодити те що думаю" - читається на одному подиху і в кінці очікується логічне завершення речення,  "і без багів?" - йде як доповнення і змінюється трохи інтонація, але не значно, тому кому можна проігнорити)


Ваш хріновий грамар-наци

Я б написав так: «Як почати кодити те, що думаю, і без багів?»
(«що думаю» — на правах підрядного речення, тому виділяється комами).

20

Re: Як почати кодити те, що думаю і без багів?

Це ніби спрацює, але неоптимально.

Прихований текст
#include <iostream>
using namespace std;
int main() {
    int n, result = 0;
    cin >> n;
    while(n--)
    {
        int number;
        cin >> number;
        result ^= number;  
    }    
    cout << result;
    return 0;
}