[ Foro de C ]

Ejercicios 5.5.2

14-Aug-2014 00:16
Invitado (Rafa)
2 Respuestas

Hola Nacho, lo primero agradecer tu gran labor y a los colaboradores que hacen que aprendamos sin menos trabas.

Quería antes igualmente comentar que me he registrado como usuario en la web pero al confirmar desde mi mail o copiando la dirección no puedo validar mi user dándome "No se puede confirmar ese usuario".

Ahora voy a mostrar los últimos dos ejercicios sobre los que he trabajado, primero este 5.5.2.1 // Quería preguntar o confirmar si en el caso 3 de búsqueda estaría correcto la ruptura de los bucles con break o de que otra manera podría hacerlo. Sin break no me funcionaba el programa en esa parte adecuadamente.


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

int main(void){

    int opcion,i,numeroCancion=0;
    char temporal[40];

    struct cancionMP3{
        char artista[40];
        char titulo[40];
        int duracion;
        int tamanio;
    }cancion[10];

    do{

            printf("\n***Escoja una opcion***\n");
            printf("\n1. Anadir nueva cancion\n");
            printf("2. Mostrar titulos de las canciones\n");
            printf("3. Buscar cancion\n");
            printf("4. Salir\n");
            printf("\nopcion: ");
            gets(temporal);
            sscanf(temporal,"%d",&opcion);

        switch(opcion){

                case 1:

                    if(numeroCancion<=10){

                        printf("Introduzca artista: ");
                        gets(cancion[numeroCancion].artista);
                        printf("Introduzca titulo: ");
                        gets(cancion[numeroCancion].titulo);
                        printf("Introduzca duracion en segundos: ");
                        gets(temporal);
                        sscanf(temporal,"%d",&cancion[numeroCancion].duracion);
                        printf("Introduzca tamano en kb: ");
                        gets(temporal);
                        sscanf(temporal,"%d",&cancion[numeroCancion].tamanio);
                        numeroCancion++;
                    }else
                        printf("\nLo siento se ha superado el tamanio maximo en numero de canciones\n");
                    break;

                case 2:
                    printf("\nTitulos de canciones:\n");
                    for(i=0;i<numeroCancion;i++){

                        printf("\nCancion %d: %s",i+1,cancion[i].titulo);
                        printf("\n");
                    }
                    break;

                case 3:
                    printf("\nBusqueda de cancion por titulo o autor, introduzca titulo o autor:");
                    gets(temporal);
                    for(i=0;i<=numeroCancion;i++){

                       if (strstr(cancion[i].artista,temporal)!=NULL){
                            printf("\nArtista: %s ",cancion[i].artista);
                            printf("\nTitulo: %s ",cancion[i].titulo);
                            break;
                       }
                        else
                            if(strstr(cancion[i].titulo,temporal)!=NULL){
									printf("\nTitulo: %s ",cancion[i].titulo);
									printf("\nArtista: %s ",cancion[i].artista);
									break;
                            }
                                else{
                        			printf("\nERROR: Texto Incorrecto\n");break;
                                }
                    }
                    break;

                case 4:
                    printf("\n***Fin del programa***\n");
                    break;

                default:
                    printf("\n^^^Opcion desconocida^^^\n");
                    break;
        }
    }while(opcion!=4);

return 0;
}


Y por último estoy estancado en este siguiente 5.5.2.2 donde no termino de ver porque no me funciona el caso de mostrar y el de buscar, a pesar de haber usado la filosofía del anterior programa. Muchas gracias.


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

int main(void){

    int opcion,i,contador=0,find;
    char temporal[40];

    struct datosPC{
        char nombre[40];
        int ancho;
        int alto;
        float tamanyo;
    }imagen[700];

    do{

            printf("\n***Escoja una opcion***\n");
            printf("\n1. Anadir ficha nueva\n");
            printf("2. Mostrar fichas\n");
            printf("3. Buscar ficha\n");
            printf("4. Salir\n");
            printf("\nopcion: ");
            gets(temporal);
            sscanf(temporal,"%d",&opcion);

        switch(opcion){

                case 1:

                    printf("\nPuede incluir como maximo 700 fichas, introduzca cantidad --> ");
                    scanf("%d",&contador);
                    getchar();
                    if(contador<700){

                            for(i=0;i<contador;i++){
                                printf("\nIntroduzca ficha: ");
                                gets(imagen[contador].nombre);
                                printf("Introduzca ancho en pixeles: ");
                                gets(temporal);
                                sscanf(temporal,"%d",&imagen[contador].ancho);
                                printf("Introduzca alto en pixeles: ");
                                gets(temporal);
                                sscanf(temporal,"%d",&imagen[contador].alto);
                                printf("Introduzca tamano en kb: ");
                                gets(temporal);
                                sscanf(temporal,"%f",&imagen[contador].tamanyo);
                            }
                    }else
                            printf("\nLo siento se supera el limite maximo en numero de fichas\n");
                    break;

                case 2:
                    printf("\nMostrar fichas:\n");
                    for(i=0;i<contador;i++){

                        printf("\nImagen %d: %s",i,imagen[i].nombre);

                    }
                    break;

                case 3:
                    printf("\nBusqueda de ficha, introduzca nombre:");
                    gets(temporal);
                    for(i=0;i<contador;i++){

                        if (strcmp(imagen[i].nombre,temporal)==0){
                                printf("\nnombre:%s Ancho:%d Alto:%d Tamanio:%f Kb \n",imagen[i].nombre,imagen[i].ancho,imagen[i].alto,imagen[i].tamanyo);
                                find=1;
                        }
                        if(!find)
                        			printf("\nERROR: Texto Incorrecto\n");
                    }
                    break;

                case 4:
                    printf("\n***Fin del programa***\n");
                    break;

                default:
                    printf("\n^^^Opcion desconocida^^^\n");
                    break;
        }
    }while(opcion!=4);

return 0;
}




18-Aug-2014 02:00
Nacho Cabanes (+83)

En cuanto al primer ejercicio: el "break" es una orden que se debería evitar siempre (salvo en los "case", en los que es parte de la sintaxis, claro), porque ayuda a que los programas sean poco legibles, ya que se puede salir del bucle por algún motivo que no es el que aparece en la condición de control del bucle. En el caso concreto de una búsqueda, la forma habitual es: recorres los datos, si encuentras uno que cumpla las condiciones, lo escribes y actualizas un booleano o un contador; al final de la búsqueda, si ese booleano sigue siendo "falso" o si el contador sigue siendo 0, avisas de que no se ha encontrado nada.

Para el segundo ejercicio, el problema no está donde parece: estás guardando mal los datos. No estás almacenando en dato[i] sino en dato [contador].


25-Aug-2014 18:58
Invitado (Rafa)

Hola Nacho,

gracias por contestar. Dejo mis códigos limpios con las modificaciones que me indicas por si igualmente le puede servir a otro alumno como yo.


/* Curso de C: Nacho Cabanes   */
/* Tema 6 - Manejo de ficheros */
/* Ejercicio 5.5.2.1           */
/* codificado por Rafa Campos  */

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

int main(void){

    int opcion,i,numeroCancion=0,find=0;
    char temporal[40],n;

    struct cancionMP3{
        char artista[40];
        char titulo[40];
        int duracion;
        int tamanio;
    }cancion[10];

    do{

            printf("\n***Escoja una opcion***\n");
            printf("\n1. Anadir nueva cancion\n");
            printf("2. Mostrar titulos de las canciones\n");
            printf("3. Buscar cancion\n");
            printf("4. Salir\n");
            printf("\nopcion: ");
            gets(temporal);
            sscanf(temporal,"%d",&opcion);

        switch(opcion){

                case 1:

                    if(numeroCancion<=10){

                        printf("Introduzca artista: ");
                        gets(cancion[numeroCancion].artista);
                        printf("Introduzca titulo: ");
                        gets(cancion[numeroCancion].titulo);
                        printf("Introduzca duracion en segundos: ");
                        gets(temporal);
                        sscanf(temporal,"%d",&cancion[numeroCancion].duracion);
                        printf("Introduzca tamano en kb: ");
                        gets(temporal);
                        sscanf(temporal,"%d",&cancion[numeroCancion].tamanio);
                        numeroCancion++;
                    }else
                        printf("\nLo siento se ha superado el tamanio maximo en numero de canciones\n");
                    break;

                case 2:
                    printf("\nTitulos de canciones:\n");
                    for(i=0;i<numeroCancion;i++){

                        printf("\nCancion %d: %s",i+1,cancion[i].titulo);
                        printf("\n");
                    }
                    break;

                case 3:
                    printf("\nBusqueda de cancion por titulo o autor, introduzca titulo o autor:");
                    gets(temporal);
                    for(i=0;i<numeroCancion;i++){
                         if (strstr(cancion[i].artista,temporal)!=NULL){
                            printf("\nArtista: %s ",cancion[i].artista);
                            printf("\nTitulo: %s ",cancion[i].titulo);
                            find=1;
                       	}
                        else
                            if(strstr(cancion[i].titulo,temporal)!=NULL){
									printf("\nTitulo: %s ",cancion[i].titulo);
									printf("\nArtista: %s ",cancion[i].artista);
									find=2;
                            }
                                else if(find!=1 || find!=2)
                        			printf("\nERROR: Texto Incorrecto\n");
                    }
                    break;
                case 4:
                    printf("\n***Fin del programa***\n");
                    break;

                default:
                    printf("\n^^^Opcion desconocida^^^\n");
                    break;
        }
    }while(opcion!=4);

return 0;
}




/* Curso de C: Nacho Cabanes   */
/* Tema 6 - Manejo de ficheros */
/* Ejercicio 5.5.2.2           */
/* codificado por Rafa Campos  */

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

int main(void){

    int opcion,i,contador=0,find=0;
    char temporal[40];

    struct datosPC{
        char nombre[40];
        int ancho;
        int alto;
        float tamanyo;
    }imagen[700];

    do{

            printf("\n***Escoja una opcion***\n");
            printf("\n1. Anadir ficha nueva\n");
            printf("2. Mostrar fichas\n");
            printf("3. Buscar ficha\n");
            printf("4. Salir\n");
            printf("\nopcion: ");
            gets(temporal);
            sscanf(temporal,"%d",&opcion);

        switch(opcion){

                case 1:

                    printf("\nPuede incluir como maximo 700 fichas, introduzca cantidad --> ");
                    scanf("%d",&contador);
                    getchar();
                    if(contador<700){

                            for(i=0;i<contador;i++){
                                printf("\nIntroduzca ficha: ");
                                gets(imagen[i].nombre);
                                printf("Introduzca ancho en pixeles: ");
                                gets(temporal);
                                sscanf(temporal,"%d",&imagen[i].ancho);
                                printf("Introduzca alto en pixeles: ");
                                gets(temporal);
                                sscanf(temporal,"%d",&imagen[i].alto);
                                printf("Introduzca tamano en kb: ");
                                gets(temporal);
                                sscanf(temporal,"%f",&imagen[i].tamanyo);
                            }
                    }else
                            printf("\nLo siento se supera el limite maximo en numero de fichas\n");
                    break;

                case 2:
                    printf("\nMostrar fichas:\n");
                    for(i=0;i<contador;i++){

                        printf("\nImagen %d: %s",i,imagen[i].nombre);

                    }
                    printf("\n");
                    break;

                case 3:
                    printf("\nBusqueda de ficha, introduzca nombre:");
                    gets(temporal);
                    for(i=0;i<contador;i++){
                        if (strcmp(imagen[i].nombre,temporal)==0){
                                printf("\nnombre:%s Ancho:%d Alto:%d Tamanio:%f Kb \n",imagen[i].nombre,imagen[i].ancho,imagen[i].alto,imagen[i].tamanyo);
                				find=1;
                		}
					}
                	if (find==0)
                			printf("\n##No existe la ficha con el texto introducido##\n");
                    break;

                case 4:
                    printf("\n***Fin del programa***\n");
                    break;

                default:
                    printf("\n^^^Opcion desconocida^^^\n");
                    break;
        }
    }while(opcion!=4);

return 0;
}


Saludos y gracias de nuevo por las aclaraciones






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