Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

i307

Vectores

Mensagens Recomendadas

Localhost

Porque na última chamada a printf estás a fazer indexação com a variável aux e tens de fazer com a variável i que é a que está a percorrer o array.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Não percebi muito bem o que querias dizer no teu último post mas o que importa é que já está a funcionar.

p.s. Tenta melhorar as tuas explicações sobre o teu problema. Ajudas os outros a ajudarem-te :thumbsup:


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
i307

Bem , isto supostamente recebia os valores todos que eram introduzidos e imprimia-os em sequência.

Acontece que está a dar um valor completamente diferente do introduzido. Por isso deve estar alguma coisa a atribuir como aleatorio.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int v[50];
    int n=0;
    int aux=0;
    int i=0;
    int max=0;
    printf("Com quantos numeros deseja trabalhar??");
    scanf("%i",&n);

    do {
        scanf("%i",&v);
        v[aux]=v;
        aux++;

    }

    while(aux < n);


    for (aux=0 ; aux < n;aux++) {

    printf("%i",v[aux]);

    }



}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

scanf("%i",&v);

Aqui não é v, porque isso é um apontador para o 1º elemento do vector. Tens de lhe passar uma posição do vector:

scanf("%i",&v[aux]);

E apagas aquele v[aux]=v.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
i307

Precisava de encontrar o maior e menor numero do vector.

Li algures que uma maneira fácil de o fazer era usando o qsort do C e depois mostrar a 1a e a ultima posição do vector.

Será que é a melhor maneira?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Se não me engano a função qsort tem complexidade O(log N) portanto isso é mais rápido do que percorreres o array todo e ires actualizando uma variável. Este último tem complexidade O(N). No entanto, para usares a função qsort tens de criar uma função que vai fazer a comparação entre dois elementos do array. Isso inclui ponteiros e parece-me que ainda não chegaste a essa parte.

É melhor, percorrer o array com um for e ires actualizando uma variável que vai conter o máximo no final. Dentro do for, comparas a posição actual com a variável que vai conter o máximo. Se a posição actual for maior actualizas se não continuas.

p.s. Se estiver enganado quanto às complexidades que me corrijam sff.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

Pra varrer ou procurar algo num vector não tem muita complexidade. Ordenar é que é !!

Usa o for.

Mas como procuras pelo maior ou menor, primeiro ordenas o vector e depois pesquisas.

Pra ordenar, dizem que o Qsort só é eficiente caso o vector esteje mto desorganizado. Usa o bubblesort, visto o vector não ser tão grande.

tópico editado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
i307

void bubble( int v[], int n )
{
  int i;
  int j;
  int aux;
  int k = n - 1 ;

  for(i = 0; i < n; i++)
  {
     for(j = 0; j < k; j++)
     {
        if(v[j] > v[j+1])
        {
            aux = v[j];
            v[j] = v[j+1];
            v[j+1]=aux;
        }
     }

      }
}

Tenho isto mas está mal. Dá o numero de número de valores introduzidos +1.

Tenho isto numa função aparte portanto acho que deveria ter um return mas não sei a que devo fazer.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Mas o que é que tu queres? Queres ordenar um array ou encontrar o valor minimo e o máximo?

Não precisas de ordenar array nenhum para isso. Além de que o bubble sort é um péssimo algoritmo de ordenação visto que tem complexidade O(n2) no melhor caso.

Se tiveres dúvidas em como encontrar o minimo e o máximo sem ordenar avisa.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

O bubble sort foi dos 1ºs algoritmos pra ordenação. Hoje em dia usa-se mais o Shellsort e o Quicksort, mas não sei se consegues implantar ai um destes.

Localhost, acho que ordenar o vector 1º torna a procura mais fácil. Depois de organizar é só procurar pelo valor na posição zero e na ultima que ele ja tem o maior e o menor.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

O que achas que é mais rápido? O(n2) ou O(n)?

O que estás a sugerir é muito ineficaz. Se forem 1.000.000 de posições imagina quanto tempo vai levar. Mais vale percorrer o array e ir fazendo o que tinha dito alguns posts atrás.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Strabush

O n2 é o mais ineficaz deles todos, ou seja, o bubblesort. Mas no entanto é bom pra ele começar a perceber o mecanismo de ordenação visto o vector não ser muito grande.

Hoje em dia usa-se mais nlog n, Shellsort e Quicksort, o número de comparações é muito inferior logo é mto + rápido.

Mas no entanto cabe ao i307 decidir o que fazer. Eu tenho comigo o código em C das 3 funções de ordenação, pois tenho dado isto na faculdade, posso ir ajudando.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
i307

Pelo que percebi o bubblesort é melhor para vectores pouco desordenados.

Eu queria usar um qualquer. selection sort , insertion sort ou quicksort.

O meu problema é como aplicar.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Já te perguntei isto e estamos a andar à volta de um problema que não existe. O que é que tu queres fazer? Queres ordenar ou descobrir o maior? É inútil ordenar quando podes percorrer e descobrir. Poupas uma função e é muito mais simples.

Se não sabes descobrir o maior queres saber ordenar? Para alguns algoritmos de ordenação como o Selection Sort precisas de saber descobrir o maior. Então é inútil estares a ordenar só para fazer isso.

Deixo-te aqui um pseudo-código de como descobrir o maior:

temp = 0;
percorre todo o array {
  se posActual > temp
    temp = posActual
}


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
i307

Eu estava a pensar implementar o ordenamento para depois obter o maior sem descobrir o maior pela forma mais "simples".

Apenas pondo um printf do v[0].

Mas se uma coisa tem de levar à outra.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Se tu queres perder algum tempo (desnecessário) a aprender algoritmos de ordenação é contigo.

Eu dei-te aí a solução, agora é só implementares.

Existem algoritmos de ordenação em que precisas de trabalhar com memória dinâmica, por isso acho que é completamente desnecessário.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
i307

 for (max=0 ; max < n ;max++) {

        if (v[max] > v[max+1])
        k = v[max];

        else
        k = v[max+1];

    }

n é a variável do número de vezes que o utilizador introduziu números.

Pensei que isto estaria bem mas não está.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.