Jump to content

Selecionar dois ou mais elementos com mesmo valor num vetor em C


mirador_22
 Share

Go to solution Solved by mirador_22,

Recommended Posts

Boas pessoal, tudo bem, estou quase terminando uma simulação de mutibol e estou com algumas duvidas em definir um vencedor em questão de empates a zeros ou maior

eis um exemplo de uma parte do codigo com ciclo for que faz o loop, a procura de jogadores

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

#define MAX  4//numero de jogadores -> exemplo

void main(void) {
int a, b;
for (a = 0; a < MAX - 1; a++) {
	for (b = a + 1; b < MAX; b++) {
		//CODE HERE
	}
}
}

e tenho esta operação que lista os jogadores por numero de remates maior ou igual a zero(>=0)

if ((jogadores[a].estatistica.qt_golos_marcados >= 0) && (jogadores.estatistica.qt_golos_marcados >= 0)) {
	//CODE HERE
}
}

tenho esse codigo para determinar um vencedor entre 2 ou mais jogadores sem empates

  //esta situação podera ser para jogador b, nesse caso para jogador A
if (jogadores[a].estatistica.qt_golos_marcados > jogadores.estatistica.qt_golos_marcados) {
	printf("\n A1Jogador %d foi o vencedor marcando %d golo(s)...\n",
			jogadores[a].num_jogador,
			jogadores[a].estatistica.qt_golos_marcados);
} else if ((jogadores.estatistica.qt_golos_marcados == 0) &&  
	    (jogadores[a].estatistica.qt_golos_marcados  > jogadores[b].estatistica.qt_golos_marcados)) {
	printf("\n A2Jogador %d foi o vencedor marcando %d golo(s)...\n",
			jogadores[a].num_jogador,
			jogadores[a].estatistica.qt_golos_marcados);
}
}

a minha dúvida começa aqui, nesta parte onde ocorre situações de empates entre jogadores e só que se for 3 jogador em que o jogador 1 ganhou e mostra mensagem que o jogador 1 é o vencedor e mas em vez de terminar diz que existe empates entre jogador 2, jogador 3 e jogador 4, eis o codigo

if (jogadores[a].estatistica.qt_golos_marcados == jogadores[b].estatistica.qt_golos_marcados) {
	if ((jogadores[a].estatistica.qt_golos_marcados == 0)
		  && (jogadores[b].estatistica.qt_golos_marcados == 0)) {
		printf("\n 1Existe empate entre jogador %d  e jogador %d com ambos %d golo(s)...\n",
				jogadores[a].num_jogador,
				jogadores[b].num_jogador,
				jogadores[a].estatistica.qt_golos_marcados);
		sleep(1);
		simular_prologamento();
	}
	else if ((jogadores[a].estatistica.qt_golos_marcados > 0)
			   && (jogadores[b].estatistica.qt_golos_marcados > 0)) {
		printf("\n 2Existe empate entre jogador %d  e jogador %d com ambos %d golo(s)...\n",
				jogadores[a].num_jogador,
				jogadores[b].num_jogador,
				jogadores[a].estatistica.qt_golos_marcados);
		sleep(1);
		simular_prologamento();
	}
}

eis o screen-shots da simulação, deveria sair quando o jogador 1 ganhou

gDFcsJa.jpg?1

e segundo o prof, tenho que seguir esta ideologia como mostra na figura em baixo

7LxNECl.jpg?1

e pelo que percebi nesta imagem em cima, a função prolongamento irá receber apenas os jogadores empatados com maiores numeros de golos e os que tiveram menos golos serão excluidos do prolongamento?

alguma orientção, eu agradecia

Edited by mirador_22
Link to comment
Share on other sites

Boas,

Não sei se percebi bem o que pretendes, mas se for mostrar quem foi o vencedor, ou varios vencedores em caso de empate entre os melhores, poderias fazer isto:

-Ordenar os jogadores por golos.

-Saber o máximo de golos marcados (seria o nr de golos do 1º da lista de jogadores ordenados)

-Se o 2º da lista tiver menos golos que o maximo de golos marcados, então só houve um vencedor (o 1º da lista de jogadores ordenados)

-Senão vês até que jogador tem o maximo de golos marcados e dizes que houvem um empate entre esses...

Link to comment
Share on other sites

Boas,

Não sei se percebi bem o que pretendes, mas se for mostrar quem foi o vencedor, ou varios vencedores em caso de empate entre os melhores, poderias fazer isto:

-Ordenar os jogadores por golos.

-Saber o máximo de golos marcados (seria o nr de golos do 1º da lista de jogadores ordenados)

-Se o 2º da lista tiver menos golos que o maximo de golos marcados, então só houve um vencedor (o 1º da lista de jogadores ordenados)

-Senão vês até que jogador tem o maximo de golos marcados e dizes que houvem um empate entre esses...

essa parte já fiz

/*Função para listar quantidade de remates entre jogadores*/
void listar_jogador_num_golos_jogo() {
int s;
printf("\n\t\t--- Estatisticas de Golos dos Jogadores no Jogo ---\n");
for (s = 0; s < qt_jogador; s++) {
	if (jogadores[s].estatistica.qt_golos_marcados <= 1) {
		printf("\t\t\t Jogador %d: %d golo...\n", jogadores[s].num_jogador,
				jogadores[s].estatistica.qt_golos_marcados);
	} else if (jogadores[s].estatistica.qt_golos_marcados > 1) {
		printf("\t\t\t Jogador %d: %d golos...\n",jogadores[s].num_jogador,
				jogadores[s].estatistica.qt_golos_marcados);
	}
}//chama a função
definir_vencedor_ou_empate_jogo();
}

/*função para determinar jogador vencedor ou no caso de empate,*/
void  definir_vencedor_ou_empate_jogo(void){
 int a, b;
   for (a = 0; a < MAX - 1; a++) {
	  for (b = a + 1; b < MAX; b++) {
		//CODE HERE
  }
}
  }
}
Link to comment
Share on other sites

tinha dito: "Não sei se percebi bem o que pretendes, mas se for mostrar quem foi o vencedor, ou varios vencedores em caso de empate entre os melhores" e não disseste se eras isso que querias ou não...

dizes "essa parte já fiz" e mostras um codigo que apenas lista o numero do jogador e os golos marcados....

quando metes //CODE HERE falta-te fazer esse codigo ou estas a oculta-lo?

Link to comment
Share on other sites

tinha dito: "Não sei se percebi bem o que pretendes, mas se for mostrar quem foi o vencedor, ou varios vencedores em caso de empate entre os melhores" e não disseste se eras isso que querias ou não...

dizes "essa parte já fiz" e mostras um codigo que apenas lista o numero do jogador e os golos marcados....

quando metes //CODE HERE falta-te fazer esse codigo ou estas a oculta-lo?

estou a referir os outros codigos em em cima, onde explicam as funcionalidades

Link to comment
Share on other sites

eis as duas funções,


//listar jogador por numero de golo
void listar_jogador_num_golos_jogo() {

   int s;

   printf("\n\t\t--- Estatisticas de Golos dos Jogadores no Jogo ---\n");
   for (s = 0; s < qt_jogador; s++) {
    if (jogadores[s].estatistica.qt_golos_marcados <= 1) {
	    printf("\t\t\t Jogador %d: %d golo...\n", jogadores[s].num_jogador,
			    jogadores[s].estatistica.qt_golos_marcados);
    } else if (jogadores[s].estatistica.qt_golos_marcados > 1) {
	    printf("\t\t\t Jogador %d: %d golos...\n", jogadores[s].num_jogador,
			    jogadores[s].estatistica.qt_golos_marcados);
    }
   }//chama a função
   definir_vencedor_ou_empate_jogo();
}

