close

Вход

Забыли?

вход по аккаунту

?

протокол (2)

код для вставкиСкачать
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ
"КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ"
ФІЗИКО-ТЕХНІЧНИЙ ІНСТИТУТ
Лабораторна робота №8
з дисципліни
"Технологія програмування 1"
Підготував
студент групи ФБ-12
Крахмалюк Іван Геннадійович
(№ залікової книжки - 5)
Київ - 2011
Зміст
Лабораторна робота №81
Умова задачі3
Зауваження3
Алгоритм розв'язання4
4
Використані змінні5
Використані типи даних користувача5
Опис проектних рішень6
Програмний код7
lab_8.h7
main.cpp7
load.cpp12
save.cpp13
list_manage.cpp14
insert_after.cpp18
count_a.cpp19
count_b.cpp20
count_c.cpp21
Знімки екрану22
Умова задачі
5. Використовувати (лінійні) односпрямовані списки без заголовної ланки (мал. а) або з заголовною ланкою (мал. б) при наступному їхньому описі
typedef char ТЕ [10]; struct ланка { ТЕ елем; ланка* наступна; };
Параметри L, L1 і L2 позначають списки, а параметри Е, Е1 і Е2-дані типи ТЕ, до яких можна застосовувати операції присвоювання і перевірки на рівність.
Визначити функції, що підраховують кількість слів списку L, що;
а) починаються і закінчуються однієї і тією же літерою;
б) починаються з тієї ж літери, що і наступне слово;
в) збігаються з останнім словом; г) зберігає список в окремий файл;
д) зчитує список з файлу.
Зауваження
Замість typedef char ТЕ [10]; використовується char *word;
Замість struct ланка { ТЕ елем; ланка* наступна; }; використовується struct ланка { char *елем; ланка *наступна; };
Алгоритм розв'язання
Використані змінні
Тип та ім'я змінної Призначення змінноїnode *topВказівник на перший елемент спискуint answerЗберігає номер пункту меню, вибраного користувачемchar buffer[1024], char buffer2[1024]Масиви символів, що містять дані, введені користувачем (імена файлів, елементи списку)ifstream in(filename), ofstream out(filename)Вхідний та вихідний файлиnode *temp, node *prevТимчасові вказівники на певний елемент списку (використовуються при проході по списку)int resultМістить результат підрахункуchar *last_wordМістить останнє слово в списку
Використані типи даних користувача
Тип даних користувачаПризначенняstruct node
{
char *word;
node *next;
};Елемент списку, містить вказівник на рядок (слово) та вказівник на наступний елемент
Опис проектних рішень
* У функції main не виконуються жодні дії над списком. Ця функція лише виводить меню та запитує у користувача необхідні дані.
* Алгоритм додавання нового елементу в кінець списку:
1. Якщо список порожній (вказівник на перший елемент дорівнює NULL) - створюємо новий елемент, у вказівник на перший елемент записуємо його адресу.
2. Якщо список не порожній - перебираємо список, доки вказівник на наступний елемент не дорівнює NULL. Після цього створюємо новий елемент та записуємо його адресу у вказівник на наступний елемент останнього елементу списку.
* Алгоритм видалення першого входження елементу зі списку:
1. Якщо потрібний елемент перший у списку - у вказівник на перший елемент списку записуємо адресу другого елементу. Потім видаляємо потрібний елемент.
2. У іншому випадку - перебираємо всі елементи списку, доки не знайдемо потрібного, при цьому кожного разу зберігаємо у тимчасовій змінній адресу попереднього елементу. Потім у вказівник на наступний елемент попереднього елементу записуємо адресу наступного за вибраним елементом елемента. Після цього видаляємо вибраний елемент.
Програмний код
lab_8.h
struct node
{
char *word;
node *next;
};
bool add_to_list(node *&top, const char *word);
void free_list(node *&top);
void print_list(node *&top);
void delete_from_list(node *&top, const char *word);
void load_from_file(node *&top, const char *filename);
void save_to_file(node *&top, const char *filename);
void count_a(node *&top);
void count_b(node *&top);
void count_c(node *&top);
bool is_in_list(node *&top, const char *word);
bool add_after_word(node *&top, const char* after, const char *word);
main.cpp
#include <iostream>
#include <cstring>
#include "lab_8.h"
using namespace std;
int main(int arg_c, char *arg_s[])
{
node *top = NULL;
while(true)
{
int answer;
char buffer[1024];
char buffer2[1024];
cout << endl;
cout << "Main menu" << endl << endl;
cout << "1. Load list from file." << endl;
cout << "2. Print list." << endl;
cout << "3. Count words that start and end with the same letter." << endl;
cout << "4. Count words that start with the same letter as next word." << endl;
cout << "5. Count words that are equal to last word." << endl;
cout << "6. Add word to list." << endl;
cout << "7. Delete first matching word from list." << endl;
cout << "8. Save list to file." << endl;
cout << "9. Insert word after another word." << endl;
cout << "0. Exit." << endl;
cout << endl << "Enter choise: ";
cin >> answer;
cin.get();
cout << endl;
switch (answer)
{
case 0:
free_list(top);
return 0;
break;
case 1:
cout << "Enter file name: ";
cin.getline(buffer, 1023);
cout << "Loading list from file..." << endl;
load_from_file(top, buffer);
cout << endl << "Press ENTER to continue.";
cin.get();
break;
case 2:
cout << "List contents:" << endl;
print_list(top);
cout << endl << "Press ENTER to continue.";
cin.get();
break;
case 3:
count_a(top);
cout << endl << "Press ENTER to continue.";
cin.get();
break;
case 4:
count_b(top);
cout << endl << "Press ENTER to continue.";
cin.get();
break;
case 5:
count_c(top);
cout << endl << "Press ENTER to continue.";
cin.get();
break;
case 6:
cout << "Enter word: ";
cin.getline(buffer, 1023);
if (!strcmp(buffer, ""))
{
cout << "Refusing to add empty word." << endl;
cout << endl << "Press ENTER to continue.";
cin.get();
break;
}
if (add_to_list(top, buffer))
{
cout << "Word added to list." << endl;
cout << endl << "Press ENTER to continue.";
cin.get();
break;
}
else
{
cout << "Failed to add word to list!" << endl;
cout <<endl << "Press ENTER to continue.";
cin.get();
break;
}
case 7:
cout << "Enter word: ";
cin.getline(buffer, 1023);
if (!is_in_list(top, buffer))
{
cout << "No such word." << endl;
}
else
{
delete_from_list(top, buffer);
cout << "Word deleted." << endl;
}
cout << endl << "Press ENTER to continue.";
cin.get();
break;
case 8:
cout << "Enter file name: ";
cin.getline(buffer, 1023);
cout << "Saving list to file..." << endl;
save_to_file(top, buffer);
cout << endl << "Press ENTER to continue.";
cin.get();
break;
case 9:
cout << "Enter word, after which we will insert new word: ";
cin.getline(buffer, 1023);
if (!is_in_list(top, buffer))
{
cout << "No such word." << endl;
cout << endl << "Press ENTER to continue.";
cin.get();
break;
}
cout << "Enter new word: ";
cin.getline(buffer2, 1023);
if (add_after_word(top, buffer, buffer2))
{
cout << "Added!" << endl;
}
else
{
cout << "Failed to add word!" << endl;
}
cout << endl << "Press ENTER to continue.";
cin.get();
break;
}
}
return 0;
}
load.cpp
#include <fstream>
#include <iostream>
#include <cstring>
#include "lab_8.h"
using namespace std;
void load_from_file(node *&top, const char *filename)
{
ifstream in(filename);
if (!in)
{
cout << "Failed to open input file!" << endl;
return;
}
free_list(top);
char buffer[1024];
while (!in.eof())
{
in.getline(buffer, 1023);
if (strcmp(buffer, ""))
{
if (!add_to_list(top, buffer))
{
cout << "Failed to add word!" << endl;
in.close();
return;
}
}
}
in.close();
}
save.cpp
#include <fstream>
#include <iostream>
#include "lab_8.h"
using namespace std;
void save_to_file(node *&top, const char *filename)
{
ofstream out(filename);
if (!out)
{
cout << "Failed to create/open output file!" << endl;
return;
}
node *temp = top;
while (temp != NULL)
{
out << temp->word << endl;
temp = temp->next;
}
out.close();
}
list_manage.cpp
#include <iostream>
#include <cstring>
#include "lab_8.h"
using namespace std;
bool add_to_list(node *&top, const char *word)
{
if (top == NULL)
{
top = new node;
if (top == NULL)
{
return false;
}
node *temp = top;
temp->word = strdup(word);
temp->next = NULL;
return true;
}
else
{
node *temp = top;
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = new node;
if (temp->next == NULL)
{
return false;
}
temp = temp->next;
temp->word = strdup(word);
temp->next = NULL;
return true;
}
return true;
}
void free_list(node *&top)
{
if (top == NULL)
{
return;
}
if (top->next == NULL)
{
node *temp = top;
delete temp->word;
delete top;
top = NULL;
return;
}
node *temp = NULL;
node *prev = NULL;
while (top->next != NULL)
{
prev = top;
temp = top->next;
while (temp->next != NULL)
{
prev = temp;
temp = temp->next;
}
delete temp->word;
delete temp;
prev->next = NULL;
}
delete top->word;
delete top;
top = NULL;
}
void print_list(node *&top)
{
if (top == NULL)
{
cout << "List is empty." << endl;
return;
}
node *temp = top;
while (temp != NULL)
{
cout << temp->word << endl;
temp = temp->next;
}
}
void delete_from_list(node *&top, const char *word)
{
if (top == NULL)
{
return;
}
node *temp = top;
if (!strcmp(word, temp->word))
{
top = temp->next;
delete temp->word;
delete temp;
return;
}
node *prev = temp;
temp = temp->next;
if (temp == NULL)
{
return;
}
while (strcmp(word, temp->word))
{
prev = temp;
temp = temp->next;
if (temp == NULL)
{
return;
}
}
prev->next = temp->next;
delete temp->word;
delete temp;
}
bool is_in_list(node *&top, const char *word)
{
node *temp = top;
while (temp != NULL)
{
if (!strcmp(temp->word, word))
{
return true;
}
temp = temp->next;
}
return false;
}
insert_after.cpp
#include <cstring>
#include "lab_8.h"
using namespace std;
bool add_after_word(node *&top, const char* after, const char *word)
{
if (!is_in_list(top, after))
{
return false;
}
node *temp = top;
while (strcmp(temp->word, after))
{
temp = temp->next;
if (temp == NULL)
{
return false;
}
}
node *save = temp->next;
temp->next = new node;
if (temp->next == NULL)
{
return false;
}
temp = temp->next;
temp->word = strdup(word);
temp->next = save;
return true;
}
count_a.cpp
#include <iostream>
#include <cstring>
#include "lab_8.h"
using namespace std;
void count_a(node *&top)
{
cout << "Counting words that start and end with the same letter..." << endl;
int result = 0;
node *temp = top;
while (temp != NULL)
{
if (temp->word[0] == temp->word[(strlen(temp->word) - 1)])
{
result++;
}
temp = temp->next;
}
cout << "Result: " << result << endl;
}
count_b.cpp
#include <iostream>
#include "lab_8.h"
using namespace std;
void count_b(node *&top)
{
int result = 0;
cout << "Counting words that start with the same letter as next word..." << endl;
if (top == NULL)
{
cout << "Result: " << result << endl;
return;
}
node *temp = top;
while (temp->next != NULL)
{
if (temp->word[0] == temp->next->word[0])
{
result++;
}
temp = temp->next;
}
cout << "Result: " << result << endl;
}
count_c.cpp
#include <iostream>
#include <cstring>
#include "lab_8.h"
using namespace std;
void count_c(node *&top)
{
int result = 0;
cout << "Counting words that are equal to last word..." << endl;
if (top == NULL)
{
cout << "Result: " << result << endl;
return;
}
char *last_word = NULL;
node *temp = top;
while (temp->next != NULL)
{
temp = temp->next;
}
last_word = temp->word;
temp = top;
while (temp->next != NULL)
{
if (!strcmp(last_word, temp->word))
{
result++;
}
temp = temp->next;
}
cout << "Result: " << result << endl;
}
Знімки екрану
Компіляція пройшла успішно
Головне меню
Додавання нового слова у список
Виведення списку на екран
Видалення слова зі списку
Збереження списку в файл
24
Документ
Категория
Разное
Просмотров
43
Размер файла
340 Кб
Теги
протокол
1/--страниц
Пожаловаться на содержимое документа