Jump to content

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


Biscoito111
 Share

Recommended Posts

Boas pessoal. 😁

Ora cá vai mais uma duvida. 😕

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

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

Tiago Simões

Link to comment
Share on other 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];
            }
        }
    }
}

Não respondo a dúvidas por mensagem.

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

Alguma coisa que queiras perguntar está a vontade.

Ptt

Tiago Simões

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

            }

        }

    }

}

😁

Tiago Simões

Link to comment
Share on other sites

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

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.

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

×
×
  • Create New...

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.