Ir para conteúdo

Arquivado

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

gRoOvE

[Resolvido] Ordenar valores usando ponteiros

Recommended Posts

Faça um programa usando ponteiros, para ordenar 5 números emostrálos ordenados na tela.

 

ae galera, preciso de ajuda nesse exercício, não sei nem por onde começar e qual a lógica disso "/

Sei fazer apenas da forma normal, sem uso de ponteiros

Compartilhar este post


Link para o post
Compartilhar em outros sites

int V[5] = {4,2,6,-4,3};

 

é o mesmo que

 

int *V = (int*)malloc(5);

V[0] = 4;

V[1] = 2;

V[2] = 6;

V[3] = -4;

V[4] = 3;

Compartilhar este post


Link para o post
Compartilhar em outros sites

nossa Isis, teu processador é de 8bits? :) zuera ^^

o correto não seria malloc(24)?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ja que ta reclamando use sizeof entao.

e o teu ta tao errado quanto o meu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que contei errado, 20 o correto??

int *V = (int*)malloc(5);
uma coisa, tenho sempre que usar o casting no malloc ali ?? no ponteiro não precisa definir o tipo denovo né?? E esse * ali no ponteiro, porque?

peguei isso de outro lugar ae:

 

char *ptr;

ptr = malloc (1);

scanf ("%c", ptr);

 

O endereço devolvido por malloc é do tipo "genérico" void *. O programador armazena esse endereço num ponteiro de tipo apropriado. No exemplo acima, o endereço é armazenado num ponteiro-para-char.

Compartilhar este post


Link para o post
Compartilhar em outros sites

hmm, voltando ao assunto, tenho que comparar a váriavel ou o seu endereço? Fiz com a váriavel, mas acho que não é isso "/

 

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

int main(void)
{
	int *v;
	int num;
	int i,k, aux;

	v = (int*)malloc(5 * sizeof(int));

	for(i=0;i<5;i++)
	{
		printf("Digite um valor para V[%d]: ",i);
		scanf("%d",v+i);
	}
	for(i=0;i<5;i++)
	{
		for(k=i+1;k<5;k++)
		{
			if(v[i] > v[k])
			{
				aux = v[i];
				v[i] = v[k];
				v[k] = aux;
			}
		}

	}
	for(i=0;i<5;i++)
	{
		printf("\nValor de V[%d] = %d",i,v[i]);
	}
	return(1);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

A gente verifica o retorno do malloc antes de usar...Nunca assuma que o sistema está usando pouca memória ou que tem memória de sobra.Se o limite de memória que o SO cede automaticamente a uma requisição for estourado, o malloc vai retornar NULL e vai dar falha de segmentação.É assim que funciona no Linux.Tente rodar esse programa no windows via terminal:

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

int main (void) {
	int n = 0;

	while (1) {
			if (malloc(1<<20) == NULL) {
					printf("malloc failure after %d MiB\n", n);
					return 0;
			}
			printf ("got %d MiB\n", ++n);
	}
}

No suse da máquina virtual o malloc falha em 800MB. Existem dois arquivos em /proc/sys/vm/ que controlam esse comportamento.Por padrão,o overcommit_memory vem setado com 0,mas o efeito disso depende da versao do kernel.Isso é o podre de C: você tem que saber como o SO funciona.

 

 

E scanf("%d",v+i); pode ser escrito como &v.

 

Além disso,teu programa tem memory leak por não dar free no ponteiro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tentei rodar esse code ae, ele executa e fexa a janela, mesmo dando system("pause") e getch().

Vou fazer a verificação de memória antes e liberar depois que usar então. O que é memory leak?

 

Porque usar o & na leitura do vetor? Não funciona somente v?

seria isso? Não intendi a vantagem de fazer isso usando ponteiros, se é que tem alguma...

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

int main(void)
{
	int *v;
	int num;
	int i,k, aux;

	v = (int*)malloc(5 * sizeof(int));
	if(v == NULL)
	{
		printf("\nEspaco em memoria insuficiente!");
		exit(1);
	}
	for(i=0;i<5;i++)
	{
		printf("Digite um valor para V[%d]: ",i);
		scanf("%d",v+i);
	}
	for(i=0;i<5;i++)
	{
		for(k=i+1;k<5;k++)
		{
			if(v[i] > v[k])
			{
				aux = v[i];
				v[i] = v[k];
				v[k] = aux;
			}
		}

	}
	for(i=0;i<5;i++)
	{
		printf("\nValor de V[%d] = %d",i,v[i]);
	}
	return(1);
	free(v);
	v = NULL;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

E precisa ter vantagem pra entender como funciona uma estrutura da linguagem? Se você faz esse tipo de pergunta entao provavelmente pra você o exercicio é somente ordenar um vetor.

 

for(i=0;i<5;i++)
free(lista+i);

 

*** glibc detected *** ./a.out: free(): invalid pointer: 0x0804b00c ***

======= Backtrace: =========

/lib/libc.so.6[0xb7fa8fc4]

/lib/libc.so.6(cfree+0x9c)[0xb7faa95c]

./a.out[0x8048600]

/lib/libc.so.6(__libc_start_main+0xe5)[0xb7f535f5]

./a.out[0x8048411]

======= Memory map: ========

08048000-08049000 r-xp 00000000 08:01 15155206 /home/isis/src/a.out

08049000-0804a000 r--p 00000000 08:01 15155206 /home/isis/src/a.out

0804a000-0804b000 rw-p 00001000 08:01 15155206 /home/isis/src/a.out

0804b000-0806c000 rw-p 0804b000 00:00 0 [heap]

b7e00000-b7e21000 rw-p b7e00000 00:00 0

b7e21000-b7f00000 ---p b7e21000 00:00 0

b7f21000-b7f2d000 r-xp 00000000 08:01 8446047 /lib/libgcc_s.so.1

b7f2d000-b7f2e000 r--p 0000b000 08:01 8446047 /lib/libgcc_s.so.1

b7f2e000-b7f2f000 rw-p 0000c000 08:01 8446047 /lib/libgcc_s.so.1

b7f3c000-b7f3d000 rw-p b7f3c000 00:00 0

b7f3d000-b807a000 r-xp 00000000 08:01 8445965 /lib/libc-2.8.so

b807a000-b807c000 r--p 0013d000 08:01 8445965 /lib/libc-2.8.so

b807c000-b807d000 rw-p 0013f000 08:01 8445965 /lib/libc-2.8.so

b807d000-b8081000 rw-p b807d000 00:00 0

b808d000-b808e000 rw-p b808d000 00:00 0

b808e000-b80a9000 r-xp 00000000 08:01 8445958 /lib/ld-2.8.so

b80a9000-b80aa000 r--p 0001a000 08:01 8445958 /lib/ld-2.8.so

b80aa000-b80ab000 rw-p 0001b000 08:01 8445958 /lib/ld-2.8.so

bfc95000-bfcaa000 rw-p bffeb000 00:00 0 [stack]

ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]

Abortado

 

for(i=0;i<5;i++)
lista+i = random();

ordenacao.c: In function ‘main’:

ordenacao.c:10: error: lvalue required as left operand of assignment

 

 

O tempo de execucao depende dos processos da maquina mas entre realocar um pedaco de memoria inteiro e criar um outro array pra copiar os dados um por um, qual dos dois você acha que é mais rápido?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sem dúvida, mexendo apenas no endereço é mais rápido. Mas como eu faço pra realocar ao invés de usar a variável adicional? Não entendi esses codes que você postou "/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use realloc.

Cara,quando a gente nao entende, a gente senta e roda a implementacao do outro.Mas roda acompanhando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tenho noção nenhuma de como fazer, se não tiver uma ajuda fica dificil. Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro que ponteiros não é fazer meia duzia de exercicios so por fazer.

Depois, é só um caso de prestar atencao no proprio codigo pra perceber que o que eu escrevi foram modificacoes em partes do que você postou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas não quero fazer meia duzia de exercícios por fazer, resolvi errado, por isso não vi vantagem alguma. Não estou conseguindo entender a lógica de usar ponteiros pra resolver. Teria que comparar o elemento na posição 0 com o elemento da posição 1 e ver qual o maior? Mas como fazer isso sem usar uma variável auxiliar? Li sobre o realloc, a única coisa que ele faz é aumentar o tamanho da memória reservada após usar o malloc, ta e dai?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vantagem você so vai ver quando tiver que usar realmente. Comece a programar um editor de texto p/ ver que *legal* é usar arrays quando se quer mudar a posição de uma linha...

 

 

Li sobre o realloc, a única coisa que ele faz é aumentar o tamanho da memória reservada após usar o malloc, ta e dai?

 

Mas como eu faço pra realocar ao invés de usar a variável adicional?

 

você falou em realocar. Realocar => memoria e não variavel auxiliar. Se fosse python dava pra você ter a= 43, b = 6 e fazer a,b = b,a. Mas isso é C. quando tiver que trocar valores de lugar você sempre vai precisar de outra variável. Exercicios sobre ponteiros não querem que você invete tecnicas obscuras de programacao. O básico já é confuso. É só entender como usar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, vejamos, pego o endereço de memória 002560, digamos que seja o primeiro elemento(0), comparo com o próximo elemento(1), que tem o endereço de memória 002564 (considerando int = 4bytes), caso o elemento 1 seja menor que o elemento 0, tenho que realocar o bloco de memória dai?

ficando assim:

 

002564 = elemento 0

002560 = elemento 1

 

ta difícil entender isso "/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais uma vez: realocar é redimensionar memória reservada. você não vai realocar nada a não ser que queira inserir mais coisas no array.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.