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

Переставить слова заданного предложения в соответствии с ростом согласных в этих словах. - C++

Восстановить пароль Регистрация
 
atmka
2 / 2 / 1
Регистрация: 30.09.2011
Сообщений: 10
25.12.2011, 14:08     Переставить слова заданного предложения в соответствии с ростом согласных в этих словах. #1
Добрый день. В универе дали задачку "Переставить слова заданного предложения в соответствии с ростом согласных в этих словах." Ломал голову 2 недели, но ничего путного не придумал. Запрогать надо на VC++. Буду рад, если кто-нибудь подаст идеи.
Вот мой бред, но это я даже до самой сортировки слов не дошел.
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
#include "stdafx.h"
#include <iostream>
#include <windows.h> //Перевод на русский язык. Не забываем переключить шрифт в консоли на Lucia
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleCP(1251); 
    SetConsoleOutputCP(1251); //Перевод на русский язык.
    int space[500], omg=0, lol=-1, qwerty[500], dlina;
    /*const int MAX_LINE_LENGTH = 4096;*/
    char string[300]/*, words[MAX_LINE_LENGTH]*/;
    char soglasnye[] = {'Б', 'В', 'Г', 'Д', 'Ж', 'З', 'К', 'Л', 'М', 'Н', 
                        'П', 'Р', 'С', 'Т', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', '\0' };
    cout << "Введите строку: ";
    gets_s(string);
    dlina = strlen(string);
    for(int n=0;n<=dlina;n++){
        for(int k=0, p=0;k<=20;k++){
//Если находит в слове согласную, то +1 к счетчику.
            if(string[n]==soglasnye[k]) omg++;
//Если же находит пробел, то присваиваем кол-во согласных в ячейку массива qwerty, а в другой
//массив записываем место, на котором этот пробел находится. Обнуляем счетчик согласных.
//Все что ниже это лишь мои домыслы, к чему-то нормальному я так и не пришел.
            if(string[n]==' ') {
                lol++;
                qwerty[lol]=omg;
                space[lol]=n;
                omg=0;
            }
        }
    }
    /*for(lol=0;qwerty[lol]!='\0';lol++){*/
        printf("%i\t%i, %i, %i", qwerty[0], space[0], qwerty[1], space[1]);
    //}
    cout << endl;
    system( "pause" ); //Остановка программы перед закрытием.
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2011, 14:08     Переставить слова заданного предложения в соответствии с ростом согласных в этих словах.
Посмотрите здесь:

C++ Расположить столбцы матрицы в соответствии с ростом характеристик
C++ Переставляя строки заданной матрицы, расположить их соответствии с ростом характеристик.
Дано два предложения (Распечатать слова из первого предложения, который начинаются на первую букву последнего слова второго предложения) C++
C++ Вывести два предложения и распечатать самые длинные слова, общие для этих предложений
Переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
25.12.2011, 14:30     Переставить слова заданного предложения в соответствии с ростом согласных в этих словах. #2
Как относиться к знакам препинания? Считать их частью слова или как?
atmka
2 / 2 / 1
Регистрация: 30.09.2011
Сообщений: 10
25.12.2011, 14:46  [ТС]     Переставить слова заданного предложения в соответствии с ростом согласных в этих словах. #3
Про это ничего не сказано в задании, поэтому, думаю надо считать частью слова.
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
25.12.2011, 17:16     Переставить слова заданного предложения в соответствии с ростом согласных в этих словах. #4
Почти дописал, но сдох при вводе русских символов. В консоли видны норм, при выводе видны норм, но при обработке не норм. По тогда нужно иметь по 2 байта на символ... короче запарно. Если разберусь, то отпишусь.

Добавлено через 35 минут
Вроде сделал, вот что получилось.
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
#include <iostream>
#include <stdlib.h>
#include <Windows.h>
 
using namespace std;
 
template <class TYPE>
void swap( TYPE *a, TYPE *b )
{
  TYPE tmp = *a;
  *a = *b;
  *b = tmp;
}
 
void main( void )
{
  wcout.imbue(locale("rus_rus.866"));
  wcin.imbue(locale("rus_rus.866"));
  
  const int MAX_STR = 100;
  wchar_t str[MAX_STR + 1];
  const int NUM_OF_SOGL = 20;
  wchar_t sogl_dig[NUM_OF_SOGL] = {L'Б', L'В', L'Г', L'Д', L'Ж', L'З', L'К', L'Л', L'М', L'Н', 
                                   L'П', L'Р', L'С', L'Т', L'Ф', L'Х', L'Ц', L'Ч', L'Ш', L'Щ'};
  wcout << L"Insert string: ";
  wcin.getline(str, MAX_STR);
 
  wchar_t *p = str;
  wchar_t prev = L' ';
  int numOfWords = 0;
  // Ищем кол-во слов
  while (*p != 0)
  {
    // Если наткнулись на начало нового слова
    if (prev == L' ' && *p != L' ')
      numOfWords++;
    prev = *p;
    p++;
  }
 
  // Массив указателей на начало слов
  wchar_t **word = new wchar_t *[numOfWords];
  // Массив кол-в согласных в словах
  int *sogl = new int[numOfWords];
  wchar_t *p2;
  prev = L' ';
  int i = 0, j;
  p = str;
  while (prev != 0)
  {
    // Если наткнулись на начало нового слова
    if (prev == L' ' && *p != L' ')
      word[i] = p;
    else if (prev != L' ' && (*p == L' ' || *p == 0)) // Нашли конец слова
    {
      // Считаем ко-во слагаемых
      sogl[i] = 0;
      p2 = word[i];
      while (*p2 != L' ' && *p2 != 0)
      {
        for (j = 0; j < NUM_OF_SOGL; j++)
        {
          if (*p2 == sogl_dig[j] || *p2 == L'а' + sogl_dig[j] - L'А') // Тута русские буквы
          {
            sogl[i]++;
            break;
          }
        }
        p2++;
      }
      i++;
    }
    prev = *p;
    p++;
  }
  // Заменим все пробелы на 0 для удобства вывода
  p = str;
  while (*p != 0)
  {
    if (*p == L' ')
      *p = 0;
    p++;
  }
 
  // Проверка
  for (i = 0; i < numOfWords; i++)
    wcout << word[i] << L": " << sogl[i] << L"\n";
 
  // Сортируем слова по убыванию согласных
  int max;
  for (i = 0; i < numOfWords - 1; i++)
  {
    max = i;
    for (j = i + 1; j < numOfWords; j++)
      if (sogl[j] > sogl[max])
        max = j;
    if (max != i)
    {
      swap(&sogl[max], &sogl[i]);
      swap(&word[max], &word[i]);
    }
  }
 
  // Выводим слова
  wcout << L"Result: ";
  for (i = 0; i < numOfWords; i++)
    wcout << word[i] << L" ";
  wcout << L"\n";
  system("pause");
}
atmka
2 / 2 / 1
Регистрация: 30.09.2011
Сообщений: 10
25.12.2011, 21:37  [ТС]     Переставить слова заданного предложения в соответствии с ростом согласных в этих словах. #5
Спасибо большое! Буду разбираться с прогой.
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
25.12.2011, 21:50     Переставить слова заданного предложения в соответствии с ростом согласных в этих словах. #6
Будут вопросы - пиши.
Yandex
Объявления
25.12.2011, 21:50     Переставить слова заданного предложения в соответствии с ростом согласных в этих словах.
Ответ Создать тему
Опции темы

Текущее время: 18:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru