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

quebra cabeças Para programadores de C

Discussão em 'Programação' iniciada por marco_g-cs, 19 de Junho de 2007. (Respostas: 14; Visualizações: 1029)

  1. marco_g-cs

    marco_g-cs Power Member

    tenhu um trabalho de Fim de 10º pa fazer e tou encravado com isto!

    basicamente o programa é:

    temos uma chave de quatro numeros de 0 até 9 que o pc vai gerar , e vai ser armazenada num vector. vai ser pedido ao utilizador que insira uma chave pa tentar adivinhar qual é a chave gerada pelo pc. nos temos de ir dando pistas, dizer quantos numeros estao correctos na posiçao correcta e quantos numeros tao correctos na posiçao errada e quantos estao totalmente errados comparando com a chave gerada pelo pc. e o jugador tem 10 tentativas e o programa deve avizar o utilizador de quantas oportunidades tem para chegar a chave mestra( as 10 tentativas ).

    o erro que me dá é com os IF's! nao chega a contar quantos números certos na posição certra ,quantos números certos na posição errada e os errados .( e por isto a correr 10 vezes caso o utilizador não acerte na chave_gerada)


    tudo o que fiz ta aqui ->


    Código:
    #include <stdio.h>
    #include<string.h>
    #include <stdlib.h>
    #include <time.h>
    
    typedef struct
    {
    char nick[30];
    int idade;
    }dados_utilizador;
    
    typedef struct
    {
    int dia;
    char mes[12];
    int ano;
    }data;
    
    void utilizador(dados_utilizador *ptr)
    {
    printf("\n\n\n\n\n\t\t\tinsira o seu nick name -> ");
    gets(ptr->nick);
    printf("\t\t\tinsira a sua idade -> ");
    scanf("%d", ptr->idade);
    }
    
    void ler_data(data *ptr)
    {
    printf("data :\n");
    printf("dia->");
    scanf("%d", &ptr-> dia);
    printf("mes->");
    scanf(" %s", ptr-> mes);
    printf("ano->");
    scanf("%d", &ptr-> ano);
    }
    
    int gerador()
    {
    int chave;
    randomize();
    chave=random(10);
    return chave;
    }
    
    int inserxao_chave()
    {
    int chave_inserida;
    do
    {
    scanf("%d", &chave_inserida);
    }while((chave_inserida>9)||(chave_inserida<0));
    return chave_inserida;
    }
    
    
    
    void main()
    {
    int i, j; /* variaveis utilizadas para contadores*/
    int chave_gerada[4];
    int chave_inserida[4];
    int c_correct;
    int c_pos_incorrect;
    int c_errados;
    
    dados_utilizador jogador[1];
    data hoje[1];
    utilizador(&jogador[0]);
    ler_data(&hoje[0]);
    clrscr();
    
    /* esta parte faz com que nao haja repetiçoes de numeros no vector de numeros gerados*/
    chave_gerada[0]= gerador();
    
    do
    {
    chave_gerada[1]= gerador();
    }while(chave_gerada[1]==chave_gerada[0]);
    
    
    do
    {
    chave_gerada[2]= gerador();
    }while((chave_gerada[2]==chave_gerada[0])||(chave_gerada[2]==chave_gerada[1]));
    
    do
    {
    chave_gerada[3]= gerador();
    }while((chave_gerada[3]==chave_gerada[0])||(chave_gerada[3]==chave_gerada[1])||(chave_gerada[3]==chave_gerada[2]));
    clrscr();
    
    for(i=0;i<4;i++)
    printf("%d", chave_gerada[i]);
    
    /* esta parte acaba aqui */
    
    [COLOR="DarkRed"]
    for(i=0;i<4;i++) /*este ciclo faz com que sejam inseridos 4 numeros*/
    chave_inserida[i]=inserxao_chave();
    
    if((chave_inserida[0]==chave_gerada[0])&&(chave_inserida[1]==chave_gerada[1])&&(chave_inserida[2]==chave_gerada[2])&&(chave_inserida[3]==chave_gerada[3]))
    printf(" Ganhou o JOGO ");
    else
    {
    for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    {
    c_correct=0;
    c_pos_incorrect=0;
    c_errados=0;
    if((chave_gerada[i]==chave_inserida[j])&&(i==j))
    {
    c_correct=c_correct+1;
    
    }
    
    else
    {
    
    if((chave_gerada[i]==chave_inserida[j])&&(i!=j))
    {
    c_pos_incorrect=c_pos_incorrect+1;
    
    }
    
    
    if((chave_gerada[i]!=chave_gerada[j])&&(i!=j))
    {
    c_errados=c_errados+1;
    
    }
    
    }
    }
    
    printf("tem %d numeros corectos na posicao correcta\n", c_correct);
    printf("tem %d numeros correctos na posicao errada\n", c_pos_incorrect);
    printf("tem %d numeros incorrectos\n", c_errados);
    }
    getch();
    [/COLOR]
    
    }
    a vermelho esta a parte que estou encravado!!!


    falta a parte de fazer o ciclo correr 10 vezes e mostrar quantos numeros certos na posiçao certa quantos certos na posiçao errada e os compeletamente errados( comparando com a chave gerada)

    todo o que me possam dizer ou ajudar é bem vindo

    obrigado

    cump's
     
  2. BMarques

    BMarques Power Member

    Quando dizes que te dá erros nos IF's refereste-te ao quê?

    Dá erro a compilar? Ou não dá os valores que estás à espera?
     
  3. marco_g-cs

    marco_g-cs Power Member

    os erros que me dao sao que os ifs nao xegam a testar!!
     
  4. John'Z

    John'Z Power Member

    Offtopic: Já programas em C no 10º ano?
     
  5. BMarques

    BMarques Power Member

    Mas com isso quer dizer que vês o resultado dos printf's com a informação de que aquelas variáveis estão todas a zero?

    Ou nem isso chegas a ver?
     
  6. marco_g-cs

    marco_g-cs Power Member


    eu ponhu um contador em cada condiçao e as condiçoes nao chega a testar nem o contador chega a ser encrementado!!

    ajudem me nao sei pk__!!!
     
  7. marco_g-cs

    marco_g-cs Power Member

    tou a tirar um curso profissional!
     
  8. BMarques

    BMarques Power Member

    Epá não sei se resolve alguma coisa mas repara que estás a colocar os contadores a zero dentro do ciclo for.

    Isso faz que, a cada vez que o ciclo é repetido os contadores voltem a zero!!!

    Muda aquelas 3 inicializações para cima do for.

    Depois conta como correu :)
     
  9. warai

    warai Power Member

    Boas. Apenas tens de meter ciclos encadeados while com as condições de teste e respectivos breaks.
     
  10. marco_g-cs

    marco_g-cs Power Member

    n entendi mt bem


    se puders esplicar te melhor! exemplificar
     
  11. John'Z

    John'Z Power Member

    Ah... Eu tou no tecnologico.

    Sorry o offtopic

    Cumps
     
  12. warai

    warai Power Member

    algo do estilo:
    Código:
    int count=10;
    while(count!=0){[INDENT]while(i<5)
    [/INDENT][INDENT]{ 
    if(chave_gerada[i]==chave_inserida[i])[INDENT]numcorrectospos++;
    [/INDENT]else[INDENT]numerrados++;
    [/INDENT]i++;}
    for(i=0;i<5;i++)[INDENT]for(j=0;j<5;j++)[INDENT]if(chave_gerada[i]==chave_inserida[j])
    ..... /* para os num correctos nas pos erradas */
    [/INDENT][/INDENT]if(numcorrectos==5)[INDENT]break;
    [/INDENT]printf("Dispoe de %d tentativas", 10-count);
    ++count;
    [/INDENT]}
     
  13. raVemjr

    raVemjr I'm cool cuz I Fold

    Já te conseguíste registar? Eu tinha mandado PM a perguntar-te o MSN para dar ajuda...
     
  14. marco_g-cs

    marco_g-cs Power Member

    ja consegui corrigir os erros agora so falta corrigir os bugs

    obrigado

    aserio muito obrigado ...

    por pessual como este é que vale a pena colaborar com o forum...

    obrigado a todos msm

    em especial ao warai

    obrigado

    cump's
     
  15. marco_g-cs

    marco_g-cs Power Member

    se quizerem eu ponho a resoluçao do meu trabalho!! peçam

    cump's
     

Partilhar esta Página