Ir ao conteúdo
  • Cadastre-se

C++ Não consigo terminar o programa - C++


htilil
Ir à solução Resolvido por Ansi C,

Posts recomendados

Olá pessoal, sou iniciante em c++ e esse programa que eu vou descrever precisa ser feito sem vetor, mais abaixo está o código que eu desenvolvi.

Há uma competição de arremesso de pedras, cada competidor arremessa duas pedras; ambas tem que ser arremessadas a pelo menos 10m de distancia, do contrario, o competidor estará desclassificado. Ganha a competição quem arremessar as duas pedras o mais próximo possível uma da outra e a saída será o número do competidor vencedor, sendo que o primeiro competidor recebe 0 e se nenhum competidor conseguir arremessar as duas pedras a pelo menos 10m, imprimir "sem ganhador".

#include <iostream>
using namespace std;

int main(){
  //n = numero de competidores, a e b = primeira e segunda pedra
  //d = distancia, i = contador, menor = para caulcular a menor distancia
  //aux = variavel auxiliar para guardar a posição do contador
  int n, a, b, d, i=0, menor=0, aux=0;
  cin >> n;
  
  while(i<n){
    cin >> a >> b;
    if(a>=10 && b>=10){
      if(a>b){
        d=a-b;
        //se a variavel que armazena a menor distancia não foi calculada ainda,
        //então a distancia que esta sendo calculada no momento será armazenada
        //em "menor", e a variavel auxiliar vai armazenar a posição do
        //competidor
        if(menor==0){
          menor=d;
          aux=i;
          //se algum valor ja foi armazenado em "menor", temos que checar se a
          //distancia que esta sendo calculada é menor que a distancia armazenada
          //em menor
        }else if(menor!=0 && d<menor){
          menor=d;
          aux=i;
        }
      }else{
        d=b-a;
        if(menor==0){
          menor=d;
          aux=i;
        }else if(menor!=0 && d<menor){
          menor=d;
          aux=i;
        }
      }
      //se a ou b, ou mesmo a e b forem menores que 10, o contador parte para o próximo
      //competidor
    }else{
      i++;
    }
    i++;
  }
  if(???){
    cout << "sem ganhador";
  }else{
    cout << aux;
  }
}

??? - eu não sei exatamente qual condição devo colocar aqui

E aí, como faz?

 

Link para o comentário
Compartilhar em outros sites

@htilil, oi cara!

Cara, então só existe uma vencedor ou ninguém ganha. A variável aux ficaria com 0 se ninguém chegar no mínimo 10 metros.

6 horas atrás, htilil disse:

ambas tem que ser arremessadas a pelo menos 10m de distancia

 

vence aquele entre os que alcançaram 10 metros ou + em cada arremesso cujo diferença entre arremessos é o menor.

Vejamos:

  //n = numero de competidores, a e b = primeira e segunda pedra
  //d = distancia, i = contador, menor = para caulcular a menor distancia
  //aux = variavel auxiliar para guardar a posição do contador
  int n, a, b, d, i=0, menor=0, aux=0;
  cin >> n;

