Кодировщик-декодировшик

Министерство  образования РФ
           Уральский государственный технический университет -УПИ
                    Кафедра "Технология и средства связи"



                                    ОТЧЁТ
                             по учебной практике



                                             Преподаватель: Петров  Р.А.
                                            Студент:  Черепанов К.А.
                                       Группа: Р-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Мбайт оперативной памяти. Программа в состоянии брать  из  любого  каталога
файлы и  также записывать файлы в произвольную директорию,  указанную  вами.
Однако не следует  пренебрегать  общими  принципами  шифрации  и  дешифрации
информационных данных , то есть воспринимать сей труд как панацею зашиты  от
посторонних лиц. Любая  закодированная порция данных может быть с  легкостью
преобразована в исходный текст подбором ключа, путем перестановки литер  для
нахождения логичного варианта.

     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);
}