Šifrovací program – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Šifrovací program – C / C++ – Fórum – Programujte.comŠifrovací program – C / C++ – Fórum – Programujte.com

 

Tiny
~ Anonymní uživatel
6 příspěvků
13. 12. 2011   #1
-
0
-

Zdravím, řešil jsem projekt na šifrování pomocí záměny znaků, snažil jsem na to jít přes pole. V jednom poli byla seřazena abeceda a v druhém na odpovídajícím indexu zaměněný znak. Jenže jsem zjistil, že zadaní znělo:
Program bude provádět šifrování vstupního souboru pomocí tabulky uložené v jiném souboru. Vstupy: Program dostane na svůj vstup soubor s textem, který má zašifrovat a soubor s kódy, podle kterých bude provádět šifrování.
Příklad tabulky kódů
A;0
B;1
C;2
D;3.
Nemám už moc času a vážne nevím co s tím. Najde se někdo ochotný pomoct?

Nahlásit jako SPAM
IP: 213.155.255.–
yaqwsx+9
Posthunter
13. 12. 2011   #2
-
0
-

Pokud máš již šifrování přes tabulku v poli, tak máš půlku hotovou. Zbývá ti jenom na začátku programu tuto tabulku (pole) naplnit daty ze souboru. Na tom není nic těžkého...

Nahlásit jako SPAM
IP: 85.160.105.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Tiny
~ Anonymní uživatel
6 příspěvků
13. 12. 2011   #3
-
0
-

#2 yaqwsx
Začal jsem to řešit, ale k funkčnosti jsem to stejně nedoved. Zkoušel jsem to přes pomocí reference a dereference, ale bylo to na mě příliš velké sousto. Nějaké návrhy jak to řešit jinak?

Nahlásit jako SPAM
IP: 213.155.255.–
yaqwsx+9
Posthunter
13. 12. 2011   #4
-
0
-

#3 Tiny
Huh? Nevím, o co jsi se pokoušel - pošli kód, který nefunguje + definici tvého šifrovacího pole.

Nahlásit jako SPAM
IP: 85.160.105.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Tiny
~ Anonymní uživatel
6 příspěvků
13. 12. 2011   #5
-
0
-

   

#include <iostream>
#include <stdio.h>
 
using namespace std;
 
const char* input_file = "F:/input.txt";
 
//const char* pole1 = "abcdefghijklmnopqrstuvwxyz";
 
char* pole1 = "ahoj";
 
char * pole2 = "abcd";
//const char* pole2 = "angiuanjanfaoiefnaisnfekua";
 
void main()
{
 
    FILE *file;   
    file = fopen(input_file,"r");
    if (file == NULL){
        printf("NENASEL SEM SOUBOR PANE REDITELI! %s \n",input_file);
        return;
    }
 
    char input_char;
 
    while(fscanf(file,"%c",&input_char) != EOF)
    {
        char * pole_help = "";
        pole_help = pole1;
 
        while(*pole_help != '\0')
        {
            if(*pole_help == input_char)
            {
                
                char * vymeneny_znak = pole2; // tady nevím co s tím :)
 
                printf("%c => %c\n",*pole_help,*vymeneny_znak);
            }
            //printf("%c\n",input_char);
 
            *pole_help++;
        }
    }
 
 
 
 
    getchar();
}
Nahlásit jako SPAM
IP: 213.155.255.–
Tiny
~ Anonymní uživatel
6 příspěvků
13. 12. 2011   #6
-
0
-

Vím, že tenhle řádek je hloupost. Co ale nevím je, jak vyměnit znaky na stejném indexu pole.

Nahlásit jako SPAM
IP: 213.155.255.–
Tiny
~ Anonymní uživatel
6 příspěvků
13. 12. 2011   #7
-
0
-

*řádek char * vymeneny_znak = pole2;

Nahlásit jako SPAM
IP: 213.155.255.–
yaqwsx+9
Posthunter
13. 12. 2011   #8
-
0
-

   

char * pole_help = "";
pole_help = pole1;

Pole (tudíž i řetězec) je v C/C++ reprezentováno jako ukazatel na první prvek pole. Z toho plyne, že pole (řetězce) se nedají jednoduše přiřazovat pomocí =. Tím pouze přiřadíš jednomu ukazateli hodnotu toho druhého, ale nic nezkopíruješ. Mrkni na funkci strcpy a vůbec zvaž, jestli je všechno toto přiřazování nutné.

Konstrukce 

while(*pole_help != '\0')

je trochu zvláštní, ale fungovat bude. Jen je potřeba inkremetnovat ukzatel, ne data, na která ukazuje - tudíž *pole_help++; nahraď pole_help++;

Dále jsem to nějak podrobněji nezkoumal - toto jsou chyby, které mě jako první udeřily do očí. Celkově tam zbytečně používáš moc ukazatelů (a odtud pramení všechny chyby). Doporučuju si ještě jednou v hlavě ujasnit, co to ukazatel je, jak funguje a jaké se s ním dají provádět operace.

Trochu mě ještě jen zaráží, proč includujš iostream, když z něj stejně nic nepoužíváš (dokonce to píšeš v C, nikoliv C++). Navíc ani nepoužíváš nic z jmenného prostoru std - řádek using namespace std je tudíž zbytečný. Nevím jaké je zadání, ale pokud nejsi limitovaný C a můžeš použít C++, tak bych neváhal použít třídu string (popř. i třídy fstream apod). Tím by sis ušetřil hodně trápení.

Nahlásit jako SPAM
IP: 85.160.105.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Tiny
~ Anonymní uživatel
6 příspěvků
13. 12. 2011   #9
-
0
-

Díky za radu. Zkusím to udělat trochu jinak. Ale k funkčnosti jsem to dotáhl, stačí jen vyměnít 

char * vymeneny_znak = pole2;

za 

char *vymeneny_znak = pole2 - (pole1 - pole_help);

Kdyby se to někomu hodilo.

Nahlásit jako SPAM
IP: 213.155.255.–
zlz
~ Anonymní uživatel
634 příspěvků
13. 12. 2011   #10
-
0
-

   

char znak, *p;
while (fscanf(file, "%c", &znak) == 1)
{
    if ((p = strchr(pole1, znak)) != NULL)
        znak = pole2[p - pole1];
    printf("%c", znak);
}
Nahlásit jako SPAM
IP: 213.211.51.–
m4r10
~ Anonymní uživatel
83 příspěvků
15. 12. 2011   #11
-
0
-
Nahlásit jako SPAM
IP: 85.71.208.–
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, 28 hostů

Podobná vlákna

šifrovací program ? — založil TonyB

Šifrovací program — založil Tase

C# program — založil Tomas.P

Program — založil Jan Burant

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ý