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

s4muc4_!)0g@$

4 numeros aleatorios diferentes

Mensagens Recomendadas

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


Ligação para a mensagem
Partilhar noutros sites
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).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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:


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
s4muc4_!)0g@$

mas pera ai, estas a sugerir que eu substitua o for por um while

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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++;
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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 🤔

preciso de ajuda urgente pff 😲

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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++.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
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


Ligação para a mensagem
Partilhar noutros sites
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]) {
    /* ... */
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

É o argumento que envias para a função. Um array de inteiros com 4 valores.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação 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 os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.