Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C/C++/C#] Алгоритм шифра частокола, создание алгоритма шифрования частокола 
:(
    Опции темы
porfavor
Дата 10.2.2011, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.2.2011

Репутация: нет
Всего: нет



Всем доброго времени суток1
У меня задача создания алгоритма шифра частокола.
юзер задает слово и висоту частокола. Допустим слово *криптосистема*
с висотой 2 результат будет *рпоитмкитссеа*
с висотой 3 результат будет *исерпоитмктса* и тд...

я вот видал здесь похожую тему но там реализация только с висотой 2, а мне вот нужно чтоб прога считалла взависимости от висоти, указаной юзером 2,3,5, или же 10...
Может ктото знает какойто алгоритм с зацикленостями или какие идеи? а то день сидел уже мозги плавляться и правильно никак невиходит(
PM MAIL   Вверх
Роман2502
Дата 10.2.2011, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.2.2011

Репутация: нет
Всего: нет



Та же проблема нужна такая же программа... если скинеш прогу с висотой 2 могу что то посмотреть и передалать...может и виканает
PM MAIL   Вверх
porfavor
Дата 10.2.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.2.2011

Репутация: нет
Всего: нет



тут писали на ++.

ето мой код на # (подходит под висоту 2 только пишет шифр начиная с нижнего етажа):
Код

Console.Write("Введіть слово для кодування: ");
            string a = Console.ReadLine();
            Console.Write("Введіть висоту частоколу: ");
            string b = Console.ReadLine();
            
            int c = Convert.ToInt32(b);
            if (c > a.Length) Console.WriteLine("Висота частокола більша за слово!");
            else            
                for (int y = 0; y != c; y = y + 1)
                {
                    for (int i = y; i < a.Length; i = i + c)
                    {
                        Console.Write(a[i]);
                    }                 
                }                                 
            Console.ReadKey();


под каждую висоту написать можно, но циклом под висоту юзера невиходит, потомучто разний алгоритм..

Это сообщение отредактировал(а) porfavor - 10.2.2011, 16:56
PM MAIL   Вверх
Роман2502
  Дата 2.3.2011, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.2.2011

Репутация: нет
Всего: нет



код на делфі прога работает

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const  size = 100;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
s,rez,b: string;
matr: array[0..size, 0..size] of string;
i,a,j,z,g,k,n,t,pr:integer;
begin
 memo2.Clear;
 z:=memo1.Lines.Count;
 for g:=0 to z-1 do
 begin
 rez:='';
 t:=form1.SpinEdit1.Value-1;
 s:=''; 
  b:=memo1.lines[g];
 for i:=1 to length(b) do
   begin
   if b[i]<>' ' then
   s:=s+b[i];
    end;
 k:=length(s);
 pr:=0;
 for i:=0 to t do
  for j:= 0 to k do
   matr[i][j]:='';
a:=0;
 for j:=1 to k do
  begin
    if pr=0 then
    begin
     matr[t-a][j]:=s[j];
     if a=t then
      begin
      a:=a-1;
      pr:=1;
      continue;
      end;
     a:=a+1;
    end
    else
    begin
     matr[t-a][j]:=s[j];
     if a=0 then
     begin
      a:=a+1;
      pr:=0;
      continue;
      end;
     a:=a-1;
    end;
  end;
 for i:=0 to t do
  for j:= 0 to k do
   if matr[i][j]<>'' then
   rez:=rez+matr[i][j];
memo2.Lines.Add(rez);
end;
end;
end.
PM MAIL   Вверх
GodOFCod
Дата 13.1.2012, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



Роман что нужно изменить в программе (Delphi) чтобы она дешифровала, допустим - 'рпоитмкитссеа' в результате получили 'криптосистема' с висотой 2 (как сказал porfavor). Буду очень благодарен.
PM MAIL   Вверх
Mirkes
Дата 14.1.2012, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 4
Всего: 17



Вот код кодировщика/декодировщика на Java.
Код

import java.util.Scanner;
import java.io.PrintStream;

public class Code {
    public static void main(String[] arg) {
    // Это техническая часть не имеющая отношения к задаче.
    String consoleEncoding = System.getProperty("consoleEncoding");
    if (consoleEncoding != null) {
        try {
         System.setOut(new PrintStream(System.out, true, consoleEncoding));
        } catch (java.io.UnsupportedEncodingException ex) {
         System.err.println("Unsupported encoding set for console: "+consoleEncoding);
        }
    } else {
        try {
         System.setOut(new PrintStream(System.out, true, "cp866"));
        } catch (java.io.UnsupportedEncodingException ex) {
         System.err.println("Unsupported encoding set for console: "+"cp866");
        }
    }

        // Собственно начало решения
        int hi;
        if (arg.length<2) {
             System.out.println("Использование: java Code a word");
             System.out.println("    a - высота частокола, word - обрабатываемое слово");
             System.out.println("    если высота частокола положительна то кодируем");
             System.out.println("    если высота частокола отрицательна то декодируем");
             return;
        }
        Scanner sc = new Scanner(arg[0]);
        if (sc.hasNextInt())
            hi=sc.nextInt();
        else {
            System.out.println("Недопустмая высота:"+arg[0]);
            return;
        }
        String s; 
        if (hi>0) {
            // Кодируем
            s = new Code().code(hi,arg[1]);
        } else {
            // Декодируем
            s = new Code().decode(-hi,arg[1]);
        }
        System.out.println(s);
    }

    public String code(int hi, String w){
        int l = w.length();
        int ad = -1;
        String work[] = new String [hi];
        for (int i=0;i<hi;i++){
            work[i] = "";
        }
        // Собственно кодирование
        int h = hi-1;
        for (int i=0; i<l; i++){
            work[h]+=w.charAt(i);
            h+=ad;
            if (h==0){
                ad=1;
            } else if (h==hi-1){
                ad=-1;
            }
        }
        // Собираем результат
        String ss = "";
        for (int i=0;i<hi;i++){
            ss=ss+work[i];
        }
        return ss;
    }

    public String decode(int hi, String w){
        int l = w.length();
        // вычисляем число символов с разной высотой
        int hh[]=new int [hi];
        int wh=l/(2*hi-2); // столько было у всех
        for (int i=1; i<hi-1;i++){
            hh[i]=wh*2;
        }
        hh[0]=wh;
        hh[hi-1]=wh;
    wh=l % (2*hi-2); // столько было не у всех
    for (int i=hi-1;i>=0&&wh>0;i--){
        hh[i]++;
        wh--;
    }
    if (wh>0) {  // что - то осталось
        for (int i=1;wh>0;i++){
            hh[i]++;
            wh--;
        }
    }
    // Разбираем строку на подстроки
        String work[] = new String [hi];
    wh=0;
    for (int i=0; i<hi;i++){
        work[i]=w.substring(wh,wh+hh[i]);
        wh+=hh[i];
        hh[i]=0;
    }
    // собираем результат
        int ad = -1;
        // Собственно кодирование
        String ss = "";
        int h = hi-1;
        for (int i=0; i<l; i++){
            ss+=work[h].charAt(hh[h]++);
            h+=ad;
            if (h==0){
                ad=1;
            } else if (h==hi-1){
                ad=-1;
            }
        }
        return ss;
    }
}




--------------------
Mirkes
PM MAIL   Вверх
GodOFCod
Дата 14.1.2012, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.4.2010

Репутация: нет
Всего: нет



Спасибо Mirkes но мне надо программу на Delphi или C/C + +.
PM MAIL   Вверх
Mirkes
Дата 16.1.2012, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 4
Всего: 17



Цитата(GodOFCod @  14.1.2012,  15:29 Найти цитируемый пост)
Спасибо Mirkes но мне надо программу на Delphi или C/C + +. 

Так переведи. С не знаю.
На delphi переводится легко:
Код

program Project1;
{$APPTYPE CONSOLE}

uses
  SysUtils;

Function Code(Hi: Integer; W: String): String;
Var
  I, L, H, Ad: Integer;
  Work: Array Of String;
Begin
  L := Length(W);
  Ad := -1;
  SetLength(Work, Hi);
  For I := 0 To Hi - 1 Do
    Work[I] := '';
  // Собственно кодирование
  H := Hi;
  For I := 1 To L Do
  Begin
    Work[H - 1] := Work[H - 1] + W[I];
    H := H + Ad;
    If H = 1 Then
      Ad := 1 // Переключаем направление изменения высоты
    Else If H = Hi Then
      Ad := -1; // Переключаем направление изменения высоты
  End;
  // Собираем результат
  Result := Work[0];
  For I := 1 To Hi - 1 Do
    Result := Result + Work[I];
End;

Function Decode(Hi: Integer; W: String): String;
Var
  I, L, H, Wh: Integer;
  HH: Array Of Integer;
  Work: Array Of String;
Begin
  L := Length(W);
  SetLength(HH, Hi);
  SetLength(Work, Hi);
  // вычисляем число символов с разной высотой
  Wh := L / (2 * Hi - 2); // столько было у всех
  For I := 1 To Hi - 2 - 1 Do
    HH[I] := Wh * 2;
  HH[0] = Wh;
  HH[Hi - 1] = Wh;
  Wh = L mod (2 * Hi - 2); // столько было не у всех
  I := Hi - 1;
  While (I >= 0) And (Wh > 0) Do
  Begin
    Inc(HH[I]);
    Dec(Wh);
    Dec(I);
  End;
  if (Wh > 0) Then // что - то осталось
  Begin
    I := 1;
    While Wh > 0 Do
    Begin
      Inc(HH[I]);
      Dec(Wh);
      Inc(I);
    End;
  End;
  // Разбираем строку на подстроки
  Wh = 1;
  For I := 0 To Hi - 1 Do
  Begin
    Work[I] := Copy(W, Wh, HH[I]);
    Wh := Wh + HH[I];
    HH[I] := 0;
  End;
  // собираем результат
  Wh := -1;
  // Собственно декодирование
  Result := '';
  H := Hi - 1;
  For I := 1 To L Do
  Begin
    Result := Result + Work[H, HH[H]];
    Inc(HH[H]);
    H := H + Wh;
    If H = 0 Then
      wh := 1 // Переключаем направление изменения высоты
    Else If H = Hi - 1 Then
      wh := -1; // Переключаем направление изменения высоты
  End;
End;

Var
  Hi: Integer;
  C: Char;
  Word, Answer: String;

begin
  WriteLn(' ‚ўҐ¤ЁвҐ Є®¬ ­¤г (c - Є®¤Ёа®ў вм, d - ¤ҐЄ®¤Ёа®ў вм)');
  ReadLn(C);
  WriteLn(' ‚ўҐ¤ЁвҐ ўлб®вг з бв®Є®« ');
  ReadLn(Hi);
  If (IOResult <> 0) Or (Hi < 2) Then
  Begin
    WriteLn('ЌҐўҐа­® § ¤ ­  ўлб®в  з бв®Є®« ');
    Halt;
  End;
  WriteLn('‚ўҐ¤ЁвҐ Є®¤Ёа㥬го бва®Єг');
  ReadLn(Word);
  If UpperCase(C) = 'C' Then
    Answer := Code(Hi, Word)
  Else
    Answer := Decode(Hi, Word);
  WriteLn(Hi);
  WriteLn(Word);
  WriteLn(Answer);

end.

Но вообще говоря это уже запредельная лень. smile 


--------------------
Mirkes
PM MAIL   Вверх
xam9111
  Дата 31.1.2012, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 31.1.2012

Репутация: нет
Всего: нет



Здрасте.
у меня такая проблема, мне нужно програмно реализовать дешифровку с использованием шифра частокола
и провести криптоанализ текста ""ротзкиюпеарнзлдуюкитссеівдртмлчмрцдршфуанєааьоотпоупиміикеоуивягнсн"" при висоте 4.
Желательно на С++, но можна и на Delphi
Заранее благодарю.

Это сообщение отредактировал(а) xam9111 - 31.1.2012, 10:53
PM MAIL   Вверх
Mirkes
Дата 1.2.2012, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 4
Всего: 17



Выше приведен текст на Delphi и Java. Выбирай любой.
Следует учесть, что в моих текстах запись велась начиная с минимальной а первый кол имел максимальную высоту.


--------------------
Mirkes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1727 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.