Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
RooBoo
Člen
Avatar
RooBoo:21.3.2014 19:37

Ahojte mam taký problém ... mám program ktorý by mal zakódovať správu ktorá bude vložená do textboxu .. a v druhom textboxe bude vypísaná. Napr .. napíšem ahoj a zakódovaný text bude 101123352214.... a to iste by malo spraviť aj opačne ak zadám tieto čísla má mi vypísať text .. mam v programe 2x Button jedno na zakódovanie a druhe pre odkódovanie.. môj program funguje len na 50% ... ak zadám slovo .. zakóduje ho .. no opačne sa nič nedeje .. je to nezmyselný program .. robím ho skôr od nudy a zdokonaľovanie sa v programovaný .. prikladám zdrojové kódy .. ak je kód zlý ..chybný .. prosím vyjadrite sa
Hlavný program:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace EnCrypt
{
    /// <summary>
    /// Interakční logika pro MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

        }
        Encrypt Encrypt = new Encrypt();      // Vytvori instanciu triedy Encrypt
        Decrypt Decrypt = new Decrypt();      // Vytvori instanciu triedy Decrypt
        private void btn_Click(object sender, RoutedEventArgs e)   // tlacidlo EnCrypt
        {

            Encrypt.code(Input.Text);            //Zakoduje vetu pomocou metody code na triede Encrypt
            output.Text = Encrypt.GetSentence().ToString(); // Vypise zakodovanu vetu na textbox output



        }

        private void del_Click(object sender, RoutedEventArgs e)
        {
            Input.Text = "";
            output.Text = "";
        }

        private void btnD_Click(object sender, RoutedEventArgs e)//Tlacidlo DeCrypt
        {

            Decrypt.decode(int.Parse(Input.Text.ToString())); // Odkoduje vetu  pomocou metody decode na triede Decrypt
            output.Text = Decrypt.getFinal();    // Vypise odkodovanu vetu na textboxe output

        }

    }
}

Trieda Encrypt

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;

namespace EnCrypt
{
    class Encrypt
    {
        List<int> crypt = new List<int>();    // list pre text v ciselnej podobe
        public void code(string sentence)  // metoda na zakodovanie textu
        {
            foreach (char a in sentence)   // prejde znaky v textboxe input
            {
                crypt.Add(getNum(a));         // prida do listu znak v ciselnej podobe
            }

        }
        private int getNum(char c)
        {
            int num=0;

            switch (c)
            {
                case 'a':
                    {
                        num = 101;
                        break;
                    }



                case 'b':
                    {
                        num = 102;
                        break;
                    }
                .
                .
                .
            atd pre skratenie kodu vynecham
}
            return num;



        }        //Vrati znak v ciselnej podobe

        public string GetSentence()          //Vrati v stringu zakodovanu vetu
        {
            string s = "";
            foreach (int i in crypt)
            {
                s +=  i;
            }
            crypt.Clear();
            return s;



        }
    }
}

Trieda Decrypt

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;

namespace EnCrypt
{
    class Decrypt
    {
        List<int> List_a = new List<int>();
        List<string> List_b = new List<string>();
        int s;
        public void decode(int sentence) // Metoda na odkodovanie textu
        {
            foreach (char c in sentence.ToString())  // prejde vsetky  znaky vo vete
            {

                List_a.Add(int.Parse(c.ToString())); // prida znak do listu_a
                if (List_a.Count == 3)    // ak dlzka pola =3 (kazde pismeno predstavuje 3 cisla)
                {
                    foreach (int i in List_a)   // prejde vsetky cisla z Listu_a
                    {
                        s += i;                //do premennej s prida cislo i
                    }
                    List_b.Add(getChar(s));     // do List_b prida vrateny znak ktory pripada cislu s
                    List_a.Clear();



                }
                else
                {
                }


            }
         }
        private string getChar(int i)
        {
            string c= "";

            switch (i)
            {
                case 101:
                    {
                        c = "a";
                        break;
                    }
                   .
                   .
                   .
              atd pre skratenie kodu vynecham

            }
            return c;



        } // Vrati znak ktory pripada cislu i

        public string getFinal()       // Vrati v stringu rozsifrovanu spravu
        {
            return string.Join("", List_b);  // spoji do stringu  List_b
        }

    }
}
 
Odpovědět
21.3.2014 19:37
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:21.3.2014 20:57

Jen se zeptám, jestli máš opravdu 26 case v tom každém switchi ?

 
Nahoru Odpovědět
21.3.2014 20:57
Avatar
RooBoo
Člen
Avatar
 
Nahoru Odpovědět
21.3.2014 21:13
Avatar
Odpovídá na RooBoo
Neaktivní uživatel:21.3.2014 21:14

Místo toho použij pole nebo kolekce.

Nahoru Odpovědět
21.3.2014 21:14
Neaktivní uživatelský účet
Avatar
RooBoo
Člen
Avatar
Odpovídá na Neaktivní uživatel
RooBoo:21.3.2014 21:18

A vyrieši to môj problém ?

 
Nahoru Odpovědět
21.3.2014 21:18
Avatar
Odpovídá na RooBoo
Neaktivní uživatel:21.3.2014 21:32

To sice ne, ale každopádně to vyřeší čitelnost kódu.

Nahoru Odpovědět
21.3.2014 21:32
Neaktivní uživatelský účet
Avatar
Odpovídá na RooBoo
Neaktivní uživatel:21.3.2014 21:51

No jedno zásadní zjednodušení - víš že char se dá konvertovat do integeru a obráceně, takže by ses mohl zbavit toho switche?

char letter = 'a';
int letter_ascii = (int)letter; // = 97
Nahoru Odpovědět
21.3.2014 21:51
Neaktivní uživatelský účet
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Jan Vargovský:21.3.2014 21:52
internal static class Program
{
    [STAThread]
    private static void Main(string[] args)
    {
        var input = "abcd";
        var b = input.Encrypt();
        var c = b.Decrypt();
        Console.WriteLine(input == c);
    }

    private static string Encrypt(this string input)
    {
        StringBuilder sb = new StringBuilder();
        int shift = 100 - (int)'a';

        foreach (char c in input)
            sb.Append( ((int)c + shift));

        return sb.ToString();
    }

    private static string Decrypt(this string input)
    {
        StringBuilder sb = new StringBuilder();
        int shift = 100 - (int)'a';

        for (int i = 0; i < input.Length; i += 3)
            sb.Append( (char) (int.Parse(input.Substring(i, 3)) - shift));

        return sb.ToString();
    }
}
Editováno 21.3.2014 21:54
 
Nahoru Odpovědět
21.3.2014 21:52
Avatar
RooBoo
Člen
Avatar
Odpovídá na Jan Vargovský
RooBoo:21.3.2014 21:56

to je na mňa dosť zložité ..

 
Nahoru Odpovědět
21.3.2014 21:56
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na RooBoo
Jan Vargovský:21.3.2014 22:11

Mi přijde složité to tvoje, když tam máš zbytečně x kolekcí a x dalších metod.

 
Nahoru Odpovědět
21.3.2014 22:11
Avatar
RooBoo
Člen
Avatar
Odpovídá na Jan Vargovský
RooBoo:22.3.2014 10:03

Ako ja nehovorím že ten môj kód je správny... len hovorím že ten čo si mi písal ty.. je pre mňa zložitý keby si v skratke ho popísal že čo a jak .. čo je lepšie nahradiť čím bol by som Ti vďačný

 
Nahoru Odpovědět
22.3.2014 10:03
Avatar
Odpovídá na RooBoo
Neaktivní uživatel:22.3.2014 10:25
internal static class Program
 {
     [STAThread]
     private static void Main(string[] args)
     {
         var input = "abcd";      // hodnota, kterou vložil uživatel
         var b = input.Encrypt(); // do proměnné b zašifruje hodnotu
         var c = b.Decrypt();     // do proměnné c rozšifruje b
         // porovná, zda se původní hodnota shoduje se zašifrovanou a
         // následně rozšifrovanou hodnotou
         Console.WriteLine(input == c);
     }

     private static string Encrypt(this string input)
     {
         // StringBuilder je v podstatě skoro string, používá se, pokud bys ve
         // stringu dělal hodně změn a nepotřeboval bys používat metody jako
         // indexof a starswith (podle msdn se neplýtvá tolik výkonem a pamětí)
         StringBuilder sb = new StringBuilder();
         // hodnota, kterou budeme odečítat od ascii hodnoty čísla,
         //  aby nám to dávalo čísla od 100 po x
         int shift = 100 - (int)'a';

         // projdou se všechny znaky v inputu
         foreach (char c in input)
             // do StringBuilderu nacpeme ascii hodnotu znaku
             // a odečteme od něj shift, jak jsem zmínil výše
             sb.Append( ((int)c + shift));

         // vrátí zašifrovaný string
         return sb.ToString();
     }

     private static string Decrypt(this string input)
     {
         StringBuilder sb = new StringBuilder();
         int shift = 100 - (int)'a';

         for (int i = 0; i < input.Length; i += 3)
             sb.Append( (char) (int.Parse(input.Substring(i, 3)) - shift));

         return sb.ToString();
     }
 }

Decrypt funguje stejně, jen se z čísla dělá opět char :)

Editováno 22.3.2014 10:28
Nahoru Odpovědět
22.3.2014 10:25
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.