Resumen: Entrega nº42 del tutorial "Curso básico de programación en lenguaje C desde cero".
Codificación aprenderaprogramar.com: CU00542F

 

 

EJERCICIO Nº1: ENUNCIADO

Transformar en código el siguiente planteamiento y razonar para comprender su lógica. Se trata de crearun programa que responda a las necesidades de una librería que desea almacenar y consultar información relacionada con sus libros a partir del identificador del libro denominado ISBN.

 

logo lenguaje programacion C

 

Descripción del funcionamiento: Una librería dispone de un archivo donde se guarda información relativa a un lote de libros estructurada de la siguiente manera: Dato(1) = [Número de ISBN, 10 dígitos], Dato(2) = [Precio de venta al público, en euros], Dato(3) = [Señalero,   -33 Libro de menos de un año de antigüedad -66 Libro de uno a tres años de antigüedad -99 Libro de más de tres años de antigüedad] Dato(4) = [Número de ISBN]...Dato(n – 1) = [Señalero -33, -66, -99], Dato(n) = [Señalero -500, Fin del lote]

Dato(1) = [Número de ISBN, 10 dígitos]

Dato(2) = [Precio de venta al público, en euros]

Dato(3) = [Señalero,   -33 Libro de menos de un año de antigüedad

                 -66 Libro de uno a tres años de antigüedad

                                     -99 Libro de más de tres años de antigüedad]

Dato(4) = [Número de ISBN]

.
.
.

Dato(n – 1) = [Señalero -33, -66, -99]    

Dato(n) = [Señalero -500, Fin del lote]

 

 

Se desea desarrollar un programa que permita:

a) Consultar el precio de un libro dado su ISBN.

b) Conocer el precio del lote de libros en conjunto.

 

Teniendo en cuenta lo siguiente: si el libro tiene menos de un año de antigüedad su precio coincide con el registrado. Si tiene entre uno y tres años deberá aplicarse un descuento del 15%. Si tiene más de tres años deberá aplicarse una rebaja del 25%.


Nota: considerar que el número total de datos es igual o inferior a 50, y que se encuentran en el fichero libros.dat, que habremos creado previamente. 

 

 

EJERCICIO Nº1: SOLUCIÓN

En un archivo al que llamaremos libros.dat pondremos una simulación de datos como la siguiente:

guardar datos en archivo visual basic

 

 

/*** Gestión de libros ***/
#include <stdio.h>
#include <stdlib.h>
#define NUMELEMENTOS 50

int main() {
    int i=0;
    double dato[NUMELEMENTOS];
    double isbn=0.0; double precio=0.0; double valorLote=0.0;
    int encontrado = 0; //0 representa no encontrado, 1 sí encontrado
    int eleccionUsuario=0;
    printf ("1. Calculo precio un libro\n2. Calculo precio del lote\n\nElija opcion: ");
    scanf("%d", &eleccionUsuario);
    //Ejercicios resueltos aprenderaprogramar.com
    //Cálculo precio de un libro opción 1 del menú
    if (eleccionUsuario == 1) {
        printf ("Introduzca el ISBN del libro. ISBN: ");
        scanf("%lf", &isbn);
        //Extracción de datos de archivo
        FILE* fichero;
        fichero = fopen("libros.dat", "rt");
        fscanf(fichero, "%lf", &dato[i]); //Obtenemos isbn o final
        while (dato[i] != -500) {
            if (dato[i] == isbn) {
                fscanf(fichero, "%lf", &dato[i+1]);
                fscanf(fichero, "%lf", &dato[i+2]);
                precio = dato[i+1];
                if (dato[i+2] == -66) {precio = 0.85*precio;}
                if (dato[i+2] == -99) {precio = 0.75*precio;}
                printf ("El precio del libro con isbn %.0lf es de %.2lf euros ", isbn, precio);
                encontrado =1;
            }
            i = i+3;
            fscanf(fichero, "%lf", &dato[i]); //Obtenemos isbn o final
        }
        fclose(fichero);
        if (encontrado == 0) {printf ("No se ha encontrado el ISBN deseado");}
    } //Fin opción 1 del menú
    /*
    ********Cálculo precio del lote opción 2 del menú
    */
    if (eleccionUsuario == 2) {
        FILE* fichero;
        fichero = fopen("libros.dat", "rt");
        fscanf(fichero, "%lf", &dato[i]); //Obtenemos isbn o final
        while (dato[i] != -500) {
            fscanf(fichero, "%lf", &dato[i+1]);
            fscanf(fichero, "%lf", &dato[i+2]);
            precio = dato[i+1];
            if (dato[i+2] == -66) {precio = 0.85*precio;}
            if (dato[i+2] == -99) {precio = 0.75*precio;}
            valorLote = valorLote + precio;
            i = i+3;
            fscanf(fichero, "%lf", &dato[i]); //Obtenemos isbn o final
        }
        fclose(fichero);
        printf ("El precio del lote es %.2lf euros ", valorLote);
    }
    return 0; // Ejercicios resueltos aprenderaprogramar.com
}

 

 

En varias ejecuciones del programa podríamos obtener los siguientes resultados:

1. Calculo precio un libro 2. Calculo precio del lote

Elija opcion: 1

Introduzca el ISBN del libro. ISBN: 55

El precio del libro con isbn 55 es de 7.50 euros

Introduzca el ISBN del libro. ISBN: 35

El precio del libro con isbn 35 es de 5.95 euros

Introduzca el ISBN del libro. ISBN: 88

El precio del libro con isbn 88 es de 12.00 euros

Introduzca el ISBN del libro. ISBN: 33

No se ha encontrado el ISBN deseado

Elija opcion: 2

El precio del lote es 25.45 euros

 

 

Para limitar el número de decimales mostrado hemos introducido .n (por ejemplo .2) después del símbolo % para indicar que se muestren n decimales:

printf ("El precio del libro con isbn %.0lf es de %.2lf euros ", isbn, precio);

El enunciado indicaba que el número de ISBN debía constar de 10 dígitos. En los datos de ejemplo no hemos cumplido esta premisa para simplificar.

Nota: también hubiera sido válido considerar que el ISBN no es un dato numérico y haberlo tratado como una cadena de texto.

 

 

EJERCICIO Nº2: ENUNCIADO

Transformar en código el siguiente pseudocódigo y razonar para comprender su lógica. Se trata de crearun programa que calcule el sumatorio de los 10 primeros números enteros positivos y según decida el usuario calcule o no la suma de los 20, 30, 40..., n – 10, n enteros positivos.

 

Pseudocódigo:

1.  Inicio

2.  j = 1

3.  Respuesta = “s”

4.  Mientras Respuesta = “s” ó Respuesta = “S” Hacer

4.1  Desde i = j hasta j + 9 Hacer

Suma = Suma + i

Siguiente

4.2  j = j + 10

4.3  Mostrar “La suma de los“, j – 1, “primeros números da”, Suma

4.4  Mostrar “¿Quiere continuar? (S/N)”

4.5  Pedir Respuesta

Repetir

5.  Fin [Pseudocódigo aprenderaprogramar.com]

 

 

EJERCICIO Nº2: SOLUCIÓN

#include <stdio.h>
#include <stdlib.h>
int main() {
    int i=0; int suma=0; int j=1;
    char respuesta = 's';
    while (respuesta=='s' || respuesta=='S') {
        for(i=j; i<=j+9; i++ ) { suma = suma + i; }
        j = j + 10;
        printf("La suma de los %d primeros numeros da: %d\n", j-1, suma);
        printf("Continuar para obtener suma hasta %d primeros numeros (S/N): ", j+9);
        scanf("%c%*c", &respuesta); //"%c%*c" hace que el carácter oculto nueva linea no sea tenido en cuenta
    }
    return 0; // Ejercicios resueltos aprenderaprogramar.com
}

 

 

Tener en cuenta que hemos usado scanf("%c%*c", &respuesta); porque la función scanf con texto consume la entrada pero deja pendiente (en el buffer) el carácter oculto de nueva línea para la siguiente entrada. Al escribir %c%*c estamos indicando que se almacene el carácter de entrada del usuario y que sea desechado el carácter que venga a continuación (en nuestro caso el carácter de nueva línea no se dejará pendiente). Si no usamos esto el carácter de nueva línea se consume en la siguiente pasada del bucle y se produce la terminación del programa sin esperar a que el usuario introduzca su respuesta.

Un resultado de ejecución podría ser el siguiente:

La suma de los 10 primeros numeros da: 55
Continuar para obtener suma hasta 11 primeros numeros (S/N): s
La suma de los 20 primeros numeros da: 210
Continuar para obtener suma hasta 30 primeros numeros (S/N): s
La suma de los 30 primeros numeros da: 465
Continuar para obtener suma hasta 40 primeros numeros (S/N): s
La suma de los 40 primeros numeros da: 820
Continuar para obtener suma hasta 50 primeros numeros (S/N): s
La suma de los 50 primeros numeros da: 1275
Continuar para obtener suma hasta 60 primeros numeros (S/N): s
La suma de los 60 primeros numeros da: 1830
Continuar para obtener suma hasta 70 primeros numeros (S/N): s
La suma de los 70 primeros numeros da: 2485
Continuar para obtener suma hasta 80 primeros numeros (S/N): s
La suma de los 80 primeros numeros da: 3240
Continuar para obtener suma hasta 90 primeros numeros (S/N): n
Process returned 0 (0x0)   execution time : 25.490 s
Press any key to continue.

 

 

EJERCICIO

Crear un programa que muestre en pantalla un diamante formado por asteriscos, dado un valor de número de asteriscos máximo en el punto central del diamante o rombo. Ejemplo: si el valor en el punto central es 5 el rombo sería:

Ejemplo:

*

**

***

****

*****

****

***

**

*

 

Nota: antes de crear el código hay que estudiar la lógica para proceder a crear el rombo, teniendo en cuenta que para poder mostrarlo habremos de dejar espacios en blanco a la derecha e izquierda de todas las líneas excepto la central.

Para comprobar si tus respuestas son correctas puedes consultar en los foros aprenderaprogramar.com.

 

 

 

 

 

 

Para acceder a la información general sobre este curso y al listado completo de entregas pulsa en este link:  Ver curso completo.

 

Para  hacer un comentario o consulta utiliza los foros aprenderaprogramar.com, abiertos a cualquier persona independientemente de su nivel de conocimiento.

 

Descargar archivo: