Russian Qt Forum
Сентябрь 24, 2024, 00:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5 ... 12   Вниз
  Печать  
Автор Тема: Тренировка навыков быстрого программирования  (Прочитано 79950 раз)
8Observer8
Гость
« Ответ #30 : Февраль 13, 2014, 17:13 »

Разве решение задач не учит программированию?
Скажу так, учит основам.
Мое мнение, учится нужно на реальной большой задаче. Придумайте себе задачу, в которой будет все что вы хотите освоить и решайте ее, тогда вы сразу будете учится объединять решение маленьких подзадач для решения большой, сможете представлять систему целиком, продумывать ее архитектуру.
Решая только маленькие задачи вы это пропускаете.

Спасибо большое! Я буду тратить минимум времени в день не решение задач. Мне приходила в голову такая идея: начать писать проект, который будет включать в себя по максимуму из того, что мне нужно освоить. Я начну такую тему, как продумаю проект. Хочу чтобы меня направляли. Одному мне очень трудно.

Всем спасибо! Здесь буду писать вопросы по задачкам. Прошу всех помогать, кто как может. Igors, мне подкинул идею (и код), как организовать код в main.cpp. Выложу попозже.

Я понял, что во-порвых мне нужно учиться основам программирования по задачкам, а во-вторых, придумывать и реализовывать большой проект, архитектуру, которого описывать с помощью UML.

Вопросы по задачкам я буду задавать в этой теме, а проект писать в новой.

Я б посоветовал сразу идти в фирму младшим разработчиком на маленькую ЗП. Обычно берут, так как всегда есть задачка, которая не столь важна, а рук не хватает Улыбающийся

Там из тебя выбьют дурь про тестирование и прочее. Дадут реальную з/п, если будет хороший начальник, ещё и подъучит тебя нормальной разработке.

PS начинай писать программу с алгоритма работы Веселый

На маленькую зарплату и хочу.
Записан
Bepec
Гость
« Ответ #31 : Февраль 13, 2014, 17:31 »

Я б рекомендовал забыть о том, что пишут об "быстром" программировании.

Чтобы ускорять разработку - нужно уметь разрабатывать, строить архитектуру Улыбающийся

PS За то время, когда вы напишите тесты для  программки в 5-7к строк я напишу программу и оттестирую её. 

PPS кто-то из светил программирования на С++ даже написал статью - как я погнался за "красивым" кодом и потерял в эффективности.
Записан
8Observer8
Гость
« Ответ #32 : Февраль 13, 2014, 17:48 »

Я б рекомендовал забыть о том, что пишут об "быстром" программировании.
Чтобы ускорять разработку - нужно уметь разрабатывать, строить архитектуру Улыбающийся
PS За то время, когда вы напишите тесты для  программки в 5-7к строк я напишу программу и оттестирую её. 
PPS кто-то из светил программирования на С++ даже написал статью - как я погнался за "красивым" кодом и потерял в эффективности.

Я уже писал, что лично мне удобно писать сначала тесты, а потом код, так как если я знаю, что на входе и что ожидается на выходе, то могу с помощью тестов быстренько написать это соответствие. Всего лишь для острых моментов, это занимает минимум времени (именно, для задачек). Я говорю именно о функции, у которой есть вход и выход, и которая решает задачу. На практике может это и не нужно, так как только в задачах используются простые типы данных, а на практике функции, как правило, принимают объекты "непростых" типов. Ещё раз повторюсь, что мне так удобно решать задачки. Если я открою решение и захочу его улучшить, то я не боюсь, что-то испортить, так как после исправлений, я сразу запускаю тесты.
Записан
8Observer8
Гость
« Ответ #33 : Февраль 13, 2014, 17:50 »

Я сдал вот эту задачу: http://acmp.ru/?main=task&id_task=50

Она правильно решена, но я бы хотел услышать вашу критику кода, подхода к решению и т.д.

Я буду переписывать содержимое main.cpp, как посоветовал Igors в ответе #16. Меня сейчас интересует, то как можно улучшить и упростить код (который в функциях, а не в main). А может всё нормально?

Код:
#include <iostream>
#include <fstream>
#include <string>
#include <set>
using namespace std;

string shiftStringToLeft(const string &inStr) {
    string str = inStr;
    if (!str.empty()) {
        char c = str[0];
        str = str.substr(1, str.size() - 1);
        str.push_back(c);
    }
    return str;
}

void numberOfDifferentPermutations(const string &inStr, set<string> &outArray) {
    int n = inStr.size();
    string str = inStr;
    for (int i = 0; i < n; ++i) {
        outArray.insert(str);
        str = shiftStringToLeft(str);
    }
}

int amountOfSubstrings(string inStr, string substr) {
    int nfound = 0;
    size_t found = inStr.find(substr);
    while (found != string::npos) {
        nfound++;
        found = inStr.find(substr, found+1);
    }
    return nfound;
}

int nCyclicalSubstrings(string inStr, string substr) {
    set<string> outArray;
    numberOfDifferentPermutations(substr, outArray);
    set<string>::const_iterator it = outArray.begin();

    int nfound = 0;
    int size = outArray.size();
    for (int i = 0; i < size; ++i) {
        nfound += amountOfSubstrings(inStr, *it);
        it++;
    }

    return nfound;
}

int main(int argc, char** argv) {
    string inFileName = "input.txt";
    ifstream in;
    in.open(inFileName.c_str());
    if (!in.is_open()) {
        cerr << "Error: could not open the file " << inFileName.c_str() << endl;
        return 1;
    }

    string outFileName = "output.txt";
    ofstream out;
    out.open(outFileName.c_str());
    if (!out.is_open()) {
        cerr << "Error: could not open the file " << outFileName.c_str() << endl;
        in.close();
        return 1;
    }

    string str;
    string substr;
    if (in >> str >> substr) {
        int result = nCyclicalSubstrings(str, substr);
        out << result << endl;
    } else {
        cerr << "Error: incorrect data in the file " << inFileName.c_str() << endl;
        in.close();
        out.close();
        return 1;
    }

    in.close();
    out.close();
    return 0;
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #34 : Февраль 13, 2014, 18:32 »

писать тесты — нормально, но не когда ты только обучаешься программированию/разработке. имхо
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #35 : Февраль 13, 2014, 19:09 »

Я не спорю, выглядит ваш код очень умно и оригинально, но нихрена не понятно Веселый Особенно в функциях (моё мнение, конечно же)
Моя версия задачи.

PS нафига простейшую операцию из 13!!! строк разбивать на 4 функции с какими то передаточными аргументами - я этого не могу понять просто Веселый

PPS был у меня коллега с такой же проблемой. Пытался каждое действие разбивать на функции. Т.е. сесть на стул это
  • Проверить есть ли стул
  • Проверить поддерживается ли тип стула
  • Попытаться сесть
  • Проверить удобно ли сидеть
  • Проверить можно ли пододвинуть стул
  • Пододвинуть стул
В результате вместо взял стул, переставил, сел, пододвинул в 20 строк у него получался монстр с фабрикой для пары классов. Избыточно это.

Код:
#include <fstream>
#include <conio.h>
#include <iostream>

using namespace std;
int main(int argc, char *argv[])
{
ifstream input("input.txt");
if (!input)
{
exit(1);
}

string source ;
std::getline(input, source);
string findString;
std::getline(input, findString);
input.close();

if (findString.size() > source.size())
{
exit(1);
}

string recursiveString = findString;
int result = 0;
for (int i = 0;i != findString.size(); i++)
{
recursiveString.insert(0, 1, recursiveString[recursiveString.size()-1]);
recursiveString.erase(recursiveString.size()-1, 1);
int pos = -recursiveString.size();
while(true)
{
pos = source.find(recursiveString, pos+recursiveString.size());
if (pos!= -1)
result++;
else
break;
}
}
ofstream out("OUTPUT.txt");
if (out)
{
out << result;
}
exit(0);
}
« Последнее редактирование: Февраль 13, 2014, 19:23 от Bepec » Записан
Hrundel
Гость
« Ответ #36 : Февраль 13, 2014, 20:09 »

Если у тебя правда такое безумное желание стать младшим разрабом - вот тебе простейшая задача:

Напиши программу визуализирующую ненаправленые взвешанные графы до 50 узлов.

Условия к решению обычно прилагаются, поэтому даю условия:

1. Разработать структуру данных с вожмозностью быстрого перехода от узла к узлу по кантам.
2. Реализовать трассировку от любого узла.
3. Реализовать ввод данных из файла (парсинг) любого наиболее удовлетворяющего задаче формата файла.

Всё!

Люди скажите, для младшего разраба покатит?
Записан
Bepec
Гость
« Ответ #37 : Февраль 13, 2014, 20:14 »

Ххы... ты меня расстроил. Я не младший разраб  Плачущий
Записан
OKTA
Гость
« Ответ #38 : Февраль 13, 2014, 20:16 »

Забыли добавить последнее условие - нафига это вообще надо, чтобы знать, что делаешь что-то полезное  Смеющийся
Записан
Hrundel
Гость
« Ответ #39 : Февраль 13, 2014, 20:17 »

Ну, Верес, про тебя мы знаем, что ты не младший разраб  Смеющийся Но ты, зато, продвинутый программер в Qt. Знания у тебя широкие.

Забыли добавить последнее условие - нафига это вообще надо, чтобы знать, что делаешь что-то полезное  Смеющийся

Да, это хорошо сказано Веселый
Записан
Bepec
Гость
« Ответ #40 : Февраль 14, 2014, 00:24 »

Я вот ещё заметил что по стилю кода ТС ближе к C#, чем к С++ Улыбающийся

to Hrundel Эммм... Какая ещё информация на меня у вас есть?
Записан
8Observer8
Гость
« Ответ #41 : Февраль 14, 2014, 09:09 »

Я не спорю, выглядит ваш код очень умно и оригинально, но нихрена не понятно Веселый Особенно в функциях (моё мнение, конечно же)
Моя версия задачи.

PS нафига простейшую операцию из 13!!! строк разбивать на 4 функции с какими то передаточными аргументами - я этого не могу понять просто Веселый

PPS был у меня коллега с такой же проблемой. Пытался каждое действие разбивать на функции. Т.е. сесть на стул это
  • Проверить есть ли стул
  • Проверить поддерживается ли тип стула
  • Попытаться сесть
  • Проверить удобно ли сидеть
  • Проверить можно ли пододвинуть стул
  • Пододвинуть стул
В результате вместо взял стул, переставил, сел, пододвинул в 20 строк у него получался монстр с фабрикой для пары классов. Избыточно это.

Код:
#include <fstream>
#include <conio.h>
#include <iostream>

using namespace std;
int main(int argc, char *argv[])
{
ifstream input("input.txt");
if (!input)
{
exit(1);
}

string source ;
std::getline(input, source);
string findString;
std::getline(input, findString);
input.close();

if (findString.size() > source.size())
{
exit(1);
}

string recursiveString = findString;
int result = 0;
for (int i = 0;i != findString.size(); i++)
{
recursiveString.insert(0, 1, recursiveString[recursiveString.size()-1]);
recursiveString.erase(recursiveString.size()-1, 1);
int pos = -recursiveString.size();
while(true)
{
pos = source.find(recursiveString, pos+recursiveString.size());
if (pos!= -1)
result++;
else
break;
}
}
ofstream out("OUTPUT.txt");
if (out)
{
out << result;
}
exit(0);
}

Спасибо за попытку, но Ваша программа неверно работает. Её нужно сдать внизу страницы: http://acmp.ru/?main=task&id_task=50

С замечаниями по поводу архитектуры - полностью согласен. Я нагородил кучу функций. Буду улучшать. Как говорится - рефакторить.
« Последнее редактирование: Февраль 14, 2014, 09:14 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #42 : Февраль 14, 2014, 10:00 »

Я вот ещё заметил что по стилю кода ТС ближе к C#, чем к С++ Улыбающийся

Не знаю, что именно Вас сподвигло на такие размышления, но действительно сейчас я параллельно изучаю C#, потому что моя подруга учится на втором курсе и они сейчас начали  в этом семестре проходить C#. Мы вместе делаем лабораторки. Точнее она делает, а я ей помогаю. Она большая молодец. Очень старается. В нашем проекте, который мы сейчас пишем, пользователь вводит лекарства (название, цену, серийный номер, тип). Он может отсортировать массив лекарств по заданому полю и выводить на экран список лекарств. Я ей лишь помог реализовать сортировку и немного улучшить код. Если кому будет интересна сортировка объектов по заданому полю (или есть предложения по улучшению архитектуры), то вот наша текущая работа (предупреждаю, что это черновая работа и там ещё много чего нужно улучшать) http://codepad.org/n6jHdTjO

У меня, кстати, появилась идея реализовывать тоже cамое на Qt (для этого будет другая тема). Тут есть и наследование и какое-то уже "полезное" приложение с сортировой по полю массива объектов. Вот бы ещё базу данных прикрутить... SQLite например, я о ней немного читал и пробовал работать с ней (сохранять и читать строки таблицы, редактировать таблицу). Хотя в списке вопросов для подготовки нет баз данных. Ну хотя бы без базы данных, а в бинарный файл сохранять лекарства. А то может только время потрачу на БД, а в работе это не пригодится.
« Последнее редактирование: Февраль 14, 2014, 10:06 от 8Observer8 » Записан
Bepec
Гость
« Ответ #43 : Февраль 14, 2014, 10:42 »

По секрету - именно в стиле C# работа со строками у вас.

PS не могу сказать в чем причина "неприятия" системы Улыбающийся Вроде условию удовлетворяет.
Записан
8Observer8
Гость
« Ответ #44 : Февраль 14, 2014, 11:31 »

PS не могу сказать в чем причина "неприятия" системы Улыбающийся Вроде условию удовлетворяет.

Я доберусь на Вашей программы Улыбающийся Сейчас свою улучшаю, как написал Igors.
Записан
Страниц: 1 2 [3] 4 5 ... 12   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.