Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SoyelRobert en 7 Diciembre 2013, 17:44



Título: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: SoyelRobert en 7 Diciembre 2013, 17:44
solved


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: dato000 en 7 Diciembre 2013, 18:45
Ok ok, pero no termino de entender, que es una quiniela, no soy español así que pues  :silbar: :silbar:

Lo que no entiendo es porque estas usando una matriz muldimensional, ya que solo estas solicitando un dato que es la cantidad de partidos, el ejercicio lo exige así??? o solo tiene que presentarse a modo de tabla??

Y no entiendo tampoco los pronosticos, hablas de un partido de futbol?? es de la forma:

Citar
Equipo A:  Goles    -      Equipo B:  Goles

O como va la cosa, porque francamente no entendi, además, no estas usando ninguna variable para guardar el pronostico.



Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: SoyelRobert en 7 Diciembre 2013, 18:53
solved


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: dato000 en 7 Diciembre 2013, 19:55
Viejo, no entendi  :silbar: :silbar: :xD :xD :laugh: :laugh:

Pero tal como lo veo solo necesitas poner esa información en pantalla, por lo que lo almacenas en un buffer temporal y lo imprimes inmediatamente cierto??

te recomiendo usar un char pronostico[30]  para acumular tanto 1X2 como vayas necesitando. y que si necesitas hacer un conteo, puedes usar un contador en ese arreglo de carateres o usar un strlen igual para ese arreglo.

De verdad si quiero ayudar, pero no entiendo como funciona el paradigma así que me quedare pendiente de que algún español pueda dejar algo.

 


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: SoyelRobert en 7 Diciembre 2013, 20:27
jaja muchas gracias, es posible que también pueda resolverse de la manera que tu dices, de hecho recuerdo que mi profesor comentó en clase que también se podía resolver con una "pila" pero era algo que no habíamos dado...

Mi temario dado hasta la fecha abarca estructuras de control, arrays, matrices, ficheros, y subprogramación (funciones externas llamadas desde el main), por lo que, en teoría, el programa puede resolverse únicamente con eso. Lo que tu has comentado del char pronóstico y el buffer temporal no tengo ni idea de lo que es...  :-\

Gracias por tu interés!


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: Caster en 7 Diciembre 2013, 23:49
El problema está en la lógica del programa, si lo que quieres es que por cada partido almacene hasta 3 caracteres (1, x ó 2) deberás hacer un for para introducir esos tres datos y después otro for que englobe al anterior para ir introduciendo 3 datos por cada partido. Algo así:

Código
  1. for(i=0; i<=numerodepartidos-1; i++){
  2.  
  3.    for(j=0; j<=datosporpartido-1; j++){
  4.  
  5.        //códgio para rellenar el array nombre[i][j]
  6.    }
  7. }

Saludos


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: dato000 en 8 Diciembre 2013, 00:28
Bueno viejo, mirandolo con detenimiento era algo simple, te dejo una plantilla que puede que funcione, aunque es extraño no me esta funcionando bien cuando se digita solo una letra, debe ser porque el scanf espera un string completo en lugar de un char unico.

Pero creo que por lo demás funciono bien, lo del char pronostico y la estructura, la deje como dos simples arreglos.

