Автор работы: Пользователь скрыл имя, 11 Декабря 2011 в 15:44, курсовая работа
Ключевым понятием C++ является класс. Класс - это тип, определяемый пользователем. Классы обеспечивают скрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операций. C++ предоставляет гораздо лучшие, чем в C, средства выражения модульности программы и проверки типов. В C++ сохранены возможности языка C по работе с основными объектами аппаратного обеспечения (биты, байты, слова, адреса и т.п.). Это позволяет весьма эффективно реализовывать типы, определяемые пользователем.
Введение 3
Теоретические сведения 4
Объектно-ориентированное программирование 4
Обобщенное программирование 8
Библиотека iostream 11
Класс string 14
Наследование 16
Руководство программиста 17
Руководство пользователя 18
Текст задачи 20
Листинг программ 21
Объектно-ориентированное программирование 21
Обобщенное программирование 30
Заключение 35
Используемая литература 36
Наследование.
Наследование называется простым (одиночным), когда каждый класс порождается только от одного базового класса. В С++ наследование может быть множественным. Множественное наследование означает, что производный класс наследует элементы нескольких базовых классов . При порождении класса из базового класса этот базовый класс может наследоваться как public (открытый), protected (защищенный) или private (закрытый). При порождении класса как public открытые элементы базового класса становятся открытыми элементами производного класса, а защищенные элементы базового класса - защищенными элементами производного класса. Закрытые элементы базового класса никогда не бывают доступны для производного класса. При защищенном наследовании открытые и защищенные элементы базового класса становятся защищенными элементами производного класса . При закрытом наследовании открытые и защищенные элементы базового класса становятся закрытыми элементами производного класса .
Когда один класс наследуется другим , используется сле-
дующая основная форма записи :
class имя_произв_ класса : сп_доступа имя_баз_класса {...};
сп_доступа - это одно из ключевых слов public, protected или private. Технически спецификатор доступа не обязателен. Если спецификатор доступа не указан и производный класс определен с ключевым словом class, то базовый класс по умолчанию наследуется как закрытый.
Если у базового и производного классов имеются конструкторы и деструкторы, то конструкторы выполняются в порядке наследования, а деструкторы - в обратном порядке. Поскольку производный класс наследует элементы базового класса, то при создании объекта производного класса должен быть вызван конструктор базового класса для задания начальных значений элементам базового класса, содержащимся в объекте производного класса. В конструкторе производного класса при явном вызове конструктора базового класса может быть предусмотрен список инициализаторов элементов, в противном случае конструктор производного класса будет неявно вызывать
конструктор
базового класса с умолчанием.
3. Руководство программиста
В процессе выполнения курсовой работы необходимо спроектировать и отладить две программы для решения одной и той же задачи.
Первая программа должна использовать технологию ООП. В рамках этой программы следует спроектировать базовый и производный классы или их шаблоны и выполнить их тестирование. Основными этапами выполнения этой программы должны быть:
1.Разработка спецификации.
На этом этапе следует указать наличие каждого из проектируемых классов и сформулировать требования к обработке ошибок и предупреждений, сгруппировав их по классам. Для каждого предупреждения или сообщения об ошибке в начале диагностического сообщения нужно напечатать номер предупреждения или сообщения об ошибке. Обеспечив нумерацию в возрастающем порядке. Предупреждения выдавайте в файл результатов, а сообщения об ошибках – на экран. Каждый из классов следует оформить в виде заголовочного файла, приняв меры для предотвращения возможности и многократного включения. Для каждого из классов нужно перечислить его члены, указав назначение члена класса и модификатор доступа к нему. Для методов класса дополнительно укажите список параметров, их назначение и что метод возвращает, если это требуется.
2.Разработка программных текстов.
На этом этапе
разработайте программные тексты для
каждого из классов и текст
тестирующей программы.
4. Руководство пользователя
1.Создаем
текстовый файл с расширением *.txt в
папке, где содержатся файлы нашей программы.
В нашем случае это text.txt:
2. Там же создаем файл с тем же расширением *.txt с кодом шифровки, состоящий из двух строк. Это code.txt:
3. Запускаем программу и в открывшемся окне в строку File name вводим имя файла, в котором содержится текст с расширением *.txt, хранящийся в папке с файлами программы:
В следующей строке вводим имя файла с кодом:
После этого действия, результат программы записывается в текстовый файл out.txt
4. В итоге в файле out.txt появляются ключ кода, текст для шифровки и шифрованный текст:
5.Текст задачи
Составить программу для шифровки русского текста. Длина текста – не более NL строк, длина строки – не более NS символов, длина слова – не более NW символов. Исходные данные содержатся в двух файлах. В первом – текст для шифровки, который должен заканчиваться точкой (‘!’, ’?’, ’…’). Во втором – сам шифр в следующем виде:
АБ … Я (что заменить),
ЯП … У (на что заменить).
В файле
результатов должен быть шифр, исходный
и зашифрованный тексты.
//Комментарий. Что касается шифровки текста.
Рассматривается
входной текст посимвольно.
Берется символ, если он есть в первой
строке шифра - он подлежит замене.
Затем он заменяется на символ второй
строки шифра в такой же позиции, если
его нет в строке пишется он же
7.Листинг программ.
Объектное
– ориентированное
программирование
Файл main.cpp
#include
"code.h"//подключение code
int main()
{
Code cd;//объект класса
cd.SetFileName();//
cd.ReadCodeKey();//
cd.PrintSourseText(
cd.Coding();//
if (cd.Exeqtion())//вывод ошибки
{
puts("Error")
printf("%d\n"
}
return 0;
}
Файл code.cpp
#include "code.h"
#include <iostream.h>
#include <string>
FileWork::FileWork()
{
text = new char [50];
key = new char [50];
}
FILE * FileWork::FOpenKey()
{
return fopen(key,"r");
}
FILE * FileWork::FOpenText()
{
return fopen(text,"r");
}
Code::Code()
{
key_size = 50;
s1 = new char [key_size];
s2
= new char [key_size];
out = fopen("out.txt","w");
error = 0;
}
Code::~Code()
{
fclose(out);
}
void FileWork::SetFileName()
{
cout<<"Text file name ";
cin>>text;
cout<<"Code file name ";
cin>>key;
}
int Code::ReadCodeKey()
{
FILE
* f = this->FOpenKey();//fopen(key,"
if (!f)
{
error = 1;
return 1;
}
char ch;
int ind = 0;
//чтение строки с заменяемыми символами
while (!feof(f))
{
ch = fgetc(f);
if (ch == '\n')
break;
s1[ind++] = ch;
}
s1[ind]
= '\0';
//чтение строки с символами на замену
ind = 0;
while (!feof(f))
{
ch = fgetc(f);
s2[ind++] = ch;
}
ind--;
s2[ind]
= '\0';
fclose(f);
return 0;
}
int Code::PrintSourseText()
{
FILE * f = this->FOpenText();
char ch;
if (!f)
{
error = 2;
return 1;
}
//печать шифра в результат
fputs("-->code key\n",out);
fputs(s1,out); fputc('\n',out);
fputs(s2,out); fputc('\n',out);
fputs("-->sourse text\n",out);
while (!feof(f))
{
ch = fgetc(f);
if (feof(f))
break;
fputc(ch,out);
}
return 0;
}
int Code::Coding()
{
FILE * f = this->FOpenText();
char ch;
if (!f)
{
error = 3;
return 1;
}
//шифруем
fputs("\n-->code text\n",out);
fseek(f,0,SEEK_SET);
while(!feof(f))
{
ch = fgetc(f);
if (feof(f))
break;
bool flag = false;
for (int i = 0; s1[i] != '\0' && i<key_size; i++)
if (s1[i] == ch)
{
flag = true;
break;
}
if (flag && i<strlen(s2))
fputc(s2[i],
else