Консультация № 184776
13.12.2011, 17:25
61.36 руб.
0 3 1
Здравствуйте! У меня возникли сложности с таким вопросом:
Содержимое заданного текстового файла F, разделенного на строки, переписать в текстовый файл G, перенося при этом в конец каждой строки все входящие в нее цифры (с сохранением исходного взаимного порядка как среди цифр, так и среди остальных литер строки).
В решении задачи использовать очередь. В gcc.

Обсуждение

давно
Академик
320937
2216
13.12.2011, 22:17
общий
Добрый день! Си или Си++?
Неизвестный
13.12.2011, 22:38
общий
Адресаты:
C++
Неизвестный
20.12.2011, 14:37
общий
это ответ
Здравствуйте, Посетитель - 381396!
Вот вариант решения. В очереди хранятся буквы строки, так ими удобно манипулировать.
Нет под рукой gcc, если будут проблемы с компиляцией в нём, пишите, попробуем решить.
По алгоритму всё должно быть ясно из комментариев.
Удачи!

Приложение:
struct Elem { //очередь
char ch; //буква
Elem* next; //следующая
Elem* back; //предыдущая
};

void Add (Elem*&first, char c) //добавление в конец
{
Elem* n = new Elem; //создаём новый элемент
n->ch = c;
n->next = NULL;
if (first==NULL) { //если список пуст
first = n; //новый будет первым
n->back = NULL;
} else { //иначе ищем кокнец очереди
Elem* t = first;
while (t->next!=NULL) t = t->next;
t->next = n; //и добавляем в конец
n->back = t;
}
}

void Print (Elem* first, FILE* file) //печать в файл
{
Elem* t = first;
while (t!=NULL) { //идём по списку
fputc (t->ch, file); //печатаем букву
t = t->next; //переходим на следующую
}
fputc ('\n', file); //делаем перевод строки
}

void Clear (Elem*&first) //очистка списка
{
Elem* t;
while (first!=NULL) {
t = first;
first = first->next;
delete t;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
FILE* in = fopen ("C:\\f.txt", "rt"); //входной файл
FILE* out = fopen ("C:\\g.txt", "wt"); //выходной
if (in==NULL || out==NULL) return -1; //если не открылись - выходим
while (!feof(in)) { //пока не кончится файл
char t;
int count = 0;
Elem* first = NULL; //новый список
while ((t=fgetc(in))!='\n' && t!=EOF) { //читаем посимвольно до конца строки или файла
Add (first, t); //добавляем букву в список
count++; //считаем количество
}
if (t==EOF && count == 0) break; //если файл кончился и ни одного символа нет - выходим
Elem* tmp = first;
int i = 0;
while (i<count) { //обходим список
i++;
if (tmp->ch>='0' & tmp->ch<='9') { //если цифра
Elem* tmp1 = tmp; //находим конец списка
while (tmp1->next!=NULL) tmp1 = tmp1->next;
tmp1->next = tmp; //кладём туда цифру и освобождаем исходную позицию
if (tmp->back!=NULL) tmp->back->next = tmp->next;
else first = tmp->next;
if (tmp->next!=NULL) tmp->next->back = tmp->back;
Elem* next = tmp->next; //сохраняем следующий для перехода
tmp->next = NULL; //меняем ссылки у исходного
tmp->back = tmp1;
tmp = next; //переходим на следующий
} else tmp = tmp->next; //если буква - просто пропускаем
}
Print (first, out); //печатаем строку в файл
Clear (first); //очищаем список
}
fclose (in); //закрываем файлы
fclose (out);
//_getch();
return 0;
}

Форма ответа