Código
  1. #include <stdio.h>
  2. #define simple 3
  3. #define multiple 12
  4.  
  5. void copiarQuinielas(char* quinielaBasica, char* quinielaAvanzada);
  6.  
  7. int main()
  8. {
  9.    char quinielaSimple[simple];
  10.    char quinielaMultiple[multiple];
  11.  
  12.    printf("--------QUINIELAS!!--------\n\n");
  13.    printf("Digite la quiniela (Maximo 3 caracteres):  ");
  14.    fflush(stdout);
  15.    scanf("%s", quinielaSimple);
  16.  
  17.  
  18.    copiarQuinielas(quinielaSimple, quinielaMultiple);
  19.  
  20.    //printf("Su Quiniela Multiple es:  ");
  21.  
  22.  
  23.    return 0;
  24. }
  25.  
  26. void copiarQuinielas(char* quinielaBasica, char* quinielaAvanzada)
  27. {
  28.    int i, j;
  29.  
  30.    i=0;
  31.    printf("Su quiniela Simple es:  ");
  32.    while( i<3 )
  33.    {
  34.        fflush(stdout);
  35.        printf("%c", quinielaBasica[i]);
  36.        i++;
  37.    }
  38.  
  39.    // Comprobando simbolos
  40.    // Caso 1 ---> TRES SIMBOLOS
  41.    if( quinielaBasica[0] != '\0' &&
  42.        quinielaBasica[1] != '\0' &&
  43.        quinielaBasica[2] != '\0')
  44.    {
  45.        for(i=0; i<3; i++)
  46.        {
  47.            quinielaAvanzada[i] = quinielaBasica[i];
  48.            quinielaAvanzada[i+3] = quinielaBasica[i];
  49.            quinielaAvanzada[i+6] = quinielaBasica[i];
  50.            quinielaAvanzada[i+9] = quinielaBasica[i];
  51.        }
  52.    }
  53.  
  54.    // Caso 2 ---> DOS SIMBOLOS
  55.    // En el ejemplo se piden dos escenarios:
  56.    // 1. Partido 2: 1X ---> 1 1 1 1 1 1 X X X X X X
  57.    // 2. Partido 4: 12 ---> 1 1 1 2 2 2 1 1 1 2 2 2
  58.    // Pero como carajos decides que linea debe ir, yo opte por el escenario 1.
  59.    else if( quinielaBasica[0] != '\0' &&
  60.             quinielaBasica[1] != '\0' &&
  61.             quinielaBasica[2] == '\0')
  62.    {
  63.        for(i=0; i<6; i++)
  64.        {
  65.            quinielaAvanzada[i] = quinielaBasica[0];
  66.            quinielaAvanzada[i+6] = quinielaBasica[1];
  67.        }
  68.    }
  69.  
  70.    // Caso 3 ---> UNICO SIMBOLO
  71.    // Todos los elementos son iguales
  72.    else if( quinielaBasica[0] != '\0' &&
  73.             quinielaBasica[1] == '\0' &&
  74.             quinielaBasica[2] == '\0')
  75.    {
  76.        for(i=0; i<12; i++)
  77.        {
  78.            quinielaAvanzada[i] = quinielaBasica[0];
  79.        }
  80.    }
  81.  
  82.  
  83.  
  84.    // Imprimiendo la quiniela final
  85.    i=0;
  86.    printf("\n\nSu quiniela Multiple es:  ");
  87.    while( i<12 )
  88.    {
  89.        printf("%c", quinielaAvanzada[i]);
  90.        i++;
  91.    }
  92.  
  93. }
  94.  

Alguien sabe como solucionar este pequeño detalle?


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: SoyelRobert en 8 Diciembre 2013, 00:59
El problema está en la lógica del programa, si lo que quieres es que por cada partido almacene hasta 3 caracteres (1, x ó 2) deberás hacer un for para introducir esos tres datos y después otro for que englobe al anterior para ir introduciendo 3 datos por cada partido. Algo así:

Código
  1. for(i=0; i<=numerodepartidos-1; i++){
  2.  
  3.    for(j=0; j<=datosporpartido-1; j++){
  4.  
  5.        //códgio para rellenar el array nombre[i][j]
  6.    }
  7. }

Saludos

Hola Caster, si, correcto, es lo que pretendo, algo tal que asi:


Código:
for(i=0;i<=N-1;i++){
partido ++;
printf("\n\n Partido %d: ", partido);

for(j=0;j<=3;j++)
scanf("%c", &A[i][j]);

El primer for que engobla al segundo es el que va pasando al siguiente partido una vez se le han ido metiendo los datos y el segundo de encarga de meter los datos en cada partido.

El problema viene en que si no se le meten como minimo 3 datos (1 x 2 en todos los partidos) el programa no funciona (esto no se como solucionarlo aun) pero lo mas grave es que incluso metiendole 3 datos a todos los partidos (1 x 2) el tercer partido no deja introducirle ningun dato es decir, aparece "partido N:" y el programa finaliza sin dejar darle ningun dato.

--------------------

Y dato000 wow, aprecio mucho tu ayuda e interes pero creo que no has terminado de entender muy bien lo que queremos hacer...

Mira, el asunto consiste en darle al programa una quiniela multiple y que este devuelva todas sus equivalentes, imagina lo siguiente:

ejecuto el programa e inmediatamente pide el numero de partidos que va a tener la quiniela (ya sea la multiple o las simples equivalentes a esta tienen el mismo numero de partidos pues se trata de la misma quiniela).

Una vez se la proporcionado el numero de partidos, el programa empieza a pedir las predicciones para estos y una vez introducidos todos el programa comienza a obtener todas las quinielas simples que componen la multiple inicial, algo tal que asi:

(imagina que en este caso, el numero de partidos es 4:)

Citar
Hola!, cuantos partidos: 4

introduzca sus predicciones:

Partido 1: 1

partido 2: 1 x

partido 3: 2

partido 4: 1  x 2

Las quinielas simples que componen esta quiniela multiple son:

quiniela simple 1: 1 1 2 1
quiniela simple 2: 1 1 2 x
quiniela simple 3: 1 1 2 2
quiniela simple 4: 1 x 2 1
quiniela simple 5: 1 x 2 x
quiniela simple 6: 1 x 2 2


(aqui acaba el programa)

Esto es lo que deberia hacer el programa jeje


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: leosansan en 8 Diciembre 2013, 15:01
Supongo que lo que pretendes es obtener algo así:

Citar
Hola!, introduzca cantidad de partidos:
3

Introduzca sus pronosticos 1-X-2:


 Partido 1:

 A[1][1]: 1

 A[1][2]: x

 A[1][3]: 2


 Partido 2:

 A[2][1]:

 A[2][2]: x

 A[2][3]: 2


 Partido 3:

 A[3][1]:

 A[3][2]:

 A[3][3]: 2


Quiniela multiple:
 1  x  2

    x  2

       2

Para lo cual puedes usar un array bidimensional, como te indicó el amigo Caster:

Código
  1. #include <stdio.h>
  2.  
  3. int  main(void)
  4. {
  5.    printf("Hola!, introduzca cantidad de partidos: \n");
  6.    int N,ch;
  7.    scanf("%d", &N);
  8.    while ((ch = getchar()) != EOF && ch != '\n');
  9.    printf("\nIntroduzca sus pronosticos 1-X-2:\n");
  10.    char A[N][3];
  11.    int i,j;
  12.    for(i=0;i<N;i++){
  13.        printf("\n\n Partido %d: \n", i+1);
  14.        for(j=0;j<3;j++){
  15.            printf("\n A[%d][%d]: ",i+1,j+1);
  16.            fflush (stdout);
  17.            scanf("%c", &A[i][j]);
  18.            while ((ch = getchar()) != EOF && ch != '\n');
  19.        }
  20.    }
  21.    puts ("\n\n");
  22.    printf("\nQuiniela multiple:\n");
  23.    for(i=0;i<N;i++){
  24.        for(j=0;j<3;j++){
  25.            printf(" %c ", A[i][j]);
  26.        }puts ("\n");
  27.    }
  28.    return 0;
  29. }
  30.  

O bien un array unidimensional:

Código
  1. #include <stdio.h>
  2.  
  3. int  main(void)
  4. {
  5.    printf("Hola!, introduzca cantidad de partidos: \n");
  6.    int N,ch;
  7.    scanf("%d", &N);
  8.    while ((ch = getchar()) != EOF && ch != '\n');
  9.    printf("\nIntroduzca sus pronosticos 1-X-2:\n");
  10.    char A[3*N];
  11.    int i,j;
  12.    for(i=0;i<N;i++){
  13.         printf("\n\n Partido %d:\n \n", i+1);
  14.         for(j=0;j<3;j++){
  15.            printf("\n A[%d][%d]: ",i+1,j+1);
  16.            fflush (stdout);
  17.            scanf("%c", &A[3*i+j]);
  18.            while ((ch = getchar()) != EOF && ch != '\n');
  19.        }
  20.    }
  21.    puts ("\n\n");
  22.    printf("\nQuiniela multiple:\n");
  23.    for(i=0;i<3*N;i++){
  24.        if (i%3==0){
  25.            printf("\n\n");
  26.        }
  27.        printf(" %c ", A[i]);
  28.  
  29.    }
  30.    return 0;
  31. }
  32.  

Ya "sólo" te queda a tí intentar sacar las simples a partir de los arrays.

Saluditos!. ....


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: SoyelRobert en 8 Diciembre 2013, 16:21
Excelente... si señor  ;-) es justo lo que trataba de hacer!

sin embargo no quiero que me "hagan los deberes" sino aprender a hacerlos yo, asi que si no te importa te preguntare algunas cosillas sobre tu código, como ya digo, son dudas muy muy básicas:

Código:
#include <stdio.h>
 
int  main(void)
{
    printf("Hola!, introduzca cantidad de partidos: \n");
    int N,ch;
    scanf("%d", &N);
    while ((ch = getchar()) != EOF && ch != '\n');
    printf("\nIntroduzca sus pronosticos 1-X-2:\n");
    char A[N][3];
    int i,j;
    for(i=0;i<N;i++){
        printf("\n\n Partido %d: \n", i+1);
        for(j=0;j<3;j++){
            printf("\n A[%d][%d]: ",i+1,j+1);
            fflush (stdout);
            scanf("%c", &A[i][j]);
            while ((ch = getchar()) != EOF && ch != '\n');
        }
    }
    puts ("\n\n");
    printf("\nQuiniela multiple:\n");
    for(i=0;i<N;i++){
        for(j=0;j<3;j++){
            printf(" %c ", A[i][j]);
        }puts ("\n");
    }
    return 0;
}
}

Bien, podrías explicar exactamente la funcion que desempeña la variable ch en los while?, es decir, asignas a una variable una funcion de C "getchar()"?, he probado a cambiar todos los ch por getchar y el programa no funciona correctamente asi que imagino que tendra alguna utilidad, no solo "renombrar la funcion getchar".

Respecto a los whiles: exactamente, a que estan afectando esos whiles?, no nocesitarias un do y unos "{}" para indicarlo?

y por ultimo, que diferencia supone usar puts en vez de printf?

Muchas gracias tu aportacion me ha ayudado muchisimo  :)


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: Caster en 8 Diciembre 2013, 16:40
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.


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: leosansan en 8 Diciembre 2013, 16:49
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! ....


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: SoyelRobert en 8 Diciembre 2013, 17:42
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!


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: rir3760 en 8 Diciembre 2013, 18:16
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


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: SoyelRobert en 8 Diciembre 2013, 18:32
sisi, me he comido el "ch" sin querer jaja   :rolleyes:


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: SoyelRobert en 8 Diciembre 2013, 19:05
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....


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: leosansan en 8 Diciembre 2013, 19:45
......................................

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! ..... !!!!        (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: SoyelRobert en 8 Diciembre 2013, 20:23
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


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: leosansan en 8 Diciembre 2013, 21:41
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! ..... !!!!        (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: SoyelRobert en 9 Diciembre 2013, 00:51
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! ..... !!!!        (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

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


Título: Re: [C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?]
Publicado por: SoyelRobert en 16 Diciembre 2013, 21:24
perdon por el reflote pero no soy capaz de sacar las quinielas simples a partir de la multiple... llevo desde el último mensaje intentandolo y no hay manera

Reto a ver si alguien es capaz de sacarlo y me ilumina porque esto ya me supera

salu2  :( :(