elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Operaciones con vectores
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Operaciones con vectores  (Leído 17,001 veces)
elreplicante

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Operaciones con vectores
« en: 13 Agosto 2011, 02:53 am »

Hola a todos, este es mi primer mensaje en el foro así que saludos a todos los miembros. Soy estudiante de 1º de Ingeniería de Software y se me plantea el siguiente problema:

Citar
Implementa un programa que permita realizar operaciones sobre vectores de
dimensión N. El programa deberá mostrar un menú con una opción para cada
una de las siguientes operaciones:
a) Suma de vectores
b) Resta de vectores
c) Módulo de un vector
d) Producto escalar de 2 vectores
e) Producto vectorial de 2 vectores
f) Normalización de un vector
g) Obtención de la componente de mayor valor
Además, habrá una opción de finalización del programa. Los vectores sobre los
que se realizan las operaciones deberán solicitarse por teclado.


Mi programa resuelve estas cuestiones para vectores de dimensión 3.  Mi pregunta es cómo mejoraríais el programa para que pudiera realizar los mismos cálculos para vectores de dimensión definida por el usuario.  Si defino mi struct antes de las funciones, ¿cómo puedo hacer que la longitud del array lo introduzca el usuario?

Gracias!!!

Código
  1. /*
  2.  * Created on 12 de agosto de 2011, 15:19
  3.  */
  4.  
  5. #include <iostream>
  6. #include <cmath>
  7.  
  8. using namespace std;
  9.  
  10. #define N 3
  11. #define PI 3,141592
  12. #define RPG 0,0174532
  13.  
  14. /* Definición del tipo vector de N componentes */
  15.  
  16. typedef struct  {
  17.  
  18.    float vector[N];
  19.  
  20. }tVector;
  21.  
  22. void pedirDatos (tVector &A, tVector&B) {
  23.  
  24.    cout << "Escribe las componentes del vector A: " << endl;
  25.    for (int i=0; i<N; i++)
  26.        cin >> A.vector[i];
  27.    cout << "Escribe las componentes del vector B: " << endl;
  28.    for (int j=0; j<N; j++)
  29.        cin >> B.vector[j];
  30.    }
  31.  
  32. void pedirDatos (tVector &A) {
  33.  
  34.    cout << "Escribe las componentes del vector A: " << endl;
  35.    for (int i=0; i<N; i++)
  36.        cin >> A.vector[i];
  37.  
  38.    }
  39.  
  40. char menuPrincipal () {
  41.  
  42.    char opcion;
  43.    cout << "----- OPCIONES -----" << endl << endl;
  44.    cout << "1: Suma escalar de dos vectores." << endl;
  45.    cout << "2: Resta escalar de dos vectores." << endl;
  46.    cout << "3: Modulo de un vector." << endl;
  47.    cout << "4: Producto escalar de dos vectores." << endl;
  48.    cout << "5: Producto vectorial de dos vectores." << endl;
  49.    cout << "6: Normalizacion de un vector." << endl;
  50.    cout << "7: Obtencion de la componente mayor de un vector." << endl;
  51.    cout << "0: Salir." << endl << endl;
  52.    cout << "Opcion:";
  53.  
  54.    cin >> opcion;
  55.    return opcion;
  56. }
  57.  
  58. tVector sumaEscalar (tVector A, tVector B) {
  59.    tVector vectorSuma;
  60.    for (int i=0; i<N; i++)
  61.        vectorSuma.vector[i]=A.vector[i]+B.vector[i];
  62.    return vectorSuma;
  63.  
  64. }
  65.  
  66. tVector restaEscalar (tVector A, tVector B) {
  67.    tVector vectorResta;
  68.    for (int i=0; i<N; i++)
  69.        vectorResta.vector[i]=A.vector[i]-B.vector[i];
  70.    return vectorResta;
  71.  
  72. }
  73.  
  74. float moduloVector (tVector A) {
  75.  
  76.    float modulo;
  77.    float suma=0;                 //Suma de los componentes del vector
  78.    for (int i=0; i<N; i++) {
  79.    A.vector[i]*=A.vector[i];
  80.    suma+=A.vector[i];
  81.        }
  82.    modulo=sqrt(suma);
  83.    }
  84.  
  85. float productoEscalar (tVector A, tVector B) {
  86.  
  87.    float producto, angulo;
  88.    cout << "Angulo que forman los vectores: ";
  89.    cin >> angulo;
  90.    angulo*=RPG;
  91.    producto=moduloVector(A)*moduloVector(B)*cos(angulo);
  92.    return producto;
  93.  
  94. }
  95.  
  96. tVector productoVectorial (tVector A, tVector B) {
  97.  
  98.    tVector producto;
  99.  
  100.    producto.vector[0]=A.vector[1]*B.vector[2]-A.vector[2]*B.vector[1];
  101.    producto.vector[1]=A.vector[0]*B.vector[2]-A.vector[2]*B.vector[0];
  102.    producto.vector[1]*=-1;
  103.    producto.vector[2]=A.vector[0]*B.vector[1]-A.vector[1]*B.vector[0];
  104.  
  105.    return producto;
  106.  
  107.    }
  108.  
  109. tVector normalizacionVector (tVector A) {
  110.  
  111.    float modulo;
  112.    modulo=moduloVector(A);
  113.  
  114.    for (int i=0; i<N; i++)
  115.        A.vector[i]/=modulo;
  116.  
  117.    return A;
  118.  }
  119.  
  120. float componenteMayor (tVector A) {
  121.  
  122.    float mayor;
  123.    if (A.vector[0]>A.vector[1])
  124.        mayor=A.vector[0];
  125.    else mayor=A.vector[1];
  126.    if (A.vector[1]>A.vector[2])
  127.        mayor=A.vector[1];
  128.    else mayor=A.vector[2];
  129.  
  130.    return mayor;
  131.  
  132. }
  133.  
  134. int main() {
  135.  
  136.    tVector vectorA;
  137.    tVector vectorB;
  138.    tVector vectorResultado;
  139.    char opcion;
  140.    float modulo, producto, mayor;
  141.  
  142.  
  143.  
  144.    do {
  145.    opcion=menuPrincipal();
  146.    switch (opcion) {
  147.  
  148.        /* Suma escalar de dos vectores */
  149.  
  150.        case '1': {
  151.                pedirDatos(vectorA,vectorB);
  152.                vectorResultado=sumaEscalar(vectorA,vectorB);
  153.                cout << "La suma escalar de A y B es: (" << vectorResultado.vector[0]
  154.                        << "," << vectorResultado.vector[1] << "," << vectorResultado.vector[2] << ")";
  155.        }
  156.  
  157.        break;
  158.  
  159.        case '2': {
  160.                pedirDatos(vectorA,vectorB);
  161.                vectorResultado=restaEscalar(vectorA,vectorB);
  162.                cout << "La resta escalar de A y B es: (" << vectorResultado.vector[0]
  163.                        << "," << vectorResultado.vector[1] << "," << vectorResultado.vector[2] << ")";
  164.        }
  165.  
  166.        break;
  167.  
  168.        case '3': {
  169.            pedirDatos(vectorA);
  170.            modulo=moduloVector(vectorA);
  171.            cout << "|A| = " << modulo << endl << endl;;
  172.  
  173.  
  174.        }
  175.  
  176.        break;
  177.  
  178.        case '4': {
  179.            pedirDatos(vectorA,vectorB);
  180.            producto=productoEscalar(vectorA,vectorB);
  181.            cout << "Su producto escalar es: " << producto << endl << endl;
  182.             }
  183.        break;
  184.  
  185.        case '5': {
  186.  
  187.            pedirDatos(vectorA,vectorB);
  188.            vectorResultado=productoVectorial(vectorA,vectorB);
  189.            cout << "El producto vectorial de A y B es (" << vectorResultado.vector[0] << "," <<
  190.            vectorResultado.vector[1] << "," << vectorResultado.vector[2] << ")" << endl << endl;
  191.        }
  192.  
  193.        break;
  194.  
  195.        case '6': {
  196.  
  197.            pedirDatos(vectorA);
  198.            vectorResultado=normalizacionVector(vectorA);
  199.            cout << "El vector asociado a A es (" << vectorResultado.vector[0] << "," <<
  200.            vectorResultado.vector[1] << "," << vectorResultado.vector[2] << ")" << endl << endl;
  201.  
  202.        }
  203.  
  204.        break;
  205.  
  206.        case '7': {
  207.  
  208.            pedirDatos(vectorA);
  209.            mayor=componenteMayor(vectorA);
  210.            cout << "La componente mayor es: " << mayor;
  211.        }
  212.  
  213.        break;
  214.        case '0':
  215.            return 0;
  216.    }
  217.  
  218.    } while (opcion!=0);
  219.  
  220.    return 0;
  221. }



« Última modificación: 13 Agosto 2011, 12:13 pm por elreplicante » En línea

Dark Invader

Desconectado Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
Re: Operaciones con vectores
« Respuesta #1 en: 16 Agosto 2011, 13:11 pm »


Mi programa resuelve estas cuestiones para vectores de dimensión 3.  Mi pregunta es cómo mejoraríais el programa para que pudiera realizar los mismos cálculos para vectores de dimensión definida por el usuario.  Si defino mi struct antes de las funciones, ¿cómo puedo hacer que la longitud del array lo introduzca el usuario?

Gracias!!!


Si solo el usuario sabe que tamaño le va a poner al array,lo mejor es crear un array dinamico,supongo que habras dado estructuras dinamicas en tu clase: http://www.fismat.umich.mx/mn1/manual/node10.html


En línea

PiroskY

Desconectado Desconectado

Mensajes: 76


пирожки


Ver Perfil
Re: Operaciones con vectores
« Respuesta #2 en: 16 Agosto 2011, 13:42 pm »

Y si todavia no lo viste, no es nada del otro mundo

Código:
int* a = NULL;   // Pointer to int, initialize to nothing.
int n;           // Size needed for array
cin >> n;        // Read in the size
a = new int[n];  // Allocate n ints and save ptr in a.
for (int i=0; i<n; i++) {
    a[i] = 0;    // Initialize all elements to zero.
}
. . .  // Use a as a normal array
delete [] a;  // When done, free memory pointed to by a.
a = NULL;     // Clear a to prevent using invalid memory reference.
En línea

