«Программное обеспечение вычислительной техники и автоматизированных систем»
Вид материала | Учебное пособие |
СодержаниеРезультаты работы программы Расчетно-графическое задание 3 |
- Рабочая программа для специальности: 220400 Программное обеспечение вычислительной, 133.96kb.
- Рабочая программа по дисциплине "Программирование на языке высокого уровня" для специальности, 137.39kb.
- Рабочая программа по дисциплине Архитектура вычислительных систем Для специальности, 122.63kb.
- Рабочая программа по дисциплине "Вычислительная математика" для специальности 230105, 201.66kb.
- Рабочая программа по дисциплине «Информатика» для специальности 230105(220400) «Программное, 259.13kb.
- Методические указания для студентов специальности 230105 «Программное обеспечение вычислительной, 223.95kb.
- Рабочая программа по дисциплине организация ЭВМ и систем для студентов дневного отделения, 91.9kb.
- «Программное обеспечение вычислительной техники и автоматизированных систем», 75.83kb.
- План занятий третьего года обучения, по специальности «Программное обеспечение вычислительной, 103.35kb.
- Рабочая программа по дисциплине "Методы оптимизации" для специальности 230105 "Программное, 106.67kb.
Примеры выполнения РГЗ 2
Пример 1
Задание
- Написать параметризованную подпрограмму сортировки указанным методом. Отладить ее на целых числах и числах с плавающей точкой.
- Определить класс объектов массива, предназначенного для сортировки. Перегрузить для него операцию присваивания и операции сравнения <, <=, ==, >=, >.
- Написать программу, сортирующую массив объектов построенного класса с помощью написанной параметризованной подпрограммы.
Метод сортировки - метод Шелла, класс - битовая строка.
Программа
#include
#include
#include
#include
#define n 100
//класс: Битовая строка
class BinStr
{
private:
char *s; //сама строка
int length; //указатель на длину
public:
BinStr();
BinStr(char *);
BinStr(const BinStr &);
~BinStr();
int operator> (BinStr &);
int operator>=(BinStr &);
int operator< (BinStr &);
int operator<=(BinStr &);
int operator==(BinStr &);
BinStr &operator=(BinStr &Object);//перегрузка оператора присваивания
friend ostream &operator<<(ostream &, BinStr &);
};
BinStr::BinStr()
{
s=new char[1];
*s='\0';
length=0;
}
BinStr::BinStr(char *st)
{
length=strlen(st);
s=new char[(length)+1];
strcpy (s,st);
}
BinStr::BinStr(const BinStr &s1)
{
length=strlen(s1.s);
s=new char[(length)+1];
strcpy (s,s1.s);
}
BinStr::~BinStr()
{
delete s;
}
int BinStr::operator> (BinStr &Object)
{
int i;
//если длина левой строки больше правой
if(length>Object.length)
{
//проверяем, есть ли в старших битах левой
//строки, которых нет в правой, единицы
//если есть, то возвращаем 1
for(i=0;i
if((s[i]-48)==1)
return 1;
//если единиц не оказалось, то побитово сравниваем
//обе строки: оставшуюся часть правой строки со всей левой,
//до нарушения равновесия
for(i=0;i
if((s[i+(length-Object.length)]-48)<(Object.s[i]-48))
return 0;
else if((s[i+(length-Object.length)]-48)>(Object.s[i]-48))
return 1;
//если строки равны, возвращаем 0
return 0;
}
//далее следует все аналогично для оставшихся двух случаев,
//когда правая строка длиннее левой и когда длины строк равны
else if(length
{
for(i=0;i
if((Object.s[i]-48)==1)
return 0;
for(i=0;i
if((s[i]-48)<(Object.s[i+Object.length-length]-48))
return 0;
else if((s[i]-48)>(Object.s[i+Object.length-length]-48))
return 1;
//если строки равны, возвращаем 0
return 0;
}
//когда длины строк равны, просто побитово сравниваем обе строки
//до нарушения равновесия
for(i=0;i
if((s[i]-48)<(Object.s[i]-48))
return 0;
else if((s[i]-48)>(Object.s[i]-48))
return 1;
//если строки равны, возвращаем 0
return 0;
}
int BinStr::operator>=(BinStr &Object)
{
int i;
//если длина левой строки больше правой
if(length>Object.length)
{
//проверяем, есть ли в старших битах левой
//строки, которых нет в правой, единицы
//если есть, то возвращаем 1
for(i=0;i
if((s[i]-48)==1)
return 1;
//если единиц не оказалось, то побитово сравниваем
//обе строки: оставшуюся часть правой строки со всей левой,
//до нарушения равновесия
for(i=0;i
if((s[i+(length-Object.length)]-48)<(Object.s[i]-48))
return 0;
else if((s[i+(length-Object.length)]-48)>(Object.s[i]-48))
return 1;
//если строки равны, возвращаем 1
return 1;
}
//далее следует все аналогично для оставшихся двух случаев,
//когда правая строка длиннее левой и когда длины строк равны
else if(length
{
for(i=0;i
if((Object.s[i]-48)==1)
return 0;
for(i=0;i
if((s[i]-48)<(Object.s[i+Object.length-length]-48))
return 0;
else if((s[i]-48)>(Object.s[i+Object.length-length]-48))
return 1;
//если строки равны, возвращаем 1
return 1;
}
//когда длины строк равны, просто побитово сравниваем обе строки
//до нарушения равновесия
for(i=0;i
if((s[i]-48)<(Object.s[i]-48))
return 0;
else if((s[i]-48)>(Object.s[i]-48))
return 1;
//если строки равны, возвращаем 1
return 1;
}
int BinStr::operator< (BinStr &Object)
{
int i;
//если длина левой строки больше правой
if(length>Object.length)
{
//проверяем, есть ли в старших битах левой
//строки, которых нет в правой, единицы
//если есть, то возвращаем 0
for(i=0;i
if((s[i]-48)==1)
return 0;
//если единиц не оказалось, то побитово сравниваем
//обе строки: оставшуюся часть правой строки со всей левой,
//до нарушения равновесия
for(i=0;i
if((s[i+(length-Object.length)]-48)<(Object.s[i]-48))
return 1;
else if((s[i+(length-Object.length)]-48)>(Object.s[i]-48))
return 0;
//если строки равны, возвращаем 0
return 0;
}
//далее следует все аналогично для оставшихся двух случаев,
//когда правая строка длиннее левой и когда длины строк равны
else if(length
{
for(i=0;i
if((Object.s[i]-48)==1)
return 1;
for(i=0;i
if((s[i]-48)<(Object.s[i+Object.length-length]-48))
return 1;
else if((s[i]-48)>(Object.s[i+Object.length-length]-48))
return 0;
//если строки равны, возвращаем 0
return 0;
}
//когда длины строк равны, просто побитово сравниваем обе строки
//до нарушения равновесия
for(i=0;i
if((s[i]-48)<(Object.s[i]-48))
return 1;
else if((s[i]-48)>(Object.s[i]-48))
return 0;
//если строки равны, возвращаем 0
return 0;
}
int BinStr::operator<=(BinStr &Object)
{
int i;
//если длина левой строки больше правой
if(length>Object.length)
{
//проверяем, есть ли в старших битах левой
//строки, которых нет в правой, единицы
//если есть, то возвращаем 0
for(i=0;i
if((s[i]-48)==1)
return 0;
//если единиц не оказалось, то побитово сравниваем
//обе строки: оставшуюся часть правой строки со всей левой,
//до нарушения равновесия
for(i=0;i
if((s[i+(length-Object.length)]-48)<(Object.s[i]-48))
return 1;
else if((s[i+(length-Object.length)]-48)>(Object.s[i]-48))
return 0;
//если строки равны, возвращаем 1
return 1;
}
//далее следует все аналогично для оставшихся двух случаев,
//когда правая строка длиннее левой и когда длины строк равны
else if(length
{
for(i=0;i
if((Object.s[i]-48)==1)
return 1;
for(i=0;i
if((s[i]-48)<(Object.s[i+Object.length-length]-48))
return 1;
else if((s[i]-48)>(Object.s[i+Object.length-length]-48))
return 0;
//если строки равны, возвращаем 1
return 1;
}
//когда длины строк равны, просто побитово сравниваем обе строки
//до нарушения равновесия
for(i=0;i
if((s[i]-48)<(Object.s[i]-48))
return 1;
else if((s[i]-48)>(Object.s[i]-48))
return 0;
//если строки равны, возвращаем 1
return 1;
}
int BinStr::operator==(BinStr &Object)
{
int i;
//если длина левой строки больше правой
if(length>Object.length)
{
//проверяем, есть ли в старших битах левой
//строки, которых нет в правой, единицы
//если есть, то возвращаем 0
for(i=0;i
if((s[i]-48)==1)
return 0;
//если единиц не оказалось, то побитово сравниваем
//обе строки: оставшуюся часть правой строки со всей левой,
//до нарушения равновесия
for(i=0;i
if((s[i+(length-Object.length)]-48)!=(Object.s[i]-48))
return 0;
//если строки равны, возвращаем 1
return 1;
}
//далее следует все аналогично для оставшихся двух случаев,
//когда правая строка длиннее левой и когда длины строк равны
else if(length
{
for(i=0;i
if((Object.s[i]-48)==1)
return 0;
for(i=0;i
if((s[i]-48)!=(Object.s[i+Object.length-length]-48))
return 0;
//если строки равны, возвращаем 1
return 1;
}
//когда длины строк равны, просто побитово сравниваем обе строки
//до нарушения равновесия
for(i=0;i
if((s[i]-48)!=(Object.s[i]-48))
return 0;
//если строки равны, возвращаем 1
return 1;
}
BinStr& BinStr::operator=(BinStr &Object)
{
length=strlen(Object.s);
s=new char[(length)+1];
strcpy (s,Object.s);
return *this;
}
ostream &operator<<(ostream &fo, BinStr &fp)
{
fo<
return fo;
}
template
void shell(Type *x, int n1)
{ int i,j,k,gap;
Type t;
int a[5]={9,5,3,2,1};
for(k=0; k<5; k++)
{ gap=a[k];
for(i=gap; i
{ t=x[i];
for(j=i-gap; t
x[j+gap]=x[j];
x[j+gap]=t;
}
}
}
void main()
{
int i;
int mas1[n];
float mas2[n];
randomize();
for (i=0;i
{
mas1[i]=random(n);
mas2[i]=random(n)*0.01;
}
clrscr();
cout<<" Сортировка методом Шелла\n"<
//сортировка целых чисел
shell(mas1, n);
cout<<"Отсортированный массив целых чисел:\n"<
for (i=0;i
cout<
//сортировка чисел с плавающей точкой
shell(mas2, n);
cout<
for (i=0;i
cout<
BinStr mas3[n]={"1001","1000","1100","1010","1100","1011","0011","1111",
"000000000001","0110","1110","011001","1111","0011","0110",
"1011","0101","0011","0010","1111"};
//сортировка битовых строк
shell(mas3, n);
cout<
for (i=0;i
cout<
}
^
Результаты работы программы
Сортировка методом Шелла
Отсортированный массив целых чисел:
0 1 1 2 3 4 4 5 6 6 7 9 9 10 10 11 11 11 13 15 16 16 16 17 18 19 19 20 20 21 21
22 22 24 24 24 26 26 26 28 28 33 33 35 37 37 38 38 42 45 45 45 46 46 46 48 53 54
55 55 55 56 57 62 62 62 64 64 65 65 69 69 70 71 71 71 71 73 74 75 75 75 77 79 8
0 80 80 80 83 86 88 88 90 92 93 95 96 96 98 99
Отсортированный массив чисел с плавающей точкой:
0 0 0.01 0.02 0.02 0.04 0.07 0.07 0.1 0.11 0.12 0.12 0.13 0.14 0.17 0.17 0.17 0.
19 0.2 0.2 0.2 0.21 0.22 0.22 0.22 0.23 0.23 0.24 0.24 0.27 0.27 0.27 0.28 0.29
0.3 0.31 0.34 0.35 0.35 0.35 0.37 0.37 0.37 0.4 0.43 0.43 0.44 0.44 0.46 0.48 0.
5 0.51 0.52 0.53 0.54 0.55 0.55 0.55 0.56 0.59 0.6 0.61 0.63 0.63 0.67 0.69 0.7
0.71 0.73 0.73 0.74 0.74 0.74 0.76 0.77 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.86 0
.87 0.87 0.88 0.9 0.9 0.9 0.9 0.92 0.93 0.93 0.94 0.94 0.94 0.94 0.97 0.97 0.98
Отсортированный массив битовых строк:
000000000001 0010 0011 0011 0011 0101 0110 0110 1000 1001 1010 1011 1011 1100 11
00 1110 1111 1111 1111 011001
Пример 2
Задание
- Написать параметризованную подпрограмму сортировки указанным методом. Отладить ее на целых числах и числах с плавающей точкой.
- Определить класс объектов массива, предназначенного для сортировки. Перегрузить для него операцию присваивания и операции сравнения <, <=, ==, >=, >.
- Написать программу, сортирующую массив объектов построенного класса с помощью написанной параметризованной подпрограммы.
Метод сортировки - метод вставок, класс – строка символов.
Программа
#include
#include
#include
#include
// Класс - строка символов
class SymStr
{
private:
char *s; // Строка
int length; // Длина строки
public:
// Конструкторы
SymStr()
{
s=new char[1];
*s='\0';
length=0;
}
SymStr(char *str)
{
length = strlen(str);
s = new char[length + 1];
strcpy (s, str);
}
SymStr(const SymStr &str)
{
length = str.length;
s = new char[length + 1];
strcpy (s, str.s);
}
// Деструктор
~SymStr() { delete s; }
// Перегрузка оператора >
int operator> (SymStr &);
// Перегрузка оператора >=
int operator>=(SymStr &);
// Перегрузка оператора <
int operator< (SymStr &);
// Перегрузка оператора <=
int operator<=(SymStr &);
// Перегрузка оператора ==
int operator==(SymStr &);
// Перегрузка оператора =
SymStr &operator=(SymStr &Object);
// Перегрузка оператора << для вывода строки
friend ostream &operator<<(ostream &, SymStr &);
};
// Перегрузка оператора >
int SymStr::operator> (SymStr &Object)
{
if(strcmp(s, Object.s) > 0) return 1;
return 0;
}
// Перегрузка оператора >=
int SymStr::operator>=(SymStr &Object)
{
if(strcmp(s, Object.s) >= 0) return 1;
return 0;
}
// Перегрузка оператора <
int SymStr::operator< (SymStr &Object)
{
if(strcmp(s, Object.s) < 0) return 1;
return 0;
}
// Перегрузка оператора <=
int SymStr::operator<=(SymStr &Object)
{
if(strcmp(s, Object.s) <= 0) return 1;
return 0;
}
// Перегрузка оператора ==
int SymStr::operator==(SymStr &Object)
{
if(strcmp(s, Object.s) == 0) return 1;
return 0;
}
// Перегрузка оператора =
SymStr& SymStr::operator=(SymStr &Object)
{
length = strlen(Object.s);
s = new char[length + 1];
strcpy(s, Object.s);
return *this;
}
// Перегрузка оператора << для вывода строки
ostream &operator<<(ostream &fo, SymStr &fp)
{
fo << fp.s;
return fo;
}
// Cортировка вставками
template
void insert (Type *x, int n)
{
int i, j;
Type t;
for (i = 1; i < n; i++)
{
t = x[i];
for (j = i - 1; j >= 0 && t < x[j]; j--)
x[j + 1] = x[j]; // Сдвиг на одну позицию
x[j + 1] = t;
}
}
void main()
{
int i;
int mas1[30]; // Определяем целочисленный массив
float mas2[30]; // Определяем массив чисел с плавающей точкой
randomize(); // Инициализация генератора случайных чисел
// Заполняем массивы случайными числами
for (i = 0; i < 30; i++)
{
mas1[i] = random(30);
mas2[i] = random(30) * 0.01;
}
clrscr(); // Очищаем экран
cout << "\t\t\tСортировка методом вставок\n\n";
// Сортировка целых чисел
insert(mas1, 30);
cout << "Результат сортировки целых чисел:\n";
for (i = 0; i < 30; i++)
cout << mas1[i] << " ";
// Cортировка чисел с плавающей точкой
insert(mas2, 30);
cout << "\n\nРезультат сортировки чисел с плавающей точкой:\n";
for (i = 0; i < 30; i++)
cout << mas2[i] << " ";
SymStr mas3[5] = {"diman", "max", "vasyan", "sanya", "leha"};
// Cортировка символьных строк
insert(mas3, 5);
cout << "\n\nРезультат сортировки битовых строк:\n";
for (i = 0; i < 5; i++)
cout << mas3[i] << " ";
getch();
}
Результаты работы программы
Сортировка методом вставок
Результат сортировки целых чисел:
0 0 1 2 3 4 6 7 8 8 8 9 10 11 12 12 13 13 14 15 16 19 20 21 22 26 27 28 28 29
Результат сортировки чисел с плавающей точкой:
0 0.01 0.03 0.03 0.05 0.06 0.06 0.07 0.08 0.09 0.09 0.1 0.12 0.13 0.14 0.14 0.15 0.15 0.16 0.16 0.18 0.19 0.19 0.2 0.2 0.22 0.26 0.27 0.27 0.29
Результат сортировки битовых строк:
diman leha max sanya vasyan
^ РАСЧЕТНО-ГРАФИЧЕСКОЕ ЗАДАНИЕ 3
Производные классы
Задание. Используя производные классы, определить класс параметризованного списка одного из следующих типов. Применить его для построения списка объектов указанного типа данных.
Определим следующие классы списков:
S1. Упорядоченный список.
S2. Циклический односвязный список.
S3. Циклический двухсвязный список.
S4. Дек.
S5. Очередь.
S6. Дерево поиска.
Определим следующие типы данных:
T1. Число по модулю n.
T2. Текстовая строка.
T3. Рациональное число.
T4. Битовая строка.
T5. Комплексное число.
Комбинируя классы списков и типы данных, получаем варианты заданий:
| S1 | S2 | S3 | S4 | S5 | S6 |
T1 | 1 | 6 | 11 | 16 | 21 | 26 |
T2 | 2 | 7 | 12 | 17 | 22 | 27 |
T3 | 3 | 8 | 13 | 18 | 23 | 28 |
T4 | 4 | 9 | 14 | 19 | 24 | 29 |
T5 | 5 | 10 | 15 | 20 | 25 | 30 |