• Jueves 14 de Noviembre de 2024, 04:14

Autor Tema:  Problemilla C  (Leído 1920 veces)

rock_neurotiko

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Problemilla C
« en: Martes 11 de Mayo de 2010, 22:47 »
0
Hola de nuevo amigos, ya hice una pregunta aqui, y me respondisteis bastante bien (aunque no la puse en practica, ya que busque otra solucion[el problema era que no podia tener una variable que fuese muy larga (4815162342) asi que simplemente puse 4 8 15 16 23 42 con 6 variables int]) asi que vengo a ver si me podeis ayudar de nuevo =D

Lo cierto es que es un problema muy tonto,  es que tengo un simple programa que te pide nombre de usuario y contraseña, y luego pregunta si quieres salir o no, pues la cuestion es que si la primera vez dices que no, te vuelve al princio, y si luego le digo que si no sale. A ver si me podeis ayudar :D

Por cierto, es de linux (es decir, tiene la libreria ncurses.h y no conio.h)

Gracias por adelantado!

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <ncurses.h>
  4. #include <string.h>
  5.  
  6. int main() {
  7.         char cadena[50];
  8.     char pass[50];
  9.         initscr();
  10.  
  11.         printw("Usuario:");
  12.         scanw("%s",cadena);
  13.  
  14.         printw("Contraseña:");
  15.         noecho();
  16.         scanw("%s", pass);
  17.     echo();
  18.  
  19.     endwin();
  20.  
  21.     if (!strcmp(cadena,"Rock")&& !strcmp(pass,"1234")){
  22.       correcto();
  23.       return 0;
  24.     }
  25.     else {
  26.       printw("Errorn");
  27.       main();
  28.     }
  29.     return 0;
  30. }
  31.  
  32. int correcto()
  33. {
  34.   char si;
  35.  
  36.   printw("Bien!, ahora, ¿Quieres cerrar el programa?(S/N):n");
  37.   scanw("%c", &si);
  38.  
  39.   while(si=='S'){
  40.     return 0;
  41.   }
  42.  
  43.   while(si=='N'){
  44.     main();
  45.   }
  46.   while(si!='N'){
  47.     printw("Error. Introduzca S o Nn");
  48.     correcto();
  49.   }
  50.   return 0;
  51. }
  52.  
  53.  


Gracias de nuevo!

vite666

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Problemilla C
« Respuesta #1 en: Miércoles 12 de Mayo de 2010, 09:48 »
0
antes que nada con esto no digo que soy muy buen programador, pero nos ayudara a que abancemos por el camino correcto. perdon que te lo diga pero este programa, esta mal hecho, y no por la logica del mismo, sino por la manera de implementar las cosas y sobre todo la sintaxis de programacion que tiene.
1. no es valido llamar a la funcion main en otra funcion, se que si te va a compilar, pero llamarla desde otra funcion no es conveniente, digamoslo asi main es como el jefe y las funciones son los empleados, tu como jefe puedes recibir ayuda, pero lo que no puedes recibir son ordenes de tus empleados.
2. Los dobles return que tienen tus funcion tanto main como correcto, esto tambien es un error que muchos, pero muchos programadores hacen, ya que la funcion solo puede mandar una solo return a la vez, y aunque este dentro de un if, tu nunca sabes cuando puede tronar tu programa por cualquier cosa, siempre hay que tener en cuenta que todo puede fallar, asi te vuelves un mejor programador, esto es como si escribieras en un reporte la palabra culero (en Mexico esta palabra quiere decir malo, horrible, etc) en vez de malo, las dos formas sirven para calificar de la misma manera una cosa, pero como es un reporte tienes que pones la palabra malo, por cuestiones de presentacion. En la programacion pasa lo mismo, para ser un buen programador tienes que hacer tus programas lo mas presentables y entendibles posible.
puedes aplicar estos dos programas, no los e compilado ya que yo no utilizo linux pero supongo que si corren

