Ir ao conteúdo
  • Cadastre-se

C Função para inverter vetor usando recursividade


a.melchiors

Posts recomendados

Olá!

Preciso  como atividade de aula fazer a seguinte função: 

Crie um programa em C que receba um vetor de números reais com 100 elementos. Escreva uma
função recursiva que inverta ordem dos elementos presentes no vetor.

Criei o código:

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

#define tam 100

/*2. Crie um programa em C que receba um vetor de números reais com 100 elementos. Escreva uma
função recursiva que inverta ordem dos elementos presentes no vetor.*/

float invert(float vetor[], int a, int b){
	if (vetor != NULL){	
		if ((b-a)>0) {
			printf("\n ANTES: vetor [%i] = %.2f e vetor [%i] = %.2f",a, vetor[a], b,vetor[b]); // ==>> para teste
			float aux = vetor[a];
			vetor[a] = vetor[b];
			vetor[b] = aux;
			printf("\n DEPOIS: vetor [%i] = %.2f e vetor [%i] = %.2f",a, vetor[a], b,vetor[b]); ==>> para teste
			invert(&vetor[tam], a+1, b-1);
		} else {
			return 0;		
		}	
	}
}

int main (){
	srand(time(NULL));
	float vetor[tam];
	for (int i=0; i<tam; i++){
		vetor[i] = rand () %10;
	}
	for (int i=0; i<tam; i++){
		printf("%.2f ", vetor[i]);
	}
	printf("\n");
	invert(vetor, 0, tam-1);
	for (int i=0; i<tam; i++){
		printf("%.2f ", vetor[i]);
	}
	return 0;
}

Mas ele não conclui a execução.

Abaixo o resultado, com apenas 10 elementos:

image.png.b2bb850136a4ff767a68f72236c6ec5b.png

 Talvez recursividade não seja a melhor opção, mas preciso fazer dessa forma porque o exercício pede.

Dúvidas: 

1) porque ele aborta? Minha condição base não encerra? (o erro é sempre na última troca, ex posições 49 e 50) Testei valores menores e maiores, pares e impares.

2) porque ele gera valores grandes se limitei o meu rand a 10?

 

Grata.

Link para o comentário
Compartilhar em outros sites

Olá, tudo bem?

 

 

Então, sua solução foi além das expectativas, porque a função que é o cerna da questão está imprimindo coisas e em momento nenhum foi solicitada impressão. Poderia até usar isso como recurso de verificação de resultados e etapas, se esse é o caso, então tudo bem você apagará isso antes de submeter ao professor.

 

4 horas atrás, Angeline Melchiors disse:

invert(&vetor[tam], a+1, b-1);

 

Esse foi o momento mais crítico do algoritmo, pois você passou no primeiro argumento da função um ponteiro que está além da memória do vetor. O algoritmo passa: &vetor[100], quando a maior posição possível é &vetor[99] se o tamanho máximo do vetor é 100. Mesmo assim em hipótese nenhum isso é logicamente certo, tendo em vista os outros argumentos.

 

stack smashing detected: Essa mensagem é exatamente por conta do erro citado, que inclusive demorou bastante para ser detectada, mas detectou viva gcc.

 

 

O.k !? tchau.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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