|
||||
Методы и системы программирования»
Кафедра информатики и информационных технологий
ОТЧЕТ по дисциплине: «Методы и системы программирования» Лабораторная работа № 3 ВАРИАНТ № 25
Выполнил: студент группы 121591 факультета математики, физики и информатики Щадин Е.Е
Тула – 2020 1) Задание: Построить класс для работы с бинарным деревом, содержащим англо-русский словарь. При решении задачи необходимо описать класс, который используется для представления элементов динамической структуры данных. Затем разрабатывается класс для работы с используемой динамической структурой данных, которая при тестировании класса построена путем ввода данных из файла. Код: #include <iostream> #include <fstream> #include <cstringt.h>
using namespace std; bool success; struct node { char rusWord[30]; char engWord[30]; node* l, * r; }; class My { public: void addToFile(char rusWord[], char engWord[]) { ofstream of("data.txt", ios::app); of << engWord << endl; of << rusWord << endl; of.close(); }
void push(char rusWord[], char engWord[], node** t) { if ((*t) == NULL) // создаем узел { (*t) = new node; strcpy((*t)->engWord, engWord); strcpy((*t)->rusWord, rusWord); (*t)->l = (*t)->r = NULL; return; }
if (strcmp((*t)->engWord, engWord) > 0) push(rusWord, engWord, &(*t)->r); // для ввода английского слова else push(rusWord, engWord, &(*t)->l);// для ввода русского слова слова }
void find(node* t, bool type, char findWord[]) { if (t == NULL) return; else {
if (!success) find(t->l, type, findWord); else return; if (type) { if (strcmp(t->engWord, findWord) == 0) { cout << t->rusWord << endl; success = true; return; } } else if (strcmp(t->rusWord, findWord) == 0) { cout << t->engWord << endl; success = true; return; } } if (!success) find(t->r, type, findWord); else return; } void Load(node** t) { char buffer[30]; char buffer2[30]; ifstream of("data.txt"); while (!of.eof()) { of >> buffer; of >> buffer2; if (strlen(buffer) > 0) push(buffer2, buffer, t); } of.close(); } node* tree = NULL; private:
}; void main() { // setlocale(LC_ALL, "Russian"); class My t1; system("chcp 1251"); bool type = true; int menu; char buffer[30], buffer2[30]; t1.Load(&t1.tree);
while (true) { if (type) cout << "Режим: Англо-русский словарь (поиск осуществляется по английскому слову)" << endl; else cout << "Режим: Русско-английский словарь(поиск по русскому слову)" << endl; cout << "Выберите действие" << endl; cout << "1. Добавить слово" << endl; cout << "2. Переключить режим работы" << endl; cout << "3. Поиск перевода слова" << endl; cout << "0. Выход" << endl; cin >> menu; switch (menu) { case 1: if (type) { cout << "Введите слово (по-русски)" << endl; cin >> buffer2; cout << "Введите перевод (по-английски)" << endl; cin >> buffer; } else { cout << "Введите слово (по-английски)" << endl; cin >> buffer; cout << "Введите перевод (по-русски)" << endl; cin >> buffer2; } t1.push(buffer2, buffer, &t1.tree); t1.addToFile(buffer2, buffer); break; case 2: type = !type; break; case 3: cout << "Введите слово " << endl; cin >> buffer; success = false; t1.find(t1.tree, type, buffer); if (!success) cout << "Перевод не найден" << endl; break; case 0: break; default: cout << "Ошибка выбора" << endl; break; } if (menu == 0) break; } } Примеры: Пример 1
Пример 2 Пример 3
2) Построить класс для работы с бинарным деревом, который содержит динамическую информацию о наличии автобусов в парке: номер автобуса, фамилию и инициалы водителя, номер маршрута, признак местонахождения автобуса – на маршруте или в парке. Программа должна обеспечивать: начальное формирование дерева, введение номера автобуса при выезде и установление программой значения признака «автобус на маршруте». Аналогичным образом изменяется информация об автобусе при его возвращении в парк. По запросу выдаются сведения об автобусах, находящихся в парке, или об автобусах, находящихся на маршруте. При тестировании класса ввода данных происходит из файла. Код #include <iostream> #include <fstream> #include <cstringt.h> using namespace std; bool est = 0; class t1 { public: struct tnode { char nomeravt[256]; int nomermar; char fio[256]; bool dom; // поле данных struct tnode* left; // левый потомок struct tnode* right; // правый потомок }; struct tnode* s;
void treeprint(tnode* tree) { if (tree != NULL) { //Пока не встретится пустой узел treeprint(tree->left); //Рекурсивная функция для левого поддерева treeprint(tree->right); //Рекурсивная функция для правого поддерева cout << tree->nomeravt << "\t" << tree->nomermar << "\t" << tree->fio << "\t"; if (tree->dom == 1) cout << "В депо" << "\n"; //Отображаем корень дерева else { cout << "В пути" << "\n"; } } } void addtofile(char x[], int y, char f[], bool d, tnode* tree) { ofstream of("data.txt", ios::app); of << x << "\t" << y << "\t" << f << "\t" << d << "\n";
of.close(); }
struct tnode* addnode(char x[], int y, char f[], bool d, tnode* tree) { if (tree == NULL) { // Если дерева нет, то формируем корень tree = new tnode; // память под узел strcpy(tree->nomeravt ,x); strcpy(tree->fio, f); tree->nomermar = y; tree->dom = d; // поле данных tree->left = NULL; tree->right = NULL; // ветви инициализируем пустотой } else if (x < tree->nomeravt) // условие добавление левого потомка tree->left = addnode(x, y, f, d, tree->left); else // условие добавление правого потомка tree->right = addnode(x, y, f, d, tree->right); return(tree); } void load(tnode* tree, int g) {
ifstream of("data.txt"); char x1[256]; int y1; char f1[256]; bool d1; for (int i = 0; i < g; i++) { of >> x1 >> y1 >> f1 >> d1; cout << x1 << "\t" << y1 << "\t" << f1 << "\t" << d1 << "\n"; s = addnode(x1, y1, f1, d1, s); }
} void poiskpodom(tnode* tree) { if (tree != NULL) { //Пока не встретится пустой узел poiskpodom(tree->left); //Рекурсивная функция для левого поддерева poiskpodom(tree->right); //Рекурсивная функция для правого поддерева if (tree->dom == 1) { cout << tree->nomeravt << "\t" << tree->nomermar << "\t" << tree->fio << "\t" << "В депо" << "\n"; est = 1; } //Отображаем корень дерева } } void poisknepodom(tnode* tree) { if (tree != NULL) { //Пока не встретится пустой узел poisknepodom(tree->left); //Рекурсивная функция для левого поддерева poisknepodom(tree->right); //Рекурсивная функция для правого поддерева if (tree->dom == 0) { cout << tree->nomeravt << "\t" << tree->nomermar << "\t" << tree->fio << "\t" << "В пути" << "\n"; est = 1; } //Отображаем корень дерева } } void zamena(tnode* tree, char a[]) { if (tree != NULL) { //Пока не встретится пустой узел zamena(tree->left, a); //Рекурсивная функция для левого поддерева zamena(tree->right, a); //Рекурсивная функция для правого поддерева if (strcmp(tree->nomeravt ,a)==0) { cout << "Нашли\n" << tree->nomeravt << "\t" << tree->nomermar << "\t" << tree->fio << "\t" << tree->dom << "\n"; cout << "Меняем положение\n"; cin >> tree->dom; } //Отображаем корень дерева } }
private:
};
int main() { t1 t2;
system("chcp 1251");
int y; char f[256],x[256],a[256]; bool d; t2.s = NULL; cout << "Введите количество\n"; int g; cin >> g; cout << "1) Ввести с клавиатуры и записать в файл\n2) Ввод из файл\n3) Вывести данные\n4) На маршруте\n5) В депо\n6) Изменить\n"; int men;
do { cout << ">>"; cin >> men; if (men == 1) for (size_t i = 0; i < g; i++) { cout << "Введите номер автобуса\n"; cin >> x; cout << "Введите номер номер маршрута\n"; cin >> y; cout << "Введите ФИО\n"; cin >> f; cout << "В парке ли автобус\n"; cin >> d; t2.s = t2.addnode(x, y, f, d, t2.s); t2.addtofile(x, y, f, d, t2.s); } if (men == 2) { cout << "Что загрузили\n"; t2.load(t2.s, g); } if (men == 3) { cout << "В дереве \n"; t2.treeprint(t2.s); } if (men == 4) { t2.poisknepodom(t2.s); if (est==1) { est = 0; } else { cout << "Все работники в депо\n";
} } if (men == 5) { t2.poiskpodom(t2.s); if (est == 1) { est = 0; } else { cout << "Все работники в пути\n"; } } if (men == 6){ cout << "Ищем по номеру\n"; cin >> a; t2.zamena(t2.s, a); } } while (men != 0); } Примеры: Пример 1 Пример 2. Пример 3
25. Построить класс для работы с односвязным списком. Элементы списка – действительные числа. Создать два упорядоченных по невозрастанию списка, слить их в один (также упорядоченный по невозрастанию), построив новый список. Код: #include <iostream> using namespace std; class MyClass { public: void vvodva() {
t1->q = 0; t1->next = NULL; begina = t1; cout << "Введите значения до 0\n"; do { t1->next = new a; t1 = t1->next; cin >> t1->q; t1->next = NULL;
} while (t1->q != 0);
}
void vvodvb() { t2->q = 0; t2->next = NULL; beginb = t2; cout << "Введите значения до 0\n"; do { t2->next = new b; t2 = t2->next; cin >> t2->q; t2->next = NULL;
} while (t2->q != 0);
} void vivoda() { cout << "В структуре 'a'\n"; t1 = begina; t1 = t1->next; begina = t1; while (t1->next) { cout << t1->q << "\t"; t1 = t1->next; } cout << "\n"; } void vivodb() { cout << "В структуре 'b'\n"; t2 = beginb; t2 = t2->next; beginb = t2; while (t2->next) { cout << t2->q << "\t"; t2 = t2->next; } cout << "\n"; } void sozc() { t1 = begina; t2 = beginb; t3->q = 0; t3->next = NULL; beginc = t3; while (t1->next!=NULL || t2->next!=NULL) { if (t1->q <= t2->q && t1->next != NULL) { t3->next = new c; t3 = t3->next; t3->q = t1->q; t3->next = NULL; t1 = t1->next;
}
if (t2->q <= t1->q && t2->next != NULL) { t3->next = new c; t3 = t3->next; t3->q = t2->q; t3->next = NULL; t2 = t2->next;
}
if (t1->next == NULL && t2->next != NULL) { t3->next = new c; t3 = t3->next; t3->q = t2->q; t3->next = NULL; t2 = t2->next; } if (t2->next == NULL && t1->next != NULL) { t3->next = new c; t3 = t3->next; t3->q = t1->q; t3->next = NULL; t1 = t1->next; }
} }
void vivodc() { cout << "В 'c'\n"; t3 = beginc; t3 = t3->next; while (t3) { cout << t3->q<<"\t"; t3 = t3->next; } cout << "\n"; }
private:
struct a { int q; a* next; }; struct b { int q; b* next; }; struct c { int q; c* next; }; a* begina; b* beginb; c* beginc; a* t1 = new a;
b* t2 = new b; c* t3 = new c; };
int main() { system("chcp 1251"); MyClass g; g.vvodva(); g.vvodvb(); g.vivoda(); g.vivodb(); g.sozc(); g.vivodc(); } Примеры: Пример 1 Пример 2 Пример 3
|
||||
|