Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Министерство образования Российской Федерации
Уральский Федеральный Университет имени первого президента РФ Б.Н.Ельцина
Кафедра Технологий и Средств Связи
Оценка работы
Отчет
по учебной практике
Руководитель Плохих О.В.
Студент Лаптев С.А.
Группа Р-200802
Екатеринбург 2011
Цель учебной практики - получение новых знаний и совершенствование практических навыков по дисциплинам информационного цикла.
Задачи:
Задание:
Расшифровать текст на русском языке, если известно, что он зашифрован при помощи одного перемешанного алфавита. Размер текста не ограничен. Текст содержит слова, разделенные знаками препинания, пробелами и символами конца строки, и берется из файла.
Введение:
Анализировать частоту повторения букв можно двумя способами. Способ 1. Взять текст, найти в нем уникальные словоформы и анализировать их. Способ 2. Не искать в тексте уникальные слова, а сразу перейти к подсчету частоты повторения букв. Получаем частоту букв в русском тексте, а не в русских словах. Поэтому для решения задачи, мне пришлось проанализировать частоту букв для различных текстов и изменить данную в задаче частоту на другую, так как данная частота подходит только для неповторяющихся слов, а не для текста. Так же используя разную величину погрешности, можно более точно расшифровывать текст. Для работы написанной программы подходит только объемный текст, так как в нем должны присутствовать все буквы алфавита, поэтому текст можно брать только из файла.
Решение:
#include "stdafx.h"
#include <windows.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <iostream>
using namespace std;
const int KEY_ENTER = 13; //клавиши
const int KEY_UP = 72;
const int KEY_DOWN = 80;
int smenu=1;
int menu();
void DrawBorder(HANDLE);
void DrawMenu(HANDLE,int);
int tshifr();
void main()
{
setlocale(0,"rus");
int choose; // Выбранный пункт меню
system("cls");
while (1)
{
choose = menu();
switch (choose)
{
case 1:
system("cls");
tshifr();
break;
case 2:
exit(18);
}
}
return;
}
// Выбор пункта меню
int menu()
{
system("cls");
HANDLE display;
display = GetStdHandle(STD_OUTPUT_HANDLE);
DrawBorder(display); // Рисуем рамочку вокруг меню
// Опрос клавиш
int key=0;
DrawMenu(display,smenu); // Рисуем пункты меню
while (key!=KEY_ENTER)
{
key = getch();
// Нажали вверх?
if (key==KEY_UP)
{
// Переходим к предыдущему пункту меню,
// если можем и перерисовываем меню
if (--smenu<1)
smenu=1;
DrawMenu(display,smenu);
}
// нажали вниз?
else if (key==KEY_DOWN)
{
// Переходим к следующему пункту меню,
// если можем и перерисовываем меню
if (++smenu>2)
smenu=2;
DrawMenu(display,smenu);
}
}
return smenu;
}
void DrawBorder(HANDLE display)
{
// Определяем координаты рамки, цвет её, вид
const int left = 80/2-32/2;
const int top = 20/2-6/2;
char ramka[2][33];
strcpy(ramka[0],"+------------------------------+");
strcpy(ramka[1],"| |");
COORD position;
// Устанавливаем цвет и координаты
position.X = left;
position.Y = top;
SetConsoleTextAttribute(display,FOREGROUND_GREEN|FOREGROUND_INTENSITY);
SetConsoleCursorPosition(display,position);
// выводим верхнюю часть рамки
printf("%s",ramka[0]);
// выводим середину
for (int i=0; i<2; i++)
{
position.X = left;
position.Y++;
SetConsoleCursorPosition(display,position);
printf("%s",ramka[1]);
}
// выводим нижнюю часть
position.X = left;
position.Y++;
SetConsoleCursorPosition(display,position);
printf("%s",ramka[0]);
// Устанавливаем курсор в левый верхний угол
position.X = 0;
position.Y = 0;
SetConsoleCursorPosition(display,position);
SetConsoleTextAttribute(display,FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED);
return;
}
void DrawMenu(HANDLE dis,int select)
{
// Константы выбирающие место вывода на экран
const int left = 80/2-32/2+1;
const int top = 20/2- 6/2+1;
COORD pos;
char textmenu[2][31];
// Пункты меню5
strcpy(textmenu[0]," 1. Расшифровка ");
strcpy(textmenu[1]," 2. Выход ");
// Вывод пунктов меню
for (int i=0; i<2; i++)
{
// В зависимости от выбранного пункта меню выставляем цвет
if (select==i+1)
SetConsoleTextAttribute(dis,BACKGROUND_GREEN);
else
SetConsoleTextAttribute(dis,FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY);
// Выводим
pos.X = left;
pos.Y = top+i;
SetConsoleCursorPosition(dis,pos);
printf("%s",textmenu[i]);
}
// Устанавливаем курсор в левый верхний угол
pos.X = 0;
pos.Y = 0;
SetConsoleCursorPosition(dis,pos);
SetConsoleTextAttribute(dis,FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED);
return;
}
int tshifr()
{
setlocale(LC_ALL, "rus");
int aa;
aa=0;
char ff[25], buf[100000];
FILE*lol;
cout<<"Введите название файла: ";
cin>>ff;
lol=fopen(ff, "rt");
if(lol==NULL)
{
printf("He удается открыть файл.\n");
system("pause");
exit(1);
}
while((buf[aa]=fgetc(lol))!=EOF)
{
printf("%c", buf[aa]);
aa++;
}
int ii;
float a,b,v,g,d,e,yo,zh,z,i,yi,k,l,m,n,o,p,r,s,t,y,f,x,c,ch,sh,sha,tv,bi,mz,ay,yu,ya;
a=b=v=g=d=e=yo=zh=z=i=yi=k=l=m=n=o=p=r=s=t=y=f=x=c=ch=sh=sha=tv=bi=ay=yu=ya=mz=0;
float shifr[34], alf[34];
alf[1]=0.067043804;
alf[2]=0.014601330;
alf[3]=0.029432001;
alf[4]=0.012690161;
alf[5]=0.027673725;
alf[6]=0.059399128;
alf[7]=0.0038987845;
alf[8]=0.0081033558;
alf[9]=0.012231480;
alf[10]=0.046020947;
alf[11]=0.0073388885;
alf[12]=0.023316260;
alf[13]=0.027215045;
alf[14]=0.025609663;
alf[15]=0.050378412;
alf[16]=0.085467473;
alf[17]=0.026144790;
alf[18]=0.035165507;
alf[19]=0.036388654;
alf[20]=0.061697248;
alf[21]=0.024157174;
alf[22]=0.0016818286;
alf[23]=0.0071859951;
alf[24]=0.0023698495;
alf[25]=0.010778992;
alf[26]=0.0056570601;
alf[27]=0.0019111689;
alf[28]=0.00030578702;
alf[29]=0.013683969;
alf[30]=0.017582754;
alf[31]=0.0041281246;
alf[32]=0.0079504624;
alf[33]=0.016588945;
for(ii=0;ii<aa;ii++)
{
if((buf[ii]=='а')||(buf[ii]=='А'))
a++;
if((buf[ii]=='б')||(buf[ii]=='Б'))
b++;
if((buf[ii]=='в')||(buf[ii]=='В'))
v++;
if((buf[ii]=='г')||(buf[ii]=='Г'))
g++;
if((buf[ii]=='д')||(buf[ii]=='Д'))
d++;
if((buf[ii]=='е')||(buf[ii]=='Е'))
e++;
if((buf[ii]=='ё')||(buf[ii]=='Ё'))
yo++;
if((buf[ii]=='ж')||(buf[ii]=='Ж'))
zh++;
if((buf[ii]=='з')||(buf[ii]=='З'))
z++;
if((buf[ii]=='и')||(buf[ii]=='И'))
i++;
if((buf[ii]=='й')||(buf[ii]=='Й'))
yi++;
if((buf[ii]=='к')||(buf[ii]=='К'))
k++;
if((buf[ii]=='л')||(buf[ii]=='Л'))
l++;
if((buf[ii]=='м')||(buf[ii]=='М'))
m++;
if((buf[ii]=='н')||(buf[ii]=='Н'))
n++;
if((buf[ii]=='о')||(buf[ii]=='О'))
o++;
if((buf[ii]=='п')||(buf[ii]=='П'))
p++;
if((buf[ii]=='р')||(buf[ii]=='Р'))
r++;
if((buf[ii]=='с')||(buf[ii]=='С'))
s++;
if((buf[ii]=='т')||(buf[ii]=='Т'))
t++;
if((buf[ii]=='у')||(buf[ii]=='У'))
y++;
if((buf[ii]=='ф')||(buf[ii]=='Ф'))
f++;
if((buf[ii]=='х')||(buf[ii]=='Х'))
x++;
if((buf[ii]=='ц')||(buf[ii]=='Ц'))
c++;
if((buf[ii]=='ч')||(buf[ii]=='Ч'))
ch++;
if((buf[ii]=='ш')||(buf[ii]=='Ш'))
sh++;
if((buf[ii]=='щ')||(buf[ii]=='Щ'))
sha++;
if((buf[ii]=='ъ')||(buf[ii]=='Ъ'))
tv++;
if((buf[ii]=='ы')||(buf[ii]=='Ы'))
bi++;
if((buf[ii]=='ь')||(buf[ii]=='Ь'))
mz++;
if((buf[ii]=='э')||(buf[ii]=='Э'))
ay++;
if((buf[ii]=='ю')||(buf[ii]=='Ю'))
yu++;
if((buf[ii]=='я')||(buf[ii]=='Я'))
ya++;
}
shifr[1]=a/aa;
shifr[2]=b/aa;
shifr[3]=v/aa;
shifr[4]=g/aa;
shifr[5]=d/aa;
shifr[6]=e/aa;
shifr[7]=yo/aa;
shifr[8]=zh/aa;
shifr[9]=z/aa;
shifr[10]=i/aa;
shifr[11]=yi/aa;
shifr[12]=k/aa;
shifr[13]=l/aa;
shifr[14]=m/aa;
shifr[15]=n/aa;
shifr[16]=o/aa;
shifr[17]=p/aa;
shifr[18]=r/aa;
shifr[19]=s/aa;
shifr[20]=t/aa;
shifr[21]=y/aa;
shifr[22]=f/aa;
shifr[23]=x/aa;
shifr[24]=c/aa;
shifr[25]=ch/aa;
shifr[26]=sh/aa;
shifr[27]=sha/aa;
shifr[28]=tv/aa;
shifr[29]=bi/aa;
shifr[30]=mz/aa;
shifr[31]=ay/aa;
shifr[32]=yu/aa;
shifr[33]=ya/aa;
int q;
char valf[34];
q=32;
float sum;
for(q=1;q<34;q++)
{
for(ii=1;ii<34;ii++)
{
if((shifr[ii]-alf[q]<0.0002)&&(shifr[ii]-alf[q]>-0.0002))
{
if(q==1)
valf[ii]='а';
if(q==2)
valf[ii]='б';
if(q==3)
valf[ii]='в';
if(q==4)
valf[ii]='г';
if(q==5)
valf[ii]='д';
if(q==6)
valf[ii]='е';
if(q==7)
valf[ii]='ё';
if(q==8)
valf[ii]='ж';
if(q==9)
valf[ii]='з';
if(q==10)
valf[ii]='и';
if(q==11)
valf[ii]='й';
if(q==12)
valf[ii]='к';
if(q==13)
valf[ii]='л';
if(q==14)
valf[ii]='м';
if(q==15)
valf[ii]='н';
if(q==16)
valf[ii]='о';
if(q==17)
valf[ii]='п';
if(q==18)
valf[ii]='р';
if(q==19)
valf[ii]='с';
if(q==20)
valf[ii]='т';
if(q==21)
valf[ii]='у';
if(q==22)
valf[ii]='ф';
if(q==23)
valf[ii]='х';
if(q==24)
valf[ii]='ц';
if(q==25)
valf[ii]='ч';
if(q==26)
valf[ii]='ш';
if(q==27)
valf[ii]='щ';
if(q==28)
valf[ii]='ъ';
if(q==29)
valf[ii]='ы';
if(q==30)
valf[ii]='ь';
if(q==31)
valf[ii]='э';
if(q==32)
valf[ii]='ю';
if(q==33)
valf[ii]='Я';
}
}
}
for(q=0;q<aa;q++)
{
if((buf[q]=='а')||(buf[q]=='н')||(buf[q]=='ъ')||(buf[q]=='Ж')||(buf[q]=='З')
||(buf[q]=='б')||(buf[q]=='о')||(buf[q]=='ы')||(buf[q]=='И')||(buf[q]=='Ф')
||(buf[q]=='в')||(buf[q]=='п')||(buf[q]=='ь')||(buf[q]=='Й')||(buf[q]=='Х')
||(buf[q]=='г')||(buf[q]=='р')||(buf[q]=='э')||(buf[q]=='К')||(buf[q]=='Ц')
||(buf[q]=='д')||(buf[q]=='с')||(buf[q]=='ю')||(buf[q]=='Л')||(buf[q]=='Ч')
||(buf[q]=='е')||(buf[q]=='т')||(buf[q]=='я')||(buf[q]=='М')||(buf[q]=='Ш')
||(buf[q]=='ё')||(buf[q]=='у')||(buf[q]=='А')||(buf[q]=='Н')||(buf[q]=='Щ')
||(buf[q]=='ж')||(buf[q]=='ф')||(buf[q]=='Б')||(buf[q]=='О')||(buf[q]=='Ъ')
||(buf[q]=='з')||(buf[q]=='х')||(buf[q]=='В')||(buf[q]=='П')||(buf[q]=='Ы')
||(buf[q]=='и')||(buf[q]=='ц')||(buf[q]=='Г')||(buf[q]=='Р')||(buf[q]=='Ь')
||(buf[q]=='й')||(buf[q]=='ч')||(buf[q]=='Д')||(buf[q]=='С')||(buf[q]=='Э')
||(buf[q]=='к')||(buf[q]=='ш')||(buf[q]=='Е')||(buf[q]=='Т')||(buf[q]=='Ю')
||(buf[q]=='л')||(buf[q]=='щ')||(buf[q]=='Ё')||(buf[q]=='У')||(buf[q]=='Я')
||(buf[q]=='м'))
{
if((buf[q]=='а')||(buf[q]=='А'))
printf("%c",valf[1]);
if((buf[q]=='б')||(buf[q]=='Б'))
printf("%c",valf[2]);
if((buf[q]=='в')||(buf[q]=='В'))
printf("%c",valf[3]);
if((buf[q]=='г')||(buf[q]=='Г'))
printf("%c",valf[4]);
if((buf[q]=='д')||(buf[q]=='Д'))
printf("%c",valf[5]);
if((buf[q]=='е')||(buf[q]=='Е'))
printf("%c",valf[6]);
if((buf[q]=='ё')||(buf[q]=='Ё'))
printf("%c",valf[7]);
if((buf[q]=='ж')||(buf[q]=='Ж'))
printf("%c",valf[8]);
if((buf[q]=='з')||(buf[q]=='З'))
printf("%c",valf[9]);
if((buf[q]=='и')||(buf[q]=='И'))
printf("%c",valf[10]);
if((buf[q]=='й')||(buf[q]=='Й'))
printf("%c",valf[11]);
if((buf[q]=='к')||(buf[q]=='К'))
printf("%c",valf[12]);
if((buf[q]=='л')||(buf[q]=='Л'))
printf("%c",valf[13]);
if((buf[q]=='м')||(buf[q]=='М'))
printf("%c",valf[14]);
if((buf[q]=='н')||(buf[q]=='Н'))
printf("%c",valf[15]);
if((buf[q]=='о')||(buf[q]=='О'))
printf("%c",valf[16]);
if((buf[q]=='п')||(buf[q]=='П'))
printf("%c",valf[17]);
if((buf[q]=='р')||(buf[q]=='Р'))
printf("%c",valf[18]);
if((buf[q]=='с')||(buf[q]=='С'))
printf("%c",valf[19]);
if((buf[q]=='т')||(buf[q]=='Т'))
printf("%c",valf[20]);
if((buf[q]=='у')||(buf[q]=='У'))
printf("%c",valf[21]);
if((buf[q]=='ф')||(buf[q]=='Ф'))
printf("%c",valf[22]);
if((buf[q]=='х')||(buf[q]=='Х'))
printf("%c",valf[23]);
if((buf[q]=='ц')||(buf[q]=='Ц'))
printf("%c",valf[24]);
if((buf[q]=='ч')||(buf[q]=='Ч'))
printf("%c",valf[25]);
if((buf[q]=='ш')||(buf[q]=='Ш'))
printf("%c",valf[26]);
if((buf[q]=='щ')||(buf[q]=='Щ'))
printf("%c",valf[27]);
if((buf[q]=='ъ')||(buf[q]=='Ъ'))
printf("%c",valf[28]);
if((buf[q]=='ы')||(buf[q]=='Ы'))
printf("%c",valf[29]);
if((buf[q]=='ь')||(buf[q]=='Ь'))
printf("%c",valf[30]);
if((buf[q]=='э')||(buf[q]=='Э'))
printf("%c",valf[31]);
if((buf[q]=='ю')||(buf[q]=='Ю'))
printf("%c",valf[32]);
if((buf[q]=='я')||(buf[q]=='Я'))
printf("%c",valf[33]);
}
else printf("%c",buf[q]);
}
system("pause");
return 0;
}
Описание:
Включаем необходимые библиотеки, для начала вводим массив alf с частотами появления русских букв. Текст с помощью цикла while записываем в массив buf, одновременно определяя количество символов в тексте. Далее создаем переменную для каждой буквы, и считаем сколько раз одна и та же буква повторяется в зашифрованном тексте, потом делим каждую переменную на общее количество букв, и получаем частоту появления зашифрованных букв. Эти частоты заносятся в массив shifr. Далее используя двойной цикл, перебираем частоты букв и зашифрованных букв, и сравниваем с помощью функции if((shifr[ii]-alf[q]<0.0002)&&(shifr[ii]-alf[q]>-0.0002)). Если частоты близки, то данный двойной цикл сопоставляет обычную букву с зашифрованной. Перебираем так весь алфавит и записываем исправленный алфавит в массив valf. Далее с помощью цикла for перебираем весь текст в массиве buf, и если попадается буква, то она изменяется на расшифрованную из массива valf , если попадается любой другой символ, то он переписывается. Таким образом мы получаем расшифрованный текст.
Список используемой литературы:
www.Spectator.ru