Ir ao conteúdo
  • Cadastre-se

C++ Suavização de Vetor dando erro


Leoveira

Posts recomendados

Boa noite, tenho que fazer a suavização de um vetor de 10 posições. A suavização consiste em substituir o valor atual de uma posição pela média do valor da posição anterior, da posterior e dele próprio. Assumindo que o identificador do vetor é v, então v=(v[i-1]+v+v[i+1])/3, (exceto o primeiro e o último). O primeiro elemento do vetor é suavizado com base na média entre os dois primeiros valores e o último elemento é suavizado com base na média entre os dois últimos. Meu código ficou assim:

 

#include<iostream>

using namespace std;

int main(){

int tam=10,vetor[tam],cont;
float media=0;

cout << "\n\t Suavização de vetor\n";

cout << "\nDigite dez valores: ";

for(cont=0;cont<tam;cont++){

    cin >> vetor[cont];
}


for(cont=0;cont<tam;cont++){
    if(cont ==0){
        media=(vetor[cont]+vetor[cont+1])/2;
    cout << "\nPosicao no vetor: " << cont << ", suavizacao: " << media;
    media=0;
}
         if(cont ==9){
            media=(vetor[cont]+vetor[cont-1])/2;
        cout << "\nPosicao no vetor: " << cont << ", suavizacao: " << media;
        media=0;
        }
            else{
               media=(vetor[cont-1]+vetor[cont]+vetor[cont+1])/3;
            cout << "\nPosicao no vetor: " << cont << ", suavizacao: " << media;
            media=0;
            }
}
}

Ele não está retornando os valores corretamente, alguém sabe qual pode ser o erro? 

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

  • Membro VIP

Complementando:

 

12 horas atrás, Leoveira disse:

A suavização consiste em substituir o valor atual de uma posição pela média do valor da posição anterior, da posterior e dele próprio

 

Se está trabalhando com "médias", o vetor não pode ser inteiro, pois a divisão de inteiros resultam em um número real (é uma propriedade matemática), ou seja, poderia usar float ou double (ou algo do tipo, não sei a diferença.. mas o que não pode é ser int). A não ser que o enunciado exija uma "aproximação" para "zero casas decimais"... ai o resultado seria um inteiro mesmo.

 

Seria mais ou menos assim:

A/B=C

Se:

A=inteiro

B=inteiro

Então:

C=real

 

Ex. 1: 10/4=2.5

Ex. 2: 12/3=4    (veja, esse "4" também é real... lembrando que os inteiros estão contidos no reais, já o oposto não)

 

Logo, a "variável" tem que "suportar" toda a possibilidade que a média pode resultar...

 

Outra coisa... não necessariamente os dados de entrada são apenas inteiros, ou seja, o usuário em si já poderia inserir dados do tipo "real". O resultado da média continuaria como real mesmo.

 

No aguardo.

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

5 horas atrás, Simon Viegas disse:

Se está trabalhando com "médias", o vetor não pode ser inteiro, pois a divisão de inteiros resultam em um número real (é uma propriedade matemática), ou seja, poderia usar float ou double

 

Eu tive esse pensamento, mas só lembrei de colocar o media como float.

 

17 horas atrás, RafaelCLP disse:

Falta um else antes do segundo if (senão ele entra no último else quando cont==0).

 

Nem tinha percebido, obrigado por me lembrar.

 

Obrigado a todos pela ajuda.

adicionado 20 minutos depois

Só uma duvida coloquei o meu código em uma função é esta dando o erro "error: cannot convert 'float' to 'float*' for argument '1' to 'float suavizacao(float*)' ".

 

#define tam 10

float suavizacao(float vetor[tam]){

int cont;
float media=0;

for(cont=0;cont<tam;cont++){
    if(cont ==0){
        media=(vetor[cont]+vetor[cont+1])/2;
    cout << "\nPosicao no vetor: " << cont << ", suavizacao: " << media;
    media=0;
}
       else if(cont ==9){
            media=(vetor[cont]+vetor[cont-1])/2;
        cout << "\nPosicao no vetor: " << cont << ", suavizacao: " << media;
        media=0;
        }
            else{
               media=(vetor[cont-1]+vetor[cont]+vetor[cont+1])/3;
            cout << "\nPosicao no vetor: " << cont << ", suavizacao: " << media;
            media=0;
            }
}
    return 0;
}



int main(){


float valores[tam],teste;
int cont;


cout << "\n\t Suavizacao de vetor\n";

cout << "\nDigite dez valores: ";

for(cont=0;cont<tam;cont++){

    cin >> valores[cont];
}

suavizacao(valores[tam]);

}

 

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

  • Membro VIP

Olá @Leoveira.

 

2 horas atrás, Leoveira disse:

Só uma duvida coloquei o meu código em uma função é esta dando o erro "error: cannot convert 'float' to 'float*' for argument '1' to 'float suavizacao(float*)' ".

 

Vamos lá:

 

Assinatura do método:

2 horas atrás, Leoveira disse:

float suavizacao(float vetor[tam]) {

 

Como está invocando:

2 horas atrás, Leoveira disse:

suavizacao(valores[tam]);

 

Ou seja, o método quer um "vetor inteiro", mas você está passando uma posição específica de um vetor. Na assinatura, o valor dentro do [] refere-se ao tamanho (lá está "criando um vetor"), já ao invocar, o valor dentro do [] refere-se à posição (está "acessando uma posição").

 

RESUMINDO:

Não precisa do [], passe o vetor em si. Algo como:

suavizacao(valores);

ou seja, "o método deve receber aquilo que ele pediu".

 

 

No aguardo.

adicionado 20 minutos depois

ADENDOS:

 

1) INDENTAÇÃO

Recomendo se atentar a indentação. É de suma importância... pelo menos aqui no fórum ele está um pouco "bagunçado". Veja um exemplo de como poderia ficar:

#include<iostream>
#define tam 10
using namespace std;

float suavizacao(float vetor[tam]) {
    int cont;
    float media=0;
    for (cont=0;cont<tam;cont++) {
        if (cont ==0) {
            media=(vetor[cont]+vetor[cont+1])/2;
            cout << "\nPosicao no vetor: " << cont << ", suavizacao: " << media;
            media=0;
        }
        else
            if (cont ==9) {
                media=(vetor[cont]+vetor[cont-1])/2;
                cout << "\nPosicao no vetor: " << cont << ", suavizacao: " << media;
                media=0;
            }
            else {
                media=(vetor[cont-1]+vetor[cont]+vetor[cont+1])/3;
                cout << "\nPosicao no vetor: " << cont << ", suavizacao: " << media;
                media=0;
            }
    }
    return 0;
}

int main() {
    float valores[tam], teste;
    int cont;    
    cout << "\n\t Suavizacao de vetor\n";
    cout << "\nDigite dez valores: ";    
    for(cont=0;cont<tam;cont++){
        cin >> valores[cont];
    }
    suavizacao(valores);
}

Compare um com o outro... veja como um código indentado já deixa uma boa noção da estrutura do algoritmo.

 

 

2) REPETIÇÃO DE CÓDIGO

Observe que a impressão na tela utiliza o mesmo "comando":

cout << "\nPosicao no vetor: " << cont << ", suavizacao: " << media;

ou seja, só precisa ser declarado uma vez... basta colocar ali após o segundo else. Assim como o

media=0;

também está repetido.

 

 

 

3) (RE)INICIAÇÃO DE VARIÁVEL

Teoricamente a instrução:

media=0;

dentro do if (ou se acatar a sugestão do item 2, após o else) não é necessária. Pois é uma variável que "apenas" recebe um valor, ou seja, o valor atual dele não é utilizado no processo... logo, não precisa zera.

obs.: veja que nem lá na declaração precisaria inicializar... pois não importa seu valor atual... ela vai "apenas" receber um valor externo..  mas lá pode deixar, acho que fica mais visível a "não necessidade" lá dentro do for. Veja por exemplo que você não inicializou o vetor, apenas "atribui" valores a ele e pronto.. não importa o valor que estava lá antes... não é necessário inicializar.

 

 

 

4) VARIÁVEIS DESNECESSÁRIAS

A variável teste não está sendo utilizada.

 

 

***

 

 

No aguardo

 

 

 

 

 

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

 

20 minutos atrás, Leoveira disse:

Funcionou mas agora o erro e esse:

 

error: invalid types 'float[int]' for array subscript

Tira o tam do cabeçario da função float suavizacao(float vetor[tam])

Mais se por acaso deseja explicitar a largura do vetor então deixo assim: float suavizacao(int tam, float vetor[tam])

 

Percebi que tam é constate de MACRO, com isso está correto a que pensei estar errado.

Geralmente as constates são escritas todas de caixa alta.

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

  • Membro VIP

Olá.

 

17 minutos atrás, Leoveira disse:

Funcionou mas agora o erro e esse:

 

error: invalid types 'float[int]' for array subscript

Hum!..  antes de seguir essa orientação do @Mauro Britivaldo, por favor, poste o seu código completo para servi de base.. entender o que foi que aconteceu...

 

Depois, segue a orientação e também posta o código corrigido, ok?

 

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, Simon Viegas disse:

Hum!..  antes de seguir essa orientação do @Mauro Britivaldo, por favor, poste o seu código completo para servi de base.. entender o que foi que aconteceu...

Levei-me pela formatação, é que geralmente as constantes são todas em CAIXA_ALTA desse jeito.

Porém ao compilar o código não ouve erro de sintaxe, fui apressado:tw_confounded: 

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

  • Membro VIP

@Mauro Britivaldo.... entendi! 

 

Acho que entendi também o que ocorreu com @Leoveira.. Vi aqui, acho que foi apenas que ele tirou o [] lá da assinatura. Ou seja, deixou assim:

float suavizacao(float vetor) {

Ai deixou de ser vetor!!! e dá o erro:

[Error] invalid types 'float[int]' for array subscript

 

 

Talvez eu tenho me expressado errado na outra postagem, ou seja, só a parte da invocação que tem que tirar o [].

 

 

RESUMINDO:

ou deixa assim:

float suavizacao(float vetor[tam]) {

ou como como você tinha sugerido, assim:

float suavizacao(float vetor[]) {

 

Para invocar fica igual:

suavizacao(valores);

 

Ou seja, a falha do:

2 horas atrás, Leoveira disse:

error: cannot convert 'float' to 'float*' for argument '1' to 'float suavizacao(float*)' ".

Foi que "declarou o método para receber um vetor (que estava certo), mas na olha de usar a função, passou apenas uma posição... tem que passa o vetor completo (sem [] lá dentro do main())

 

Correto?

 

 

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