Código: C++
  1. #include <stdio.h>
  2. #include <ncurses.h>
  3. #include <string.h>
  4. #define CORRECTO 1
  5. #define FALLO 0
  6. //primera forma
  7. int main() {//este primer programa no es nesesaria una funcion ya que como es muy corto el programa seria ineficiente.
  8.     char cadena[50];
  9.     char pass[50];
  10.     char si='N';
  11.     initscr();
  12.     while(si!='S'){
  13.  
  14.         printw("Usuario:");
  15.         scanw("%s",cadena);
  16.  
  17.         printw("Contraseña:");
  18.         noecho();
  19.         scanw("%s", pass);
  20.         echo();
  21.  
  22.         endwin();
  23.  
  24.         if (!strcmp(cadena,"Rock")&& !strcmp(pass,"1234")){
  25.             printw("Bien!, ahora, ¿Quieres cerrar el programa?(S/N):n");
  26.             scanw("%c", &si);
  27.             if(si!='N'&&si!='S')
  28.                 printw("Error. Introduzca S o Nn");
  29.         }
  30.         else {
  31.             printw("Errorn");
  32.         }
  33.     }
  34.     return 0;
  35. }
  36. //segunda forma
  37. int main() {//pero ya que si lo que quieres es utilizar una funcion esta te servira
  38.     int valor=FALLO;
  39.     initscr();
  40.     while(valor!=CORRECTO){
  41.         valor=funcion();  
  42.     }
  43.     return 0;
  44. }
  45. int funcion()
  46. {
  47.     char cadena[50];
  48.     char pass[50];
  49.     char si='a';
  50.     int valor=FALLO;
  51.     printw("Usuario:");
  52.     scanw("%s",cadena);
  53.  
  54.     printw("Contraseña:");
  55.     noecho();
  56.     scanw("%s", pass);
  57.     echo();
  58.  
  59.     endwin();
  60.  
  61.     if (!strcmp(cadena,"Rock")&& !strcmp(pass,"1234")){
  62.         while(si!='N'||si!='s')
  63.         {
  64.             printw("Bien!, ahora, ¿Quieres cerrar el programa?(S/N):n");
  65.             scanw("%c", &si);
  66.             if(si!='N'&&si!='S')
  67.             {
  68.                 printw("Error. Introduzca S o Nn");
  69.             }
  70.            
  71.         }
  72.         valor=CORRECTO;
  73.     }
  74.     else {
  75.         valor=FALLO;
  76.         printw("Errorn");
  77.     }
  78.     return valor;
  79. }
  80.  
espero te sea de ayuda.
Saludos

rock_neurotiko

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Problemilla C
« Respuesta #2 en: Miércoles 12 de Mayo de 2010, 13:05 »
0
Muchas gracias :D

Tanto por los consejos(errores mios, mejor dicho) como por la corrección del código, muy bueno el ejemplo del jefe, y ya me he fijado que cuando haces una llamada a una función lo haces con una llamada algo asi:

Código: C
  1.  
  2. int d=FALSO
  3.  
  4. while (d=!CORRECTO){
  5. d=funcion();
  6. }
  7.  
  8. funcion()
  9. {          
  10.  /*Y en esta función lo que haces es que haya un return con CORRECTO o FALSO para que vuelva a repetirse la función o termine ¿no?.*/
  11. }
  12.  
  13.  
  14.  


En resumen, que si voy a hacer llamadas a funciones jamás devolver una llamada a la función main ¿no?  ¿y la función main se puede llamar así misma?

rock_neurotiko

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Problemilla C
« Respuesta #3 en: Miércoles 12 de Mayo de 2010, 17:42 »
0
¡Ya lo tengo! Muchas gracias ^^

Lo cierto es que me ha servido de mucha ayuda y, aunque no sirva para nada el programa (a no ser que se lo implemente a otro),  me ha servido para aprender de mis errores =D

Este es el código, por si alguien lo quiere, o tengo algunos errores todavia. He corregido el return y las llamadas a funciones.

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <ncurses.h>
  4. #include <string.h>
  5.  
  6. #define CORRECTO 1
  7. #define FALSO 0
  8.  
  9. int main()
  10. {
  11.  
  12.   int valor;
  13.   initscr();
  14.   do{
  15.     valor=funcion();
  16.   } while(valor!=CORRECTO);
  17.  
  18.   printw("¡Adios! Vuelva pronto.n");
  19.   getch();
  20.   endwin();
  21.   return 0;
  22. }
  23.  
  24. int funcion()
  25. {
  26.   char nombre[50];
  27.   char pass[50];
  28.   char si='a';
  29.   int valor = FALSO;
  30.  
  31.   printw("Usuario:n");
  32.   scanw("%s", &nombre);
  33.  
  34.   printw("nContraseña:");
  35.   noecho();
  36.   scanw("%s", &pass);
  37.   echo();
  38.  
  39.   if(!strcmp(nombre, "Rock") && !strcmp(pass, "1234")){
  40.     do{
  41.       printw("¿Quiere cerrar el programa? (S/N)n");
  42.       scanw("%c", &si);
  43.       if (si!='S' && si!='N'){
  44.     printw("nInserte S para salir N para reiniciarlon");
  45.       }
  46.     }while (si!= 'S' && si!='N');
  47.  
  48.     if (si == 'S'){
  49.       valor = CORRECTO;
  50.     }
  51.     if (si == 'N'){
  52.       valor == FALSO;
  53.     }
  54.   }
  55.   else {
  56.     valor = FALSO;
  57.     printw("Error!n");
  58.   }
  59.  
  60.   return valor;
  61. }
  62.  
  63.  

vite666

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Problemilla C
« Respuesta #4 en: Miércoles 12 de Mayo de 2010, 18:59 »
0
pues si funciona tu programa, esta bien. en cuanto a tu pregunta de si main se puede llamar a si mismo, si se puede, pero volvemos a lo mismo, no se debe hacer ya que al hacer una determinada instruccion, es mejor que falle una funcion en especifica que tu funcion principal que es la que controla todas las demas funciones, y es mas facil la depuracion del mismo. todas las demas funciones son validas a llamarse a si mismas, esto es la recursividad y es util en muchos casos.