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.
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:
/*** 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 hacer un comentario o consulta utiliza los foros aprenderaprogramar.com, abiertos a cualquier persona independientemente de su nivel de conocimiento.