Autor Tema: C++ programa para sumar vectores o arrays analizar código críticamente mejorarlo  (Leído 3072 veces)

CoduJ

  • Sin experiencia
  • *
  • Mensajes: 28
    • Ver Perfil
Muy buenas, espero que se encuentren bien. He programado un sencillo programa en donde puedes sumar vectores, quería, además de compartir el código, que me retroalimenten sobre el mismo, aporten consejos, crítica, etc.; me gustaría ver otras formas en las que ustedes harían esto.
Código: [Seleccionar]
#include<iostream>
#include<math.h>

using namespace std;

int main(){
int largoVector1 = 0, largoVector2 = 0, largoVectorMayor = 0;
bool largoVector = true; //true: vector 1 false: vector 2

cout<<"Largo del vector 1: "; cin>>largoVector1; //dar los valores de largo del vector
cout<<"Largo del vector 2: "; cin>>largoVector2;
int vector1[largoVector1]; //declaraciones de vectores
int vector2[largoVector2];
if(largoVector1 > largoVector2){ //ver cual de los dos vectores ses mayor
largoVectorMayor = largoVector1;
}else{
largoVectorMayor = largoVector2;
largoVector = false;
}
for(int i = 0; i < largoVectorMayor; i++){ //dejar en 0 cada espacion de los vectores
vector1[i] = 0;
vector2[i] = 0;
}
cout<<"\tVector 1:"<<endl;
for(int i = 0; i < largoVector1; i++){ //declarar valores de los vectores
cout<<"Vector: "; cin>>vector1[i];
}
cout<<"\tVector 2:"<<endl;
for(int i = 0; i < largoVector2; i++){
cout<<"Vector: "; cin>>vector2[i];
}
if(largoVector){ //hacer operatoria e imprimer el primer vector
cout<<"V1: | ";
for(int i = 0; i < largoVector1; i++){
cout<<vector1[i]<<" | ";
}
cout<<"\nV2: | ";
for(int i = 0; i < largoVector2+(largoVector1 - largoVector2); i++){
cout<<vector2[i]<<" | ";
}
for(int i = 0; i < largoVector1; i++){ //sumar vectores
vector1[i] += vector2[i];
}
cout<<"\nR:  | ";
for(int i = 0; i < largoVector1; i++){ //imprimir vectores
cout<<vector1[i]<<" | ";
}
}else{ //en caso de que el segundo vector sea mayor
cout<<"V1: | ";
for(int i = 0; i < largoVector1+(largoVector2 - largoVector1); i++){
cout<<vector1[i]<<" | ";
}
cout<<"\nV2: | ";
for(int i = 0; i < largoVector2; i++){
cout<<vector2[i]<<" | ";
}
for(int i = 0; i < largoVector2; i++){ //sumar vectores
vector2[i] += vector1[i];
}
cout<<"\nR:  | ";
for(int i = 0; i < largoVector2; i++){ //imprimir vectores
cout<<vector2[i]<<" | ";
}
}

return 0;
}
« Última modificación: 24 de Enero 2021, 13:54 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 985
    • Ver Perfil
Re: C++ - Opinión de código
« Respuesta #1 en: 08 de Noviembre 2020, 11:59 »
Hola.

El boolean te lo puedes ahorrar.
En los IF para determinar cómo hacer la suma de vectores según quien es el más grande, puedes comparar directamente el valor de sus longitudes, sin tener que usar previamente un boolean.
Tampoco necesitas la variable largoVectorMayor.

Y también te puedes ahorrar la inicialización a 0 de los elementos del vector.
Puesto que en el programa antes de operar con ellos, vamos a pedir por teclado sus valores, tenemos garantizado que cuando operemos tendrán valores válidos y no "basura" suelta que hayan encontrado por la RAM.

Luego, para imprimir el vector menor haces una operación matemática arriesgada:
Citar
for(int i = 0; i < largoVector2+(largoVector1 - largoVector2); i++){
         cout<<vector2<<" | ";
      }


Digo arriesgada, porque amplias el rango de elementos del arreglo.
Tú ahí quieres que ampliar para que el bucle vaya hasta la longitud del vector grande y calculas la diferencia entre ambas longitudes para sumarsela a la longitud menor.
Es innecesario, porque podría poner directamente que vaya hasta la longitud mayor, sin necesidad de calcular diferencia y sumarsela a la menor.
Pero además es arriesgado porque haces que el indice vaya hasta posiciones que el vector no tiene.
Si el vector menor mide por ejemplo 4, no debemos pedirle que vaya por encima de este valor.

Parecido ocurre con el bucle que suma vectores.
El límite en este caso ha de ser el del tamaño menor, pues esos son los elementos que vamos a sumar.
Los elementos del vector mayor, que están más alla de la longitud del menor, no se van a sumar ni tocar ni nada..., así que no hay que recorrerlos.

Te dejo este código haciendo esos cambios.
Fíjate que en el IF, pregunto si el primer vector es MAYOR O IGUAL.
Esto es importante, porque si solo nos preocupamos de si uno es mayor, o de si el otro es menor...¿que pasaría si resulta que ambos vectores miden lo mismo?

Código: [Seleccionar]
#include<iostream>
#include<math.h>

using namespace std;

int main(){
int largoVector1 = 0, largoVector2 = 0;

cout<<"Largo del vector 1: "; cin>>largoVector1; //dar los valores de largo del vector
cout<<"Largo del vector 2: "; cin>>largoVector2;
int vector1[largoVector1]; //declaraciones de vectores
int vector2[largoVector2];

cout<<"\tVector 1:"<<endl;
for(int i = 0; i < largoVector1; i++){ //declarar valores de los vectores
cout<<"Vector: "; cin>>vector1[i];
}
cout<<"\tVector 2:"<<endl;
for(int i = 0; i < largoVector2; i++){
cout<<"Vector: "; cin>>vector2[i];
}
if(largoVector1 >= largoVector2){ //hacer operatoria e imprimer el primer vector
cout<<"V1: | ";
for(int i = 0; i < largoVector1; i++){
cout<<vector1[i]<<" | ";
}
cout<<"\nV2: | ";
for(int i = 0; i < largoVector2; i++){
cout<<vector2[i]<<" | ";
}
for(int i = 0; i < largoVector2; i++){ //sumar vectores
vector1[i] += vector2[i];
}
cout<<"\nR:  | ";
for(int i = 0; i < largoVector1; i++){ //imprimir vectores
cout<<vector1[i]<<" | ";
}
}else{ //en caso de que el segundo vector sea mayor
cout<<"V1: | ";
for(int i = 0; i < largoVector1; i++){
cout<<vector1[i]<<" | ";
}
cout<<"\nV2: | ";
for(int i = 0; i < largoVector2; i++){
cout<<vector2[i]<<" | ";
}
for(int i = 0; i < largoVector1; i++){ //sumar vectores
vector2[i] += vector1[i];
}
cout<<"\nR:  | ";
for(int i = 0; i < largoVector2; i++){ //imprimir vectores
cout<<vector2[i]<<" | ";
}
}

return 0;
}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".