/*função para determinar jogador vencedor ou no caso de empate,*/
void definir_vencedor_ou_empate_jogo(void) {

   int a, b;

   for (a = 0; a < MAX - 1; a++) {
    for (b = a + 1; b < MAX; b++) {
	    //golos maior ou igual a zero
	    if ((jogadores[a].estatistica.qt_golos_marcados >= 0)
			    && (jogadores.estatistica.qt_golos_marcados >= 0)) {
		    //qt golo jogador A  for maior que jogador A
		    if (jogadores[a].estatistica.qt_golos_marcados > jogadores.estatistica.qt_golos_marcados) {
			    printf("\n A1Jogador %d foi o vencedor marcando %d golo(s)...\n",
					    jogadores[a].num_jogador,
					    jogadores[a].estatistica.qt_golos_marcados);
		    } else if ((jogadores.estatistica.qt_golos_marcados == 0) &&
				    (jogadores[a].estatistica.qt_golos_marcados > jogadores.estatistica.qt_golos_marcados)) {
			    printf("\n A2Jogador %d foi o vencedor marcando %d golo(s)...\n",
					    jogadores[a].num_jogador,
					    jogadores[a].estatistica.qt_golos_marcados);
			    //qt golo do jogador A for igual a zero
		    } else if (jogadores[a].estatistica.qt_golos_marcados == jogadores[b].estatistica.qt_golos_marcados) {
			    if ((jogadores[a].estatistica.qt_golos_marcados == 0)
					    && (jogadores[b].estatistica.qt_golos_marcados == 0)) {
				    printf("\n 1Existe empate entre jogador %d  e jogador %d com ambos %d golo(s)...\n",
						    jogadores[a].num_jogador,
						    jogadores[b].num_jogador,
						    jogadores[a].estatistica.qt_golos_marcados);
				    sleep(1);
				    simular_prologamento();
			    } else if ((jogadores[a].estatistica.qt_golos_marcados > 0)
					    && (jogadores[b].estatistica.qt_golos_marcados > 0)) {
				    printf("\n 2Existe empate entre jogador %d  e jogador %d com ambos %d golo(s)...\n",
						    jogadores[a].num_jogador,
						    jogadores[b].num_jogador,
						    jogadores[a].estatistica.qt_golos_marcados);
				    sleep(1);
				    simular_prologamento();
			    }
		    }
	    }
    }
   }
}
}
}
Edited by mirador_22
Link to comment
Share on other sites

lol... parece que a gente não está a falar a mesma lingua....

eu nem sei c, nem sei porque respondi a este tópico.... mas olha fiz este codigo em vb6 que faz:

Mostra quem foi o vencedor, ou varios vencedores em caso de empate entre os melhores (se for isto que queres)

Option Explicit

Private Type Jogador
   golos As Integer
   nr_jogador As Integer
End Type

Private arr_jogadores(3) As Jogador

Private Sub main()
   Randomize
   Dim i As Integer, i2 As Integer

   'atribui valores ao array
   For i = 1 To 4
    arr_jogadores(i - 1).nr_jogador = i
    arr_jogadores(i - 1).golos = Int(Rnd * 3)
   Next

   Debug.Print
   Debug.Print "============================================================"
   Debug.Print "============================================================"

   'mostra resultados atribuidos em cima
   For i = 0 To 3
    Debug.Print "JOGADOR NR: " & arr_jogadores(i).nr_jogador & " - GOLOS: " & arr_jogadores(i).golos
   Next

   'ordena o arr_jogadores por nr de golos
   For i = 0 To 2
    For i2 = i + 1 To 3
	    If (arr_jogadores(i).golos < arr_jogadores(i2).golos) Then

		    Dim aux_golos As Integer
		    Dim aux_nr_jogador As Integer

		    aux_golos = arr_jogadores(i2).golos
		    arr_jogadores(i2).golos = arr_jogadores(i).golos
		    arr_jogadores(i).golos = aux_golos

		    aux_nr_jogador = arr_jogadores(i2).nr_jogador
		    arr_jogadores(i2).nr_jogador = arr_jogadores(i).nr_jogador
		    arr_jogadores(i).nr_jogador = aux_nr_jogador

	    End If
    Next
   Next

   Debug.Print "======= LISTA arr_jogadores ORDENADOS POR GOLOS ========="
   For i = 0 To 3
    Debug.Print "JOGADOR NR: " & arr_jogadores(i).nr_jogador & " - GOLOS: " & arr_jogadores(i).golos
   Next


   Dim max_golos As Integer
   max_golos = arr_jogadores(0).golos

   Debug.Print "======= MOSTRA VENCEDORES ========================"
   If max_golos > arr_jogadores(1).golos Then
    Debug.Print "VENCEDOR: JOGADOR NR: " & arr_jogadores(0).nr_jogador & " - GOLOS: " & arr_jogadores(0).golos
   Else
    Dim empatados As Integer
    Debug.Print "VENCEDORES EMPATADOS:"
    For i = 0 To 3
	    If arr_jogadores(i).golos = max_golos Then
		    Debug.Print "JOGADOR NR: " & arr_jogadores(i).nr_jogador & " - GOLOS: " & arr_jogadores(i).golos
	    End If
    Next
   End If


   Debug.Print "============================================================"
   Debug.Print

End Sub

output de 4 execuções:

============================================================
============================================================
JOGADOR NR: 1 - GOLOS: 1
JOGADOR NR: 2 - GOLOS: 1
JOGADOR NR: 3 - GOLOS: 2
JOGADOR NR: 4 - GOLOS: 1
======= LISTA arr_jogadores ORDENADOS POR GOLOS =========
JOGADOR NR: 3 - GOLOS: 2
JOGADOR NR: 2 - GOLOS: 1
JOGADOR NR: 1 - GOLOS: 1
JOGADOR NR: 4 - GOLOS: 1
======= MOSTRA VENCEDORES ========================
VENCEDOR: JOGADOR NR: 3 - GOLOS: 2
============================================================


============================================================
============================================================
JOGADOR NR: 1 - GOLOS: 2
JOGADOR NR: 2 - GOLOS: 1
JOGADOR NR: 3 - GOLOS: 1
JOGADOR NR: 4 - GOLOS: 2
======= LISTA arr_jogadores ORDENADOS POR GOLOS =========
JOGADOR NR: 1 - GOLOS: 2
JOGADOR NR: 4 - GOLOS: 2
JOGADOR NR: 3 - GOLOS: 1
JOGADOR NR: 2 - GOLOS: 1
======= MOSTRA VENCEDORES ========================
VENCEDORES EMPATADOS:
JOGADOR NR: 1 - GOLOS: 2
JOGADOR NR: 4 - GOLOS: 2
============================================================


============================================================
============================================================
JOGADOR NR: 1 - GOLOS: 0
JOGADOR NR: 2 - GOLOS: 0
JOGADOR NR: 3 - GOLOS: 1
JOGADOR NR: 4 - GOLOS: 0
======= LISTA arr_jogadores ORDENADOS POR GOLOS =========
JOGADOR NR: 3 - GOLOS: 1
JOGADOR NR: 2 - GOLOS: 0
JOGADOR NR: 1 - GOLOS: 0
JOGADOR NR: 4 - GOLOS: 0
======= MOSTRA VENCEDORES ========================
VENCEDOR: JOGADOR NR: 3 - GOLOS: 1
============================================================


============================================================
============================================================
JOGADOR NR: 1 - GOLOS: 1
JOGADOR NR: 2 - GOLOS: 2
JOGADOR NR: 3 - GOLOS: 2
JOGADOR NR: 4 - GOLOS: 2
======= LISTA arr_jogadores ORDENADOS POR GOLOS =========
JOGADOR NR: 2 - GOLOS: 2
JOGADOR NR: 3 - GOLOS: 2
JOGADOR NR: 4 - GOLOS: 2
JOGADOR NR: 1 - GOLOS: 1
======= MOSTRA VENCEDORES ========================
VENCEDORES EMPATADOS:
JOGADOR NR: 2 - GOLOS: 2
JOGADOR NR: 3 - GOLOS: 2
JOGADOR NR: 4 - GOLOS: 2
============================================================
Link to comment
Share on other sites

lol... parece que a gente não está a falar a mesma lingua....

eu nem sei c, nem sei porque respondi a este tópico.... mas olha fiz este codigo em vb6 que faz:

Mostra quem foi o vencedor, ou varios vencedores em caso de empate entre os melhores (se for isto que queres)

Option Explicit

Private Type Jogador
golos As Integer
nr_jogador As Integer
End Type

Private arr_jogadores(3) As Jogador

Private Sub main()
Randomize
Dim i As Integer, i2 As Integer

'atribui valores ao array
For i = 1 To 4
	arr_jogadores(i - 1).nr_jogador = i
	arr_jogadores(i - 1).golos = Int(Rnd * 3)
Next

Debug.Print
Debug.Print "============================================================"
Debug.Print "============================================================"

'mostra resultados atribuidos em cima
For i = 0 To 3
	Debug.Print "JOGADOR NR: " & arr_jogadores(i).nr_jogador & " - GOLOS: " & arr_jogadores(i).golos
Next

'ordena o arr_jogadores por nr de golos
For i = 0 To 2
	For i2 = i + 1 To 3
		If (arr_jogadores(i).golos < arr_jogadores(i2).golos) Then

			Dim aux_golos As Integer
			Dim aux_nr_jogador As Integer

			aux_golos = arr_jogadores(i2).golos
			arr_jogadores(i2).golos = arr_jogadores(i).golos
			arr_jogadores(i).golos = aux_golos

			aux_nr_jogador = arr_jogadores(i2).nr_jogador
			arr_jogadores(i2).nr_jogador = arr_jogadores(i).nr_jogador
			arr_jogadores(i).nr_jogador = aux_nr_jogador

		End If
	Next
Next

Debug.Print "======= LISTA arr_jogadores ORDENADOS POR GOLOS ========="
For i = 0 To 3
	Debug.Print "JOGADOR NR: " & arr_jogadores(i).nr_jogador & " - GOLOS: " & arr_jogadores(i).golos
Next


Dim max_golos As Integer
max_golos = arr_jogadores(0).golos

Debug.Print "======= MOSTRA VENCEDORES ========================"
If max_golos > arr_jogadores(1).golos Then
	Debug.Print "VENCEDOR: JOGADOR NR: " & arr_jogadores(0).nr_jogador & " - GOLOS: " & arr_jogadores(0).golos
Else
	Dim empatados As Integer
	Debug.Print "VENCEDORES EMPATADOS:"
	For i = 0 To 3
		If arr_jogadores(i).golos = max_golos Then
			Debug.Print "JOGADOR NR: " & arr_jogadores(i).nr_jogador & " - GOLOS: " & arr_jogadores(i).golos
		End If
	Next
End If


Debug.Print "============================================================"
Debug.Print

End Sub

output de 4 execuções:

============================================================
============================================================
JOGADOR NR: 1 - GOLOS: 1
JOGADOR NR: 2 - GOLOS: 1
JOGADOR NR: 3 - GOLOS: 2
JOGADOR NR: 4 - GOLOS: 1
======= LISTA arr_jogadores ORDENADOS POR GOLOS =========
JOGADOR NR: 3 - GOLOS: 2
JOGADOR NR: 2 - GOLOS: 1
JOGADOR NR: 1 - GOLOS: 1
JOGADOR NR: 4 - GOLOS: 1
======= MOSTRA VENCEDORES ========================
VENCEDOR: JOGADOR NR: 3 - GOLOS: 2
============================================================


============================================================
============================================================
JOGADOR NR: 1 - GOLOS: 2
JOGADOR NR: 2 - GOLOS: 1
JOGADOR NR: 3 - GOLOS: 1
JOGADOR NR: 4 - GOLOS: 2
======= LISTA arr_jogadores ORDENADOS POR GOLOS =========
JOGADOR NR: 1 - GOLOS: 2
JOGADOR NR: 4 - GOLOS: 2
JOGADOR NR: 3 - GOLOS: 1
JOGADOR NR: 2 - GOLOS: 1
======= MOSTRA VENCEDORES ========================
VENCEDORES EMPATADOS:
JOGADOR NR: 1 - GOLOS: 2
JOGADOR NR: 4 - GOLOS: 2
============================================================


============================================================
============================================================
JOGADOR NR: 1 - GOLOS: 0
JOGADOR NR: 2 - GOLOS: 0
JOGADOR NR: 3 - GOLOS: 1
JOGADOR NR: 4 - GOLOS: 0
======= LISTA arr_jogadores ORDENADOS POR GOLOS =========
JOGADOR NR: 3 - GOLOS: 1
JOGADOR NR: 2 - GOLOS: 0
JOGADOR NR: 1 - GOLOS: 0
JOGADOR NR: 4 - GOLOS: 0
======= MOSTRA VENCEDORES ========================
VENCEDOR: JOGADOR NR: 3 - GOLOS: 1
============================================================


============================================================
============================================================
JOGADOR NR: 1 - GOLOS: 1
JOGADOR NR: 2 - GOLOS: 2
JOGADOR NR: 3 - GOLOS: 2
JOGADOR NR: 4 - GOLOS: 2
======= LISTA arr_jogadores ORDENADOS POR GOLOS =========
JOGADOR NR: 2 - GOLOS: 2
JOGADOR NR: 3 - GOLOS: 2
JOGADOR NR: 4 - GOLOS: 2
JOGADOR NR: 1 - GOLOS: 1
======= MOSTRA VENCEDORES ========================
VENCEDORES EMPATADOS:
JOGADOR NR: 2 - GOLOS: 2
JOGADOR NR: 3 - GOLOS: 2
JOGADOR NR: 4 - GOLOS: 2
============================================================

a lógica é exactamente isso mas o sintaxe da linguagem que é diferente mas vou tentar seguir esta logiac

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.