Ir ao conteúdo

Posts recomendados

Postado

Preciso de um algoritmo que escreva o vetor em ordem crescente e caso possível impedir que sejam gerados vetores iguais. Segue o código:

algoritmo "semnome"
// Função :
// Autor :
// Data : 11/07/2018
// Seção de Declarações 
var
  n :vetor [1..6] de inteiro
  x :inteiro
inicio
  para x de 1 ate 10 faca
    n[1] := randi(60)
    n[2] := randi(60)
    n[3] := randi(60)
    n[4] := randi(60)
    n[5] := randi(60)
    n[6] := randi(60)
    
  enquanto (n[1] = 0) ou (n[2] = 0) ou (n[3] = 0) ou (n[4] = 0) ou (n[5] = 0) ou (n[6] = 0) ou (n[1] = n[2]) ou (n[1] = n[3]) ou (n[1] = n[4]) ou (n[1] = n[5]) ou (n[1] = n[6]) ou (n[2] = n[1]) ou (n[2] = n[3]) ou (n[2] = n[4]) ou (n[2] = n[5]) ou (n[2] = n[6]) ou (n[3] = n[1]) ou (n[3] = n[2]) ou (n[3] = n[4]) ou (n[3] = n[5]) ou (n[3] = n[6]) ou (n[4] = n[1]) ou (n[4] = n[2]) ou (n[4] = n[3]) ou (n[4] = n[5]) ou (n[4] = n[6]) ou (n[5] = n[1]) ou (n[5] = n[2]) ou (n[5] = n[3]) ou (n[5] = n[4]) ou (n[5] = n[6]) ou (n[6] = n[1]) ou (n[6] = n[2]) ou (n[6] = n[3]) ou (n[6] = n[4]) ou (n[6] = n[5]) faca
    n[1] := randi(60)
    n[2] := randi(60)
    n[3] := randi(60)
    n[4] := randi(60)
    n[5] := randi(60)
    n[6] := randi(60)
  fimenquanto
  
    escreval(x, ".", n[1], " - ", n[2], " - ", n[3], " - ", n[4], " - ",n[5], " - ", n[6])
    escreval("")
  fimpara
fimalgoritmo

O QUE JÁ CONSEGUI FAZER:

- Impedir que o número gerado seja 0.

- Impedir que os números no mesmo vetor se repitam.

 

O QUE GOSTARIA DE FAZER:

- Escrever o vetor gerado em ordem crescente.

- Caso possível: Impedir que sejam gerados vetores iguais.

 

Exemplificando:

- Vetor Gerado:

n[1] = 34

n[2] = 23

n[3] = 2

n[4] = 54

n[5] = 53

n[6] = 25

 

Saída:

 

1. 34 - 23 - 2 - 54 - 53 - 25

 

Como gostaria: 

 

1. 2 - 23 - 25 - 34 - 53 - 54

 

E caso possível fazer com que os vetores gerados não se repitam.

 

Se puderem ajudar agradeço.

 

  • Amei 1
Postado

@Lucas Da Silva Aleixo    para ele não gerar número zero você pode colocar isso no comando randi assim :

n[x] := randi(60)+1

assim ele vai gerar números de 1 até 60 , e para não gerar números repetidos você precisa usar um laço de repetição que pode ser o repita de modo que após ser gerado um número ele verifica no vetor se o número já existe e em caso afirmativo ele repete e gera outro número , assim não haverá números repetidos  , e para organizar em ordem crescente você precisa usar um método de ordenação de vetores , e o mais fácil de usar é o método sound of sorting ,  então seu código com algumas modificações pode ser assim  :

algoritmo "ordem crescente"
var
  n :vetor [1..6] de inteiro
  x,y,k,flag,aux :inteiro
inicio
  escreval("10 Cartões Da MegaSena Em Ordem Crecente")
  escreval
  para x de 1 ate 10 faca
    repita
      flag := 0 // controla o repita
      para y de 1 ate 6 faca
        n[y] := randi(60) + 1   // gera o número
        para k de 1 ate 6 faca
          se (n[k] = n[y])e(k <> y) ENTÃO// verifica se o número já existe
            flag := 1  // para repetir se número já existir 
            interrompa  // iterrompe o fluxo do programa pulando os dois próximos fimpara
          fimse
        fimpara
      fimpara
    ate flag = 0 // repete se flag diferente de zero 
    para k de 1 ate 5 faca   
      para y de k+1 ate 6 faca // para colocar em ordem crescente
        se n[k] >  n[y] ENTÃO  // verifica qual número é maior
           aux  := n[k]        // preserva o número que está nessa posição do vetor
           n[k] := n[y]        // passa o número menor para a posição anterior
           n[y] :=  aux        // coloca o número maior na posição posterior
        fimse
      fimpara
    fimpara
    se x < 10 ENTÃO
      escreva(" ",x,". ")// esvreve o início da linha
    senao
      escreva(x,".")
    fimse
    para k de 1 ate 6 faca
      se n[k] < 10 ENTÃO
        escreva(" ",n[k])// escreve o restante da linha
        se k<6 ENTÃO
          escreva(" - ")// imprime um traço entre os números
        fimse
      senao
        escreva(n[k])
        se k<6 ENTÃO
          escreva(" - ")
        fimse
      fimse
    fimpara
    escreval
  fimpara
fimalgoritmo

 

  • Curtir 1
  • Membro VIP
Postado

Só alguns adendos construtivos para tentar deixar mais claro os conceitos, especialmente para outros possíveis leitores menos experientes:

 

 

1#

9 horas atrás, devair1010 disse:

@Lucas Da Silva Aleixo    para ele não gerar número zero você pode colocar isso no comando randi assim :


n[x] := randi(60)+1

O "+1" não está sendo colocado no randi(), no caso, estará criando "uma expressão", ou seja, recebe um valor aleatório de 0 a N-1, e adiciona 1 a resposta, logo:

 

9 horas atrás, devair1010 disse:

...ele vai gerar números de 1 até 60 [...]

na verdade seria: "vai resultar em número na faixa 1 a 60", ou seja, o randi() gerará números na faixa de 0 a 59, mas o resultado é que será de 1 a 60.

 

Resumindo:

Se fosse perguntado: "nessa linha do código, o randi() está gerando número de que faixa?".  A resposta deverá ser de 0 a 59!

 

Agora se a pergunta for: " nessa linha, está gerando números de que faixa no vetor?". Aí sim seria de 1 a 60.

 

 

 

2#

9 horas atrás, devair1010 disse:

e o mais fácil de usar é o método sound of sorting

@devair1010, não consegui encontrar boas referências sobre esse método Sound of Sorting, se puder passar um link sobre o algoritmo, agradeceria.

 

Mas pelo pouco que achei, acho que seria "apenas" uma forma demonstrar um algoritmo de ordenação qualquer, ou seja, uma representação sonora das etapas ordenação. Tipo, algo como pegar o Insert Sort e a cada troca, ir tocando sons com frequência relacionadas...

 

Em fim... creio que que esse código:

9 horas atrás, devair1010 disse:

    para k de 1 ate 5 faca   
      para y de k+1 ate 6 faca // para colocar em ordem crescente
        se n[k] >  n[y] ENTÃO  // verifica qual número é maior
           aux  := n[k]        // preserva o número que está nessa posição do vetor
           n[k] := n[y]        // passa o número menor para a posição anterior
           n[y] :=  aux        // coloca o número maior na posição posterior
        fimse
      fimpara
    fimpara

Se trataria meio que uma variante algoritmo do Bubble Sort, ou seja, o código é muito parecido, mas é bem diferente em conceito... No Bubble, as trocas são feitas com posições adjacentes... as verificações vão flutuando em uma direção, como uma "bolha que a cada loop vai levando o maior número para o final do vetor".  Vejam:

 

Bubble-sort-example-300px.gif

Imagem do Wikipedia em inglês.

 

Já esse código usado, apesar do código ser parecido, tem a característica de "a cada loop, deixar uma posição ordenada", ou seja, vai sempre comparando o valor da posição que quer ordenar, com as outras...

 

Obs. 1: é comum achar lugares que chamam esse código de Bubble Sort, mas como citado, não é! Inclusive o próprio Wikipedia cometia esse erro quando tinha código para as linguagens específicas, ou seja, algo como em Java certo, mas em Pascal errado... aí, editaram e deixaram apenas o "pseudo código".

 

Obs. 2: existem variantes do Bubbgle Sort, mas observem que a essência se mantém: a comparação com o adjacente.

 

 

 

3#

Um pequeno detalhe:

11 horas atrás, devair1010 disse:

interrompa  // iterrompe o fluxo do programa pulando os dois próximos fimpara

 

Na verdade, só age no para interno, ou seja, seria algo como "//interrompe o fluxo do para, indo para próximo linha após o respectivo fimPara.", ou seja, só "pula um". O k ficará com o valor do que estava no loop.

 

O que acontece, é que a próxima instrução também é um fimPara... (mas isso é apenas uma coincidência, poderia ter outras instrução dentro do para externo). Que por sua vez será executada, continuando o ciclo do para externo (ou atualiza o y OU finaliza o laço de repetição, caso o y já possua o valor máximo).

 

 

 

4#

Em relação as variáveis de controle lá nos para, sugeriria usar x, i e j... seguindo um padrão... Ficando algo como:

   para i de 1 ate 5 faca
      para j de i+1 ate 6 faca // para colocar em ordem crescente

 

Ou, o k ficaria lá no primeiro para, e usaria x e y para os para que ficam um dentro do outro.

 

 

 

5#

Sobre:

11 horas atrás, devair1010 disse:

    se x < 10 ENTÃO
      escreva(" ",x,". ")// esvreve o início da linha
    senao
      escreva(x,".")
    fimse

 

Podem substituir por algo assim:

 escreva(x:2,".")

 

 

 

6#

Sobre:

   para k de 1 ate 6 faca
      se n[k] < 10 ENTÃO
         escreva(" ",n[k])// escreve o restante da linha
         se k<6 ENTÃO
            escreva(" - ")// imprime um traço entre os números
         fimse
      senao
         escreva(n[k])
         se k<6 ENTÃO
            escreva(" - ")
         fimse
      fimse
   fimpara

Poderia ficar com algo assim:

      para k de 1 ate 6 faca
         se n[k] < 10 ENTÃO
            escreva(" ",n[k])// escreve o restante da linha
         senao
            escreva(n[k])
         fimse
         se k<6 ENTÃO
            escreva(" - ")
         fimse
      fimpara

ou seguindo a mesma lógica:

      para k de 1 ate 6 faca
         escreva(n[k]:2)
         se k<6 ENTÃO
            escreva(" - ")
         fimse
      fimpara

 

 

 

***

 

Por ai vai.

 

 

 

  • Curtir 1

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