Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
i307

Vectores

Recommended Posts

i307

Cá estou eu de volta dos vectores.

Alguém me pode explicar porque é que isto não está a imprimir o numero do vector?

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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]);

    }



}

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites
Localhost

É a chamada ao scanf, tens de passar o array com indexação aux


here since 2009

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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á.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.