Comentário: entendi que aux  vai guarda a posição do atual vencedor. Se sim então melhor nome para ela seria vencedor. Outra coisa, já que queremos para menor o menor valor então não inicie com menor valor, inicie com maior que poderes pensar.

 

 

    cin >> a >> b;
    if(a>=10 && b>=10){
      if(a>b){
        d=a-b;
        //se a variavel que armazena a menor distancia não foi calculada ainda,
        //então a distancia que esta sendo calculada no momento será armazenada
        //em "menor", e a variavel auxiliar vai armazenar a posição do
        //competidor
        if(menor==0){
          menor=d;
          aux=i;
          //se algum valor ja foi armazenado em "menor", temos que checar se a
          //distancia que esta sendo calculada é menor que a distancia armazenada
          //em menor
        }else if(menor!=0 && d<menor){
          menor=d;
          aux=i;
        }

Comentário: entra-se com dois arremessos se verifica atender a necessidade classificatório de no mínimo 10 metros. Daí se Sim então testa se a é maior que b, hum?? Nesse momento do algoritmo estaria calculando o absoluto da diferença de a e b,  dos arremessos classificados desse jeito: d = a - b, se d < 0 então d = -d. Por última comparar com menor já registrado desse jeito: d < menor, então menor = d, e vencedor = i + 1. Por que i + 1? Porque as posições no índice se inicia do 0, daí ter que somar mais 1 para o usuário.

 

 

  if(???){
    cout << "sem ganhador";
  }else{
    cout << aux;
  }

Comentário: Se ninguém alcançou o mínimo de 10 metros em cada arremesso então a variável vencedor ou aux tem 0 de valor, caso contrário tem a posição do vencedor daí e só reescrever o declaração assim com base nisso, desse jeito:

  if(aux){
        cout << aux;
  }
  else{
    	cout << "sem ganhador";
  }

 

Daí fica certo?

~~ / ~~

 

 

Link para o comentário
Compartilhar em outros sites

@AnsiC, primeiramente, valeu pela ajuda!

Então cara, eu fiz as mudanças que você recomendou, tipo trocar aux por vencedor; só que a posição do primeiro competidor precisa ser 0, então se ele ganhar, vai ter que imprimir 0 na tela.

Mesmo assim segui teu conselho para ver se funcionava, o código ficou assim:

#include <iostream>
using namespace std;

int main(){
    int n, a, b, d=0, i=0, menor=9999, vencedor=0;
    cin >> n;

    while(i<n){
        cin >> a >> b;
        if(a>=10 && b>=10){
            d=a-b;
            if(d<0){
                d=-d;
                if(d<menor){
                    menor=d;
                    vencedor=i+1;
                }
            }else{
                d=d;
                if(d<menor){
                    menor=d;
                    vencedor=i+1;
                }
            }
        }else{
            i++;
        }
        i++;
    }

    if(vencedor==0){
        cout << "sem ganhador";
    }else{
        cout << vencedor;
    }
}

Testando o código, ele dá certo quando as duas pedras são maiores que 10, mas quando uma das duas é menor que 10, ele já sai do while e imprime "sem ganhador";

Exemplo:

Entrada

2

10 12

10  11

Saída

2

 

Que, de acordo com o código, está certo mesmo, agora:

Entrada

2

9 10

Saída

sem ganhador

 

Daí eu fiquei sem entender, ao invés de acrescentar 1 ao contador e pedir a entrada das pedras de novo, ele saiu do laço :/

Link para o comentário
Compartilhar em outros sites

  • Solução

@htililVejamos:

int n, a, b, d=0, i=0, menor=9999, vencedor=0;
cin >> n;

while(i<n){
  cin >> a >> b;
  if(a>=10 && b>=10){
    d=a-b;

Comentário:

A variável menor tem o maior valor possível o que nos garante sempre o menor sem testa se está vazio, CERTO!

Variável vencedor, CERTO.

Daí o usuário entre com número de competidores e começa as entradas: Só passa no IF quem tem as condições ideias da competição, CERTO. E quem não ELSE: 

}else{
i++;
}
i++;

Aqui está um problema, pois o variável i que é a contadora de competidores vai incrementar 2 vezes (1- por conta do else do if, e 2- por conta do laço natura do loop). Para corrigir isso é só apagar o else{ i ++; } do código essa ta sobrando na lógica. Pois o i++ do laço deve sempre ser incrementado independente da classificação dos competidores. Fica apenas o ultimo i++; o do else apaga junto.

 

 

d=a-b;
if(d<0){
  d=-d;
  if(d<menor){
    menor=d;
    vencedor=i+1;
  }
}else{
  d=d;
  if(d<menor){
    menor=d;
    vencedor=i+1;
  }

Comentário: Aqui temos a distância sendo calculada certo, Opa!!! percebe que o bloco if(d<0) é praticamente igual ao bloco else, casos assim isolamos a que á de diferente pois ele é o de menos, casos de denominador comum, assim sendo o diferente é apenas o absoluto que pode ficar com simples cláusula  if de uma linha, desse jeito:

if(d < 0) d = -d;

somente isso, depois disso testa d e menor da maneira correta que está. No final dessa parte lógica eliminou-se mais uma cláusula else complicante. Não estava errado, só fizemos encolher o código nesse ponto. O erro era o else do IF que verifica os lançamentos.

 

 

Ficou de boa?

~~ / ~~

Link para o comentário
Compartilhar em outros sites

@AnsiC, valeu mesmo, cara! Deu certinho aqui! 

#include <iostream>
using namespace std;

int main(){
    int n, a, b, d=0, i=0, menor=99999, vencedor=0;
    cin >> n;

    while(i<n){
        cin >> a >> b;
        if(a>=10 && b>=10){
            d=a-b;
            if(d<0) d=-d;
            if(d<menor){
                menor=d;
                vencedor=i;
            }

        }
    i++;
    }

    if(d==0){
        cout << "sem ganhador";
    }else{
        cout << vencedor;
    }
}

No caso, eu fiz as alterações que você sugeriu, e como o primeiro jogador recebe 0, eu coloquei d==0 como condição no ultimo if, pois caso todos os competidores sejam desclassificados, a distancia vai continuar com o valor inicial, que é 0.

Mais uma vez, obrigado!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...