Автор: Пользователь скрыл имя, 03 Ноября 2012 в 10:35, курсовая работа
Для заданной двухуровневой структуры данных, содержащей указатели на объекты (или сами объекты) - параметры шаблона, разработать полный набор операций (добавление, включение и извлечение по логическому номеру, сортировка, включение с сохранением порядка, загрузка и сохранение строк в бинарном файле, балансировка – выравнивание размерностей структур данных нижнего уровня). Предполагается, что операции сравнения хранимых объектов переопределены стандартным образом (в виде операций <,> и т.д.). Программа должна использовать шаблонный класс с объектами- строками и реализовывать указанные в
}
out.write((char*)&n, sizeof(int)); // записать общее кол-во строк
q=First;
while(q)
{
for (int i=0; q->data[i]!=NULL; i++)
out.write ((char*)&q->data[i], sizeof(T)); // сами строки
q=q->next;
}
out.close (); // оборвать связь с файлом
}
//----------------------Чтение из файла------------------------
template <class T, int N>
void List<T,N>::Load (char* file) // загрузка из бинарного файла
{
ifstream in(file, ios::binary); // связь с файлом
if (!in)
{
in.close();
remove (file); // файл не существует
cout<<rus("Файл не существует"
}
T obj;
int n;
in.read((char*)&n, sizeof(int)); // прочитать кол-во строк
for(int i=0; i<n; i++)
{
in.read ((char*)&obj, sizeof(T)); // прочитать сами строки
Add (obj); // добавить в список
}
in.close(); // оборвать связь с потоком
}
//-----------------------
#pragma once
#include "iostream"
#include "string"
#include "fstream"
#include "cstdlib"
#include "sstream"
#include "math.h"
using namespace std;
class Complex {
friend ostream& operator << (ostream & os, Complex& cx);
friend istream& operator >> (istream & is, Complex& cx);
friend ofstream& operator << (ofstream & os, Complex& cx);
friend ifstream& operator >> (ifstream & is, Complex& cx);
public:
double real,imag;
public:
~Complex() {}
Complex(){
real=0;
imag=0;}
Complex(double r,double i) {
this->real = r;
imag = i;
}
Complex operator +(Complex c) { //перегрузка операции сложения
Complex k(0,0);
k= Complex(real + c.real,
imag + c.imag);
return(k);
}
Complex operator -(Complex c) { //перегрузка вычитания
Complex k(0,0);
k= Complex(real - c.real,
imag - c.imag);
return(k);
}
Complex operator *(Complex c) { //перегрузка умножения
Complex k(0,0);
k= Complex((real*c.real-imag*c.
return(k);
}
Complex operator /(Complex c) { //перегрузка деления
Complex k(0,0);
char str[3]="/_";
k= Complex(((real*c.real+imag*c.
return(k);
}
Complex& operator =(const Complex& c) {
real=c.real;
imag=c.imag;
return *this;
}
Complex& operator =(const int& c) {
real=c;
imag=0;
return *this;
}
bool operator > (Complex cx) {
//перегрузка операторов
if (sqrt(real*real+imag*imag)>
else return 0;}
bool operator < (Complex cx) {
if (sqrt(real*real+imag*imag)<
else return 0;}
bool operator == (Complex cx) {
if ((real==cx.real)&&(imag==cx.
else return 0;}
bool operator != (Complex cx) {
if ((real!=cx.real)&(imag!=cx.
else return 0;}
bool operator == (int cx) {
if ((real==cx)&&(imag==0)) return 1;
else return 0;}
bool operator != (int cx) {
if ((real!=cx)&(imag!=0)) return 1;
else return 0;}
};
istream& operator >> (istream &is, Complex& cx) {
is >> cx.real;
is >> cx.imag;
return is;
}
ostream& operator <<(ostream& os, Complex& cx){
os << " ("<<cx.real<<" , "<<cx.imag<<") ";
return os;
}
//----------------main.cpp----
#include "List.h"
#include "conio.h"
#include "Complex_class.h"
using namespace std;
void main(void) {
List<int,4> L;
char *name= new char[50];
int val;
int num=0;
system("cls");
cout<< rus("[1] Показать список")<<endl;
cout<< rus("[2] Добавить по номеру")<<endl;
cout<< rus("[3] Удалить по номеру")<<endl;
cout<< rus("[4] Вывод по номеру")<<endl;
cout<< rus("[5] Удалить весь список")<<endl;
cout<< rus("[6] Сохранение в бинарный файл")<<endl;
cout<< rus("[7] Загрузка из бинарного файла")<<endl;
cout<< rus("[8] Добавить в конец списка")<<endl;
cout<< rus("[9] Сортировка")<<endl;
cout<< rus("[b] Балансировка")<<endl;
cout<< rus("[i] Информация о структуре")<<endl;
cout <<rus("[e] ВЫХОД")<<endl;
char z; int exit=0;
while (exit!=1)
{ cin>>z;
switch(z){
case '1': if(!L.First)
{cout << rus("Список пуст")<<endl;}
else L.ShowList();
break;
case '2':
cout << rus("Введите данные: ");
cin >> val;
cout << rus("\nВведите номер: ");
cin >> num;
L.Insert (val,num);
L.ShowList();
break;
case '3':
cout << rus("\nВведите номер: ");
cin >> num;
L.DelElem(num);
break;
case '4':
cout << rus("Введите номер: ");
cin >> num;
L.ShowElement (num);
break;
case '5': L.DelList(); cout << rus("Список удален!") << endl; break;
case '6': cout << rus("Укажите файл для записи: ");
cin >> name;
L.Save (name);
cout<<rus("Файл записан");
break;
case '7': cout << rus("Укажите файл для чтения: ");
cin >> name;
L.Load (name);
break;
case '8': {cout << rus("Введите данные: ");
cin >> val;
L.Add (val);
L.ShowList();
break;}
case 'b': L.Balance();
L.ShowList();
break;
case '9':
L.Sort ();
L.ShowList();
break;
case 'i': L.Info (); break;
case 'e': exit=1;
} }
delete[] name;
}
Тестовая программа:
#include "List.h"
#include "iostream"
#include "time.h"
#include "conio.h"
#include "fstream"
using namespace std;
void main() {
//Тестирование функции сортировки
List <int ,6> List1;
ofstream in("ResSort.txt");
for (int n=500; n<=10000; n=n+500) {
for (int i=0; i<n; i++)
{ int g=rand();
List1.Add(g);}
clock_t start=clock();
List1.Sort();
clock_t finish=clock();
double workTime;
workTime=(double)(finish - start) / CLOCKS_PER_SEC;
cout<<n<<' '<<workTime<<endl;
in<<n<<' '<<workTime<<endl;
List1.DelList();
};
in.close();
//тестирование балансировки
List <int,6> List2;
ofstream inB("ResBalance.txt");
for (int n=500; n<=10000; n=n+500) {
for (int i=0; i<n; i++)
{ int g=rand();
int k = floor(double((rand()*(i))/(
List2.Insert(g,k);
}
clock_t start=clock();
List2.Balance();
clock_t finish=clock();
double workTime;
workTime=(double)(finish - start) / CLOCKS_PER_SEC;
cout<<n<<' '<<workTime<<endl;
inB<<n<<' '<<workTime<<endl;
List1.DelList();
};
inB.close();
_getch();
}