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

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]  (Leído 11,940 veces)
Caster


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
« Respuesta #10 en: 8 Diciembre 2013, 16:40 pm »

Me voy a tomar la libertad de responderte por él, que me corrija alguien si me equivoco. Para empezar, los whiles te permiten el no tener porque introducir siempre un resultado, en un mensaje más arriba decías que no sabias como hacer para no tener que introducir obligatoriamente 3 datos, eso es lo que te permite el while, getchar() es una función que espera un carácter introducido por el teclado, entonces ahí se le esta asignando a la variable ch un carácter introducido por el teclado y lo que el while es que va a estar esperando un carácter mientras no pulses enter, es decir, mientras no introduzcas el carácter '\n', y por último, puts() también sirve para mostrar cosas por pantalla, la diferencias es que con puts no puedes mostrar el valor de una variable, es decir, no podrías hacer esto:

puts("%d", variable);

Espero haberme explicado bien, saludos.


En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
« Respuesta #11 en: 8 Diciembre 2013, 16:49 pm »

Concretando un poco más, el while es un bucle que se "come" lo que queda en el buffer.

Pruébalo quitandolo y verás lo que sucede, se podría  saltar algunos scanf.

Saluditos! ....


« Última modificación: 8 Diciembre 2013, 17:47 pm por leosansan » En línea

SoyelRobert

Desconectado Desconectado

Mensajes: 46



Ver Perfil
Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
« Respuesta #12 en: 8 Diciembre 2013, 17:42 pm »

mm todo claro!

Era simplemente que habeis usado una sintaxis un poco diferente a la que estoy usando yo, por ejemplo:


Código:
while ((ch = getchar()) != EOF && ch != '\n');

este código yo lo escribiría así:

Código:
while(ch != EOF && != '\n') ch = getchar();

supongo que son equivalentes, del mismo modo que tambíen lo sería:

Código:
do{
ch = getchar;
}while(ch != EOF && != '\n');

corregidme si me equivoco jeje

Por el resto todo entendido, muchisimas gracias! voy a ponerme ahora a intentar hacer una función que saque las quinielas simples equivalentes... cuando lo tenga lo subiré por aquí por si a alguien le pudiese interesar (si lo consigo, que no creo... ya que esto es digamos "la dificultad" del ejercicio.)

habeis sido de gran ayuda!
« Última modificación: 8 Diciembre 2013, 17:44 pm por SoyelRobert » En línea

getting louder!
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
« Respuesta #13 en: 8 Diciembre 2013, 18:16 pm »

Código:
while ((ch = getchar()) != EOF && ch != '\n');
este código yo lo escribiría así:
Código:
while(ch != EOF && != '\n') ch = getchar();
supongo que son equivalentes
No lo son. La forma que propones no es valida ya que "!=" es un operador binario (requiere dos operandos). Un caso similar que de vez en cuando aparece en los foros es:
Código
  1. while (min <= x <= max) ...
Esa es la forma usual en matemáticas pero en C y C++ es un error lógico, aun cuando sea redundante se deben indicar los dos operandos requeridos:
Código
  1. while (min <= x && x <= max) ...

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
SoyelRobert

Desconectado Desconectado

Mensajes: 46



Ver Perfil
Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
« Respuesta #14 en: 8 Diciembre 2013, 18:32 pm »

sisi, me he comido el "ch" sin querer jaja   :rolleyes:
En línea

getting louder!
SoyelRobert

Desconectado Desconectado

Mensajes: 46



Ver Perfil
Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
« Respuesta #15 en: 8 Diciembre 2013, 19:05 pm »

Concretando un poco más, el while es un bucle que se "come" lo que queda en el buffer.

Pruébalo quitandolo y verás lo que sucede, se podría  saltar algunos scanf.

Saluditos! ....


vale, hay algo que se me sigue escapando en esta parte del codigo:

Código:
for(j=0;j<3;j++){
        printf("\n A[%d][%d]: ",i+1,j+1);
        scanf("%c", &A[i][j]);
        while ((ch = getchar()) != EOF && ch != '\n');

vamos a ver:

En primer lugar ese "EOF" de poco sirve no? quiero decir, si la condición fuese únicamente que ch sea distinto del salto de línea sería suficiente no?.

Y que es lo que está pasando en ese for exactamente?

entiendo que:

desde j = 0 hasta j = 2 hace una printf y un scanf y luego el while...

entonces entiendo que siempre que de un salto de linea tanto el scanf como el while lo "notan", es decir, se guarda un salto de linea en la componente de la matriz que toque en ese momento y luego en el while ve que no se cumple la condicion, la variable ch no almacena nada y termina esa vuelta en el for. correcto?

por ejemplo:

Código:
partido 1:

A[1][1]: (y aqui doy un "enter", un salto de linea

en la componente A[0][0] de la matriz quedaría guardado un '\n'  y luego como no se cumple la condición la variable ch no almacena el salto de linea y sale del for...

entonces, si el contenido de ch no se tienen en cuenta para nada, como es posible que eso solucione el problema de poder "dejar en blanco" alguna componente de la matriz?

espero haberme explicado....
En línea

getting louder!
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
« Respuesta #16 en: 8 Diciembre 2013, 19:45 pm »

......................................

vamos a ver:

En primer lugar ese "EOF" de poco sirve no? quiero decir, si la condición fuese únicamente que ch sea distinto del salto de línea sería suficiente no?.


Es para si trabajas con ficheros, ya que indica que se llega al fin del mismo. En este caso puedes por tanto prescindir de él.

Citar

Y que es lo que está pasando en ese for exactamente?

entiendo que:

desde j = 0 hasta j = 2 hace una printf y un scanf y luego el while...

entonces entiendo que siempre que de un salto de linea tanto el scanf como el while lo "notan", es decir, se guarda un salto de linea en la componente de la matriz que toque en ese momento y luego en el while ve que no se cumple la condicion, la variable ch no almacena nada y termina esa vuelta en el for. correcto?
....................
espero haberme explicado....

Para no liarla, el código lo he generado para que cuando no se tome un valor ingreses espacio. Por ejemplo, X2 se introduce como "espacioX2", aunque también valen dos enter seguidos de X2, pero no era esa mi intención sino la primera.

Saluditos! ..... !!!!       
En línea

SoyelRobert

Desconectado Desconectado

Mensajes: 46



Ver Perfil
Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
« Respuesta #17 en: 8 Diciembre 2013, 20:23 pm »

mm y por qué si quitas el primer while, no el que esta dentro del for sino el que esta al principio de todo, la primera componente de la matriz no la hace?

me cuesta bastante ver como esta funcionando el while la verdad jaja
En línea

getting louder!
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
« Respuesta #18 en: 8 Diciembre 2013, 21:41 pm »

mm y por qué si quitas el primer while, no el que esta dentro del for sino el que esta al principio de todo, la primera componente de la matriz no la hace?


Porque se quedaría en el buffer el \n del scanf y al introducir un valor, en lugar de tomar ese valor, primero toma lo que queda en el buffer - que era \n- por eso se salta el primer valor de la matriz. ¿Y que sucede con el valor que hubieras introducido?. Que estaría en el buffer pero ¡¡¡voilá ¡¡¡¡ con el segundo while se limpia antes de introducir el valor del segundo elemento de la matriz, y así sucesivamente.


Saluditos! ..... !!!!       
En línea

SoyelRobert

Desconectado Desconectado

Mensajes: 46



Ver Perfil
Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
« Respuesta #19 en: 9 Diciembre 2013, 00:51 am »

Porque se quedaría en el buffer el \n del scanf y al introducir un valor, en lugar de tomar ese valor, primero toma lo que queda en el buffer - que era \n- por eso se salta el primer valor de la matriz. ¿Y que sucede con el valor que hubieras introducido?. Que estaría en el buffer pero ¡¡¡voilá ¡¡¡¡ con el segundo while se limpia antes de introducir el valor del segundo elemento de la matriz, y así sucesivamente.


Saluditos! ..... !!!!       

mm asi que los whiles digamos que "limpian" el buffer para que los scanf cojan el valor que deben tomar y no uno residual de un scanf anterior... lo cierto es que no tenía ni idea, digamos que ya se lo que hace pero no entiendo como la hace   :-[


Código:
scanf("%d", &N);
while ((ch = getchar()) != '\n');

veamos:

La scanf está tomando un valor y lo guarda en N, al darle al salto de linea -\n- la scanf también lee el -\n- pero no lo almacena en N (no se por que motivo) sino que se queda en el buffer y luego en el while la variable ch está recogiendo del teclado cualquier caracter excepto -\n-, por lo que el \n seguiria estando en el buffer incluso despues del while...

gracias por vuestro tiempo
En línea

getting louder!
Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
|Lo que no hay que hacer en C/C++. Nivel basico| « 1 2 ... 6 7 »
Programación C/C++
Littlehorse 69 159,693 Último mensaje 24 Octubre 2015, 08:48 am
por Seyro97
Ayudaa problema nivel basico
Programación C/C++
krowa 0 1,920 Último mensaje 13 Marzo 2012, 23:48 pm
por krowa
Problema con la creación de tablas SQL nivel básico.
Desarrollo Web
nikko88 2 2,323 Último mensaje 25 Junio 2012, 17:48 pm
por nikko88
[Nivel 1/10] CrackMe básico C #4 « 1 2 »
Ingeniería Inversa
cibergolen 12 9,139 Último mensaje 30 Diciembre 2012, 22:42 pm
por cibergolen
[Reto] CrackMe I (Nivel: Básico / SuperFácil) « 1 2 »
Ingeniería Inversa
jaxoR 13 6,615 Último mensaje 28 Abril 2015, 20:21 pm
por Arkangel_0x7C5
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines