#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);
}
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
#include <iostream>
#include <string.h>
using namespace std;
struct Line { //Элемент списка
char s[256];
Line *next;
};
//Создать список
Line *GetLines()
{
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;
}
return Line0;
}
//Обработка строк
void ProcessLines(Line *LineTemp)
{
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; //Следующий элемент
}
}
//Вывод результата
void PrintLines(Line *LineTemp)
{
while (LineTemp) {
cout<<LineTemp->s<<endl;
LineTemp = LineTemp->next;
}
}
//Очистить память
void FreeLines(Line *LineTemp)
{
Line *Line0;
while (LineTemp) {
Line0=LineTemp;
LineTemp = LineTemp->next;
delete(Line0);
}
}
int main(int argc, char** argv)
{
//Создать список
Line *LineFirst = GetLines();
//Обработка строк
ProcessLines(LineFirst);
//Вывод результата
PrintLines(LineFirst);
//Очистить память
FreeLines(LineFirst);
}
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.