View Full Version : [c] programa - cifrar/decifrar


Ruanes
23-07-2008, 19:23
oi
estou a ter uns problems com um programa.

A parte do programa em que estou a ter problemas é na parte em que o usuario escreve uma frase e depois o programa vai ler a frase caracter a caracter e comparar cada um deles com cada caracter de um vector e se for igual troca esse caracter por outro que está noutra tabela.

Isto funciona muito bem quando é a cifrar mas a decifrar já é outra historia.(não aparece nada).

aqui está o codigo:


#include
<stdio.h>
#include

<my_biblio.h>
#include

<stdlib.h>
#define

SINAL '-'
int

main (int argc ,char *argv[])
{
char code[256];//guarda o codigo
char ncode[256];//guarda a lista
int i,j;//contador
char ch;//Caractere que vai guardar a opção
char txt[500];//Guarda o texto a ser cifrado/decifrado
//Preenchimento da lista
for (i=0;i<256;i++)
ncode[i]=(char)i;
//Preenchimento do codigo
for (i=255,j=0;i>=0;i--,j++)
code[j]=(char)i;
ncode[0]=code[0]=0;
//Teste aos parametros
switch(argc)
{
//Caso apenas exista um parametro
case 1:
//Pergunta ao usuario se pretende cifrar ou decifrar texto
puts(

"Cifrar(c) ou Decifrar(d)");
//Guarda a opção do usuario
ch=getchar();
//Se a opção nao for c nem d entao...
if (chicmp(ch,'c')==0 && chicmp(ch,'d')==0)
{
printf("Opcao errada\n\n");
system("pause");
exit (1);
}
system("cls");
if (chicmp(ch,'c')!=0)
printf("Cifrar\n\n");
else
printf(

"Decifrar\n\n");
puts ("Escreve a frase que queres ");
if (chicmp(ch,'c')!=0)
printf("cifrar\n");
else
printf(

"decifrar\n");
gets(txt);

puts("\n\n");
if (chicmp(ch,'c')!=0)
for (i=0;txt[i]!='\0';i++)
for (j=0;j<=255;j++)
if (txt[i]==ncode[j])
putchar(code[j]);
elseif (chicmp(ch,'d')!=0)
for (i=0;txt[i]!='\0';i++)
for (j=0;j<=255;j++)
if (txt[i]==code[j])
putchar(ncode[j]);
puts("\n\n\n\nCompleto\n\n");
break;
case 2:
if (argv[1][0]!=SINAL)
{
puts("Sinal invalido");
exit(1);
}
if (chicmp(argv[1][1],'c')==0 && chicmp(argv[1][1],'d')==0)
{
printf("Opcao errada\n\n");
system("pause");
exit (1);
}
system("cls");
if (chicmp(argv[1][1],'c')!=0)
printf("Cifrar\n\n");
else
printf(

"Decifrar\n\n");
puts ("Escreve a frase que queres ");
if (chicmp(argv[1][1],'c')!=0)
printf("cifrar\n");
else
printf(

"decifrar\n");
gets(txt);

puts("\n\n");
if (chicmp(argv[1][1],'c')!=0)
for (i=0;txt[i]!='\0';i++)
for (j=0;j<=255;j++)
if (txt[i]==ncode[j])
putchar(code[j]);
else
for (i=0;txt[i]!='\0';i++)
for (j=0;j<=255;j++)
if (txt[i]==code[j])
putchar(ncode[j]);
puts("\n\n\n\nCompleto\n\n");
break;
default:
puts("ERRO");
exit(2);
}
system("pause");
}

esteves
24-07-2008, 21:16
pequenos erros de código sem olhar para o funcionamento.

-isto da sempre falso:

if (chicmp(ch,'c')==0 && chicmp(ch,'d')==0)
{
printf("Opcao errada\n\n");
system("pause");
exit (1);
}


deves por :
if ((chicmp(ch,'c')==0) ||( chicmp(ch,'d')==0))

passas de ´e´ para 'ou'.


noutra parte do codigo ...

nao percebo para que é isto?? (gostava que explicasses 'code[j]=(char)i')


for (i=255,j=0;i>=0;i--,j++)
code[j]=(char)i;

o for so trabalha nesta linha faltam as { } para afectar a linha seguinte(acho que tens essa intensao)

for (i=255,j=0;i>=0;i--,j++)
{
code[j]=(char)i;
ncode[0]=code[0]=0;
}

so ao olhar para isto recomendo que olhes uma segunda vez para tentares reparar pequenos erros como estes (nao olhei para o resto do codigo... ... ...)

sergio.gomes
24-07-2008, 22:24
O for funciona sem os {}'s, tipo

for(...)
instrucao;Mas é boa prática ter as chavetas pois visualmente tem-se logo a noção de "hey, aqui está a instrucao/bloco de instrucoes do for"

for(...) {
instrucao;
}

//ou, mais compacto

for(...) { instrucao; }
Alem de evitar erros classicos (mas tantas vezes dificeis de topar...)
for(...)
instr1;
instr2;
instr3;quando se queria
for(...) {
instr1;
instr2;
instr3;
}por isso também recomendo que coloques aí umas chavetas, se for essa a intenção ;)

Ruanes
25-07-2008, 13:25
noutra parte do codigo ...

nao percebo para que é isto?? (gostava que explicasses 'code[j]=(char)i')


for (i=255,j=0;i>=0;i--,j++)
code[j]=(char)i;

é para preencher o vector com os caracteres da tabela ascii, mas ao contrario (não sei se é assim mas á primeira foi o que me ocorreu).

o for so trabalha nesta linha faltam as { } para afectar a linha seguinte(acho que tens essa intensao)

for (i=255,j=0;i>=0;i--,j++)
{
code[j]=(char)i;
ncode[0]=code[0]=0;
}

so ao olhar para isto recomendo que olhes uma segunda vez para tentares reparar pequenos erros como estes (nao olhei para o resto do codigo... ... ...)
não, é mesmo minha intenção fazer isso.

Depois de preencher os dois vectores altero a primeira posição para 0. (Mudei isto quando comecei a ter erros no programa. Pensei que fosse porque 0 na tabela ascii corresponde a '\0')

esteves
25-07-2008, 20:58
O for funciona sem os {}'s, tipo

for(...)
instrucao;Mas é boa prática ter as chavetas pois visualmente tem-se logo a noção de "hey, aqui está a instrucao/bloco de instrucoes do for"

for(...) {
instrucao;
}

//ou, mais compacto

for(...) { instrucao; }
Alem de evitar erros classicos (mas tantas vezes dificeis de topar...)
for(...)
instr1;
instr2;
instr3;quando se queria
for(...) {
instr1;
instr2;
instr3;
}por isso também recomendo que coloques aí umas chavetas, se for essa a intenção ;)



eu referia-me a intenção de ele quer por duas instruções no "for" i para isso tem de usar chavetas... porque se nao so afecta a primeira instrução... era isso que eu queria dizer;

Goncalo Silva
27-07-2008, 04:12
Pessoalmente não uso as {} quando o scope do ciclo/condição engloba apenas uma instrução. Embora eu saiba que é uma melhor prática de programação, penso que torna o código um pouco mais "chato" de ler..

Ontopic: Conseguiste resolver o problema?