1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[c] programa - cifrar/decifrar

Discussão em 'Programação' iniciada por Ruanes, 23 de Julho de 2008. (Respostas: 5; Visualizações: 1774)

  1. Ruanes

    Ruanes Power Member

    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:
    Código:
    
    #include
    [LEFT]<stdio.h>
    [LEFT]#include[/LEFT]
    
    <my_biblio.h>
    [LEFT]#include[/LEFT]
    
    <stdlib.h>
    [LEFT]#define[/LEFT]
    
    SINAL '-'
    [LEFT]int[/LEFT]
    
    main (int argc ,char *argv[])
    [LEFT]{
    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([/LEFT]
    
    "Cifrar(c) ou Decifrar(d)");
    [LEFT]//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([/LEFT]
    
    "Decifrar\n\n");
    [LEFT]puts ("Escreve a frase que queres ");
    if (chicmp(ch,'c')!=0)
    printf("cifrar\n");
    else
    printf([/LEFT]
    
    "decifrar\n");
    [LEFT]gets(txt);[/LEFT]
     
    [LEFT]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([/LEFT]
    
    "Decifrar\n\n");
    [LEFT]puts ("Escreve a frase que queres ");
    if (chicmp(argv[1][1],'c')!=0)
    printf("cifrar\n");
    else
    printf([/LEFT]
    
    "decifrar\n");
    [LEFT]gets(txt);[/LEFT]
     
    [LEFT]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"); [/LEFT]
    }
    
    [/LEFT]
     
    Última edição pelo moderador: 23 de Julho de 2008
  2. esteves

    esteves Power Member

    pequenos erros de código sem olhar para o funcionamento.

    -isto da sempre falso:

    Código:
    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')


    Código:
     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)

    Código:
    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... ... ...)
     
    Última edição pelo moderador: 24 de Julho de 2008
  3. z80

    z80 Power Member

    O for funciona sem os {}'s, tipo

    Código:
    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"

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

    Ruanes Power Member

    é 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).
    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')
     
  5. esteves

    esteves Power Member



    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;
     
  6. Goncalo Silva

    Goncalo Silva Power Member

    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?
     

Partilhar esta Página