Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: indict en 11 Diciembre 2012, 09:01 am



Título: calcular producto escalar
Publicado por: indict en 11 Diciembre 2012, 09:01 am
Calcular producto escalar  de dos vectores dados.

¿Qué debo rectificar para que me funcione?

Código:
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;

double producto_escalar(vector<double>v1,vector<double>v2){
     int i, s=0;
     for(i=0;i<v1.size and i<v2.size ();i=i+1){
               s=s+v1[i]*v2[i];      }
     return s;}
                       
                       


int main(){
    int i, k, e,n,s=0;
    vector<int>v1;
    vector<int>v2;
    cout<<"introduzca el tamaño del vector 1"<<endl;
    cin>>n;
    for(i=0;i<n;i=i+1){
                       cout<<"este es el elemento"<<i<<"...";
                       cin>>e;
                       v1[i]=e;}
    cout<<"introduzca el tamaño del vector 2"<<endl;
    cin>>n;
    for(i=0;i<n;i=i+1){
                       cout<<"este es el elemento"<<i<<"...";
                       cin>>e;
                       v2[i]=e;}
   
 producto_escalar (s=s+v1[i]*v2[i];  ){
 cout<<"el producto escalar es"<<s<<endl;}

system ("pause");
return 0;

}


Título: Re: calcular producto escalar
Publicado por: Ferno en 11 Diciembre 2012, 17:09 pm
Primero algunas cuestiones del álgebra.

No podés realizar un producto escalar entre 2 vectores de diferente dimensión (tamaño), por ende, podés simplificar el programa pidiendo una sola vez el tamaño y pedir los valores con el mismo tamaño para ambos vectores.

En tu code, lo siguiente no está bien:

Código
  1. producto_escalar (s=s+v1[i]*v2[i];  ){
  2. cout<<"el producto escalar es"<<s<<endl;}

Como parámetro deben ir los vectores como bien declaras al principio:

Código
  1. double producto_escalar(vector<double>v1,vector<double>v2)

Lo que debes hacer es:

Código
  1. s = producto_escalar (v1,v2);
  2. cout<<"el producto escalar es"<<s<<endl;

Por último, dentro de la función "producto_escalar", la condición en el for no es correcta. Esto:

for(i=0;i<v1.size and i<v2.size ();i=i+1)

No compila, porque el compilador no entiende el "and". Las relaciones lógicas, se reemplazan por ciertos caracteres, por ejemplo, para AND y OR:

AND = &&
OR = ||

Además, utiliza paréntesis siempre que las uses, para evitar confusiones:

Código
  1. for(i=0;(i<v1.size()) && (i<v2.size());i=i+1)

Corrige esto y avisanos como te fue.


Título: Re: calcular producto escalar
Publicado por: rir3760 en 11 Diciembre 2012, 18:04 pm
Por último, dentro de la función "producto_escalar", la condición en el for no es correcta. Esto:

for(i=0;i<v1.size and i<v2.size ();i=i+1)

No compila, porque el compilador no entiende el "and". Las relaciones lógicas, se reemplazan por ciertos caracteres, por ejemplo, para AND y OR:

AND = &&
OR = ||
En C++ las palabras reservadas (para ser exactos "alternative tokens") "and", "or" y "not" tienen el mismo efecto que los operadores "&&", "||" y "!" pero raramente se usan (supongo es una costumbre derivada de C donde, eventualmente, se implementaron como macros).

Un saludo


Título: Re: calcular producto escalar
Publicado por: Ferno en 11 Diciembre 2012, 19:09 pm
En C++ las palabras reservadas (para ser exactos "alternative tokens") "and", "or" y "not" tienen el mismo efecto que los operadores "&&", "||" y "!" pero raramente se usan (supongo es una costumbre derivada de C donde, eventualmente, se implementaron como macros).

Un saludo

Mirá, no tenía ni idea de eso. Tendría que dejar de responder cosas de C++ :P
Perdón al autor y gracias rir!


Título: Re: calcular producto escalar
Publicado por: indict en 11 Diciembre 2012, 19:10 pm
Gracias por el aporte.

He rectificado las erradas, pero sigue sin compilar bien.

Código:
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;

int producto_escalar(vector<int>v1,vector<int>v2){
     int i,s=0;
     for(i=0;(i<v1.size()) && (i<v2.size());i++){
               s=s+v1[i]*v2[i];      }
     return s;}
                      
                      


int main(){
    int i, k, e,n,s=0;
    
    
    cout<<"introduzca el tamaño del vector 1"<<endl;
    cin>>n;
    vector<int>v1(n);
    for(i=0;i<n;i=i+1){
                       cout<<"este es el elemento"<<i<<"...";
                       cin>>e;
                       v1[i]=e;}
    cout<<"introduzca el tamaño del vector 2"<<endl;
    cin>>n;
    vector<int>v2(n);
    for(i=0;i<n;i=i+1){
                       cout<<"este es el elemento"<<i<<"...";
                       cin>>e;
                       v2[i]=e;}
  
 s=producto_escalar(v1,v2){
 cout<<"el producto escalar es"<<s<<endl;}

system ("pause");
return 0;


Título: Re: calcular producto escalar
Publicado por: Ferno en 11 Diciembre 2012, 19:12 pm
No has declarado las variables v1, v2 que representan a los vectores.


Título: Re: calcular producto escalar
Publicado por: indict en 11 Diciembre 2012, 20:07 pm
No has declarado las variables v1, v2 que representan a los vectores.

Si no me equivoco, están declaradas en la función producto_escalar


Título: Re: calcular producto escalar
Publicado por: Ferno en 11 Diciembre 2012, 20:15 pm
Si no me equivoco, están declaradas en la función producto_escalar

No, pero igual me confundí, ya están declarados en el main.
¿Qué error tira el compilador?


Título: Re: calcular producto escalar
Publicado por: indict en 11 Diciembre 2012, 20:24 pm
In function `int producto_escalar(std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)':


 Y este mensaje muchas veces reptido "stray '\160' in program "



Título: Re: calcular producto escalar
Publicado por: naderST en 12 Diciembre 2012, 03:33 am
Pon un espacio entre el tipo del parametro y el nombre, es decir:

Código
  1. int producto_escalar(vector<int> v1,vector<int> v2)

Otra cosa, si sabes que para realizar el producto escalar entre dos vectores ambos tienen que tener el mismo tamaño, está demás que preguntes en el for por el tamaño de ambos.


Título: Re: calcular producto escalar
Publicado por: rir3760 en 12 Diciembre 2012, 14:22 pm
He rectificado las erradas, pero sigue sin compilar bien.
Si no tienes un libro sobre C++ de calidad es hora de conseguir uno. Puedes revisar las recomendaciones mediante el motor de búsqueda de los foros.

En tu programa falta la llave de cierre de la función main y al final de esta tienes, por alguna extraña razón, un par de llaves:
Código
  1. s=producto_escalar(v1,v2){ // <==
  2. cout<<"el producto escalar es"<<s<<endl;} // <==
Eliminalas y coloca un punto y coma al final de la primera sentencia para marcar el final de esta:
Código
  1. s=producto_escalar(v1,v2);
  2. cout<<"el producto escalar es"<<s<<endl;

También hay que eliminar la variable "k" en la función main ya que no la utilizas y en la función que calcula el producto el tipo correcto para el contador "i" es "vector<int>::size_type".

Con esos cambios el programa debe compilar y ejecutarse correctamente.

Un saludo