Ir ao conteúdo

Posts recomendados

Postado

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.

Postado

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!