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

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

Войти
Регистрация
Восстановить пароль
 
Julyashka
#1

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

08.06.2010, 16:31. Просмотров 460. Ответов 0
Метки нет (Все метки)

Дан текст, состоящий из 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);
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2010, 16:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос строки. дописать функцию (C++):

В конец каждой строки текстового файла дописать количество символов этой строки - C++
Помогите, нужно : &quot;В конец каждой строки текстового файла дописать количество символов этой строки&quot;. Получается только в начало, не знаю...

дописать функцию try – catch - C++
Превышение допустимой температуры плафона. // Содержание файла Lamp.h // ------------------------------------------------...

Нужно исправить ошибки в коде и дописать функцию - C++
В 17-ой строке компилятор выдает ошибку invalid operands of types 'int()' and 'int()' to binary 'operator+' В идеале программа должна...

Дописать функцию сортировки по алфавиту в базе данных - C++
Есть программа база данных. я ее уже расписал. все кроме одной функции sort . в этой функции должна происходить сортировка переменных...

К коду нужно дописать функцию (void VidAlphabet - сведения о абонентах в алфавитном порядке) - C++
*Main* #include &quot;Header.h&quot; #include &lt;iostream&gt; using namespace std; void VidTimeInCity(Phone*, int); void...

Дописать в конец символьной строки другую строку - C++
Здравствуйте, создаю массив char szDisplayName; подскажите пожалуйста, как мне дописать слово после последнего символа в массиве ?

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2010, 16:31
Привет! Вот еще темы с ответами:

Помогите дописать код: Перевернуть все нечетные строки матрицы - C++
Если что -то не правильно( а оно там есть) помогите исправить! Задача:Перевернуть все нечетные строки матрицы.(Использовать функции)! ...

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

не могу дописать функцию перевода текста на 2сс,не могу возвращать переведенный текст - C++
void itoa(char str){ int i; char buf; char url; char yn; int x=0; i=0; while(str){ _itoa_s( (unsigned char)str, buf, 2);...

Описать функцию, что добавляет N символов строки S2 в конец строки S1 - C++
Помогите пожалуйста с выполнением лабораторной работы. Задание: 1. Разработать и реализовать функцию на языке С. 2. Провести ее...


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

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

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