Отчёт (Готовые ЛР и ДЗ (ИУ5))
Описание файла
Файл "Отчёт" внутри архива находится в следующих папках: Готовые ЛР и ДЗ (ИУ5), отчёты, работа 10-11. Документ из архива "Готовые ЛР и ДЗ (ИУ5)", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "информатика" в общих файлах.
Онлайн просмотр документа "Отчёт"
Текст из документа "Отчёт"
Московский государственный технический
университет им. Н.Э. Баумана.
Факультет «Информатика и управление»
Кафедра ИУ5. Курс «Основы информатики»
Отчет по лабораторной работе №10-11
«Обработка символьных строк»
Выполнил: | Проверил: | |
студент группы ИУ5-14 | преподаватель каф. ИУ5 | |
Шевченко Роман | Папшев И.С. | |
Подпись и дата: | Подпись и дата: |
г. Москва, 2008 г.
Постановка задачи
Провести кодирование и декодирование текста (массива символов) при помощи кода Цезаря с переменным сдвигом по таблице ASCII-кодов. Величина сдвига для каждой позиции в исходном тексте - сумма (по модулю 256) кодов символов слова кодового блокнота, стоящего в блокноте на той же позиции. Если кодовый блокнот имеет слов меньше, чем количество символов в исходном тексте, то по исчерпании слов в нём перейти к первому слову и продолжить.
Исследовать повторяемость символов в закодированном тексте (сколько каких кодов одного и того же исходного символа получено) в зависимости от кодового блокнота и длины исходного текста. Результаты исследования представить в виде таблицы (продумать формат таблицы). Исследование и вывод таблицы результатов следует выполнять в режиме диалога, последовательно вычисляя и выводя результаты для запрашиваемого символа. Статистические данные хранить в массиве int stat[256], Для большей достоверности статистических результатов в качестве исходного текста и кодового блокнота использовать текстовые файлы размером около 1 Кбайта.
Разработка алгоритма
На основе кодового блокнота целесообразно сначала сформировать по заданному правилу целочисленный массив ключей, который затем использовать при кодировании. Эти действия можно оформить в виде отдельной функции. Для кодирования текста можно использовать формулу: x= (y + k)%n
Где:
x – закодированный символ;
y – кодируемый символ;
k – ключ;
n – алфавит(в нашем случае 256);
Так же в случае если получаемый код по ASCII отрицательный, его нужно перевести в положительный.
Описание входных, выходных и вспомогательных данных:
Входные данные:
Выходные данные:
double integral – полученое значение интеграла;
double n - число отрезков, при котором достигнута требуемая точность;
Вспомагательные данные:
double xn, xk – границы интервала интегрирования;
double eps – точность;
double intr_arr[5][3] – хранит вычисленную информацию для метода прямоугольников;
double ints_arr[5][3] - хранит вычисленную информацию для метода Дарбу-Римана;
double dx, x - длина отрезка по x, значение переменной x;
double sc, sn –, вычисленная на прошлом шаге сумма, новая сумма;
double s1, s2, y1, y2 – верхняя и нижняя суммы, высота по y справа и слева;
Текст программы.
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
class bukv_inform{
char name; //буква
int k; //cколькими вариантами закобировался символ
int inform[257][2]; //хранит ASCII-код кодирующих символов и то,
//сколько раз он кодирует введёный символ
char sootvsimvoj[256]; //хранит кодирующие символы
public:
void vvod(char *text, char *codtext, int n); //вычисление информации по введёному символу
void shov(); //вывод таблици
};
void bukv_inform::vvod(char *text, char *codtext, int n)
{
cout <<"Введите интересующий вас символ: ";
cin >>name;
bool t;
k= 0;
int cod;
for(int i= 0;i < n;i++){
if(text[i] == name){
t= 1;
cod= (int)codtext[i];
if(cod < 0) cod= 256+cod;
for(int j= 0; j < k; j++){
if(cod == inform[j][0]) {
inform[j][1]++;
t= 0;
break;
}
}
if(t){
inform[k][0]= cod;
inform[k][1]= 1;
sootvsimvoj[k]= codtext[i];
k++;
}
}
}
}
void bukv_inform::shov()
{
cout <<"\n № " <<"ASCII-код " <<"Кодовый символ " <<"В программе встречается\n";
for(int i= 0; i < k; i++){
cout <<setw(3) <<i <<setw(9) <<inform[i][0] <<setw(13);
if(inform[i][0] == 10) cout <<"\\n" <<setw(23)<<inform[i][1] <<"\n";
else if(inform[i][0] == 9) cout <<"\\t" <<setw(23)<<inform[i][1] <<"\n";
else if((inform[i][0] == 149)||(inform[i][0] == 7)) cout <<"\\r" <<setw(23)<<inform[i][1] <<"\n";
else if(inform[i][0] == 13) cout <<"\\f" <<setw(23)<<inform[i][1] <<"\n";
else cout <<sootvsimvoj[i] <<setw(23)<<inform[i][1] <<"\n";
}
}
int main()
{
setlocale(0, "russian");
ifstream in("Input.in");
if(!in){
cout <<"Невозможно открыть файл./n";
system("Pause");
return 1;
}
ofstream out("Output.out");
if(!out){
cout <<"Невозможно открыть файл./n";
system("Pause");
return 1;
}
in.unsetf(ios::skipws); //чтоб пробелы и др. подобные символы считывались из файла
bukv_inform bukva; //Обыявляю объект класса bukv_inform
int cod; //переменная для хранения кода отдельного символа
//---------------------------Создание и заполнение массива---------------------------
int n= 2200;
char *text;
try{
text= new char [n];
}catch(bad_alloc xa){
cout <<"Ошибка.\n";
system("Pause");
return 1;
}
for(n= 0; !in.eof(); n++) //символы считываются пока не обнаружится конец файла, заодно ведётся
//подсчёт считанных элеметов
in >>text[n];
n--;
//---------------------------Cоздание массива ключей---------------------------------
int *scod;
scod= new int [n]; //массив ключей(ключ - сумма кодов одного слова)
scod[0]= 0;
for(int i=0, j= 0;j < n;i= i!=n ? i+1 : 0){
if(text[i] == ' '){
j++;
scod[j]= 0;
}else{
cod= (int)text[i];
if(cod < 0) cod= 256+cod;
scod[j]+= cod;
}
}
//------------------------------------Кодирую текст----------------------------------
char *codtext;
codtext= new char [n]; //закодированный текст
for(int i=0;i < n;i++){
cod= (int)text[i];
if(cod < 0) cod= 256+cod;
codtext[i]=(char)((cod+scod[i])%256);
}
//--------------------------Вывод закодированого массива(на экран)--------------------
for(int i= 0;i < n; i++)
cout <<codtext[i];
cout <<"\n\n";
//--------------------------------------Декодирую текст-------------------------------
for(int i=0;i < n;i++){
cod= (int)codtext[i];
if(cod < 0) cod= 256+cod;
text[i]=(char)((cod-scod[i])%256);
}
//----------------------------Вывод декодированого массива(на экран)----------------
for(int i= 0;i < n; i++)
cout <<text[i];
cout <<"\n\n";
//------------------------------Вывод закодированого массива(в файл)----------------
for(int i= 0;i < n; i++)
out <<codtext[i];
//-------------------------------------Интерактивная часть---------------------------
char ex;
do{
bukva.vvod(text, codtext, n);
bukva.shov();
cout <<"Выйти?";
cin >>ex;
}while(ex != 'y');
//-------------------------------------------The End---------------------------------
delete [] text;
delete [] codtext;
return 0;
}
Анализ результатов