Dev - C++ - ayuda arreglos en C

 
Vista:

ayuda arreglos en C

Publicado por mario (2 intervenciones) el 07/11/2019 07:20:59
Que estoy haciendo mal en este ejercicio que no me esta saliendo, lo intente pero cuando copia no me copia bien, este es el enunciado:

realizar cargar 2 vectores lista1 Y lista2 ambos contendrán números enteros, se solicita generan un tercero lista C, con los valores de los vectores lista1 Y lista2 cargados,pero mezclados y ordenados en ascendente.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <stdlib.h>
 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
 
 #include <stdio.h>
#include <stdlib.h>
 
 int main()
{
  int aux, lista1[5],lista2[5],lista3[10];
  int i,j;
      //carga de lista 1
  for (i=0;i<5;i++){
                    printf("Escriba un número");
                    scanf("%d",&lista1[i]);
      }
     //carga de lista 2
  for (i=0;i<5;i++){
                    printf("Escriba un número");
                    scanf("%d",&lista2[i]);
      }
 
 // copiando a lista 3 
  j=0;
  for(i=0;i<5;i++)
  {
   lista3[j]=lista1[i];
   j++;
   lista3[j+1]=lista2[i];
   j++;
 
  }
 
 
 printf("El Tercer arreglo es");
  for (i=0;i<10;i++){
      printf("%d\n",lista3[i]);
  }
 
  system("PAUSE");
  return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda arreglos en C

Publicado por Alfil (1444 intervenciones) el 08/11/2019 07:35:29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdio.h>
 
void leerLista( int v[], int sz );
void ordenarLista( int v[], int sz );
void imprimirLista( int v[], int sz );
 
int main()
{
    int lista1[5];
    int lista2[5];
    int lista3[10];
    int i, j, k;
 
    printf( "\nLeer Lista 1:\n" );
    leerLista( lista1, 5 );
    printf( "\nLeer Lista 2:\n" );
    leerLista( lista2, 5 );
 
    ordenarLista( lista1, 5 );
    ordenarLista( lista2, 5 );
 
    i = j = k = 0;
    while( i < 5 ) {
        if( lista1[i] < lista2[j] ) {
            lista3[k] = lista1[i];
            k++;
            i++;
        } else if( j < 5 ) {
            lista3[k] = lista2[j];
            k++;
            j++;
        } else if( i < 5 ) {
            lista3[k] = lista1[i];
            k++;
            i++;
        }
    }
    while( j < 5 ) {
        lista3[k] = lista2[j];
        k++;
        j++;
    }
 
    printf( "\nLista 1: " );
    imprimirLista( lista1, 5 );
    printf( "\nLista 2: " );
    imprimirLista( lista2, 5 );
    printf( "\nLista 3: " );
    imprimirLista( lista3, 10 );
 
    printf( "\n" );
 
    return 0;
 
}
 
void leerLista( int v[], int sz )
{
    int i;
    for( i = 0; i < sz; i++ ) {
        printf( "valor %d: ", i + 1 );
        scanf( "%d", &v[i] );
    }
}
 
void ordenarLista( int v[], int sz )
{
    int valor;
    int j, i;
 
    for( i = 1; i < sz; i++ ) {
        valor = v[i];
        j = i;
        while( j > 0 && valor < v[j-1] ) {
            v[j] = v[j-1];
            j--;
        }
        v[j] = valor;
    }
}
 
void imprimirLista( int v[], int sz )
{
    int i;
    for( i = 0; i < sz; i++ )
        printf( "%d ", v[i] );
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda arreglos en C

Publicado por Rodrigo (539 intervenciones) el 08/11/2019 18:01:49
Tengo la impresion que esta solucion parece tener problemas si todos los elementos del segundo arreglo son menores que cualquiera de los elementos del primer arreglo.
En ese caso, la linea 24 es siempre falsa, se ejecutaran las lineas 28 a 31 haciendo que j llegue a 5, y en la siguiente vuelta, se estara comparando, en la linea 24 lista1[0] contra lista2[5] que no existe.

Tambien parece superfluo comparar i contra 5 en la linea 32, pues i < 5 es la condicion de continuacion del while, i no podria ser nunca >= 5, dado que la unica posibilidad de que asi sea esta en la linea 27, que si se ejecuto', entonces el else de esa linea no se va a considerar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda arreglos en C

Publicado por Alfil (1444 intervenciones) el 08/11/2019 18:17:33
i es el contador de elementos de lista1, j es el contador de elementos de lista2 y k el de lista3. En la línea 24 si lista1 es menor que lista2 coloca lista1 en lista3, los elementos de lista1 que sean mayores que cualquier elemento de lista2 se introducen en las líneas 32 a 35 siempre y cuando no se haya llegado al final del vector. Los elementos mayores de lista2 que cualquier elemento de lista1 se introducen en las líneas 38 a 21, igualmente mientras no se haya llegado al final del vector.

Prueba a ejecutar el programa con cualquier variedad de números en distintas posiciones.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda arreglos en C

Publicado por Rodrigo (539 intervenciones) el 08/11/2019 18:50:55
La intencion es evidente, pero la implementacion no parece bien. Puedes decir q ocurre si TODOS los elemenros del Segundo arreglo son menores?
Mi tesis: j llega a 5 y en la siguiente vuelta comparas lista1[0] y lista2[5]. No es asi?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda arreglos en C

Publicado por Alfil (1444 intervenciones) el 08/11/2019 19:12:31
El programa esta ejecutado con todas las posibilidades, y funciona correctamente. El índice de lista1 y lista2 en ningún caso puede ser mayor o igual a 5, eso se garantiza en la línea 32 para la lista1 y la línea 38 para la lista2. Tanto i (índice de la lista1) como j (índice de la lista2) sólo se incrementan si pasan un valor a lista3.

El único punto donde j puede valer 5 es en el bloque 32 a 36, una vez se ha agotado la lista2, donde no tiene ninguna relevancia. Lo mismo sucede en el bloque 38 a 42 con la variable i, donde tampoco tiene ninguna relevancia.

¿propones una solución distinta?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda arreglos en C

Publicado por Alfil (1444 intervenciones) el 08/11/2019 19:51:51
Se podrñia cambiar la línea 24 por:

1
if( j < 5 && lista1[i] < lista2[j] ) {
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda arreglos en C

Publicado por Rodrigo (539 intervenciones) el 08/11/2019 22:15:53
Gracias!
Ese cambio en el fondo esta diciendo que j podria llegar a 5.

Una manera de hacerlo mas evidente: Cambia la parte del codigo, por ejemplo a esto, con el segundo array completamente menor al otro, como indicaba antes. Con el codigo ORIGINAL, sin la modificacion que propones. Mira como j llega a 5.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    int lista1[5] = { 10,11,12,13,14 };
    int lista2[5] = { 1, 2, 3, 4, 5 };
    int lista3[10];
    int i, j, k;
 
    // superfluo para el ejemplo, pero solo para no cambiar tanto el original
    ordenarLista( lista1, 5 );
    ordenarLista( lista2, 5 );
 
    i = j = k = 0;
    while( i < 5 ) {
        printf("i:%d j:%d\n", i, j);  // <-- llega j a 5?

El hecho que el programa "funcione", no lo hace correcto. Es incorrecto usar la posicion 5 de este arreglo, AUNQUE funcione.
Muchos bugs han existido por años por casos similares y han funcionado ... hasta que la memoria contenida en esa posicion mas alla del arreglo tenia una valor que no servia y el error se hizo mas evidente.

Una manera que propongo para resolver el problema que indico es cambiar la condicion del while a alguna de estas 2 opciones:
- while( i < 5 && j < 5), y preocuparse fuera del ciclo (despues de el) copiar desde el arreglo que aun queda pendiente por copiar, pero esto genera codigo redundante, parecido a lo que ya esta y
- while(i < 5 || j < 5), y poner condiciones para copiar dependiendo de los valores de los indices al interior del ciclo
1
2
3
4
5
6
7
8
i = j = k = 0;
while( i < 5 || j < 5) {
    if( i >= 5 ) /* fin lista1 */ { lista3[k] = lista2[j++]; }
    else if( j >= 5 ) /* fin lista2 */ { lista3[k] = lista1[i++]; }
    else if( lista1[i] <= lista2[j])   { lista3[k] = lista1[i++]; }
    else                               { lista3[k] = lista2[j++]; }
    k++;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar