Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

КР вар. 8 по ООПиП ч.2 (по страой программе)

.doc
Скачиваний:
11
Добавлен:
01.04.2014
Размер:
297.98 Кб
Скачать

1. Реализуйте класс, для которого [] перегружено для реализации записи в файл по указанному индексу.

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

#include <iostream>

#include <fstream>

#include <string>

#include <conio.h>

using namespace std;

class oshibka

{

public:

print()

{

cout << "Nevozmozhno otkryt' file."; //Сообшение об ошибке

}

};

class _file

{

private:

char file_name[50];

int mas[10];

fstream file;

public:

_file(char name[50])

{

strcpy(file_name,name);

file.open(file_name,ios::out);

for(int i=0;i<10;i++)

{

mas[i]=i;

file.write((char *) &mas[i],sizeof(mas[i]));

}

file.close();

}

void list() //Вывод элементоа массива

{

file.open(file_name);

for(int i=0;i<10;i++)

{

file.read((char *)mas[i],sizeof(mas[i]));

cout << mas[i] << "\t";

}

file.close();

}

void zamena() //замена элемента с указанным индексом

{

file.open(file_name);

for(int i=0;i<10;i++)

{

file.read((char *)mas[i],sizeof(mas[i]));

}

file.close();

int ind,el;

cout << "Vvedite index elementa dlya zameny-";

cin >> ind;

cout << "Vvedite novoe znachenie elementa-";

cin >> el;

mas[ind-1]=el;

file.open(file_name,ios::out);

for(i=0;i<10;i++)

{

file.write((char *) &mas[i],sizeof(mas[i]));

}

file.close();

}

};

int main()

{

_file f("file.txt");

try

{

f.list();

f.zamena();

f.list();

}

catch(oshibka error)

{

cout << "ERROR:";

error.print();

}

return 0;

}

2. Реализовать шаблон класса Stack, реализующий стек. Для представления элемента стека использовать шаблон класса Node. Определить функции добавления на вершину стека и чтение с вершины (как шаблонный класс).

#include <iostream>

#include <fstream>

#include <string>

#include <conio.h>

using namespace std;

class Exception {

public:

Exception(char * c="Error!") {

message=c;

};

char *message;

};

class MemoryException : public Exception {

public:

MemoryException():Exception("Out of memory error!"){};

};

class Downflow : public Exception {

public:

Downflow():Exception("Stack is empty!"){};

};

template <class T>

struct Node { //структура узла

T data; //данные

Node *l; //указатель на предыдущий узел

};

template <class T>

class stack

{

public:

stack() { head=0;} //конструктор по умолчанию

~stack() {}; // деструктор

Node<T> *push (T inf) { //запихнуть в стек

Node<T> * newbie = new Node<T>; //создаем новый узел

if (!newbie)

{

throw MemoryException();

}

newbie->l=head; //указатель узла на предыдущий

newbie->data=inf; //записываем данные

head=newbie; //перемещаем вершину

return head;

}

T pop () {

if (!head)

{

throw Downflow();

}

Node<T> *tmp=head->l;

T ret=head->data; //запоминаем что надо вернуть

delete head; //удаляем старую вершину

head=tmp; //запоминаем новую

return ret;

}

Node<T> *head; //вершина стека

};

int main()

{

stack<int> stack;

while (1)

{

cout << endl << "Menu:" << endl << "1. Push" << endl << "2. Pop" << endl << "3. Exit" << endl;

int key=0;

cin >> key;

switch (key)

{

case 1:

cout << "Enter a int number: "; //ввести число

int x;

cin >> x;

try

{

stack.push(x); //в стек

}

catch (MemoryException except)

{

cout << except.message;

return 1;

}

break;

case 2:

try {

cout << "Popped " << stack.pop() << endl; //достаем из стека

}

catch (Downflow except)

{

cout << except.message;

// return 1;

}

break;

case 3:

return 0;

}

}

}

3. Реализовать шаблон класса Stack, реализующий стек. Для представления элемента стека использовать шаблон класса Node. Определить функции добавления на вершину стека и чтение с вершины (как класс контейнера и итератора).

#include <iostream>

#include <fstream>

#include <string>

#include <conio.h>

using namespace std;

class Exception {

public:

Exception(char * c="Error!") {

message=c;

};

char *message;

};

class MemoryException : public Exception {

public:

MemoryException():Exception("Out of memory error!"){};

};

class Downflow : public Exception {

public:

Downflow():Exception("Stack is empty!"){};

};

template <class T>

struct Node {

T data;

Node *l;

};

template <class T>

class stack

{

public:

stack() { head=0; num=0; }

~stack() {};

Node<T> *push (T inf)

{

Node<T> * newbie = new Node<T>;

if (!newbie)

{

throw MemoryException();

}

newbie->l=head;

newbie->data=inf;

head=newbie;

num++;

return head;

}

T pop () {

if (!head)

{

throw Downflow();

}

Node<T> *tmp=head->l;

T ret=head->data;

delete head;

head=tmp;

num--;

return ret;

}

long getNum()

{

return num;

}

long num;

Node<T> *head;

};

template <class T>

class Iterator {

public:

Node<T> *head, *p;

public:

Iterator(){ head=0; p=0;};

Iterator(stack<T> &current){

head=current.head;

p=head;

};

T &operator*() { return p->data; };

friend int operator==(Iterator<T> &a,Iterator<T> &b) {

if (a.p == b.p)

{

return 1;

}

return 0;

}

friend int operator!=(Iterator<T> &a,Iterator<T> &b) {

if (a.p == b.p)

{

return 0;

}

return 1;

}

Iterator &operator=(Iterator<T> &current)

{

p=current.p;

head=current.head;

return *this;

}

Iterator &operator ++(int) {

if (p->l)

p=p->l;

else

throw Downflow();

return *this;

};

};

int main()

{

stack<int> st;

while (1)

{

cout << endl << "Menu:" << endl << "1. Push" << endl << "2. Pop" << endl << "3. Print stack" << endl << "4. Exit" << endl;

int key=0;

cin >> key;

int x;

switch (key)

{

case 1:

{

cout << "Enter a int number: ";

cin >> x;

try

{

st.push(x);

}

catch (MemoryException except)

{

cout << except.message;

return 1;

}

break;

}

case 2:

{

try

{

cout << st.pop() << endl;

}

catch (Downflow except)

{

cout << except.message;

// return 1;

}

break;

}

case 3:

{

Iterator<int> iter(st),iter_last(st);

long i=0;

for (i=0;i<st.getNum()-1;i++)

{

iter_last++;

}

try {

do

{

cout << *iter << ' ';

iter++;

if (iter == iter_last)

cout << *iter << ' ';

}while (iter!=iter_last);

}

catch (Downflow except)

{

cout << except.message;

return 1;

}

break;

}

case 4:

{

return 0;

}

}

}

}

После ввода двух элементов выведем стек на экран:

Теперь вытолкнем значения из стека:

Диаграмма классов:

Литература

  1. Дейгел Х., Дейгел П. Как программировать на С++:пер. с англ. – М., Бином, 2001.

  2. Луцик Ю. А., Ковальчук А. М., Лукьянова И. В. Объектно-ориентированное программирование на языке С++. – Мн., БГУИР, 2003.

15