Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2013, 21:58   #31
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Хм... Хотя и у коров есть "защита о дурака". Они не станут есть мясо. Поэтому в программах нужно учитывать все возможные входные данные (очевидные варианты и максимальное их количество)
Ну, возможно нужно сделать проверку на некие недопустимые символы. Но, передавая в функцию/метод строку с разделителями мы адаптируем алгоритм обработки строки к работе с ЛЮБЫМИ разделителями, что полностью решает проблемму данной дискуссии

Последний раз редактировалось Igor95; 02.09.2013 в 22:01.
Igor95 вне форума Ответить с цитированием
Старый 02.09.2013, 22:22   #32
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
Ну, возможно нужно сделать проверку на некие недопустимые символы. Но, передавая в функцию/метод строку с разделителями мы адаптируем алгоритм обработки строки к работе с ЛЮБЫМИ разделителями, что полностью решает проблемму данной дискуссии
Да, согласен. Почти всегда нужно писать защищённые программы, но бывают ситуации, когда точно знаешь, какие будут входные данные. Кто-то или что-то гарантирует это. Становится бессмысленным писать универсальную функцию с "защитой от дурака". Да и время дорого.

Я думаю, если в программе автора учесть все возможные знаки препинания, то она имеет право на жизнь.

вот начал заполнять строку знаков препинания: " ,.-\"!?:;\\~"

Input: "apple, apple\" green chelsea apple\\ chelsea"

Output: 3

main.cpp
Код:
#include <iostream>
#include <cstring>
using namespace std;

const int n = 100;

int main(int argc, char* argv[]) {
    char s[] = "apple, apple\" green chelsea apple\\ chelsea", *res[n];
    cout << s;
    int k = 0;
    res[k] = strtok(s, " ,.-\"!?:;\\~");
    while (res[k]) {
        k++;
        res[k] = strtok(NULL, " ,.-\"!?:;\\~");
    }
    int count = 0;
    for (int i = 0; i < k; i++) {
        bool b = true;
        for (int j = i + 1; j < k; j++) {
            if (!strcmp(res[i], res[j]))
                b = false;
        }
        if (!b)
            count++;
    }
    if (count)
        cout << "\n\nKolichestvo slov v stroke: " << count;
    else
        cout << "\n\nNOT FOUND";
    return 0;
}
В коде не разбирался, потестировал немного, вроде нормально работает. Только сделайте её для удобства в отдельной функции и передавайте в неё строку.
8Observer8 вне форума Ответить с цитированием
Старый 02.09.2013, 22:25   #33
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Да, согласен. Почти всегда нужно писать защищённые программы, но бывают ситуации, когда точно знаешь, какие будут входные данные. Кто-то или что-то гарантирует это. Становится бессмысленным писать универсальную функцию с "защитой от дурака". Да и время дорого.

Я думаю, если в программе автора учесть все возможные знаки препинания, то она имеет право на жизнь.

вот начал заполнять строку знаков препинания: " ,.-\"!?:;\\~"

Input: "apple, apple\" green chelsea apple\\ chelsea"

Output: 3

main.cpp
Код:
#include <iostream>
#include <cstring>
using namespace std;

const int n = 100;

int main(int argc, char* argv[]) {
    char s[] = "apple, apple\" green chelsea apple\\ chelsea", *res[n];
    cout << s;
    int k = 0;
    res[k] = strtok(s, " ,.-\"!?:;\\~");
    while (res[k]) {
        k++;
        res[k] = strtok(NULL, " ,.-\"!?:;\\~");
    }
    int count = 0;
    for (int i = 0; i < k; i++) {
        bool b = true;
        for (int j = i + 1; j < k; j++) {
            if (!strcmp(res[i], res[j]))
                b = false;
        }
        if (!b)
            count++;
    }
    if (count)
        cout << "\n\nKolichestvo slov v stroke: " << count;
    else
        cout << "\n\nNOT FOUND";
    return 0;
}
В коде не разбирался, потестировал немного, вроде нормально работает. Только сделайте её для удобства в отдельной функции и передавайте в неё строку.
Зачастую такой подход используют на олимпиадах. Но там критерий - время выполнения программы и ее правильность
С токенами может не пройти
Igor95 вне форума Ответить с цитированием
Старый 03.09.2013, 00:02   #34
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
Зачастую такой подход используют на олимпиадах. Но там критерий - время выполнения программы и ее правильность
С токенами может не пройти
Вы думаете с токенами по времени не пройдёт? Сможете протестить эту программу и свою на предмет скорости выполнения и сравнить?

Ограничения зависят от ситуации. Иногда можно пожертвовать временем выполнения и памятью в пользу минимального количества строк кода, а иногда нужно наоборот.

Я бы лучше через STL делал. Кода писать меньше -> вероятность ошибки меньше. STL писался профессионалами -> если правильно использовать, то получится вполне быстрая программа. Хотя всегда можно задать такие требования по времени, что ни один алгоритм не справится и не один компьютер в мире.

Последний раз редактировалось 8Observer8; 03.09.2013 в 00:05.
8Observer8 вне форума Ответить с цитированием
Старый 03.09.2013, 00:44   #35
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Вы думаете с токенами по времени не пройдёт? Сможете протестить эту программу и свою на предмет скорости выполнения и сравнить?

Ограничения зависят от ситуации. Иногда можно пожертвовать временем выполнения и памятью в пользу минимального количества строк кода, а иногда нужно наоборот.

Я бы лучше через STL делал. Кода писать меньше -> вероятность ошибки меньше. STL писался профессионалами -> если правильно использовать, то получится вполне быстрая программа. Хотя всегда можно задать такие требования по времени, что ни один алгоритм не справится и не один компьютер в мире.
Ну, качество программы количеством строк в коде не измеряется. Я тоже, кстати, склоняюсь к STL больше всего.
Igor95 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчитать количество слов в строке Chainik! Общие вопросы C/C++ 31 10.04.2016 01:55
Подсчет одинаковых слов в строке versegg Помощь студентам 0 27.05.2012 19:39
Количество одинаковых слов в строке. Delphi topside Помощь студентам 10 30.10.2011 23:05
Подсчитать количество слов и количество букв MDSIQ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.11.2010 16:57