Ir ao conteúdo

Ajuda com Codigo C++


juniorsm

Posts recomendados

Postado

fiz um codigo em C++ mas ele esta dando problema na primeira vez que ele passa o vetor para a função ele passa certo porém quando volta da funcao e é repassado novamente para ela para uma nova divisão ele perde os valores...

aqui está o codigo o que está errado?

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

void *mostrar(int *vet,int tamanho)

{

printf("\n vetor novo\n");

int i;

for(i=0;i<tamanho;i++)

printf("[%d]",vet);

}

int *funcaohaarmedia(int *vetor,int tamanho){

int i,vetorA[tamanho/2];

for(i=0;i<tamanho;i++)

{

vetorA=(vetor[i*2]+vetor[(i*2)+1])/2;

}

printf("\n\n vetor Media\n");

for(i=0;i<tamanho/2;i++)

printf("[%d]",vetorA);

return vetorA;

}

int *funcaohaarsub(int *vetor,int tamanho){

int i,vetorB[tamanho/2];

for(i=0;i<tamanho;i++)

{

vetorB=vetor[(i*2)+1]-vetor[i*2];

}

printf("\n\n vetor Subtracao\n");

for(i=0;i<tamanho/2;i++)

printf("[%d]",vetorB);

return vetorB;

}

int main(){

int *vetoriginal,n,i,div,*vetb,*aux;

printf("Tamanho da amostra: ");

scanf("%d",&n);

vetoriginal=(int *) malloc(n*sizeof(int));

for(i=0;i<n;i++)

{

vetoriginal=2*(i+1);

}

mostrar(vetoriginal,n);

for(i=0;n>2;i++,n=n/2)

{

mostrar(vetoriginal,n);

vetb=funcaohaarsub(vetoriginal,n);

vetoriginal=funcaohaarmedia(vetoriginal,n);

}

getch();

}

Postado

hahhahahahahha é verdade desculpe

esta ai o codigo comentado

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

//função que mostra um vetor recebe um vetor e o tamanho do mesmo

void *mostrar(int *vet,int tamanho)

{

printf("\n vetor\n");

int i;

//laço para mostra o vetor

for(i=0;i<tamanho;i++)

printf("[%d]",vet);

}

//função para realizar a media do valores contido no vetor e

//retornar um vetor com a metade do tamanho do vetor passado na função

//ou seja se entrar um vetor com tamanho 4 retorna um vetor tamanho 2 com as medias

int *funcaohaarmedia(int *vetor,int tamanho){

int i,vetorA[tamanho/2];

// função que pega os dois itens seguintes e coloca no vetor com a media dos mesmos

// como exemplo pega o item 0 e item 1 do vetor faz a media e coloca na posição 0 do novo vetor

for(i=0;i<tamanho;i++)

{

vetorA=(vetor[i*2]+vetor[(i*2)+1])/2;

}

//mostra vetor de media

printf("\n\n vetor Media\n");

for(i=0;i<tamanho/2;i++)

printf("[%d]",vetorA);

//retorna

return vetorA;

}

//função que faz a mesma coisa que a anterior porém subtrai os numeros

int *funcaohaarsub(int *vetor,int tamanho){

int i,vetorB[tamanho/2];

//laço que subtrai aos pares e em sequencia os items do vetor que é passado

//para função e depois retorna um vetor com metade do tamanho com as subtrações

for(i=0;i<tamanho;i++)

{

vetorB=vetor[(i*2)+1]-vetor[i*2];

}

printf("\n\n vetor Subtracao\n");

for(i=0;i<tamanho/2;i++)

printf("[%d]",vetorB);

//retorna vetor

return vetorB;

}

int main(){

int *vetoriginal,n,i,div,*vetb,*aux;

printf("Tamanho da amostra: ");

//le o tamanho do vetor original

scanf("%d",&n);

//aloca o vetor

vetoriginal=(int *) malloc(n*sizeof(int));

//popula o vetor com numeros na base 2

for(i=0;i<n;i++)

{

vetoriginal=2*(i+1);

}

//passa para função que mostra o vetor original

mostrar(vetoriginal,n);

//laço para passar para as funções o vetor original recursivamente

//até que o vetor tenha tamanho 2

for(i=0;n>2;i++,n=n/2)

{

mostrar(vetoriginal,n);

//passa o vetor original para função de subtração e retorna com um vetor

//com metade do tamanho que foi passado "n" representa o tamanho do vetor

vetb=funcaohaarsub(vetoriginal,n);

//passa o vetor original e retorna um vetor com metade de "n" com os valores

//da media do vetor original

vetoriginal=funcaohaarmedia(vetoriginal,n);

}

getch();

}

Postado

Desculpa, não conseguir entender direito o seu problema. Poderia explicar melhor por favor?

Ah, uma dica, em return vetorA; e return vetorB; você está assignando um endereço de memória ao invés de um valor, rever isto. Além do que, isto é C e não C++.

Postado

Pelo que eu entendi, você quer fazer o seguinte:

Pegar um vetor, exibir os vetores media e subtracao, e depois com o vetor media gerado, repitir o processo, ate que reste um vetor com apenas duas posições. Fiz as correções e explicações partindo desse preceito. Vamos lá então:

Dei uma olhada meio rápida no seu código, e gostaria de lhe dar umas dicas:

1 - Comente seu programa sempre, ajuda as pessoas a entenderem a sua linha de raciocinio e a resolver os problemas que possam aparecer.

2 - Idente o código. Eu acho isso uma das coisas mais importantes para a legibilidade, pode parecer que não, mas ajuda pra caramba na hora de enteder o que esta acontecendo no programa.

Agora vamos ao código:

O erro está aqui, veja:


for(i=0;i<tamanho;i++)
{
vetorA[i]=(vetor[i*2]+vetor[(i*2)+1])/2;
}

Agora olhe para a declaraçao do seu vetorA:


vetorB[tamanho/2]

No for, você faz o i variar de zero ate o ultimo indice do vetor passado, porém vetorA so tem metade do tamanho do vetor que é passado para sua funcao. E como C não verifica limites...

A solução é simples: i deve variar de zero até tamanho/2, que é o tamanho do novo vetor gerado. Isso acontece nas funcoes que geram os vetores media e subtracao.

Outra coisa: suas funcoes estavam retornando ponteiros para variaveis locais, e isso acontecia por causa da declaracao:


int i,vetorA[tamanho/2];

Eu acho mais legal declarar um ponteiro e usar o malloc para gerar o vetor.

Pelo que eu entendi, sua função de subtração nao precisa retornar nada, só gerar, exibir e descartar o vetor subtração.

Bem. Ao invés de ficar falando aqui, vou postar um código que eu fiz utilizando o seu (mudei seu codigo o mínimo possível). Ele está bem comentado:


#include <stdio.h>
#include <stdlib.h>
/*tirei a conio por causa do linux*/

void mostrar(int *,int);
void subvet(int *,int);
int *mediavet(int *, int);
/*prototipos das funcoes que serao usadas...*/

int main(void){
int *vetoriginal=NULL,*vetoraux=NULL,n,i;
printf("Tamanho da amostra: ");
scanf("%d",&n);
vetoriginal=(int *)malloc(n*sizeof(int)); /*gera um vetor com n posições*/
for(i=0;i<n;i++){ /*preence o vetor gerado anteriormente*/
vetoriginal[i]=2*(i+1);
}
for(i=0;n>2;i++,n/=2){
printf("\n");
mostrar(vetoriginal,n); /*mostra o vetor com o qual vamos trabalhar dessa vez*/
subvet(vetoriginal,n); /*gera e msotra o vetor subtracao, note que a funcao agora e void, pois nao precisa retornar nada*/
vetoraux=mediavet(vetoriginal,n); /*aqui, para nao gastar memoria à toa, fazemos o seguinte: geramos o vetor media e retornamos seu endereco para uma variavel auxiliar*/
free(vetoriginal); /*depois disso, liberamos o vetor antigo, ja que nao precisamos mais dele, certo?*/
vetoriginal=vetoraux; /*agora o novo vetor original é o vetor gerado pela funcao mediavet()*/
}
free(vetoriginal);/*no fim de tudo, liberamos o vetor, ja que acabou o programa*/
printf("\n");
return 0;
}


void mostrar(int *vet,int tamanho){ /*sua declaracao desta funcao estava assim: 'void *mostar(int *vet, int tamanho)' com isso, o compilador acha que voce quer retornar um ponteiro generico, e com certeza vai de dar um warning por causa disso. O asterisco nao e necessario, pois voce nao retorna nada.*/
printf("\nVetor novo:\n");
int i;
for(i=0;i<tamanho;i++)
printf("[%d]",vet[i]);
}

/*
* Aqui na funcao subvet, eu mudei algumas coisas. Ja que ela nao precisa retornar nada,
* nos simplesmente geramos, exibimos e descartamos o vetor subtracao.
*/
void subvet(int *vetor,int tamanho){
int i,*vetorB;
vetorB=(int *)malloc(((int)(tamanho/2))*sizeof(int)); /*evite retornar enderecos de variaveis locais, ao invés disso, use o malloc, ao invés da declaracao que estava aqui antes.Eu acho que isso ajuda a evitar problemas. Nota: por via das duvidas, eu usei um cast no malloc, em (int)(tamanho/2)*/
for(i=0;i<tamanho/2;i++){ /* aqui era onde estava o problema, voce estava ultrapassando o numero de posições do vetor gerado la em cima, pos isso eu imagino que ele deveria retornar alguns numeros grandes e negativos, ou coisas sem sentido, certo?*/
vetorB[i]=vetor[(i*2)+1]-vetor[i*2];
}
printf("\nVetor Subtracao:\n");
for(i=0;i<tamanho/2;i++)
printf("[%d]",vetorB[i]);
free(vetorB);
}

int *mediavet(int *vetor,int tamanho){
int i,*vetorA;
vetorA=(int *)malloc(((int)(tamanho/2))*sizeof(int));
for(i=0;i<tamanho/2;i++){
vetorA[i]=(vetor[i*2]+vetor[(i*2)+1])/2;
}
printf("\nVetor media:\n");
for(i=0;i<tamanho/2;i++)
printf("[%d]",vetorA[i]);
return vetorA;
}

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!