quebra cabeças Para programadores de C

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
 
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?
 
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?


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__!!!
 
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 :)
 
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]}
 
Já te conseguíste registar? Eu tinha mandado PM a perguntar-te o MSN para dar ajuda...

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
 
Back
Topo