Ir ao conteúdo
  • Cadastre-se

Ajuda com trabalho em C


Ir à solução Resolvido por Vitor Madalosso,

Posts recomendados

Pessoal, desculpa incomodar com esse tipo de coisa mas preciso de ajuda com um trabalho da faculdade, um programa C.
Já está QUASE no fim, só preciso ajustar uma coisa(que eu não faço ideia como fazer).
 
É um programa que lê uma string, tem opção de cifrar ou decifrar, e depois pede uma senha numérica. Cada número da senha corresponde o quanto cada letra da string tem que deslocar.

Ex:
String: Casa
Senha: 5045
String Cifrada: Hawf
C - deslocou 5, a - deslocou 0, s - deslocou 4, a - deslocou 5
 

Até aqui eu fiz, só que o problema vem agora...

 


Se a string for menor que a senha, devem ser utilizados somente os primeiros números da senha correspondentes ao tamanho da string. Se a string for maior que a senha, a senha deve ser repetida até completar o tamanho da string. (Não consigo fazer isso)
 
Outra coisa, a senha deve ser de no mínimo 4 e no máximo 6 digitos... Como eu faço pro programa não ler e pedir pra digitar a senha novamente caso o usuário digite uma senha de 3 digitos por exempo...
 

Se alguém puder me ajudar...

 

Aqui é o que eu já consegui fazer:

/* Faça um programa C que leia uma string e uma senha numérica de no mínimo 4 dígitos e no máximo 6.Aplique uma fórmula de criptografia baseada em deslocamento com a senha informada.Requisitos:• A criptografia deve funcionar somente em letras maiúsculas ou minúsculas;• Se a string for menor que a senha, devem ser utilizados somente os primeiros números da senhacorrespondentes ao tamanho da string;• Se a string for maior que a senha, a senha deve ser repetida até completar o tamanho da string;• Quando a letra Z for cifrada deve retornar à letra A;• Aplicar a fórmula tanto para cifrar quanto para decifrar. */#include<stdio.h>#include<conio.h>#include<string.h>main (){ int i, n; char s1[20], op[2], p[6], p2[2]; printf("Informe uma string:\n");   gets(s1); printf("Digite (c)ifrar ou (d)ecifrar:\n");   gets(op); printf("Informe uma senha numerica:(max 6 e min 4 digitos)\n");   gets(p); if(strcmp(op,"c")==0)   printf ("\nString Cifrada: "); if(strcmp(op,"d")==0)   printf("\nString Decifrada: ");   for(i=0; i<strlen(s1); i++)   if ((s1[i]>=65 && s1[i]<=90) || (s1[i]>=97 && s1[i]<=122))     if(strcmp(op,"c")==0)        {       p2[0]=p[i];       p2[1]='\0';       n=atoi(p2);       printf("%c", s1[i]+n);     }     else          {       p2[0]=p[i];       p2[1]='\0';       n=atoi(p2);       printf("%c", s1[i]-n);     }        getch();}
Link para o comentário
Compartilhar em outros sites

voce pode ler uma celula de cada vez quando for pegar a senha e contar

unsigned int count = 0;printf("Informe uma senha numerica:(max 6 e min 4 digitos)\n");    while ((p[count] = getchar()) != 10)        count = count + 1;

depois  pode tirar a diferença entre eles

int r = count - strlen(s1);

depois do loop(fora dele) voce pode testar o valor em r,que diz se houveram mais caracteres digitados pra senha do que pra string ,se houver entra no loop e le de novo os caracteres no array s1,alguma coisa como:

while(r > 0){ //faz alguma coisa aqui que estava fazendo dentro do loop à partir do começo de s1 de novo}

não é por nada não,mas seu código tambem ta com muito gargalo,e algumas coisas parecem desnecessarias..tenta colocar tudo que voce ja sabe que vai acontecer antes dos loops

Link para o comentário
Compartilhar em outros sites

  • Solução

voce pode ler uma celula de cada vez quando for pegar a senha e contar

unsigned int count = 0;printf("Informe uma senha numerica:(max 6 e min 4 digitos)\n");    while ((p[count] = getchar()) != 10)        count = count + 1;

depois  pode tirar a diferença entre eles

int r = count - strlen(s1);

depois do loop(fora dele) voce pode testar o valor em r,que diz se houveram mais caracteres digitados pra senha do que pra string ,se houver entra no loop e le de novo os caracteres no array s1,alguma coisa como:

while(r > 0){ //faz alguma coisa aqui que estava fazendo dentro do loop à partir do começo de s1 de novo}

não é por nada não,mas seu código tambem ta com muito gargalo,e algumas coisas parecem desnecessarias..tenta colocar tudo que voce ja sabe que vai acontecer antes dos loops

 

Muito obrigado pelas dicas atlos! Consegui finalizar o trabalho hoje, no dia da entrega :D

 

Ficou assim:

#include<stdio.h>#include<conio.h>#include<string.h>main (void){ int i, n; char s1[20], op[2], p[6], p2[2]; printf("Informe uma string: ");   gets(s1); printf("Digite (c) para Cifrar ou (d) para Decifrar: ");   gets(op); printf("Informe uma senha numerica (min 4 e max 6 digitos): ");   gets(p); if(strcmp(op,"c")==0)   printf ("\nString Cifrada: "); if(strcmp(op,"d")==0)   printf("\nString Decifrada: "); for(i=0; i<strlen(s1); i++)   if ((s1[i]>=65 && s1[i]<=90) || (s1[i]>=97 && s1[i]<=122))     if(strcmp(op,"c")==0){        if( i >= strlen(p) ){            p2[0] = p[i-strlen(p)];        } else {         p2[0]=p[i];        }       p2[1]='\0';       n=atoi(p2);       printf("%c", s1[i]+n);     }     else {        if( i >= strlen(p) ){            p2[0] = p[i-strlen(p)];        } else {         p2[0]=p[i];        }       p2[1]='\0';       n=atoi(p2);       printf("%c", s1[i]-n);     } getch();}

Abraço!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!