Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Leoveira

C++ Suavização de Vetor dando erro

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só tem dois erros acho.

  1. Falta um else antes do segundo if (senão ele entra no último else quando cont==0).
  2. Precisa fazer um cast pra float ou double antes de dividir. O jeito mais simples de fazer isso é, em vez de dividir por 3 (ou 2), dividir por 3.0 (ou 2.0).
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

 

 

 

 

Editado por Simon Viegas
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou mas agora o erro e esse:

 

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

Compartilhar este post


Link para o post
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.

Editado por Mauro Britivaldo
Correção
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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?

 

 

Editado por Simon Viegas
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×