Autor
|
Tema: Programa C++ Tengo una duda con respecto a este programa. (Leído 5,454 veces)
|
Estudiante000000
Desconectado
Mensajes: 38
|
Continuando y analizando este programa. Hay que determinar #¿ Que hace el programa ? #¿ Cual es el valor de solucion[3] al finalizar el programa? #include<iostream> using namespace std; int main() { int valores[101], numeros[101], solucion[101]; int i = 1,j=1,z=1; int valor; for (i = 0; i <= 100; i = i + 1) { valores[i] = 0; numeros[i] = 0; solucion[i] = 0; } i = 1; while (i<101) { valor = i * 2; valores[i] = valor; i = i + 1; } for (i = 1; i <= 100; i = i + 1) { valor = i * 3; numeros[i] = valor; } i = 1; iterar: for (j = 1; j <= 100; j = j + 1) { if (valores[i] == numeros[j]) { solucion[z] = valores[i]; z = z + 1; } } if (i <= 100) { i = i + 1; goto iterar; } if (solucion[1] != 0) { cout << "Solucion = " << solucion[1]; } for (i = 2; i <= 100; i = i+1) { if (solucion[i] != 0) { cout << " - " << solucion[i]; } } cout << endl; return i; }
|
|
« Última modificación: 22 Noviembre 2018, 03:30 am por Estudiante000000 »
|
En línea
|
|
|
|
K-YreX
|
Muy bien, empecemos por partes. #include <iostream> #include <stdlib.h>
Lo primero de todo parece que estás programando en C++. Por lo tanto sería recomendable usar el formato de las librerías de C++: una libreria C se declararía como <libreria.h> como has hecho en <stdlib.h>. Su variante en C++ sería <clibreria>, es decir, que la misma librería quedaría <cstdlib>. El funcionamiento va a ser correcto de todos modos pero es simplemente por aclarar esto desde los comienzos de la programación. Por tanto sería conveniente modificarlo por: #include <iostream> #include <cstdlib>
Dicho esto empecemos con el programa ya que veo algunos errores básicos. Creo que no es necesario analizar exhaustivamente las primeras líneas; en ellas declaramos 3 arrays (vectores) de tamaño 101, 3 variables i, j, z inicializadas a 1 y una variable valor. Es conveniente también no usar "números mágicos", estos son números que aparecen literales como el 101, por lo tanto el tamaño de los arrays es conveniente hacerlo con constantes, así si queremos cambiar el tamaño solo tenemos que cambiarlo en un sitio y el programa funcionaría correctamente: const int TAM = 101; int valores[TAM], numeros[TAM], solucion[TAM];
Vamos a revisar el acceso a los arrays. Un array v[3] tiene tamaño = 3, va de 0 a 2, por lo tanto sus posiciones son v[0], v[1], v[2]. Visto esto el bucle quedaría así para poner todas las posiciones a 0: for (i = 0; i < TAM; i++) // CICLO FOR PARA RELLENAR LOS 3 VECTORES CON CEROS EN TODAS SUS POSICIONES. { valores[i] = 0; numeros[i] = 0; solucion[i] = 0; }
Pero esto no es necesario ya que si en la declaración hacemos: const int TAM = 101; int valores[TAM] = {0}, numeros[TAM] = {0}, solucion[TAM] = {0};
Excepcionalmente si inicializamos los arrays así, se inicializarían todas las posiciones del array a 0. El segundo bloque empezando en i = 1, guarda el doble de i (imagino que en la posición i del vector) e incrementa i en 1. Primero vemos que falta el índice del array como en el bucle anterior y en segundo lugar vemos que si i empieza en 1 la posición 0 no se modifica por lo que valores[0] = 0. Una alternativa es usar un bucle for y evitar el uso del 101 usando la variable TAM, también se puede evitar el uso de la variable valor (opcional). Esto quedaría: for (i = 1; i < TAM; i++) // ESTE CONDICIONAL ME VA GUARDAR LOS NUMEROS DE 2 EN 2 HASTA EL 200 EN LA VARIABLE VALORES . { valor = i * 2; valores[i] = valor; }
Excepcionalmente date cuenta que si la primera operación que hacemos sobre el array valores es de escritura no es necesario inicializarlo a 0 y simplemente empezando este segundo for en i = 0 el resultado obtenido sería el mismo, pero no es mala idea inicializar las variables en la declaración. El tercer bloque es estructuralmente idéntico al segundo ya explicado por lo que puedes aplicar las mismas modificaciones. Recuerda siempre poner el índice al array, es fundamental. El cuarto bloque... Vamos a corregirlo de raíz porque tiene graves problemas. Pero para ello necesito que me expliques cual es el funcionamiento deseado ya que tiene muchas interpretaciones posibles o si simplemente te han dado este código para que lo analices (de ser así un código un poco...). Bueno espero tu respuesta. Ahora analizamos el bloque final. Me he dado cuenta ahora de que igual no sabías que la primera posición del array es la 0, no la 1. El trozo de "Solucion = " hay que ponerlo antes del if ya que si la posición 1 es 0 pero las otras no, se escribirían las otras posiciones pero no aparecería "Solucion = " por pantalla. Además faltaba el índice dentro del for de <solucion>. El código quedaría algo así: cout << "Solucion = "; if (solucion[0] != 0) { cout << solucion[1]; } for (i = 1; i < TAM; i++) { if (solucion[i] != 0) { cout << " - " << solucion[i]; } }
Y para finalizar, comentarte que hay muchas referencias a evitar la llamada system("pause"). Como alternativa te recomiendo cin.get(); Puedes buscar información adicional sobre esto si te interesa. PD: Viendo el funcionamiento del programa igual lo correcto era crear arrays de tamaño 100 y empezar metiendo el 1 en posición 0. Ya que es un valor que he visto que no se ha utilizado en toda la ejecución del programa. Te lo dejo a ti por si quieres intentarlo y me cuentas. En cuanto a tu segunda pregunta no puedo darte una respuesta sin saber cual es el funcionamiento buscado en el bloque que he dejado sin explicar.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
Estudiante000000
Desconectado
Mensajes: 38
|
Muy bien, empecemos por partes. #include <iostream> #include <stdlib.h>
Lo primero de todo parece que estás programando en C++. Por lo tanto sería recomendable usar el formato de las librerías de C++: una libreria C se declararía como <libreria.h> como has hecho en <stdlib.h>. Su variante en C++ sería <clibreria>, es decir, que la misma librería quedaría <cstdlib>. El funcionamiento va a ser correcto de todos modos pero es simplemente por aclarar esto desde los comienzos de la programación. Por tanto sería conveniente modificarlo por: #include <iostream> #include <cstdlib>
Dicho esto empecemos con el programa ya que veo algunos errores básicos. Creo que no es necesario analizar exhaustivamente las primeras líneas; en ellas declaramos 3 arrays (vectores) de tamaño 101, 3 variables i, j, z inicializadas a 1 y una variable valor. Es conveniente también no usar "números mágicos", estos son números que aparecen literales como el 101, por lo tanto el tamaño de los arrays es conveniente hacerlo con constantes, así si queremos cambiar el tamaño solo tenemos que cambiarlo en un sitio y el programa funcionaría correctamente: const int TAM = 101; int valores[TAM], numeros[TAM], solucion[TAM];
Vamos a revisar el acceso a los arrays. Un array v[3] tiene tamaño = 3, va de 0 a 2, por lo tanto sus posiciones son v[0], v[1], v[2]. Visto esto el bucle quedaría así para poner todas las posiciones a 0: for (i = 0; i < TAM; i++) // CICLO FOR PARA RELLENAR LOS 3 VECTORES CON CEROS EN TODAS SUS POSICIONES. { valores[i] = 0; numeros[i] = 0; solucion[i] = 0; }
Pero esto no es necesario ya que si en la declaración hacemos: const int TAM = 101; int valores[TAM] = {0}, numeros[TAM] = {0}, solucion[TAM] = {0};
Excepcionalmente si inicializamos los arrays así, se inicializarían todas las posiciones del array a 0. El segundo bloque empezando en i = 1, guarda el doble de i (imagino que en la posición i del vector) e incrementa i en 1. Primero vemos que falta el índice del array como en el bucle anterior y en segundo lugar vemos que si i empieza en 1 la posición 0 no se modifica por lo que valores[0] = 0. Una alternativa es usar un bucle for y evitar el uso del 101 usando la variable TAM, también se puede evitar el uso de la variable valor (opcional). Esto quedaría: for (i = 1; i < TAM; i++) // ESTE CONDICIONAL ME VA GUARDAR LOS NUMEROS DE 2 EN 2 HASTA EL 200 EN LA VARIABLE VALORES . { valor = i * 2; valores[i] = valor; }
Excepcionalmente date cuenta que si la primera operación que hacemos sobre el array valores es de escritura no es necesario inicializarlo a 0 y simplemente empezando este segundo for en i = 0 el resultado obtenido sería el mismo, pero no es mala idea inicializar las variables en la declaración. El tercer bloque es estructuralmente idéntico al segundo ya explicado por lo que puedes aplicar las mismas modificaciones. Recuerda siempre poner el índice al array, es fundamental. El cuarto bloque... Vamos a corregirlo de raíz porque tiene graves problemas. Pero para ello necesito que me expliques cual es el funcionamiento deseado ya que tiene muchas interpretaciones posibles o si simplemente te han dado este código para que lo analices (de ser así un código un poco...). Bueno espero tu respuesta. Ahora analizamos el bloque final. Me he dado cuenta ahora de que igual no sabías que la primera posición del array es la 0, no la 1. El trozo de "Solucion = " hay que ponerlo antes del if ya que si la posición 1 es 0 pero las otras no, se escribirían las otras posiciones pero no aparecería "Solucion = " por pantalla. Además faltaba el índice dentro del for de <solucion>. El código quedaría algo así: cout << "Solucion = "; if (solucion[0] != 0) { cout << solucion[1]; } for (i = 1; i < TAM; i++) { if (solucion[i] != 0) { cout << " - " << solucion[i]; } }
Y para finalizar, comentarte que hay muchas referencias a evitar la llamada system("pause"). Como alternativa te recomiendo cin.get(); Puedes buscar información adicional sobre esto si te interesa. PD: Viendo el funcionamiento del programa igual lo correcto era crear arrays de tamaño 100 y empezar metiendo el 1 en posición 0. Ya que es un valor que he visto que no se ha utilizado en toda la ejecución del programa. Te lo dejo a ti por si quieres intentarlo y me cuentas. En cuanto a tu segunda pregunta no puedo darte una respuesta sin saber cual es el funcionamiento buscado en el bloque que he dejado sin explicar. Vale muchísimas gracias por tu respuesta , estos codigos no los hago yo son así que nos lo da el profesor para que lo analizemos , tal cual digamos correr el programa en frío se que los arreglos empiezan de la posición 0 esto es muy correcto pero en el programa lo inicializo en 1 y declaro la dimensión del vector en [101] porque a según nosotros en el laboratorio de la universidad no usas Dev c++ , si no el visual basic c++ , y según acá si lo declarase vector[100] no leria el programa la posición 100 si no desde la posición 0 a la posición 99 , saludos.
|
|
|
En línea
|
|
|
|
K-YreX
|
Claro, es cierto que si el vector es de tamaño 100 no puedes acceder a la posición 100 ya que la última es la 99 pero lo que se suele hacer es guardar el primer valor en la posición 0 (aunque sea un 1) y así en la 99 (entraría el último valor 100). Como es lógico, no coincide el índice con el número que vas a almacenar (por ejemplo el 1 en la posición 0 en vez de el 1 en la posición 1) pero eso se puede arreglar ajustando el código donde sea necesario usando algún <i+1> en vez de i para que todo cuadre. De todos modos nunca he usado el Visual Basic C++ entonces igual es algo a tener en cuenta si se usa ese IDE (no voy a hablar de lo que no sé). Pero una cosa importante es que o no estoy teniendo en cuenta que sea posible ejecutar ese código o ese código desde mi punto de vista al menos tiene errores básicos como la falta de índices ya que si no usas índice diría desde mis conocimientos que accedes a la posición de memoria y creo que ese no es el objetivo. A mí al menos compilando desde una terminal de Ubuntu me salen errores de compilación con ese código. Por lo tanto si el código no es tuyo no puedo adivinar que debería hacer ese cuarto bloque que no he descrito antes pero intento explicarte así en líneas generales: Si poner una etiqueta al código mediante: etiqueta:
puede hacer un salto incondicional a esa etiqueta con la orden <goto> y el nombre de la etiqueta, tal que: goto etiqueta;
por lo que cuando se ejecuta la línea del <goto> lo que se produce es un salto hacia atrás que es donde está la etiqueta. Normalmente esto son prácticas no recomendadas en lenguajes de alto nivel al igual que evitar el uso de <break> (excepto en bloque switch) y otras más. Puedes buscar información adicional respecto a esto si te interesa saber cuales son esas instrucciones. Y bueno para terminar lo otro que falta por analizar son simples operaciones aritmético-lógicas y de asignación que no tienen mayor misterio.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
K-YreX
|
En ese caso me gustaría que alguien me explicase cómo pueden compilar esos códigos. Porque hasta donde yo llego no puedes acceder a cada elemento de un array n-dimensional sin usar algún tipo de indexación y en este programa se modifican los valores de los arrays sin hacer uso de los índices.
Duda resuelta: No aparece la indexación porque al no utilizar etiquetas de código la indexación de la variable i, es decir entre corchetes [ ], se traduce como letra cursiva y no se ve tal cual en el texto.
|
|
« Última modificación: 17 Noviembre 2018, 23:38 pm por YreX-DwX »
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
Estudiante000000
Desconectado
Mensajes: 38
|
Continuando y analizando este programa.
.
|
|
« Última modificación: 21 Noviembre 2018, 23:59 pm por Estudiante000000 »
|
En línea
|
|
|
|
Estudiante000000
Desconectado
Mensajes: 38
|
En ese caso me gustaría que alguien me explicase cómo pueden compilar esos códigos. Porque hasta donde yo llego no puedes acceder a cada elemento de un array n-dimensional sin usar algún tipo de indexación y en este programa se modifican los valores de los arrays sin hacer uso de los índices.
Duda resuelta: No aparece la indexación porque al no utilizar etiquetas de código la indexación de la variable i, es decir entre corchetes [ ], se traduce como letra cursiva y no se ve tal cual en el texto.
Analize el programa pero aun no lo entiendo ya puse el programa bien para que lo puedas visualizar y acabo de explicar lo que entiendo en algunas partes del programa
#include<iostream> using namespace std; int main() { int valores[101], numeros[101], solucion[101]; int i = 1,j=1,z=1; int valor; for (i = 0; i <= 100; i = i + 1) { valores[i] = 0; numeros[i] = 0; solucion[i] = 0; } i = 1; while (i<101) { valor = i * 2; valores[i] = valor; i = i + 1; } for (i = 1; i <= 100; i = i + 1) { valor = i * 3; numeros[i] = valor; } i = 1; iterar: for (j = 1; j <= 100; j = j + 1) { if (valores[i] == numeros[j]) { solucion[z] = valores[i]; z = z + 1; } } if (i <= 100) { i = i + 1; goto iterar; } if (solucion[1] != 0) { cout << "Solucion = " << solucion[1]; } for (i = 2; i <= 100; i = i+1) { if (solucion[i] != 0) { cout << " - " << solucion[i]; } } cout << endl; return i; }
[/quote] En mi analisis y porfa si me puedes corregir necesito entender esta parte del programa while (i<101) { valor = i * 2; valores[i] = valor; i = i + 1; }
En esta parte del codigo estoy almacenando valor ( que serian los numeros de 2 en 2 hasta el 200) en el vector valores , y mi arreglo vectores quedaria algo asi en su composicion.
vectores={0,2,4,6,8,10,12,14,16,18,20,22...200} Hasta llegar al numero 200 , comenzando desde el valor 0 , en la posiciòn 0 que no fue modificado porque el ciclo while empezo desde i=1.
Siguiendo con el analisis , nos vamos al ciclo for siguiente.
for (i = 1; i <= 100; i = i + 1) { valor = i * 3; numeros[i] = valor; }
Analizando este for , saco como conclusion que sera para almacenar valor ( que serian los numeros de 3 en 3 hasta el 300) en el vector numeros ,y mi arreglo numeros quedaria de la siguiente manera.
numeros={0,3,6,9,12,15,18,21,24,27...300} Y Asi sucesivamente hasta llegar al 300 comenzando por el valor 0 , en la posicion 0 cual permanecio asi , porque el for empezo desde i=1.
Continuando con el analisis y la parte que no entiendo es la siguiente.
i = 1; iterar: for (j = 1; j <= 100; j = j + 1) { if (valores[i] == numeros[j]) { solucion[z] = valores[i]; z = z + 1; } } if (i <= 100) { i = i + 1; goto iterar; }
En esta parte basicamente segun lo que veo es que voy a empezar con ciclo for desde que j=1, hasta que j<=100 , y cual con un if voy a comparar los arreglos valores y numeros[j] , y si hacemos la primera comparacion tengo que :
valores[i=1] = 2 y numeros[j=1] = 3 cual la condicion del if no deberia de cumplirse , asi que pasaria al siguiente if
if (i <= 100) { i = i + 1; goto iterar; }
En este if como i=1 es menor o igual que 100 , se cumple la condicion y voy a iterar i , y posterior redireccionarme con el goto iterar hasta este for.
iterar: for (j = 1; j <= 100; j = j + 1) { if (valores[i] == numeros[j]) { solucion[z] = valores[i]; z = z + 1; } }
Como itero j y i , quedarian i=2 y j=2 , y se haria de nuevo la comparacion pero tendria lo siguiente
valores[i=2] = 4 y en numeros[j=2] = 6 , lo cual de nuevo no se cumpliria la condicion del if y asi sucesivamente y siempre se harian las comparaciones hasta que i=99 lo cual que esa condicion nunca se cumpliria , no se me equivoco en algo dime porfavor.
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
El siguiente fragmento del codigo puede ser optimizado: int valores[101], numeros[101], solucion[101]; //.. for (i = 0; i <= 100; i = i + 1) { valores[i] = 0; numeros[i] = 0; solucion[i] = 0; }
Por int valores[101]= {0}, numeros[101] = {0}, solucion[101] = {0};
O int valores[101], numeros[101], solucion[101]; memset(valores ,0,101*sizeof(int); memset(numeros ,0,101*sizeof(int); memset(solucion ,0,101*sizeof(int);
Asi todos los elementos del arreglo se inicializan con valores 0. Saludos
|
|
« Última modificación: 22 Noviembre 2018, 00:13 am por AlbertoBSD »
|
En línea
|
|
|
|
Estudiante000000
Desconectado
Mensajes: 38
|
El siguiente fragmento del codigo puede ser optimizado: int valores[101], numeros[101], solucion[101]; //.. for (i = 0; i <= 100; i = i + 1) { valores[i] = 0; numeros[i] = 0; solucion[i] = 0; }
Por int valores[101]= {0}, numeros[101] = {0}, solucion[101] = {0};
O int valores[101], numeros[101], solucion[101]; memset(valores ,0,101*sizeof(int); memset(numeros ,0,101*sizeof(int); memset(solucion ,0,101*sizeof(int);
Asi todos los elementos del arreglo se inicializan con valores 0. Saludos Lo se pero quisiera saber en que consiste el resto del codigo no lo entiendo
|
|
|
En línea
|
|
|
|
K-YreX
|
Continuando con el analisis y la parte que no entiendo es la siguiente. i = 1; iterar: for (j = 1; j <= 100; j = j + 1){ if (valores[i] == numeros[j]){ solucion[z] = valores[i]; z = z + 1; } } if (i <= 100){ i = i + 1; goto iterar; }
En esta parte basicamente segun lo que veo es que voy a empezar con ciclo for desde que j=1, hasta que j<=100 , y cual con un if voy a comparar los arreglos valores y numeros[j] , y si hacemos la primera comparacion tengo que :
valores[i=1] = 2 y numeros[j=1] = 3 cual la condicion del if no deberia de cumplirse , asi que pasaria al siguiente if if (i <= 100){ i = i + 1; goto iterar; }
En este if como i=1 es menor o igual que 100 , se cumple la condicion y voy a iterar i , y posterior redireccionarme con el goto iterar hasta este for. iterar: for (j = 1; j <= 100; j = j + 1){ if (valores[i] == numeros[j]){ solucion[z] = valores[i]; z = z + 1; } }
Como itero j y i , quedarian i=2 y j=2 , y se haria de nuevo la comparacion pero tendria lo siguiente
valores[i=2] = 4 y en numeros[j=2] = 6 , lo cual de nuevo no se cumpliria la condicion del if y asi sucesivamente y siempre se harian las comparaciones hasta que i=99 lo cual que esa condicion nunca se cumpliria , no se me equivoco en algo dime porfavor. Todo el análisis que no aparece en la cita es correcto, está bastante bien. Pero a partir de aquí es donde tienes un error así que vamos a ello. Voy a ponerte un ejemplo para que veas a donde quiero llegar: iterar: cout << "Se repite la iteracion" << endl; for (j = 1; j <= 100; j = j + 1){ if (valores[i] == numeros[j]){ solucion[z] = valores[i]; z = z + 1; } } if (i <= 100){ i = i + 1; goto iterar; }
Si pruebas a ejecutar esto en lugar del código original (solo he añadido una línea después de la etiqueta iterar) verás el porqué del error y el porqué de que no se recomiende usar etiquetas y <goto> para los saltos. El sentido de añadir esa frase antes del <for> es que cada vez que se ejecute <goto etiqueta> se va a repetir esa frase en pantalla... Por qué? Vamos a analizarlo de nuevo sin la instrucción que he añadido que es meramente demostrativa: El comienzo que has hecho es correcto, antes de llegar al <for> tienes <i = 1>, entonces (importante) ENTRAS en el <for> por lo tanto <j = 1>. Comparamos: valores[i = 1] = 2 numeros[j = 1] = 3 Son distintos, entonces otra iteración del <for> ahora con <j = 2>. Entonces vamos a comparar cada posición de <numeros> con <valores[1]>. Nunca va a ser cierto ya que <numeros> sigue creciendo y <valores[1]> es menor que todos. Llegamos al final del <for> con <j = 100> ahora ya no se va a repetir, entonces salimos del <for> y miramos el <if> de fuera: ¿i <= 100? Sí, entonces <i = 2> y <goto iterar>. Volvemos ANTES del <for> entonces se ejecuta la inicialización otra vez, <i = 1> y se repite el proceso comparamos cada valor de <numeros> con <valores[2]> lo que nunca va a ser cierto. Creo que ahora ya vas viendo lo que va a hacer: ¿Cuándo va a entrar al <if> que hay dentro del <for>? Cuando un valor esté en <valores> y en <numeros>. Y como en <valores> tenemos los múltiplos de 2 y en <numeros> tenemos los múltiplos de 3... Que va a haber en <soluciones>? Exacto, los múltiplos de 2 y 3 al mismo tiempo, es decir, los múltiplos de 6. Ahora ya podemos responder a la pregunta, te la dejo a ti que seguro que te hace más ilusión dar con la respuesta correcta en vez de decírtelo yo.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
tengo un problema con este programa.
Programación C/C++
|
Danyel_Casvill
|
9
|
4,251
|
12 Noviembre 2010, 22:29 pm
por flony
|
|
|
ayuda con este programa, tengo un error logico creo
Programación C/C++
|
TaLaP0 XoR BiT
|
2
|
2,812
|
3 Diciembre 2012, 04:06 am
por TaLaP0 XoR BiT
|
|
|
tengo un problema con este programa en c++
Programación C/C++
|
mikael2018
|
1
|
1,792
|
29 Octubre 2014, 15:35 pm
por eferion
|
|
|
Por fa ayuda con este programa en c ++ que no tengo idea de como hacerlo
Programación C/C++
|
cefagure
|
1
|
3,045
|
28 Mayo 2015, 20:24 pm
por Br1ant
|
|
|
Instalar este programa y no tengo ni idea en Linux
« 1 2 3 »
GNU/Linux
|
Meta
|
28
|
12,409
|
5 Diciembre 2016, 14:06 pm
por MinusFour
|
|