Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2022, 08:37   #1
Broken_Dreams
 
Регистрация: 15.12.2022
Сообщений: 4
Восклицание Задача со строками и файлами

С++
Задан текстовый файл Input.txt, состоящий из слов.
Разделителями между словами являются некоторое множество знаков препинания.
Удалить из каждой строки, начиная со второй, слова, которые встречаются в первой строке и записать результат
в новый файл Output.txt.Упорядочить слова в полученных строках по возрастанию количества цифр в словах,
результат сортировки записать в файл Out_sort.txt.

Нужна помощь, уже долго голову ломаю, так ничего и не вышло.

Файл вводить самому с консоли.

Последний раз редактировалось Broken_Dreams; 15.12.2022 в 13:53. Причина: Уточнение условия.
Broken_Dreams вне форума Ответить с цитированием
Старый 15.12.2022, 11:49   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,552
По умолчанию

Нужна помощь - урезать этот файл? Так, как говорится, файл - в студию!
Или всё-таки написать прогу, которая это делает? На всех существующих в мире языках программирования?
--------------------
Ну вот - совсем другое дело.

Последний раз редактировалось digitalis; 15.12.2022 в 23:23. Причина: Условие уточнено
digitalis вне форума Ответить с цитированием
Старый 16.12.2022, 06:52   #3
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Код:
#include <string.h>
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <fstream>

using namespace std;

bool is_separator(char elem) {
  return (elem == ' ') || (elem == ',') || (elem == '.');
}

bool is_digit(char elem) {
  return ('0' <= elem) && (elem <= '9');
}

enum part_type_t {_part_type_word, _part_type_separators};

// часть текста
struct part_t {
  part_type_t type;
  const char* elems; // не завершается нулевым элементом ('\0')
  int len;
  int digits_count;
};

// разбивает текст на части
vector<part_t> get_parts(const char* text, bool need_separators) {
  vector<part_t> parts;
  int pos = 0;
  for (;;) {
    // сканируем разделители
    int start = pos;
    while (is_separator(text[pos])) {pos++;}
    if (need_separators && (pos > start)) {
      part_t p;
      p.type = _part_type_separators;
      p.elems = text + start;
      p.len = pos - start;
      p.digits_count = -1; // нет определённого значения
      parts.push_back(p);
    }
    if (text[pos] == '\0') {break;} // если дошли до конца текста
    // сканируем слово
    start = pos;
    int digits_count = 0;
    do {
      if (is_digit(text[pos])) {digits_count++;}
      pos++;
    } while ((text[pos] != '\0') && !is_separator(text[pos]));
    part_t p;
    p.type = _part_type_word;
    p.elems = text + start;
    p.len = pos - start;
    p.digits_count = digits_count;
    parts.push_back(p);
  }
  return parts;
}

bool has_part(const vector<part_t>* parts, const part_t* part) {
  for (int i = 0; i < parts->size(); i++) {
    const part_t* p = &(*parts)[i];
    if ((p->len == part->len) && (memcmp(p->elems, part->elems, part->len) == 0)) {
      return true;
    }
  }
  return false;
}

ostream& operator<<(ostream& stream, const part_t& part) {
  stream.write(part.elems, part.len);
  return stream;
}

int main() {
  ifstream input_file("Input.txt");
  if (input_file.fail()) {
    cerr << "Cannot open file." << endl;
    return 1;
  }
  ofstream output_file_1("Output.txt");
  ofstream output_file_2("Out_sort.txt");
  if (output_file_1.fail() || output_file_2.fail()) {
    cerr << "Cannot create file." << endl;
    return 1;
  }
  string first_line;
  getline(input_file, first_line);
  vector<part_t> discard_words = get_parts(first_line.c_str(), /*need_separators:*/false);
  while (!input_file.eof()) {
    string line;
    getline(input_file, line);
    vector<part_t> parts = get_parts(line.c_str(), /*need_separators:*/true);
    // фильтруем слова
    int i = 0;
    while (i < parts.size()) {
      if ((parts[i].type == _part_type_word) && has_part(&discard_words, &parts[i])) {
        parts.erase(parts.begin() + i);
      } else {
        output_file_1 << parts[i];
        i++;
      }
    }
    output_file_1 << '\n';

    // сортируем оставшиеся слова
    for (int i = 0; i < parts.size(); i++) {
      if (parts[i].type == _part_type_word) {
        // ищем «минимальное» слово, начиная с i-го
        int min = i;
        for (int k = i + 1; k < parts.size(); k++) {
          if ((parts[k].type == _part_type_word) && (parts[k].digits_count < parts[min].digits_count)) {
            min = k;
          }
        }
        // ставим «минимальное» слово в позицию i
        if (i != min) {
          swap(parts[i], parts[min]);
        }
      }
      output_file_2 << parts[i];
    }
    output_file_2 << '\n';
  }
  return 0;
}
Файл Input.txt:
Код:
the, me
step 333 aside, 22 let 1 me explain
the name of the 333 game 22 is 1 pain
Файл Output.txt:
Код:
step 333 aside, 22 let 1  explain
 name of  333 game 22 is 1 pain
Файл Out_sort.txt:
Код:
step aside let, explain 1 22  333
 name of  game is pain 1 22 333
Цитата:
Сообщение от Broken_Dreams Посмотреть сообщение
Файл вводить самому с консоли.
Я не вводил файл Input.txt в консоли, я создал его в текстовом редакторе.
Пётр Седов вне форума Ответить с цитированием
Старый 16.12.2022, 21:58   #4
Broken_Dreams
 
Регистрация: 15.12.2022
Сообщений: 4
По умолчанию

Спасибо большое!

Вроде со всем разобрался, разве что вопросы с

Код:
ostream& operator<<(ostream& stream, const part_t& part) {
  stream.write(part.elems, part.len);
  return stream;
}
Для чего используется & с ostream?
Broken_Dreams вне форума Ответить с цитированием
Старый 17.12.2022, 03:29   #5
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Цитата:
Сообщение от Broken_Dreams Посмотреть сообщение
Для чего используется & с ostream?
ostream& -- ссылка на объект типа ostream.
const part_t& -- const-ссылка на объект типа part_t (в данном случае «const» значит «read only»).
Ссылки -- это аналог указателей, с некоторыми отличиями:
1. Ссылка в момент создания обязательно связывается с каким-нибудь объектом, и за время своей жизни ссылается только на этот объект, это никак легально не поменять. Указатель необязательно инициализировать в момент создания, и за время своей жизни он может указывать на разные объекты.
2. Синтаксические различия:
Код:
pointer->method();
reference.method();
3. Указатель может легально указывать «вникуда» (NULL, nullptr), ссылка -- нет.
4. const-ссылка продлевает время жизни временного объекта:
Код:
const string& file_name = add_extension("Input"); // результат вызова функции -- временный неименованный объект
// временный объект до сих пор существует
// а без const-ссылки он был бы уничтожен сразу же
----------------
Например, стандартные функции std::getline и std::swap принимают объекты через ссылки, но я так не люблю, я в таких случаях использую указатели. Потому что ссылки реально нужны для:
* Конструктор копирования.
* Перегрузка операторов.
* Ловля исключений (exceptions).
Цитата:
Сообщение от Broken_Dreams Посмотреть сообщение
Код:
ostream& operator<<(ostream& stream, const part_t& part) {
  stream.write(part.elems, part.len);
  return stream;
}
Так обычно делают, когда используют iostreams: перегрузка оператора << для своего типа. Но можно и обычную функцию сделать:
Код:
void write(ostream* stream, const part_t* part) {
  stream->write(part->elems, part->len);
}
Используем так:
Код:
write(&output_file_1, &parts[i]); // в данном случае, & -- это получение указателя на объект, а не ссылка
А можно вообще без функции:
Код:
output_file_1.write(parts[i].elems, parts[i].len);
Пётр Седов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача со строками и файлами cipove1946 Помощь студентам 4 13.01.2022 19:30
Задача со строками и работой с файлами Richardqdw Помощь студентам 5 09.12.2016 20:42
задача на работу с файлами и строками MiH@N Помощь студентам 8 24.06.2008 00:44