Programming

NAVIGATION
CATEGORIES
REFERRENCE
LINKS
  • help with string splitting

    10 answers - 2545 bytes - related search similar search Add To My Delicious Add To My Stumble Upon Add To My Google Mark Add To My Facebook Add To My Digg Add To My Reddit

    hello how would I create an Ada program to take an encrypted string
    from a txt file and decrypt it. i have a so so program but it doesnt
    work i cant get the algorithm right.
    an example is this
    Mother would be Mtoehr encrypted
    so its just like cutting the string in half and rearranging the
    chaacters to fix the decryption
    my example uses a txt file which the contents are
    encrypted version
    aaabbb
    real code
    ababab
    here is the program i have so far
    with Ada.Text_Io;
    use Ada.Text_Io;
    procedure Assignment_4 is
    --|This program takes in a railfence encryption and deciphers it
    --|Author: Isaac Levin
    subtype Message is String (11024);
    Codedtext : Message; - string of coded text
    Plaintext : Message; - plain text message
    Indata : File_Type;
    Length : Natural := 1; size of the encrypted message
    J : Integer := 0; midpoint for odd and even strings
    K : Integer := 2; for the encrypted string
    begin -- Assingment_4
    the proper text file and read the code into the string
    CodedText
    (
    File =Indata,
    Mode =In_File,
    Name ="test.txt");
    while not EFile(File =Indata) loop
    Get(
    File =Indata,
    Item =Codedtext (Length));
    Length := Length + 1;
    end loop;
    the length to account for odd or even string lengths
    if Length REM 2 = 0 then
    J := 0;
    else
    J := 1;
    end if;
    the first charcter of the coded message into the decoded
    one
    if Length 1 then
    Plaintext(1) := Codedtext(1);
    end if;
    every character of the encoded string up to the halfway
    point
    every odd position in the decoded one
    for I in 2(Length - 1) loop
    if I REM 2 = 0 then
    Plaintext(I + 1) := Codedtext(K);
    K := K + 1;
    else
    null;
    end if;
    end loop;
    K := 1;
    every character of the encoded string past the halfway
    point
    every even position in the decoded one
    for I in 2(Length - 1) loop
    if I REM 2 = 0 then
    Plaintext(I) := Codedtext((Length/2) + J + K);
    K := K + 1;
    else
    null;
    end if;
    end loop;
    the string PlainText to the screen
    for I in 1(Length - 1) loop
    Put(Item =Plaintext (I));
    end loop;
    Close(File =Indata);
    end;
    the program just cuts off the last letter in the string. i think this
    has something to do with my splitting of even number strings. any help
    would be greatly appreciated.
    Isaac
  • No.1 | | 3301 bytes | |

    isaac2004 wrote:
    hello how would I create an Ada program to take an encrypted string
    from a txt file and decrypt it. i have a so so program but it doesnt
    work i cant get the algorithm right.

    an example is this
    Mother would be Mtoehr encrypted

    so its just like cutting the string in half and rearranging the
    chaacters to fix the decryption

    my example uses a txt file which the contents are

    encrypted version
    aaabbb

    real code
    ababab

    Your two examples above do not agree.
    Following the encrypted example, Mother would encrypt to
    Mteohr. I suspect that may have been a slip of the fingers during
    typing, but it does add confusion to your requirements.

    here is the program i have so far

    with Ada.Text_Io;
    use Ada.Text_Io;
    procedure Assignment_4 is
    --|This program takes in a railfence encryption and deciphers it
    --|Author: Isaac Levin

    subtype Message is String (11024);

    Codedtext : Message; - string of coded text
    Plaintext : Message; - plain text message
    Indata : File_Type;

    Length : Natural := 1; size of the encrypted message
    J : Integer := 0; midpoint for odd and even strings
    K : Integer := 2; for the encrypted string

    begin -- Assingment_4

    the proper text file and read the code into the string
    CodedText

    (
    File =Indata,
    Mode =In_File,
    Name ="test.txt");

    while not EFile(File =Indata) loop

    Get(
    File =Indata,
    Item =Codedtext (Length));
    Length := Length + 1;

    end loop;

    the length to account for odd or even string lengths

    if Length REM 2 = 0 then
    J := 0;
    else
    J := 1;
    end if;

    the first charcter of the coded message into the decoded
    one

    if Length 1 then
    Plaintext(1) := Codedtext(1);
    end if;

    every character of the encoded string up to the halfway
    point
    every odd position in the decoded one

    for I in 2(Length - 1) loop

    if I REM 2 = 0 then
    Plaintext(I + 1) := Codedtext(K);
    K := K + 1;
    else
    null;
    end if;

    end loop;

    K := 1;

    every character of the encoded string past the halfway
    point
    every even position in the decoded one

    for I in 2(Length - 1) loop

    if I REM 2 = 0 then
    Plaintext(I) := Codedtext((Length/2) + J + K);
    K := K + 1;
    else
    null;
    end if;

    end loop;

    In both loops you are placing characters only into
    even positions in Plaintext. What about the odd positions?

    It also appears that you can do all the work in a single loop,
    cutting the time in half during which you traverse the strings.

    First_Half_Index : Positive := 1;
    Second_Half_Index : Positive := 2;

    for Code_Index in Codetext'Length loop
    if Code_Index <= Codetext'Length / 2 then
    Plaintext(First_Half_index) := Codetext(Code_Index);
    First_Half_Index := First_Half_Index + 2;
    else
    Plaintext(Second_Half_Index) := Codetext(Code_Index);
    Second_Half_Index := Second_Half_Index + 2;
    end if;
    end loop;

    I am not sure how the encryption deals with odd sized strings.
    Does the First Half or the Second Half get the extra character?
    Adjust the algorithm above accordingly.

    Jim Rogers

  • No.2 | | 897 bytes | |

    isaac2004 wrote:

    Length : Natural := 1; size of the encrypted message
    J : Integer := 0; midpoint for odd and even strings
    K : Integer := 2; for the encrypted string

    What does it mean for Length to be zero, J to be < 0, or K < 1? It seems Length
    and K should be Positive, and J, Natural.

    while not EFile(File =Indata) loop

    Get(
    File =Indata,
    Item =Codedtext (Length));
    Length := Length + 1;

    end loop;

    Now Length is the # of characters read + 1.

    the length to account for odd or even string lengths

    if Length REM 2 = 0 then
    J := 0;
    else
    J := 1;
    end if;

    J := Length rem 2;

    Do you really want to base this on the length of the input string, which is
    Length - 1?

    for I in 1(Length - 1) loop

    Put(Item =Plaintext (I));

    end loop;

    Put (Item =Plaintext (1 Length - 1) );
  • No.3 | | 1099 bytes | |

    First_Half_Index : Positive := 1;
    Second_Half_Index : Positive := 2;


    >for Code_Index in Codetext'Length loop

    if Code_Index <= Codetext'Length / 2 then
    Plaintext(First_Half_index) := Codetext(Code_Index);
    First_Half_Index := First_Half_Index + 2;
    else
    Plaintext(Second_Half_Index) := Codetext(Code_Index);
    Second_Half_Index := Second_Half_Index + 2;
    end if;
    >end loop;


    this code confuses me
    what is Code_Index and Codetext'Length

    >Your two examples above do not agree.
    >Following the encrypted example, Mother would encrypt to
    >Mteohr. I suspect that may have been a slip of the fingers during
    >typing, but it does add confusion to your requirements.


    that is my mistake it is really Mteohr

    >Now Length is the # of characters read + 1.

    the reason for doing that is to loop through the string and reading all
    char to length.

    thanks for the help guys

  • No.4 | | 1034 bytes | |

    "isaac2004" <isaac_2004@yahoo.comwrites:

    You could put in some debugging code:

    Codedtext : Message; - string of coded text
    Plaintext : Message; - plain text message

    Give some initial values to the strings:
    Codedtext : Message := ('1','2','3','4','5','6','7',others =' ');
    Plaintext : Message := ('1','2','3','4','5','6','7',others =' ');

    Then, in the loops,
    change the relevant position in the input string to 'U' (like "used") and
    display the strings in the loops, like:

    for I in 2(Length - 1) loop

    if I REM 2 = 0 then
    Plaintext(I + 1) := Codedtext(K);

    Codedtext (K) := 'U';

    K := K + 1;
    else
    null;
    end if;

    Ada.Text_IPut_Line ("every odd: " & Plaintext (1Length-1) & "|"
    & Codedtext (1Length-1));

    and similar code for the "even" loop

    Good luck!
  • No.5 | | 591 bytes | |

    isaac2004 wrote:

    an example is this
    Mother would be Mtoehr encrypted

    How about a little rearrangement and some functional
    decomposition (if you can afford to be a little wasteful
    in the first draft):

    procedure encrypt (s: Message) is

    type Confusion is array(Positive range s'Range) of Positive;

    function permute(s: Message) return Confusion;

    new_idx: constant Confusion := permute(s);

    begin
    for k in s'Range loop
    <copy characters to their new positions via `new_idx`>
    end loop;
    end encrypt;
  • No.6 | | 1006 bytes | |

    isaac2004 wrote:

    First_Half_Index : Positive := 1;
    Second_Half_Index : Positive := 2;
    >
    >
    >>for Code_Index in Codetext'Length loop

    if Code_Index <= Codetext'Length / 2 then
    Plaintext(First_Half_index) := Codetext(Code_Index);
    >First_Half_Index := First_Half_Index + 2;
    >else
    >Plaintext(Second_Half_Index) := Codetext(Code_Index);
    >Second_Half_Index := Second_Half_Index + 2;
    >end if;
    >>end loop;

    >

    this code confuses me
    what is Code_Index and Codetext'Length

    Code_Index is a variable declared as part of for loop. C99 can do that as
    well - finally ;-) . See:

    #for_loop

    Codetext'Length is the length of the array - mind you I would have used
    Codetext'Range - which is range of valid indices for Codetext. See:

    'Length
    'Range

    Martin
  • No.7 | | 521 bytes | |

    >You could put in some debugging code:
    the thing is that i know what is wrong with the code but i cant figure
    out the algorithm

    >Code_Index is a variable declared as part of for loop. C99 can do that as

    well - finally ;-)

    so Code_index would be like this

    for Code_Index in Count loop

    bla bla ;
    end loop;

    Codetext'Length is just a variable for length and codetext'range is one
    for max index
    im kinda confused

  • No.8 | | 894 bytes | |

    isaac2004 wrote:

    >>for Code_Index in Codetext'Length loop

    >

    this code confuses me
    what is Code_Index and Codetext'Length

    Code_Index is the index variable for the for loop. You've done the same thing in
    your code, where you called it I. The problem is that this for loop has an
    error; "for I in 7 loop" is not a valid for loop. The writer probably meant
    Codetext'range.

    If you aren't familiar with the array attributes 'First, 'Last, 'Length, and
    'range, then you really need to spend some time with your textbook. If they're
    not described and used there, spend some time here:

    Attributes are an important part of the language, and you don't really know Ada
    if you're not familiar and comfortable with the common ones.
  • No.9 | | 783 bytes | |

    isaac2004 wrote:
    >You could put in some debugging code:

    the thing is that i know what is wrong with the code but i cant figure
    out the algorithm
    >
    >Code_Index is a variable declared as part of for loop. C99 can do that as

    well - finally ;-)

    so Code_index would be like this

    for Code_Index in Count loop

    bla bla ;
    end loop;

    Codetext'Length is just a variable for length and codetext'range is one
    for max index
    im kinda confused

    Codetext'Length is the length of the Codetext array. It is the number
    of elements
    in the array.

    Codetext'range is the range of index values for the array Codetext.

    Jim Rogers

  • No.10 | | 186 bytes | |

    Well I quickly put a description together for you:
    #Array_Attributes
    do follow some of the links - especialy the one about loops on arrays.
    Martin

Re: help with string splitting


max 4000 letters.
Your nickname that display:
In order to stop the spam: 5 + 4 =
QUESTION ON "Programming"

EMSDN.COM