Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
htilil

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

Recommended Posts

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?

 

Compartilhar este post


Link para o post
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?

~~ / ~~

 

 

Editado por AnsiC

Compartilhar este post


Link para o post
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 :/

Editado por htilil
gramática

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

@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?

~~ / ~~

Editado por AnsiC

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×