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

строки. дописать функцию - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Заменить в строке 2 повторяющихся символа на 2 точки http://www.cyberforum.ru/cpp-beginners/thread142639.html
если в строке есть 2 повторяющихся символа заменить их на 2 точки
C++ В строке посчитать количество символов, которые введёт пользователь в строке посчитать количество символов,которые введёт пользователь http://www.cyberforum.ru/cpp-beginners/thread142636.html
C++ циклический сдвиг
Осуществить циклический сдвиг элементов квадратной матрицы размерности M х N вправо на k элементов таким образом:Элементы 1-й строки сдвигаются в последний столбец сверху вниз, из него - в последнюю строку справа налево, из неё - в первый столбец снизу вверх, из него - в первую строку;для остальных элементов аналогично. Заранее благодарен
строки C++
Дана строка-предложение на русском языке. Подсчитать количество содержащихся в строке знаков препинания.
C++ матрица http://www.cyberforum.ru/cpp-beginners/thread142595.html
Дана матрица размера M × N. Найти максимальный среди минимальных элементов ее строк.
C++ Выполнить сортировку символов в строке. Здравствуйте..... помогите пожалуйста сделать эту задачу на "С".... отблагодарю 1. Выполнить сортировку символов в строке. Порядок возрас* тания «весов» символов задать таблицей вида char ORD = "АаБбВвГгДцЕе1234567890"; Символы, не попавшие в таблицу, размещаются в конце отсортированной строки. подробнее

Показать сообщение отдельно
Julyashka
Сообщений: n/a
08.06.2010, 16:31     строки. дописать функцию
Дан текст, состоящий из N (2 < N < 10) строк с максимальной длиной 80
символов. Необходимо вывести в алфавитном порядке те слова, где количество
гласных превышает количество согласных. Считать, что текст написан синтаксически
грамотно, в качестве знаков препинания используются точка и запятая,
слова состояттолько из букв, перенос слов по слогам отсутствует. Для выделения
слов из строки создать пользовательскую функцию.

Проблема с функцией HaveSlovo. Нужно, чтобы на экран в итоге не выводились уже отсортированные одинаковые слова. Остальная программа работает верно. Помогите пожалуйста.

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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "stdlib.h"
#include <stdio.h>
#include <string.h>
#include <math.h>
 
void Sort(char** szWords, int nWords)
 
{              
      for (int nWord1 = 0; nWord1 < nWords - 1; nWord1++)
      {
            for (int nWord2 = nWord1 + 1; nWord2 < nWords; nWord2++)
            {
                  if (strcmp( szWords[nWord1],szWords[nWord2])>0)
                  {
                        // поменять слова местами в массиве
                        char* tmp = szWords[nWord1];
 
                        szWords[nWord1] = szWords[nWord2];
 
                        szWords[nWord2] = tmp;
                  }
            }
      }
}
 
bool IsWordValid(char* szStart, int nWordLen) {
      int nGlas = 0, nSoglas = 0;
      const char* szGlas = "aeiou";
 
      for (int i = 0; i < nWordLen; i++)
      {
            nSoglas++;
            if (strchr(szGlas, szStart[i]) != NULL)
            {
                  nGlas++;
                  nSoglas--;
            }
      }
return nGlas > nSoglas;}
 
void ExtractWords(char* szRowText, char ***szWords, int* nWords)
{
      char *szStart = szRowText;
      for (char *szEnd = szStart; true; szEnd++)
      {
            // ищем один из символов конца слова
            if (*szEnd == ' ' || *szEnd == ',' || *szEnd == '.' || *szEnd == '\0')
            {
                  // вычисляем длину слова
                  int nWordLen = (int)(szEnd - szStart);
                  // проверяем количество гласных в слове
                  bool bIsValid = IsWordValid(szStart, nWordLen);
                  // пропускаем 'пустые' слова
                  if (nWordLen > 0 && bIsValid)
                  {
                        // продвигаем счётчик слов
                        (*nWords)++;
                        // выделяем память в массиве указателей для нового слова
                        *szWords = (char **)realloc((*szWords), *nWords * sizeof(char*));
                        // выделяем память для нового слова в массиве
                        (*szWords)[*nWords-1] = (char*)malloc(nWordLen * sizeof(char*));
                        // копируем слово в массив
                        for (int i = 0; i < nWordLen; i++)
                              (*szWords)[*nWords-1][i] = szStart[i];
                        (*szWords)[*nWords-1][nWordLen] = '\0';
                  }
                  //  если это конец строки, выходим из цикла
                  if (*szEnd == '\0') break;
                  // перемещаем указатели
                  szStart = szEnd + 1;
            }
      }
}
bool HaveSlovo(char* szWords,int nWords, char szNextWord) {
  for(int i=0; i<nWords; i++)
    if (strcmp(szWords,szNextWord)==0)
      return false;
  return true;
}
 
int main(int argc, char* argv[])
{
const int NN = 4;
char szSourceText[NN][80];
int N=0;
      int nWords = 0;
      char tmp[88];
      do
      {
          gets(tmp);
          if(strlen(tmp)==0)break;
          strcpy(szSourceText[N],tmp);
          N++;
      }while(1);
      char** szWords = NULL;
// извлекаем все слова из текста в динамический двумерный массив
      for (int iRow = 0; iRow < N; iRow++)
      {
      ExtractWords(szSourceText[iRow], &szWords, &nWords);
      }
// сортируем слова
      Sort(szWords, nWords);
      
// распечатываем массив слов
      for (int nWord = 0; nWord < nWords; nWord++)
      {
            char* szNextWord = szWords[nWord];
//ищем одинаковые слова
              if (HaveSlovo(&szWords,nWords,&szNextWord))
              strcpy(szWords, szNextWord);
            printf ("%s\n", szNextWord);
      }
// ожидаем команды завершения
      getchar();
// освобождаем память
      for (int nWord = 0; nWord < nWords; nWord++)
      {
            char* szNextWord = szWords[nWord];
            free (szNextWord);
      }
      free (szWords);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 05:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru