Доклад: Кодировщик-декодировшик

     Министерство  образования РФ
Уральский государственный технический университет -УПИ
Кафедра "Технология и средства связи"
ОТЧЁТ
по учебной практике
Преподаватель: Петров  Р.А.
Студент:  Черепанов К.А.
Группа: Р-207
Екатеринбург
2000
     СОДЕРЖАНИЕ
1.Задание......................................................................3
2.Описание применения..........................................................3
2.1. Назначение программы......................................................3
2.2. Условия применения........................................................3
2.3. Описание задачи...........................................................3
3.Описание программы...........................................................4
3.1. Общие сведения............................................................4
3.2. Функциональное назначение.................................................4
3.3. Описание  логической  структуры...........................................4
3.4. Используемые технические средства.........................................5
3.5. Вызов и загрузка..........................................................5
3.6. Входные и выходные данные.................................................5
4. Текст программы.............................................................6
                         1.Задание                         
Задано число к и последовательность чисел от 1 до к 1
......к. Необходимо зашифровать литерную последовательность, находящуюся в
файле в соответствии с введенной последовательностью. Выходные данные записать
в  файл. Например, если к равно 4 и последовательность S3,S2,S4,S1 
то символы S1,S1,S3,S4 преобразуются в S3,S2,S4,S1. Если
количество символов не кратно к, то в конце последовательности
необходимо добавить пробелы.
     2. Описание применения
     2.1. Назначение программы
Программа coDec предназначена для шифрации и дешифрации символьного массива,
находящегося в файле.
     2.2. Условия применения
Программа предъявляет очень скромные требования к ресурсам вычислительной
установки. Тем не менее, в случае необходимости использовать для компиляции и
сборки программы С на машинах типа PC необходимо иметь 8Мбайт оперативной
памяти. Программа в состоянии брать из любого каталога файлы и  также
записывать файлы в произвольную директорию, указанную вами. Однако не следует
пренебрегать общими принципами шифрации и дешифрации информационных данных ,
то есть воспринимать сей труд как панацею зашиты от посторонних лиц. Любая
закодированная порция данных может быть с легкостью преобразована в исходный
текст подбором ключа, путем перестановки литер для нахождения логичного
варианта.
     2.3. Описание задачи
Задача, поставленная на практике, состояла в необходимости набора некоего числа 
к и последовательности 1.....к, и перегруппировке символьного массива из
одного файла в символьный массив другого файла, в соответствии с раннее
введенной последовательностью.
     Кодирование достигается следующим образом: из символьного массива файла
источника последовательно берутся символы и записываются в новый символьный
массив В[ ] (B[i+1]=c), далее  из этого массива происходит также
последовательно запись в файл, за исключением того, что индексы записываемых
символов равны последовательности (B[pointer], где pointer равен массиву
последовательности).
     Декодирование: принцип работы декодирования противоположен кодированию и
состоит в том, что новому массиву В[ ] с индексами последовательности
присваиваются считываемые символы (B[pointer]=c), а затем
производится запись этого массива, но уже с индексами от 1 до к (B[i+1])
.
     3.      Описание программы
     3.1.Общие сведения
Программа coDec предназначена для шифрации и дешифрации символьного массива,
находящегося в файле.
Для выполнения программы достаточно вычислительной установки типа  PC с
процессором i386 и выше и 8 Мбайт оперативной памяти, оснащенной любой из
следующих операционных систем: MS DOS (начиная с версии 5.0), Windows 95,
Windows NT версий 4.0.
Программа coDec написана на языке Visual C++, реализованном, например, в
компиляторе MS Developer Studio v.4.2  для операционных систем Windows NT и
Windows 95.
     3.2. Функциональное назначение
Программа применяется для шифрования или дешифрации данных из одного файла в
другой. Однако не всякое сочетание исходных данных позволяет получить
желаемый результат, например, не рекомендуется загружать *.exe  и прочие
файлы, имеющие в  своей структуре помимо текстовых данных, спецсимволы, в
некоторых случаях воспринимаемые программой как конец файла.
     3.3. Описание  логической  структуры
Примечания вида "см. Текст", встречающиеся в этом разделе, означают ссылки на
документ лТекст программы.
                       Описание головной программы                       
В Разделе 1 (см. Текст) производится  подлключение стандартных библиотек
компилятора для обеспечения функционирования отдельных операторов и всей
программы в целом.
В Разделе 2 (см. Текст) осуществляется описание переменных.
В Разделе 3 (см. Текст) производится выбор дальнейшего действия
программы: кодирования (0) или декодирования (1) литерной
последовательности, содержащейся в исходном файле, в выходной файл.
Конструкция while (1) обеспечивает постоянное выполнение цикла до
тех пор, пока не выполнится условие if, которое прерывает его действие
оператором break.
В Разделе 4 находится цикл ввода длины кодовой последовательности, который
автоматически проверяет условие правильности введенного значения.
Сообщение "Error!!! K must be integer from 1 to 10" означает, что
введенный вами символ не удовлетворяет требованиям и необходимо повторить ввод
заново.
В Разделе 5 организован цикл последовательности с проверкой вычисления
контрольной суммы, путем подсчета введенной суммы и суммы из массива W[ ] 
с последующим сравнением обоих результатов. Если суммы не совпадают, цикл
повторяется снова, в противном случае выполняется последующий оператор.
Сообщение " Error!!! Repeat input" говорит о том, что
последовательность неправильна и необходимо повторить ввод заново.
Раздел  6 образован для ввода и открытия для чтения исходного файла,
открытия  и записи выходного файла. Литера лr обозначает, что файл
открывается для чтения, соответственно лw-для записи. При открытии
происходит автоматическая проверка существования в указанной директории файла.
Если программа не в состоянии найти или открыть его выводиться сообщение об
ошибке лError!!! Can't open file и  снова запрашивается имя, если же
ошибок не найдено выполняется следующее действие-запрос имени файла для
результатов.
Раздел 7 предназначен для шифрации данных. Его организация устроена по
принципу, описанному в разделе 2.3. При этом, если в последней
последовательности не хватает n  символов до к, программа
автоматически приписывает дополнительные пробелы. Конструкция if
(feof(fp)&&i==0) return 0 - образована для исключения
дополнительного цикла, который может возникнуть, если количество символов в
файле кратно к, в этом случае выполняется лишний цикл, приводящий к
добавлению дополнительных пробелов и, следовательно, увеличению файлов. При
достижении конца файла EOF шифрации прекращается.
Раздел 8   Дешифрация и запись в файл-приемник-устроен практически по
тому же принципу как и в разделе 7.Различия между операциями
кодирования и декодирования приводятся в подразделе лОписание задачи.
Дешифрация также прекращается при достижении конца файла.
Раздел 9 закрывает раннее открытые файлы.
     3.4. Используемые технические средства
