Caesarova šifra, malá rada – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Caesarova šifra, malá rada – C / C++ – Fórum – Programujte.comCaesarova šifra, malá rada – C / C++ – Fórum – Programujte.com

 

gruv0
Duch
15. 5. 2013   #1
-
0
-

Zdravím všechny programátory :)

Dělám program, caesarovu šifru. Na vstupu člověk napíše slovo nebo větu, zadá šifru (dvě čísla od 1 do 9) a ny výstupu vyleze změněný text. Program mám skoro hotový, všechno ošetřené, ale pořád nemůžu vymyslet jednu věc.

př. slovo : kolik
 šifra : 12

výsledek : lqmkl

Můj prvotní program posunul celé slovo o 12 písmen. Teď ovšem netuším jak udělat, aby se šifrování střídalo. Lichá písmena prvním číslem, sudá druhým. Dělal jsem to přes cyklus foreach a char ve větě, ale vůbec netuším a ani se mi nepovedlo nikde najít tak to udělat "na střídačku". Respektive nevím, jestli se u foreach dá nějak logicky udělat foreach + 2, aby to šifrovalo jen každé druhé písmeno. Prostě si u tohohle nevím rady a ve škole jsme se to ještě neučili.

Každou radu moc ocením, díky všem za přečtení :)

Ondřej.

Nahlásit jako SPAM
IP: 195.113.176.–
KIIV
~ Moderátor
+43
God of flame
15. 5. 2013   #2
-
+1
-
Zajímavé

co stridat index v poli tech posunu... forech pro kazdy prvek a z venku jeste pocitadlo, jestli ses na lichym ci sudym...

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
gruv0
Duch
15. 5. 2013   #3
-
0
-

Nejsem si úplně 100% jistý jak to myslíš, respektive jak by to mělo vypadat potom v kódu.

Nahlásit jako SPAM
IP: 213.226.252.–
KIIV
~ Moderátor
+43
God of flame
15. 5. 2013   #4
-
0
-

   

int pozice = 0;
for ( ... ) {
  if ((++pozice) & 1) { // liche
    // ...
  } else { // sude
    // ... 
  }
}


maximalne prihodit preskakovani mezer (pokud je mezera, nepricitat k pozici)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
gruv0
Duch
15. 5. 2013   #5
-
0
-

Asi jsem pořád trochu ztracen, jak zjistím pořadí písmene ve slově ?

Nahlásit jako SPAM
IP: 213.226.252.–
15. 5. 2013   #6
-
0
-

jestli slovo uložíš způsobem 

char slovo [128];

tak z indexu

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
15. 5. 2013   #7
-
0
-

#5 gruv
tak co tedy mas?   pokud je to mezera, tak muzes pozici nulovat... pokud neni tak pricitat...

uz si uminoval ze mas foreach pres cely retezec tak proste trosku fantazie - premejslej jak bys to musel zpracovavat ty, kdybys umel jen zakladni operace, pamatoval si jen to, co mas ulozeny a mohl si to upravovat, a videl jen aktualni pismeno.. :D

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
gruv0
Duch
15. 5. 2013   #8
-
0
-

#7 KIIV

fantazii se snažím použít už přes týden, ale vždycky něco zkusím a ve výsledku to stejně nefunguje nebo spíš nevím jak to provést. Programování se neučím dlouho, takže tolik metod nebo syntaxí zase neznám. Přišlo mi, že by to jednoduše šlo přes foreach, jenže teď mám problém s tím, že to projede úplně všechny písmena a nevím jak to změnit, aby třeba něco vynechal (např lichá písmena) a v dalším řetězci foreach bych zase vynechal ty druhá. Prostě si s tímhle nevím rady.

 A krom ošetření erorů mám zatím jen tohle...

string slovo = txbSlovo.Text;
int šifraLiche = Convert.ToInt32(txbŠifra1.Text);
int šifraSude = Convert.ToInt32(txbŠifra2.Text);
 txbVysledek.Text = null;
            char[] věta = slovo.ToCharArray();


                foreach (char pismeno in věta)
                {
                    if (pismeno >= 'A' && pismeno <= 'Z')
                    {
                        if ((pismeno + šifraLiche) > 'Z')
                        {
                            txbVysledek.Text += Convert.ToChar((pismeno + šifraLiche) - 26).ToString();
                        }
                        else
                        {
                            txbVysledek.Text += Convert.ToChar(pismeno + šifraLiche).ToString();
                        }
                    }
                    if (pismeno >= 'a' && pismeno <= 'z')
                    {
                        if ((pismeno + šifraLiche) > 'z')
                        {
                            txbVysledek.Text += Convert.ToChar((pismeno + šifraLiche) - 26).ToString();
                        }
                        else
                        {
                            txbVysledek.Text += Convert.ToChar(pismeno + šifraLiche).ToString();
                        }
                    }
                }
            }
Nahlásit jako SPAM
IP: 213.226.252.–
Doomista+1
Stálý člen
15. 5. 2013   #9
-
0
-

   

char veta[1024];
//nacteni dat do vety\\
...

int s, s2;
cin >> s; //ulozeni sifry
s2=s-int(s/10);
s/=10;
int len=strlen(veta);
	for(int a=0; a<len; a+=2){
		if(veta[a]!=32)
		veta[a]+=s;
		if(veta[a+1]!=32)
		veta[a+1]=s2;
	}

nestačilo by toto jako řešení? popř fixovat ještě rozsah malé a velké latinky.

Nahlásit jako SPAM
IP: 90.176.176.–
Na vše stačí iostream...
robo
~ Anonymní uživatel
82 příspěvků
15. 5. 2013   #10
-
0
-

stačí obyčajné modulu 2

Nahlásit jako SPAM
IP: 147.175.179.–
gruv0
Duch
17. 5. 2013   #11
-
0
-

   

Díky všem za rady, celý jsem to překopal, udělal jako cyklus pro sudá písmena, od nuly a v půlce cyklu přičtu 1 a zašifrují se i lichá    a kromě mezery, se kterou mám stále problémy mi to jede jako hodinky 

Nahlásit jako SPAM
IP: 213.226.252.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 76 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý