Ir ao conteúdo
  • Cadastre-se

Ajuda com Ponteiros


nexus.tecinfo

Posts recomendados

Bom dia galera conectada, estou precisando de uma ajuda de vocês, neste exercicio

ler 10 numeros e por meio de uma função ordenando-os de forma crescente atraves de ponteiros.

fiz assim mais não da certo


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


int main (){
int *p1,*p2,*p3,*p4,*p5,*p6,*p7,*p8,*p9,*p10;
int n1,n2,n3,n4,n5,n6,n7,n8,n9,n10;

printf("\nDigite 10 valores: ");
scanf("%d%d%d%d%d%d%d%d%d%d",&n1,&n2,&n3,&n4,&n5,&n6,&n7,&n8,&n9,&n10);


printf("\nResultado: %d%d%d%d%d%d%d%d%d%d\n",*p1,*p2,*p3,*p4,*p5,*p6,*p7,*p8,*p9,*p10);
system("pause");


}

Link para o comentário
Compartilhar em outros sites

Uhmmm acho que posso te da uma ideia de como fazer isso com vetor:

Pra começar


#include <stdio.h>
int main ()
{
int n[9], i, j, tmp;
int *p;
p = n;
printf ("Digite os 10 valores: \n");
for (i=0;i<10;i++) scanf("%d%*c", &n[i]);
...

Bem, acho que isso ja da pra você ter uma ideia do que tem que fazer agora para terminar, é só fazer um outro FOR para comparar os números e deixá-los em ordem crescente. Não lembro muito bem como ordena :P, mas o que lembro é que você pode usar 2 FOR, e para comparar, use por exemplo:


p[0] < p[1]

As variáveis : i e j eu coloquei para usar os 2 for e a variável tmp coloquei para que, depois da comparação entre os valores, trocá-los e colocar em ordem crescente =D

Edit:

Amigo, não precisa usar 2 for para fazer a comparação na ordem crescente :P. Há vários jeitos de fazer, usando 2 for, usando um DO-WHILE, e muitos outros! Eu fiz o que disse ai em cima e usei um DO-WHILE para ordenar =D

Link para o comentário
Compartilhar em outros sites

Não seria mais pratico você criar um vetor de ponteiros tipo int, e então usar um for pra varrer cada valor, e ir associando cada valor digitado ao ponteiro correspondente?

Depois disso pronto, quanto a ordenação, aconselharia criar uma variavel auxiliar, e ir fazendo assim :

se o recebimento fosse : 1 3 2 4 5 7 6 8 9 0

você faria o seguinte : você compara 1 com 3(o primeiro com o segundo elemento) e vê que 3 é maior que 1, então não altera. Depois você vê se 2 é maior que 3. Como não é, você coloca o valor 2 na variavel auxiliar, e coloca o valor 3 no lugar de dois e o valor dessa auxiliar(que terá o valor de 2) e colocará no lugar de trÊs. E assim sucessivamente. Como dessa forma, acredito eu, seja necessaria mais de uma "varrida" no vetor, você poderia criar uma variavel "verificador" e inicializa-la com 1. Quando o vetor mudar alguma posição, você muda o valor dessa variavel para 0, o que indicará ao laço de repetição que deve repetir a ação. Sempre que o vetor for percorrido de novo, você deve renovar esse valor 1. Chegará uma hora que não será necessaria mais a mudança, e então o vetor ficará ordenado

OBS: Na teoria e no português claro é simples, agora como implementar isso em codigo??

int main()
{
int verificador=1, *vetor[10], i, aux;
for(i=1; i<=10; i++)
{
printf("\ndigite o %d termo : ", i);
scanf("%d", vetor[i]);
}
while(verificador==1)
{
for(i=0; i<9; i++)
{
if(vetor[i+1]<vetor[i])
{
aux=vetor[i]
vetor[i]=vetor[i+1]
vetor[i+1]=aux;
verificador=0;
}
}
}
}

É claro que meu codigo tem alguns erros, mas a base é mais ou menos essa. Cuidado para não se embolar nas chaves. kkk

Valeu filhote, até

Link para o comentário
Compartilhar em outros sites

Eu fiz usando um DO-WHILE, e não usei uma função TROCA, mas se você quiser pode usar sim uma função de troca ^^.E claro, nessa função troca, será usado ponteiros para alterar as variáveis da função MAIN =D. seria algo assim:


void troca (int*, int*);
void troca (int* a, int*
{
int tmp;
tmp = *a;
*a = *b;
b* = tmp;
}

=D

Link para o comentário
Compartilhar em outros sites

Hahaha :P. Vamo la amigo...Eu fiz, como ja disse, usando um DO-WHILE.

Neste DO-WHILE tem somente 1 for ele é assim:


for (i=0; i<9;i++)
{
if (p[i] > p[i+1])
{
j = 1;
troca(&p[i], &p[i+1]);
}
}

Usando a função "troca()" xD

Edit: O uso da variável j é para a ordenação, o uso dela é no WHILE.

Assim, no começo do DO-WHILE eu coloquei j=0 e se der para trocar algum numero então j = 1 e no fim do DO-WHILE no WHILE eu deixei while (j)

Lembrando que 1 é VERDADEIRO e 0 é FALSO

ou seja o WHILE quer dizer : enquanto j for verdadeiro ou seja, 1.

Link para o comentário
Compartilhar em outros sites

cuccate, estou tentando desta forma, da uma sacada ae, mesmo assim esta dando erro, não aparece o resultado.


#include <stdio.h>
#include <stdlib.h>
int main ()
{
int n[10],i, aux;
int *p;
p = n;

for (i=0;i<10;i++)
{
printf ("Digite os os valores: \n");
scanf("%d%*c", &n[i]);
}
if (p[0] < p[1]);
printf("\nResultado: %d\n",p[i]);
aux=p[i];
p[i]=p[i+1];
p[i+1]=aux;

return 0;
}

Link para o comentário
Compartilhar em outros sites

cuccate, estou tentando desta forma, da uma sacada ae, mesmo assim esta dando erro, não aparece o resultado.


#include <stdio.h>
#include <stdlib.h>
int main ()
{
int n[10],i, aux;
int *p;
p = n;

for (i=0;i<10;i++)
{
printf ("Digite os os valores: \n");
scanf("%d%*c", &n[i]);
}
if (p[0] < p[1]);
printf("\nResultado: %d\n",p[i]);
aux=p[i];
p[i]=p[i+1];
p[i+1]=aux;

return 0;
}

Sim, desse jeito não vai funcionar mesmo! Desse jeito que você está fazendo, teria de usar 2 for e ainda ja que você quer ordem crescente então é:


...
if (p[i] [b]>[/b] p[i+1])
...

Edit: Você colocou p[0] < p[1] isso está errado x.x'

Link para o comentário
Compartilhar em outros sites

cara vou pirar,

fiz o outro for como falou


#include <stdio.h>
#include <stdlib.h>
int main ()
{
int n[10],i,j, aux;
int *p;
p = n;

for (i=0;i<10;i++)
{
printf ("Digite os os valores: \n");
scanf("%d", &n[i]);
}
if (p[i] > p[i+1]);
printf("\nResultado: %d\n",p[i]);
for (j=0;j<10;j++)
aux=p[i];
p[i]=p[i+1];
p[i+1]=aux;

return 0;
}

Link para o comentário
Compartilhar em outros sites

Como eu disse amigo, desse modo que você ta fazendo, vai precisar usar 2 for eu fiz usando 1 for porque usei um DO-WHILE assim:


do
{
j =0;
for (i=0; i< 9;i++)
{
if (p[i] > p[i+1])
{
j=1;
tmp = p[i];
p[i] = p[i+1];
p[i+1] = tmp;
}
}
}while (j);

O while(j); você também pode substituir por while(j==1)

Link para o comentário
Compartilhar em outros sites

o que esta errado?


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

#define quant 5 // coloquei 5 para não demorar nos 10


int main (void)
{

int i =0;
int val[quant];
int aux;
int ordenador =1;

printf("\n\tEntre com 10 numeros:\n");

for ( i = 0; i < quant; i++ )
{
printf("\n\t%d\xc2\xa7 valor:", i+1);
scanf("%d", &val[i]);
}

printf("\n os valores lidos em ordem crescente:\n");

while ( ordenador <= quant )
{
for ( i = quant-1; i > 0; i-- )
{
if ( val[i] > val[i-1] )
{
aux = val[i];
val[i] = val[i-1];
val[i-1] = aux ;
}
}

ordenador = ordenador + 1;

}

for ( i = 0; i < quant; i++ )
printf("\nval[%d]: %d\n", i+1, val[i]);

return 0;

}

Link para o comentário
Compartilhar em outros sites

Não sei não...Ele não está ordenando...em:


if ( val[i] > val[i-1] )

Troque o sinal > por <.

O do jeito que você colocou vai estar em ordem decrescente! Quando eu falei antes para colocar o > é porque a variável i começava em 0, e no seu caso começou com o valor de "quant"

Link para o comentário
Compartilhar em outros sites

cuccate, obrigado pela sua ajuda e pela paciencia,mais não utilizei ponteiros, como seria utilizando? segue o codigo abaixo,.


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

#define quant 5

int main (void)
{

int i =0;
int val[quant];
int aux;
int ordenador =1;

printf("\n\tEntre com 10 numeros:\n");

for ( i = 0; i < quant; i++ )
{
printf("\n valor:", i+1);
scanf("%d", &val[i]);
}

printf("\nOs valores lidos em ordem crescente:\n");

while ( ordenador <= quant )
{
for ( i = quant-1; i > 0; i-- )
{
if ( val[i] < val[i-1] )
{
aux = val[i];
val[i] = val[i-1];
val[i-1] = aux ;
}
}

ordenador = ordenador + 1;

}

for ( i = 0; i < quant; i++ )
printf("\ %d\n", val[i]);

return 0;

}

Link para o comentário
Compartilhar em outros sites


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

#define quant 5

int main (void)
{

int i =0;
int val[quant];
int aux;
int ordenador =1;
[b]int *p;[/b]
[b]p=val[/b]
printf("\n\tEntre com 10 numeros:\n");

for ( i = 0; i < quant; i++ )
{
printf("\n valor:", i+1);
scanf("%d", &val[i]);
}

printf("\nOs valores lidos em ordem crescente:\n");

while ( ordenador <= quant )
{
for ( i = quant-1; i > 0; i-- )
{
if ( [b]p[i][/b] < [b]p[i-1] [/b] )
{
[b]aux = p[i];
p[i] = p[i-1];
p[i-1] = aux ; [/b]
}
}

ordenador = ordenador + 1;

}

for ( i = 0; i < quant; i++ )
printf("\ %d\n", val[i]);

return 0;

}

Olha ai, é só declarar um ponteiro.Como val é um vetor, então não precisa colocar p = &val e sim p = val

E depois é só trocar no if . Só isso mesmo, da tudo certo =D

Na hora de imprimir, ele não precisa imprimir o ponteiro, pode imprimir o vetor val , porque o ponteiro pegou o endereço de val então no if ele mudou indiretamente os valores =D

Espero ter ajudado \O/

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!