calcular producto escalar

Iniciado por indict, 11 Diciembre 2012, 09:01 AM

0 Miembros y 1 Visitante están viendo este tema.

indict

Calcular producto escalar  de dos vectores dados.

¿Qué debo rectificar para que me funcione?

#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;

}

Ferno

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 (cpp) [Seleccionar]
producto_escalar (s=s+v1[i]*v2[i];  ){
cout<<"el producto escalar es"<<s<<endl;}


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

Código (cpp) [Seleccionar]
double producto_escalar(vector<double>v1,vector<double>v2)

Lo que debes hacer es:

Código (cpp) [Seleccionar]
s = producto_escalar (v1,v2);
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 (cpp) [Seleccionar]
for(i=0;(i<v1.size()) && (i<v2.size());i=i+1)

Corrige esto y avisanos como te fue.

rir3760

Cita de: Ferno en 11 Diciembre 2012, 17:09 PMPor ú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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Ferno

Cita de: rir3760 en 11 Diciembre 2012, 18:04 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!

indict

Gracias por el aporte.

He rectificado las erradas, pero sigue sin compilar bien.

#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;

Ferno

No has declarado las variables v1, v2 que representan a los vectores.

indict

Cita de: Ferno en 11 Diciembre 2012, 19:12 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

Ferno

Cita de: indict en 11 Diciembre 2012, 20:07 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?

indict

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 "


naderST

Pon un espacio entre el tipo del parametro y el nombre, es decir:

Código (cpp) [Seleccionar]
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.