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


 


Tema destacado: 4n4lDetector v1.3: herramienta de análisis estático de malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Consulta sobre programa C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Consulta sobre programa C  (Leído 394 veces)
GonzaJava

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Consulta sobre programa C
« en: 14 Abril 2018, 16:25 »

Hola, hice un programa en c y tendria que andar perfecto ya que no me salto error ni nada, cuando ejecuto el programa me sale, por ejemplo: "Ingrese periodo" lo pongo, despues me dice "Ingrese pintor", lo ingreso y ahi me sale "Galeria ..." el tema es que ahi tendria que terminar el programa pero me aparece "No hay obras en este periodo" que eso esta a lo ultimo, en fin ahi les paso el codigo para ver si pueden ayudarme.

#include<stdio.h>
#include<string.h>

 
int main()
{
      char periodo[50];
      char pintor[50];
      char nacion[50];
      
         printf("Ingrese periodo: ");
         scanf("%s", periodo);
      
      
      if ((strcmp (periodo, "Prehistorico")==0) || (strcmp(periodo, "egipcio")==0)){


               printf("Galeria 1 \n");

      }      
      
      else if ((strcmp(periodo, "renacimiento")==0)){
         {
         

 

               printf("Ingrese nombre del pintor: ");
               scanf("%s", pintor);
         }
          if ((strcmp (pintor, "Leonardo")==0) || (strcmp(pintor, "Michelangelo")==0))
         {
         
               printf ("Galeria 2 \n");
         }   
         else if (strcmp(pintor, "Rafael")==0){
      

                printf ("Galeria 3");
          }   
         else if ((strcmp (pintor, "Tiziano")==0) || (strcmp(pintor, "Boticelli")==0)){
         

               printf("Galeria 4");
         }   
         else if ((strcmp (pintor, "Greco")==0) || (strcmp(pintor, "Tintoretto")==0)){
         

               printf("Galeria 5a");
         }
         else if (strcmp(pintor, "Bellini")==0){
         

               printf("Galeria 5b");
         }   
      else {
         
               printf("No hay obras de este pintor \n");
         }
}   

         if ((strcmp (periodo, "barroco")==0)){
         {
      
      
                  printf("Ingrese nacion: ");
                  scanf("%s", nacion);
      
            }        
      
             if ((strcmp (nacion, "Espana")==0)){
            
                  printf("Galeria 6, Velzaquez y Murillo");
             }
   
             else if ((strcmp(nacion, "Italia")==0)){
            
                  printf("Galeria 7, Caravaggio");
            
            }
            else {
            
                  printf("No hay obras de esta nacionalidad");
            }
}
         else if ((strcmp(periodo, "expresionismo")==0)){
            
               printf("Galeria 8, Kandiski");
            }      
         if ((strcmp(periodo, "impresionismo")==0)){
         
                  printf("Galeria 8, Van Gogh");
               }
         else if ((strcmp(periodo, "fauvismo")==0)){
         
                  printf("Galeria 8, Manguin");
               }
         if ((strcmp(periodo, "cubismo")==0)){
         
                  printf("Galeria 9, Picasso");
               }
      else if ((strcmp(periodo, "surrealismo")==0)){
            {
               printf("Ingrese pintor: ");
               scanf("%s", pintor);
            }
            if ((strcmp(pintor, "Dali")==0)){
            
               printf("Galeria 10");
            }
            else if ((strcmp(pintor, "Miro")==0)){
            
               printf("Galeria 11");
            }
            else{
               printf("No hay obras de este pintor");
         
            }
}
      else if ((strcmp(periodo, "informalismo")==0) || (strcmp(periodo, "hiperralismo")==0)){
               printf("Galeria 12");
      }
         else {
      
               printf("No hay obras en este periodo");
                      }
      
      
   return 0;

}


En línea

Yuki

Desconectado Desconectado

Mensajes: 55


El error es una muestra de la incompetencia.


Ver Perfil WWW
Re: Consulta sobre programa C
« Respuesta #1 en: 14 Abril 2018, 17:23 »

¿Otra vez? Antes que nada, recordá poner tus códigos bajo la etiqueta "CODE".

Lamentablemente no te puedo ayudar ya que no entiendo donde empiezan y donde terminan los corchetes, tu código tiene que mejorar drasticamente.
O lo ofucaste apropósito, que se yo.

Solo pude encontrar una irregular doble apertura de corchetes.

Código
  1. int main()
  2. {
  3.      char periodo[50];
  4.      char pintor[50];
  5.      char nacion[50];
  6.  
  7.         printf("Ingrese periodo: ");
  8.         scanf("%s", periodo);
  9.  
  10.  
  11.      if ((strcmp (periodo, "Prehistorico")==0) || (strcmp(periodo, "egipcio")==0)){
  12.  
  13.  
  14.               printf("Galeria 1 \n");
  15.  
  16.      }      
  17.  
  18.      else if ((strcmp(periodo, "renacimiento")==0)){
  19.         {
  20.  
  21.  
  22.  
  23.  
  24.               printf("Ingrese nombre del pintor: ");
  25.               scanf("%s", pintor);
  26.         }
  27.          if ((strcmp (pintor, "Leonardo")==0) || (strcmp(pintor, "Michelangelo")==0))
  28.         {
  29.  
  30.               printf ("Galeria 2 \n");
  31.         }  
  32.         else if (strcmp(pintor, "Rafael")==0){
  33.  
  34.  
  35.                printf ("Galeria 3");
  36.          }  
  37.         else if ((strcmp (pintor, "Tiziano")==0) || (strcmp(pintor, "Boticelli")==0)){
  38.  
  39.  
  40.               printf("Galeria 4");
  41.         }  
  42.         else if ((strcmp (pintor, "Greco")==0) || (strcmp(pintor, "Tintoretto")==0)){
  43.  
  44.  
  45.               printf("Galeria 5a");
  46.         }
  47.         else if (strcmp(pintor, "Bellini")==0){
  48.  
  49.  
  50.               printf("Galeria 5b");
  51.         }  
  52.      else {
  53.  
  54.               printf("No hay obras de este pintor \n");
  55.         }
  56. }  
  57.  
  58.         if ((strcmp (periodo, "barroco")==0)){
  59.         {
  60.  
  61.  
  62.                  printf("Ingrese nacion: ");
  63.                  scanf("%s", nacion);
  64.  
  65.            }        
  66.  
  67.             if ((strcmp (nacion, "Espana")==0)){
  68.  
  69.                  printf("Galeria 6, Velzaquez y Murillo");
  70.             }
  71.  
  72.             else if ((strcmp(nacion, "Italia")==0)){
  73.  
  74.                  printf("Galeria 7, Caravaggio");
  75.  
  76.            }
  77.            else {
  78.  
  79.                  printf("No hay obras de esta nacionalidad");
  80.            }
  81. }
  82.         else if ((strcmp(periodo, "expresionismo")==0)){
  83.  
  84.               printf("Galeria 8, Kandiski");
  85.            }      
  86.         if ((strcmp(periodo, "impresionismo")==0)){
  87.  
  88.                  printf("Galeria 8, Van Gogh");
  89.               }
  90.         else if ((strcmp(periodo, "fauvismo")==0)){
  91.  
  92.                  printf("Galeria 8, Manguin");
  93.               }
  94.         if ((strcmp(periodo, "cubismo")==0)){
  95.  
  96.                  printf("Galeria 9, Picasso");
  97.               }
  98.      /* DOBLE "{" en las siguientes líneas.  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
  99.  
  100.      else if ((strcmp(periodo, "surrealismo")==0)){
  101.            {
  102.               printf("Ingrese pintor: ");
  103.               scanf("%s", pintor);
  104.            }
  105.            if ((strcmp(pintor, "Dali")==0)){
  106.  
  107.               printf("Galeria 10");
  108.            }
  109.            else if ((strcmp(pintor, "Miro")==0)){
  110.  
  111.               printf("Galeria 11");
  112.            }
  113.            else{
  114.               printf("No hay obras de este pintor");
  115.  
  116.            }
  117. }
  118.      else if ((strcmp(periodo, "informalismo")==0) || (strcmp(periodo, "hiperralismo")==0)){
  119.               printf("Galeria 12");
  120.      }
  121.         else {
  122.  
  123.               printf("No hay obras en este periodo");
  124.                      }
  125.  
  126.  
  127.   return 0;
  128.  
  129. }


En línea

Kenji-chan

Desconectado Desconectado

Mensajes: 73


Ver Perfil
Re: Consulta sobre programa C
« Respuesta #2 en: 14 Abril 2018, 17:32 »

yo he encontrado mas de una

Código
  1. int main()
  2. {
  3. char periodo[50];
  4. char pintor[50];
  5. char nacion[50];
  6.  
  7. printf("Ingrese periodo: ");
  8. scanf("%s", periodo);
  9.  
  10.  
  11. if ((strcmp (periodo, "Prehistorico")==0) || (strcmp(periodo, "egipcio")==0)){
  12. printf("Galeria 1 \n");
  13. }      
  14.  
  15. else if ((strcmp(periodo, "renacimiento")==0)){
  16. //{ <-- aqui
  17. printf("Ingrese nombre del pintor: ");
  18. scanf("%s", pintor);
  19. }
  20. if ((strcmp (pintor, "Leonardo")==0) || (strcmp(pintor, "Michelangelo")==0)){
  21.  
  22. printf ("Galeria 2 \n");
  23. }  
  24. else if (strcmp(pintor, "Rafael")==0){
  25. printf ("Galeria 3");
  26. }  
  27. else if ((strcmp (pintor, "Tiziano")==0) || (strcmp(pintor, "Boticelli")==0)){
  28. printf("Galeria 4");
  29. }  
  30. else if ((strcmp (pintor, "Greco")==0) || (strcmp(pintor, "Tintoretto")==0)){printf("Galeria 5a");
  31. }
  32. else if (strcmp(pintor, "Bellini")==0){
  33. printf("Galeria 5b");
  34. }  
  35. else {
  36. printf("No hay obras de este pintor \n");
  37. }
  38. }
  39. if ((strcmp (periodo, "barroco")==0)){
  40. //{ <-- aqui
  41. printf("Ingrese nacion: ");
  42. scanf("%s", nacion);
  43. }        
  44.  
  45. if ((strcmp (nacion, "Espana")==0)){
  46. printf("Galeria 6, Velzaquez y Murillo");
  47. }
  48.  
  49. else if ((strcmp(nacion, "Italia")==0)){
  50. printf("Galeria 7, Caravaggio");
  51.  
  52. }
  53. else {
  54. printf("No hay obras de esta nacionalidad");
  55. }
  56. //} <-- aqui
  57. else if ((strcmp(periodo, "expresionismo")==0)){
  58. printf("Galeria 8, Kandiski");
  59. }      
  60. if ((strcmp(periodo, "impresionismo")==0)){
  61. printf("Galeria 8, Van Gogh");
  62. }
  63. else if ((strcmp(periodo, "fauvismo")==0)){
  64. printf("Galeria 8, Manguin");
  65. }
  66. if ((strcmp(periodo, "cubismo")==0)){
  67. printf("Galeria 9, Picasso");
  68. }
  69. else if ((strcmp(periodo, "surrealismo")==0)){
  70. //{ <-- aqui
  71. printf("Ingrese pintor: ");
  72. scanf("%s", pintor);
  73. }
  74. if ((strcmp(pintor, "Dali")==0)){
  75. printf("Galeria 10");
  76. }
  77. else if ((strcmp(pintor, "Miro")==0)){
  78. printf("Galeria 11");
  79. }
  80. else{
  81. printf("No hay obras de este pintor");
  82.  
  83. }
  84. //} <-- aqui
  85. else if ((strcmp(periodo, "informalismo")==0) || (strcmp(periodo, "hiperralismo")==0)){
  86. printf("Galeria 12");
  87. }
  88. else {
  89. printf("No hay obras en este periodo");
  90. }
  91.  
  92.  
  93. return 0;
  94.  
  95. }
  96.  

te has echo un lio con los corchetes
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.100



Ver Perfil
Re: Consulta sobre programa C
« Respuesta #3 en: 14 Abril 2018, 19:39 »

Es 'muy imporante' tabular bien un código, lenguajes como Python lo han hecho norma, así se puede ver bien la estructura del programa. En cambio cuando se hace mal es fácil perder qué cosa va con qué cosa y así es imposible mantener la estructura.

Como podrás ver en el código arreglado cuándo entras en un periodo y preguntas por un pintor, el código debe seguir en ese if, no hay que cerrarlo, pues todo lo referente a esos pintores pertenece a ese periodo. Una vez terminado el periodo se sigue el else if para los periodos posteriores.

De todas formas esto es una práctica un poco mala, llamada spaghetti code, porque se extiende de seguido de principio a fin, haciéndolo difícil de seguir y mantener.

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4.  
  5. int main() {
  6.    char periodo[50];
  7.    char pintor[50];
  8.    char nacion[50];
  9.  
  10.    printf("Ingrese periodo: ");
  11.    scanf("%s", periodo); while(getchar()!='\n');
  12.  
  13.    if ((strcmp (periodo, "Prehistorico")==0) || (strcmp(periodo, "egipcio")==0)) {
  14.        printf("Galeria 1 \n");
  15.    }
  16.    else if (strcmp(periodo, "renacimiento")==0) {
  17.        printf("Ingrese nombre del pintor: ");
  18.        scanf("%s", pintor); while(getchar()!='\n');
  19.  
  20.        if ((strcmp (pintor, "Leonardo")==0) || (strcmp(pintor, "Michelangelo")==0)) {
  21.            printf ("Galeria 2 \n");
  22.        }
  23.        else if (strcmp(pintor, "Rafael")==0) {
  24.            printf ("Galeria 3");
  25.        }  
  26.        else if ((strcmp (pintor, "Tiziano")==0) || (strcmp(pintor, "Boticelli")==0)) {
  27.            printf("Galeria 4");
  28.        }  
  29.        else if ((strcmp (pintor, "Greco")==0) || (strcmp(pintor, "Tintoretto")==0)) {
  30.            printf("Galeria 5a");
  31.        }
  32.        else if (strcmp(pintor, "Bellini")==0) {
  33.            printf("Galeria 5b");
  34.        }
  35.        else {
  36.            printf("No hay obras de este pintor \n");
  37.        }
  38.    }
  39.    else if (strcmp(periodo, "barroco")==0) {
  40.        printf("Ingrese nacion: ");
  41.        scanf("%s", nacion); while(getchar()!='\n');
  42.  
  43.        if (strcmp (nacion, "Espana")==0) {
  44.            printf("Galeria 6, Velzaquez y Murillo");
  45.        }
  46.        else if (strcmp(nacion, "Italia")==0) {
  47.            printf("Galeria 7, Caravaggio");
  48.        }
  49.        else {
  50.            printf("No hay obras de esta nacionalidad");
  51.        }
  52.    }
  53.    else if (strcmp(periodo, "expresionismo")==0) {
  54.        printf("Galeria 8, Kandiski");
  55.    }      
  56.    else if (strcmp(periodo, "impresionismo")==0) {
  57.        printf("Galeria 8, Van Gogh");
  58.    }
  59.    else if (strcmp(periodo, "fauvismo")==0) {
  60.        printf("Galeria 8, Manguin");
  61.    }
  62.    else if (strcmp(periodo, "cubismo")==0) {
  63.        printf("Galeria 9, Picasso");
  64.    }
  65.    else if (strcmp(periodo, "surrealismo")==0) {
  66.        printf("Ingrese pintor: ");
  67.        scanf("%s", pintor); while(getchar()!='\n');
  68.  
  69.        if (strcmp(pintor, "Dali")==0) {
  70.            printf("Galeria 10");
  71.        }
  72.        else if (strcmp(pintor, "Miro")==0){
  73.            printf("Galeria 11");
  74.        }
  75.        else{
  76.            printf("No hay obras de este pintor");
  77.        }
  78.    }
  79.    else if ((strcmp(periodo, "informalismo")==0) || (strcmp(periodo, "hiperralismo")==0)) {
  80.        printf("Galeria 12");
  81.    }
  82.    else {
  83.        printf("No hay obras en este periodo");
  84.    }
  85.  
  86.    return 0;
  87. }
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
NEBIRE


Desconectado Desconectado

Mensajes: 1.050


Ver Perfil
Re: Consulta sobre programa C
« Respuesta #4 en: 15 Abril 2018, 03:13 »

Cuando usas más de 3-4 if..elseif seguidos, debes pensar en una solución algo más 'elegante', que a la par de ganar en claridad, es más fácil de mantener...

0 - De entrada usando un Switch, sería más claro.
1 - Pero mejor aún si usas unos arrays, en uno guardas los 'periodos', y en otro los pintores...
2 - En realidad sería mejor usar una estructura...

...pero vamos con arrays y en un futuro lo mejoras con alguna estructura...
Código:
Funcion Main
  Array de strings periodos(0 a x-1)
    periodos(0) = "Prehistorico"
    periodos(1) = "Egipcio"
    periodos(2) = "Renacimiento"
    periodos(3) = "Barroco"
    ... etc...

  Array de Strings pintores(0 a y-1)
    pintores(0) = "Leonardo"
    pintores(1) = "Michelangelo"
    ... etc...
    pintores(7) = "Bellini"
    pintores(8) = "Velázquez"
    pintores(9) = "Murillo"
    pintores(10) = "Caravaggio"
    ... etc...
 
  array de strings PintoresPeriodo(0 a x-1)  //relaciona los pintores con cada periodo
    pintoresPeriodo(0) = "-1,1"   // no contiene pintores, y la galeria es la 1.
    pintoresPeriodo(1) = "-1,1"  // no contiene pintores, la galeria es la 1.
    pintoresPeriodo(2) = "0,1,2,3,4,5,6,7" // Leonardo, Michelangelo... y Bellini pertencen al periodo 2
    pintoresPeriodo(3) = "8,9,10" // Velázquez, Murillo y Caravaggio, pertencen al periodo 3
    ... etc...

  Array de enteros galerias(0 a y-1)  // relaciona a cada pintor con una galeria.
    galerias(0) = 2   // Leonardo está en la galeria 2.
    galerias(1) = 2   // Michelangelo también está en la galeria 2.
    galerias(2) = 3   // Rafael está en la galeria 3.
    ... etc...

    galerias(7) = 6   // Bellini en la galería 6 (equivalente a la 5b, guardamos números en este array, pero se puede cambiar a array de strings, si es preciso poner 5b...
    galerias(8) = 7   // Velázquez en galeria 7
    galerias(9) = 7  // Murillo        "    "
    galerias(10) = 8  // Caravaggio, en la galeria 8
    ... ec...

   Llamada MostrarOpcionesAlUsuario
Fin funcion

Ahora la función que realiza todo el trabajo... muestra opciones, deja elegir al usuario, verifica valor correcto y muestra resultados.
Código:
Funcion MostrarOpcionesAlUsuario
     String repite
     entero prd, pnt, gal  // periodo, pintor
     buleano b

    Hacer
        Hacer
            Llamada imprimirPeriodos
            prd = PedirPeriodo("Elige un periodo... (teclea el número asociado al periodo)")
        Repetir mientras ((prd < 0) o (prd >= x))
        imprimir "Periodo elegido: " + periodos(prd)       
     
        Hacer
            b = llamada ImprimirPintores(prd)
            Si (b = TRUE)
                pnt = PedirPintor("Elige un pintor... (teclea el número asociado al pintor)")
                mostrarAlUsuario("...para el pintor " + pintores(pnt) + " del periodo " + periodos(prd)  + " La galería correspondiente es: " + galerias(pnt)
            sino
                pnt = 0 // para periodos sin pintores, ya se mostró la galería, no precisa un valor elegido.
            fin si
        Repetir mientras ((pnt < 0) o (pnt >= y))

        repite = PedirAlUsuario("¿ Desea elegir otra vez (S/N) ?")
    Repetir mientras repite = "s" o repite ="S"
Fin funcion


Borra la pantalla y muestra opción de elgir un periódo:
  Prehistórico    = 0
  Egipcio           = 1
  Renacimiento  = 2
  Barroco          = 3
  ...
Código:
Funcion imprimirPeriodos
    entero k
   
    Borrar pantalla
    bucle para k desde 0 hasta x-1
        imprimir periodos(k) + tabulador + " = " + (k)
    siguiente en bucle
fin funcion

Imprime la lista de pintores asociada al periodo elegido (que se recibe como parametro).
y devuelve un buleano. Si devuelve TRUE, indica que debe localizarse la galería asociada al pintor que se elija.
  Periodo elegido: Renacimiento
  Elige un pintor... (teclea el número asociado al pintor)
      Leonardo      = 0
      Michelangelo = 1
      ...
      Bellini           = 7
Código:
buleano = funcion ImprimirPintores(entero periodo)
    entero k, z
    array de enteros n()

    n = TomarCadaNumeroSeparadoPorUnaComaDe(pintoresPeriodo(periodo)
    z = ultimoIndiceEnArray(n)

    Si (n(0) =>0)
        Hacer
            imprimir tabulador + pintores(n(k)) + tabulador +  " = " + n(k)
            k +=1
        Repetir mientras (k<=z)
        Devolver TRUE
    Sino
        imprimir "el periodo " + periodos(periodo) + " no tiene pintores conocidos, la galeria es: " + galerias(n(1))
        devolver FALSE
    Fin si
fin funcion

Como puedes ver, lo hemos resuelto sin un mísero if...elseif... gana en claridad, y si la lista crece o cambia, basta modificar en main, los valores de 'x', 'y' y reasignar en sus respectivos arrays...
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
consulta sobre un programa
Foro Libre
Maeloc 6 1,218 Último mensaje 17 Agosto 2007, 03:21
por Zinc
Consulta sobre el programa ADOBE AUDITION
Multimedia
tevas 1 2,190 Último mensaje 8 Febrero 2009, 02:38
por Songoku
Consulta sobre programa con mochila
Ingeniería Inversa
susond 3 1,610 Último mensaje 12 Junio 2014, 12:57
por dongle2bin
[C](Consulta) Pregunta sobre si una característica es de ANSI C (sobre arreglos)
Programación C/C++
class_OpenGL 4 982 Último mensaje 5 Junio 2016, 23:17
por class_OpenGL
Consulta sobre programa.
Programación C/C++
onetake 0 411 Último mensaje 19 Diciembre 2016, 00:55
por onetake
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines