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

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

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

Внимание! Эта тема перетекла, в следующую тему, в шапку которой я буду добавлять изменения/добавления. Вам достаточно будет подписаться на неё. О всех измененияx/добавленияx я буду извещать: http://www.prog.org.ru/topic_26944_0.html

Привет!

Решил для тренировки навыков быстрого программирования ежедневно уделять время решению задач с этого ресурса: http://acmp.ru/?main=tasks

Здесь я прошу помощи в решении задач. Как решить задачу, используя STL, c минимальным количеством строк кода. Будет много вопросов. Пока я решаю только простые задачки. Позже опишу конкретные вопросы.

Как альтернативу можете предлагать свои решения с использованием C++11 и Boost. К сожалению, сервер с задачами не принимает решения C++11 и Boost. Поэтому они будут просто для демонстрации. Я буду изучать C++11 и Boost, поэтому мне это крайне интересно.

О методологии быстрой разработки я узнаю из книги: "Принципы, паттерны и методики гибкой разработки на языке C#"

Хотя там на примере C# на самом деле её поймут и джависты и приплюснутые. Книга не о языке.

Скачать:http://rutracker.org/forum/viewtopic.php?t=4295746
Исходники: http://www.objectmentor.com/PPP/

Классная книжка. Правда я только по диагонали прочитал первую часть: "Часть 1. Быстрая разработка ПО"

Одно из главных мест в быстрой разработке занимает "Разработка через тестирование"

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

Как написано здесь: http://acmp.ru/article.asp?id_text=118
Решение задач учит быстро программировать:
Цитировать
В отличии от обычных программ, создаваемых программистами повседневно, класс олимпиадных задач достаточно узок, но практичен с точки критериев выявления способности участников программировать за короткий срок. Как правило, олимпиадная задача представляет собой некоторую проблему, для решения которой требуется использовать свой IQ почти напределе, однако, сам текст программы может быть совсем незначительным и помещаться на одной странице.

Решаю задачи так. Сначала пишу заглушку для функции. Потом создаю тест (в среде NetBeans тесты создаются легко и быстро, поддержка CppUnit встроена в среду; NetBeans так же поддерживает разработку на Qt). Описываю весь функционал этой функции в тесте. После первого запуска тестов мы имеем красную полосу. В данном примере она почти пустая, так как функция возвращает ноль и это совпало с одним из тестов:



Теперь нужно реализовывать постепенно функционал, чтобы удовлетворить всем тестам. Как только что-то напишем в функции, то тут же запускаем тест (Alt+F6), чтобы удостовериться, что мы продвинулись дальше по красной полосе и что ничего не испортили. Когда весь функционал будет реализован, то полоса станет зелёной. На рисунке выше, кстати, решение простой задачки с разрезанием торта: http://acmp.ru/index.asp?main=task&id_task=539

Написал пошаговую инструкцию по разработке через тестирование на C++ в среде NetBeans на примере решения задачи с acmp.ru: http://notes.orgfree.com/tdd_cpp.php

Вот решение задачи с тортом http://acmp.ru/index.asp?main=task&id_task=539 и тесты для неё:
main.cpp
Код:
/* 
 * File:   main.cpp
 * Author: Ivan
 *
 * Created on January 7, 2014, 2:30 PM
 */

#include <iostream>
#include <fstream>
using namespace std;

int cuttingOfCake(int nmen) {
    int result = 0;
    
    if ((nmen == 0) || (nmen == 1)) {
        result = 0;
    } else if (nmen%2 == 0) {
        result = nmen / 2;
    } else {
        result = nmen;
    }
    
    return result;
}

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;
    }

    int nmen;
    if (in >> nmen) {
        int result = cuttingOfCake(nmen);
        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;
}

newtestclass.cpp
Код:
/*
 * File:   newtestclass.cpp
 * Author: Ivan
 *
 * Created on Jan 7, 2014, 2:53:05 PM
 */

#include "newtestclass.h"


CPPUNIT_TEST_SUITE_REGISTRATION(newtestclass);

newtestclass::newtestclass() {
}

newtestclass::~newtestclass() {
}

void newtestclass::setUp() {
}

void newtestclass::tearDown() {
}

int cuttingOfCake(int nmen);

void newtestclass::testCuttingOfCake_001() {
    int nmen = 2;
    int actual = cuttingOfCake(nmen);
    int expected = 1;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testCuttingOfCake_002() {
    int nmen = 3;
    int actual = cuttingOfCake(nmen);
    int expected = 3;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testCuttingOfCake_003() {
    int nmen = 4;
    int actual = cuttingOfCake(nmen);
    int expected = 2;
    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testCuttingOfCake_004() {
    int nmen = 5;
    int actual = cuttingOfCake(nmen);
    int expected = 5;

    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testCuttingOfCake_005() {
    int nmen = 6;
    int actual = cuttingOfCake(nmen);
    int expected = 3;

    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testCuttingOfCake_006() {
    int nmen = 7;
    int actual = cuttingOfCake(nmen);
    int expected = 7;

    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testCuttingOfCake_007() {
    int nmen = 8;
    int actual = cuttingOfCake(nmen);
    int expected = 4;

    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testCuttingOfCake_008() {
    int nmen = 0;
    int actual = cuttingOfCake(nmen);
    int expected = 0;

    CPPUNIT_ASSERT_EQUAL(expected, actual);
}

void newtestclass::testCuttingOfCake_009() {
    int nmen = 1;
    int actual = cuttingOfCake(nmen);
    int expected = 0;

    CPPUNIT_ASSERT_EQUAL(expected, actual);
}
« Последнее редактирование: Июнь 26, 2014, 09:02 от 8Observer8 » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


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

Этот ресурс - не место для бложиков. Заведи себе аккаунт где нить еще и там пости свои философские мысли, ИМХО. Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
8Observer8
Гость
« Ответ #2 : Февраль 13, 2014, 11:27 »

У меня проблема с этой задачей: http://acmp.ru/index.asp?main=task&id_task=272

В входном файле не написано сколько будет элементов в массиве.

Я в цикле while считываю значение, пока считывается и проверяю корректно ли оно:

Код:
    vector<int> arr;
    int value;
    string input;
    stringstream stream;
    while (in >> input) {
        stream << input;
        if (stream >> value) {
            cout << value << endl;
        } else {
            cerr << "Error: incorrect data in the file " << inFileName.c_str() << endl;
            in.close();
            out.close();
            return 1;
        }
    }

Вот весь код:
Код:
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

int sumOfMaxAndMin(const vector<int>& arr) {
    int sum = 0;

    return sum;
}

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;
    }

    vector<int> arr;
    int value;
    string input;
    stringstream stream;
    while (in >> input) {
        stream << input;
        if (stream >> value) {
            cout << value << endl;
        } else {
            cerr << "Error: incorrect data in the file " << inFileName.c_str() << endl;
            in.close();
            out.close();
            return 1;
        }
    }

    int sum = sumOfMaxAndMin(arr);
    out << sum << endl;

    in.close();
    out.close();
    return 0;
}

В файле input.txt у меня это:
1 -2 3 -4 5

Но почему-то выдаётся сообщение: Error: incorrect data in the file

Скорее всего ловится перевод строки. Как считать числа в массив если неизвеcтно их количество?
« Последнее редактирование: Февраль 13, 2014, 11:29 от 8Observer8 » Записан
OKTA
Гость
« Ответ #3 : Февраль 13, 2014, 11:33 »

Прочитай какую-нибудь книжку по Си и поймешь, что нафиг не нужны никакие векторы, стринги и стрингстримы для реализации очень и очень многих функций, а главное код будет короче, понятнее и бысрее Смеющийся извини, но плюнул читать уже на середине - не читается Смеющийся
Записан
8Observer8
Гость
« Ответ #4 : Февраль 13, 2014, 11:43 »

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

Мне не нужен Си, а нужен C++ и STL.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Февраль 13, 2014, 12:29 »

Как считать числа в массив если неизвеcтно их количество?
Код
C++ (Qt)
while (in >> val)
arr.push_back(val);
 

В целом тема производит впечатление поверхности, торопливости, словом - халтура. 
Записан
Hrundel
Гость
« Ответ #6 : Февраль 13, 2014, 12:47 »

А какое отношение имеет все это к Qt форуму???

Не стоит ли с подобными вопросами отправиться куда-нибудь типа cyberforum.ru. Там и по башке настучат как следует. И вообще, начнешь ценить время людей и приличное общение.

И что значит - "не нуежн си" Непонимающий В первом семестре мы писали только на си. Когда си полностью освоили, что смогли проги с консольной графикой писать, только тогда уже перешли на  спп.
Я бы даже попросил модератора удалить эту тему.
« Последнее редактирование: Февраль 13, 2014, 12:53 от Hrundel » Записан
8Observer8
Гость
« Ответ #7 : Февраль 13, 2014, 13:02 »

А какое отношение имеет все это к Qt форуму???

Не стоит ли с подобными вопросами отправиться куда-нибудь типа cyberforum.ru. Там и по башке настучат как следует. И вообще, начнешь ценить время людей и приличное общение.

И что значит - "не нуежн си" Непонимающий В первом семестре мы писали только на си. Когда си полностью освоили, что смогли проги с консольной графикой писать, только тогда уже перешли на  спп.
Я бы даже попросил модератора удалить эту тему.

Я знаю Си. K$R прочитан полностью и почти все задачи решил. Писал немного на WinAPI и Си, когда в КБ работал инженером-конструктором.

У меня нет времени бегать по форумам. Я выбрал этот. Он мне очень понравился. Тут классное управление, минимум рекламы (в отличае от cyberforum.ru), а самое главное, что тут много адекватных людей. Я не уйду никуда. Хочу остановиться именно на этом форуме и точка.
« Последнее редактирование: Февраль 13, 2014, 13:20 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #8 : Февраль 13, 2014, 13:15 »

Как считать числа в массив если неизвеcтно их количество?
Код
C++ (Qt)
while (in >> val)
arr.push_back(val);
 

Так не пойдёт. Мне нужно проверять значение val и если оно не целое, то выдавать сообщение: Error: incorrect data in the file

В целом тема производит впечатление поверхности, торопливости, словом - халтура.  
Значит Вы не поняли. Грустно Грустный Лучше бы сказали, чем профи сейчас пользуются.

Я слышал, что googletest популярен. Его можно для Qt приспособить?
« Последнее редактирование: Февраль 13, 2014, 13:19 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #9 : Февраль 13, 2014, 13:24 »

Я заметил в пошаговом режиме, что вылетает на втором проходе цикла:

Код:
    vector<int> arr;
    int value;
    string input;
    stringstream stream;
    while (in >> input) {
        stream << input;
        if (stream >> value) {
            cout << value << endl;
            arr.push_back(value);
        } else {
            cerr << "Error: incorrect data in the file " << inFileName.c_str() << endl;
            in.close();
            out.close();
            return 1;
        }
    }
Записан
8Observer8
Гость
« Ответ #10 : Февраль 13, 2014, 13:30 »

Я кажется понял. Объект stream накапливает в себе элементы, поэтому на втором шаге в нём хранятся уже два элемента и операция "stream >> value" выдаёт false.

Я попробовал очистить:

Код:
stream.clear();

Всё равно не помогает Грустный
Записан
Bepec
Гость
« Ответ #11 : Февраль 13, 2014, 13:38 »

Присоединяюсь к вышеотписавшимся - переносите свою чудо тему в говорилку. И тут не блог, а форум по Qt.

Записан
8Observer8
Гость
« Ответ #12 : Февраль 13, 2014, 13:43 »

Присоединяюсь к вышеотписавшимся - переносите свою чудо тему в говорилку. И тут не блог, а форум по Qt.

Я же просил помочь мне задачи по програмированию решать. Я просто кратко описал, как я это делаю. Думал, что кому-то это пригодиться. Что тут плохого? Если я Вас раздрожаю чем-то, то просто не открывайте мои темы.

Я нашёл решение, как считать массив и при этом проверять корректность данных:

Код:
    vector<int> arr;
    int value;
    string input;
    while (in >> input) {
        if (stringstream(input) >> value) {
            cout << value << endl;
            arr.push_back(value);
        } else {
            cerr << "Error: incorrect data in the file " << inFileName.c_str() << endl;
            in.close();
            out.close();
            return 1;
        }
    }
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Так не пойдёт. Мне нужно проверять значение val и если оно не целое, то выдавать сообщение: Error: incorrect data in the file
Тогда после цикла добавьте
Код
C++ (Qt)
if (!in.eof())
// печать ошибки
 

Я знаю Си. K$R прочитан полностью и почти все задачи решил. Писал немного на WinAPI и Си, когда в КБ работал инженером-конструктором.
В базовых вещах "плаваете" капитально, опыта/кладки почти нет. Ну не пишет программист 3 раза in.close(), не валит все в main и.т.д.

Я не уйду никуда. Хочу остановиться именно на этом форуме и точка.
Вас никто не гонит Улыбающийся  Но тренировки "на скорость" явно преждевременны
Записан
8Observer8
Гость
« Ответ #14 : Февраль 13, 2014, 13:52 »

Так не пойдёт. Мне нужно проверять значение val и если оно не целое, то выдавать сообщение: Error: incorrect data in the file
Тогда после цикла добавьте
Код
C++ (Qt)
if (!in.eof())
// печать ошибки
 

А как я написал выше пойдёт?

Я знаю Си. K$R прочитан полностью и почти все задачи решил. Писал немного на WinAPI и Си, когда в КБ работал инженером-конструктором.
В базовых вещах "плаваете" капитально, опыта/кладки почти нет. Ну не пишет программист 3 раза in.close(), не валит все в main и.т.д.
Я валю всё в main.cpp, потому что сервер принимает только один файл - main.cpp.

Как мне не писать in.close() 3 раза. Покажите, пожалуйста:

Код:
/* 
 * File:   main.cpp
 * Author: Ivan
 *
 * Created on January 7, 2014, 10:33 AM
 */

#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;

int sumOfMaxAndMin(const vector<int>& arr) {
    int sum = 0;

    return sum;
}

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;
    }

    vector<int> arr;
    int value;
    string input;
    while (in >> input) {
        if (stringstream(input) >> value) {
            arr.push_back(value);
        } else {
            cerr << "Error: incorrect data in the file " << inFileName.c_str() << endl;
            in.close();
            out.close();
            return 1;
        }
    }

    int sum = sumOfMaxAndMin(arr);
    out << sum << endl;

    in.close();
    out.close();
    return 0;
}

Я не уйду никуда. Хочу остановиться именно на этом форуме и точка.
Вас никто не гонит Улыбающийся  Но тренировки "на скорость" явно преждевременны

Я не на скорость решаю, а чтобы правильно задачи научиться решать, используя для этого STL.
« Последнее редактирование: Февраль 13, 2014, 13:54 от 8Observer8 » Записан
Страниц: [1] 2 3 ... 12   Вверх
  Печать  
 
Перейти в:  


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