Valkyr


Desconectado Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: Operaciones con vectores
« Respuesta #3 en: 16 Agosto 2011, 18:44 pm »

Podrías usar un Vector:

http://www.cplusplus.com/reference/stl/vector

Lo defines inicialmente vacio y según el número de elementos que quiera el usuario vas añadiendo con el método push_back. Además técnicamente todos las funciones de insercción, acceso a elementos, eliminar, y demás que puedes ver en el enlace que te dejo está implementadas de la forma más eficiente (o si no es la más eficiente, de las más eficientes xD)

Saludos.
En línea

elreplicante

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Operaciones con vectores
« Respuesta #4 en: 16 Agosto 2011, 21:15 pm »

En primer lugar gracias por las respuestas  :D

Si solo el usuario sabe que tamaño le va a poner al array,lo mejor es crear un array dinamico,supongo que habras dado estructuras dinamicas en tu clase: http://www.fismat.umich.mx/mn1/manual/node10.html


Efectivamente hemos dado estructuras dinámicas, en este caso no las he utilizado porque el problema está propuesto en el tema de estructuras estáticas así que traté de resolverlo con los conocimientos adquiridos hasta ese tema.

Y si todavia no lo viste, no es nada del otro mundo

PiroskY gracias por el apunte

Podrías usar un Vector:

http://www.cplusplus.com/reference/stl/vector

Lo defines inicialmente vacio y según el número de elementos que quiera el usuario vas añadiendo con el método push_back. Además técnicamente todos las funciones de insercción, acceso a elementos, eliminar, y demás que puedes ver en el enlace que te dejo está implementadas de la forma más eficiente (o si no es la más eficiente, de las más eficientes xD)

El enlace es muy interesante, no conocía estas funciones, seguramente porque a este nivel debemos pensar en cómo implementar esas funciones con bucles, condiciones etc.

Corrígeme si me equivoco pero por lo que he leido en el enlace, ¿un vector no es un array verdad?  Puede llevar a confusión por la traduccíón que hacemos al español de "array".  Parece que la ventaja que tienen es que se "expanden" y "comprimen" automáticamente, entre otras....

Muchas gracias!
En línea

Valkyr


Desconectado Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: Operaciones con vectores
« Respuesta #5 en: 16 Agosto 2011, 21:57 pm »

Efectivamente no es un array, es muy parecido pero no lo es. Un array tú lo declaras de un tamaño y de un tipo, el vector es un contenedor y están parametrizados, es decir, pueden almacenar cualquier tipo de elementos y como bien dices, expanden y comprimen el tamaño según la insercción o la eliminación.

Además, como se puede hacer sobrecarga de los operadores, se puede hacer acceso a los elementos como si fuese un array, lo cual, facilita mucho la comprensión de esta estructura de datos.

Saludos.
En línea

elreplicante

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Operaciones con vectores
« Respuesta #6 en: 16 Agosto 2011, 22:18 pm »

Creo que lo entiendo..... Lo mismo me queda un poco lejos pero te hago la pregunta por curiosidad.....

Para el caso de una agenda yo me declararía un struct typedef struct tAgenda {....} con los campos necesarios (nombre, tlf, etc...).  Y un array tipo typedef  tLista[] que contuviera los elemento de la agenda.  ¿Podría hacer esto mismo declarando un sólo vector?

Gracias!!!
 
En línea

Valkyr


Desconectado Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: Operaciones con vectores
« Respuesta #7 en: 17 Agosto 2011, 01:44 am »

Sí, podrías declarar primero tu struct que contuviese la información de los contactos y luego declarar un vector de ese tipo.

Aunque ya que veo que estás usando C++ podrías, en lugar de declarar un struct, crear una clase e ir almacenando objetos de esa clase, pero como no se si habréis visto clases en C++ en tú asignatura pues...me limito a comentarlo tan solo xD.

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Operaciones con videos...
Multimedia
-=CaZZaDoR=- 8 4,328 Último mensaje 13 Febrero 2004, 18:52 pm
por Songoku
2 operaciones con el boton X
Programación Visual Basic
fraktal 4 1,649 Último mensaje 14 Octubre 2006, 01:28 am
por NYlOn
Operaciones con
.NET (C#, VB.NET, ASP)
David Vans 0 2,759 Último mensaje 25 Abril 2007, 18:06 pm
por David Vans
operaciones con pilas
Ejercicios
hartouki 0 4,788 Último mensaje 17 Agosto 2009, 12:00 pm
por hartouki
ejercicios sobre operaciones con vectores en programacion C++
Ejercicios
aniyak 1 10,715 Último mensaje 9 Noviembre 2010, 03:15 am
por leogtz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines