Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2010, 23:44   #1
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
Восклицание функция из Паскаля в Си

Приветик, приветик!!
Вот решила преобразовать найденный код шифра Полибия с Паскаля на Си. Но почему-то не получается.
Вот найденная программа:
Код:
const
  TPolibius: array['A' .. 'E', 'A' .. 'E'] of char = (
    ('A', 'B', 'C', 'D', 'E'),
    ('F', 'G', 'H', 'I', 'K'),
    ('L', 'M', 'N', 'O', 'P'),
    ('Q', 'R', 'S', 'T', 'U'),
    ('V', 'W', 'X', 'Y', 'Z')
  );
function PolibiusEncipher(toCode: string): string;
var
  i: integer;
  ix, jx: char;
  s: string;
begin
  s := '';
  for i := 1 to length(toCode) do begin
 
    for ix := 'A' to 'E' do
      for jx := 'A' to 'E' do
        if TPolibius[ix, jx] = toCode[ i ] then begin
          s := s + ix + jx; break;
        end;
 
  end;
  PolibiusEncipher := s
end;
 
function PolibiusDecipher(toDecode: string): string;
var
  i: integer;
  s: string;
begin
  s := '';
  i := 1;
  while i <= length(toDecode) do begin
    s := s + TPolibius[toDecode[ i ], toDecode[succ(i)]];
    inc(i, 2);
  end;
  PolibiusDecipher := s
end;
 
var
  s: string;
 
begin
  s := PolibiusEncipher('POLIBIUS');
  writeln(s);
  writeln('s = ', PolibiusDecipher(s));
end.
Смысл в следующем. Шифровальная таблица представляла собой квадрат с пятью столбцами и пятью строками, которые нумеровались цифрами от 1 до 5. В каждую клетку такого квадрата записывалась одна буква. В результате каждой букве соответствовала пара чисел, и шифрование сводилось к замене буквы парой чисел.
Irenka вне форума Ответить с цитированием
Старый 17.05.2010, 23:46   #2
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Вот моя программка, которая пока не шифрирует, но удаляет лишние символы:
Код:
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<iostream.h>
#include<string.h>
#include<ctype.h>


void Polibius(char s[130], char TPolibius[5][5])
{
  for (int i=0;i<strlen(s);i++)
  {
    if ((s[i]==' ')||(s[i]==',')||(s[i]=='.'))
      for (int j=i;j<strlen(s);j++)
	    s[j]=s[j+1];
  }

/*  for (i=0;i<strlen(s);i++)
  {
    for (char ix='a'; ix<'e'; ix++)
      for (char jx='a'; jx<'e'; jx++)
	if (TPolibius[ix][jx]==s[i])
	{
	      s[i]=s[i]+ix+jx;
	}
  }*/
}

void main()
{

  char TPolibius[5][5]=
  {{'a', 'b', 'c', 'd', 'e'},
   {'f', 'g', 'h', 'i', 'k'},
   {'l', 'm', 'n', 'o', 'p'},
   {'q', 'r', 's', 't', 'u'},
   {'v', 'w', 'x', 'y', 'z'}};
  FILE *pp, *pt;
  char s[130];
  int t, i;
  char ch;


  clrscr();
  do
  {
    printf("\n\n");
    do
    {
      cout<<"=========================\n";
      cout<<"1. VVOD S KLAVIATURI\n";
      cout<<"=========================\n";
      cout<<"2. VVOD IZ FAILA\n";
      cout<<"=========================\n";
      cout<<"0. VIHOD\n\n";
      cout<<"=========================\n";
      cout<<"VASH VIBOR:";
      cin>>ch;
    }
    while(!strchr("120",tolower(ch)));

    switch(ch)
    {

      case'1':
      {
	    clrscr();

	    cout<<"\n=======================\n";
	    cout<<"\nvvedite frazu dlya shifrovaniya \n\n";

	    gets(s);
	    Polibius(s,TPolibius);

	    cout<<"\n\n=======================\n";
	    cout<<"\nzashifrovannaya fraza \n\n";

	    for(i=0;i<strlen(s);i++)
	      cout<<s[i];
	    pp=fopen("rez1.txt","w");
	    fprintf(pp,"%s",s);
	    fclose(pp);

	    cout<<"\n=======================\n";
	    cout<<"\nnazmite lubyu klavishu";

	    getch();
	    clrscr();
	    break;
      }

      case'2':
      {
	    clrscr();

	    cout<<"\n=======================\n";
	    cout<<"\nfraza dlya shifrovaniya \n\n";

	    pt=fopen("fraz1.txt","r");
	    while(!feof(pt))
	    {
	      fgets(s,130,pt);
	      printf("%s",s);
	    }
	    fclose(pt);

	    cout<<"\n\n=======================\n";
	    cout<<"\nzashifrovannaya fraza \n\n";

	    pt=fopen("fraz1.txt","r");
	    pp=fopen("rez1.txt","w");
	    while(!feof(pt))
	    {
	      fscanf(pt,"%s",s);
	      Polibius(s,TPolibius);
	      printf("%s",s);
	      fprintf(pp,"%s",s);
	    }
	    fclose(pt);
	    fclose(pp);

	    cout<<"\n=======================\n";
	    cout<<"\nnazmite lubyu klavishu";

	    getch();
	    clrscr();
	    break;
      }

      case'0':
      {
	    t=1;
	    exit(1);
      }

    }
  }
  while (t!=1);
}
Irenka вне форума Ответить с цитированием
Старый 17.05.2010, 23:59   #3
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Расшифрировать не нужно. Но даже с шифрированием траблы. Т.е. с этой ф-цией
Код:
void Polibius(char s[130], char TPolibius[5][5])
{
  for (int i=0;i<strlen(s);i++)
  {
    if ((s[i]==' ')||(s[i]==',')||(s[i]=='.'))
      for (int j=i;j<strlen(s);j++)
	    s[j]=s[j+1];
  }

  for (i=0;i<strlen(s);i++)
  {
    for (char ix='a'; ix<'e'; ix++)
      for (char jx='a'; jx<'e'; jx++)
	if (TPolibius[ix][jx]==s[i])
	{
	      s[i]=s[i]+ix+jx;
	}
  }
}
Как исправить?
Irenka вне форума Ответить с цитированием
Старый 18.05.2010, 23:07   #4
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Есть у кого-нить идеи? А?
Откликнитесь!
Irenka вне форума Ответить с цитированием
Старый 18.05.2010, 23:37   #5
Indian
Форумчанин
 
Регистрация: 23.02.2010
Сообщений: 107
По умолчанию

Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const char TPolibius[5][5]=
  {{'a', 'b', 'c', 'd', 'e'},
   {'f', 'g', 'h', 'i', 'k'},
   {'l', 'm', 'n', 'o', 'p'},
   {'q', 'r', 's', 't', 'u'},
   {'v', 'w', 'x', 'y', 'z'}};

void PolibiusEnc(const char* str, char* str2){
	int i;
	int ix,jx;
	
	for(i=0;i<strlen(str);i++)
		for(ix=0; ix<5; ix++)
			for(jx=0; jx<5; jx++)
				if(str[i]==TPolibius[ix][jx])
				{
					char tmp[2]=""; //инициализиуем, чтобы не было мусора
					//второй элемент - это '\0' - строка заканчивается символом конца строки.
					
					tmp[0]='0'+ix; //преобразуем цифру в её буквенный эквивалент. См. таблицу ascii.
					strcat(str2,tmp); //strcat - присоединить к строке
					
					tmp[0]='0'+jx;
					strcat(str2,tmp);
					
					strcat(str2," "); //прибавляем пробел
					
				}
				
}

int main(){
  char s[50]="";
  PolibiusEnc("polibius",s);
  puts(s);

  return 0;
}
Indian вне форума Ответить с цитированием
Старый 19.05.2010, 03:36   #6
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Ой, и правда - работает! Замечательно))
Так интересно! Теперь можно писать только цифрами))
Irenka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С Паскаля на Си++ Svetlanka_ya Помощь студентам 0 16.05.2010 12:17
от паскаля к с++ WOLFak Обсуждение статей 11 27.01.2010 00:18
из Паскаля в С++ Lees27 Общие вопросы C/C++ 1 14.09.2009 23:29
ЗАДАННЯ НА ПАСКАЛЯ --- ЗАПИСЬ, график функция, МАССИВ, annya77 Паскаль, Turbo Pascal, PascalABC.NET 14 19.04.2009 20:07
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50