• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Gurzi

[Resolvido] [C] random char

7 mensagens neste tópico

Boas Malta

Ontem não tinha nada para fazer e para por em prática um dos poucos conhecimentos que tenho em Linguagem C , comecei a fazer apenas com funções, alguns switch/case , nada de complicado um programa com menus e com algumas paneleirisses :P

Tem o Nome de Kishiote Utilities   e está funcional mas ainda numa versão 0.00000000001 porque primeiro, não tem utilidade nenhuma (apenas serve para testar alguns conhecimentos) , depois porque nem tudo está como eu quero..

Vou testando as coisas e já descobri uns quantos erros.

A minha dúvida: : Quero gerar passwords com chars , tipo ele vai de A a Z e com 7 letras cria uma password com letras aleatórias(podem ser repetidas)

na minha mais perfeita idiotice criei isto :

void menustr()
{
  system("cls");
  titulo();
  printf("\n\t\t\t\t     @@STRINGS@@ \n");
  linha();
  printf("\n\n\t\t\t1 - Qual a Melhor Password\n");
  printf("\t\t\t2 - Criar uma Password\n");
  scanf("%d",&op);
  option_str(op);

}

void pw_rand(void)
{
int i=0;
while (i<7)
{
srand(time(NULL));
pw1[i]=  rand() % 27;
printf("%c",&pw1[i]);
i++;
}

o que não funciona  :)

já pensei que teria que ser pw1= (char) rand() % 27 ( 27 , visto que o abc tem 27 chars)

Bem vou deixar aqui por baixo o code todo, para verem o aspecto do bixo (mt básico , por isso não critiquem o nivél da bixana)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>


int op=0;
int valor=0;
int gerado=0;
char pw1[40];
char pw2[40];

void menumat(void);
void menudiv(void);
void menustr(void);
void linha(void);
void option_div(int);
void apostas(int);
void pw_rand(void);
void pw_compare(char *x,char *y);
void option(int );
void option_str(int);


int strlen(char *i)
{
  int j=0;
  for(j=0;i[j]!='\0';j++)
   return j;
}

void linha(void)
{
printf("\t\t--------------------------------------------------------\n\n");
}
void titulo(void)
{
  printf("\t\t------------------KISHIOTE UTILITIES ------------------\n");
}

void menup()
{
  system("cls");
  titulo();
  printf("\t\t|\t\t\t\t\t\t      |");
  printf("\n\t\t|\t\t1-Matematica                          |\n");
  printf("\t\t|\t\t2-Divertimento                        |\n");
  printf("\t\t|\t\t3-Funcoes de Strings                  |\n");
  printf("\t\t|\t\t4-Sair                                |\n");
  printf("\t\t|\t\t\t\t\t\t      | \n");
  printf("\t\t-------------------------------------------------------\n");
  printf("\t\t\tIntroduza a opcao que pretende(1/2/3) :\n\n\t\t\t\t\t ");
scanf("%d",&op);
option(op);

}
void option(int x)
{
switch(x)
{
   case 1 : menumat();
           break;
   case 2 : menudiv();
          break;
   case 3: menustr();
          break;
   case 4: exit(0);
           break;
   default : printf("Introduziu uma opcao errada");
             exit(0);
             break;
  }
}
void menumat()
{
  system("cls");
  titulo();
  printf("\n\t\t\t\t   @@MATEMATICA@@\n\n");
  linha();
  printf("\t\t\t\t1- Maximo Divisor Comum\t\t\t\n");
}


void menudiv()
{
  system("cls");
  titulo();
  printf("\n\t\t\t\t  @@DIVERTIMENTO@@\n\n");
  linha();
  printf("\t\t\t\t 1 - Spider\t\t\t\n");
  printf("\t\t\t\t 2 - Copas\t\t\t\n");
  printf("\t\t\t\t 3 - Apostar Numero\t\t\t\n");
  printf("\t\t\t\t 4 - Voltar ao Menu Principal\t\t\t\n");
  printf("\t\t\t\t 5 - Sair\t\t\t\n");
  putchar('\n');
  printf("\t\t\tIntroduza a opcao que pretende(1/2/3) : \n\n\t\t\t");
  scanf("%d",&op);
  option_div(op);
}
void option_div(int x)
{
  switch(x)
  {
    case 1 : system("spider.exe");
             break;
    case 2 : system("mshearts.exe");
             break;
    case 3 : system("cls");
             titulo();
             putchar('\n');
             printf("\t\t\t\t   Jogo das Apostas\n");
             linha();
             printf("\t\t\t\tIntroduza um valor \n\n\n\t\t\t\t");
             scanf("%d",&valor);
             apostas(valor);
             break;
    case 4 : menup();
             break;
    case 5 : exit(0);
             break;
  }
}

void menustr()
{
  system("cls");
  titulo();
  printf("\n\t\t\t\t     @@STRINGS@@ \n");
  linha();
  printf("\n\n\t\t\t1 - Qual a Melhor Password\n");
  printf("\t\t\t2 - Criar uma Password\n");
  scanf("%d",&op);
  option_str(op);

}
void option_str(int x)
{
  switch(x)
  {
    case 1 : printf("Introduza a password 1 que pretende comparar\n");
             fflush(stdin);
             gets(pw1);
             printf("Introduza a password 2 que pretende comparar\n");
             gets(pw2);
             pw_compare(pw1,pw2);
             break;
   case 2 : pw_rand();
            break;
  }
}
void pw_rand(void)
{
int i=0;
while (i<7)
{
srand(time(NULL));
pw1[i]=  rand() % 27;
printf("%c",&pw1[i]);
i++;
}

}
void pw_compare(char *x,char *y)
{
  int i=0;
  int j=0;
  int total_letraspw1=0;
  int total_numpw1=0;
  int total_letraspw2=0;
  int total_numpw2=0;
  for(i=strlen(x),j=0;j==i;j++)
   {
     if(x[j] >= 'A' && x[j]<='Z' || x[j] >='a' && x[j]<='z')
       total_letraspw1 +=1;
     if(x[j] >=0 && x[j]<= 9)
       total_numpw1+=1;
   }
   for(i=strlen(y),j=0;j==i;j++)
   {
     if(y[j] >= 'A' && y[j]<='Z' || y[j] >='a' && y[j]<='z')
       total_letraspw2+=1;
     if(y[j] >=0 && y[j] <= 9)
       total_numpw2+=1;
   }

}
void apostas(int x)
{
    while(x !=gerado)
    {

     if(x > gerado)
       printf("\t\t\tIntroduziste um numero maior que o suposto\n\n");
      else
       printf("\t\t\tIntroduziste um numero menor que o suposto\n\n");

    printf("\t\t\tintroduza outro numero\n\t\t\t");
    scanf("%d",&valor);
    x=valor;
   }
   printf("\t\t\tACERTOU\n");

}

main()
{

srand (time (NULL));
gerado= rand()%100;
titulo();
menup();
putchar('\n');



system("PAUSE");
}

espero uma ajuda :D :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Biba  :(

#include <stdio.h>
#include <time.h>


void pw_rand(void)
{
int i=0,aux;
char pw1[7];
     srand(time(NULL));
      while (i<7)
      {
      
      aux = (65 + rand() % (91-65));
      pw1[i]=(char) aux;
      printf("%c",pw1[i]);
      i++;
      printf("\n");
      }
}



int main()
{
    
    printf("Pass Criada\n");
    pw_rand();

system("PAUSE");
return 0;
} 

Ora o srand, que é a semente dos "randes" tem que estar fora do ciclo while, pois se não estava sempre a gerar a mesma semente, e os valores eram sempre iguais.

Nao inicializas-te o pw1.

Tens que ver que um inteiro corresponde a uma char da tabela ascii (http://www.lookuptables.com/) . 65 + rand() % (91-65)  cria valores de 65 até 90. que corresponde em ascii de A a Z.

engraçado era criar uma pass com letras maiusculas minusculas e numeros  :hmm:

Se tiver algum erro avisem, pois aquilo dos ascii fiz a olho  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado, agora estou nas aulas mas quando chegar a casa vou logo tratar disso :(

obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a bombar, obrigado mesmo :(

só não percebi a parte de aux = (65 + rand() % (91-65));

o porque de 65 + rand() % (91-65)

visto que vai dar um numero até 91 já que 91-65 = 26 +65 =91

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a bombar, obrigado mesmo :(

só não percebi a parte de aux = (65 + rand() % (91-65));

o porque de 65 + rand() % (91-65)

visto que vai dar um numero até 91 já que 91-65 = 26 +65 =91

91-65 = 26

por tanto o resultado de rand()%26 é um dos seguintes numeros:

0,1,2,3,4,5,....,20,21,22,23,24,25

pois sao os possiveis restos da divisao do numero aleatorio por 26...

agora o aux = 65+ num_aletorio, deve ter a ver com o aux ter k ser superior ou igual a 65

para fazer aux=rand()% 91  teriamos como resultado um numero : 0,1,2,3,4,5,6,7,8,9,......,88,89,90

e parece k se ker k seja superior a 65...

espero k tenham percebido..  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

asciifull.gif

Se reparares a letra A corresponde em decimal ao numero 65, a Z ao numero 90, ou seja se eu fizer um cast  tipo: "  (char) letra = 61; "  a letra vai ser o B, assim sucessivamente.  :)

Quero ver isso a criar pass com maiusculas minusculas e numeros :P e a gravar num txt já agora  :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

isso é mt advanced , o maximo que consigoo é a cena das maisuculas e minuscululas :) os files ainda n aprendi =D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora