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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.96
keep-it-real
25 / 0 / 1
Регистрация: 25.05.2010
Сообщений: 47
#1

Найти самое короткое из слов в предложении - C++

04.11.2011, 12:05. Просмотров 3415. Ответов 46
Метки нет (Все метки)

задание на строки
Дана символьная строка.Слово-последовательность символов между пробелами, не содерж. пробелы внутри себя.Найти самое короткое из слов в предложении
Как написать?надо написать на обычном элементарном си, т.к. только начинаю программировать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2011, 12:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти самое короткое из слов в предложении (C++):

Даны два предложения. Найти самое короткое из слов первого предложения, которого нет во втором предложении - C++
Здравствуйте. Есть задача (написана в теме), есть решение: #include <iostream> #include <string> #include <sstream> ...

Даны два предложения. Найти самое короткое из слов первого предложения, которого нет во втором предложении - C++
Помогите решить задачу! Даны два предложения.Найти самое короткое из слов первого предложения,которого нет во втором предложении!

Найти самое длинное и самое короткое слово в предложении - C++
Составить и отладить программу, которая выполняет следующие действия. В заданном тексте из нескольких предложений найти самое длинное и...

В заданном предложении поменять местами самое длинное и самое короткое слова - C++
В заданном предложении поменять местами самое длинное и самое короткое слова. Считать, что слова в тексте отделены друг от друга одним...

Найдите самое длинное, и самое короткое слово в заданном предложении - C++
Найдите самое длинное и самое короткое слово в заданном предложении.

Заданный список из 8 слов. Найти самое короткое слово из списка - C++
Ребята, кто сможет такое сделать ? Не имею понятие как вообще это сделать, заранее благодарю. Заданный список из 8 слов. Найти самое...

46
-=ЮрА=-
Заблокирован
Автор FAQ
04.11.2011, 12:48 #2
Цитата Сообщение от keep-it-real Посмотреть сообщение
задание на строки
Дана символьная строка.Слово-последовательность символов между пробелами, не содерж. пробелы внутри себя.Найти самое короткое из слов в предложении
Как написать?надо написать на обычном элементарном си, т.к. только начинаю программировать
Ниже код на Си и скриншот работы
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
#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
 
int main()
{   
    long sLen;//Áóäåò ñîäåðæГ*ГІГј Гў Г±ГҐГЎГҐ äëèГ*Г*Гі ГІГҐГЄГіГ№ГҐГЈГ® ñëîâГ*
    long mLen;//Áóäåò ñîäåðæГ*ГІГј Гў Г±ГҐГЎГҐ ìèГ* äëèГ*Г*Гі ñëîâГ* Гў ñòðîêå
    char chr;
    char str[1024];//èñõîäГ*Г*Гї ñòðîêГ*
    char buf[1024];//ГЎГіГґГґГҐГ°
    char delim[] = " ,.!?;";//ГђГ*çäåëèòåëè ìåæäó ñëîâГ*ìè
    printf("\tEnter input string\n");
    scanf("%[^\n]%c",str,&chr);//Г‚ str ГІГ® Г·ГІГ® ââåëè Гў chr - '\n' îò ââîäГ*
    sprintf(buf,"%s",str);
    char * word = strtok(buf,delim);
    if(!word)
        printf("String not contain words or empty!\n");
    else
    {
        //Èùåì äëèГ*Г*Гі ìèГ* ñëîâГ*
        //Г‡Г*ГЇГЁГ±Г*ëè Гў mLen äëèГ*Г*Гі 1-ГЈГ® ñëîâГ*
        mLen = strlen(word);
        word = strtok(NULL,delim);
        while(word)
        {
            sLen = strlen(word);
            if(sLen < mLen)
                mLen = sLen;
            word = strtok(NULL,delim);
        }
        //Òåïåðü óæå ГЁГ№ГҐГ¬ Г±Г*ìî ñëîâî Г± äëèГ*Г*îé mLen
        word = strtok(str,delim);
        while(word)
        {
            sLen = strlen(word);
            if(mLen == sLen)
                break;
            word = strtok(NULL,delim);
        }
        printf("\tWord with min length : %s\n",word);
    }
    system("pause");
    return 0;
}
1
Миниатюры
Найти самое короткое из слов в предложении  
Просто лис
Путешественник вселенной
187 / 153 / 71
Регистрация: 01.03.2011
Сообщений: 664
04.11.2011, 12:51 #3
-=ЮрА=-, интересная программа.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
04.11.2011, 13:10 #4
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
#include <stdio.h>
#include <string.h> 
 
int main(void)
{
    const char *line, *p;
    char word[100], tmp[100];
    int len, minlen;
    int c, state;
    
    line = "abcdab c defgababcd";
    
    minlen = 0;
    state = 0;
    for (p = line; (c = *p) != '\0'; p++)
        if (state == 0) {
            if (c != ' ') {
                len = 0;
                p--;
                state = 1;
            }
        } else {
            if (c != ' ') {
                tmp[len++] = c;
                tmp[len] = '\0';
            }
            if (c == ' ' || *(p + 1) == '\0') {
                if (minlen == 0 || len < minlen) {
                    minlen = len;
                    strcpy(word, tmp);
                }
                state = 0;
            }
        }
    
    printf("%s\n", word);
    
    return 0;
}
Код
[guest@localhost tests]$ .ansi t.c -o t
[guest@localhost tests]$ ./t
c
[guest@localhost tests]$
0
-=ЮрА=-
Заблокирован
Автор FAQ
04.11.2011, 13:57 #5
Цитата Сообщение от Просто лис Посмотреть сообщение
-=ЮрА=-, интересная программа.
Спасибо! Как вариант - здесь похожее задание, только логика выбора слов другая В символьной строке удалить все слова, состоящие из нечетного количества букв.
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.11.2011, 14:13 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <sstream>
#include <set>
 
bool cmp( const std::string& a, const std::string& b )
{
    return a.length() < b.length();
}
 
int main()
{
    std::string str;
    std::cout << "Enter string" << std::endl;
    std::getline( std::cin, str );
    
    bool (*fn_pt)( const std::string&, const std::string& ) = cmp;
    std::set< std::string, bool (*) (const std::string&, const std::string&) > words(fn_pt);
    
    for ( std::istringstream ist(str) ; ist >> str ; words.insert(str) ) ;
    
    std::cout << "Shortest word is \"" << *words.begin() << "\"\n";
}
1
neske
1501 / 868 / 84
Регистрация: 26.03.2010
Сообщений: 2,973
04.11.2011, 14:52 #7
Почему код выше учитывает знаки препинания, то есть
вход - raz! dva tri
выход - raz

А если написать так -
C++
1
2
3
std::vector <std::string> vec;
for ( std::istringstream ist(str) ; ist >> str ; vec.push_back(str)) ;
std::cout << *vec.begin();
то на выходе будет - raz!

Я код привел не по задаче, а просто деление на слова.
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.11.2011, 17:29 #8
Цитата Сообщение от neske Посмотреть сообщение
Почему код выше учитывает знаки препинания, то есть
вход - raz! dva tri
выход - raz
Разве? Не учитывает же. И на выходе dva будет.
1
keep-it-real
25 / 0 / 1
Регистрация: 25.05.2010
Сообщений: 47
04.11.2011, 21:55  [ТС] #9
спасибо, товарищи, пойду разбираться над задачей

Добавлено через 2 часа 52 минуты
-=ЮрА=-, не совсем понятны эти строки в вашей программе
C
1
2
3
scanf("%[^\n]%c",str,&chr);//В str то что ввели в chr - '\n' от ввода
        sprintf(buf,"%s",str);
        char * word = strtok(buf,delim);
что такое sprintf, strtok ???
и что значит вот это
C
1
"%[^\n]%c"
0
-=ЮрА=-
Заблокирован
Автор FAQ
04.11.2011, 22:31 #10
Цитата Сообщение от keep-it-real Посмотреть сообщение
не совсем понятны эти строки в вашей программе
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
scanf("%[^\n]%c",str,&chr);//В str то что ввели в chr - '\n' от ввода
- считываем строку(даже если есть пробелы) до символа \n, т.е. по тот символ после которого Enter жмакнули

Не по теме:

Фактически С++ аналог scanf("%[^\n] - это getline



Добавлено через 1 минуту
Цитата Сообщение от keep-it-real Посмотреть сообщение
что такое sprintf
Цитата Сообщение от keep-it-real Посмотреть сообщение
sprintf(buf,"%s",str);
- скопировали содеримое str в buf об sprintf читайте по этой ссылке http://www.cplusplus.com/reference/c...stdio/sprintf/

Добавлено через 2 минуты
Цитата Сообщение от keep-it-real Посмотреть сообщение
strtok
Функция strtok() возвращает указатель на следующую лексему в строке отделённую символами из
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char delim[] = " ,.!?;";//Разделители между словами
О strtok читайте здесь http://www.cplusplus.com/reference/c...string/strtok/
0
keep-it-real
25 / 0 / 1
Регистрация: 25.05.2010
Сообщений: 47
04.11.2011, 22:43  [ТС] #11
а нельзя ли как-то обходиться без таких функций как strkok, sprintf ?? просто только начинаю знакомиться с языком си, хотелось бы попроще реализовать алгоритм, возможно ваш вариант и есть проще, но как-то что ли используя элементарные функции?
0
-=ЮрА=-
Заблокирован
Автор FAQ
04.11.2011, 23:59 #12
Цитата Сообщение от keep-it-real Посмотреть сообщение
а нельзя ли как-то обходиться без таких функций как strkok, sprintf ?? просто только начинаю знакомиться с языком си, хотелось бы попроще реализовать алгоритм, возможно ваш вариант и есть проще, но как-то что ли используя элементарные функции?
- понимаете нельзя сесть на обычный байк, даже с коляской, не имея запаса базовых знаний, если вы только начали изучение Си(т.е купили себе велик), почему не отработате алгоритмы со строками, выбор подстроки, доступ к элементам (не учитесь на велике кататься), а сразу хотите не умея ездить на велике ездить на байке с коляской???
Да не вопрос я могу предложить вам алгоритм с элементарным пробором символов, только смотрите, ввод в такой алгоритм даже обработки знаков препинания потребует увеличения сложности, вконце концов ваше "просто" выльеться в нечто сложное...Разберитесь в предложенном алгоритме досконально, вот сядьте и построчно для себя обдумайте каждую строку, лягте спать, завтра снова посидите и когда вам вдруг прийдёт понимание, а оно прийдёт так вы сидеть будете, вы уже сразу научитесь и на велике ездить и на байке(т.к. пройдёте автошколу), а не будете сегать на байк не понимая, что такое кардан или свеча зажигание...
Я не хочу обидеть, просто открываю глаза!Если хотите очень просто - это пост 4 от accept он просто написал, где-то под знание почти начинающего, но и алгоритм тоже прост, текст со знаками будет разбит не совсем корректно в плане выделения слов...
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2011, 00:19 #13
keep-it-real, решил написать свой "простой вариант", не знаю проще уже некуда - ни одной стандартной функции кроме printf и scanf
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
#include <stdio.h>
#include <conio.h>
 
int main()
{
    long i,j;
    long sLen = 0;//Будет содержать в себе длинну текущего слова
    long mLen = 1024;//Будет содержать в себе мин длинну слова в строке
    char str[1024] = {0};//исходная строка
    printf("\tEnter input string\n");
    //В Си строку с пробелами по другому думаю и не ввести!
    scanf("%[^\n]",str);//В str то что ввели в chr - '\n' от ввода
    char min_word[32] = {0};
    char cur_word[32] = {0};
    for(i = 0; str[i] != '\0';i++)
    {
        if(str[i] == ' ' || str[i] == '\0')
        {
            if(sLen < mLen)
            {
                mLen = sLen;
                //Копируем cur_word в min_word
                for(j = 0; j < sLen; j++)
                    min_word[j] = cur_word[j];
                min_word[sLen] = '\0';
            }
            sLen = 0;
        }
        else
        {
            cur_word[sLen] = str[i];
            sLen++;
        }
    }
    printf("Word with min len : %s\n",min_word);
    printf("Press any key to continue\n");
    getch();
    return 0;
}

Не по теме:

PS:Я правда не хотел обижать в предыдущем посте, но всё же решение определённых задач элементарными понятными методами делают алгоритм очень тяжеловесным и раздутым...

0
Миниатюры
Найти самое короткое из слов в предложении  
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.11.2011, 01:05 #14
Цитата Сообщение от -=ЮрА=-
текст со знаками будет разбит не совсем корректно в плане выделения слов...
Цитата Сообщение от keep-it-real
Слово-последовательность символов между пробелами, не содерж. пробелы внутри себя.
_____
0
neske
1501 / 868 / 84
Регистрация: 26.03.2010
Сообщений: 2,973
05.11.2011, 08:30 #15
Цитата Сообщение от diagon Посмотреть сообщение
Разве? Не учитывает же. И на выходе dva будет.
действительно) что-то я.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2011, 08:30
Привет! Вот еще темы с ответами:

Ввести строку, содержащую несколько слов. Определить самое длинное и самое короткое слово - C++
Здравствуйте, не могли бы мне помочь с кодом. Как его переписать, чтобы программа работала? #include &lt;iostream&gt; #include &lt;cstdlib&gt; ...

В заданном предложении удалить самое короткое слово - C++
4. В заданном предложении удалить самое короткое слово. Считать, что слова в тексте отделены друг от друга одним пробелом.

Даны два предложения. Найти самое короткое из слов первого предложения,которого нет во втором предложений? - C++
Даны два предложения. Найти самое короткое из слов первого предложения,которого нет во втором предложений?

самое короткое слов в строке - C++
Дана строка символов,состоящая из слов,разделенных пробелами. Распечатать исходную строку. Определить самые короткие слова в строке...


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

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

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