powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите решить задачу со строками
4 сообщений из 4, страница 1 из 1
Помогите решить задачу со строками
    #40112620
Le0n41
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задан текст, состоящий из слов, разделенных пробелами или запятыми. Длина текста не больше 200 символов, могут быть использованы любые символы. Словом считать последовательность символов, не содержащую пробел (запятую). Составить массив из 4-символьных слов, расположив по алфавиту. Найти первое цифровое слово и возвести его значение в квадрат.
...
Рейтинг: 0 / 0
Помогите решить задачу со строками
    #40112636
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И какую часть этой задачи ты не в состоянии решить?
Сканирование строки с разбитием на слова?
Определение длины слова?
Определение состоит ли оно только из цифр?
Сортировку?
Перевод строки в число?
Возведение в квадрат?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите решить задачу со строками
    #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
Помогите решить задачу со строками
    #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
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите решить задачу со строками
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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