Biscoito111 Posted March 9, 2008 Report Share Posted March 9, 2008 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 More sharing options...
pedrosorio Posted March 9, 2008 Report Share Posted March 9, 2008 *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 More sharing options...
Biscoito111 Posted March 9, 2008 Author Report Share Posted March 9, 2008 Obrigadao....agr ja da mas ainda tenho de ver o k fizeste para pereceber. Cumprimentos Tiago Simões Link to comment Share on other sites More sharing options...
pedrosorio Posted March 9, 2008 Report Share Posted March 9, 2008 Biscoito111 pergunta qualquer dúvida... (Se calhar devia ter comentado o código). O mais importante é perceber... Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
Biscoito111 Posted March 9, 2008 Author Report Share Posted March 9, 2008 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 More sharing options...
Biscoito111 Posted March 9, 2008 Author Report Share Posted March 9, 2008 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 More sharing options...
pedrosorio Posted March 9, 2008 Report Share Posted March 9, 2008 Hmm... isso funciona no meu... A função não devia receber um apontador para a posição inicial do array nesse caso?... Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
Baderous Posted March 9, 2008 Report Share Posted March 9, 2008 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. Link to comment Share on other sites More sharing options...
Biscoito111 Posted March 9, 2008 Author Report Share Posted March 9, 2008 ou melhor.......o a é que é o apontador para o primeiro elemento do array porque o nome de um array é sempre isso 😁 Tiago Simões Link to comment Share on other sites More sharing options...
Biscoito111 Posted March 9, 2008 Author Report Share Posted March 9, 2008 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 Tiago Simões Link to comment Share on other sites More sharing options...
pedrosorio Posted March 9, 2008 Report Share Posted March 9, 2008 Oh ok =) O meu C está fraquinho. Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
Baderous Posted March 9, 2008 Report Share Posted March 9, 2008 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 More sharing options...
pedrosorio Posted March 9, 2008 Report Share Posted March 9, 2008 Podem-me explicar porque é que o meu código compila e funciona? Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
Biscoito111 Posted March 9, 2008 Author Report Share Posted March 9, 2008 Yah é isso...a minha linguagem tecnica ek n foi a melhor. Tiago Simões Link to comment Share on other sites More sharing options...
Biscoito111 Posted March 9, 2008 Author Report Share Posted March 9, 2008 Nao percebi a pergunta pedrosorio. Nao krias antes perguntar pork ek nao compila??? lol Tiago Simões Link to comment Share on other sites More sharing options...
Baderous Posted March 9, 2008 Report Share Posted March 9, 2008 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 More sharing options...
Biscoito111 Posted March 9, 2008 Author Report Share Posted March 9, 2008 yah isso mesmo Tiago Simões Link to comment Share on other sites More sharing options...
pedrosorio Posted March 9, 2008 Report Share Posted March 9, 2008 ... O código que meti aqui, compila em DevC++, executa e devolve os resultados certos. Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
Biscoito111 Posted March 9, 2008 Author Report Share Posted March 9, 2008 lol. Entao isso é normal se o codigo estiver bem feito é claro k t da resultados certos Tiago Simões Link to comment Share on other sites More sharing options...
pedrosorio Posted March 9, 2008 Report Share Posted March 9, 2008 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? Não respondo a dúvidas por mensagem. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now