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

Biscoito111

Resolver exercício para encontrar os dois máximos de um array em linguagem C.

27 mensagens neste tópico

Boas pessoal. :biggrin:

Ora cá vai mais uma duvida. :confused:

Este problema já o tenho tentado resolver ha alguns dias até hoje e por mais que tente não consigo resolver, vai ter que ser na aula práctica de terça-feira mas até lá já gostava de saber.

Há alguem que me possa explicar um bom método para resolver este problema.

Tenho o meu código a baixo mas imprime mal os valores, o segundo máximo dá-me mal, devia dar 15 e dá-me 11(no exemplo do meu array).

O meu prof disse para tentarmos fazer em casa só com um for porque dá e eu nem com 3 consigo lol.

Lembro que só dei matéria até ponteiros e o meu compilador é o Microsoft Visual Basic 2003.

Es te problema pode parecer muito fácil na leitura mas na verdade não é assim mt facil.

Obrigado pelo que me possam ajudar... :cheesygrin:

7. Desenvolva uma função,

void procura_dupla(int a[], int tam, int *prim, int *seg);

que encontre os dois maiores elementos de um array. A função recebe, como argumentos, o nome

e a dimensão do array, e os ponteiros para as variáveis onde os dois maiores elementos devem ser

armazenados.

#include<stdio.h>

#define T 10

void procura_dupla(int a[], int tam, int *prim, int *seg);

void main()

{

int tab[T]={2,15,6,8,12,40,7,-1,-4,11};

int prim,seg;

procura_dupla(tab,T,&prim,&seg);

printf("-->%d\n\n-->%d\n",prim,seg);

}

void procura_dupla(int a[], int tam, int *prim, int *seg)

{

int pos=0,i,dif=0,cont=0,j=0;

*prim=*a;

for(i=0;i<tam;i++)

{

if(*(a+i)>*prim)

{

*prim=*(a+i);

pos=i;

}

}

*seg=*(a+pos+1);

j=tam-pos;

                                         for(i=1;i<j;i++)

{

if(*(a+pos+i)>*seg)

{

*seg=*(a+pos+i);

}

cont++;

}

for(i=-1;i>tam-cont-1;i--)

{

if(*(a+pos+i)>*seg)

{

*seg=*(a+pos+i);

}

}

}

Se não perceberem algo perguntem

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

*prim e *seg têm valores atribuídos à partida. Não podes começar a comparar com esses valores que não sabes quais são. O meu código pode não ser o mais elegante mas dá uma vista de olhos:

void procura_dupla(int a[], int tam, int *prim, int *seg)
{
    int maiorQ=0, segundoQ=0, itera;
    for(itera=0;itera<tam;itera+=1) {
        if (!maiorQ) {
            maiorQ=1;
            *prim=a[itera];
        }
        else {
            if (a[itera]>*prim) {
                *seg=*prim;
                segundoQ=1;
                *prim=a[itera];
            }
            else {
                if (!segundoQ) {
                    segundoQ=1;
                    *seg=a[itera];
                }
                else {
                    if (a[itera]>*seg) {
                        *seg=a[itera];
                    }
                }
            }
        }
    }
}

O primeiroQ e segundoQ servem para saber se já foram atribuídos valores a *prim e a *seg. Outra maneira, mais simples de o fazer, seria atribuir o maior entre a[0] e a[1] a *prim e o menor a *seg e depois iterar o array começando em a[2].

Ok, fica aqui a versão mais curtinha e bonitinha:

void procura_dupla(int a[], int tam, int *prim, int *seg)
{
    int itera;
    if (a[0]>a[1]) { 
        *prim=a[0];  
        *seg=a[1];   
    }
    else {
        *seg=a[0];
        *prim=a[1];
    }        
    for(itera=2;itera<tam;itera+=1) {
        if (a[itera]>*prim) {
            *seg=*prim;
            *prim=a[itera];
        }
        else {
            if (a[itera]>*seg) {
                *seg=a[itera];
            }
        }
    }
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigadao....agr ja da mas ainda tenho de ver o k fizeste para pereceber.

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Biscoito111 pergunta qualquer dúvida... (Se calhar devia ter comentado o código). O mais importante é perceber...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim eu já percebi...tive até agora a ver e já percebi tudo.

Fizeste tudo muito mais simples e funciona perfeitamente com numeors negativos,postivos,com tudo o que ja experimentei para ver se o codigo estava universal.

Está excelente....obrigado mesmo.

Já sei...quando tiver duvidas o alvo para o esclarecimento és tu  :cheesygrin:

Alguma coisa que queiras perguntar está a vontade.

Ptt

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu só alterei umas coisas no teu código, ek eu n posso aceder ao array pelo metodo normal sem ponteiros,

tem de ser com ponteiros.

olha ve la...funciona a mesma como é obvio, so k tenho mesmo de usar tudo com ponteiros.

void procura_dupla(int a[], int tam, int *prim, int *seg)

{

    int i;

    if (*(a+0)>*(a+1)) {

        *prim=*(a+0); 

        *seg=*(a+1); 

    }

    else {

        *seg=*(a+0);

        *prim=*(a+1);

    }       

    for(i=2;i<tam;i++) {

        if (*(a+i)>*prim) {

            *seg=*prim;

            *prim=*(a+i);

        }

        else {

            if (*(a+i)>*seg) {

                *seg=*(a+i);

            }

        }

    }

}

:cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm... isso funciona no meu... A função não devia receber um apontador para a posição inicial do array nesse caso?...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm... isso funciona no meu... A função não devia receber um apontador para a posição inicial do array nesse caso?...

O a[] é o apontador para a posição inicial do array.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ou melhor.......o a é que é o apontador para o primeiro elemento do array porque o nome de um array é sempre isso :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A função nao necessita de receber um ponteiro para o inicio do array, basta receber o array a[ ] e depois dentro da funcao ek se mexe

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ou melhor.......o a é que é o apontador para o primeiro elemento do array porque o nome de um array é sempre isso :thumbsup:

A função nao necessita de receber um ponteiro para o inicio do array, basta receber o array a[ ] e depois dentro da funcao ek se mexe

Estás a contradizer-te. O que passas à função não é o array, mas sim o apontador para a primeira posição do array. Como os elementos do array estão em posições consecutivas em memória, podes acedê-los a partir da primeira posição utilizando apontadores.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podem-me explicar porque é que o meu código compila e funciona?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Yah é isso...a minha linguagem tecnica ek n foi a melhor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nao percebi a pergunta pedrosorio.

Nao krias antes perguntar pork ek nao compila???

lol

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podem-me explicar porque é que o meu código compila e funciona?

Se a tua dúvida reside na forma como acedes ao array, ficas a saber que:

Se v for um vector ou um apontador para o primeiro elemento de um vector, então para obter o elemento íncide n desse vector pode-se fazer v[n] ou *(v+n).
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

... O código que meti aqui, compila em DevC++, executa e devolve os resultados certos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lol.

Entao isso é normal se o codigo estiver bem feito é claro k t da resultados certos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tch... Estou mesmo malzinho em C... Portanto funciona devido à forma como a linguagem está construída... Estou a perceber... Se eu tiver um apontador para um inteiro c, e fizer c[1] o que acontece?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso nao faz nada pork se c é um inteiro e nao um array, entao c[1] so fazia algo se o teu c fosse um array e assim

acedia à segunda posição do array a começar do um.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tch... Estou mesmo malzinho em C... Portanto funciona devido à forma como a linguagem está construída... Estou a perceber... Se eu tiver um apontador para um inteiro c, e fizer c[1] o que acontece?

Dá erro a não ser que c seja um vector.

0

Partilhar esta mensagem


Link 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