Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: PeinSoR en 20 Marzo 2022, 00:32 am



Título: Ayuda con vectores infinitos
Publicado por: PeinSoR en 20 Marzo 2022, 00:32 am
Hola a todos!
Tengo poca practica con los arreglos, quiero hacer un programa que sea de conjuntos (n cantidad de conjuntos) y que cada conjunto contenga 5 elementos. Pero no tengo muy claro como hacer eso, hasta el momento este es mi avance, pero al imprimir los valores, el numero de conjunto esta mal y solo los elementos tampoco los imprime bien (en el caso de que trabaje con 2 conjuntos, suman un total de 10 elementos, y solo imprime los últimos 5 que ingrese), espero puedan ayudarme a aclarar mis dudas.  :huh:

Código
  1. #include<stdio.h>
  2. int main(){
  3. int cantidad;
  4. int arreglo1[cantidad];
  5. int arreglo2[5];
  6. int i,j;
  7. printf("Cuantos conjuntos?: ");
  8. scanf("%d",&cantidad);
  9. printf("\nHas elegido trabajar con %d conjuntos procederemos a ingresar los elementos de sus conjuntos",cantidad);
  10. for(i=0;i<cantidad;i++){
  11. for(j=0;j<5;j++){
  12. printf("\nIngrese el elemento %d de su conjunto %d: ",j+1,i+1);
  13. scanf("%d",&arreglo2[j]);
  14. }
  15. }
  16. printf("Tus conjuntos son: )");
  17. for(i=0;i<cantidad;i++){
  18. printf("\nconjunto %d",arreglo1[i]);
  19. for(j=0;j<5;j++){
  20. printf("\t%d",arreglo2[j]);
  21. }
  22. }
  23. }

MOD: El código debe ir entre etiquetas de Código GeSHi


Título: Re: Ayuda con vectores infinitos
Publicado por: BloodSharp en 20 Marzo 2022, 02:14 am
quiero hacer un programa que sea de conjuntos (n cantidad de conjuntos) y que cada conjunto contenga 5 elementos. (...) pero al imprimir los valores, el numero de conjunto esta mal y solo los elementos tampoco los imprime bien (en el caso de que trabaje con 2 conjuntos, suman un total de 10 elementos, y solo imprime los últimos 5 que ingrese), espero puedan ayudarme a aclarar mis dudas.  :huh:

Código
  1. int cantidad;
  2. int arreglo1[cantidad];
Nunca, pero nunca crees un vector fijo sin previamente asignarle un valor. Si vas a trabajar con C puro tenés que crearlo dinámicamente con malloc/calloc y finalmente liberar la memoria con free, en su defecto si utilizás C++ podés utilizar new/delete o vectores dinámicos con el template de vector de la standard template library

Código
  1. int arreglo2[5];
  2.  
  3. for(i=0;i<cantidad;i++){
  4. for(j=0;j<5;j++){
  5. printf("\nIngrese el elemento %d de su conjunto %d: ",j+1,i+1);
  6. scanf("%d",&arreglo2[j]);
  7. }
  8. }
  9. printf("Tus conjuntos son: )");
  10. for(i=0;i<cantidad;i++){
  11. printf("\nconjunto %d",arreglo1[i]);
  12. for(j=0;j<5;j++){
  13. printf("\t%d",arreglo2[j]);
  14. }
  15. }

El tema es que siempre vas a tener lo últimos 5 valores porque no creaste los elementos por conjuntos, sinó que creaste 5 elementos únicamente y los sobreescribís en el primer for anidado con el for...

Ahora si comencemos: ¿Cada conjunto debe tener sus propios 5 elementos verdad?

Código
  1. typedef struct conjunto_s
  2. {
  3.    int m_iElementos[5];
  4. }conjunto_t;

Si se puede usar C++ en este caso yo recomiendo utilizar la plantilla de vectores de la standard template library que permite crear vectores dinámicos facilmente:

Código
  1. #include <vector>
  2. std::vector<conjunto_t> vConjuntos;

Luego creamos un conjunto temporal para ir guardando cada conjunto y añadirselo al vector de conjuntos:
Código
  1. conjunto_t conjuntoTemporal;

Para añadir usamos la función push_back que lo pone al final del vector y cuando terminamos el programa usamos clear.

Ejemplo del programa finalizado:
Código
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <cstdio>
  3. #include <vector>
  4.  
  5. typedef struct conjunto_s
  6. {
  7.    int m_iElementos[5];
  8. }conjunto_t;
  9.  
  10. int main()
  11. {
  12.    int iCantidadConjuntos = -1;
  13.    int iIndiceConjunto, iIndiceElemento;
  14.    std::vector<conjunto_t> vConjuntos;
  15.    conjunto_t conjuntoTemporal;
  16.  
  17.    while (iCantidadConjuntos <= 0)
  18.    {
  19.        printf("\nCuantos conjuntos?: ");
  20.        scanf("%d", &iCantidadConjuntos);
  21.    }
  22.  
  23.    printf("\nHas elegido trabajar con %d conjuntos procederemos a ingresar los elementos de sus conjuntos", iCantidadConjuntos);
  24.    for (iIndiceConjunto = 0; iIndiceConjunto < iCantidadConjuntos; iIndiceConjunto++)
  25.    {
  26.        for (iIndiceElemento = 0; iIndiceElemento < 5; iIndiceElemento++)
  27.        {
  28.            printf("\nIngrese el elemento %d de su conjunto %d: ", iIndiceElemento + 1, iIndiceConjunto + 1);
  29.            scanf("%d", &conjuntoTemporal.m_iElementos[iIndiceElemento]);
  30.        }
  31.        vConjuntos.push_back(conjuntoTemporal);
  32.    }
  33.  
  34.    printf("Tus conjuntos son: ");
  35.    for (iIndiceConjunto = 0; iIndiceConjunto < vConjuntos.size(); iIndiceConjunto++)
  36.    {
  37.        printf("\nconjunto %d", iIndiceConjunto);
  38.        for (iIndiceElemento = 0; iIndiceElemento < 5; iIndiceElemento++)
  39.            printf("\t%d", vConjuntos[iIndiceConjunto].m_iElementos[iIndiceElemento]);
  40.    }
  41.  
  42.    vConjuntos.clear();
  43.    return 0;
  44. }

Como medida final te recomendaría renombrar todas las variables con un nombre más adecuado...


B#