[ Foro de C ]

Problema con ejercicio en C (examen mañana)

18-Jun-2012 00:22
jairo rock
3 Respuestas

Mañana tengo un examen de recuperacion de preogramacion en C, no lo llevo muy bien y el profesor me va a pedir ejercicios con argumentos que integre la consola del sistema operativo. Tambien me comentó que me haria que el programa lea documentos del tipo .txt, el caso es que me juego el curso, alguien me podria echar una mano mañana sobre las 16:30h?

A continuacion pongo un ejemplo de lo que hice la ultima vez, que me quedé corto, porque el programa tenia que hacer mas cosas como mostrar por consola los numeros y me tenia que leer un .txt
(Es un programa que te pide un numero comprendido entre el 50 y el 100 y te muestra los numeros hasta llegar a cero)

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

int main()
{
   int aux;
   int num;
   int a=1;
   while(a){
   printf("Introduce un numero del 50 al 100\n");
   aux=scanf("%d",&num);
   if (num<=50){a++;}
   if (num>=100){a++;}

   a--;
   }

   while(aux){
       printf("\n%d",num);
       if (num==0){break;}
       num--;
   }

   return 0;
}


El caso es que mañana se me complicara la cosa. Por cierto uso para compilar el andjuta en linux y el codeblocks en windows.
Agradeceria la ayuda, muchas gracias de antemano.


20-Jun-2012 07:38
Nacho Cabanes (+84)

Bienvenido, Jairo.

Si ese fuente es tu repaso previo al examen, te costará aprobarlo. Es innecesariamente rebuscado, a pesar de que el problema es muy sencillo, y eso hace que sea propenso a fallos. Por ejemplo:

- ¿Por qué usas a++ y a-- para controlar si el usuario tiene que volver a introducir el número?  ¿No es más simple usar un flag "esNumeroAceptable = 0;"? ¿O simplemente comprobar en el while si están entre 50 y 100 (mejor con un do-while, por eso de que hay que pedir al menos una vez)? En tu caso, se comporta incorrectamente con los números 50 y 100, aunque no falla con los intermedios.

- En el "while" usas una variable "aux" que no modificas, sino que interrumpes su ejecución con un "break". ¿No sería más sencillo descontar con un "for"?


Yo haría algo como:


#include <stdio.h>

int main()
{
   int num;
   int i;

   do {
       printf("Introduce un numero del 50 al 100\n");
       scanf("%d",&num);
   } while ((num < 50) || (num > 100))

   for (i=num; i>=0; i--)
       printf("%d\n",num);

   return 0;
}


Deberías tratar de que tu solución sea siempre la más simple posible. Pero no es sólo una manía mía, sino un principio reconocido en el desarrollo de sistemas:

http://es.wikipedia.org/wiki/Principio_KISS

http://en.wikipedia.org/wiki/KISS_principle


22-Jun-2012 00:41
Pablo Rampa


Saludos al Profesor Nacho:
Corrí el programa que le recomendó a Jairo; pero, según entendí,
tiene que presentar la cuenta inversa desde num hasta cero. El
programa muestra num en num veces, porque imprime num en vez de i.

#include <stdio.h>

int main()
{
   int num;
   int i;

   do
   {
      printf("Introduce un numero del 50 al 100: \n\n");
      scanf("%d", &num);
   } while ((num < 50) || (num > 100)); // faltaba este ';'.

   for (i=num; i>=0; i--)
   {
       printf("%d - ", i); //Imprimía nom en vez de i.
   }  
   getchar();    
   getchar();
   return 0;
}

  KISS: "Keep It Simple, Sweetheart!" A la última 'S' se le atribuyen otros significados no muy amables.

      ...Espero que hayas obtenido una buena calificación, Jairo.


22-Jun-2012 09:24
Nacho Cabanes (+84)

Cierto, Pablo, en el "printf" del "for" debe aparecer "i", no "num". Problemas de corregir al vuelo en días de stress... :-D

Y si miras el artículo de la Wikipedia en inglés, verás que lo de "Keep It Simple Stupid", que es la traducción original de KISS, no es un insulto sino una exageración, algo así como "haz que sea estúpidamente simple", en el sentido de "haz que cualquiera pueda entenderlo", refiriéndose a que no porque esté creado por un ingeniero deberían entenderlo sólo ingenieros.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)