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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2021, 21:40   #1
Tamada
 
Регистрация: 08.03.2021
Сообщений: 7
Печаль После выполнения программа выводит лишнее

Здравствуйте! Мне нужно написать программу, которая выведет на экран и в файл последовательности цифр, в которых не повторяются цифры. В файле последовательности отделены одним и более пробелов, переводом строки, каретки. В выходном файле все последовательности должны быть записаны через одиночный пробел. Проблема такова. что после выполнения программы, кроме нужной мне последовательности, в конце может выводится какое-либо число, которое не должно было выводиться вовсе.
Например, в файле содержится следующее:
5 \n76
\t77 78 9 89
00 78 12
13
1

Вывести должно: 5 76 78 9 89 78 12 13 1, а выводит: 5 76 78 9 89 78 12 13 1 1

Код:
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

//добавляем в вектор все последовательности, удовлетворяющие заданию
vector<char> processText(const char* const text,int counter) {
  vector<char> vec;
  int a = 0;
  for (int i = 0; i < counter; ++i) {
      if (text[i] == ' ' || text[i] == '\0' || text[i] == '\n' || text[i] == '\t') {
          bool x = 1;
          for (int j = a; j < i; ++j) {
              for (int h = j + 1; h < i; ++h) {
                  if (text[j] == text[h]) {
                      x = 0;
                      break;
                  }
              }

          }
          if (x) {
              bool x2 = 0;
              for (int k = a; k < i; ++k) {
                  vec.push_back(text[k]);
                  x2 = 1;
              }
              if (x2)
                  vec.push_back(' ');
          }
          a = i + 1;
      }
  }
  return vec;
}

//удаляем лишние пробелы
char* ch_duplicate(char* s, char c) {
    char* t = s, * p = s;
    while (*p) {
        if (*p != c || *(p + 1) != c)
            ++s;
        *s = *(++p);
    }
    return t;
}

//удаляем символы перевода строки и каретки(если смотреть по примеру, то они в исходном файле
//присутствуют в виде символов)
char* ch_deleter(char* text,int counter) {
    for (int i = 0; i < counter; ++i) {
        if (text[i] == '\\' || text[i] == 'n' || text[i] == 't') {
            text[i] = ' ';
        }
    }
    return text;
}


int main() {
    ifstream ifs; //объект класса ifstream для открытия файла для чтения
    ifs.open("input.txt");//открываем файл
    int counter = 0;//счетчик символов в файле
    //считаем символы
    
    while (ifs)
    {
        char ch;
        ch = ifs.get();
        counter++;
    }
    ifs.close();//закрыли файл
    //открыли снова, чтобы заполнить массив 
    ifs.open("input.txt");
    char* text = new char[counter];//объявляем массив размера counter
    
    ifs.getline(text, counter, '\0'); //считываем все символы из файла
    ch_deleter(text,counter); //удаляем символы перевода строки и каретки, которые представлены в виде символов
    ch_duplicate(text, ' '); //удаляем лишние проеблы

    vector<char> vec = processText(text,counter);//заполняем вектор последовательностями, подходящими по условию
    
    //поскольку практика показывает, что в конце вектора могут оставаться пробелы, то находим последнюю цифру
    int i2;
    for (int i = vec.size()-1; i != 0; --i) {
        if (!isdigit(vec[i]))
        {
            i2 = i;
            break;
        }
    }

    ofstream ofs; //заводим объект класса ofstream для вывода в файл
    //открываем файл для вывода
    ofs.open("output.txt");
    //выводим на экран и в файл наш ответ
    for (int i = 0; i < i2; ++i) {
        cout << vec[i];
        ofs << vec[i];
    }
    ofs.close();
    ifs.close();
    delete[]text;//освобождаем память, выделенную под массив
    return 0;
}
Все то, что у меня написано - так быть и должно по заданию. Вопрос в том, почему он неправильно работает?В чем я ошибся при написании функции обработки текста(та, что с вектором)?
Tamada вне форума Ответить с цитированием
Старый 09.03.2021, 08:35   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Tamada Посмотреть сообщение
if (text[i] == '\\' || text[i] == 'n' || text[i] == 't')
Тут (ch_deleter) наверное надо '\n' '\t' проверять а не символы n и t.

processText проглатывает повторяющиеся значения 55 77 и др. Она вообще как то странно работает. В результате в векторе у вас совсем другой набор данных чем в исходной строке.
Выводить можно вот так:
Код:
for (int i = 0; i < vec.size(); i++) {
        cout << vec[i];
        ofs << vec[i];
    }
Разберитесь с функцией processText.

Цитата:
Сообщение от Tamada Посмотреть сообщение
int counter = 0;//счетчик символов в файле
А затем поудаляли лишние символы из строки но счетчик почему то не трогаете. И проверяете излишнюю длину строки.

И в processText зачем столько сложностей??

Вот одна единственная функция которая должна быть и которая делает все что нужно со строкой.
Код:
vector<char> processText(const char* const text, int counter) {
    vector<char> vec;

    for (int i = 0; i < strlen(text); ++i)
    {
        if (isdigit(text[i]))
        {
            vec.push_back(text[i]);
        }
        else if (vec.size()>0 && vec[vec.size() - 1] != ' ')
            vec.push_back(' ');
    }
    return vec;
}

И функции ch_duplicate и ch_deleter вообще не нужны.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 09.03.2021 в 09:07.
WorldMaster вне форума Ответить с цитированием
Старый 09.03.2021, 09:50   #3
Tamada
 
Регистрация: 08.03.2021
Сообщений: 7
По умолчанию

Мне нужно, чтобы выводились все числа, в которых не повторяются цифры. Поэтому process Text лишнего не проглатывает. По поводу ch_delete выправы, да, она не нужна, но повторяюсь, при данных, которые я указал в теме, программа в конце выводит лишнюю цифру. Вопрос - почему?
Tamada вне форума Ответить с цитированием
Старый 09.03.2021, 10:35   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Tamada Посмотреть сообщение
Вопрос - почему?
Ну вот же ответ.
Цитата:
Сообщение от WorldMaster Посмотреть сообщение
А затем поудаляли лишние символы из строки но счетчик почему то не трогаете. И проверяете излишнюю длину строки.

вначале посчитали грубо counter 44, затем удалили из него все переводы табуляторы и прочее стало грубо 40.
А вы передаете в функцию все также свои 44. Ну и очевидно же что хвост захватываете который уже неактуален.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 09.03.2021, 12:09   #5
Tamada
 
Регистрация: 08.03.2021
Сообщений: 7
По умолчанию

Это да, я уберу все лишние элементы и перевыделю память
Tamada вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[VBScript] Скрипт не выводит результат выполнения ichi JavaScript, Ajax 3 23.10.2018 09:47
[Pascal] После ввода входных данных программа ничего не выводит, хотя дальнейшие инструкции имеются. LinaMin Помощь студентам 3 19.10.2017 19:40
Программа не выходит после выполнения (Язык С) RaccoonRocket Помощь студентам 2 08.02.2016 14:13
TSR программа через некоторое время после запуска выводит на экран простейший графический объект, позволяя управлять им стрелками. Custom_L.E. Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 17.05.2012 16:26
Окно после выполнения запроса mortal2010 Microsoft Office Access 6 25.02.2011 13:18