Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Академик
Рейтинг: 10366
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Академик
Рейтинг: 3906
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2378
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1732
Дата выхода:15.04.2012, 21:00
Администратор рассылки:Киселёва Алёна aka Verena (Академик)
Подписчиков / экспертов:147 / 96
Вопросов / ответов:1 / 1

Консультация # 185796: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Из входного потока вводится произвольное число строк. Длина строки не ограничена. Каждая строка представляет собой последовательность двоичных кодов, разделённых одним или несколькими пробелами и/или знаками табуляции. Строка представлена списком (первое поле элемента списка ...


Консультация # 185796:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Из входного потока вводится произвольное число строк. Длина строки не ограничена. Каждая строка представляет собой последовательность двоичных кодов, разделённых одним или несколькими пробелами и/или знаками табуляции. Строка представлена списком (первое поле элемента списка - символ строки, второе указатель на следующий элемент списка или NULL в конце списка). Конец ввода определяется кнцом файла.
Для каждой строки сформировать новую строку, поместив в неё исходные двоичные коды, дополненные БИТОМ ЧЁТНОСТИ.
Бит сётности устанавливается 0 или 1 так, чтобы общее количество единиц в полученном коде было чётным. В полученной строке коды разделять ТОЛЬКО ОДНИМ пробелом. Полученную строку вывести в выходной поток.

Примечания:

  • Ввод строк неопределённой длины должен быть организован с помощью метода cin.getline (куда, максимум_сколько). М етод cin >> [i]куда не использовать![/i]

  • Структурв программы должна быть следующей: пока не обнаружен кнец файла { ввести строку с помощью cin.getline(...)
; сформировать список; обработать список в соответствии с условием задачи; вывести результат, освободить память, выделенную под список}.
  • Новый список формировать, модифицируя исходный список

Дата отправки: 09.04.2012, 20:36
Вопрос задал: Denis (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Бизин Михаил Анатольевич (4-й класс):

Здравствуйте, Denis!
Программа для GCC C++
Длина строки ограничена 256 байтами, переполнение не контролируется. Комментарии в коде.

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

using namespace std;

struct Line { //Элемент списка
  char s[256];
  Line *next;
};

int main(int argc, char** argv)
{
  char s[256];   //Временная строка
  Line *Line0, *LineTemp, *LinePrev;
  LinePrev=0;                  //Ссылка на предыдущий элемент
  while (cin.getline(s,255)) { //Считаем строку
    LineTemp = new Line;       //Выделим память для элемента списка
    strcpy(LineTemp->s, s);    //Скопировать считанную строку в элемент списка
    if (LinePrev) {            //Если определён предыдущий элемент
      LinePrev->next=LineTemp; //Сослаться на текущий элемент
    } else {
      Line0=LineTemp;          //Или запомнить как первый элемент
    }
    LinePrev=LineTemp;
  }

  //Обработка строк
  LineTemp=Line0;              //Первый элемент списка
  while (LineTemp) {           //Переберём все элементы
    int i=0;                   //Индекс символов исходной строки
    int j=0;                   //Индекс символов результирующей строки
    char ch,ch1;
    char b[256];               //Результирующая строка
    int spaces=0;              //Флаг окончания двоичного числа
    int ones=0;                //Количество единиц в двоичном числе
    while (1) {                //Пробежимся по исходной строке
      ch=LineTemp->s[i++];     //Очередной символ
      if ((ch=='\t')||(ch==' ')||(ch==0)) { //Если встретился разделитель или конец строки
        if (!spaces&&j) {      //и не начало строки, значит число закончилось
          ch1='0';
          if (ones&1) ch1='1'; //Если нечётное количество единиц, то добавить единицу
          b[j++]=ch1;
          ones=0;
        }
        if (ch==0) break;     //Если конец строки, то прервать цикл
        spaces=1;             //Поднять флаг разделителя
      } else {                //число
        if (spaces&&j) b[j++]=' '; //Заменить все разделители на пробел
        spaces=0;
        if (ch=='1') ones++;  //Считаем единицы
        b[j++]=ch;            //Заполняем результирующую строку
      }
    }
    b[j]=0;                   //Не забудем обозначить конец строки
    strcpy(LineTemp->s,b);    //Заменить строку на обработанную
    LineTemp = LineTemp->next; //Следующий элемент
  }

  //Вывод результата
  LineTemp=Line0;
  while (LineTemp) {
    cout<<LineTemp->s<<endl;
    LineTemp = LineTemp->next;
  }

  //Очистить память
  LineTemp=Line0;
  while (LineTemp) {
    Line0=LineTemp;
    LineTemp = LineTemp->next;
    delete(Line0);
  }


Для исходного файла text.txt:
Код :
  1001011010 1010010101    0101010010			1000010101010	  
00101010101001		101010010	101010010101  10101010  
          10011001 01010 01 0011 010


Результат работы:
Код :
bizin:~/RFpro/185796$ cat text.txt | ./main
10010110101 10100101011 01010100100 10000101010101
001010101010010 1010100100 1010100101010 101010100
100110010 010100 011 00110 0101

Файл text.txt передаётся в поток как входной для нашей программы. Можно просто запустить программу и вводить строки вручную.
Если есть вопросы, спрашивайте.

Консультировал: Бизин Михаил Анатольевич (4-й класс)
Дата отправки: 12.04.2012, 21:57

5
нет комментария
-----
Дата оценки: 13.04.2012, 09:27

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное