Ir ao conteúdo

Posts recomendados

Postado

Fala rapaziada,

 

Já estive aqui algumas vezes, alguém pode me auxiliar na lógica deste problema? Eu poderia usar outro vetor para armazenar as 7 esferas e depois que ler, comparar os dois vetores para chegar na saída exemplificada? Se não, qual seria o melhor raciocínio aplicável a esta questão? Abraços.

Screenshot_1.png

  • Amei 1
Postado

@Artivis Sob Só precisa de um vetor. Acrescente o número de estrelas e depois ordene, use algum um algoritmo de ordenação (como o Bubble Sort) ou sort com vector (header algorithm e vector, acho mais fácil assim). Se a entrada tiver 7 ou mais elementos, compare um contador com os valores do vetor na ordem para testar se encontrou todas, p.ex,

 

for(int i = 0; i < 7; i += 1){
    if(A[i] != (i + 1)){
        encontrou = false;

 

  • Curtir 1
Postado

@Artivis Sob

Você pode pegar todas as esferas na entrada, depois ordenar o vetor, após ordenar o vetor verificar se as 7 primeiras são esferas do dragão, enquanto verdade  você imprime se o total for 7 então faz o desejo.

 

Você pode filtrar durante a entrada pegando somente as esferas que estão no intervalo do dragão (1 até 7) quando finalizar as entradas, ordene o vetor, a essa altura sabe quantas esferas existem. A depender do número faça o combinado.

 

Você pode filtrar durante a entrada pegando somente as esferas que estão no intervalo do dragão (1 até 7) e vai ordenando o vetor a cada nova esfera inserida, a essa altura conhece o número de esferas! A depender do número faça o combinado.

 

Como fazer é com você, eu disse o que pode está fazendo.

Dica: Imagine que tem estojo com 7 lugares cada posição identifica o número de estrelas!

  • Curtir 1
Postado

@Midori consegui ordenar o vetor, agora como faço para o cout ser o vetor que contem os numeros <=7 ??

#include <iostream>
using namespace std;
int main() {
int n, b;
cin>>n;

int k[n];

for(int i = 0; i<n; i++){
  cin>>k[i];
}
for(int i = 0; i<n; i++){
  for(int j = i+1; j<n; j++){
    if(k[i] > k[j]){
      b = k[i];
      k[i] = k[j];
      k[j] = b;
    }
  }
}
for(int i = 0; i<n; i++){
  cout<<k[i]<<" "; //saida com o vetor ordenado.
}

}

 

Postado

@Artivis Sob É igual que o se vê no seu comentário, o limite das repetições é 7.

No corpo da repetição existe uma condição falsa: negação.

 

21 horas atrás, Midori disse:

if(A[i] != (i + 1)){ encontrou = false;

Se existe   i de A   diferente de (1,2,3,4,5,6,7) então encontrou recebe falso e o ‘loop’ para.

 

Ao contrário, se nas posições: 0,1,2,3,4,5,6 do vetor tem as respectivas esferas de 1 até 7 estrelas essa decisão é falsa 7 vezes e fluxo de execução não entra no bloco if.

 

5 horas atrás, Artivis Sob disse:

agora como faço para o cout ser o vetor que contem os numeros <=7 ??

Seria o caso de colocar um else para impressão das esferas.

 

Você pode está tentando essa lógica enquanto aguarda explicação de @Artivis Sob

@Midori

Postado

 

4 horas atrás, Artivis Sob disse:

consegui ordenar o vetor, agora como faço para o cout ser o vetor que contem os numeros <=7 ??

Para mostrar os números coloque a condição no último loop, assim poderá comparar cada valor armazenado no vetor ordenado,

 

for(int i = 0; i<n; i++){
    if(k[i] <= 7){
        cout<<k[i]<<" "; //saida com o vetor ordenado.
    }
}

 

Mas se no primeiro loop das entradas só armazenar os valores <= 7, isso não seria preciso, só teria que mostrar os valores.

Postado
37 minutos atrás, Midori disse:

Mas se no primeiro loop das entradas só armazenar os valores <= 7, isso não seria preciso, só teria que mostrar os valores.

Concordo.

Postado

@mauro_b É como você comentou sobre filtrar a entrada, assim o vetor só precisa reservar essa quantidade de elementos: int k[7]. As outras estrelas não precisa colocar no vetor.

  • Curtir 1
Postado

@Midori Meu problema maior ta sendo nos outros exemplos de entrada, como encaixo se os valores nao forem os da esfera?  Não to conseguindo dar o cout dos exemplos 2 e 3 do enunciado 😕

#include <iostream>
using namespace std;
int main() {
int n, b;
cin>>n;

int k[n];
int vet[7] = {1,2,3,4,5,6,7};

for(int i = 0; i<n; i++){
  cin>>k[i];
}
for(int i = 0; i<n; i++){
  for(int j = i+1; j<n; j++){
    if(k[i] > k[j] && k[i] <=7 && k[j] <=7 ){
      b = k[i];
      k[i] = k[j];
      k[j] = b;
    }
  }
}

for(int i = 0; i<n; i++){
  if(k[i] <= 7){
    cout<<k[i]<<" ";
  }
}
cout<<endl; 
cout<<"Saia Shenlong e realize meu desejo";
} 

 

  • Curtir 1
Postado

@Artivis Sob Para colocar no vetor só as esferas corretas, deve entrar com o valor numa variável e depois testar o valor dela para colocar no vetor se for <= 7. Fiz algumas alterações no código, falta imprimir a mensagem com a condição de ter encontrado todas as esferas,

 

#include <iostream>
using namespace std;

int main(){
    int esferas = 0;
    int k[7];
    int n;

    cin >> n;
    
    for(int i = 0; i < n; i += 1){
      	int e;
        cin >> e;
        if(e <= 7){
            k[esferas] = e;
            esferas += 1;
        }
    }
    for(int i = 0; i < esferas; i++){
        for(int j = i + 1; j < esferas; j++){
            if(k[i] > k[j]){
                int b = k[i];
                k[i] = k[j];
                k[j] = b;
            }
        }
    }
    for(int i = 0; i < esferas; i++){
        cout<<k[i]<<" ";
    }
    cout<<endl; 
    cout<<"Saia Shenlong e realize meu desejo";   
    return 0;
}

 

  • Curtir 1
Postado

Outra ideia seria usar o vetor só para marcar se a esfera foi encontrada.

Exemplo em C:

Spoiler

#include <stdio.h>

#define Q_ESFERAS 7

int main(void)
{
    int esferas[Q_ESFERAS];
    int contador, quantidade_esferas = 0, esfera, esferas_pegas = 0;

    /* Inicia as esferas */
    for (contador = 0; contador < Q_ESFERAS; contador++) {
        esferas[contador] = 0;
    }

    /* Pega a quantidade de esferas */
    scanf("%i%*c", &quantidade_esferas);

    /* Pega as esferas */
    for (contador = 0; contador < quantidade_esferas; contador++) {
        scanf("%i%*c", &esfera);
        if (esfera >= 1 && esfera <= 7) {
            esferas[esfera-1] = 1;
        }
    }

    /* Conta a quantidade de esferas pegas */
    for (contador = 0; contador < Q_ESFERAS; contador++) {
        if (esferas[contador]) {
            esferas_pegas++;
        }
    }

    /* Mostra as esferas pegas */
    for (contador = 0; contador < Q_ESFERAS; contador++) {
        if (esferas[contador]) {
            printf("%i ", contador+1);
        }
    }

    if (esferas_pegas == Q_ESFERAS) {
        printf("\nSaia Shenlong e realize o meu desejo\n");
    } else {
        printf("\nNao encontramos todas\n");
    }

    getchar();
    return(0);
}

 

 

  • Curtir 2
Postado
29 minutos atrás, kgin disse:

Outra ideia seria usar o vetor só para marcar se a esfera foi encontrada.

Boa ideia, assim não precisa ordenar e dá para resolver com dois loops,

#include <iostream>
using namespace std;

int main(){
    int esferas = 0;
    int vetor[7] = {0};
    int n;

    cin >> n;
    for(int i = 0; i < n; i += 1){
      	int e;
        cin >> e;
        if(e <= 7){
            vetor[e - 1] = 1;
            esferas += 1;
        }
    }
    for(int i = 0; i < 7; i += 1){
        if(vetor[i]){
            cout << i + 1 << " ";
        }
    }
    if(esferas == 7){
        cout << "\nSaia Shenlong e realize meu desejo\n";   
    }else{
        cout << "\nNao encontramos todas\n";
    }
    return 0;
}

 

  • Curtir 2
Postado
Em 07/05/2021 às 21:08, Midori disse:

ó precisa de um vetor. Acrescente o número de estrelas e depois ordene, use algum um algoritmo de ordenação (como o Bubble Sort) ou sort com vector (header algorithm e vector, acho mais fácil assim)

 

Deve ser de propósito para testar o leitor, mas o enunciado tem muito texto para poucos dados. No fundo você pode considerar algo como um bingo: vai ler umas bolinhas numeradas. Interessa as de 1 a 7. O programa termina de duas maneiras possíveis:

  • ou encontra as sete bolas
  • ou passa por todas as bolas e ao final ainda falta alguma. Ou todas.

Não é preciso ordenar. Pode usar a ordem natural dos índices de um vetor, como a CEF faz com as bolinhas numeradas da loteria. . .

 

Em 07/05/2021 às 21:34, mauro_b disse:

Você pode filtrar durante a entrada pegando somente as esferas que estão no intervalo do dragão (1 até 7) e vai ordenando o vetor a cada nova esfera inserida, a essa altura conhece o número de esferas! A depender do número faça o combinado.

 

Como fazer é com você, eu disse o que pode está fazendo

 

A parte mitológica eu não conhecia. Tem até um dragão! Muito bom.

 

22 horas atrás, Artivis Sob disse:

consegui ordenar o vetor, agora como faço para o cout ser o vetor que contem os numeros <=7 ??

 

cout é ostream, um fluxo. Não pode ser um vetor.

 

16 horas atrás, Artivis Sob disse:

Meu problema maior ta sendo nos outros exemplos de entrada, como encaixo se os valores nao forem os da esfera? 

 

Apenas siga adiante.

 

 

Um Exemplo em C++

 

Há muitas maneiras de fazer isso, claro. Escrevendo em torno dos dados, vou deixar um exemplo, como há vários já propostos.

 

A lógica:

  • usar um único vetor, mas de OITO posições. Assim se pode usar as posições de 1 a N para as N bolas
  • e reservar a posição ZERO para o total
  • e usar o numero da esfera como índice economiza uns ciclos de máquina :) e deixa o programa mais legível
  • evitar testes supérfluos
  • considerar que a última das 1000 bolas pode ser a sétima bolinha para mudar a mensagem
  • usar um vetor com as possíveis mensagens para não repetir um cout a toa. O problema não justifica usar um container, mas claro que se poderia usar vector. Mas se fosse o caso de usar um container claro que o melhor seria set porque as bolas já sairiam na ordem. Se quiser ver um exemplo assim escreva de novo. Mas para um problema assim simples é exagero. Mesmo o unsigned[8] que eu usei podia ser trocado por um char para cada bola e um contador.
  • usar um arquivo como entrada para facilitar os testes (claro que o nome do arquivo deveria ser um argumento na linha de comando)

Eis um exemplo

 

#include <fstream>
#include <iostream>
using namespace std;
using iit = istream_iterator<int>;

int main(void)
{
    ifstream   entrada{ "entrada.txt" };
    iit        inicio{ entrada };
    const char* conclusao[] = {
        "Nao encontramos todas",
        "Saia Shenlong e realize o meu desejo" };
    unsigned N = *inicio++;
    unsigned    esfera[8]{ 0 };
    for (unsigned i = 0; i < N; i += 1)
    {
        int E = *inicio++;
        if (E < 1 || E > 7) continue; // outras bolas
        if (esfera[E] == 0) { esfera[E] = 1; esfera[0] ++; }
        if (esfera[0] == 7) break; // ja achou todas
    };  // for()
    if (esfera[1] != 0) cout << 1 << " ";
    if (esfera[2] != 0) cout << 2 << " ";
    if (esfera[3] != 0) cout << 3 << " ";
    if (esfera[4] != 0) cout << 4 << " ";
    if (esfera[5] != 0) cout << 5 << " ";
    if (esfera[6] != 0) cout << 6 << " ";
    if (esfera[7] != 0) cout << 7 << " ";
    cout << "\n" << conclusao[esfera[0] == 7] << "\n";
    return 0;
};
// fim de esferas.cpp

 

um exemplo usando set:
 

#include <fstream>
#include <iostream>
#include <set>
using namespace std;
using iit = istream_iterator<int>;

int main(void)
{
    ifstream   entrada{ "entrada.txt" };
    iit        inicio{ entrada };
    const char* conclusao[] = {
        "Nao encontramos todas",
        "Saia Shenlong e realize o meu desejo" };
    unsigned N = *inicio++;
    set<int> esferas;
    for (unsigned i = 0; i < N; i += 1)
    {   int E = *inicio++;
        if (E < 1 || E > 7) continue;
        if ( esferas.find(E) == esferas.end() ) esferas.insert(E);
        if ( esferas.size() == 7) break;
    };  // for()
    for (auto E : esferas) cout << E << " ";
    cout << "\n" << conclusao[esferas.size() == 7] << "\n";
    return 0;
};
// fim de esferas2.cpp

 

Não justifica usar um container, mas é possível. Fica mais legível e conceitualmente é melhor que um vetor.

 

Afinal, é um conjunto de bolas e C++ foi criada com essas abstrações em mente.

Postado
1 hora atrás, arfneto disse:

 

A parte mitológica eu não conhecia. Tem até um dragão! Muito bom.

kkkkkkkkkkk Shenlong qualquer pai, tio, qualquer ser humano com criança na vida entende a referência, mas você fica surpreso.

 

 

Minha solução usa a lógica que @Midori  comentou e só muda no ‘kit’ das esferas que uma variável char e manipulada por operações bitwise.

Postado
12 minutos atrás, mauro_b disse:

kkkkkkkkkkk Shenlong qualquer pai, tio, qualquer ser humano que ouvi uma criança falar de Dragon Ball, logo entende a referência, mas você fica surpreso

ih podia perder meu crachá de humano :D mas agora tenho uma chance nova! Bom domingo.

 

14 minutos atrás, mauro_b disse:

Minha solução usa a lógica de @Midori as comentou, só muda o kit das esferas que é uma variável char e operações com bitwise

 

Eu escrevi em torno de um int[8] e de um set, com uns artifícios para facilitar, como expliquei

  • Haha 1
Postado
23 minutos atrás, arfneto disse:

podia perder meu crachá de humano :D mas agora tenho uma chance nova!

Na sua opinião, já eu penso que não tem volta :exorcize:

 

 

shenlong.jpg.7590faaee888e87c149f2286486b01e3.jpg

Saia Shenlong e realize o meu desejo

 

 

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!