Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабы - 2 сем - Калмычков / лаба 4 - 2 сем ПРОГРАММИРОВАНИЕ.docx
Скачиваний:
0
Добавлен:
09.07.2025
Размер:
240.85 Кб
Скачать
  1. Алгоритм работы

ReadV

ReadFile

Print

PrintFile


Deleting

Process


  1. Текст программы

ListV.cpp

#include "FormV.h"

using namespace std;

bool ListNodeV::ReadV(std::ifstream& input, std::ofstream& res)

{

if (input.eof())

return false;

char s = 0;

int counter = 0;

f_H.head = new ListNodeH;

f_H.cur = f_H.head;

while (s != '\n')

{

if (input.eof())

break;

input >> noskipws >> s;

if (input.eof())

break;

if (s == '\n' || s == 0) //!! if (s == '\n')

break;

f_H.cur->podstroka.massiv[counter % N] = s;

++counter;

if (counter % N == 0)

{

f_H.cur->podstroka.len = N;

f_H.cur->next = new ListNodeH;

f_H.cur = f_H.cur->next;

f_H.count++; }}

f_H.cur->podstroka.len = counter % N;

return true;}

void ListNodeV::PrintV(std::ofstream& res)

{

f_H.cur = f_H.head;

f_H.count = 0;

if (f_H.head == nullptr)

return;

while (f_H.cur != nullptr)

{

for (int i = 0; i < f_H.cur->podstroka.len; i++)

{

cout << f_H.cur->podstroka.massiv[i];

res << f_H.cur->podstroka.massiv[i];

}

cout << " -> ";

res << " -> ";

f_H.cur = f_H.cur->next;

f_H.count++;

}

cout << " NULL_H" << endl;

res << " NULL_H" << endl;

cout << f_H.count;

}

main.cpp

#pragma once

#include <string>

#include <iostream>

#include <fstream>

#include <iomanip>

static const int N = 10;

StrL.h

#pragma once

#include "ConstN.h"

struct StrL

{

char massiv[N];

int len = 0;

};

ListV.h

#pragma once

#include "FormH.h"

struct ListNodeV

{

FormularH f_H;

ListNodeV* next = nullptr;

ListNodeV* next1 = nullptr;

int col;

bool ReadV(std::ifstream& input, std::ofstream& res);

void PrintV(std::ofstream& res);

};

All_func.h

#pragma once

#include "FormV.h"

void function3(FormularV& F1, std::ofstream& res, FormularV& F2, FormularV& F3);

void function33(FormularV& F1, std::ofstream& res, FormularV& F2, FormularV& F3);

void deleting(FormularV& formularVert, std::ofstream& res);

bool Read_file(std::ifstream& input, std::ofstream& res, FormularV& formularVert);

void Process(std::ofstream& res, std::string in_filename, std::string in_filename2);

void Print_file(std::ofstream& res, FormularV& formularVert);

ListH.h

#pragma once

#include "StrL.h"

struct ListNodeH

{

StrL podstroka;

ListNodeH* next = nullptr;

};

FormH.h

#pragma once

#include "ListH.h"

struct FormularH

{

ListNodeH* head = nullptr;

ListNodeH* cur = nullptr;

ListNodeH* last = nullptr;

ListNodeH* prev = nullptr;

int count;

};

FormV

#pragma once

#include "ListV.h"

struct FormularV

{

ListNodeV* head = nullptr;

ListNodeV* cur = nullptr;

ListNodeV* last = nullptr;

ListNodeV* prev = nullptr;

};

ConstN.h

#pragma once

#include <string>

#include <iostream>

#include <fstream>

#include <iomanip>

static const int N = 10;

Process.cpp

#include "ConstN.h"

#include "FormV.h"

#include "All_func.h"

using namespace std;

bool Read_file(std::ifstream& input, std::ofstream& res, FormularV& formularVert)

{

if (input.eof())

{

cout << "SPISOK PUST" << endl;

return false;}

formularVert.head = new ListNodeV;

formularVert.cur = formularVert.head;

while (!input.eof())

{

if (formularVert.cur->ReadV(input, res))

{

formularVert.cur->next = new ListNodeV;

formularVert.prev = formularVert.cur;

formularVert.cur = formularVert.cur->next; }

else

break; }

if (formularVert.cur->f_H.head == nullptr && formularVert.prev != nullptr)

{

delete formularVert.cur;

formularVert.prev->next = nullptr;

}

return true;

}

void Print_file(std::ofstream& res, FormularV& formularVert)

{

formularVert.cur = formularVert.head;

while (formularVert.cur != nullptr)

{

formularVert.cur->PrintV(res);

cout << endl

<< "---> " << endl

<< endl;

res << endl

<< "---> " << endl

<< endl;

formularVert.cur = formularVert.cur->next;

}

cout << " NULL_V " << endl

<< endl;

;

res << " NULL_V " << endl

<< endl;

;

}

void deleting(FormularV& formularVert, std::ofstream& res)

{

formularVert.cur = formularVert.head;

FormularV tmp4;

if (formularVert.cur == nullptr)

{

cout << " Список пуст " << endl;

res << " Список пуст " << endl;

return;

}

while (formularVert.cur != nullptr)

{

FormularH tmp3;

formularVert.cur->f_H.cur = formularVert.cur->f_H.head;

while (formularVert.cur->f_H.cur != nullptr)

{

tmp3.cur = formularVert.cur->f_H.cur->next;

delete formularVert.cur->f_H.cur;

formularVert.cur->f_H.cur = tmp3.cur;

}

tmp4.cur = formularVert.cur->next;

delete formularVert.cur;

formularVert.cur = tmp4.cur;

}

}

void function33(FormularV& F1, std::ofstream& res, FormularV& F2, FormularV& F3)

{

int flag_h = 0;

int flag_H = 0;

int flag4 = 0;

F1.cur = F1.head;

F1.prev = nullptr;

int FLAG = 0;

int pop = 1;

int rrr = 0;

F3.last = nullptr;

F3.head = new ListNodeV; // создание 3-его списка

F3.cur = F3.head; // занесение головы в текущий элемент

if (F1.cur == nullptr)

{cout << " пустой верт. список! " << endl; return;}

while (F1.cur != nullptr){

cout << "\n\n\n" << pop++ << " слово списка 1\n\n";

F2.cur = F2.head;

if (F2.cur == nullptr){

cout << " пустой второй верт. список! " << endl; return;

}

F2.prev = nullptr;

F1.cur->f_H.cur = F1.cur->f_H.head;

//F3.cur->f_H.head = new ListNodeH; // СОЗДАНИЕ ГОЛОВЫ ГОРИЗОНТАЛЬНОГО СПИСКА

// F3.cur->f_H.cur = F3.cur->f_H.head; // ЗАНЕСЕНИЕ ГОЛОВЫ В ТЕКУЩИЙ

int count1f = F1.cur->f_H.count;

while (F2.cur != nullptr)

{

F2.cur->f_H.cur = F2.cur->f_H.head;

int count2f = F2.cur->f_H.count;

cout << count1f << " " << count2f;

if (count1f == count2f){

cout << "ОДИНАКОВАЯ ДЛИНА\n";

int j = 0;

while (F1.cur->f_H.cur != nullptr){

for (int i = 0; i < N; i++) {

if (F1.cur->f_H.cur->podstroka.massiv[i] == F2.cur->f_H.cur->podstroka.massiv[i]) {

flag_h = 1;}

else {

flag_h = 0;

cout << "разные символы\n";

F1.cur->f_H.cur = F1.cur->f_H.head;

F2.cur->f_H.cur = F2.cur->f_H.head;

break;}}

if (flag_h == 1) {

flag_H = 1;

F1.cur->f_H.cur = F1.cur->f_H.cur->next;

F2.cur->f_H.cur = F2.cur->f_H.cur->next;}

else {

flag_H = 0;

break;}}}

else{

cout << "РАЗНАЯ ДЛИНА\n";

flag_H = 0;}

if (flag_H == 1){

cout << "FFFFFFFодинаковые слова!!!\n";

F1.cur->f_H.cur = F1.cur->f_H.head;

F2.cur->f_H.cur = F2.cur->f_H.head;

F2.prev = F2.cur;

F2.cur = F2.cur->next;

FLAG = 10;}

else {

F1.cur->f_H.cur = F1.cur->f_H.head;

F2.cur->f_H.cur = F2.cur->f_H.head;

F2.prev = F2.cur;

F2.cur = F2.cur->next;}}

cout << "\n\n\nСравнение с 3 списком\n\n";

F3.cur = F3.head;

while (rrr != 0){

F3.cur->f_H.head = new ListNodeH; // СОЗДАНИЕ ГОЛОВЫ ГОРИЗОНТАЛЬНОГО СПИСКА

F3.cur->f_H.cur = F3.cur->f_H.head; // ЗАНЕСЕНИЕ ГОЛОВЫ В ТЕКУЩИЙ

F3.cur->f_H.count = F1.cur->f_H.count;

cout << F3.cur->f_H.count << "BBBBBBBBBBBBBBBBB";

while (F1.cur->f_H.cur != nullptr)

{

//cout << "сравнение символов\n\n";

for (int i = 0; i < N; i++) {

F3.cur->f_H.cur->podstroka.massiv[i] = F1.cur->f_H.cur->podstroka.massiv[i];

F3.cur->f_H.cur->podstroka.len = F1.cur->f_H.cur->podstroka.len;

//cout << F3.cur->f_H.cur->podstroka.massiv[i] << " " << F1.cur->f_H.cur->podstroka.massiv[i] << "\n";

}

F1.cur->f_H.cur = F1.cur->f_H.cur->next;

F3.cur->f_H.cur->next = new ListNodeH;

F3.cur->f_H.cur = F3.cur->f_H.cur->next;

}

int j = 0;

F3.prev = F3.cur;

F3.last = F3.cur;

F1.cur->f_H.cur = F1.cur->f_H.head;

if (F1.cur->next != nullptr) {

F3.cur->next = new ListNodeV;

F3.cur = F3.cur->next;

F3.cur->f_H.cur = F3.cur->f_H.head;

}

}

}

FLAG = 0;

F1.prev = F1.cur;

F1.cur = F1.cur->next;

}

}

if (F3.cur->next == nullptr)break;

F3.cur->f_H.cur = F3.cur->f_H.head;

int count3f = F3.cur->f_H.count;

cout << count1f << " " << count3f;

if (count1f == count3f){

cout << "ОДИНАКОВАЯ ДЛИНА\n";

int j = 0;

while (F1.cur->f_H.cur != nullptr){

for (int i = 0; i < N; i++) {

if (F1.cur->f_H.cur->podstroka.massiv[i] == F3.cur->f_H.cur->podstroka.massiv[i]) {

flag_h = 1;}

else {

flag_h = 0;

cout << "разные символы\n";

F1.cur->f_H.cur = F1.cur->f_H.head;

F3.cur->f_H.cur = F3.cur->f_H.head;

break;}}

if (flag_h == 1) {

flag_H = 1;

F1.cur->f_H.cur = F1.cur->f_H.cur->next;

F3.cur->f_H.cur = F3.cur->f_H.cur->next;}

else {

flag_H = 0;

break;}}}

else{

cout << "РАЗНАЯ ДЛИНА\n";

flag_H = 0;}

if (flag_H == 1){

cout << "FFFFFFFодинаковые слова!!!\n";

F1.cur->f_H.cur = F1.cur->f_H.head;

F3.cur->f_H.cur = F3.cur->f_H.head;

F3.prev = F3.cur;

F3.cur = F3.cur->next;

FLAG = 20;}

else {

F1.cur->f_H.cur = F1.cur->f_H.head;

F3.cur->f_H.cur = F3.cur->f_H.head;

F3.prev = F3.cur;

F3.cur = F3.cur->next;}}

if (FLAG == 0) {

rrr++;

cout << "Занесение в 3 список\n\n";

if (F3.last) {

F3.cur = F3.last->next;

F3.cur->f_H.head = new ListNodeH; // СОЗДАНИЕ ГОЛОВЫ ГОРИЗОНТАЛЬНОГО СПИСКА

F3.cur->f_H.cur = F3.cur->f_H.head; // ЗАНЕСЕНИЕ ГОЛОВЫ В ТЕКУЩИЙ

F3.cur->f_H.count = F1.cur->f_H.count;

cout << F3.cur->f_H.count << "BBBBBBBBBBBBBBBBB";

while (F1.cur->f_H.cur != nullptr){

//cout << "сравнение символов\n\n";

for (int i = 0; i < N; i++) {

F3.cur->f_H.cur->podstroka.massiv[i] = F1.cur->f_H.cur->podstroka.massiv[i];

F3.cur->f_H.cur->podstroka.len = F1.cur->f_H.cur->podstroka.len;

//cout << F3.cur->f_H.cur->podstroka.massiv[i] << " " << F1.cur->f_H.cur->podstroka.massiv[i] << "\n";}

F1.cur->f_H.cur = F1.cur->f_H.cur->next;

F3.cur->f_H.cur->next = new ListNodeH;

F3.cur->f_H.cur = F3.cur->f_H.cur->next;}

int j = 0;

F3.prev = F3.cur;

F3.last = F3.cur;

F1.cur->f_H.cur = F1.cur->f_H.head;

if (F1.cur->next != nullptr) {

F3.cur->next = new ListNodeV;

F3.cur = F3.cur->next;

F3.cur->f_H.cur = F3.cur->f_H.head;}

}

else {

void Process(std::ofstream& res, std::string in_filename, std::string in_filename2)

{

ifstream input;

ifstream input2;

input.open(in_filename, std::ios_base::in);

input2.open(in_filename2, std::ios_base::in);

FormularV f1;

FormularV f2;

FormularV f3;

cout << "Началась обработка " << in_filename << "\n\n";

res << "Началась обработка " << in_filename << "\n\n";

if (Read_file(input, res, f1))

{

cout << "ПЕРВЫЙ СПИСОК: " << "\n\n";

res << "ПЕРВЫЙ СПИСОК: " << "\n\n";

Print_file(res, f1);

}

if (Read_file(input2, res, f2))

{

cout << "ВТОРОЙ СПИСОК: " << "\n\n";

res << "ВТОРОЙ СПИСОК: " << "\n\n";

Print_file(res, f2);

}

cout << " список 2 удален " << "\n";

res << " список 2 удален " << "\n";

function33(f1, res, f2, f3);

cout << "\n\n";

cout << "\n\n ТРЕТИЙ СПИСОК\n\n";

res << "\n\n ТРЕТИЙ СПИСОК\n\n";

Print_file(res, f3);

deleting(f1, res);

cout << "\nСписок 1 удален\n\n";

deleting(f2, res);

cout << "\nСписок 2 удален\n\n";

deleting(f3, res); //

cout << "\nСписок 3 удален\n\n";

}