Гость
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите решить задачу со строками / 4 сообщений из 4, страница 1 из 1
17.11.2021, 16:35
    #40112620
Le0n41
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите решить задачу со строками
Задан текст, состоящий из слов, разделенных пробелами или запятыми. Длина текста не больше 200 символов, могут быть использованы любые символы. Словом считать последовательность символов, не содержащую пробел (запятую). Составить массив из 4-символьных слов, расположив по алфавиту. Найти первое цифровое слово и возвести его значение в квадрат.
...
Рейтинг: 0 / 0
17.11.2021, 17:13
    #40112636
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите решить задачу со строками
И какую часть этой задачи ты не в состоянии решить?
Сканирование строки с разбитием на слова?
Определение длины слова?
Определение состоит ли оно только из цифр?
Сортировку?
Перевод строки в число?
Возведение в квадрат?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.11.2021, 12:51
    #40112804
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите решить задачу со строками
Еще не пятница. Но... первая часть задания может выглядеть как-то так.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
string s = "5555. The quick brown fox jumps over lazy dog. Hoola-hoola girls like hooligans. 0000, 0001, 9999"

auto quad_words(string s) {
 return split(s, " ,") 
                  | filter([](auto s) { return s.length == 4 ) 
                  | sort(....);
}



Надо только найти правильные лямбды для фильтра, сплита и сортировки.
...
Рейтинг: 0 / 0
20.11.2021, 05:18
    #40113298
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите решить задачу со строками
Le0n41, попробуйте так:
Код: plaintext
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.
123.
124.
125.
126.
#include <assert.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void parse_text(const char* text);
void handle_word(const char* word, int word_len);
int try_convert_to_int(const char* word, int word_len);
int compare_short_words(const void* word_1, const void* word_2);

int main() {
  parse_text("when they read tiny data item like ' zone - 5m = -12 + 1000 ', it is done real fast");
  return 0;
}

const int _max_text_len = 200;
const int _short_word_len = 4;
const int _max_short_words_count = _max_text_len / (_short_word_len + 1);

struct short_word_t {
  const char* elems; // не завершается нулевым элементом '\0'
};

short_word_t _short_words[_max_short_words_count];
int _short_words_count;
bool _handled_number;

void parse_text(const char* text) {
  assert(strlen(text) <= _max_text_len);

  _short_words_count = 0;
  _handled_number = false;

  int pos = 0;
  for (;;) {
    // пропускаем пробелы и запятые
    while ((text[pos] == ' ') || (text[pos] == ',')) {
      pos++;
    }

    if (text[pos] == '\0') { // если дошли до конца текста
      break;
    }

    // сканируем слово
    int word_start = pos;
    do {
      pos++;
    } while ((text[pos] != ' ') && (text[pos] != ',') && (text[pos] != '\0'));
    handle_word(text + word_start, pos - word_start);
  }

  // сортируем короткие слова
  qsort(_short_words, _short_words_count, sizeof(short_word_t), &compare_short_words);
  printf("Sorted short words:\n");
  for (int i = 0; i < _short_words_count; i++) {
    printf("%.*s\n", _short_word_len, _short_words[i].elems);
  }
}

void handle_word(const char* word, int word_len) {
  //printf("%.*s\n", word_len, word); // для отладки

  if (word_len == _short_word_len) {
    // добавляем короткое слово в массив
    assert(_short_words_count < _max_short_words_count);
    _short_words[_short_words_count].elems = word;
    _short_words_count++;
  }

  if (!_handled_number) {
    int n = try_convert_to_int(word, word_len);
    if (n != INT_MIN) {
      printf("square(%i) = %i\n", n, n * n);
      _handled_number = true;
    }
  }
}

// если слово не является целым числом, то возвращает INT_MIN
// не обрабатывает переполнение (overflow)
int try_convert_to_int(const char* word, int word_len) {
  assert(word_len >= 1);
  int pos = 0;

  // сканируем знак
  bool minus = false;
  if (word[pos] == '+') {
    pos++;
  } else if (word[pos] == '-') {
    minus = true;
    pos++;
  }

  if (pos == word_len) {
    return INT_MIN;
  }

  // сканируем цифры
  int num = 0;
  do {
    char e = word[pos];
    if (('0' <= e) && (e <= '9')) {
      num = 10 * num + (e - '0');
    } else {
      return INT_MIN;
    }
    pos++;
  } while (pos < word_len);

  if (minus) {
    num = -num;
  }

  return num;
}

// если слово_1 < слово_2, то возвращает число < 0
// если слово_1 = слово_2, то возвращает 0
// если слово_1 > слово_2, то возвращает число > 0
int compare_short_words(const void* word_1, const void* word_2) {
  const short_word_t* w1 = static_cast<const short_word_t*>(word_1);
  const short_word_t* w2 = static_cast<const short_word_t*>(word_2);
  return memcmp(w1->elems, w2->elems, _short_word_len);
}

Вывод на консоль:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
square(-12) = 144
Sorted short words:
1000
data
done
fast
item
like
read
real
they
tiny
when
zone
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите решить задачу со строками / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]