Consulta sobre programa C

Iniciado por GonzaJava, 14 Abril 2018, 16:25 PM

0 Miembros y 1 Visitante están viendo este tema.

GonzaJava

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;

}

Yuki

¿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 (cpp) [Seleccionar]
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");
               }
      /* DOBLE "{" en las siguientes líneas.  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
     
      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;

}

Kenji-chan

yo he encontrado mas de una


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)){
//{ <-- aqui
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)){
//{ <-- aqui
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");
}
//} <-- aqui
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)){
//{ <-- aqui
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");

}
//} <-- aqui
else if ((strcmp(periodo, "informalismo")==0) || (strcmp(periodo, "hiperralismo")==0)){
printf("Galeria 12");
}
else {
printf("No hay obras en este periodo");
}


return 0;

}


te has echo un lio con los corchetes

MAFUS

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.

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


int main() {
    char periodo[50];
    char pintor[50];
    char nacion[50];
   
    printf("Ingrese periodo: ");
    scanf("%s", periodo); while(getchar()!='\n');
   
    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); while(getchar()!='\n');
       
        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");
        }
    }
    else if (strcmp(periodo, "barroco")==0) {
        printf("Ingrese nacion: ");
        scanf("%s", nacion); while(getchar()!='\n');
       
        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");
    }     
    else if (strcmp(periodo, "impresionismo")==0) {
        printf("Galeria 8, Van Gogh");
    }
    else if (strcmp(periodo, "fauvismo")==0) {
        printf("Galeria 8, Manguin");
    }
    else if (strcmp(periodo, "cubismo")==0) {
        printf("Galeria 9, Picasso");
    }
    else if (strcmp(periodo, "surrealismo")==0) {
        printf("Ingrese pintor: ");
        scanf("%s", pintor); while(getchar()!='\n');
       
        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;
}

Serapis

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...

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.

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
  ...

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
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...