• Viernes 8 de Noviembre de 2024, 18:58

Autor Tema:  3 Problemas En Un Pequeño Programa  (Leído 5779 veces)

kult18

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
3 Problemas En Un Pequeño Programa
« en: Jueves 2 de Noviembre de 2006, 11:03 »
0
Hola, estoy haciendo un sencillo programa en C y me he encontrado con 3 problemillas, a ver si me podéis solucionar porque me vuelvo loco. Aquí pongo el código:
Código: Text
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. main ()
  6.  
  7. {
  8.  /* Definición de datos */
  9.  int calculosxciclo, ciclos, resultado, total;
  10.  float x, y, pceros, punos;
  11.  int cero = 0, uno = 0;
  12.  char c;
  13.  
  14.  /* Programa */
  15.  printf("PROGRAMA V. 1.0\n");
  16.  printf("Introduce el número de cálculos por ciclo: ");
  17.  scanf( "%d", &calculosxciclo);
  18.  printf("Introduce el número de ciclos: ");
  19.  scanf ( "%d", &ciclos);
  20.  while (ciclos != 0)    {
  21.        while (calculosxciclo != 0)   {
  22.              x = rand() / 32768.0;
  23.              resultado = (2 * x);
  24.              /*Si sale 0 ó 1... */
  25.              if (resultado == 0)     {
  26.                                      ++cero;
  27.                 }
  28.              if (resultado == 1)     {
  29.                                      ++uno;
  30.                 }
  31.              --calculosxciclo;
  32.        }
  33.       printf("\nNúmero de ceros: %u", cero);
  34.       printf("\nNúmero de unos: %u", uno);
  35.       total = (cero + uno);
  36.       printf("\nTotal: %d", total);
  37.       pceros = ((cero * 100) / total);
  38.       punos = ((uno * 100) / total);
  39.       printf("\nPorcentaje de ceros: %f", pceros);
  40.       printf("\nPorcentaje de unos: %f", punos);    
  41.       c = getchar();
  42.       --ciclos;
  43.  }
  44. }
  45.  
El programa genera un número de cadenas (especificado al principio del programa) de ceros y unos (el número de dígitos de cada cadena también se especifican al comienzo). Luego cuenta los ceros y los unos y te muestra los resultados.
Vale, los 3 errores con los que me encuentro son estos:
1º A pesar de usar la función rand, si ejecutáis el programa y ponéis por ejemplo 10 cálculos por ciclo y 5 ciclos, veréis que siempre hace la misma distribución: 6 ceros y 4 unos, a pesar de que debiera ser aleatorio y cada vez ofrecer una distribución distinta.
2º Al margen de la función rand, si pongo que quiero 5 ciclos, se supone que me debe mostrar los datos de cada ciclo cada vez que yo pulse una tecla. Al ejecutar el programa, los datos del primer y segundo ciclo me salen juntos y sin un espacio que los divida, luego ya salen todos bien.
3º Si pongo que sólo quiero un ciclo, éste lo muestra tan rápido que no da tiempo a verlo. ¿Cómo puedo hacer que también permanezca en pantalla hasta que yo pulse una tecla?

Espero que me podáis ayudar. Muchas gracias por adelantado!

ArKaNtOs

  • Miembro de PLATA
  • *****
  • Mensajes: 1253
  • Nacionalidad: mx
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #1 en: Jueves 2 de Noviembre de 2006, 11:34 »
0
1 y srand?
2 no te entendi :P
3 system("PAUSE"); o getch

kult18

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #2 en: Jueves 2 de Noviembre de 2006, 12:08 »
0
Vale, ya he solucionado parte de las dudas, ahora tengo esto:
Código: Text
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. main ()
  6.  
  7. {
  8.  /* Definición de datos */
  9.  int calculosxciclo, ciclos, resultado, total;
  10.  float x, y, pceros, punos;
  11.  int cero = 0, uno = 0;
  12.  
  13.  /* Programa */
  14.  printf("PROGRAMA V. 1.0\n");
  15.  printf("Introduce el número de cálculos por ciclo: ");
  16.  scanf( "%d", &calculosxciclo);
  17.  printf("Introduce el número de ciclos: ");
  18.  scanf ( "%d", &ciclos);
  19.  while (ciclos != 0)    {
  20.        while (calculosxciclo != 0)  {
  21.              x = rand() / 32768.0;
  22.              resultado = (2 * x);
  23.              /*Si sale 0 ó 1... */
  24.              if (resultado == 0)    {
  25.                                      ++cero;
  26.                 }
  27.              if (resultado == 1)    {
  28.                                      ++uno;
  29.                 }
  30.              --calculosxciclo;
  31.              resultado = 0;
  32.        }
  33.       printf("\nNúmero de ceros: %u", cero);
  34.       printf("\nNúmero de unos: %u", uno);
  35.       total = (cero + uno);
  36.       printf("\nTotal: %d", total);
  37.       pceros = ((cero * 100) / total);
  38.       punos = ((uno * 100) / total);
  39.       printf("\nPorcentaje de ceros: %f", pceros);
  40.       printf("\nPorcentaje de unos: %f", punos,"\n");
  41.       printf("\n");    
  42.       --ciclos;
  43.       system("pause");
  44.  }
  45. }
  46.  
El error que aún perdura es que si lo ejecutáis, RAND siempre me devuelve los mismos resultados. La función SRAND no me vale puesto que no me devuelve ningún resultado, y RAND debería funcionar.
Por cierto, gracias por lo de "system("pause");"!!!

ArKaNtOs

  • Miembro de PLATA
  • *****
  • Mensajes: 1253
  • Nacionalidad: mx
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #3 en: Jueves 2 de Noviembre de 2006, 12:15 »
0
hola :) srand no sirve para devolverte ningún resultado, sirve para que cuando vuelvas a buscar un numero psudoaleatorio con rand no te arroje los mismos valores, es un agregado a rand :) mira:
http://c.conclase.net/librerias/funcion.php?fun=srand

kult18

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #4 en: Jueves 2 de Noviembre de 2006, 12:21 »
0
El caso es que anteriormente tenía hecha una aplicación que simulaba tiradas de dados y no usé SRAND, sin embargo RAND me devolvía resultados aleatorios continuamente.
Por otro lado, ¿me puedes ayudar a usar SRAND? Me pierdo un poco con el tema de la semilla. Me gustaría que tomara por ejemplo el número aleatorio sacado de la hora del sistema.

ArKaNtOs

  • Miembro de PLATA
  • *****
  • Mensajes: 1253
  • Nacionalidad: mx
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #5 en: Jueves 2 de Noviembre de 2006, 12:45 »
0
Código: Text
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.     int x;
  7.     srand( (unsigned int)time(NULL));
  8.     x=rand()/2;
  9.     printf("%d", x);
  10.     system("pause");
  11.     return 0;
  12. }
  13.  

perdona el retraso :P es que no tenia un compiler de c a la mano :P y como tiene milenios que no programo en c :P

kult18

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #6 en: Jueves 2 de Noviembre de 2006, 13:02 »
0
No me funciona. ¿Te ha funcionado el programa con el código que he puesto antes? Si te funciona mándame por favor el código íntegro a ver qué falla. Me gustaría hacerlo sólo con RAND, ya que una vez lo usé y me fue bien. Creo que si ahora falla debe ser por otra parte del programa. Gracias por las molestias!

ArKaNtOs

  • Miembro de PLATA
  • *****
  • Mensajes: 1253
  • Nacionalidad: mx
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #7 en: Jueves 2 de Noviembre de 2006, 13:50 »
0
perdona es que fui a prepararme de desayunar :P

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main ()

{
/* Definición de datos */
int calculosxciclo, ciclos, total;
float pceros, punos;
int x, y, cero = 0, uno = 0;

/* Programa */
printf("PROGRAMA V. 1.0\n");
printf("Introduce el número de cálculos por ciclo: ");
scanf( "%d", &calculosxciclo);
printf("Introduce el número de ciclos: ");
scanf ( "%d", &ciclos);
srand(time(NULL));
y=calculosxciclo;
while (ciclos != 0)    {
      while (calculosxciclo != 0)  {
            calculosxciclo--;
            x = rand()%2;
            if (x == 0) { cero++; }
            else { uno++; }
      }
     ciclos--;
     calculosxciclo = y;
     printf("\nNúmero de ceros: %d", cero);
     printf("\nNúmero de unos: %d", uno);
     total = (cero + uno);
     printf("\nTotal: %d", total);
     pceros = ((cero * 100) / total);
     punos = ((uno * 100) / total);
     printf("\nPorcentaje de ceros: %0.2f", pceros);
     printf("\nPorcentaje de unos: %0.2f", punos);
     printf("\n");

   }
   system("pause");
   return 0;
}

tu error era logico :P y corregi el code, nos vemos :)

kult18

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #8 en: Jueves 2 de Noviembre de 2006, 13:53 »
0
Al compilar me dice que:
Código: Text
  1. srand(time(NULL));
  2.  
da error. Que no está declarada.

ArKaNtOs

  • Miembro de PLATA
  • *****
  • Mensajes: 1253
  • Nacionalidad: mx
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #9 en: Jueves 2 de Noviembre de 2006, 14:08 »
0
mira no se porque te da error, se supone que debe estar definida en stdlib.h, se me hace raro, pero igual si lo quitas no hay ningún inconveniente :P , lo único malo es que  a la hora de volver a compilar el programa es probable que te vuelva a generar los mismos numeros.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #10 en: Jueves 2 de Noviembre de 2006, 14:12 »
0
time ... eso es lo que da error.

#include <time.h> y listo

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

ArKaNtOs

  • Miembro de PLATA
  • *****
  • Mensajes: 1253
  • Nacionalidad: mx
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #11 en: Jueves 2 de Noviembre de 2006, 14:13 »
0
Cita de: "Eternal Idol"
time ... eso es lo que da error.

#include <time.h> y listo
sorry :whistling:  :hola:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #12 en: Jueves 2 de Noviembre de 2006, 14:17 »
0
Cita de: "ArKaNtOs"
sorry :whistling:  :hola:
No problem y para los que tengan errores de compilacion/enlazado siempre es MUY UTIL tener el output del compilador/enlazador a mano (asi fue como me di cuenta del problema), en este caso algo asi:

cl azar.cpp
Microsoft ® 32-bit C/C++ Optimizing Compiler Version 13.10.6030 for 80x86
Copyright © Microsoft Corporation 1984-2002. All rights reserved.

azar.cpp
azar.cpp(20) : error C3861: 'time': identifier not found, even with argument-dep
endent lookup

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

kult18

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #13 en: Jueves 2 de Noviembre de 2006, 14:47 »
0
Gracias, ya me va perfecto. Me ha surgido otra duda que me gustaría incluir en el programa. He visto que se puede hacer una pausa poniendo "system("pause");", pero ¿cómo podría hacer una pausa de por ejemplo 10 segundos y luego que continúe solo el programa?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #14 en: Jueves 2 de Noviembre de 2006, 15:01 »
0
Usando sleep/Sleep ... en Windows seria Sleep(10000); y en otros creo que sleep(10);  :scream:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

kult18

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #15 en: Jueves 2 de Noviembre de 2006, 15:43 »
0
Lo de la pausa de varios segundos la haré al final. Se me ha ocurrido incluir otra cosa: quiero poder introducir un mínimo y un máximo para los porcentajes de ceros y unos, y que cuando rebasen esos porcentajes quede registrado, y al final del programa me de un resumen del número de veces que se ha rebasado el porcentaje. Esto es lo que he hecho:
Código: Text
  1. #include &#60;stdio.h&#62;
  2. #include &#60;stdlib.h&#62;
  3. #include &#60;math.h&#62;
  4. #include &#60;time.h&#62;
  5.  
  6. int main ()
  7.  
  8. {
  9. /* Definición de datos */
  10.  int calculosxciclo, ciclos, total, cbajo, calto, ubajo, ualto, seg, opc = 0, ccbajo = 0, ccalto = 0, ucbajo = 0, ucalto = 0;
  11.  float pceros, punos;
  12.  int x, y, cero = 0, uno = 0;
  13.  
  14. /* Programa */
  15. printf(&#34;PROGRAMA V. 1.0&#092;n&#34;);
  16. printf(&#34;Introduce el número de cálculos por ciclo: &#34;);
  17. scanf( &#34;%d&#34;, &calculosxciclo);
  18. printf(&#34;Introduce el número de ciclos: &#34;);
  19. scanf ( &#34;%d&#34;, &ciclos);
  20. printf(&#34;¿OPCIONES ADICIONALES? 1=SI 2=NO --&#62; &#34;);
  21. scanf ( &#34;%d&#34;, &opc);
  22.  if (opc == 1) {
  23.        printf(&#34;&#092;nLímite por debajo para ceros: &#34;);
  24.        scanf ( &#34; %d&#34;, &cbajo);
  25.        printf(&#34;&#092;nLímite por arriba para ceros: &#34;);
  26.        scanf ( &#34; %d&#34;, &calto);
  27.        printf(&#34;&#092;nLímite por debajo para unos: &#34;);
  28.        scanf ( &#34; %d&#34;, &ubajo);
  29.        printf(&#34;&#092;nLímite por arriba para unos: &#34;);
  30.        scanf ( &#34; %d&#34;, &ualto);
  31.        printf(&#34;&#092;n&#092;nEjecutar un ciclo cada (seg.): &#34;);
  32.        scanf ( &#34; %d&#34;, &seg);
  33.        }
  34.  else {printf(&#34;&#092;nSIN CONFIGURAR&#34;);
  35.        cbajo = (calculosxciclo / 2);
  36.        calto = (calculosxciclo / 2);
  37.        ubajo = (calculosxciclo / 2);
  38.        ualto = (calculosxciclo / 2);}
  39. srand(time(NULL));
  40. y=calculosxciclo;
  41. while (ciclos != 0) {
  42. while (calculosxciclo != 0) {
  43. calculosxciclo--;
  44. x = rand()%2;
  45. if (x == 0) { cero++; }
  46. else { uno++; }
  47. }
  48. ciclos--;
  49. calculosxciclo = y;
  50. printf(&#34;&#092;nNúmero de ceros: %d&#34;, cero);
  51. printf(&#34;&#092;nNúmero de unos: %d&#34;, uno);
  52. total = (cero + uno);
  53. printf(&#34;&#092;nTotal: %d&#34;, total);
  54. pceros = ((cero * 100) / total);
  55. punos = ((uno * 100) / total);
  56. printf(&#34;&#092;nPorcentaje de ceros: %0.2f&#34;, pceros);
  57. printf(&#34;&#092;nPorcentaje de unos: %0.2f&#34;, punos);
  58. printf(&#34;&#092;n&#34;);
  59. system(&#34;pause&#34;);
  60. if (pceros &#60; cbajo) {ccbajo++;}
  61. else {}
  62. if (pceros &#62; calto) {ccalto++;}
  63. else {}
  64. if (punos &#60; ubajo) {ucbajo++;}
  65. else {}
  66. if (punos &#62; ualto) {ucalto++;}
  67. else {}
  68. cero = 0;
  69. uno = 0;
  70. }
  71.  
  72. printf(&#34;&#092;nEl límite mínimo de: %d&#34;, cbajo);
  73. printf(&#34; se ha superado %d&#34;, ccbajo);
  74. printf(&#34; veces.&#34;);
  75. printf(&#34;&#092;nEl límite máximo de: %d&#34;, calto);
  76. printf(&#34; se ha superado %d&#34;, ccalto);
  77. printf(&#34; veces.&#34;);
  78. printf(&#34;&#092;nEl límite mínimo de: %d&#34;, ubajo);
  79. printf(&#34; se ha superado %d&#34;, ucbajo);
  80. printf(&#34; veces.&#34;);
  81. printf(&#34;&#092;nEl límite máximo de: %d&#34;, ualto);
  82. printf(&#34; se ha superado %d&#34;, ucalto);
  83. printf(&#34; veces.&#34;);
  84. system(&#34;pause&#34;);
  85. return 0;
  86. }
  87.  
Da un error al final y no sé qué puede ser. Agradezco vuestra paciencia, ya que me cuesta bastante. Tendría que mandaros un jamón, jejejeje. ¿Qué puede ocasionar el error?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #16 en: Jueves 2 de Noviembre de 2006, 15:51 »
0
¿Que tipo de error da? ¿Depuraste el programa linea por linea para ver donde da el error?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

kult18

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #17 en: Jueves 2 de Noviembre de 2006, 15:54 »
0
Se me cerraba solo, pero ya va bien. Resulta que tenía configurado que cuando no introducías los valores para configurarlo, éstos tomaban unos automáticos, y eso no lo tenía bien. voy a ver lo de incluir las pausas de varios segundos.

kult18

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #18 en: Jueves 2 de Noviembre de 2006, 16:49 »
0
Va perfecto, gracias gente!!! Sólo me queda una última cosa. ¿Qué puedo poner al final del programa para que al terminar de ejecutarse vuelva a empezar desde el principio?

ArKaNtOs

  • Miembro de PLATA
  • *****
  • Mensajes: 1253
  • Nacionalidad: mx
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #19 en: Jueves 2 de Noviembre de 2006, 16:57 »
0
Cita de: "Eternal Idol"
Cita de: "ArKaNtOs"
sorry :whistling:  :hola:
No problem y para los que tengan errores de compilacion/enlazado siempre es MUY UTIL tener el output del compilador/enlazador a mano (asi fue como me di cuenta del problema), en este caso algo asi:

cl azar.cpp
Microsoft ® 32-bit C/C++ Optimizing Compiler Version 13.10.6030 for 80x86
Copyright © Microsoft Corporation 1984-2002. All rights reserved.

azar.cpp
azar.cpp(20) : error C3861: 'time': identifier not found, even with argument-dep
endent lookup
lo tendré en cuenta :) thanx

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #20 en: Jueves 2 de Noviembre de 2006, 17:00 »
0
Cita de: "kult18"
Va perfecto, gracias gente!!! Sólo me queda una última cosa. ¿Qué puedo poner al final del programa para que al terminar de ejecutarse vuelva a empezar desde el principio?
Mete el contenido del main en una funcion y en el main deja un bucle for (comprobando una tecla diria yo) que llame a esa funcion.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

kult18

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #21 en: Jueves 2 de Noviembre de 2006, 17:04 »
0
Gracias. Sois unos cracks!!! No conocía este foro, pero he comprobado que ayudáis sin ningún tipo de problema. Me pasaré por aquí cada vez que meta la pata, que suele ser a menudo. Un saludo!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: 3 Problemas En Un Pequeño Programa
« Respuesta #22 en: Jueves 2 de Noviembre de 2006, 17:09 »
0
Cita de: "kult18"
Gracias. Sois unos cracks!!! No conocía este foro, pero he comprobado que ayudáis sin ningún tipo de problema. Me pasaré por aquí cada vez que meta la pata, que suele ser a menudo. Un saludo!
Es cierto que ayudamos a los que buscan ayuda (sic) pero no ayudamos a los que buscan que les hagamos el trabajo  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.