Jump to content


Photo

Simplificar Código... Duvida!


  • Faça o login para participar
1 reply to this topic

#1 Charles GP

Charles GP

    Novato no fórum

  • Usuários
  • 1 posts
  • Sexo:Não informado

Posted 09/06/2008, 10:57

Bom dia pessoal,

Fiz um programa abaixo que permitir a leitura dos placares de cada set de uma partida de Vôlei! Caso o placar do set seja inválido, o programa deverá descartá-lo e solicitar uma nova digitação, até que o usuário defina um placar válido. O programa encerra quando uma equipe for a vencedora do confronto, ou seja, vencer três sets.
Porem achei o meu código muito extenso e gostaria de saber se alguém poderia me dar uma dica para simplificá-lo um pouco???

# include <stdio.h>
# include <conio.h>
main ()
{

int set,cont,timea,timeb,vita,vitb,aux;

set=0;
cont=0;
timea=0;
timeb=0;
vita=0;
vitb=0;
aux=0;

while ((vita<3) && (vitb<3))
{
aux=0;

set++;
printf ("\nSET %d \n\n\n", set);
printf ("PONTOS DO TIME A \n");
scanf ("%d",&timea);
printf ("PONTOS DO TIME B \n");
scanf ("%d",&timeb);

while (aux==0)
{
if (timea>timeb)
{
if(((timea-timeb)!=2) || (timea<25))
{

if((timea==25) && ((timea-timeb)>=2))
{
aux++;
}
else
{
aux=0;
printf ("\nINVALIDO\n");
printf ("PONTOS DO TIME A \n");
scanf ("%d",&timea);
printf ("PONTOS DO TIME B \n");
scanf ("%d",&timeb);
}

}
else
aux++;

}

if (timeb>timea)
{

{
if(((timeb-timea)!=2) || (timeb<25))
{

if((timeb==25) && ((timeb-timea)>=2))
{
aux++;
}
else
{
aux=0;
printf ("\nINVALIDO\n");
printf ("PONTOS DO TIME A \n");
scanf ("%d",&timea);
printf ("PONTOS DO TIME B \n");
scanf ("%d",&timeb);
}

}
else
aux++;

}

}
}

if(timea>timeb)
vita++;
if(timeb>timea)
vitb++;


//----------------------------- TIE-BRAKE ------------------------------------


while ((vita==2) && (vitb==2))
{
aux=0;

set++;
printf ("\nSET DECISIVO (TAILBRAKE) \n\n\n");
printf ("PONTOS DO TIME A \n");
scanf ("%d",&timea);
printf ("PONTOS DO TIME B \n");
scanf ("%d",&timeb);

while (aux==0)
{
if (timea>timeb)
{
if(((timea-timeb)!=2) || (timea<15))
{

if((timea==15) && ((timea-timeb)>=2))
{
aux++;
}
else
{
aux=0;
printf ("\nINVALIDO\n");
printf ("PONTOS DO TIME A \n");
scanf ("%d",&timea);
printf ("PONTOS DO TIME B \n");
scanf ("%d",&timeb);
}

}
else
aux++;

}

if (timeb>timea)
{

{
if(((timeb-timea)!=2) || (timeb<15))
{

if((timeb==15) && ((timeb-timea)>=2))
{
aux++;
}
else
{
aux=0;
printf ("\nINVALIDO\n");
printf ("PONTOS DO TIME A \n");
scanf ("%d",&timea);
printf ("PONTOS DO TIME B \n");
scanf ("%d",&timeb);
}

}
else
aux++;
}

}
}

if(timea>timeb)
vita++;
if(timeb>timea)
vitb++;

}

}

if (vita>vitb)
printf(" \n TIME A VENCE!");
else
printf(" \n TIME B VENCE!");

getch();
}

Edição feita por: Charles GP, 09/06/2008, 11:37.


#2 matt.cavotta

matt.cavotta

    Ativo

  • Usuários
  • 347 posts
  • Sexo:Masculino
  • Localidade:Campinas
  • Interesses:Desenvolvimento Web &amp; Programação

Posted 07/07/2008, 14:48

Olá,

A primeira observação é que seu código está com a lógica incorreta. Ele nunca entrará no Tie-Brake pois o seu primeiro "while" só termina se "vita" e/ou "vitb" forem >= 3.

A dica que eu posso dar é usar funções. Observando seu código podemos ver que várias linhas são repetidas e poderiam ser colocadas em uma única função. Refiz o seu código usando funções e corrigindo o problema que citei acima.

Veja como o uso de funções diminui o tamanho de código e torna o código mais claro:

# include <stdio.h>
# include <conio.h>
int checa_set_normal (int ptoA, int ptoB, int total){
  int tmp;
  if (ptoA < ptoB){
	tmp = ptoA;
	ptoA = ptoB;
	ptoB = tmp;
  }
  return (ptoA == total && ptoA - ptoB >= 2) ||
		 (ptoA >= total && ptoA - ptoB == 2);
}
void le_placar (int *ptoA, int *ptoB){
  printf ("PONTOS DO TIME A \n");
  scanf ("%d",ptoA);
  printf ("PONTOS DO TIME B \n");
  scanf ("%d",ptoB);
}
main (){

  int set,timea,timeb,vita,vitb;

  vita = vitb = 0;

  /* Sets normais */
  set=1;
  while (set < 5 && vita < 3 && vitb < 3){

	printf ("\nSET %d \n\n\n", set++);
	le_placar(&timea, &timeb);

	while (checa_set_normal(timea, timeb, 25) == 0){
	  printf ("\nINVALIDO\n");
	  le_placar(&timea, &timeb);
	}
	if(timea>timeb) vita++;
	else vitb++;
  }
  /* Tie brake */
  if (vita == vitb){
	set++;
	printf ("\nSET DECISIVO (TIE-BRAKE) \n\n\n");
	le_placar(&timea, &timeb);
	while (!checa_set_normal(timea, timeb, 15)){
	  printf ("\nINVALIDO\n");
	  le_placar(&timea, &timeb);
	}
	if(timea>timeb) vita++;
	else vitb++;
  }
	
  if (vita>vitb)
	printf(" \n TIME A VENCE!");
  else
	printf(" \n TIME B VENCE!");

  getch();
}

WebFórum - Equipe de Desenvolvimento - Estagiario

I'm back!
Posted Image Edgy Eft 7.04




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq