Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

s4muc4_!)0g@$

4 numeros aleatorios diferentes

Mensagens Recomendadas

s4muc4_!)0g@$    0
s4muc4_!)0g@$

Tenho um projeto onde tenho de guardar 4 numeros aleatorios num array de forma a que os numeros nao sejao iguais.

	int secreto[4];	
srand((unsigned int)time(NULL(MAX)));

for(int i=0; i<4; i++){
	if (i==0)
		secreto[i]= rand() %9 + 1;
	else {
		for(int j=0; j<i; j++){
			do {
				secreto[j+1]= rand() %9 + 1;
			}
			while (secreto[i]==secreto[j] ); // o problema esta neste while porque
// eu quero que ele reveja em todo o array e verifique se o numero que ele esta a criar e igual aos outros 
// anteriores
		}
	}
}

o problema ja eu sei qual e, eu queria era propostas alternativas mas simples.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

O que é NULL(MAX)? ?????

Experimenta fazer uma função que verifica se um determinada número está num array de determinado tamanho ... e depois chama essa função dentro do ciclo com o novo número e o array existente. Se o número já existir fazes outro random, se não existirr acrescentas ao array.

Atenção: isto funciona bem com um array relativamente pequeno comparativamente com os números a gerar (um array de 4 elementos para 9 números a gerar não dá problema).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
s4muc4_!)0g@$    0
s4muc4_!)0g@$

em relaçao ao NULL(MAX), eu antes do main eu fiz "const int MAX=65;"

agora, eu nao to a perceber o teu ponto de vista, sera que podes explicar de outra forma??

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Em vez de meteres tudo dentro dos ciclos, separa a verificacao numa funcao especifica (por exemplo (em C, eu nao sei C++): int inarray(int n, int *arr, size_t len);).

// ...
int array[4];
int nelems = 0;
while (nelems < 4) {
    int tentativenum = rand() % 9 + 1;           /* gerar numero aleatorio */
    if (!inarray(tentativenum, array, nelems)) { /* verificar que NAO existe */
        array[nelems] = tentativenum;            /* mete-lo no array */
        nelems += 1;                             /* actualizar numero de elementos */
    }
}
// ...

O NULL(MAX), mesmo sabendo a definicao de MAX, continua a fazer-me comichao :confused:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
s4muc4_!)0g@$    0
s4muc4_!)0g@$

epah, sei que c++ e c sao um pouco parecidos mas vou experimentar

e o NULL(MAX) tambei nao gostei muito mas foi ideia do meu prof

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

da para usar um while como se fosse um for??

Sim! Os dois pseudo-codigos abaixo sao perfeitamente iguais :confused:

for (<init>; <cond>; <incr>) {
    <body>;
}

<init>;
while (<cond>) {
    <body>;
    <incr>;
}

Exemplo real

sum = 0;
for (i = 0; i < 100; i++) sum += arr[i];

sum = 0;
i = 0;
while (i < 100) {
    sum += arr[i];
    i++;
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
s4muc4_!)0g@$    0
s4muc4_!)0g@$

eu melhorei a parte do gerador de numeros aleatorios e avancei no programa e ficou assim:

#include<iostream>
#include<time.h>
using namespace std;
const int MAX=65;
int gerador();
int manual();
unsigned int verificacao();

int main(){
int r=0;
do {
system("cls");
printf("\n");
printf("	Bull and Cows\n\n");
int op;
printf("	Menu:\n\n");
printf("	1 - Single-player");
printf("	2 - Multi-player");
printf("	3 - Instruções");
printf("	4 - Sair");
int bull, secreto[4];
printf("Escolha a opcao: ");
scanf("%d",&op);
switch(op){
	case 1:
		system("cls");
			for (int i=0;i<4;i++)
				secreto[i]=gerador();
			do bull=verificacao();
			while (bull!=4);
	case 2:
		system("cls");
		for (int j=0;j<2;j++){
			printf("Jogador %d\n\n",j+1);
			for (int i=0;i<4;i++)
				secreto[i]=manual();
			do bull=verificacao();
			while (bull!=4);
		}
	case 3:
		system("cls");
	case 4:
		system("cls");
	default:
		r=1;
}
}
while (r==1);
return 0;
}
int gerador(){
int secreto[4], hasDuplicate;	
srand((unsigned int)time(NULL(MAX)));

for(int i=0; i<4; i++) {
	secreto[i] = rand() %9 +1;
	hasDuplicate = 0;

       for(int j=0; j<=(i-1); j++)
	{
		if (secreto[i] == secreto[j])
		{
			hasDuplicate = 1;
			i--;
		}
	}
}
return secreto[4];
}
int manual(){
int secreto[4];
printf("Insira o codigo a descobrir\n\n");
for (int i=0;i<4;i++) {
	printf("Numero %d: ",i+1);
	scanf("%d",&secreto[i]);
}
return secreto[4];
}
unsigned int verificacao(int secreto[4]){
int bull, cow, resposta[4];
bull=0;
cow=0;
for (int a=0;a<4;a++){
	cout<<"Numero "<<a+1<<": ";
	cin>>resposta[a];
}
for (int b=0;b<4;b++){
	if (resposta[b]==secreto[b])
		bull++;
	else {
		for (int c=0;c<4;c++){
			if (resposta[b]==secreto[c] && c!= b)
				cow++;
		}
	}
}
if (bull==4){
	printf("\n\n	Ganhou.\n");
	printf("	Sequencia:");
	for (int i=0;i<4;i++)
		printf(" %d",secreto[i]);
}
else {
	cout<<"bulls :"<<bull<<endl;
	cout<<"cows  :"<<cow<<endl;
}
return bull;
}

o meu problema agora e que nao consigo testar o programa porque da me este erro:

1>code.obj : error LNK2001: unresolved external symbol "unsigned int __cdecl verificacao(void)" (?verificacao@@YAIXZ)

1>C:\Documents and Settings\Geraldo\Os meus documentos\Visual Studio 2010\Projects\Bull_e_Cow\Bull_e_Cow\Debug\Bull_e_Cow.exe : fatal error LNK1120: 1 unresolved externals :hmm:

preciso de ajuda urgente pff :eek:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

unsigned int verificacao();
/* ... */
                                do bull=verificacao();
/* ... */
                                do bull=verificacao();
/* ... */
unsigned int verificacao(int secreto[4]){
    /* ... */
}

o meu problema agora e que nao consigo testar o programa porque da me este erro:

1>code.obj : error LNK2001: unresolved external symbol "unsigned int __cdecl verificacao(void)" (?verificacao@@YAIXZ)

Oh ve la bem se definiste a mesma funcao que declaraste (e tentas usar).

Nota: eu nao sei C++.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
s4muc4_!)0g@$    0
s4muc4_!)0g@$

unsigned int verificacao();
/* ... */
                                do bull=verificacao();
/* ... */
                                do bull=verificacao();
/* ... */
unsigned int verificacao(int secreto[4]){ // estas a falar esta parte??
    /* ... */
}

se estas a falar desta parte, digo te ja que o "int secreto[4]" sao os parametros de entrada

se nao for disso entao nao estou a ver o teu ponto de vista :P

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Tu declaras (e usas) uma funcao chamada verificacao() que nao leva parametros, mas nunca a defines. A funcao que defines, tambem se chama verificacao() mas aceita um parametro do tipo array de int. Segundo penso, em C++, sao funcoes diferentes: precisam de ser tratadas diferentemente.

Ou declaras e usas a funcao de acordo com a definicao

unsigned int verificacao(int secreto[4]);
do bull = verificacao(arr4); // assume que arr e um array de 4 ints
unsigned int verificacao(int secreto[4]) {
    /* ... */
}

ou defines a funcao de acordo com a declaracao e uso

unsigned int verificacao();
do bull = verificacao();
unsigned int verificacao() {
    /* ... */
}

ou ainda, declaras, usas e defines duas funcoes diferentes

unsigned int verificacao();
unsigned int verificacao(int secreto[4]);
do bull = verificacao();
do bull = verificacao(arr4); // assume que arr e um array de 4 ints
unsigned int verificacao() {
    /* ... */
}
unsigned int verificacao(int secreto[4]) {
    /* ... */
}

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


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade