Ir ao conteúdo
  • Cadastre-se
Lucas Da Silva Aleixo

VisualG Colocar vetor em ordem crescente

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

×