Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
cr0n
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 46
1

Найти самое короткое и самое длинное слово в строке

01.11.2014, 18:24. Просмотров 1852. Ответов 7
Метки нет (Все метки)

Введённый строке найти самое короткое и длинное слово.словом считается последовательность симболов,которое отделено пробелом или знаком препинания(,.:.
пример: "aba: De fgHif,klmn."
max = 5, min = 2
короткое слово- De
длинное слово- fgHif

на данный момент есть только это
C++
1
2
3
4
5
6
7
8
9
10
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
bool IsPunctMark(char ch)
{
    const char PunctMarks[]=",.:; ";
    for (int i=0; PunctMarks[i];i++) if (PunctMarks[i]==ch) return true;
    return false;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2014, 18:24
Ответы с готовыми решениями:

Найти самое длинное и самое короткое слово в строке
Вообщем, дано задание найти самое длинное и самое короткое слово в строке. Все...

Найти самое короткое и самое длинное слово в строке
Посмотрите на код, что не так пишу? #include &lt;iostream&gt; #include &lt;string.h&gt; ...

Найти самое короткое и самое длинное слово в строке
#include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; #include...

В заданной строке определить самое длинное и самое короткое слово
Ввести несколько строк,каждая из которых содержит некоторое количество слов.В...

Напечатать самое длинное и самое короткое слово в строке
. Напечатать самое длинное и самое короткое слово в этой строке. Вроде все...

7
Somebody
2801 / 1612 / 251
Регистрация: 03.12.2007
Сообщений: 4,215
Завершенные тесты: 3
01.11.2014, 21:25 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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <locale>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
 
class PunctAsSpace : public std::ctype<char>
{
public:
    explicit PunctAsSpace(size_t refs = 0) : ctype(newTable, false, refs)
    {
        static const std::string separators = ",.:; ";
        const mask* oldTable = classic_table();
        std::copy(oldTable, oldTable + table_size, newTable);
        for (char c : separators)
            newTable[static_cast<unsigned char>(c)] |= space;
    }
private:
    mask newTable[table_size];
};
 
int main()
{
    std::string s;
    std::getline(std::cin, s);
    std::istringstream iss(s);
    iss.imbue(std::locale(iss.getloc(), new PunctAsSpace));
    const std::vector<std::string> words{std::istream_iterator<std::string>(iss),
        std::istream_iterator<std::string>()};
    auto MinMaxWords = std::minmax_element(words.begin(), words.end(),
        [](const std::string& s0, const std::string& s1) {
            return s0.size() < s1.size();
        });
    std::cout << *MinMaxWords.first << ' ' << *MinMaxWords.second << std::endl;
}
0
Sasha Pr
2 / 2 / 5
Регистрация: 01.11.2014
Сообщений: 19
01.11.2014, 22:45 3
Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
 
int wordlen(char *s, int a); // функция возвращает длинну слова
 
int main(){
 
    char str[] = "aba: De fgHif,klmn.";
    int max(0),min(0),lw;
    
    for(int i(0); str[i]; i++){
        if(i == 0 || i > 0 && (!isalpha(str[i-1]) && !isdigit(str[i-1]))) {
            lw = wordlen(str,i);
            if(max == 0 && min == 0){
                max = lw;
                min = lw;
            }
            if(lw > max) max = lw;
            if(lw < min && lw > 0) min = lw;
            cout << lw << endl; 
        }
    }
 
    cout << "max = " << max << endl;
    cout << "min = " << min << endl;
    
    system("pause > nul");
    return 0;
}
0
cr0n
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 46
01.11.2014, 23:15  [ТС] 4
Цитата Сообщение от Sasha Pr Посмотреть сообщение
Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
 
int wordlen(char *s, int a); // функция возвращает длинну слова
 
int main(){
 
    char str[] = "aba: De fgHif,klmn.";
    int max(0),min(0),lw;
    
    for(int i(0); str[i]; i++){
        if(i == 0 || i > 0 && (!isalpha(str[i-1]) && !isdigit(str[i-1]))) {
            lw = wordlen(str,i);
            if(max == 0 && min == 0){
                max = lw;
                min = lw;
            }
            if(lw > max) max = lw;
            if(lw < min && lw > 0) min = lw;
            cout << lw << endl; 
        }
    }
 
    cout << "max = " << max << endl;
    cout << "min = " << min << endl;
    
    system("pause > nul");
    return 0;
}
можете объяснить что значит !isalpha и !isdigit ?
0
nmcf
6401 / 5663 / 2580
Регистрация: 14.04.2014
Сообщений: 23,964
02.11.2014, 09:30 5
что значит !isalpha и !isdigit
Проверка, что не является ни буквой, ни цифрой.
Если пользоваться char-строками, то для разделения строки на слова проще использовать strtok(), для подсчёта символов в слове strlen().
0
cr0n
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 46
02.11.2014, 17:28  [ТС] 6
спасибо

Добавлено через 4 часа 55 минут
написал так но работает не совсем так как надо.в каком месте ошибка ?

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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
bool IsPunctMark(char ch)
{
    const char PunctMarks[]=".,:;";
    for (int i=0; PunctMarks[i];i++) if (PunctMarks[i]==ch) return true;
    return false;
}
 
int MaxWord(char* str)
{
   int max=0, buf=0;
   int wl[100]; int j=0;
   int len = strlen(str);
   for (int i=0;i<len;i++)
   {
      if (IsPunctMark(str[i])||str[i]==' ')
      {
         wl[j]=buf;
         j++ ;
         buf=0;
      }
      else buf++;
   }
 
   for (int i=0;i<j;i++)
   {
      if (wl[i]>max) max=wl[i];
   }
   return max;
}
 
int MinWord(char* str)
{
   int min=1000, buf=0;
   int wl[100]; int j=0;
   int len=strlen(str);
   for (int i=0;i<len;i++)
   {
      if (IsPunctMark(str[i])||str[i]==' ')
      {
         wl[j]=buf;
         j++ ;
         buf=0;
      }
      else buf++;
   }
 
   for (int i=0;i<j;i++)
   {
      if (wl[i]<min) min=wl[i];
   }
   return min;
}
 
void main()
{
   char str[100];
   printf("Enter a string: ");
   gets(str);
   MaxWord(str);
   MinWord(str);
   printf("MAX: %i \n ",MaxWord(str));
   printf("MIN: %i \n ",MinWord(str));
   system("pause");
}
0
nmcf
6401 / 5663 / 2580
Регистрация: 14.04.2014
Сообщений: 23,964
02.11.2014, 22:11 7
Вот весь поиск.
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
#include <stdio.h>
#include <string.h>
 
int main()
{
   char str[100];
   char *wmax = NULL, *wmin = NULL, *w;
   int lmax = 100, lmin = 0, l;
 
   printf("Enter a string: ");
   gets(str);
   
   w = strtok(str, ",.:; ");
   while(w != NULL)
   {
      l = strlen(w);
      if (l < lmin)
      {
         lmin = l;
         wmin = w;
      {
      if (l > lmax)
      {
          lmax = l;
          wmax = w;
      {
      w = strtok(NULL, ",.:; ");
   }
 
   if (wmax != NULL) printf("MAX: %s (%i)\n", wmax, lmax);
   if (wmin != NULL) printf("MIN: %s (%i)\n ",wmin, lmin);
 
   system("pause");
}
0
Vasilijs
0 / 0 / 1
Регистрация: 20.10.2014
Сообщений: 17
09.11.2014, 23:57 8
Должно работать так :)
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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
bool IsPunctMark(char ch)
{
    const char PunctMarks[]=".,:;!? ";
    for (int i=0; PunctMarks[i];i++) if (PunctMarks[i]==ch) return true;
    return false;
}
 
void Count(char* str)
{
   int max=0, buf=0, min=1000;
   int wl[100]; int j=0;
   int len=strlen(str);
   for (int i=0;i<=len;i++)
   {
      if (IsPunctMark(str[i])||str[i]==NULL)
      {
         if (buf!=0)
         {
            wl[j]=buf;
            j++ ;
            buf=0;
         }
      }
      else buf++;
   }
   for (int i=0;i<j;i++)
   {
      if (wl[i]>max) max=wl[i];
      if (wl[i]<min) min=wl[i];
   }
   if (max!=min)
   {
      printf("MAX: %i \n",max);
      printf("MIN: %i \n",min);
   }
   else
   {
      printf("Visi vardi ir vienadi= %i \n",max);
   }
}
 
void main()
{
   char str[100];
   printf("Ievadiet rindu: ");
   gets(str);
   Count(str);
   system("pause");
}
0
09.11.2014, 23:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2014, 23:57

Напечатать самое длинное и самое короткое слово в строке
Напечатать самое длинное и самое короткое слово в строке в С++

Напечатать самое длинное и самое короткое слово в строке
Прошу помочь с решением задачи. Задана строка, состоящая из символов....

В заданном предложении найти самое короткое и самое длинное слово
Строка вводится с клавиатуры. Нужно выполнить задание, не применяя функций...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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