Не могу реализовать прогу, нужна помощь!
Исходный файл содержит текст, состоящий из букв и других символов (цифр, пробелов, точек, запятых, тире и т.д.). Известно, что каждая строка исходного текста состоит из слов, разделенных пробелами, часть из которых являются палиндромами, в которых не учитывается возможное наличие символов, отличных от букв. Используя один дек, выделить все палиндромы каждой строки (строчные и прописные буквы не различаются) и записать в новый файл. Пример: исходный текст Fy23yf! 35Fab6f B5Kfltgj-gjgtlfkb y.TРfh?Fpty. Результат выделения палиндромов: Fyyf BKfltgjgjgtlfkb yTpfhFpty
Я не могу реализовать правильно функцию сравнения через дек (почему-то не работает с нечетным количеством символов), также не знаю как сделать сравнивать одинаковые строчную и прописную буквы, а также, если подключать, не работает функция выборки только букв.
Вот мои наработки:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "Lab15.h"
#include <locale.h>
#include <sstream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
#define FNAME_I "st_i.txt"//имя исх. файла задано константной строкой
#define FNAME_R "st_r.txt"//имя рез. файла задано константной строкой
const int RAZ = 81; //максимальная длина строки
const char PR_R[] = "r"; //признак открытия файла на чтение
const char PR_W[] = "w"; //признак открытия файла на запись
typedef char t_elem; //тип информационной части элемента очереди
struct ocher //тип элемента очереди
{
t_elem data; //поле данных
ocher* link; //поле адреса
//ocher* prev; //поле обратного адреса
};
//Объявления (прототипы) функций
void make_file(char*); //функция создания файла
int proverka_file(char*, const char*); //функция проверки наличия файла
void vivod_file(char*); //вывод содержимого файла на печать
void processing(char*, char*);
char* check(char*);
//Объявления (прототипы) функций для работы с очередью
void init_ocher(ocher**, ocher**); //инициализация очереди
int pu_ocher(ocher*); //проверка очереди на пустоту
void view_ocher(ocher*); //вывод содержимого очереди
void add_ocher(t_elem, ocher**, ocher**); //добавление элемента
ocher* del_ocher(ocher*, t_elem&); //удаление элемента из очереди
ocher* del_end(ocher*, ocher*, t_elem&); //удаление последнего элемента из очереди
//main__begin_________________________________________________________________________
int main()
{
char fname_i[] = FNAME_I;
char fname_r[] = FNAME_R;
setlocale(LC_ALL, "Russian");
make_file(fname_i);
//выводим его содержимое
if (!proverka_file(fname_i, PR_R))
{
cout << " Ошибка открытия файла " << fname_i << " на чтение" << endl << " Нажмите <Enter>" << endl;
getchar();
return 0; //если исходный файл не создан
}
cout << " Содержимое исходного файла:" << endl;
vivod_file(fname_i);
//processing
processing(fname_i, fname_r);
//выводим содержимое результата
if (!proverka_file(fname_r, PR_R))
{
cout << " Ошибка открытия файла " << fname_r << " на чтение" << endl <<
" Нажмите <Enter>" << endl;
getchar();
return 0; //если результирующий файл не создан
}
cout << " Результат " << endl;
vivod_file(fname_r);
cout << endl << " Для завершения нажмите <Enter>";
getchar();
return 0;
}
void make_file(char* fname_i)
{
char st[RAZ]; //исходная строка
FILE* in; //текстовый файл
char otv; //ответ пользователя
/*Открываем файл в режиме чтения (r)
Если файл с таким именем уже есть, то либо пользователь вводит
новое имя, либо новые записи будут записаны поверх старых*/
while (proverka_file(fname_i, PR_R))
{
cout << " Файл с заданным именем уже есть! Зададите новое имя Y/N? ";
cin.get(otv);
if (otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н')
{
cout << " Введите новое имя:" << endl;
cin >> fname_i;
cin.get(); //убираем символ '\n' из потока
}
else {
cin.get(); //убираем символ '\n' из потока
break;
}
}
/*проверяем возможность открытия файла для записи
поскольку полное имя файла могло быть задано с ошибкой*/
if (!proverka_file(fname_i, PR_W))
{
cout << " Ошибка открытия файла " << fname_i << " на запись" << endl
<< " Нажмите <Enter>" << endl;
getchar();
exit(0);
}
/*Открываем файл в режиме записи (w) текста (по умолчанию).
Если файл с таким именем уже есть, то новые данные
будут записаны поверх старых*/
in = fopen(fname_i, PR_W);
cout << " Создание файла." << endl <<
" Признак окончания ввода - ввод пустой строки" << endl <<
" Введите строку и нажмите <Enter>" << endl << " ->";
cin.getline(st, RAZ); /*функция вводит строку целиком, включая
пробелы и символ \n*/
while (strlen(st))
{
fprintf(in, "%s\n", st);
cout << " Введите строку и нажмите <Enter>" << endl << " ->";
cin.getline(st, RAZ);
}
fclose(in); //закрываем файл
}
int proverka_file(char* fname, const char* pr)
{
//Открываем файл
if ((fopen(fname, pr)) == NULL) //если файл не существует
return(0);
return(1);
}
void vivod_file(char* fname)
{
FILE* in_out;
char st[RAZ]; //считанная строка
in_out = fopen(fname, PR_R); //открываем файл на чтение
fgets(st, RAZ, in_out); //читаем строку из файла in_out
while (!feof(in_out)) //пока не найден признак конца файла
{
cout << st; //выводим очередную строку на экран
fgets(st, RAZ, in_out); //читаем строку из файла in_out
}
fclose(in_out); //закрываем файл
}
void processing(char* fname_i, char* fname_r)
{
FILE* in, * out; //исходный и результирующий файлы (потоки)
char st_in[RAZ]; //обрабатываемая строка
char st_out[RAZ]; //результирующая строка
char* p = new char(RAZ); //указатель на выделенное слово
int deqsize, i=0, flag, size, j=0, k=0;
ocher* o_beg,
* o_end;
t_elem ch, n;
in = fopen(fname_i, PR_R); //открываем файл на чтение
out = fopen(fname_r, PR_W); //открываем файл на запись
fgets(st_in, RAZ, in); //читаем первую строку из файла in
while (!feof(in)) //пока не найден признак конца файла
{
st_out[0] = '\0'; //очищаем результирующую строку
p = strtok(st_in, " \n"); //выделяем первое слово (лексему).
//p = check(p);
while (p)
{
flag = 0;
j = 0;
init_ocher(&o_beg, &o_end);
for (i = 0; i < strlen(p); i++)
{
add_ocher(p[i], &o_beg, &o_end);
}
while (o_beg)
{
o_beg = del_ocher(o_beg, ch);
cout << ch << ' 1';
o_beg = del_end(o_beg, o_end, n);
cout << n << ' 2';
if (ch == n)
{
flag++;
}
j++;
}
if (flag == j)
{
strcat(st_out, p);
strcat(st_out, " "); //добавляем пробел между слов
}
p = strtok(NULL, " \n"); //выделение последующих слов NULL
}
//st_out[strlen(st_out) - 1] = '\0'; //убираем последний пробел
if (strlen(st_out)) //если строка не пустая
fprintf(out, "%s\n", st_out); //записываем строку в новый файл
fgets(st_in, RAZ, in);
}
fclose(in);
fclose(out);
}
char* check(char* p)
{
const char* letters = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
int i = 0, j = 0, k = 0;
char* n = p;
while (i < strlen(p))
{
while (j < strlen(letters))
{
if (n[i] == letters[j])
{
p[k] = n[i];
k++;
}
j++;
}
i++;
}
return(p);
}
void init_ocher(ocher** o_beg, ocher** o_end)
{
*o_beg = NULL; //в исходном состоянии очередь пуста
*o_end = NULL;
return;
}
int pu_ocher(ocher* o_beg)
{
return(o_beg == NULL); //очередь пуста - 0
//очередь не пуста - не 0
}
void view_ocher(ocher* o_beg)
{
ocher* tec = o_beg;
while (!pu_ocher(tec))
{
cout << tec->data;
tec = tec->link;
}
return;
}
void add_ocher(t_elem ch, ocher** o_beg, ocher** o_end)
{
ocher* nov = new(ocher); //выделяем память под элемент очереди
nov->data = ch; //заполняем поля
nov->link = NULL;
if (pu_ocher(*o_beg))
{
*o_beg = nov;//если очередь пуста меняем адрес головы
}
else
{
(*o_end)->link = nov; //подсоединяем новый элемент
}
*o_end = nov; //указатель на последний элемент очереди
return;
}
ocher* del_ocher(ocher* o_beg, t_elem& ch)
{
if (o_beg != NULL)
{
if (o_beg->link != NULL)
{
ocher* tec = o_beg->link; //меняем адрес головы
ch = o_beg->data; //копируем информационную часть головного элемента
delete(o_beg); //освобождаем память
return(tec); //возвращаем новый адрес головы
}
else
{
ch = o_beg->data;
delete(o_beg);
o_beg = NULL;
return(o_beg);
}
}
else
{
o_beg = NULL;
return(o_beg);
}
}
ocher* del_end(ocher* o_beg, ocher* o_end, t_elem& n)
{
if (o_beg != NULL)
{
if (o_beg->link != NULL)
{
ocher* beg = o_beg;
ocher* tec = o_beg->link;
while (tec->link != NULL)
{
tec = tec->link;
beg = beg->link;
}
n = tec->data;
beg->link = NULL;
delete(tec);
return(o_beg);
}
else
{
n = o_beg->data;
delete(o_beg);
o_beg = NULL;
return(o_beg);
}
}
}