Diskuze: Prosim pomoc

C# .NET .NET (C# a Visual Basic) Prosim pomoc American English version English version

Avatar
RooBoo
Člen
Avatar
RooBoo:

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ý
Redaktor
Avatar
Jan Vargovský:

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
Filip Šohajek
Redaktor
Avatar
Odpovídá na RooBoo
Filip Šohajek:

Místo toho použij pole nebo kolekce.

 
Nahoru Odpovědět 21.3.2014 21:14
Avatar
RooBoo
Člen
Avatar
Odpovídá na Filip Šohajek
RooBoo:

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

 
Nahoru Odpovědět 21.3.2014 21:18
Avatar
Filip Šohajek
Redaktor
Avatar
Odpovídá na RooBoo
Filip Šohajek:

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

 
Nahoru Odpovědět 21.3.2014 21:32
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na RooBoo
Jiří Gracík:

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
Creating websites is awesome till you see the result in another browser ...
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Filip Šohajek
Jan Vargovský:
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:

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

 
Nahoru Odpovědět 21.3.2014 21:56
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na RooBoo
Jan Vargovský:

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:

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
Jiří Gracík
Redaktor
Avatar
Odpovídá na RooBoo
Jiří Gracík:
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
Creating websites is awesome till you see the result in another browser ...
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.