Для выполнения программы достаточно компьютера типа IBM PC с процессором i386
и выше и 8 Мбайт оперативной памяти, оснащенной любой из следующих
операционных систем: MS DOS (начиная с версии 5.0), Windows 95, Windows NT
версий 4.0.
     3.5. Вызов и загрузка
Запуск программы происходит путем запуска файла coDec. exe
     3.6 Входные и выходные данные
Файлы-источники при кодировке по возможности должны быть с расширением  txt, в
то время как файл-приемник может иметь любое. Вызвано это причинами, описанными
ранее в пункте 3.2. При декодировке ограничений нет.
     4.      Текст программы
     // Шифратор-дешифратор
                                Раздел №1                                
     # include <stdio.h>
     # include <io.h>
     # include <stdlib.h>
     # include <iostream.h>
     # include <string.h>
     # include <math.h>
     int main ()
     {                                                                  Раздел №2
FILE *fp,*fp2;                       / *указатели на поток*/
int i,k,Sum,Sum_contr,pointer,select;
int W[]={1,2,3,4,5,6,7,8,9,10}; /*массив проверки*/
int Y[10];                                  /*массив для кодовой перестановки*/
char B[11];                                
/*массив для перестановленных символов*/
char c;                                       
/*переменная для хранения символа*/
char fname[20], fname2[20];     /*массивы для имен файлов*/
           /* О с н о в н о е   т е л о   п р о г р а м м ы */           
                                Раздел №3                                
     /*Выбор кодирования-декодирования*/
     while (1)
     {
printf ("\nChoose coder(0) or decoder (1) ");
scanf("%d",&select);
if ((select==0)||(select==1)) break;
while (getchar()!='\n');
     }
                                Раздел №4                                
     /*Ввод длины кодовой последовательности*/
     while (1)
     {
printf ("\nInput length of code k(1 to 10) ");
scanf ("%d", &k);/* ввод десятичного целого*/
if (k>=1&&k<=10&&k==ceil(k)) break;
while (getchar()!='\n') ;
printf ("\n Error!!! K must be integer from 1 to 10 ");
     }
                                Раздел №5                                
/*Ввод перестановки*/
     while (1)
     {
printf ("\n Input %d elements \n",k);
for (Sum=0,Sum_contr=0,i=0; i<k; i++)
     {
printf ("Element[%d]:",i+1);
scanf ("%d", &Y[i]);
Sum+=Y[i];
Sum_contr+=W[i];  /*Вычисление контрольной суммы*/
     } 
if (Sum==Sum_contr) break;
while (getchar()!='\n');
printf ("\n Error!!! Repeat input");
     }
     /*Очистка входного потока*/
while (getchar()!='\n') ;
                                Раздел №6                                
     /* Ввод имени файла-источника */
puts  ("\nInput name of file-sourche :");
gets (fname);
     /*Открытие файла-источника*/
     while((fp=fopen(fname,"r"))==NULL)  /*открытие файла для чтения*/
     {
puts("Error!!! Can't open file \nInput name of file-source\n");
gets (fname);
     }
     /* Ввод имени файла-приемника */
puts  ("\nInput name of file for results:");
gets (fname2);
     /*Создание файла-приемника*/
     if ((fp2=fopen(fname2,"w"))==NULL) /*открытие файла для записи*/
     {
perror(fname2);
return 1;
     }
                                Раздел №7                                
     /*Шифрация и запись в файл-приемник*/
     if (select==0)
     {
     while (1)
     {
     for (i=0;i<k;i++)
     {
c=fgetc(fp);
if (feof(fp)&&i==0) return 0;
     if (feof(fp)&&i>0)
B[i+1]=' ';
     else
B[i+1]=c;
     }
     for (i=0;i<k;i++)
     {
pointer=Y[i];
putc(B[pointer],fp2);
     }
if (feof(fp)) break;
     }
     }
                                Раздел №8                                
     /*Дешифрация и запись в файл-приемник*/
     else
     {
     while (1)
     {
     for(i=0;i<k;i++)
     {
c=getc(fp);
pointer=Y[i];
B[pointer]=c;
     }          
if (feof(fp)) break;
     for (i=0;i<k;i++)
                                                putc(B[i+1],fp2);
     }
     }
                                Раздел №9                                
     /*Закрытие файла источника и приемника*/
     fclose(fp);
     fclose(fp2);
     }