Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
dakuenjery
18 / 15 / 3
Регистрация: 13.06.2011
Сообщений: 116
#1

Найти лучшее решение - C++

10.07.2011, 15:07. Просмотров 787. Ответов 16
Метки нет (Все метки)

Вот задание
Напишите программу, которая использует приведенные строки при подсчете количества слов в строке sentance и выявляет самые большие и самые маленькие из них. Если самую большую или самую маленькую длину имеют несколько слов отобразить все.

Вот мой код, но я думаю, что это не самое оптимальное решение
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
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
using namespace std;
 
int main()
{
    int cntWords = 0;
    int word = 0, minword = 100, maxword = 0;
    int min = 0, max = 0;
 
    vector<string> strMin(1, "string");
    vector<string> strMax(1);
 
    string line1 = "We were her pride of 10 she named us:";
    string line2 = "Benjamin, Phoenix, the Prodigal";
    string line3 = "and perspicacious pacific Suzanne";
 
 
    string sentance = line1 + ' ' + line2 + ' ' + line3;
 
    unsigned int i;
    for(i=0; i<sentance.size(); ++i){
        if(isalpha(sentance[i])){
            while((sentance[i] != ' ' && sentance[i] != ':')
                  && i<sentance.size() ){
                ++word;
                ++i;
            }
            ++cntWords;
        
            if(minword > word){
                minword = word;
            }
 
            if(maxword < word){
                maxword = word;
            }
 
            word = 0;
        }
    }
 
 
    for(i=0; i<sentance.size(); ++i){
        if(isalpha(sentance[i])){
            while(isalpha(sentance[i]) && i<sentance.size() ){
                ++word;
                ++i;
            }
    
            if(minword == word){
        strMin.push_back(" ");
                strMin[min].assign(sentance, i-word, word);
 
        ++min;
            }
 
            if(maxword == word){
        strMax.push_back(" ");
                strMax[max].assign(sentance, i-word, word);
 
        ++max;
            }
 
            word = 0;
        }
    }
 
    cout << "Количество слов " << cntWords << endl;
 
    int a=0;
    cout << "Самые мальнькие слова" << endl;
    while(strMin.size() > a){
        cout << strMin[a] << endl;
        ++a;
    }
 
    a=0;
    cout << "Самые большие слова" << endl;
    while(strMax.size() > a){
        cout << strMax[a] << endl;
        ++a;
    }
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2011, 15:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти лучшее решение (C++):

Найти решение СЛАУ - C++
#include &lt;iostream&gt; #include &lt;math.h&gt;0 using namespace std; double minor_ij(int,int); // minor – алгебрарическое дополнение double...

Найти решение неравенства - C++
Для производных a,b вычислить решение неравенства (x^2+b)(ax-1)&lt;=0 Помогите пожалуйста

Найти решение системы уравнений - C++
Здравствуйте. Помогите, пожалуйста, составить программу. Найти решение системы линейных уравнений вида A1·x + B1·y = C1, A2·x + B2·y =...

необходимо найти решение, пожалуйста - C++
На остановке останавливаются троллейбусы с разными номерами. Сообщение о том, что к остановке подошел троллейбус с номером N1 несет 4 бита...

Найти численное решение уравнения - C++
Найти численное решение уравнения c точностью до 0,00001 cos(x)=tg(x/2) Угол x задается в градусах.

Найти решение нелинейного уравнения - C++
Найдите такое число x, что x^2 + \sqrt{x} = C Вводится единственное число С; Вывод - число х с не менее 6 знаками после запятой

16
insolent
826 / 344 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
10.07.2011, 16:50 #2
Мой вариант:
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
 
using namespace  std;
 
void Tokenize(const string& str,
              vector<string>& tokens,
              const string& delimiters = " ")
{
    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
    string::size_type pos     = str.find_first_of(delimiters, lastPos);
 
    while (string::npos != pos || string::npos != lastPos)
    {
        tokens.push_back(str.substr(lastPos, pos - lastPos));
        lastPos = str.find_first_not_of(delimiters, pos);
        pos = str.find_first_of(delimiters, lastPos);
    }
}
 
bool myfn(string i, string j) { return i.size()<j.size(); }
 
int main(int argc, char* argv[])
{
    string line1 = "We were her pride of 10 she named us:";;
    string line2 = "Benjamin, Phoenix, the Prodigal";
    string line3 = "and perspicacious pacific Suzanne";
 
    string sentance = line1 + ' ' + line2 + ' ' + line3;
 
    vector<string> tokens;
    vector<string>::iterator it;
 
    ostream_iterator<string> cit(cout, "\n");
 
    Tokenize(sentance, tokens);
 
    cout << "Sentance: " << sentance << endl;
    cout << "\nSentance has " << tokens.size() << " word." << endl;
 
    vector<string>::iterator sWord = min_element(tokens.begin(), tokens.end(), myfn);
    vector<string>::iterator bWord = max_element(tokens.begin(), tokens.end(), myfn);
 
    cout << "\nSentance' word:" << endl;
    copy(tokens.begin(), tokens.end(), cit);
 
    cout << "\nThe biggest word: " << endl;
    for (it = tokens.begin(); it != tokens.end(); it++)
    {
        if (it->size() >= bWord->size())
            cit = *it;
    }
 
    cout << "\nThe smallest word: " << endl;
    for (it = tokens.begin(); it != tokens.end(); it++)
    {
        if (it->size() <= sWord->size())
            cit = *it;
    }
 
    cin.get();
    return 0;
}
0
dakuenjery
18 / 15 / 3
Регистрация: 13.06.2011
Сообщений: 116
10.07.2011, 17:19  [ТС] #3

А можешь объяснить, как оно работает??)

Добавлено через 12 минут
g++ -o main main.cpp && ./main
main.cpp: В функции «int main(int, char**)»:
main.cpp:36:9: ошибка: нет декларации «ostream_iterator» в этой области видимости
main.cpp:36:32: ошибка: expected primary-expression before «>» token
main.cpp:36:48: ошибка: нет декларации «cit» в этой области видимости

На 36 строке ошибка
0
Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
10.07.2011, 17:37 #4
2 dakuenjery - задание из 6 главы по книге Липпмана, сам недавно его выполнял.
На мой взгляд - Вам код нужно разбить на отдельные функции и уже вызывать их в main().
Подход разбивать задачи на отдельные ячейки (в данном случае функции) - очень практичен.
Я решил данную задачу исходя из того, что нам потребуется новый вектор со словами максимальной длины и новый вектор со словами минимальной длины для дальнейшей работы с ними.
Вот мой вариант решения, в котором я для себя писал комментарии и использовал только те знания, которые почерпнул из предыдущих глав ( до главы номер 6 ) и этой главы ( глава номер 6 ):

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
#include <iostream>
#include <string>
#include <vector>
 
using namespace std;
 
//функция разбиения строки на слова
vector < string >* separate_words( string *line ) {
    string::size_type pos, prev; //позиция конца слова и начала
    const string delims( " \t\n.,?!;:\"" ); //разграничители слов
    vector < string > *sv_separated_words = new vector < string > ;
 
    //нахождение начала первого слова
    prev = line->find_first_not_of( delims );
 
    // пока prev не равняется "not found" (т.е. найдено начало слова)
    while ( prev != string::npos ) {
        //нахождение разделителя (ограничителя) - конца слова
        pos = line->find_first_of( delims, prev );
        sv_separated_words->push_back( line->substr( prev, pos == string::npos ? string::npos : pos - prev ) ); //вставка очередного слова
        // нахождение начала следующего слова
        prev = line->find_first_not_of( delims, pos );
    }
 
    return sv_separated_words;
}
 
vector < string >* fill_sv_min( vector < string >* sv) {
    vector < string >::iterator it = sv->begin();
    string::size_type min_len = sv->begin()->length();
    vector < string >* sv_min = new vector < string >;
 
    for (; it != sv->end(); ++it ) {
 
            if ( it->length() == min_len ) { //если нашли слово такой же длины как и минимальное, то
                sv_min->push_back( *it ); // и его добавляем в вектор
            }
 
            if ( it->length() < min_len ) { //если найдено слово меньшей длины
                min_len = it->length(); //новая минимальная длина
                sv_min->erase( sv_min->begin(), sv_min->end() ); //очищаем вектор от всех предыдущих слов
                sv_min->push_back( *it ); //всталяем новое минимальное слово
            }
        }
 
    return sv_min;
}
 
vector < string >* fill_sv_max( vector < string >* sv) {
    vector < string >::iterator it = sv->begin();
    string::size_type max_len = 0;
    vector < string >* sv_max = new vector < string >;
 
    for ( ; it != sv->end(); ++it ) {
 
            if ( it->length() == max_len ) { //если нашли слово такой же длины как и максимальное, то
                sv_max->push_back( *it ); // и его добавляем в вектор
            }
 
            if ( it->length() > max_len ) { //если найдено слово болшей длины
                max_len = it->length(); //новая максимальная длина
                sv_max->erase( sv_max->begin(), sv_max->end() ); //очищаем вектор от всех предыдущих слов
                sv_max->push_back( *it ); //всталяем новое максимальное слово
            }
        }
 
    return sv_max;
 
}
 
//печать вектора
void print_sv (vector <string>* sv ){
 
    string::size_type i = 0;
    for (vector < string >::iterator it = sv->begin(); it != sv->end(); ++it, ++i )
        cout << "( " << i << " ) " <<  *it << endl;
}
 
int main() {
 
    vector < string > *my_sv_max; //указател на вектор для хранения слов максимальной длины
    vector < string > *my_sv_min; //указатель на вектор для хранения слов минимальной длины
    vector < string > *my_sv; // указатель на вектор для хранения всех слов
    string line1 = "We were her pride of 100000 she named us --------------- ";
    string line2 = "Benjamin, Phoenix, the Prodigal ";
    string line3 = "and perspicacious 77 pacific Suzanne 444444444444444 666666666666666 33 55 88 99";
    string sentence = line1 + line2 + line3; //строка, в которой ищутся слова
 
    my_sv = separate_words( &sentence );  //делим строку на слова и сохраняем ее в векторе my_sv
    my_sv_max = fill_sv_max( my_sv );  //выводим все слова максимальной длины из вектора my_sv и сохраняем их в векторе my_sv_max
    my_sv_min = fill_sv_min( my_sv );  //выводим все слова минимальной длины из вектора my_sv и сохраняем их в векторе my_sv_min
 
    //выводим на экран вектора my_sv_max и my_sv_min
    cout << "Максимальная длина слова начальной строки = " << my_sv_max->begin()->length() << endl;
    cout << "Слова максимальной длины из начальной строки строки:" << endl;
    print_sv( my_sv_max );
    cout << "Минимальная длина слова начальной строки = " << my_sv_min->begin()->length() << endl;
    cout << "Слова мнимальной длины из начальной строки строки:" << endl;
    print_sv( my_sv_min );
 
    return 0;
}


Чтобы скомпилировать вариант от insolent добавь

C++
1
#include <iterator>
0
dakuenjery
18 / 15 / 3
Регистрация: 13.06.2011
Сообщений: 116
10.07.2011, 17:51  [ТС] #5
2 Roof, у меня была идея разбить строки на слова, но потом подумал, что это будет слишком затратно.

Но какой то вывод странный)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
g++ -o main main.cpp && ./main
Максимальная длина слова начальной строки = 15
Слова максимальной длины из начальной строки строки:
( 0 ) ---------------
( 1 ) 444444444444444
( 2 ) 666666666666666
Минимальная длина слова начальной строки = 2
Слова мнимальной длины из начальной строки строки:
( 0 ) We
( 1 ) of
( 2 ) us
( 3 ) 77
( 4 ) 33
( 5 ) 55
( 6 ) 88
( 7 ) 99
Числа откуда то взялись и слово "of" твой код не нашел

Добавлено через 38 секунд
А у insolent слова "us" не находит)
0
Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
10.07.2011, 17:54 #6
Я очень долго экспериментировал с данными в учебнике строками и в итоге они приобрели вид:
C++
1
2
3
4
string line1 = "We were her pride of 100000 she named us --------------- ";
        string line2 = "Benjamin, Phoenix, the Prodigal ";
        string line3 = "and perspicacious 77 pacific Suzanne 444444444444444 666666666666666 33 55 88 99";
        string sentence = line1 + line2 + line3; //строка, в которой ищутся слова
Как это не нашел?
( 1 ) of
число в скобках - просто номер слова - максимальной или минимальной длины соответственно.
Просто я несколько изменил строки, которые были изначально даны в учебнике. И добавил длинные и короткие последовательности из цифр для того чтобы тестировать свою программу.

2 Roof, у меня была идея разбить строки на слова, но потом подумал, что это будет слишком затратно.
И ничего затратного лично я не вижу в том чтобы разбить строки на слова и потом искать среди них слова максимальной и минимальной длины. Как я и говорил - я решил получить отдельные вектора содержащие слова минимальной и максимальной длины для того чтобы можно было дальше работать с ними уже отдельно, не обращаясь к первоначальной строке, вдруг первоначальная строка будет огромной.
0
dakuenjery
18 / 15 / 3
Регистрация: 13.06.2011
Сообщений: 116
10.07.2011, 18:04  [ТС] #7
C++
1
string line1 = "We were her pride [B]of[/B] 100000 she named us --------------- ";
Слово "of" у тебя есть. Да и мне кажется, ты код немного загрузил)

Добавлено через 4 минуты
Так значит, ты тоже Липпмана чинаешь?! Будем если что делиться идеями) ОК?
0
Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
10.07.2011, 18:05 #8
Сбил меня с толку с этим of - я раз 10 сообщение это переправлял
Перечитай мое сообщение выше.
0
dakuenjery
18 / 15 / 3
Регистрация: 13.06.2011
Сообщений: 116
10.07.2011, 18:09  [ТС] #9
Дадада) чет я прогнал) Бывает
0
Roof
10.07.2011, 18:40
  #10

Не по теме:


Так значит, ты тоже Липпмана чинаешь?! Будем если что делиться идеями) ОК?
Все сказанное ниже - лишь мое личное мнение.
Основная идея такова - внимательно и подробно и честно разбирать каждый пример, приведенный в книге, начиная с главы 3. Выполнять все упражнения, которые он приводит после многих разделов. Закреплять практикой - простыми задачками. Это долго, но это того стоит - именно так можно чему-то научиться. Ты реализовал классы iStack и iList, которые он рассматривал в предыдущих главах? Если нет - начни с главы 3 читать внимательно и подробно разбирать каждый приведенный им пример, выполняя все упражнения после разделов, а когда дойдешь до классов iStack и iList - реализуй их по его руководству.
Идея упражнений в книге такова - используй знания, которые получил в предыдущих разделах.
Обсуждение книги - это отдельная тема

0
dakuenjery
18 / 15 / 3
Регистрация: 13.06.2011
Сообщений: 116
10.07.2011, 18:44  [ТС] #11
Да вроде все упражнения выполнил, не пропускал.
0
Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
10.07.2011, 18:55 #12
Если ты решил задачу самостоятельно - это уже плюс.
Мои рекомендации к твоему решению задачи таковы:
1) Разбивать задачи на отдельные элементы ( функции в данном случае )
2) В главе 3 сказано: "Существуют два абсолютно разных подхода к использованию вектора, назовем их идиомой массива и идиомой STL." - работать с вектором основываясь на идиоме STL.
0
insolent
826 / 344 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
10.07.2011, 19:21 #13
Цитата Сообщение от dakuenjery Посмотреть сообщение
А у insolent слова "us" не находит
В вашей строке не "us", а "us:"
0
dakuenjery
18 / 15 / 3
Регистрация: 13.06.2011
Сообщений: 116
10.07.2011, 21:22  [ТС] #14
Это ясно, то двоеточие же к слову не относится. Слово - это us, а не us:
0
Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
10.07.2011, 22:24 #15
2 dakuenjery - ты не указал в задании что считать словами
обычно, это последовательности символов, разделенных пробелами и/или символом конца строки. ( А о других специальных знаках ) или ( считать словами только набор букв и/или цифр ) - нужно указывать отдельно в задании.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2011, 22:24
Привет! Вот еще темы с ответами:

Найти решение - на разные темы - C++
Доброго времени суток!!! Уважаемые форумчанины, требуется помощь в решении задач по С++. За 1,5 месяца не смог разобраться ни в одном...

Найти решение дифференциального уравнения - C++
Здравствуйте. Я бы хотела попросить о помощи с написанием программы. Я пыталась понять самостоятельно, как решить эту задачу, но у меня...

Найти общее решение СЛАУ - C++
Ребят,ни у кого нет исходников на эту задачу?Я только удалил n-r уравнений.Если есть,буду очень благодарен))

Найти решение системы линейных уравнений - C++
Даны действительные числа a1, b1, c1, a2, b2, c2. Выяснить, верно ли, что a1b2-a2b1 0.0001 и если верно, то найти решение системы...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
10.07.2011, 22:24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru