computacion ii informatica ii - unsjdea.unsj.edu.ar/informatica2/recursos/guias de... · considera...

88
COMPUTACION II INFORMATICA II Ingeniería Electrónica y Bioingeniería Guía de Práctica Nº 1 Problemas resueltos y propuestos sin utilizar funciones Departamento de Electrónica y Automática Facultad de Ingeniería Universidad Nacional de San Juan

Upload: others

Post on 15-Jul-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

COMPUTACION II INFORMATICA II

Ingeniería Electrónica y Bioingeniería

Guía de Práctica Nº 1 Problemas resueltos y propuestos

sin utilizar funciones

Departamento de Electrónica y Automática Facultad de Ingeniería

Universidad Nacional de San Juan

Page 2: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas sin Funciones

2

Analisis mediante un conjunto de datos de prueba

PROBLEMA 1: Escribir un algoritmo que permita leer un valor entero y un real, que calcule y muestre la potencia del valor real elevado al valor entero, utilizando la técnica de productos sucesivos para la potenciación.

#include <stdio.h> int main( )

int base, nro_repetic; float exp, prod=1 printf("\n Ingrese el valor de la base: "); scanf("%f", &base); printf("\n Ingrese el valor del exponente: "); scanf("%d", &exp); for( nro_repetic=1; nro_repetic <= exp; nro_repetic ++ )

proa *= base; /* Equivale a colocar proa = proa * b ase */ printf( "En la repeticion:%d\n", nro_repetic ); printf( "En esta vuelta el valor de producto corres ponde:%f\n\n", proa );

printf("\n\n El valor de la base elevado al exponen te es:%d", proa ); return 0;

Por teclado se debe ingresar el conjunto de datos de entrada: base y exponente, mediante las dos variables declaradas en el ambiente: base y exp. Si bien el resultado final se muestra a partir de la variable de salida prod, esta variable sufre ciertos cambios de valores a medida que corre el programa editado en C. Por pantalla se muestra toda la evolución. Por lo que se podría utilizar

Para observar los datos a medida que corre el programa, la idea es mostrar como evolucionan las variables mientras corre el programa. Se propone el siguiente conjunto de datos de prueba para verificar el funcionamiento:

Si se toma como base 2 (variable base=2 ingresada por teclado) y exponente 6 (variable exp=6 ingresada por teclado). El resultado final será de 26=64 (variable prod=64 que se muestra por teclado).

La siguiente tabla muestra el conjunto de datos de prueba:

base exp Nro de repetición prod

2 6 1 2 2 6 2 4 2 6 3 8 2 6 4 16 2 6 5 32 2 6 6 64

Los valores de esta tabla se pueden ver por pantalla de salida cuando se ejecuta el programa desarrollado en C previamente compilado.

Page 3: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas sin Funciones

3

De esta manera se puede verificar que los datos obtenidos en el programa diseñado coinciden con los datos calculados antes de hacer correr el programa en C.

Problemas Resueltos Sin Funciones

Problema 2: Leer datos hasta que se llegue a 1000 elementos o que el dato ingresado sea igual a –50. Calcular e imprimir: a) La cantidad de elementos ingresados b) El porcentaje de elementos pares. c) El promedio de todos los datos ingresados, excluyendo si se ingresa el –50. Nota: Recordar que el operador %(módulo) se usa para obtener al resto de la división entera.

#include <stdio.h> int main( )

int dato=0, conttotal=0, contpa=0, sum=0; float porc, prom; printf("\n Ingrese el dato: "); scanf("%d", &dato); while( (dato!=-50) && (conttotal!=10) )

conttotal++; if(dato%2==0)

contpa++; sum+=dato; printf ("\n Ingrese el dato: ");

Page 4: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas sin Funciones

4

scanf ("%d", &dato); printf ("\n La cantidad de elementos es: %d", contt otal); if( conttotal!=0 )

porc =(float)(contpa*100)/conttotal; prom =(float)sum/conttotal;

printf( "El porcentaje de los pares es: %8.2f\%\n", porc ); printf( "El promedio de los datos ingresados es: %8 .2f\%\n", prom); return 0;

Hacer un análisis del funcionamiento del algoritmo mediante un conjunto de datos de prueba, completando los valores de la tabla, tal como el ejemplo modelo .

dato conttotal contpa sum porc prom 2 17 26 122 1 45 -50

Problema 3 Un conjunto de pintores requiere que sus pinturas tengan una densidad entre 100 y 120 unidades inclusive para ser aceptadas, si la densidad no está comprendida en el rango especificado se considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras de pintura y la primer letra del color que corresponde. Se solicita calcular e imprimir: a) La cantidad de muestras de pintura rechazadas. b) El promedio de densidad de las muestras aptas para la aplicación. c) La cantidad de muestras de color blanco que sean aptas.

Problema 4 Realizar un algoritmo que permita leer un valor R y un conjunto de N números reales (máximo 100), y que calcule y escriba: a) La cantidad de valores mayores que el primero ingresado. b) El promedio de los valores positivos menores que R. c) El porcentaje de valores positivos pares.

Problema 5 Una fábrica de botellas requiere que el espesor del vidrio de sus productos esté comprendido en el rango de 1,1 y 1,5mm. Leer como máximo 1000 valores de espesor o terminar la lectura si el valor ingresado es negativo. Calcular e imprimir: a) La cantidad de botellas que no cumplen la especificación. b) El promedio de espesor de las botellas que cumplen la especificación. c) Mostrar el mayor espesor de los productos ingresados.

#include <stdio.h> int main( )

int cont=0, cont_rechaz=1; float prom, espesor, suma=0, max_espesor=-1; printf("\nIngrese el espesor: ");

Page 5: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas sin Funciones

5

scanf("%f", &espesor); while( (espesor >= 0) && (cont<9) ) /*Solo se ing resan hasta 9 datos*/

cont++; if( (espesor<1.1) || (espesor>1.5) )

suma += espesor; cont_rechaz++; if( espesor > max_espesor ) max_espesor = espesor;

printf( "\nIngrese el espesor:" ); scanf( "%f", &espesor );

if( cont > 0 )

printf("Botellas que no cumplen especificacion es: %d\n", cont_rechaz); if( cont_rechaz > 0 )

prom=(float)suma / cont_rechaz; else prom=0;

printf("El promedio de las botellas rechazadas es: %f\n ", prom); printf("El mayor espesor de las rechazadas es: %f\ n", max_espesor); else

printf("No se ingresaron valores para poder procesa r\n"); return 0;

d) Hacer un análisis del funcionamiento del algoritmo mediante un conjunto de datos de prueba, completando los valores de la tabla, tal como el ejemplo modelo .

espesor cont max_espesor suma cont_rechaz prom 1 2 3 4 5 6

-1.00

Problema 6 Se debe realizar un algoritmo que permita ingresar datos que representan el largo y el diámetro

de barrotes de acero. El ingreso de información termina cuando se leen 250 barrotes o cuando el largo o el diámetro ingresado es negativo. Se pide: a) Determinar y mostrar el máximo valor del largo ingresado. b) Mostrar el mensaje “Barrote aceptado” cuando el diámetro este entre 10 y 11 y su largo entre

110 y 115, en caso contrario el mensaje “Barrote rechazado”. c) Mostrar el promedio de los diámetros de los barrotes considerados buenos.

Problema 7 Ingresar un conjunto de N números, donde N sea impar. Si N es par no se debe permitir la carga de datos hasta que se ingrese N impar. Determinar y mostrar: a) La cantidad de datos impares comprendidos entre –10 y 10. b) Mostrar los datos pares que sean distintos de 2 y 4.

Page 6: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas sin Funciones

6

Problema 8 En un censo de pacientes se debe realizar el siguiente procesamiento de la información. Por cada paciente se debe ingresar su edad y su peso. La lectura finaliza cuando se introduzca un peso negativo o cuando la cantidad de pacientes supere los 400. Calcular y mostrar: a) La cantidad de pacientes cuya edad este comprendida entre 7 y 11 años inclusive. b) De los pacientes que verifican el punto a) calcular el porcentaje sobre este rango de aquellos

que su peso supera los 50kg. c) El paciente con menos peso y su edad.

Problema 9 Leer un conjunto de números enteros hasta que la cantidad de datos supere los 300 o el último dígito del dato ingresado sea cero. Calcular y mostrar: a) El promedio de los datos pares de orden par. b) El porcentaje de elementos múltiplos de 3 de los primeros 40 datos siempre que sea posible.

Problema 10 En un censo de pacientes se debe realizar el siguiente procesamiento de información. Por cada paciente, se debe ingresar su edad y su altura. La lectura finaliza cuando se introduzca una altura inferior a 1,20 metros o cuando la cantidad de pacientes supere los 200. Calcular y mostrar: a) El promedio de edad de aquellos pacientes cuya altura esté comprendida entre 1,50 y 1,75

metros inclusive. b) El porcentaje de pacientes cuya altura no supere 1,60 metros y cuya edad esté comprendida en

los rangos de 10 a 15 años y de 30 a 35 años. c) El paciente con mayor altura y su edad correspondiente.

Problema 11 Leer un conjunto de números enteros (máximo 1000) hasta que se ingresen dos datos consecutivos iguales a cero. Calcular y mostrar: a) El promedio de valores positivos leídos en posición impar. b) La cantidad de datos pares ubicados entre las posiciones 10 y 32 inclusive siempre que sea

posible.

Problema 12 Una empresa que fabrica vasos desea controlar la calidad de sus productos. Para esto se toma una muestra de X vasos de la producción total. Para que un vaso se considere de buena calidad, su altura deberá estar comprendida en el rango de 10cm ± 5% y su peso superior a los 40 gramos o cuando su volumen esté comprendido en el rango 125 a 176cm3. Por cada vaso se debe ingresar la altura, peso y volumen. Calcular y mostrar: a) El porcentaje y el promedio del volumen de vasos de buena calidad. b) El promedio de altura de aquellos vasos que cumplen la condición sobre dicha altura. c) Suponiendo una producción total de 5x106 vasos, ¿Cual será la cantidad de vasos buenos a ser

comercializados?

Problema 13 Una fábrica de espirales desea controlar la calidad de sus productos. Para esto, toma una muestra de X espirales de la producción total. Un espiral se asume bueno (bien fabricado) cuando: • La cantidad de vueltas es igual a 8. • El largo es de 60cm con un error de ±1cm. • El peso es de 20gr con un error de ± 0,5gr.

Page 7: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas sin Funciones

7

Un parámetro de producción específica que si más del 20% de la muestra corresponde a elementos defectuosos, toda la muestra se considera mala o no representativa. Informar cual es la cantidad de espirales que no pasan el control de calidad y también su porcentaje, solo si la muestra es buena.

Problema 14 Una empresa de cables trenzados desea controlar la calidad de sus productos. Para ello se ha pedido un algoritmo que lea datos relevantes de la producción. El cable producido se obtiene trenzando dos cables , los que deben cumplir con las siguientes condiciones para formar un cable trenzado bueno: • Resistencia eléctrica entre extremos del rollo es de 100Ω ± 10%. • Aislamiento eléctrico mayor a 10kV. En el caso en que alguno de los cables formantes no cumpla con una sola de las especificaciones anteriores, el cable trenzado debe ser marcado como de segunda calidad. Si ambos cables formantes dejan de cumplir con alguna de las dos especificaciones, el cable debe ser marcado como malo. El ingreso de datos finaliza cuando se ingresa un valor de resistencia nulo. Mostrar: a) Cantidad de cables analizados. b) Porcentaje de cables de primera y segunda calidad. c) Promedio de la resistencia de los cables de la producción total.

Problema 15 Una fábrica de pulloveres utiliza cierta calidad de lana para sus tejidos. La información más relevante de la calidad de cada ovillo es: • Porcentaje de poliéster. • Gramos / metros. Realizar un programa que realice la siguiente operación: a) Leer los datos de un lote de ovillos hasta que los gramos / metros sean iguales a 10 ó el

porcentaje de poliéster se encuentre comprendido entre 50 y 60. b) Calcular y mostrar el promedio de gramos / metros de la muestra. c) Averiguar y mostrar el promedio de los “porcentajes de poliéster” para cada uno de las

siguientes calidades. • Primera calidad: Porcentaje de poliéster entre 0 y 10%, gramos / metros entre 45 y 50. • Segunda calidad: Porcentaje de poliéster entre el 10 y 30%, gramos/metros entre 35 y 45. • Mala calidad: cualquier otro caso.

Problema 16 Se desea procesar la información del tipo de mercadería proveniente de los camiones de una empresa que realiza entregas a domicilio. Para ello se cuenta con la siguiente información cada paquete: • Código de identificación del paquete (entero corto) • forma de entrega del paquete (carácter: ‘i’ inmediata, ‘m’ moderada, ‘c’ corriente), • peso del paquete (en gramos), • distancia que recorrió (en Km). Se pide que se ingrese información hasta que se tenga un peso negativo o la distancia sea mayor a 3000 Km. con entrega corriente. Se pide que: a) El promedio de peso de paquetes a entregar con peso mayor a 4000 gramos y que no necesiten

entregarse en forma inmediata. b) Indicar por pantalla aquellos paquetes que no recorrieron larga distancia (menor a 12Km), y con

código de identificación entre 150 y 215. c) ¿Qué forma de entrega de paquetes se realiza con mayor frecuencia Indique el porcentaje

sobre el total de paquetes entregados.

Page 8: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas sin Funciones

8

d) Cuanto se recaudó en total, sabiendo que el precio base es de $2, agregándose $0,10 por cada 3Km y $0,05 por cada 100grs de exceso al peso límite sin cargo de unos 200grs.

#include <stdio.h> int main( )

int codigo,conttotal=0,contpeso=0,contI=0,contM=0,c ontC=0; float peso, prom, porc, dist, sumapeso=0,recaud=0,a gregoKm,agregoKg; char formae; printf("Ingrese peso:\n"); scanf("%f", &peso); printf("Ingrese distancia:\n"); scanf("%f", &dist); fflush( stdin ); printf("Ingrese forma de entrega:\n"); scanf("%c", &formae); while( peso > 0 && dist < 3000 ||formae !='c' )

printf("Ingrese codigo de identificacion:\n"); scanf("%d", &codigo);

conttotal++; if( peso > 4000 && formae != 'i' ) sumapeso += peso; contpeso++;

if( dist <= 12 && codigo >= 150 && codigo <= 215 )

printf("El paquete codigo %d no es larga distancia. \n", codigo); if( formae == 'i' ) contI++; if( formae == 'm' ) contM++; if( formae == 'c' ) contC++;

agregoKm = 0.10 * (dist/3); if( peso <= 200 )

agregoKg=0; else agregoKg= (peso-200) / 100 * 0.05;

recaud += 2; // Precio fijo por paquete recaud += agregoKm; // Adicional por distancia recaud += agregoKg; // Adicional por peso printf("Ingrese peso:\n"); scanf("%f", &peso); printf("Ingrese distancia:\n"); scanf("%f", &dist); fflush( stdin ); printf("Ingrese forma de entrega:\n"); scanf("%c", &formae);

if( contpeso > 0 )

printf("Promedio de peso de paquetes a entregar: %f ", sumapeso/contpeso); else

printf("No se entregaron paquetes con la condición de peso promedio."); if( contI >= contM && contI >= contC )

Page 9: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas sin Funciones

9

printf("El destino inmediato se hace con un porcent aje de: %f", (float)contI/conttotal*100);

if( contM > contI && contM >= contC ) printf("El destino inmediato se hace con mas frecue ncia en: %f", (float)contM/conttotal*100);

if( contC > contM && contC >= contI ) printf("El destino inmediato se hace con mas frecue ncia en un porcentaje de: %f", (float)contC/conttotal*100);

printf("Se recaudo en total: %f\n", recaud); return 0;

e) Hacer un análisis del funcionamiento del algoritmo mediante un conjunto de datos de prueba , completando en una tabla los valores de las variables más significantes del algoritmo, tal como el ejemplo modelo.

Problema 17 Se desea procesar la información de los pasajeros que viajan en un tren urbano. El tren hace varias paradas. Para ello se debe ingresar el código de viaje que tiene los siguientes valores por sección: 1 corta distancia, 2 distancia media y 3 larga distancia. También se debe ingresar la edad del pasajero y la hora reloj de ingreso al tren (hora y minutos). El ingreso de datos finaliza cuando se entran al tren dos menores de edad (menores de 12 años) ó cuando se ingresa un código no válido. Se pide: a) Cuántos pasajeros viajaron por cada código de viaje? b) Cuál es la recaudación total, sabiendo que el precio base por pasaje de un mayor es de 1$ para

corta distancia y para las otras distancia se debe duplicar y triplicar respectivamente el precio base? Los menores de edad pagan la mitad de precio de ese pasaje.

c) Si se ingresa por teclado una hora de referencia, indicar cuantos pasajeros llevan viajando más de 45 minutos.

NOTA: En todos los problemas hacer un análisis del funci onamiento del algoritmo mediante un conjunto de datos de prueba, completando en una tabla los valores de las variables más significativas del algoritmo, tal como el ejemplo m odelo.

Page 10: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

COMPUTACION II INFORMATICA II

Ingeniería Electrónica y Bioingeniería

Guía de Práctica Nº 2 Problemas resueltos y propuestos

con funciones, arreglos, matrices y Strings

Departamento de Electrónica y Automática Facultad de Ingeniería

Universidad Nacional de San Juan

Page 11: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

11

Problemas con Funciones, Arreglos y Strings.

Ejemplos sencillos con funciones Problema 18 Ingresar tres valores reales en forma reiterada. Calcular el promedio y el producto para cada terna. Mostrar los resultados y finalizar si los valores de una terna son iguales. #include <stdio.h> #include <stdlib.h> /* DECLARACION DE FUNCIONES */ int iguales(float a, float b, float c); float lee_dato(void); float cal_prom(float a, float b, float c); float cal_prod(float a, float b, float c); void mostrar (float prom, float prod); int main( ) float n1,n2,n3,n4,promedio,producto; /* Declaració n de variables */

do n1 = lee_dato(); /* Invocacion de funciones */ n2 = lee_dato(); n3 = lee_dato(); promedio = cal_prom( n1, n2, n3 ); producto = cal_prod( n1, n2, n3 ); mostrar( promedio, producto ); while(iguales (n1,n2,n3)); /* Si son iguales d evuelve 0 */

return 0; /* Definicion de funciones */ float lee_dato( void )

float dato; printf("INGRESE DATO:"); scanf("%f", &dato); return dato;

float cal_prom( float a, float b, float c )

float p; p = a + b + c / 3; return p;

float cal_prod( float a, float b, float c )

return a * b * c; void mostrar( float prom, float prod)

printf( "El promedio es: %f\n", prom); printf( "El producto es: %f\n", prod);

int sonIguales(float a, float b, float c )

return ( a == b && a == c ) ? 0 : 1;

Page 12: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

12

Problema 19 Ingresar pares de valores x e y. El proceso de carga finaliza cuando la diferencia entre ambos valores sea impar y divisible por 7. Para cada par de valores (x,y) se pide: a) Si el valor y es mayor que x, mostrar los valores intermedios. b) Si el valor y es mayor que 0 calcular, mediante productos sucesivos, el valor de X elevado a la Y y mostrarlo en la función main. c) Calcular el promedio de los valores x para los x > 0. d) El porcentaje de pares con por lo menos un componente = 0. #include <stdio.h> void muestra( int a, int b ); /* DECLARACION DE FU NCIONES */ int potencia( int a, int b ); int main( )

float prom,porc; int x,y,cont_t,cont_0,poten, cont_x,sum; cont_t = cont_0= cont_x = sum =0; printf(" Ingrese los Valores de x e Y \n\n"); scanf("%d",&x ); scanf("%d",&y ); while( (x-y)%2 == 0 || (x-y)%7 != 0 )

cont_t++; if(y > x)

muestra(x,y); /* Invocación a la función */

if(y >0) printf ("La potencia es: %d\n", potencia(x,y));

else printf ("No se calcula la potencia\n");

if(x > 0)

sum + = x; cont_x++;

if( (x && y) == 0 )

cont_0++;

printf(" Ingrese los Valores de x e Y \n\n"); scanf("%d",&x ); scanf("%d",&y );

/* Fin del while */ prom = cont_x ? sum/cont_x : 0; printf("\n\n El promedio de los x > 0 es: %f", prom ); porc = cont_t ? cont_0/cont_t*100 : 0; printf("El porcentaje de pares con x ¢ y = 0 es:%f\ n",porc); return 0;

void muestra( int a, int b )

int i;

Page 13: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

13

for( i=a+1; i < b ; ++I ) printf ( "\t%d", i );

int potencia( int a,int b )

int i, pot =1; for ( i =1 ; i<=b ; ++i)

pot *=a; return pot;

Funciones Que Generan Secuencias De Números Pseudoa leatorios En las bibliotecas del lenguaje C se dispone de funciones que le permiten al usuario poder generar secuencias de números aleatorias, estas son útiles para diversas aplicaciones, desde poder realizar programas sencillos de juegos como los que se desarrollan aquí, como para utilizarlas como herramienta que permita cargar arreglos con datos sin necesidad de hacerlo por teclado, entre otras de las aplicaciones posibles.

Función rand ()

int rand(void) se debe incluir <stdlib.h>

Esta función retorna un valor entero entre 0 y 32767, se la identifica como generadora de números aleatorios, en verdad lo que es aleatorio es la secuencia en que aparecen los números.

Función srand ()

int srand(unsigned int) se debe incluir <stdlib.h>

Esta función establece un punto de arranque para la función rand(). Ese punto de arranque se le denomina semilla y es el argumento que recibe la función.

Ejemplos de Programas en C que utilizan estas funci ones Los siguientes programas de ejemplo muestran la utilización de las Funciones RAND().

Problema 20 El programa simula la tirada de una moneda una cierta cantidad de veces especificada por el operador. Calcular y mostrar la cantidad de veces que sale Cara y Ceca, y sus porcentajes correspondientes. #include <stdio.h> #include <conio.h> #include <stdlib.h> int main( )

int moneda; long int i, contC=0, contS=0; /*Contador de Caras y Secas*/ long int CantT; /*Cantidad de Tiradas*/ printf("Ingresa Cantidad de Tiradas de la Moneda:") ; scanf("%ld",&CantT); fflush(stdin); /* Limpia el Buffer de Teclado * / for(i=0;i<CantT;i++)

moneda = rand()%2;

Page 14: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

14

(moneda == 0)? contC++ : contS++; printf("Cantidad de Caras y Secas para %ld Tiradas\ n\n",CantT); printf("Caras: %ld\t\tSecas: %ld\n",contC,contS); printf("Porcentaje Caras: %f\t\tPorcentaje Secas: % f\n", (contC*100.)/CantT, (contS*100.)/CantT); return 0;

NOTA: Cada vez que se ejecuta este programa, se puede observar que siempre se muestran los mismos resultados. Para ello es necesario cambiar la semilla de generación a través de la función srand().

Problema 21 El programa simula la tirada de un dado una cierta cantidad de veces especificada por el operador. Entrega como resultado el número de veces de que sale cada Cara y sus porcentajes sobre el total. En este caso se agrega la función srand(), que permite cambiar la semilla de generación de los números aleatorios. Se toma como semilla la hora del sistema mediante la función time() incluida en la biblioteca time.h

#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> int main() int dado; long int i, cont1=0, cont2=0, cont3=0, cont4=0, co nt5=0, cont6=0; long int CantT; /*Cantidad de Tiradas*/ printf("Ingresa Cantidad de Tiradas del dado: "); scanf("%ld",&CantT); fflush(stdin); /* Limpia el Buffer de Teclado */ for(i=0;i<CantT;i++) srand(time(NULL)); dado = 1 + rand()%6; switch(dado) case 1: cont1++; break; case 2: cont2++; break; case 3: cont3++; break; case 4: cont4++; break; case 5: cont5++; break; case 6: cont6++; break;

Page 15: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

15

printf("Cantidad de Tiradas del dado: %ld\n\n",Can tT); printf("Cara1: %ld\t\tCara2: %ld\n",cont1,cont2);

printf("Porcentaje Cara1: %5.2f\tPorcentaje Cara2:% 5.2f\n\n", (cont1*100.)/CantT, (cont2*100.)/CantT);

printf("Cara3: %ld\t\tCara4: %ld\n",cont3,cont4); printf("Porcentaje Cara3: %5.2f\tPorcentaje Cara4:% 5.2f\n\n", (cont3*100.)/CantT,(cont4*100.)/CantT);

printf("Cara5: %ld\t\tCara6: %ld\n",cont5,cont6); printf("Porcentaje Cara5: %5.2f\tPorcentaje Cara6: %5.2f\n\n", (cont5*100.)/CantT,(cont6*100.)/CantT); return 0;

Problema 22 El programa simula la extracción de cartas de una baraja una cierta cantidad de veces especificada por el operador. Este programa cuenta el palo de cada carta y entrega por resultado el número de veces y el porcentaje de cada uno de ellos. #include <stdio.h> #include <conio.h> #include <stdlib.h> int main() long int c1,c2,c3,c4,n,i; int valor; c1=c2=c3=c4=0L; printf("Simulación de una Baraja de Naipes \n"); printf("Ingrese la cantidad de Cartas a Extraer: " ); scanf("%ld",&n); printf("Carta (Palo)\nOro\tCopa\tBasto\tEspada\n\n "); for(i=0L; i<n; i++) valor = rand()%40; if(valor>=0 && valor < 10) c1++; else if(valor>=10 && valor < 20) c2++; else if(valor>=20 && valor < 30) c3++; else c4++; printf( "%ld\t%ld\t%ld\t%ld\n", c1, c2, c3, c4 ); printf("%4.2f\t%4.2f\t%4.2f\t%4.2f valores porcent uales\n", ((float)c1)/n,((float)c2)/n,((float)c3)/n,((float )c4)/n); return 0;

Problema 23 Programa que simula un juego de dados llamado Craps : Se juega con dos dados y se gana o se pierde según lo siguiente: Hay dos formas de ganar: a- Se lanzan los dados y en el 1º tiro se obtiene 7 u 11. b- Se lanzan los dados: en el 1º tiro se obtiene 4, 5, 6, 8, 9 ó 10 y se repite su valor en otro tiro posterior, a menos que antes aparezca un 7.

Page 16: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

16

#include <stdio.h> #include <stdlib.h> /* Función tirada simula el lanzamiento de 2 dados */ /* Retorna el puntaje obtenido */ int tirada(void)

int d1,d2; d1 = 1 + rand()%6; d2 = 1 + rand()%6; return (d1+d2);

/* Función juego simula una jugada invoca a la func ión tirada */ /* Tantas veces como se requiera para ganar o perde r. */ void juego(void)

int puntos1, puntos2; printf("Lanza los dados presione enter \n\n" ); getchar(); puntos1 = tirada(); printf("\nPrimer tiro %2d \n\n ", puntos1); switch(puntos1)

case 7: case 11:

printf("Felicitaciones gano \n\n"); break;

case 2: case 3: case 12:

printf("Pierde en el primer tiro lo siento \n\n" ); break;

case 4: case 5: case 6: case 8: case 9: case 10: /* debe volver a tirar */

do printf("\n\nPresione enter para lanzar los dados nuevamente\n\n" ); system("pause"); puntos2 = tirada(); printf("\n\nEl valor obtenido en este tiro es: %2d" , puntos2);

while((puntos2 != puntos1) && (puntos2 != 7)); if(puntos2 != 7)

printf("\n\nGANO\n"); else

printf("\n\nPERDIO\n"); break;

/*Cierra el switch */ /* Cierra la función */ int main()

char c='s'; printf(" Comienza el juego \n\n "); while(toupper(c) != 'N')

juego();

Page 17: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

17

printf ("\n\n Desea jugar de nuevo? S/N\n"); c=getchar();

return 0; /* Fin del main */

Problemas resueltos con Matrices y Vectores.

Problema 24 Generar la matriz: [01][02][03][04] [05][06][07][00] [08][09][00][00] [10][00][00][00] #include <stdio.h> #include <stdlib.h> /* Declaración de funciones */ void llenar(int M[][20], int d); void mostrar(int M[][20], int d); int main(int argc, char *argv[])

int d; int M[20][20]; printf("Ingrese dimension: "); scanf("%d",&d); llenar(M, d); mostrar(M, d); return 0;

void llenar(int M[][20], int d)

int i,j,cont=1; for (i=0;i<=d;i++)

for (j=0;j<=d;j++) /* Para llenar los elementos de una matriz por enci ma de la diagonal se debe tener en cuenta que la suma de los índices i,j correspondie nte a la posición de cada elemento no debe superar el valor de la dimensión d */

/*Elementos por encima de diagonal de la Matriz*/ if ((i+j)<=d) /*Cada elem M[i][j] se llena en forma consecutiva*/

M[i][j]=cont; cont++;

else M[i][j]=0; /*Se llenan con ceros*/

void mostrar(int M[][20], int d)

int i, j; for (i=0;i<=d;i++)

printf("\n"); for (int j=0;j<=d;j++)

printf ("[%d] ",M[i][j]);

Page 18: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

18

Problema 25 Generación de una Matriz cuadrada mediante el uso funciones de producción de números aleatorios. Código: #include <stdio.h> #include <stdlib.h> #include <time.h> /* Declaración de funciones */ void llenar (int M[][20], int d); void mostrar (int M[][20], int d); int main( ) int d; int M[20][20]; printf("Ingrese dimension: "); scanf("%d",&d); llenar(M, d); mostrar(M, d); printf("\n"); return 0; void llenar(int M[][20], int d)

int i,j,mod,signo,elem; srand(time(NULL)); for (i=0;i<=d;i++)

for (j=0;j<=d;j++) /*Tengo un 1 o 0*/ mod=rand()%2; /*obtengo un signo + o signo - */ signo = (mod == 1) ? -1 : 1; /*Una matriz con culaquier número desde -9 a 9*/ M[i][j]=(rand()%10)*signo;

void mostrar(int M[][20], int d)

int i, j; for (i=0;i<=d;i++)

printf("\n"); for (j=0;j<=d;j++)

printf ("[%d] ",M[i][j]);

Problema 26 Dadas dos matrices de diferentes tamaños R y S mostrar los elementos comunes de R en S. #include <stdio.h> #include <stdlib.h> void llenar(int M[][20], int f, int c); void mostrar(int M[][20], int f, int c); void comunes(int R[][20], int fr, int cr, int S[][2 0], int fs, int cs); int main(int argc, char *argv[])

int R[20][20], S[20][20];

Page 19: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

19

int fr, cr, fs, cs; printf("Inserte cantidad de filas de R:"); scanf("%d",&fr); printf("Inserte cantidad de columnas de R:"); scanf("%d",&cr); printf("Inserte cantidad de filas de S:"); scanf("%d",&fs); printf("Inserte cantidad de columnas de S:"); scanf("%d",&cs); printf("LLENANDO MATRIZ R:\n"); llenar(R, fr, cr); printf("LLENANDO MATRIZ S:\n"); llenar(S, fs, cs); printf("LA MATRIZ R:"); mostrar(R, fr, cr); printf("LA MATRIZ S:"); mostrar(S, fs, cs); comunes(R, fr, cr, S, fs, cs); return 0;

void llenar(int M[][20], int f, int c)

int i,j; for(i = 0 ; i < f ; i++)

for(j = 0 ; j <= c ; j++) printf ("Inserte pos[%d][%d]:",i,j); scanf("%d",&M[i][j]);

void mostrar(int M[20][20], int f, int c)

int i,j; for(i = 0 ; i < f ; i++)

printf("\n"); for(j = 0 ; j < c ; j++)

printf ("[%d]",M[i][j]);

void comunes(int R[][20], int fr, int cr, int S[][2 0], int fs, int cs)

int i,j,k,l; printf("\n\nLos elementos comunes de R en S son: ") ; /*Se utiliza un lazo cuádruple para comparar elemento a elemento de cada matriz*/ for(i = 0 ; i < fr ; i++)

for(j = 0 ; j < cr ; j++) for(k = 0 ; k < fs ; k++)

for(l = 0 ; l < cs ; l++) /*Se compara elemento a elemento de cada Matriz*/ if(R [i] [j] == S [k] [l]) /*Si se encuentra, se muestra por pantalla*/

Page 20: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

20

printf ("[%d]",R [i] [j]);

Problema 27 Intercambiar los datos de la primera columna con los de la última columna. #include <stdio.h> #include <stdlib.h> /* Declaración de las funciones */ void llenar(int [][20], int , int ); void mostrar(int [][20], int , int ); void intercambiar(int [][20], int , int ); int main(int argc, char *argv[])

int M [20] [20]; int f, c; printf("Inserte filas de la matris: "); scanf("%d",&f); printf("Inserte columnas de la matris: "); scanf("%d",&c); printf("LLENANDO MATRIZ:\n"); llenar(M, f, c); printf("LA MATRIZ ORIGINAL:\n"); mostrar(M, f, c); printf("LA MATRIZ INTERCAMBIADA:\n"); intercambiar (M, f, c); mostrar(M, f, c); return 0;

/* Definicion de funciones */ void llenar(int M[][20], int f, int c)

int i,j; for (i = 0 ; i < f ; i++)

for (j = 0 ; j < c ; j++) printf ("Inserte pos:[%d][%d]:",i,j); scanf("%d",&M[i][j]);

void mostrar(int M[][20], int f, int c)

int i,j; for (i = 0 ; i < f ; i++)

printf("\n"); for (j = 0 ; j < c ; j++)

printf ("[%d]",M[i][j]);

Page 21: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

21

void intercambiar(int M[][20], int f, int c)

int i,aux; /*Se hace el intercambio, mediante una variable aux iliar de tranferencia*/ for (i = 0 ; i < f ; i++)

aux = M[i][0]; M[i][0] = M[i][c-1]; M[i][c-1] = aux;

Problema 28 Hallar la fila y la columna de un número cualquiera "e", que debe ser ingresado por teclado. #include <stdio.h> #include <stdlib.h> /* Declaración de funciones */ void llenarMatriz (int [][20], int , int ); void mostrarMatriz (int [][20], int , int ); void busqueda (int [][20], int , int , int ); int main(int argc, char *argv[])

int M [20] [20]; int f, c, numero; printf("\nInserte cantidad de filas de la matriz: " ); scanf("%d",&f); printf("\nInserte cantidad de columnas de la matriz : "); scanf("%d",&c); printf("\nLLENANDO MATRIZ: \n"); llenarMatriz(M, f, c); printf("\nLA MATRIZ Z: "); mostrarMatriz(M, f, c); printf("\n\nInserte un numero: "); scanf("%d",&numero); busqueda(M, f, c, numero); return 0;

void llenarMatriz(int M[][20], int f, int c)

int i,j; for (i = 0 ; i < f ; i++)

for (j = 0 ; j < c ; j++) printf ("Inserte pos[%d][%d]:", i, j); scanf("%d",&M[i][j]);

void mostrarMatriz(int M[][20], int f, int c) int i,j;

for (i = 0 ; i < f ; i++) printf ("\n"); for (j = 0 ; j < c ; j++)

printf ("[%d]",M[i][j] );

Page 22: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

22

void busqueda(int M[][20], int f, int c, int e) int i, j, bn = 0; for(i = 0 ; i <= f ; i++)

for(j = 0 ; j <= c ; j++) if(M[i][j] == e)

printf("\nEl numero: %d se encuentra en la posicion : [%d][%d] de la matriz", e, i, j); bn = 1;

if(bn == 0)

printf("\nNo se encontro el numero %d en la matriz. ",e);

Problema 29 Realizar un producto entre una Matriz cuadrada de dimensión d con un vector columna que tenga la misma dimensión. #include <stdio.h> #include <stdlib.h> void llenar(int M[][20],int V[], int d); void mostrar(int Res[], int d); void producto(int M[][20],int V[],int Res [],int d) ; void ver_esquema(int M[][20],int V[], int d); int main(int argc, char *argv[])

int M [20] [20], V[20],Res[20]; int d; printf("Inserte dimen. de la matriz cuadrada y del vector: "); scanf("%d",&d); llenar(M,V, d); /* Ingreso de datos de Matriz y ve ctor */ ver_esquema(M,V, d); /* Muestra esquemáticamente an tes del producto */ producto(M,V,Res,d); printf("\n\n RESULTADO PRODUCTO ENTRE MATRIZ Y VECT OR: "); mostrar(Res, d); return 0;

void llenar(int M[][20],int V[], int d)

int i,j; printf ("Ingrese Matriz\n"); for( i = 0 ; i < d ; i++)

for(j = 0 ; j < d ; j++) printf("Inserte pos[%d][%d]: ", i, j); scanf("%d",&M[i][j]);

printf("Ingrese Vector\n"); for( i = 0 ; i < d ; i++)

printf("Inserte pos[%d]: ",i); scanf("%d",&V[i]);

void mostrar(int Res[], int d)

Page 23: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

23

int i; for( i = 0 ; i < d ; i++)

printf("\n"); printf("[%d]",Res[i]);

void producto(int M[][20],int V[],int Res [],int d) /*Para hacer el producto cada componente i nueva de l vector resultante se obtiene de sumar los productos de los elemento de una misma f ila por el elemento orrespondiente de cada vector */

int aux,i,j,sum=0; for( i = 0 ; i < d ; i++)

/*Se acumula en sum el producto de los elemento de la fila de la matriz y del vector */ for(j = 0 ; j < d ; j++)

sum+=M[i][j]*V[j]; /*Se transfiere el resultado de la suma de productos al elemento del vector Res[i]*/ Res[i]=sum; sum=0;

void ver_esquema(int M[][20],int V[], int d)

int i,j; printf("\nEl producto queda:\n"); for( i = 0 ; i < d ; i++)

printf("\n"); for( j = 0 ; j < d ; j++)

printf("[%d]",M[i][j]); printf("\t[%d]",V[i]);

Problema resueltos con Strings.

Problema 30 Se ingresan 100 letras, una a una, con ellas formar una cadena con todas las menores o anteriores que el primer carácter ingresado. #include <stdio.h> int esletra(char); /* Declaración de la función * / int main()

char letras[100], primero, let; int i,j=0; do

printf("Ingrese primera letra:"); primero = getchar(); fflush(stdin); /* Limpia el Buffer de Teclado */

while(0==(esletra(primero))); /* valida la prime r letra */

Page 24: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

24

for(i=1; i<5; i++) do

printf("Ingrese letra siguiente:"); let = getchar(); fflush(stdin); /* Limpia el Buffer de Teclado */

/* valida la letra para que sea considerada */ while(0==(esletra(let))); if(let<primero)

letras[j]=let; j++;

/*si cumple la condición va al arreglo*/ /*cierra el for*/ printf("\n\n El arreglo resultado es:\t"); for(i=0; i<j; i++)

putchar(letras[i]); puts(""); /*deja una línea en blanco*/ /*convierte el arreglo de caracteres a string*/ letras [j] = '\0'; printf("\n\n El arreglo resultado puesta como strin g es:\t"); puts(letras); return 0;

int esletra(char letra)

return((letra>='a')&&(letra<='z') || (letra>='A')&& (letra<='Z')) ? 1 : 0;

Problema 31 Desarrollar un programa que dada la fecha anterior al año 2000, como un numero de 6 cifras, ordenado en días, mes y año (de dos en dos) y la escriba en forma literal. #include <stdio.h> #include <string.h> int main()

char mes[12]; int a,m,d; long int fecha; printf("\n Ingrese fecha en formato 6 dígitos ddmma a\n"); scanf("%ld",&fecha); a = 1900 + (fecha%100); m = (fecha)/100; m = m%100; d = (fecha)/10000; switch (m)

case 1: strcpy(mes,"Enero"); break; case 2: strcpy(mes,"Febrero"); break; case 3: strcpy(mes,"Marzo"); break; case 4: strcpy(mes,"Abril"); break; case 5: strcpy(mes,"Mayo"); break; case 6: strcpy(mes,"Junio"); break; case 7: strcpy(mes,"Julio"); break; case 8: strcpy(mes,"Agosto"); break;

Page 25: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

25

case 9: strcpy(mes,"Setiembre"); break; case 10: strcpy(mes,"Octubre"); break; case 11: strcpy(mes,"Noviembre"); break; case 12: strcpy(mes,"Diciembre"); break; default: printf("\nError");

printf("\n%d de %s de %d",d,mes,a); return 0;

Problema 32 Leer un texto carácter a carácter, se finaliza cuando se ingresa un punto, validar que solo se consideren las letras, Los espacios en blanco separan las palabras. Mostrar la palabra más corta encontrada y la palabra más larga encontrada. #include <stdio.h> #include <string.h> int esletra(char); /* Declaración de función */ int main( )

/* inicializa los arreglos como strings nulos */ char letra,pall[20]="",palc[20]="",palabra[20]=""; int cont=0,cpml=0,cpmc=20; printf("\nIngrese parrafo \n"); do

letra = getche(); if(esletra(letra))

palabra[cont] = letra; ++cont;

else palabra[cont]= '\0'; /* inserta el fin de string * / if(cpml<cont)

strcpy(pall, palabra); cpml=cont;

if(cpmc>cont) strcpy(palc, palabra); cpmc=cont;

cont = 0;

while(letra != '.'); printf("\nLa palabra mas corta es: %s", palc); printf("\nLa palabra mas larga es: %s", pall); return 0;

int esletra(char letra)

return((letra>='a')&&(letra<='z') || (letra>='A')&& (letra<='Z')) ? 1 : 0;

Problema 33

Page 26: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

26

Leer un texto carácter a carácter terminado en punto. Validar que solo se consideren las letras y los espacios en blanco. Mostrar la última palabra más larga que contenga al menos tres vocales. #include <stdio.h> #include <string.h> int esletra(char); /* DECLARACIÓN DE FUNCIONES */ int esvocal(char); int main()

char letra,pall[20]=" ",palabra[20]=" "; int cont=0,cpml=0,contv=0; printf("\nIngrese parrafo \n"); do

letra = getchar(); if(esletra(letra))

palabra[cont] = letra; cont++;

if(esvocal(letra)) contv++; if((letra==' ') || (letra=='.'))

palabra[cont]= '\0'; /* pone el '/0' para que sea s tring */ if ((cpml<cont)&&(contv>2))

strcpy(pall,palabra); cont = 0; contv = 0;

while(letra != '.'); printf("\nLa palabra mas larga es: %s",pall); return 0;

int esletra(char letra)

return((letra>='a')&&(letra<='z') || (letra>='A')&& (letra<='Z')) ? 1 : 0; int esvocal(char letra)

if((letra=='a') || (letra=='e') || (letra=='i') || (letra=='o') || (letra=='u') || (letra=='A') || (letra=='E') || (letra=='I') || (letra=='O') || (letra=='U')) return 1; else return 0;

Problema 34 Se desea realizar un algoritmo para la oficina del registro automotor, utilizando el procesamiento de la información relativa a sus deudores. Para lo cual se deben ingresar los siguientes datos: Apellido (string de hasta 20 caracteres), patente del vehículo (string de 6 caracteres) y monto total de la deuda. Utilizar distintos arreglos unidimensionales y bidimensionales, correspondientes para almacenar los datos mencionados. Prever un máximo de 50. La carga de datos finaliza cuando se alcanza el máximo previsto o cuando se ingresa una patente "XXXXXX".

Page 27: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

27

Se pide calcular y mostrar: a) La cantidad de vehículos que presentan un código de patente con inicio "CDB”. b) Los nombres y el monto de la deuda de los morosos que deben más de $1.000. c) El porcentaje de morosos que deben menos de $100. d) El promedio total de deuda de aquellos que Comiencen con apellido "Ce" o "Ma". #include <stdio.h> #include <string.h> /* Declaración de funciones.*/ int Calcula_CDB( char pate[][7], int N); void Morosos(char Nombre[][20],float monto[], int N); float PorceMo(float monto[], int N); float Prome(char Nombre[][20], float monto[], int N ); /* Comienzo del Programa*/ int main( )

char Nombre[50][20]; char pate[50][7] ; float temp, monto[50], porc, prom; int i = 0, N, cantcdb ; printf("\nIngrese Patente del %i moroso\t", i+1) ; gets( pate [i] ) ; while( (strcmp(pate[i], "XXXXXX")!=0) && (i<50) )

printf("\nIngrese Apellido y Nombre del %i moroso:" , i+1); gets(Nombre[i]) ; printf("\nIngrese Monto de la deuda del %i moroso:" , i+1); scanf("%f", &temp ); monto[i]= temp; fflush(stdin); i++; printf("\nIngrese Patente del %i moroso\t", i+1 ) ; scanf("%s" , pate[i]) ; fflush(stdin);

N = i ; cantcdb = Calcula_CDB ( pate, N ); porc = PorceMo ( monto ,N ) ; prom = Prome ( Nombre, monto, N ); printf("\n La cantidad de vehículos que comienzan c on CDB es: %i\n", cantcdb); printf("\n Los Morosos que deben mas de $1000: \n ") ; Morosos( Nombre, monto , N ) ; printf("\n El porcentaje que deben menos de $100 es del %2f %\n",porc); printf("\n El promedio de deuda de Ce o Ma es de $ %2f\n",prom);

printf("\nPresione cualquier tecla para finalizar") ; return 0;

/* Definición de funciones */ /* Cálculo de la cantidad de vehículos cuya patente comienza con CDB */ int Calcula_CDB(char pate[][7], int N)

int cant = 0, i;

Page 28: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

28

for( i = 0; i < N ; i++) if((pate[i][0]=='C') && (pate[i][1]=='D') && (pate[ i][2] == 'B')) cant++;

return cant;

/*Función de muestra de morosos con deuda mayor a más de $1.000*/ void Morosos(char Nombre[][20], float monto[20], in t N)

int i , j = 0 ; for(i = 0 ; i < N ; i++)

if(monto[i] >= 1000) printf ("\n El nombre del %i moroso que debe más de $1000 es: %s", j+1,Nombre[i]); printf ( "\n Su deuda es de $ %5.2f" , monto[i]) ; j++;

if(j == 0 ) printf ("No se encuentra ninguno!");

/* Función que calcula el porcentaje que deben meno s de $100 */ float PorceMo( float monto [], int N )

int i,cant=0; for(i = 0 ; i < N ; i++)

if(monto[i] < 100) cant++; return (float)cant * 100 / N;

/* Realización de función promedio de morosos cuyo apellido comiencen con Ce o Ma */ float Prome ( char Nombre[][20], float monto[], i nt N )

int cont = 0 , i ; float deuda = 0, prom; for (i = 0 ; i < N ; i++ )

if(((Nombre[i][0] == 'C') && (Nombre[i][1] == 'e')) ||((Nombre[i][0] == 'M') && (Nombre[i][1] == 'a' ) ) ) cont++ ; deuda = monto[i] + deuda;

if (cont == 0 ) prom = 0 ;

else prom = deuda / cont ; return prom;

Problema 35 Intersección de conjuntos.

#include <stdio.h> #define MAX 50 /* DECLARACION DE FUNCIONES */ void lee( int a[ ], int cant); int inter( int a[ ], int b[ ], int c[ ], int m , in t n); void muestra( int cant, int c[ ]);

Page 29: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

29

int main( )

int a[MAX], b[MAX], c[MAX]; int m, n, cant; printf("Ingrese la cantidad de elementos del conjun to a:\n"); scanf("%d", &m); printf("Ingrese la cantidad de elementos del conjun to b:\n"); scanf("%d", &n); printf("Ingrese elementos del vector a:\n"); lee(a, m); /* Invocacion a las funciones */ printf("Ingrese elementos del vector b:\n"); lee(b, n); cant = inter(a, b, c, m, n); if(cant) /* si cant != 0 */

muestra (cant, c); else printf ("INTERSECCION VACIA");

void lee( int a[], int cant)

int i; for( i=0; i < cant ; ++i)

printf( "Ingrese el elemento %d:\n", i+1); scanf("%d", &a[i]);

int inter( int a[], int b[], int c[],int m, int n)

int i, j, k = 0; for ( i = 0; i < m; ++i )

for ( j = 0; j < n ; ++j ) if (a[i] == b[j]) c[k++] = a[i];

return k ;

void muestra( int cant, int c[])

int i; printf ("\n\n El conjunto intersecccion tiene %d elementos\n\n",cant); for (i = 0 ; i < cant ; ++ i)

printf ("c[%d]=\t%d\n", i+1, c[i] );

Problema 36 Desarrollar un algoritmo que lea un arreglo que contiene n numeros enteros. Eliminar los valores repetidos. # include <stdio.h> # define MAX 50

Page 30: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

30

/* DECLARACION DE FUNCIONES */ void lee ( int a[ ], int cant); int repe( int a[ ], int b[ ], int n); void muestra ( int cant, int c[ ]); int main( )

int a[MAX], b[MAX]; int m,n; printf("Ingrese la cantidad de elementos del conjun to a \n\n"); scanf("%d", &n); printf("Ingrese elementos del vector a:\n"); lee(a,n); /* Invocacion a las funciones */ m=repe(a, b, n); printf("LOS ELEMENTOS NO REPETIDOS SON: %d\n ", m); muestra(m, b); return 0;

void lee( int a[ ],int cant)

int i; for( i=0; i < cant ; ++i)

printf( " Ingrese el elemento %d \n", i+1); scanf("%d", &a[ i ]);

void muestra( int cant, int c[ ])

int i; printf("\n\n El conjunto tiene %d elementos\n\n",ca nt); for(i = 0 ; i < cant ; ++ i)

printf ("\n b[%d] = \t %d",i+1,c[i] ); /* FUNCIÓN ELIMINA LOS REPETIDOS Y LOS GUARDA EN OT RO ARREGLO */ int repe( int a[ ], int b[ ], int n)

int i, j, k = 1, igual; b[0] = a[0]; for( i = 0; i < n; ++i )

igual = 0; for( j = 0; (j < k) && ( ! igual ) ; ++j )

if (a[i] == b[j]) igual = 1;

if ( !igual)

b[k++] = a[i];

return k;

/* EN EL MISMO ARREGLO PERDIENDO EL ORDEN */ int repe( int a[], int n)

int i, j; for( i = 0; i < n; ++i )

for ( j = i+1; j < n ; ++j ) if (a[i] == a[j])

a[j--] = a[--n]; return n;

Page 31: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

31

/* EN EL MISMO ARREGLO MANTENIENDO EL ORDEN */ int repe( int a[], int n)

int i, j,k; for( i = 0; i < n-1; ++i )

for( j = i+1; j < n ; ++j ) if(a[i] == a[j])

for(k = j; k < n-1 ; ++k) a[k] = a[k+1];

n--; j--;

return n;

Problema 37 Comparación de strings. #include <stdio.h> #include <string.h>

int compa_str(char s1[],char s2[]); int main( )

char s1[20],s2[20]; int band; printf("\nIngrese la cadena s1\n"); gets(s1); printf("\nIngrese la cadena s2\n"); scanf("%s",s2); band = compa_str (s1,s2); if(!band) printf("s1 igual a s2\n");

else if(band > 0) printf("s1 mayor a s2\n"); else printf("s1 menor a s2\n");

return 0; int compa_str(char s1[],char s2[])

int i=0, band=0; while((s1[i] == s2[i]) && (s1[i] != '\0') && (s2[i ] != '\0'))

++i; if((s1[i] !='\0') && (s2[i] !='\0'))

if(s1[i] > s2[i]) band = 1;

if(s1[i] < s2[i]) band = -1;

else if(s1[i] != '\0')

band = 1; if(s2[i]!= '\0')

band = -1; return band;

Problema 38

Page 32: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

32

Programa que lee arreglos de string y cuenta la cantidad de letras ‘E’ y ‘e’ que se encuentran en él. #include <stdio.h> #include <string.h> #define MAX 10 int lee_cad(char a[][MAX]); int busca_e(char a[][MAX],int n); int main( )

int n,cante; char a[MAX][MAX]; n = lee_cad (a); cante = busca_e (a,n); printf("La cantidad de e encontradas es: %d", cante ); return 0;

int lee_cad(char a[][MAX])

int i=0; do

printf("Ingrese una cadena de caracteres \n\n"); gets (a[i++]);

while( strcmp(a[i-1],"fin")); return i-1;

int busca_e(char a[][MAX],int n)

int i,j, cont=0; for (i =0; i <=n; ++i)

for ( j =0 ; (j< MAX) && (a[i][j] != '\0'); ++j) if( (a[i][j] =='e') || (a[i][j] == 'E') )

++cont; return cont;

Problema 39 Programa que lee arreglos de string y un carácter, y cuenta la cantidad de palabras que comienzan con el mismo. #include <stdio.h> #include <string.h> #define MAXPAL 10 #define MAX 80 /* DECLARACION DE FUNCIONES */ int lee_cad(char a[][MAX]); int busca_a(char a[][MAX], int n, char c); int main( )

int n, cant; char c, a[MAXPAL][MAX]; n = lee_cad (a); puts("Ingrese la letra a buscar \n\n"); c = getchar(); cant = busca_a(a,n,c); printf("La cantidad de palabras que empiezan con: % c es: %d",c ,cant);

Page 33: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

33

return 0; /* Función lee cadenas de caracteres hasta que una termine con la letra F */int lee_cad(char a[][MAX])

int i=0,lg; do

printf("\n Ingrese una cadena de caracteres\n\n"); gets(a[i]); lg = strlen (a[i]);

while( a[i++][lg-1] != 'F'); return i-1;

int busca_a(char a[][MAX], int n, char c)

int i,j, cont=0; for(i =0; i <=n; ++i)

for(j =0 ; (j< MAX) && (a[i][j] != '\0'); ++j) if((j == 0) || (a[i][j-1] == ' ') || (a[i][j-1] == '\t'))

if((a[i][j] == toupper(c)) || (a[i][j] == tolower(c ))) ++cont;

return cont;

Problema 40 Problema que lee una cadena de caracteres y las separa en palabras (cada palabra ocupa un string del nuevo arreglo bidimensional).

#include<stdio.h> #include<string.h> int separa(char ent[], char arre[][15]); /* Decl aración de función */ int main( )

char entrada[500],arre[100][15]; int n,i=0; printf("Ingrese la cadena de caracteres \n"); gets(entrada); n=separa(entrada,arre); printf("\n Se han ingresado: %d palabras", n); printf("\n Las palabras son:\n"); for( i=0; i< n; ++i)

puts(arre[i]); return 0;

int separa(char ent[],char arre[][15])

int cant,i,j=0,k=0; char aux[15]; cant=strlen(ent); for(i=0;i<=cant;++i)

if((ent[i]!=' ') && (ent[i]!='\0') && (ent[i]!='\t' )) aux[j] = ent[i]; j++;

else aux[j] = '\0'; j=0; strcpy(arre[k], aux); k++;

Page 34: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

34

return k;

/* fin de la función */

Problema 41 Problema que lee un arreglo de cadenas de caracteres y las separa en palabras (cada palabra ocupa un string ). #include<stdio.h> #include<string.h> int separa( char ent[][25], int c, char arre[][15] ); int main( )

char entrada[10][25], arre[100][15]; int n,i, k; printf(" Ingrese la cantidad de cadenas a procesar \n"); scanf("%d", &k); for( i=0 ; i< k ; ++i)

printf("Ingrese la cadena de caracteres %d:\n", i+1 ); gets(entrada[i]);

n=separa(entrada,k,arre); printf("Se han ingresado: %d palabras\n", n); printf("Las palabras son:\n"); for( i=0; i< n; ++i)

puts(arre[i]); return 0;

int separa(char ent[][25], int c, char arre[][15])

int cant, i, j=0, k=0 ,x; char aux[15]; for(x=0; x<c; ++x )

cant=strlen(ent[x]); for(i=0; i<=cant; ++i)

if((ent[x][i]!=' ') && (ent[x][i]!='\0') && (ent[x] [i]!='\t')) aux[j] = ent[x][i]; j++;

else aux[j] = '\0'; j=0; strcpy(arre[k], aux); k++;

return k;

/*fin de la función*/

Problemas con arreglos numéricos y caracter, cuyos datos son generados mediante el uso de la funciones de rand() y srand()

Page 35: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

35

Una clinica desea controlar aquellos pacientes que pasan por ahí. Se deben ingresar 3 datos por cada uno de ellos: el consultorio al cual ingresaron (desde a hasta g), el peso y la edad. La lectura finaliza cuando no se ingrese un consultorio no válido. No superar los 8 pacientes. Se pide en una función por item: a- Generar los arreglos de datos. b- Mostrar los arreglos de datos. c- Cual es el promedio de peso de aquellos mayores de edad que ingresaron al consultorio 'a'. #include <stdio.h> #include <stdlib.h> int genera_datos(float[], int[], char[]); void mostrar(float[], int[], char[], int); float promedio(float[], int[], char[], int); int main( )

char letra; int Ed[10],N; float Pe[10],prom; char Cons[10]; N=genera_datos(Pe, Ed, Cons); mostrar(Pe, Ed, Cons,N); /* Muestra los datos ingr esados */ prom=promedio(Pe, Ed, Cons,N); printf("El promedio es:\t%1.2f kg\n", prom); return 0;

int genera_datos(float Pe[], int Ed[], char Cons[])

char letra; int i=0,cont=0,edad,pesaux; float peso; srand(time(NULL)); // semilla /* generacion del consultorio: la letra a tiene codigo 97 y la g 103, 7 valores */ letra= rand()%7+97; /* para salir por letra erronea rand()%8+97; */ Cons[i]=letra; while(letra>='a' && letra<='g' && i<10)

/* generacion del peso */ pesaux=rand()%1000; peso=(float)pesaux/10; Pe[i]=peso; /* generacion de la edad */ edad=rand()%100; Ed[i]=edad; i++; /* generacion del consultorio: la letra a tiene codigo 97 y la g 103 (7 valores) */ letra= rand()%7+97; Cons[i]=letra;

/* fin while */ Return i-1;

/* fin funcion */

Page 36: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

36

void mostrar(float Pe[], int Ed[], char Cons[], int N) int i; for(i=0;i<=N;i++) printf("\n\n el paciente %d con edad %d peso %3.2f y con consultorio %c\n\n", i+1, Ed[i], Pe[i], Cons[i]);

/* fin funcion */ float promedio(float Pe[], int Ed[], char Cons[], i nt N)

int i, cont=0; float sum=0.0,p; for(i=0;i<=N;i++)

if(Cons[i]=='a' && Ed[i]>17) sum+=Pe[i]; cont++;

return (cont > 0) ? (float)sum/cont : 0;

Problemas propuestos utilizando Arreglos numéricos

Problema 42 Leer números enteros hasta que el número ingresado sea igual a dos (2) veces el menor valor leído hasta el momento. Calcular y mostrar el promedio de los valores positivos y el porcentaje de números leídos que se encuentran en el rango de 3 a 8 veces el menor. Utilizar arreglos.

Problema 43 Leer un arreglo A de números enteros (máximo 2000 elementos) hasta que se ingresen 2 valores impares consecutivos. Además leer un segundo arreglo B de enteros de una cantidad N de elementos que deberá ser ingresada por el operador. Se debe realizar un programa en lenguaje C que haga lo siguiente: a) Si la cantidad de elementos de A es igual a la de B, generar un nuevo arreglo C que sea la

suma de ambos. b) Si la cantidad de elementos de A es mayor a la de B, se debe calcular el promedio de los

elementos que el arreglo A tiene de más. c) Si la cantidad de elementos de A es menor a la de B, se debe calcular el porcentaje de

elementos del arreglo B que son mayores al promedio de los elementos positivos del conjunto A que están en posición par.

Problema 44 Escriba un programa en lenguaje C que permita analizar la información de la carga de granos que hacen los productores en un depósito. La información está referida al peso en Kg y tipo de grano ingresado a un depósito, como así también el código numérico que identifica cada productor. El tipo de grano tiene asignado un código en el rango de 1-10000. Cada proveedor posee un código numérico en el rango 300-500. La carga de granos finaliza cuando se ingrese un código de granos fuera de rango ó un código de proveedor también fuera de rango o un peso menor a 100 kg. No considerar este último dato ingresado. Calcular e informar: a) El promedio de peso por productor con código impar para los tipos de grano 3000, 4000 y

5000. b) El promedio total de granos ingresados por productores con código par y tipo de grano

Page 37: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

37

potencia de 10. c) El total de granos ingresados (en kg) de cualquier tipo. d) El porcentaje que representa el total de granos ingresados (en Kg) para productores con

código cuya última cifra termine con 7. e) Aquellos productores y su código de grano que poseen una cantidad producida de granos

mayor que el promedio.

Problema 45 Una empresa que comercializa productos, requiere para su control de un programa en lenguaje C, que lea los datos correspondientes a los productos de ventas que contienen la siguiente información: Código de identificación del producto (entero de 4 dígitos), la cantidad de productos con ese código (entero) y precio unitario. Almacenar en tres arreglos. Para la carga se debe requerir de la cantidad de productos que se dispone: Se pide: a) Realizar la carga de estos arreglos. b) Averiguar el promedio del monto total del stock (precio por la cantidad para cada producto). c) Para aquellos productos cuyo código este comprendido entre 2500 y 3000 averiguar el de

mayor precio que posea menor cantidad. d) Ingresar un valor correspondiente a una cantidad de stock mínima y generar un nuevo

arreglo que contenga los códigos de aquellos productos cuya cantidad sea menor que la ingresada.

Problema 46 Una empresa de turismo, ante la llegada de un contingente, tiene que organizar el traslado de los turistas desde el Aeropuerto hasta sus hoteles de estadía. Para poder organizar el traslado se debe ingresar la información de cada turista: código de turista, número de movilidad (numeradas del 1 al 10) y código de hotel (A, B, C). El ingreso finaliza cuando el número de movilidad es negativa. Calcular y escribir: a) El porcentaje de personas que van al hotel C y con código mayor al del último turista de la

lista. b) Escribir el código del hotel que tiene más turistas hospedados. c) Listar los turistas que viajan en la movilidad Nº 9 y que se hospedan en el hotel C con más

turistas, indicando el código de turista correspondiente. d) Si un turista por hospedarse en el hotel A paga $500, en el hotel B paga $700 y en el C paga

$1000, indicar el monto total a pagar por la empresa para el contingente.

Problema 47 Un curso de una escuela posee en su estructura 8 materias y 25 alumnos (usar un arreglo bidimensional), mediante un programa en C realizar las siguientes tareas: a) Cargar por cada alumno la calificación obtenida en cada materia. b) Calcular la nota promedio por alumno. c) Calcular la nota máxima y mínima en cada materia. d) Listar todos los datos relativos al curso.

Problema 48 En una estación meteorológica se desea procesar la información correspondiente a las mediciones efectuadas durante un mes, con los datos de temperatura y Humedad medias de cada uno de los N días del mes. Para lo cual se deberá realizar un algoritmo que realice las siguientes tareas:

Page 38: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

38

a) Se deberán leer los datos de temperatura y humedad relativa media, correspondientes a cada uno de los días del mes, los que deberán guardarse en dos arreglos, para lo cual el algoritmo deberá requerir la cantidad de días del mes que se desea procesar.

b) Calcular y mostrar el promedio de Temperatura del mes. c) Calcular y mostrar el porcentaje de días en que la temperatura sea mayor que el promedio

calculado en b y que la humedad relativa sea superior a 50. d) Determinar cual fue el día más caluroso del mes, teniendo en cuenta que si se tienen dos

días con igual temperatura, se considera más caluroso el que tenga mayor humedad. e) Indicar los dos días del mes en los cuales se produjo entre ellos, la máxima variación de

temperatura. f) Asumiendo que el primer día del mes, corresponde a un viernes, calcular y mostrar el

promedio de las temperaturas para cada uno de los fines de semana (Sábado y Domingo) del mes.

Se pueden utilizar las guías de Informática I para resolver problemas de tipo parcial y tipo examen con arreglos numéricos, mediante lenguaje C. También se pueden usar las funciones rand() y srand() para generar datos

Problemas propuestos con Matrices y Vectores.

Problema 49 En una matriz de dimensiones n x m, se pide mostrar por pantalla los vectores filas y columnas de la matriz que contengan algún elemento nulo, indicando también a que orden de fila y columna pertenece ese vector.

Problema 50 Dada una matriz cuadrada de dimensión n cuya diagonal principal está llena de ceros(0), como por ejemplo: [0][1][2] [3] [0][4] [5][6] [0] Se pide que se llene los elementos de su diagonal principal con los promedios de sus columnas, tal como: [4] [1] [2] [3] [3.5][4] [5] [6] [3] La dimensión de la matriz debe ser ingresada por teclado. Se exige que utilice funciones para el llenado, muestra y generación de la matriz.

Problema 51 Hallar la Transpuesta (cambiar filas por columnas) de una matriz cuadrada de dimensión n. La dimensión de la matriz debe ser ingresada por teclado. Se exige que utilice funciones para el llenado, muestra y generación de la transpuesta de la matriz. Puede usar las funciones rand() y srand(time(NULL)) para generar los datos de la matriz de entrada.

Problema 52 Generar un vector a partir de la suma de los elementos de la columna y otro vector como resultado del producto de las filas de una matriz de dimensiones n x m. Los valores de las dimensiones deberán ser ingresados por teclados. Se exige que utilice funciones para el llenado, muestra de la matriz y generación vectores.

Page 39: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

39

Puede usar las funciones rand() y srand(time(NULL)) para generar datos en los vectores

Problema 53 En una matriz de n x m, con elementos enteros desde el 1 al 100, se debe buscar los números primos que contenga la matriz. Se debe informar por pantalla la posición que se encuentre cada uno de ellos. Se exige que utilice funciones para el llenado, búsqueda y muestra de la matriz. Puede usar las funciones rand() y srand(time(NULL)) para generar los datos de la matriz de entrada.

Problema 54 Encuentre la matriz resultante de la suma de dos matrices de dimensiones n x m. Mostrar por pantalla dicho resultado. Los valores de las dimensiones deberán ser ingresados por teclados. Se exige que utilice funciones para el llenado, y generación de la suma de las matrices. Puede usar las funciones rand() y srand(time(NULL)) para generar matrices de entrada.

Problema 55 Dada una Matriz de números enteros cargada mediante teclado, se pide que se genere otra a partir de esta. Sobre nueva matriz se debe copiar aquellos elementos de la matriz original positivos o negativos cuyo valor absoluto no supere 48 y sean a la vez múltiplos de 2 y de 3. Si existe algún elemento de la matriz original que no cumpla con la condición se deberá llenar con cero (0). Se exige que utilice funciones para el llenado de la matriz original, copia y muestra de la nueva matriz.

Problema 56 Dado una vector de dimensión n x 1 y otro vector de dimensión 1 x m. Se pide que se calcule la Matriz resultante del producto de ambos vectores de dimensiones n x m, tal como se ve en el siguiente ejemplo: [1] x [3] [4] [5] = [3] [4] [5 ] [2] [6] [8] [10]

Problema 57 Ingrese por teclado en forma repetitiva matrices cuadradas de dimensión n. La dimensión n debe ser ingresada inicialmente y por única vez mediante teclado. La lectura de las matrices finaliza cuando el primer elemento de una matriz sea nulo 0. No considerar para proceso esta última matriz. a) La cantidad total de elementos negativos de todas las matrices. b) Cual es la matriz con mayor cantidad de elementos nulos. c) Genere una nueva matriz cuadrada de dimensión n, que contenga cada uno de sus

elementos el valor máximo de aquellos elementos correspondientes a todas las matrices. Ejemplo con 3 matrices ingresadas:

[1] [-1] [2] [0] [7][8] [7][8] [3] [6] [-5][1] [0][4] [3][6] Matriz 1 Matriz 2 Matriz 3 Matriz de m áximos Puede usar las funciones rand() y srand(time(NULL)) para generar los datos de la matriz de entrada.

Problema 58 Genere una matriz cuadrada de dimensión n. Los elementos de la misma deben ser enteros y creados aleatoriamente mediante la función srand(), correspondiente a la biblioteca stdlib.h. Cada elemento debe estar acotado entre los valores 0 y 25. La función srand() se utiliza para generar valores aleatorios y se encuentra definido y explicado su modo de funcionamiento en la guía de trabajos prácticos de funciones y strings. Se pide invertir los elementos que están por

Page 40: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

40

encima de la diagonal principal por los que están por debajo de la diagonal, tal como se puede ver a continuación: [1] [2] [3] [1] [4] [7] De [4] [5] [6] a [2] [5] [8] [7] [8] [9] [3] [6] [9]

Problemas propuestos utilizando Strings

Problema 59 Leer un Arreglo de N string considerar como máximo 10 y no mas de 30 caracteres cada uno. a) Calcular la cantidad de string menores al penúltimo string ingresado (orden alfabético). b) La cantidad de string que finalizan con el carácter 's'. c) El string de menor longitud y su ubicación. d) Mostrar resultados.

Problema 60 Ingresar un conjunto de strings (considerar que cada string no posee mas de 30 caracteres). La cantidad de strings a ingresar debe ser necesariamente impar y no superior a 20 strings. a) Generar un nuevo arreglo de strings que este formado por los strings del arreglo original

que comiencen con vocal. b) Determinar la cantidad de espacios en blanco existentes en el nuevo arreglo. c) Mostrar el arreglo encontrado, la cantidad de espacios en blanco y los primeros cinco

elementos del tercer string del arreglo original. Nota : se sugiere el uso de la función gets para la lectura de los strings.

Problema 61 Leer un arreglo de N strings, considerar un máximo de 25 caracteres cada uno. Calcular: a) El porcentaje de veces que se repite el string "Fluido" o “fluido” dentro del arreglo. b) La cantidad de palabras que comienzan con una letra en el rango 'c' - 'h'. c) El promedio de longitud de los strings. d) Un listado con toda la información ingresada y los resultados obtenidos.

Problema 62 Hacer un programa en C que permita leer una cadena de caracteres (máximo 100). Calcule y escriba: a) La cantidad de vocales ingresadas. b) La cantidad de espacios en blanco ingresados.

Problema 63 Dado un arreglo de M strings con un máximo de 20 caracteres, calcular: a) La cantidad de veces que se repite el string "hola" e indicar las posiciones en que se

encuentra. b) La cantidad de strings que finalizan con un numerico. c) La cantidad de palabras que comienzan con 'a'. d) Mostrar los resultados.

Problema 64 En una escuela se tiene registrado a los alumnos por los siguientes datos: • nombre (string)

Page 41: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

41

• Edad (entero) Escribir un programa en C que permita leer los datos correspondientes a un conjunto de alumnos (Nombre igual a "Fin" y edad == 0 indican el fin de la lectura). Calcule y muestre: a) La cantidad de alumnos cuya edad es superior a un determinado valor ingresado por teclado

y que su nombre empiece con las letras E ó D. b) La mayor edad de los alumnos con edades comprendidas entre 7 y 13 años. Mostrar su

nombre por panatalla

Problema 65 En una fábrica de muebles se registra el color (string) y la altura (real) de todas las mesas que allí se producen. Se requiere un programa en C que permita leer los datos de un conjunto de mesas. La lectura finaliza cuando se ingresa la palabra "ULTIMO" como color, o bien cuando el alto de la mesa sea menor o igual a cero. Calcule y escriba: a) La cantidad de mesas cuya altura es superior a un valor que se ingresara por teclado y cuyo

color sea "marrón" ó "negro". b) El color de las mesas con una altura comprendida entre 0,7 y 0,9 metros. c) Ingrese un color por teclado e indique cuáles de las mesas con ese color tienen una altura

menor a la ingresada en la última posición

Problema 66 Una biblioteca tiene sus libros catalogados según los siguientes datos: • Número de páginas (entero) • Título (string 80 caracteres como máximo) Escribir un programa en C que permita la lectura de los datos de un conjunto de libros. La lectura finaliza cuando el número de páginas es inferior a 10 y el título posea menos de 10 caracteres. Calcule y muestre: a) Listar los títulos de libros editados con número de páginas impar. Indicar la cantidad. b) Hacer un listado con los datos de los libros cuyo título comienza con 'A' o terminan en ‘t’

cuyo número de páginas sea par. c) Cuál es el porcentaje de libros que poseen mayor cantidad de palabras que el primero

Problema 67 Una empresa ha instalado una red en su planta y desea llevar el control y la administración de los recursos que este desarrollo implica. Cada computadora tiene asociados los siguientes parámetros: • Nombre de la estación de trabajo (string de 40 caracteres como máximo) • Cantidad de accesos realizados en el día (entero sin signo) Escribir un programa en C que permita leer los datos de todas las computadoras de la empresa. La lectura finaliza cuando el nombre de una estación sea "piolet" o cuando el número de accesos supere los 5000. Calcule y muestre: a) El porcentaje de las estaciones cuya cantidad de accesos sea mayor a 100. b) Hacer un listado con los datos de las estaciones cuyo nombre finalice con 'e'. c) El promedio de accesos diarios de aquellas Pc’s cuyo nombre tenga la secuencia “tla” .

Problema 68 Se necesita un programa en C capaz de realizar el ingreso de un conjunto de string. Cada string puede tener como máximo 10 caracteres. El proceso de carga finaliza cuando se ingresa el string número “10” o cuando un string comienza con un carácter numérico (de 0 a 9). Se pide: a) Determinar la cantidad de veces que se repite el primer string en el arreglo.

Page 42: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

42

b) Contar las veces que se repite la primera letra del último string.

Problema 69 Leer un string (máximo 250 caracteres) que representa un párrafo. Encontrar y mostrar: a) la cantidad de palabras que se hayan ingresado en el párrafo. b) La cantidad de artículos (“el”,” la”) que se hayan ingresado en el párrafo. c) La cantidad de caracteres numéricos ingresados. d) Todas las palabras que terminen en la sílaba “on”.

Problema 70 Leer una serie de strings, previendo un máximo de 50 strings de 80 caracteres cada uno. La lectura finaliza cuando se ingresa el string “Ultimo” o se alcanza el máximo previsto. Se solicita: a) Mostrar todos los strings que contengan caracteres numéricos ordenados alfabéticamente. b) Mostrar todos los strings que terminen en un carácter no numérico. c) Ingrese por teclado una palabra y liste aquellos strings que la poseen ¿Qué porcentaje

sobre el total de palabras de todos los strings apara la palabra ingresado por teclado? Muetre este porcentaje en el main.

Problemas propuestos utilizando Arreglos numéricos y Strings

Problema 71 En un centro asistencial se toma la información sobre los pacientes atendidos, • Nombre (string de 40 caracteres) • Edad (entero sin signo) • Diagnostico (entero) Se debe realizar un programa en C que realice las siguientes tareas, a) Indicar cual es el orden de ingreso del paciente de mayor edad. b) Mostrar la información referida a aquellos pacientes cuyo diagnostico sea 25 y su nombre

comience con alguna de las primeras 5 letras del alfabeto. c) Mostrar toda la información referida a aquellos pacientes cuyo nombre tenga mas de 10

caracteres y su edad este en el rango de 20 a 40 años. La lectura finaliza cuando se ingrese un paciente con el nombre “sano” o bien cuando su diagnostico sea 0 y su edad mayor que 100.

Problema 72 En un supermercado se toma la información sobre los clientes atendidos, • Nombre (string de 40 caracteres) • Edad (entero sin signo) • Compra (real) Se debe realizar un programa en C que realice las siguientes tareas: a) Indicar cual es el orden de ingreso del cliente con mayor compra. b) Mostrar la información referida a aquellos clientes cuya edad este en el rango 25 y 50 y su

nombre comience con letras en el rango desde la ´g` hasta la ´m´. c) Mostrar toda la información de aquellos clientes cuyo nombre tenga menos de 9 caracteres

y su compra sea superior a los 300 pesos. La lectura finaliza cuando se ingrese un cliente con el nombre “Isaac” o bien cuando su edad sea 0 y su compra negativa.

Page 43: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

43

Problema 73 Para realizar el control de las ventas en un determinado comercio se debe realizar un algoritmo que cumpla lo siguiente: Se deberá leer la información relativa a las ventas realizadas Nombre del producto, cantidad de productos vendidos y prec io unitario del producto. Se considera que cada cliente lleva un solo tipo de producto. Estos datos se deberán almacenar en tres arreglos, para los cuales se debe contemplar un máximo de 500 ventas. La lectura finaliza cuando se ingrese un nombre de producto con una cantidad impar de caracteres y que posea solamente en el medio de la cadena algún carácter numérico (no tomar esta condición en los caracteres extremos del string). Este último dato no debe ser considerado.Calcular y mostrar los resultados en los casos en que se solicite: a) Realizar la lectura de los tres arreglos. b) Calcular el promedio de ventas (precio x cantidad), mostrar el resultado en el main. c) Determinar y mostrar en el main el nombre del producto más vendido. d) Ingresar tres letras por teclado y listar los nombres de todos los productos cuyas primeras

tres letras del nombre coincidan con las ingresadas. e) Generar un arreglo que contenga los nombres de aquellos productos menos vendidos

(compra inferior a 10 $). Este nuevo arreglo deberá ser mostrado en el main.

Problema 74 Para realizar el control de las ventas de pasajes una empresa requiere de un programa realizado en lenguaje C que realice lo siguiente: para cada uno de los pasajeros se deberá requerir el Apellido y nombre , el Destino y el Monto del pasaje, los cuales deberán almacenase en tres arreglos (Seleccionar el tipo de dato apropiado para cada caso, estimando una cantidad máxima de 300 pasajes). Realizar las siguientes tareas: a) Realizar la lectura de los tres arreglos, la lectura finaliza cuando el lugar de destino sea San

Juan, o cuando el monto del pasaje sea nulo, no debiéndose superar, la cantidad máxima estimada.

b) Calcular y mostrar los datos correspondientes al pasaje mas caro. c) Determinar cual es el destino cuyo nombre esta compuesto por mas vocales, y la cantidad

de veces que se repite en el arreglo. d) Se deberá ingresar un destino y se generará un nuevo arreglo con los nombres de los

pasajeros a los que les corresponda ese destino. Mostrar el nuevo arreglo en el main. e) Se deberá ingresar las primeras letras de un apellido (1, 2, 3, las que sean) y se deberán

mostrar los datos de todos aquellos pasajeros cuyas primeras letras del apellido coincidan con las ingresadas.

Problema 75 En una agencia de empleo se lleva a cabo una lista de personas que solicitan trabajo. Para ello se debe tener en cuenta los siguientes datos por cada postulante: Apellido y Nombre (string de 24 caracteres), edad (entero corto), oficio o profesión que tiene (String de 16 caracteres) y DNI (string de 8 caracteres). Para ello se deben ingresar estos datos por teclado de aquellas personas que se inscriben, en donde la lectura finaliza hasta que se ingrese un Apellido y Nombre “Ultimo” u con oficio “No trabajo”. Se pide realizar las siguientes tareas: a) La cantidad de arquitectos que de edades comprendidas entre 45 y 55 años. b) Mostrar solo los apellidos de los postulantes a remiseros cuyo documento termine en 3 y

edad menor a 30 años. c) Obtener el Apellido y Nombre y el DNI de aquellas postulantes a secretaria que posea edad

entre 21 a 25 años.

Page 44: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

44

d) Un empresario desea contratar el Profesional de “Administración de Empresa” más joven de los disponibles, teniendo en cuenta que es aquel con menor edad y el mayor número de documento ¿Cuál es el Apellido y nombre y qué edad posee?

e) Generar un nuevo arreglo de strings, donde cada string debe tener solo el apellido y el número de documento en forma conjunta. Mostrar este arreglo en el main.

Problema 76 En una agencia de modelos publicitarias se lleva a cabo una lista con la información de las mismas. Para ello se debe tener en cuenta los siguientes datos por cada modelo: Apellido y Nombre (string de 24 caracteres), DNI (string de 8 caracteres), edad (entero corto), altura (entero sin signo) y peso (entero sin signo). Para ello se deben ingresar estos datos por teclado de aquellas modelos que se inscriben, en donde la lectura finaliza hasta que se ingrese un Apellido y Nombre “Nazarena” o con peso superior a los 70 kgs. Se pide realizar las siguientes tareas: a) Mostrar solo los nombres de las postulantes cuyo documento termine en 7 y edad menor a

30 años. b) Obtener el Apellido y Nombre junto con el DNI de aquellas postulantes cuyo factor

(peso/altura2) sea menor a 20. c) Un empresario desea contratar a la postulante más joven de las disponibles y de las de

mayor altura ¿Cuál es el Apellido y nombre? ¿Qué edad posee? d) Generar un nuevo arreglo de strings, donde cada string debe tener solo el apellido de

aquellos que coinciden con el de menor peso. Mostrar este arreglo en el main.

Problema 77 Un laboratorio de análisis clínicos lleva el control de calidad del resultado de su trabajo. Para eso cuenta con planillas que contienen la siguiente información, expresada en sus correspondientes arreglos: • Nombre y Apellido del Paciente (alfanumérico) • Fecha del Análisis (alfanumérico) (año,mes,dia) • Colesterol HDL (numérico en %) • Colesterol LDL (numérico en %) Hacer un programa en C que permita: a) Ingresar los datos de las planillas por teclado (Suponga que existe una cantidad N de datos). b) Mediante un algoritmo de búsqueda permitir encontrar aquellos pacientes que en sus

análisis, las fechas que han sido reportadas como dudosas de acuerdo a un mes del año que se debe ingresar por teclado. Mostrar por teclado el nombre del paciente cuya fecha contiene ese mes.

c) Reportar solo el apellido de aquellos pacientes cuyo colesterol HDL supera el 30% y el colesterol LDL supera el 25%.

Problema 78 Una veterinaria desea procesar la información de los animales atendidos en ese centro. Para ello se ingresa en sus correspondientes arreglos los siguientes datos por cada animal: • Especie (string de 18 caracteres). Tambien se incluye la raza (Ej: perro coli) • edad • Diagnóstico (string de 15 caracteres) • Fecha de ingreso (aaaammdd) • Fecha que se estipula como recuperado(aaaammdd)

Page 45: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Funciones, Arreglos y Strings

45

La lectura de los arreglos finaliza cuando se ingrese una especie “no existe” o cuando la fecha de recuperado es anterior a la de ingreso. Prever un máximo de 50 animales. Se pide: a) ¿Cuál es el porcentaje de gatos ingresados? b) Ingrese un diagnostico por teclado y verifique cuantos animales poseen esa enfermedad. c) ¿Cuál es el animal que tardó más días en recuperarse de los que ingresaron durante el mes

de agosto? Indique sus datos y orden de ingreso. d) ¿Cuál es el promedio de edad de perros ingresados?

Page 46: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

COMPUTACION II INFORMATICA II

Ingeniería Electrónica y Bioingeniería

Guía de Práctica Nº 3 Problemas resueltos y propuestos

con punteros, estructuras y archivos

Departamento de Electrónica y Automática Facultad de Ingeniería

Universidad Nacional de San Juan

Page 47: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

47

Problemas Resueltos Con Punteros

Problema 79 Ejemplo que muestra la declaración de variables punteros y su asignación: #include <stdio.h> int main( )

int ivar,*iptr; iptr=&ivar; /* la dirección de ivar es asignada a i ptr */ ivar=122; printf("Dirección de ivar : %p\n",&ivar); printf("Contenido de ivar : %d\n",ivar); printf("Contenido de iptr : %p\n",iptr); printf("Valor apuntado por iptr: %d\n",*iptr);

Problema 80 Paso de punteros a una función, la cual tiene como objetivo intercambiar el contenido de dos variables enteras. #include <stdio.h> /* Declaracion funcion intercambio */ void intercambio(int *px, int *py); int main ( )

int x = 3, y = 2; printf(“Antes de la función: x=%d\ty=%d\n, x, y); intercambio(&x, &y); printf(“Despues de ejecutarse la función: x=%d\ty=% d\n, x, y); return 0;

void intercambio(int *px, int *py)

int temp; temp = *px; *px = *py; *py = temp;

Problemas Resueltos Con Punteros y Arreglos Dinámic os

Problema 81 Ejemplo de un arreglo dinámico con punteros. #include <stdio.h> #include <stdlib.h> void mostrar( int *p,int n); /* Declaración de la función */ int main( )

int *p,n,i;

Page 48: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

48

printf ("ingrese cant de datos del arreglo \n"); scanf ("%d",&n); p = (int*) malloc(n* sizeof(int)); if(p==NULL)

puts( "No hay memoria \n"); exit(1); /*Fuerza la salida. Arg =1 indica error.* /

for( i = 0; i<n ; ++i) printf("ingrese el dato %d de arreglo\n", i+1); scanf("%d", p+i); /*también puede ser: scanf(“%d”,& p[i])*/

mostrar( p, n); /* Invocación a la función */ free( p ); return 0;

/* Definición de la función */ void mostrar(int *p, int n)

int i; puts("Los datos del arreglo son:\n"); for(i = 0; i<n ; ++i)

printf("%d \n",*(p + i)); /*Tambien podría ser de la forma: printf("%d \n“, p[i])); */

Problema 82 Intersección de dos conjuntos de números enteros. Cada conjunto numérico deberá ser representado por un arreglo dinámico, donde la cantidad de elementos de cada arreglo deberá ser pedido mediante teclado. El conjunto intersección deberá ser representado por otro arreglo dinámico. #include <stdio.h> #include <stdlib.h> void lee( int * a, int cant ); int inter( int *a, int *b, int * c, int m, int n ); void muestra( int cant, int *c ); int main( )

int *a, *b, *c; int m, n, cant, menor; printf("Ingrese la cantidad de elementos del conjun to a:"); scanf("%d", &m); printf("Ingrese la cantidad de elementos del conjun to b:"); scanf("%d", &n); a = (int *)malloc(m * sizeof (int)); b = (int *)malloc(m * sizeof (int)); menor= (m < n)? m : n; /*selecciona la menor cantid ad */ c = (int *)malloc (menor * sizeof (int)); printf("Ingrese elementos del vector a:\n"); lee(a,m);

Page 49: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

49

printf("Ingrese elementos del vector b:\n"); lee(b, n); cant = inter(a, b, c, m, n); if(cant)

muestra(cant, c); else printf("INTERSECCION VACIA ");

return 0; void lee(int *a, int cant)

int i; for( i=0; i < cant ; ++i)

printf( "Ingrese el elemento %d\n", i+1); scanf("%d", &a[i]); /* podria usarse a+i */

int inter(int *a, int *b, int *c, int m , int n)

int i, j, k = 0; for( i = 0; i < m; ++i )

for( j = 0; j < n ; ++j ) if(*(a+i) == *(b+j)) /* (a[i] == b[j]) */

*(c+k++) = *(a+i); /* c[k++] = a[i] */ return k;

void muestra(int cant , int c[ ])

int i; printf("La intersecccion tiene %d elementos.\n", ca nt); for(i = 0 ; i < cant ; ++ i)

printf("c[%d]=\t%d\n", i+1, c[i]);

Problema 83 Dado un polinomio de cualquier grado:

P(x)=a0 + a1.x + a2.x2 + a3.x3 + .... + an.xn

Donde los coeficientes ai y el valor de la variable x son datos reales. Se pide: a) Leer por teclado cada coeficiente del polinomio en un arreglo dinámico. Mostrar el arreglo

de coeficientes en el main. El grado del polinomio deberá ser leído por teclado. b) Determinar si el polinomio posee raíces enteras en el intervalo [-100,100]. Mostrar por

pantalla. # include <stdio.h> # include <stdlib.h> float *lee(int *p); void raices(float *f, int n); int main( )

float *pol; int i, n; pol= lee(&n); /* invoca la función en que se declar a un arreglo dinámico

donde se guardan los coeficientes del polinomio. */ /* Muestra valor del grado elegido*/ printf("El grado del polinomio es:%d\n", n);

Page 50: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

50

/* Muestra el polinomio ordenado creciente y comple to de la forma: a0+a1 x+a2 x^2+a3 x^3+....+an x^n */ printf("El polinomio ordenado creciente y completo queda:\n"); printf("%1.2f\t", pol[0]); /* termino indepe diente */ for(i=1;i<=n;i++)

printf("+ %1.2f x^%d\t", pol[i],i); /*Se invoca la función para determinar si tiene rai ces enteras*/ raices(pol, n); return 0;

• La lectura de todo el arreglo se hace en la función, en donde ahí mismo se hace la asignación dinámica de memoria y se guarda el valor de la variable cantidad de elementos o coeficientes en la dirección de memoria que se recibió desde el main.

• Para hacer asignación dinámica de memoria es necesario devolver la dirección del puntero del arreglo.

float *lee( int *A ) int i = 0, N; float *p, C; /* Se debe ingresar obligatoriamente un grado menor o igual a 10 */ do

printf("Ingrese grado del polinomo:\n"); scanf("%d",&N);

while( N<0 && N>10 ); /*Se asigna memoria*/ p = (float* ) malloc((N+1) * sizeof (float)); if( p == NULL )

printf( "Espacio de memoria insuficiente\n" ); exit( 1 );

/* Fin del proceso */ printf("Ingrese termino independiente:\n"); scanf("%f", &C); /* Se lee sobre una variable auxil iar */ fflush(stdin); *(p+i) = C; /* Se guarda valor de coeficiente en el arreglo */ for( i=1;i<=N;i++ )

printf("Ingrese coeficiente %d:\n",i); scanf("%f", &C); fflush(stdin); *(p+i) = C;

*A=N; /* Se asigna el valor del grado del polinomi o en la direccion

apuntada por A en el main */ return p; /* Se devuelve el valor del puntero que apunta al arreglo

dinámico de coeficientes */ void raices( float *p, int N )

int x, i; float potencia, y; for(x=-100;x<=100;x++) /* se recorre el valor de x desde -100 hasta 100 */

Page 51: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

51

/* Se calcula x usando un método recursivo de calcu lo y luego se verifica si es raíz del polinomio */ y=p[0]; /* se inicia la variable y con termino in dep. */ potencia=1; /* se inicia la potencia de x con el v alor */ for (i=1;i<=N;i++) /* se calcula el valor del polinomio en forma recur siva */

Potencia *= x; y += (potencia * p[i]);

if(y == 0)

printf("El valor de x=%d es raíz del polinomio:\n", x);

Problema 84 Programa ejemplo de arreglo bidimensional con un arreglo de punteros. El arreglo bidimensional se representa como un arreglo de punteros, donde cada puntero contiene la dirección de comienzo de la correspondiente fila del arreglo bidimensional. #include <stdio.h> #include <stdlib.h> #define MFIL 30 int main( ) int fila, nfilas, ncols, col; /* definición del arreglo de punteros */ int *a[MFIL];

/*Para pedir memoria => la cantidad de filas y colu mnas */

printf("Cuantas filas?\n"); scanf("%d",&nfilas); printf("\nCuantas columnas?\n") scanf("%d", &ncols); /*reserva espacio de memoria para cada fila de la matriz */ for(fila =0; fila < nfilas; ++fila) a[fila] = (int *)malloc(ncols * sizeof(int) ); /* Lee el arreglo bidimensional */ for(fila = 0; fila < nfilas; ++fila) printf ("\nIntroducir datos para la fila %2d\n", fila + 1); for (col = 0; col < ncols; ++col) printf (" x[%d][%d]= ",fila + 1, col + 1); scanf ("%d", (a[fila]+col)); /* Muestra el arreglo bidimensional leído */ printf("La matriz ingresada tiene los elementos:\n \n");

for(fila=0; fila < nfilas; ++fila) for(col = 0; col < ncols; ++col) printf("a[%d][%d]=%4d\n",fila+1,col+1 ,*(a[fila]+col));

return 0;

Page 52: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

52

Problema 85 String con arreglo de punteros. Se utiliza un arreglo de punteros para almacenar la dirección de cada uno de los string. Se lee por teclado un string y se pide memoria de acuerdo a su longitud. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSTR 100 /* Maxima cantidad de strings * / int main( )

/* arreglo de punteros cada uno apunta a un string */ char *plinea[MAXSTR]; /* puntero auxiliar, arreglo estático */ char linea[81]; /* indice, longitud string, cantidad de lineas*/ int i, lng, nlinea = 0;

printf("Ingrese las Cadenas de caracteres:\n"); printf("Para finalizar con <enter>\n"); gets(linea); lng=strlen(linea); /* se podría haber puesto dentro del while (lng =strlen(gets(linea)))>0 ; */ /* mientras no sea el string nulo y la cantidad de strings no supere el maximo*/ while(( lng > 0 ) && (nlinea < MAXSTR))

/* Pide memoria para la cadena ingresada y guarda l a direccion esa cadena en el arreglo de Punteros */ plinea[nlinea] = (char*)malloc(lng +1); if(plinea[nlinea] == NULL)

puts ( "Espacio de memoria insuficiente" ); exit(1);

/* Fin del proceso */ /* Copia la cadena en el espacio de memoria asignad o */ strcpy( plinea[nlinea], linea ); nlinea++ ; printf("Ingrese Nueva Cadena de caracteres:\n"); gets(linea); lng=strlen(linea);

/* fin del while */ /* Muestra las cadenas de caracteres */ for(i=0; i< nlinea ; ++i)

printf( " %s\n", plinea[i]);

return 0;

Problema 86 Ejemplo simple de puntero a puntero. #include <stdio.h>

int main ( )

int V= 10; /* Definición variable inicializa con 10 */ int *p1; /* Definición puntero */

Page 53: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

53

int **p2; /* Definición de puntero a puntero */ p1 = &V; p2 = &p1; **p2 = 20; /* el valor de V ahora es 20. */ printf( "el valor de v es:\t v=%d\n",V); return 0;

Problema 87 Cargar un arreglo en una función que pide memoria, la función recibe un puntero a puntero y retorna la cantidad de datos leídos. #include <stdio.h> int lee(int**p2); void muestra(int*p, int n); int main ( )

int i, n; int **p2; /* Define puntero a puntero */ n = lee( p2 ); /* pasa a la función un puntero a pu ntero p2 */ muestra( *p2, n ); return 0;

int lee(int **p2)

int i, cant; printf("Ingrese la cantidad de elementos:\n"); scanf("%d", &cant); /* Pide memoria para el puntero apuntado por p2 */ *p2 = (int*)malloc(cant * sizeof(int)); for( i=0; i < cant ; ++i)

printf ( " Ingrese el elemento %d \n", i+1); scanf ("%d", (*p2)+i);

return cant;

void muestra( int*p, int n )

int i; for (i = 0 ; i < n ; ++ i)

/* Podria ser también: printf ("\n %d",p[i] ); */ printf ("%d\n",*(p+i) );

Problemas Propuestos Con Punteros

Problema 88 Ingrese en un arreglo dinámico las notas obtenidas en los exámenes que rindió cualquier alumno. La cantidad de exámenes rendidos deberá ser ingresada por teclado. Se pide: a) Calcular el promedio de notas. Mostrar el promedio en el main. b) Generar un nuevo arreglo dinámico de notas con aquellas notas superiores al promedio

obtenido en el punto anterior. Mostrar las notas en el main.

Page 54: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

54

Problema 89 Una empresa que vende herramientas desea procesar la información de sus ventas realizadas en el mes. Por cada venta realizada, se debe ingresar en tres arreglos paralelos dinámicos, el código de herramienta de la herramienta (entero desde 101 hasta 1000), la cantidad vendida (entero) y el precio por unidad (real). Se supone una herramienta por venta. Pedir al operador que ingrese por teclado la cantidad de ventas. a) Genere un nuevo arreglo dinámico con aquellas cantidades vendidas para el código de

herramienta que más se repite. Tener en cuenta que una herramienta se puede vender más de una vez. Mostrar el nuevo arreglo en el main.

b) ¿Cuánto se recaudó en total por la venta de esa herramienta? Mostrar en el main.

Problema 90 Guardar un párrafo en un único string. El string no debe contener más de 1000 caracteres. Se pide: a) El porcentaje de palabras que comienzan con ‘c’ o con ‘e’. Mostrar en el main. b) Generar un nuevo arreglo dinámico de strings, donde cada string contenga una palabra que

comienzan con ‘c’ o con ‘e’.

NOTA: Se puede desarrollar los ejercicios de arreglos nu méricos y string de la guía anterior utilizando arreglos dinámicos.

Problemas Resueltos Con Estructuras

Problema 91 Un medico desea llevar los datos de sus pacientes para lo cual necesita de un programa en C capaz de realizar la siguiente tarea: Para cada Paciente se cuenta con la siguiente información: • Nombre (alfanumérico, 20) • Ultimo Diagnostico (alfanumérico, 20) • Edad (entero) • Localidad (alfanumérico, 10) • Dirección (alfanumérico, 25) 1. El programa debe permitir la carga de todos los datos relativos a cada uno de los pacientes

cuya cantidad se especifica al comenzar el programa (leer esta cantidad) Hacer la reserva dinámica de memoria correspondiente.

2. Listar los pacientes cuyo Ultimo Diagnostico se especifique. Este listado debe realizarse ordenado por Localidad y Dirección.

3. El promedio de Edad de los pacientes que poseen el Diagnostico del punto anterior. #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct

char nombre [30]; char ult_diag [20]; int edad; char loc[10]; char direc[25];

Page 55: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

55

FICHA; void carga(FICHA *pacientes, int n); void lista(FICHA *pacientes, int n); void ordena(FICHA *pacientes, int n); int main ( )

int n, cant; FICHA *pacientes; printf("Ingrese la cantidad de Pacientes a Procesar :\n"); scanf("%d",&n); pacientes = (FICHA *)malloc(sizeof(FICHA) * n); carga(pacientes, n); ordena(pacientes, n); lista(pacientes, n);

void carga( FICHA *pacientes, int n )

int i; printf("Carga de datos:\n"); for( i=0; i<n; ++i)

printf("Nombre del paciente:\n"); gets(pacientes[i].nombre); printf("Ultimo diagnostico del paciente:\n"); gets(pacientes[i].ult_diag); printf("Edad del paciente:\n"); scanf("%d",&pacientes[i].edad); printf("Localidad:\n"); gets((pacientes+i)->loc); printf("Direccion:\n"); gets((pacientes+i)->direc);

void ordena( FICHA *pacientes, int n)

int i,j,pos; FICHA aux; /* Ordena por localidad */ for(i = 0; i<n-1; ++i)

pos =i; for(j=i+1;j<n; ++j)

if(strcmp(pacientes[j].loc, pacientes[pos].loc) < 0 ) pos = j; aux = pacientes[i]; pacientes[i] = pacientes[pos]; pacientes[pos] = aux;

/* Ordena por direccion los de igual localidad */ for(i = 0; i<n-1; ++i)

pos =i; for(j=i+1;j<n; ++j)

if((strcmp( pacientes[j].loc,pacientes[pos].loc) == 0) && (strcmp( pacientes[j].direc,pacientes[pos].direc)< 0))

Page 56: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

56

pos = j; aux = pacientes[i]; pacientes[i] = pacientes[pos]; pacientes[pos] = aux;

void lista ( FICHA *pacientes, int n)

char diag[20]; int i,cont=0; float prom=0; printf("Ingrese el diagnostico a buscar:"); gets(diag); for(i=0;i<n;++i)

if(strcmp(diag,pacientes[i].ult_diag)==0) printf("%s\t%d\t%s\t%s\n",pacientes[i].nombre, pacientes[i].edad,pacientes[i].loc,pacientes[i].dir ec); cont++; prom += pacientes[i].edad;

if(cont)

prom = prom/cont; printf("La edad promedio de los pacientes con diagn ostico es", diag); printf("es %f",prom);

else printf("No hay pacientes con ese diagnostico \n");

Problema 92 Se debe desarrollar un programa que realice un balance de cuentas de los clientes de una empresa en un año, para ello se deben ingresar los datos de cada cliente para ese periodo. Los datos de cada cliente son: Número de orden, Nombre, cuit, los saldos correspondientes a cada uno de los trimestres y el saldo total. Se debe contemplar un máximo de 100 clientes. • Ingresar los datos de los clientes: el ingreso finaliza con nombre de cliente igual a “ultimo”. • Construir dos nuevos arreglos, donde se almacenarán los clientes con saldo positivo en uno

y en el otro los negativos, para esto arreglos se debe realizar Asignación Dinámica de Memoria.

• Mostrar, por separado, los valores de los tres arreglos. • Permitir ubicar a un cliente por nombre en el arreglo (Búsqueda Binaria). • Permitir borrar un determinado cliente ingresando el nombre. • Listar los datos de los clientes cuyo nombre comience con una determinada letra • Realizar un MENÚ para poder seleccionar la operación deseada. • Se propone poder agregar clientes, buscar clientes por número de cuit, encontrar saldos

totales, agregar un miembro para dirección y ordenar por dirección y nombre, y todas las posibilidades que se le ocurran, etc. #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 100 typedef struct

int num_ord;

Page 57: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

57

char nombre[30]; char cuit[14]; float saldo_tri[5]; /* saldo por trimestre y total */

CLIENTE; int leer_cli(CLIENTE *cli ); void mostrar(CLIENTE *, int cant ); void deu_acre(CLIENTE *cli, CLIENTE *deu, CLIENTE * acre, int cant); void orde_alf(CLIENTE *cli, int n ); int busca_bin_nom(CLIENTE *cli, int n, char *nom_ab us ); void busca_bin_let(CLIENTE *cli, int n, char let ); int borra_cli(CLIENTE *cli, int n, char *nom_abus ) ; int main( )

CLIENTE cli[100], *deu , *acre; int i, cant,cant_deu=0,pos; char nom_abus[30],let,selec; cant = leer_cli (cli); /* Cuenta los deudores para reservar memoria */ for( i=0;i< cant; ++i) if( cli[i].saldo_tri[4] < 0) cant_deu ++; system("cls"); do

printf("opcion 1 Genera deudores y acreedores\n"); printf("opcion 2 Busca un cliente por nombre\n"); printf("opcion 3 Lista deudores\n"); printf("opcion 4 lista clientes dada la 1ra letra\n "); printf("opcion 5 Borra un cliente dado el nombre\n" ); printf("opcion 6 Lista los clientes\n"); printf("opcion S salir\n"); printf("Seleccione una opcion\n"); selec = getchar(); switch( selec )

case '1': deu = (CLIENTE *)malloc(cant_deu*sizeof(CLIENTE)); acre= (CLIENTE *)malloc((cant-cant_deu) * sizeof(CLIENTE)); deu_acre(cli, deu, acre, cant); break;

case '2': printf("Ingrese el nombre a buscar\n"); gets(nom_abus); orde_alf( cli, cant ); pos = busca_bin_nom(cli, cant, nom_abus ); if(pos > cant)

printf("No se encuentra el cliente."); else mostrar((cli+pos),1);

printf("Presione enter para continuar\n"); getchar(); break;

case '3': puts("**** DEUDORES ***\n"); mostrar( deu, cant_deu ); printf("\nPresione enter para continuar\n"); getchar();

Page 58: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

58

break; case '4':

printf("Ingrese el caracter de comienzo:\n"); let = getchar(); busca_bin_let( cli, cant , let ); printf("Presione enter para continuar\n"); getchar(); break;

case '5': printf("Ingrese el nombre del cliente a borrar\n"); getchar(); gets( nom_abus ); if( borra_cli(cli, cant, nom_abus ));

cant--; printf("\nPresione enter para continuar\n"); getchar(); break;

case '6': mostrar(cli,cant); printf("\nPresione enter para continuar\n"); getchar(); break;

while(selec != 'S'); return 0;

/* definicion de funciones */ int leer_cli( CLIENTE *cli )

int j,i = 0 ; float temp; char nombre[30]; puts("Ingrese el Nombre del cliente 1:\t"); gets( nombre ); while(strcmpi(nombre, "ultimo" ))

cli[i].num_ord = i+1; strcpy( cli[i].nombre, nombre ); puts("\nIngrese el CUIT:"); gets( cli[i].cuit ); cli[i].saldo_tri[4] = 0; for( j=0; j<4 ; ++j)

printf("Ingrese saldo Trm: %d\n", j+1); scanf("%f", &temp); cli[i].saldo_tri[j] = temp; cli[i].saldo_tri[4] += temp; /* calcula saldo total */

i++; printf("Ingrese el Nombre del cliente %d:\t", i+1); gets( nombre );

return i;

void mostrar(CLIENTE *cli, int cant)

int i=0; printf ("\n\n\n Orden \t\t\t Nombre \t\t\t SaldoTot al \n\n"); for(i=0 ;i < cant; ++i)

printf (" %d ", (cli+i)->num_ord);

Page 59: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

59

printf ("\t\t %s \t\t ",(cli+i)->nombre); printf ("\t\t\t %f \n", (cli+i)->saldo_tri[4]);

void deu_acre(CLIENTE *cli, CLIENTE *deu, CLIENTE * acre, int cant)

int i, d=0, a=0; /* Separa los arreglos */ for( i=0;i< cant; ++i)

if( cli[i].saldo_tri[4] < 0) deu[d] = cli[i]; ++d;

else acre[a] = cli[i]; ++a;

void orde_alf(CLIENTE *cli, int n )

int i,j,pos; CLIENTE aux; for(i=0; i<n-1; ++i)

pos =i; for( j=i+1 ; j< n; ++j)

if( strcmp(cli[j].nombre, cli[pos].nombre) < 0) pos=j; aux = cli[i]; cli[i]=cli[pos]; cli[pos]=aux;

/* Fin funcion ordena por nombre */ int busca_bin_nom(CLIENTE *cli, int n, char *nom_ab us )

int maxi=n-1, medio=n/2, min=0; while( (min <=maxi) && (strcmp(cli[medio].nombre, n om_abus)))

if(strcmp(cli[medio].nombre,nom_abus) > 0) maxi = m edio - 1; else min = medio + 1;

medio = (min + maxi)/2; if( strcmp(cli[medio].nombre,nom_abus) != 0)

medio = n + 1; return medio;

void busca_bin_let(CLIENTE *cli, int n,char let )

int maxi=n, medio=n/2, min=0; while( (min <=maxi) && (cli[medio].nombre[0]!=let ) )

if(cli[medio].nombre[0] >let) maxi = medio ; else min = medio + 1;

medio = (min + maxi)/2; if( cli[medio].nombre[0] == let )

/* Busca el primero con esa letra */ while(cli[medio].nombre[0] == let)

medio -- ;

Page 60: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

60

medio++; /* Muestra todos los clientes que empiezan con esa letra */ while(cli[medio].nombre[0] == let)

mostrar(&cli[medio++],1); else printf("No hay clientes con esa letra");

/* funcion que elimina un cliente */ int borra_cli(CLIENTE *cli, int n,char * nom_abus )

int i,pos; orde_alf(cli,n); pos = busca_bin_nom(cli, n, nom_abus); if(pos < n)

for(i=pos;i<n-1;++i) cli[i] = cli [i+1];

else printf("No se encuentra. Imposible borrar\n"); pos =0;

return pos;

Problemas Propuestos Con Estructuras

Problema 93 Los alumnos de primer año están registrados en una base de datos en la facultad, para lo cual necesita de un programa en C capaz de realizar la siguiente tarea: Para cada alumno se cuenta con la siguiente información: • Nombre (alfanumérico, 20). • Especialidad (alfanumérico, 6). • Edad (numérico). • Numero de registro • Notas (real,7) ( debe contener las notas de seis materias y el p romedio de estas). El programa deberá permitir realizar lo siguiente: a) Cargar un arreglo dinámico de n alumnos. Utilizar reserva dinámica de memoria. b) Calcular el promedio de las seis notas de cada alumno y almacenarlo en el elemento

correspondiente de la base. c) Listar los alumnos de la base ordenados por promedio y separados por especialidad. d) Calcular la cantidad de alumnos que aprobaron Informática II (4º elemento del arreglo). Se

considera un alumno aprobado cuando su nota es superior a 6. Mostrar esta cantidad en el programa principal.

Problema 94 Dada la siguiente estructura de datos:

typedef struct char tipo[20]; float pendiente; float ordenada; float y[100];

RECTA;

Page 61: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

61

• Ingresar por teclado las coordenadas de 2 puntos: P1(X1, Y1), P2(X2, Y2). • Calcular la pendiente y la ordenada al origen de la recta que pasa por dos puntos (llenar la

estructura). • Clasificar la recta según tipo: PENDIENTE + PENDIENTE - PARALELA X PARALELA Y

Llenar la estructura. e) Calcular 100 puntos de la recta en el intervalo [0..999] tomando un paso de 10, y llenar la

estructura. f) Exteriorizar por la pantalla la estructura obtenida. g) Repetir (a-e) hasta que P1(X1=100,Y1=100).

Problema 94 Una zapatería desea llevar un control de stock de sus zapatos (como máximo 200 tipos diferentes). Las características de cada tipo de zapato son: • Precio (numérico) • Talle (numérico) • Cantidad de pares en existencia (numérico) • Talle mínimo (numérico) • Nombre del fabricante (alfanumérico) Hacer un programa en lenguaje C que permita: a) Cargar los datos de los zapatos disponibles en la zapatería, y también: b) Realizar Una búsqueda binaria por nombre del fabricante (se ingresa el nombre y se

muestran los datos Precio, Talle Mínimo de todos los tipos de zapatos que pertenezcan al fabricante pedido y que tengan pares en existencia, o un mensaje de error sí el fabricante no existe)

Problema 95 Una empresa que vende artículos de segunda mano por Internet desea realizar un programa en C que le permita llevar algunos datos estadísticos de sus ventas, para eso cuenta con la siguiente información: • Nombre del cliente (string de 20 caracteres) • Nombre de la tarjeta de crédito (string de 15 caracteres) • Numero de la tarjeta de crédito (string de 14 caracteres) • Cantidad de productos comprados (entero sin signo) • Monto total de la compra (real) • Fecha de compra (aaaammdd) • Estado del cliente (C conforme, D disconforme, S satisfecho, J cliente con juicio) Se debe realizar un programa en C que permita: a) Realizar la carga de una cantidad N de clientes mediante asignación dinámica de memoria. b) Calcular el monto total de la venta para una fecha determinada que se debe ingresar por

teclado. c) Realizar un listado ordenado por Estado del cliente y Nombre de la tarjeta de crédito. d) Calcular el monto total de la venta para cada Estado del cliente

Problema 96

Page 62: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

62

En un instituto de investigación se necesita catalogar artículos de revistas y libros para su utilización en la investigación. Para lo cual se pide ingresar dinámicamente la siguiente información para X artículos o libros: • Titulo del articulo o libro • Autores • Año de edición • Nombre de la revista o vacío si es un libro (´\0´). • Cantidad de paginas. • Editorial • Marca: ´A´ articulo, ´L´ libro Se pide: a) Mostrar dos listados ordenados alfabéticamente por titulo, uno de los artículos de las

revistas y otro para los libros. b) Calcular la cantidad y el porcentaje de artículos y lo mismo para los libros. c) Mostrar un listado de todos los libros cuya editorial se ingrese por teclado y que se hayan

editado desde 1970 hasta la fecha.

Problema 97 Una casa de ventas de autopartes desea llevar un registro computarizado de la información de sus productos. Cada producto esta caracterizado por los siguientes datos: • Código del producto (hasta 6 caracteres alfanuméricos). • Nombre del producto (hasta 30 caracteres). • Precio (real). • Stock (entero). • Proveedor (hasta 30 caracteres). Hacer un programa en C que permita: a) Cargar la totalidad de los productos (con todos sus datos). Suponer que hay un máximo de

1200 productos diferentes, pero si se ingresa “FIN” como código de producto, la carga finaliza.

b) Generar un listado (por pantalla) de todos los productos con stock inferior a 60 unidades, ordenado por proveedor.

c) Encontrar y mostrar todos los productos de un proveedor dado (que el usuario ingresa por teclado), ordenados por código de producto.

d) Calcular y mostrar el monto invertido actualmente por la empresa en los productos en stock.

Problema 98 La Coca-Cola desea que sus promotores de venta posean un sistema informático para levantar los pedidos de sus ventas. Por tal motivo necesitan un programa en C para tal propósito. La información relativa de cada Cliente debe contener: • Razón Social.(nombre de la empresa) • Fecha del pedido (string de la forma aaaa/mm/dd). • Nombre del producto (1 litro, 11/2 litro, 2 litros, etc.) • Cantidad de botellas. • Precio unitario por botella. Por la venta de cada producto se debe ingresar toda esta información. Se pide:

Page 63: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

63

a) Realizar un programa en C que ingrese los datos antes mencionados hasta que se ingrese una razón social igual a “Coca-Cola” (considerar un máximo de 100 clientes y utilizar asignación dinámica de memoria).

b) Calcular y mostrar el precio total de la venta que corresponda a los clientes que compraron producto de 2 litros .

c) Generar un listado ordenado por nombre de producto para cada cliente (un cliente debe realizar un pedido por cada tipo de producto que desee).

Problema 99 Una biblioteca desea registrar los libros que posee para obtener cierta información del conjunto. La información relevante a considerar por cada libro es: • Titulo • Editorial • Autor(es) • Numero de paginas Se pide hacer un programa en C que permita: a) Leer y almacenar los datos de todos los libros disponibles. La lectura finaliza cuando se

alcanza un total de 100 libros o cuando se ingresa un titulo de libro que sea “NADA”. b) Generar un listado por pantalla de toda la información de aquellos libros que tengan una

cantidad de paginas mayor que 120, ordenados alfabéticamente por titulo. c) Calcular el número de paginas promedio de todos los libros ingresados. d) Permitir que el usuario ingrese las tres primeras letras del titulo de un libro y generar un

listado por pantalla de toda la información de aquellos libros cuyo titulo comience con las tres primeras letras ingresadas por el usuario y cuyo numero de paginas superen él numero de paginas promedio.

Problema 100 Un vendedor de seguros de vida requiere para su trabajo un programa en C que permita leer la información de cada cliente, a saber: • Nombre completo (en formato Apellido, Nombre). • Edad. • Estado de salud actual (“Bueno”, “Regular”, “Malo”). • Monto anual de la prima. • Parentesco del beneficiario del seguro (“Esposa”, “Hijos”, “Otros”). Por cada cliente se debe ingresar toda esta información. Se pide: a) Realizar un programa en C que ingrese los datos antes mencionados hasta conseguir un

nombre igual a “FIN” (considerar un máximo de 100 clientes y utilizar asignación dinámica de memoria).

b) Calcular el monto total de la prima a pagar por cada cliente, considerando que la prima se pagará por una cantidad de años igual a los años que le resta a cada cliente para cumplir la edad de 60 años (siempre que la edad actual del cliente sea inferior a 60 años). Mostrar el nombre completo y edad.

c) Generar un listado ordenado por nombre del cliente y edad, para todos los clientes cuyo beneficiario es la “Esposa”. También mostrar la cantidad de tales clientes.

Problema 101 Se debe realizar un programa en C a cerca de un censo en una provincia de la Argentina. Para esta tarea se debe contar con la siguiente información:

Page 64: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

64

a) Nombre del Jefe de Familia. b) Cantidad de Integrantes del grupo familiar. c) El promedio de edad del grupo familiar (para calcular este dato se debe requerir al operador,

la edad de cada uno de los integrantes del grupo familiar). d) Ingreso de dinero en $ del grupo familiar. Se deben leer los datos hasta que el Nombre del Jefe de Familia sea la frase “Fin Censo” o cuando la cantidad de Integrantes del grupo familiar sea igual a cero. Se pide:

• Generar un listado por pantalla ordenado por cantidad de integrantes y por nombre del Jefe de familia, de aquellos grupos familiares cuyo promedio de edad sea mayor a 20 años.

• Se debe requerir al operador un determinado monto correspondiente al ingreso mínimo en $ del grupo familiar y generar un nuevo arreglo dinámico con aquellas familias que superan en 10% este valor ingresado. El arreglo debe contener toda la información relativa a la familia.

• Se debe hacer un listado del arreglo generado en el punto anterior.

Problema 102 Un laboratorio de análisis clínicos lleva el control de calidad del resultado de su trabajo. Para eso cuenta con planillas que contienen la siguiente información: • Nombre del Paciente (alfanumérico) • Fecha del Análisis (alfanumérico; año, mes y día) • Colesterol HDL (numérico) • Colesterol LDL (numérico) • Triglicérido (numérico) Luego de presentar las planillas a un organismo de control, se recibe un listado de 17 fechas en las cuales los resultados están fuera de los estándares proporcionados por tal organismo y se deben eliminar de la base. Hacer un programa en C que permita: a) Ingresar los datos de las planillas (Suponga que existe una cantidad N de datos) b) Mediante un algoritmo de búsqueda binaria permitir encontrar las fechas que han sido

reportadas como dudosas (un total de 17 fechas) y eliminarlas del conjunto de registros de la base (para esto se deberán ingresar todas las fechas al mismo tiempo).

El funcionamiento del programa debe ser automático en el sentido de que el usuario ingresa la totalidad de los datos y de las fechas. El programa deberá listar por pantalla la información que se considera correcta sin intervención del operador.

Problema 103 Defina un tipo de estructurado de datos llamado TRANSISTOR con la siguiente información: a) Modelo (2N2222, BC548, etc) b) Precio c) Ganancia de potencia eléctrica. d) Tipo de encapsulado (TO-92, TO-46, etc). El proceso de carga finaliza cuando se llega a un máximo de 100 transistores o cuando se ingresa un modelo “NNN”. Se pide: • Hacer el proceso de carga con asignación dinámica de memoria. • Ordenar y mostrar aquellos transistores por su ganancia, y a igual ganancia por su tipo de

encapsulado.

Page 65: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

65

• Buscar aquellos transistores que tengan una ganancia igual a la ingresada por teclado, mostrando todos los modelos correspondientes a esta ganancia y el porcentaje que representa del total.

• Encontrar el promedio de ganancias de aquellos transistores cuyo tipo de encapsulado se encuentran desde TO-32 a TO-54.

Problema 104 Los datos relevantes de un grupo de alumnos de la Facultad de Ingeniería son: • Nombre. • Registro. • Código de especialidad. • Cantidad de exámenes rendidos. • Notas de los exámenes (un conjunto de hasta 60 notas posibles). • Promedio de los exámenes (sin incluir los aplazos. Este miembro no debe ser ingresado,

debe ser calculado por el programa! ). Se pide escribir un programa en C que sea capaz de leer estos datos para el conjunto de alumnos encuestados, hasta que se ingrese un alumno cuyo código de especialidad sea “FIN” o bien cuando se alcance un máximo de 100 alumnos (utilizar asignación dinámica de memoria). También es necesario: • Listar ordenados por código de especialidad y registro, todos los alumnos que no tienen

ningún examen reprobado. • Se debe ingresar por teclado el código de una especialidad. Con estos valores crear un

nuevo conjunto (usar asignación dinámica de memoria) formado por todos los datos de todos los alumnos que pertenezcan a la especialidad ingresada.

• Listar todos los datos correspondientes a los alumnos del arreglo creado, cuyo promedio sea superior a 6 (seis).

Problema 105 Suponga que una compañía aérea maneja la siguiente información: • Nombre pasajero (string). • DNI (string). • código pasaje (string). • código lugar de destino (string). • Hora de partida en horas (float). • Fecha de partida. • Precio del pasaje (float). Considere que la compañía posee una promoción de un pasaje por persona a precios rebajados. En base a los datos se debe: a) Cargar los datos mientras el lugar de destino sea diferente al de partida (considerar que el

lugar de partida debe ser suministrado al momento de comenzara ejecutarse el programa). b) Determinar y mostrar el destino más requerido y la cantidad de pasajes que le

corresponden. c) Hacer un listado ordenado por código de pasaje y por hora de partida de aquellos que se

produzcan entre las 10,00 y las 18,00 horas inclusive.

Problema 106

Page 66: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

66

Un almacén desea informatizar la facturación de sus ventas. Para ello, necesita un programa en C que debe tener en cuenta los siguientes datos para facturar cada producto: • Numero de factura (numérico). • Nombre del cliente (alfanumérico) • Fecha de emisión de factura (alfanumérico con formato aaaammdd ) • Código del producto (hasta 6 caracteres alfanuméricos) • Descripción del producto (hasta 30 caracteres alfanuméricos) • Cantidad de productos (numérico) • Precio unitario del producto (numérico) El programa debe permitir: a) Cargar las facturas (máximo 100). b) Buscar una factura por fecha (búsqueda binaria, suponer fechas no repetidas) . c) Mostrar por pantalla la factura buscada. d) Borrar la factura buscada si se desea. Nota: Las tareas citadas pueden realizarse mas de una vez y en forma repetitiva. Por ejemplo, Cargar 10 facturas - Buscar 1 y mostrarla- cargar 5 facturas - buscar una y borrarla etc. Por lo tanto, para esto se deberá realizar un menú.

Problema 107 El servicio meteorológico nacional posee varias estaciones meteorológicas en diferentes puntos de la república. Cada estación envía el central los datos recopilados durante un día de mediciones. La información entregada se ajusta a una estructura del tipo: • Número de estación (entero largo sin signo) • Ubicación ( alfanumérico de 25 caracteres) • Temperatura ( arreglo de 24 datos flotantes, medición por hora del día) • Temp_max (flotante) • Hora (entero) • Fecha ( string de 9 caracteres, con la fecha actual) Se pide un programa en C que realice lo siguiente: a) asumir que el servicio posee N estaciones, realizando la reserva dinámica de memoria para

un mes de mediciones (30 días). b) Carga de las mediciones para el mes. c) Calcular la temperatura máxima de cada estación para ada día y almacenarlo en el

miembro de la estructura correspondiente, llenando también la hora a la cual se produjo. d) Un listado ordenado por fecha y número de estación, siempre y cuando la temperatura

máxima registrada sea superior a los 35 grados. e) Permitir por teclado el ingreso de una fecha y buscar la estación que registró la temperatura

máxima durante ese día, mostrar todos los elementos de la estructura.

Problema 108 En un campeonato de tiro se desea llevar la estadística de la competencia. Por lo tanto se debe ingresar la siguiente información: • Nombre de tirador (string de 25 caracteres) • Ciudad de origen del tirador (string de 15 caracteres) • Edad (entero sin signo) • Cantidad de tiros realizados por cada participante ( entero sin signo)

Page 67: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

67

• Cantidad de puntos obtenidos por cada tiro (arreglo de enteros máx. 50, puntos posibles: 20, 40, 60, 80, 100)

• Promedio de puntos obtenidos (real a calcular) Se pide: a) Cargar los participantes en el campeonato. La lectura finaliza cuando se ingresa una edad

inferior a 17 años o cuando el nombre finalice con la secuencia “rt”. Esta última estructura no debe ser tenida en cuenta.

b) Calcular el promedio de tiro de cada participante y que lo asigne al miembro correspondiente.

c) Generar un listado ordenado de mayor a menor por ciudad y a igual ciudad por promedio. d) Suponiendo que exista más de un participante por ciudad, esto es un equipo de

participantes, se debe mostrar cual fue la ciudad que obtuvo el mejor promedio por participante.

e) Generar y mostrar un nuevo arreglo con aquellos participantes de la “provincia de San Juan” que hallan obtenido más del 50% del puntaje máximo posible.

Problemas Resueltos Sobre Operaciones Básicas Con Archivos

Problema 109 Ingresa datos por teclado para una estructura agenda y los graba en un achivo de texto.

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

int num_ord; char nombre[30]; char telf [14];

AGENDA; int carga_abo(AGENDA *age); /* declaracion de fun ciones */ void mostrar(AGENDA *age, int cant ); void grabar(AGENDA *age,int cant); int main( )

AGENDA age[20]; int i, cant; cant = carga_abo (age); mostrar(age, cant); grabar(age,cant);

void mostrar(AGENDA *age, int cant)

int i=0; printf ("\n\n\n Orden \t\t\t Nombre \t\t\t Numero \ n\n"); for(i=0 ;i < cant; ++i)

printf (" %d ", age[i].num_ord); printf ("\t\t %20s \t",age[i].nombre); printf ("%14s \n", age[i].telf);

int carga_abo( AGENDA *age )

Page 68: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

68

int i = 0 ; char c, nombre[30]; puts("Ingrese el Nombre del cliente 1:"); gets( nombre ); while(strcmpi(nombre,"ultimo"))

age[i].num_ord =i+1; strcpy( age[i].nombre, nombre); puts ("ingrese el numero de telefono:"); gets(age[i].telf); i++; printf("Ingrese el Nombre del cliente %d:", i+1); gets(nombre);

return i;

void grabar(AGENDA *age,int cant)

int i; FILE *arch; arch = fopen( "agenda.txt", "wt" ) ; if( !arch )

printf("No se puede abrir el archivo "); exit(1);

else for(i=0;i<cant;++i)

fprintf (arch,"%2d %30s %14s\n", age[i].num_ord,age[i].nombre, age[i].telf);

fclose(arch);

Problema 110 Lee un archivo texto de estructuras agenda y lo muestra, realiza una primer lectura para determinar la cantidad de estructuras que hay grabadas, con el objeto de realizar la reserva dinámica de memoria correspondiente.

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

int num_ord; char nombre[30]; char telf [14];

AGENDA; /*declaración de funciones */ void mostrar(AGENDA *age, int cant ); int main( )

AGENDA *age, aux; int cant=0, i; FILE *arch; arch = fopen("agenda.txt","rt") ; if( !arch )

printf("No se puede abrir el archivo ");

Page 69: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

69

return 1;

/* lee el archivo para contar los elementos */ fscanf(arch,"%2d%30s%14s",&aux.num_ord,aux.nombre,a ux.telf); while( !feof( arch ) )

cant++; fscanf(arch, "%2d%30s%14s", &aux.num_ord, aux.nombr e,

aux.telf); age = malloc(cant * sizeof(AGENDA)); /* pide memori a */ rewind( arch ); for(i=0;i<cant; ++i) /* lee sobre el Arreglo de est ructuras */

fscanf (arch, "%2d%30s%14s\n", &age[i].num_ord, age[i].nombre, age[i].telf);

fclose(arch); mostrar(age,cant); free(age); return 0;

void mostrar(AGENDA *age, int cant)

int i=0; printf("\n\n\n Orden \t\t\t\t Nombre \t\t Numero \n \n"); for(i=0 ;i < cant; ++i)

printf(" %d ", age[i].num_ord); printf("\t\t %20s \t\t ",age[i].nombre); printf("%14s \n", age[i].telf);

Problema 111 Ingresa por teclado datos de la estructura agenda y los graba en un archivo Binario.

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

int num_ord; char nombre[30]; char telf [14];

AGENDA; int carga_abo( AGENDA *age ); void mostrar( AGENDA *age, int cant ); void grabar( AGENDA *age, int cant ); int main( )

AGENDA age[20]; int i, cant; cant = carga_abo(age); mostrar(age, cant); grabar(age,cant); return 0;

Page 70: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

70

void mostrar(AGENDA *age, int cant) int i=0; printf("Orden\t\tNombre\t\tNumero"); for(i=0 ;i < cant; ++i)

printf ("%d", age[i].num_ord); printf ("%20s\t ",age[i].nombre); printf ("%14s\n", age[i].telf);

int carga_abo(AGENDA *age )

int i = 0 ; char c, nombre [30]; puts("Ingrese el Nombre del cliente 1:\t"); gets( nombre ); while(strcmpi(nombre, "ultimo"))

age[i].num_ord = i+1; strcpy( age[i].nombre, nombre); puts("\ningrese el numero de telefono: "); gets( age[i].telf ); i++; printf("Ingrese el Nombre del cliente %d:\t", i+1) ; scanf("%s", nombre); fscanf( stdin, "%c" );

return i;

void grabar(AGENDA *age, int cant)

int i; FILE *arch; arch = fopen("agenda.bin","wb"); if( !arch )

printf("No se puede abrir el archivo "); exit(1);

for( i=0; i < cant; i++)

fwrite( age+i, sizeof(AGENDA), 1, arch); fclose(arch);

Problema 112 Leer archivo con estructura agenda en modo binario, empleando una función que lee y devuelve el puntero al arreglo y la cantidad de datos por referencia. El nombre del archivo debe ser ingresado por el usuario y se le fija la extensión .bin

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

int num_ord; char nombre[30]; char telf [14];

AGENDA; int carga_abo(AGENDA *age);

Page 71: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

71

void mostrar(AGENDA *age, int cant ); AGENDA *leer(int *pt_cant); int main( )

AGENDA *age; int cant, i; age = leer( &cant ); mostrar(age, cant); free (age);

/*Función que recibe puntero a la variable cant y r etorna puntero al arreglo de estructuras, dado que se pide memoria en la función .*/ AGENDA *leer( int *pt_cant )

AGENDA *age, aux; int i, k; FILE *arch; char nomb_arch[20]; printf("\nIngrese el nombre del archivo binario a l eer\n"); gets(nomb_arch); strcat(nomb_arch,".bin"); /*Se le fija la extensio n */ arch = fopen(nomb_arch,"rb") ; if( !arch )

printf("No se puede abrir el archivo "); exit(1);

/* lee el archivo para contar los elementos */ k=0; /* Pone en cero el contador */ fread( &aux, sizeof(AGENDA), 1, arch); while( !feof( arch ) )

k ++; fread( &aux, sizeof(AGENDA), 1, arch);

/* pide memoria en la función*/ age = malloc(k * sizeof(AGENDA)); rewind(arch); for (i=0; i< k ; ++i)

fread(age+i , sizeof(AGENDA) ,1, arch); fclose(arch); *pt_cant = k; /*copia la cantidad de estructuras e n cant*/ return age;

void mostrar(AGENDA *age, int cant)

int i=0; printf ("\n\n\n Orden \t\t\t\t Nombre \t\t Numero \ n\n"); for(i=0 ;i < cant; ++i)

printf ("%d", age[i].num_ord); printf ("%20s\t ",age[i].nombre); printf ("%14s\n", age[i].telf);

Problema 113 Leer los datos del último producto ingresado. Posicionarse al final del archivo e ingresar un nuevo producto. Mostrar el contenido de todo el archivo.

Page 72: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

72

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct

int codigo; char descripcion[50]; float precio_unit;

PRODUCTO; PRODUCTO cargar_producto( void ); void imprimir_producto( PRODUCTO aux ); int main( )

FILE *stock; PRODUCTO aux; int i, n; printf(" Ingrese cantidad de productos\n"); scanf("%d",&n); if ((stock = fopen("stock.dat", "wb+"))==NULL)

printf(" No se puede abrir el archivo.\n"); exit(1);

for ( i=0; i<n ; ++i )

aux = cargar_producto(); fwrite(&aux,sizeof(PRODUCTO),1,stock);

printf(" El ultimo producto es\n" ); fseek( stock, (n-1)*sizeof(PRODUCTO), SEEK_SET ); fread( &aux, sizeof(PRODUCTO), 1, stock ); imprimir_producto(aux); /* Se posiciona en el EOF para escribir una nueva estructura al final */ printf("Ingrese un nuevo producto al finaldel archi vo\n" ); fseek( stock, 0, SEEK_END); aux = cargar_producto(); fwrite( &aux, sizeof(PRODUCTO), 1, stock); /* Lista todo el archivo en forma secuencial */ printf(" Lista todos los Productos "); rewind(stock); fread( &aux, sizeof(PRODUCTO), 1, stock); while( feof(stock)==0)

imprimir_producto(aux); fread ( &aux, sizeof(PRODUCTO), 1, stock);

fclose(stock); return 0;

PRODUCTO cargar_producto( void )

PRODUCTO temp; printf( "Datos del producto\n" ); printf( "Codigo\n" );

Page 73: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

73

scanf( "%d", &temp.codigo); fflush( stdin ); printf( "Descripcion\n" ); fgets( temp.descripcion, 50, stdin ); /* si hay mas caracteres queda el buffer cargado */ fflush(stdin); printf( "Precio\n" ); scanf("%f",&temp.precio_unit); printf("\n\n"); return temp;

void imprimir_producto(PRODUCTO aux)

printf("Datos del producto\n"); printf("Codigo:%d\n", aux.codigo ); printf("Descripcion:%s\n", aux.descripcion ); printf("Precio Unitario:%f\n", aux.precio_unit );

Problemas Propuestos Con Estructuras Y Archivos

Problema 114 Una empresa que produce aceites, almacena los datos de la producción diaria de cada una de sus 2 filiales en estructuras del tipo: • Nombre del aceite (char) • Precio de Venta (float) • Cantidad Vendida (entero) • día (char) Se cuenta con un archivo binario que posee la información de la producción por día de un cierto periodo de la primer filial, ordenado de menor a mayor por Cantidad Vendida. Así mismo, existe un archivo binario correspondiente al mismo periodo de la segunda filial desordenado. Se solicicta: a) Intercalar los datos de ambos archivos en un único arreglo de estructuras ordenado por el

campo Cantidad Vendida y almacenarlo en un nuevo archivo texto. b) Calcular el promedio de las ventas de cada filial y el de la producción conjunta (pesos) por

día. c) Contar cuantas ventas de la primer filial superaron el promedio conjunto de ventas calculado

en el punto anterior.

Problema 115 Una fábrica de cables desea evaluar los resultados de su producción durante un mes para realizar el control de calidad de la misma. Los datos de los lotes de cables fabricados son: • Número de Lote (entero positivo de cuatro cifras) • Fecha de fabricación (cadena de 7 caracteres -> aammdd) • Peso del cobre utilizado (real) • Longitud del cable fabricado (real) • Color del aislante (cadena de caracteres) • Peso del aislante por metro de cable (real) Los datos de la producción de un mes se encuentran ya grabados en un archivo tipo ASCII.

Page 74: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

74

Se pide generar un programa en lenguaje C que lea los datos de este archivo y los procese para obtener: a) Un archivo binario que contenga los números de lote, longitud del cable y peso del cobre de

todos los lotes cuyo color del aislante coincidan con uno ingresado por el usuario mediante teclado, ordenado por número creciente de lote. El nombre de este archivo será el nombre del color seleccionado con la extensión .CBL (debe ser un nombre DOS válido)

b) Un archivo ASCII que contenga los números de lote, longitud del cable y peso del cobre de todos los lotes cuya longitud de cable sea igual a un valor ingresado por el usuario por teclado con una tolerancia del 10% en más o menos, ordenados por fecha de producción.

c) Un listado por pantalla de los datos de todos los lotes fabricados en el mes que tengan un peso de cobre superior al peso del lote correspondiente al que posee menor numero de lote.

Problema 116 Una estación de servicio durante un mes se relevó la información relativa a sus ventas. Para esto se generó un archivo binario de nombre “estacion.bdd” con los siguientes Datos: • Nombre del Cliente (máximo 30 caracteres) • Fecha de la factura (año mes día) (7 caracteres) • Número de factura (entero doble precisión) • Cantidad de litros (entero) • Precio total de la venta (real) • Tipo de nafta (S , C o R) (caracter) Considerando que este archivo existe, desarrollar un programa en C que realice las siguientes operaciones: a) Leer el archivo. b) Calcular y mostrar por pantalla el promedio de ventas por día, e indicar el dia de mayor

venta. c) Generar un archivo de texto que contenga las ventas realizadas en el mes cuyas cantidades

de litros están comprendidas entre 35 y 45 litros de nafta S (Súper). Ordenadas alfabéticamente por nombre del cliente.

d) Calcular y mostrar el porcentaje sobre el total de las ventas que corresponde a nafta súper y nafta común.

Nota: S, C o R se entiende como Súper, Común o Refinada.

Problema 117 Un hospital dispone de un sistema automático de evaluación de fallas de sus equipos. Este sistema, por cada máquina graba en un archivo binario (falla.bin ) una estructura con la siguiente información: • Nombre de la máquina (17 caracteres) • Nro. de serie (entero ocho dígitos numéricos) • Ubicación (15 caracteres) • modelo (5 caracteres) • tiempo entre fallas (arreglo de 200 muestras, cada muestra expresada en minutos) • MTBF (real) El tiempo entre fallas es un arreglo de enteros que almacena los intervalos entre fallas, por ejemplo: 60, 30, 45, 15,..., 0, 0, 0, 0....

Page 75: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

75

a) Calcular el tiempo medio entre fallas (MTBF) para cada máquina y almacenarlo en el campo MTBF de la estructura de datos. Este se calcula como el promedio de los tiempos entre fallas para cada maquina.

b) Almacenar la información en otro archivo (de texto ) falla2.txt , ordenado por MTBF y modelo de mayor a menor.

c) Calcular el MTBF promedio de las máquinas que con número de serie entre 100.000 y 200.000, y mostrarlo por pantalla.

d) Calcular el porcentaje de máquinas del total cuyo MTBF sea inferior al promedio calculado en el punto anterior.

Problema 118 Dada la siguiente estructura de datos:

struct Integrado int Codigo; int Cantidad; float PrecioUnitario; char Descripcion[40]; char Proveedor[40];

; Realizar un programa en lenguaje C que permita: a) Leer todas las estructuras del tipo mencionado, que existan en el archivo A:\circ.dat" , el

cual es de tipo binario . b) Ingresar nuevas estructuras tomando los datos desde teclado. c) Ordenar las estructuras por el campo Código en forma creciente y guardarlas ordenadas en

el archivo de tipo ascii "c:\almacen\lista.txt" d) Actualizar el archivo binario "c:\almacen\circ.dat" El programa, al iniciarse, debe reservar memoria, levantar todas las estructuras existentes y presentar un menú de opciones al usuario, a fin de que realice cualquiera de las operaciones descriptas o pueda abandonar el programa. Cuando se realiza la reserva de memoria prever que se deben agregar nuevas estructuras y cuando se agregan de no superar la memoria solicitada.

Problema 119 Una compañía fabricante de tornillos recibe diariamente por correo electrónico un archivo binario conteniendo las especificaciones de los tornillos que fabricará ese día. El archivo consiste en un conjunto de bloques de datos que contienen las siguientes especificaciones: • Código o tipo del tornillo (alfanumérico de 12 caracteres válidos). • Sistema de medida del tornillo (un único carácter : M métrico, P pulgadas) • Largo del tornillo en mm (Real) • Diámetro del tornillo en mm (Real) • Número de filetes por unidad de medida (entero) • Cantidad de tornillos a fabricar con esas especificaciones (entero) La empresa dispone de un torno de mando numérico que fabrica automáticamente los tornillos, el cual requiere que la información de cada tipo de tornillo a construir le sea entregada en un archivo de texto. Es necesario entonces construir a partir del archivo binario recibido un conjunto de archivos de texto (uno para cada tipo de tornillo) cuyo nombre sea igual a los ocho primeros caracteres del código y con la extensión .tor . La información contenida en cada archivo así generado es la misma que existe en el bloque de datos correspondiente con la

Page 76: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

76

excepción del código del tornillo. La generación de los archivos debe hacerse ordenada por código. Se deberá listar por pantalla aquellos tipos de tornillo fabricados en el sistema métrico cuyo volumen total de material utilizado no supere 150000 mm3. Se deberá ingresar por teclado un tipo de tornillo especificado, e indicar el número total de filetes que este posee, ordenados por cantidad a fabricar.

Problema 120 Una empresa dedicada al tratamiento de agua desea realizar un algoritmo en lenguaje C para procesar la información relativa al proceso durante un año. La información producida por el equipo de purificación se almacena en un archivo binario de nombre “purific.bdd” con los siguientes datos: • fecha de lectura (caracter 9) en formato aaaammdd • hora de lectura (caracter 7) en formato hhmmss • porcentaje de cloro (real) • cantidad de metros cúbicos procesados (real) • tiempo de procesamiento (caracter 7) en formato hhmmss • estación del año (I, V, O, P) caracter. Además se dispone de otro archivo binario con 4 estructuras cuyo nombre es ¨epoca.bdd¨, con la siguiente información: • estación del año (I, V, O, P) • porcentaje de cloro ideal • tolerancia del porcentaje de cloro • tiempo de procesamiento ideal. Realizar un programa en C que realice lo siguiente a) Leer la base de datos y almacenarla en un arreglo dinámico de memoria. b) Listar ordenado por fecha y hora los datos correspondientes a Primavera y Verano. c) Generar un archivo de texto “Audit.txt” que contenga la información de todos aquellos

registros que cumplan con la especificación , que se encuentra en el segundo archivo, para invierno.

d) Ingresar dos fechas por teclado, buscar y listar todos los registros comprendidos entre ellas.

Problema 121 Una empresa dedicada a la fabricación de diskettes desea relevar información de la producción. A cada disquete se le asocian los siguientes datos: • Número de Serie (long) • Tipo (String: FD1.44, FD1.2,FD720, FD360) • Calidad (entero: 10-8: Buena, 7-5: Regular, 5-0: Mala) • Color caja (String) • Test( Carácter: 'A': Aprobado, 'R': Rechazado) Se dispone de un archivo binario denominado diskette.bin con la información de la producción de los disquetes. Se pide: a) Leer el contenido del archivo (con asignación dinámica de memoria). b) Analizar cada disquete y llenar el campo test de acuerdo a la calidad de cada uno, siendo

'A'= Calidad buena, 'R'= calidad regular o mala. c) Generar un archivo de texto (ASCII) denominado buenos.txt , en el directorio c:\diskettes

con la información de los disquetes aceptados ordenados por tipo.

Page 77: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

77

d) Hacer un listado ordenado por test y tipo indicando el porcentaje de disquetes aprobados y rechazados para cada tipo.

Problema 122 En el control de tránsito aéreo se almacenan los datos de las solicitudes de distintos aviones en vuelo y los que están con posibilidad de decolaje utilizando estructuras de datos que poseen los siguientes datos: • Fecha (string “dd:mm:aaaa”) • Hora (string “hh:mm:ss”) • Altitud (entero sin signo, es un código de nivel) • Mensaje (string long. Máxima de 250 caracteres útiles) • Respuesta (string long. Máxima de 80 caracteres útiles) • Código del avión (entero sin signo) • Código de la empresa (entero sin signo) Se necesita realizar un programa en C que permita realizar las siguientes tareas: a) Leer todas las estructuras almacenadas en el archivo binario (“C:\vuelo\datos.bin”),

realizando reserva dinámica de memoria, y previendo una cantidad adicional de 100 estructuras, a los fines de permitir eventuales incorporaciones de nuevas estructuras.

b) Agregar por teclado nuevas estructuras, solicitando al operador cada uno de los campos. c) Generar un archivo de texto que contenga los códigos de avión y empresa de aquellos

aviones que se hubieren comunicado entre dos momentos determinados, ordenado por empresa y luego por avión

d) Muestre por pantalla un listado de todos aquellos aviones cuya altitud sea mayor que una ingresada por teclado, ordenado por fecha y hora.

e) Actualizar el archivo binario. f) Eliminar una estructura cuyo código de empresa y avión se ingrese. g) Implementar un menú para realizar las operaciones de b) a f) en forma reiterada.

Problema 123 Una empresa que fabrica telas almacena los datos de su producción utilizando estructuras que contienen los siguientes datos para cada lote: • Fecha (string “aaaa:mm:dd”) • Hora (string “hh:mm:ss”) • Longitud en metros (real) • Ancho en metros (real) • Color (string de 10 caracteres útiles) • Código del lote (entero sin signo) Se necesita realizar un programa en C que permita realizar las siguientes tareas: a) Leer todas las estructuras almacenadas en el archivo binario (C:\stock\datos.bin”),

realizando reserva dinámica de memoria, y previendo una cantidad adicional de 50 estructuras más, a los fines de permitir eventuales incorporaciones de nuevas estructuras.

b) Agregar por teclado nuevas estructuras, solicitando al operador cada uno de los campos. c) Generar un archivo de texto que contenga las longitudes y anchos de los lotes de un color

determinado, ordenados por fecha y hora de fabricación en orden ascendente (los más viejos arriba).

Page 78: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

78

d) Muestre por pantalla un listado de todos aquellos lotes que hayan sido fabricados en un determinado día y cuyo ancho esté comprendido entre dos límites determinados, ordenado por color.

e) Actualizar el archivo binario.

Problema 124 Una empresa de telefonía lleva un registro detallado de cada uno de los teléfonos que produce. La información relevante para cada uno de ellos es la siguiente: • Número de serie del teléfono (string de 10 caracteres alfanuméricos con el siguiente

formato: LnnSxxTyyy , donde nn son dos dígitos que indican el número de lote, ss son dos dígitos que indican el número de semana del año cuando se fabricó el teléfono e yyy son tres letras minúsculas que indican el tipo de teléfono: ang si es analógico o dig si es digital).

• Cantidad de memorias para discado rápido (entero positivo). • Color del teléfono (string que puede tomar los valores “BLANCO”, “GRIS” o “NEGRO”) • Calidad de fabricación (entero positivo que puede tomar los siguientes valores: 0 si es de

primera calidad, 1 si es de segunda calidad o –1 si es para descarte). Los datos de la fabricación del último año se encuentran grabados en un archivo binario con el nombre “telefono.bin” , pero se desconoce la cantidad de registros grabados en el mismo (hay que contarlos). Se necesita un programa en lenguaje C que permita las siguientes operaciones sobre estos datos: a) Cargar desde disco a memoria todos los datos del archivo telefono.bin (es obligatorio usar

asignación dinámica de memoria). b) Listar por pantalla el número de serie y la calidad de fabricación de todos los teléfonos

negros que tienen más de cuatro (4) memorias de discado rápido, ordenados por numero de serie.

c) Generar un archivo de tipo texto (ASCII), llamado descarte.txt , con todos los datos de los teléfonos cuya calidad es de descarte , que pertenezcan al lote número 13 y que hayan sido fabricados antes de la semana 24.

d) Calcular y mostrar la cantidad de teléfonos y el porcentaje que ella representa sobre el total, de todos aquellos teléfonos GRISES cuya calidad es de segunda.

Problema 125 Dos Empresas dedicadas a la fabricación de DVD transfieren información relevante de la producción a través de un archivo binario que se llama “datosdvd.bin” . La Empresa número 1 se dedica a la fabricación del DVD virgen con la caja, la segunda empresa se encarga de grabar, etiquetar y distribuir cada uno de los DVD que le llegan de acuerdo a la demanda del publico. El archivo binario a través del cual se transfiere la información entre las empresas, posee los siguientes datos: • Numero de serie (entero largo positivo) • Color (string) • Control de Calidad (string: Ver más abajo el formato de este campo) • Capacidad (entero largo). • Tipo (string: M=Musica, V=Video, S=Software Operativo, A= Software de Aplicación,

I=Multimedia, ver más abajo) • Distribuidora (string)

Page 79: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

79

La empresa 1 llena solamente los campos numero de serie, color y control de calidad , siendo este último un string de la forma E1nn donde nn es 00 si esta defectuoso, 01 si posee una cara útil, 10 si posee la otra cara útil y 11 si las dos caras son útiles. La Empresa 2 al recibir el archivo completa la estructura con todos los datos faltantes, agregando al campo control de calidad un string de la forma E2xx, donde xx significa: 00 si no se pudo grabar la información, 11 si la grabación fue un éxito y está listo para ser comercializado. Importante: El campo tipo por su lado puede ser una combinación de caracteres de acuerdo a lo explicitado en la definición (P.ej: M o MV o MSA, etc..., es decir, cualquier combinación válida de los caracteres se permite). Se pide: a) Hacer un programa en C que lea el archivo binario enviado por la Empresa 1 y permita la

carga de la información faltante por la empresa 2 según el proceso explicado (usar asignación dinámica de memoria).

b) Regenerar el archivo binario original, de forma tal que en él solo aparezcan todos los datos de aquellos DVD que tienen al menos una cara útil y cuya grabación fue exitosa y que son de color “VERDE”, ordenados por número de serie.

c) Calcular la cantidad de DVD defectuosos entregados por la empresa 1 y la cantidad de DVD que no han sido grabados por la Empresa 2. Calcular también el porcentaje que estas dos cantidades representan del total de DVD fabricados.

Problema 126 La Policía de San Juan está realizando un relevamiento de los conductores de automóviles para obtener información del pago o no del incentivo docente. Con tal motivo la información recabada para cada conductor es: • Nombre y Apellido (string de 40 caracteres) • Tipo de vehículo (A=auto, M=moto, C=camioneta) • Modelo (string de 15 caracteres) • Marca (string de 15 caracteres) • Monto pagado (real) • Fecha actual(string de la forma aaaa-mm-dd) • Fecha de Pago (string de la forma aaaa-mm-dd) • Condición (carácter) (P = pagado, M= moroso) Con esta información se genera un archivo binario de nombre incentiv.bdd que luego es enviado a la Sec. de Hacienda para calcular datos estadísticos de importancia. Se solicita implementar un programa en lenguaje C que permita realizar las siguientes tareas: a) Leer el archivo binario utilizando asignación dinámica de memoria. b) Generar un archivo texto denominado Regla.txt con los datos de la base ordenados por tipo

de vehículo y por nombre de los conductores que han pagado el incentivo docente. c) Generar un nuevo archivo binario (ATiempo.bdd ) con los datos de los conductores que

hayan pagado antes del primero de agosto del año 1999 ordenados por fecha de Pago. d) Calcular el porcentaje de morosos. e) Calcular, por separado, los porcentajes de Autos, motos y camionetas que han pagado el

incentivo.

Problema 127

Page 80: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

80

El Ente Regulador del Transporte Público de Pasajeros de nuestra ciudad ha solicitado se realice un programa en Lenguaje C para ejecutar las siguientes operaciones. Esta Institución entrega un archivo binario denominado Unidades.bdd con la siguiente información • Nombre de la Empresa (string 20 caracteres) • Numero de unidad • Numero de Línea a la cual la unidad está afectada (entero sin signo) • Nombre del chofer (string de 20 caracteres) • Tiempo promedio de una vuelta del recorrido (real) • Cantidad promedio de pasajeros por vuelta (real) • Observaciones (A – asalto, C – choque, M – averiada, S – sin observaciones) Se pide realizar el programa para extraer la siguiente información: a) Lectura del archivo binario con asignación de memoria dinámica b) Calcular y mostrar el tiempo de recorrido promedio y la cantidad de pasajeros promedio por

cada Línea de ómnibus c) Generar un archivo ASCII (Empresas.txt) con la información de Nombre de la empresa,

numero de línea, tiempo promedio de recorrido, cantidad promedio de pasajeros ordenado por nombre de la empresa y numero de Línea de aquellas unidades que no posean observaciones.

d) Calcular y mostrar la Cantidad de recorridos que realiza cada unidad sabiendo que las mismas comienzan a las 6 de la mañana y finalizan a las 0 horas, además averiguar la cantidad de pasajeros que transporta por día, por mes y por año cada unidad.

Problema 128 Una editora de libros desea contar con información relativa a la fabricación de sus productos. Para ello nos envía un archivo en formato texto denominado “libros.txt” con información de su producción. Para cada conjuntos de libros producidos el archivo contiene la siguiente información de cada uno de los libros: • Titulo del libro (máximo 50 caracteres). • Autor(máximo 30 caracteres) • Cantidad de paginas • Precio • Presentación (caracter D: Tapas duras, B:Tapas blandas) • Cantidad de libros. Se pide realizar un programa en lenguaje C que permita procesar esta información: a) Leer los datos de cada libro a un arreglo dinámico en memoria. b) Calcule el precio de cada libro y se llene el campo de la estructura correspondiente teniendo

en cuenta que cada página cuesta $0.001 y la encuadernación de tapas blandas $5 y de tapas duras $8.

c) Generar un archivo binario denominado “libros2.bdd” ordenado por Autor y simultáneamente por cantidad de paginas con la siguiente información: Título del Libro, Autor. numero de paginas y precio.

d) Permitir que el usuario introduzca una cierta cantidad de lestras del nombre del Autor vía teclado y muestre la información para cada Autor que sus primeras letras coincidan con las letras ingresadas toda la información de cada uno de sus libros.

Problema 129

Page 81: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

81

En una empresa maderera se desea llevar el registro de los productos que comercializa, para lo cual se dispone de un archivo ASCII denominado “madera.txt” con la información: • Especie de árbol (string 20) • Tipo de madera (carácter M= Machimbre, L= Listón, C = Cabio) • Ancho en pulgadas • Alto en pulgadas • Largo en pulgadas • Precio de la pulgada cúbica • Cantidad en stock Se pide se desarrolle un programa en “C” que ejecute la siguiente tarea: a) Leer el archivo entregado por la empresa y almacenarlo en memoria usando asignación

dinámica de memoria. b) Permitir que el usuario ingrese una cierta cantidad de madera necesitada, la especie de

árbol y el tipo de madera. Se deberá verificar su existencia en stock y en caso afirmativo se deberá descargar del mismo la cantidad solicitada. Este proceso debe continuar hasta que el operador manifieste que no necesita ingresar nuevos datos.

c) Generar un archivo binario con la información anterior pero agregándole el precio de cada unidad de madera. En este caso deberá agregar más información que la que posee la estructura dada, la cual consiste en el precio de cada madera.

d) Generar un listado ordenado por Especie de árbol y por cantidad en stock de aquellas maderas que en stock se superen las 100.

Problema 130 Un supermercado atiende a los grandes clientes a través de un sistema de computo que genera un archivo binario de nombre clientes.bdd . La información contenida en este archivo es la siguiente: • Nombre del Cliente (string de 30 caracteres) • Razón Social (string de 20 caracteres) • Fecha del pedido (string, aaaa-mm-dd) • Código del producto mas vendido al cliente (entero) • Cantidad de productos comprados (entero) • Monto total de la compra (real) Al final del día se extrae información del archivo. Se pide se haga un programa en C que permita realizar las siguientes tareas: a) Leer el archivo binario utilizando asignación dinámica de memoria b) Calcular y mostrar cual fue el código del producto mas vendido durante el día y a que

Clientes se vendieron. c) Generar un archivo ASCII con la información de Nombre del cliente, Razón Social, Código

del producto más vendido y monto total de la compra solo para aquellos clientes que satisfacen la condición dada en b).

d) Realizar un listado total ordenado por Nombre del Cliente y Código del producto más vendido de aquellos clientes que compraron mas de $100 o que la cantidad de productos comprados superaron los 40.

Problema 131 Una empresa de turismo para hacer las reservas de los pasajes de avión de los usuarios genera un archivo ASCII, con la siguiente información.

Page 82: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

82

• Nombre del cliente. • Fecha de vuelo (string de la forma aaaa-mm-dd). • Código de vuelo (string de 5 caracteres). • Cantidad de asientos • Código de destino(string de 5 caracteres) • Precio del pasaje. Se extrae información de los pasajes vendidos durante el día. Para esto se pide realizar un programa en C que cumpla lo siguiente: a) Leer el archivo ASCII utilizando asignación dinámica de memoria. b) Calcular y mostrar cuántos pasajes se vendieron de cada vuelo y el monto recaudado. c) Calcular y mostrar cuál fue el destino al que viajará mayor cantidad de pasajeros. d) Generara un archivo binario con la información de Nombre del cliente, Código del vuelo,

Código de destino, Cantidad de asientos vendidos y Precio total de la venta.

Problema 132 Una fábrica de resmas de papel genera diariamente un archivo binario en el que se encuentra la información de la producción de ese día. Esta información consta de los datos de todas y cada una de las resmas fabricadas, según el siguiente detalle: • Número de serie de cada resma. (string de 15 caracteres útiles) • Peso del papel por metro cuadrado, en gramos. (entero) • Dimensiones del papel de la resma. (largo y ancho en centímetros; reales) • Cantidad de hojas de papel que forman la resma. (entero) • Hora de fabricación de la resma. (string en el formato hh:mm:ss ) Se pide realizar un programa en lenguaje C que permita: a) Generar un archivo ASCII (texto) con el número de serie y la hora de fabricación de

todas las resmas cuyo tamaño sea de 21 cm por 29.7 cm y con un peso de papel superior a los 70 grs., ordenado por hora de fabricación.

b) Generar un archivo binario con todos los datos de las resmas cuyo peso (peso de la resma, no del papel) supere los 2000 grs.

c) Imprimir por pantalla el número de serie y hora de fabricación de todas las resmas que han sido fabricadas entre las 06:00:00 hs. y las 10:30:00 hs, ordenadas Por número de serie.

Problema 133 Una fábrica dispone de una archivo con información de sus productos denominado prod.bdd con la siguiente información: • Código del producto (entero sin signo) • Nombre del Producto (string de 25 caracteres) • Tipo de producto (carácter) • Cantidad de productos en stock (entero) • Precio Unitario del producto (real) • Fecha última reposición de productos (string aaaammdd). Se pide realizar un programa en C que ejecute lo siguiente: a) Volcar la información del archivo a la memoria utilizando asignación dinámica. b) Realizar un listado ordenado por tipo de producto y nombre de producto de aquellos

productos con fecha de última reposición en el rango dado a continuación. Se debe permitir el ingreso de una fecha por teclado, se calcula el rango como la fecha ingresada y la fecha de un año antes de esta.

Page 83: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

83

c) Generar un nuevo arreglo de estructuras que contenga código y cantidad de productos cuyo stock esté por debajo de 10.

d) Generar un archivo de texto con la información contenida en el arreglo generado en el punto anterior.

e) Calcular el capital disponible de la empresa ( total de cantidad de productos por precio unitario). Este valor también deberá guardarse en el archivo generado en el punto anterior.

Problema 134 La Facultad de Ingeniería necesita de un programa en C para evaluar el rendimiento de los alumnos durante el cursado, para cada una de las 12 Carreras de Grado. Sección alumno entrega la información de cada alumno en un archivo binario con la siguiente información: • Numero de registro del alumno; • Nombre de la Carrera a la que pertenece • Semestre de cursado • Cantidad de materias que cursa A su vez se dispone de un archivo de texto con la siguiente información: • Numero de registro del alumno • Cantidad de materias que cursa • Nota de cada una de las materias que cursa. En cada uno de estos archivos existe solo un registro por cada alumno de la Facultad. Se pide: a) Realizar la carga de los datos de cada alumno que se encuentra en los archivos. Esto se

debe hacer en forma dinámica respetando la siguiente estructura de datos • Numero de registro del alumno (entero largo sin signo) • Nombre de la Carrera a la que pertenece (string de 40 caracteres válidos) • Semestre de cursado (entero sin signo) • Cantidad de materias que cursa (entero sin signo) • Arreglo de 10 enteros con las notas obtenidas por los alumnos en cada una de las

asignaturas que cursa. • Promedio de notas.

b) Calcular la nota promedio por alumno y almacenarla en la estructura (llenar el campo vacío). c) Calcular las notas promedio por Carrera. d) Realizar un listado ordenado por Carrera y Semestre de la nota promedio de los exámenes,

indicando en cada caso la cantidad de alumnos que han rendido. e) Generar un archivo binario con el nombre de la Carrera, Semestre y nota promedio, solo de

aquellas Carreras en las cuales la nota promedio ha superado los 6 puntos.

Problema 135 Un laboratorio de análisis clínicos necesita de un programa en C que le permita obtener información acerca de los estudios que realizan. Para este motivo por cada estudio realizado se llena la siguiente información: • Código del Estudio (string 5 caracteres válidos) • Numero de afiliado (entero largo) • Obra Social del paciente (string 15 caracteres válidos) • Cantidad de Glóbulos Rojos (máximo valor = 15.000.000) • Cantidad de Glóbulos Blancos (máximo valor = 50.000) • Cantidad de Plaquetas (máximo valor = 1.000.000) • Eritrosedimentación (entero)

Page 84: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

84

• Diagnóstico (string 20 caracteres vacío) Esta información se guarda en un archivo binario, cuyo nombre es ingresado por el operador. Se pide realizar mediante un programa en C las siguientes tareas: a) Leer el archivo binario y asignarlo a un arreglo de estructuras en forma dinámica en la

memoria. b) Para cada uno de los pacientes se debe rellenar el campo diagnostico con la información

consignada en la tabla siguiente.

Condición Diagnóstico Cantidad de Glóbulos Rojos inferior a 2.000.000. Anemia Cantidad de Glóbulos Blancos superior a 15.000 y Eritrosedimentación en el rango 10 a 19mm. Infección leve

Cantidad de Glóbulos Blancos superior a 20.000 y Eritrosedimentación en el rango 20 a 30mm. Infección media

Cantidad de Glóbulos Blancos superior a 35.000 y Eritrosedimentación superior a 31 mm Infección severa

Cantidad de plaquetas en el rango 230.000 a 270.000 Reservado En otro caso se deberá indicar por pantalla la información concerniente a Cantidad de Glóbulos rojos, blancos y plaquetas y requerir al operador que ingrese el diagnostico.

Ingresado por el operador

c) Realizar un listado ordenado por Obra Social y Diagnostico de todos los pacientes con eritrosedimentación entre 21mm y 35mm.

d) Generar un archivo de texto cuyo nombre sea COddmmaa.txt. Donde ddmmaa es la fecha que debe ser ingresada por el operador. El archivo debe contener la siguiente información y según el siguiente formato,

Obra Social Numero de Afiliado Código de Estudio ... Numero de Afiliado Código de Estudio Obra Social Numero de Afiliado Código de Estudio ... Numero de Afiliado Código de Estudio

Problema 136 Una empresa dedicada al riego por goteo dispone de un archivo binario denominado “clientes.bdd” con los cuales desea relevar cierta información estadística. Por cada propiedad de los clientes dispone de la siguiente información en el archivo:

• Nombre del Cliente (string de 30 caracteres) • Cantidad de Hectáreas de propiedad (entero) • Numero de experimentos a realizar (entero por defecto 0) • Gotas por Hora por Experimento (arreglo de 100 enteros) • Rendimiento de las plantas (arreglo de 100 floats)

La información en el archivo esta disponible parcialmente. Se desea: a) Leer el archivo binario utilizando asignación dinámica de memoria. Completar los datos de

acuerdo al resultado de cada experimento. Los datos a completar son Numero de experimentos, Gotas por hora por experimento y rendimiento. Para poder llevar a cabo esta

Page 85: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

85

tarea se deberá requerir al operador (por teclado) el nombre de un Cliente y completar la información necesaria. Debe tener en cuenta que un mismo Cliente puede poseer mas de una estructura, este proceso finaliza cuando el nombre del cliente comience con la las letras “RPN”.

b) Listar todos los datos de las clientes a los que se les haya completado la información ordenado por Nombre de cliente y cantidad de hectáreas.

c) Generar un archivo de texto con la información del Cliente que más experimentos haya realizado. En caso de igualdad se deberá considerar el de mayor cantidad de hectáreas. El nombre del archivo debe ser, el nombre del cliente (8 primeros caracteres) y extensión “.txt”. La información a grabar en el archivo debe ser: Cantidad Total de hectáreas, Número total de experimentos, Promedio de rendimiento, Máximo y Mínimo rendimiento obtenido.

Problema 137 Una empresa de turismo promociona viajes para estudiantes a distintos destinos dentro de la República Argentina. Para esto carga la siguiente información de cada estudiante como preinscripción del viaje. • Nombre Completo • Documento • Teléfono • Dirección • Destino Esta información se guarda en un archivo binario cuyo nombre es: viajes.bdd. Suponiendo que se dispone de este archivo se pide realizar un programa en C que permita: a) Cargar la información del archivo en un arreglo dinámico de memoria. b) Permitir que se pueda confirmar el viaje agregando a la información disponible de cada

estudiante la fecha del viaje, el costo del viaje y un campo carácter de confirmación (´C´confirma, otra cosa no confirma). También se debe permitir agregar estudiantes que a último momento decidieron realizar el viaje.

c) Realizar un listado ordenado por Destino y Nombre de estudiante de acuerdo al siguiente detalle:

Destino Nombre Documento Telefono $costo ……. Total Destino: $(costo total)

Averiguar cual es el destino mas elegido por los estudiantes y que porcentaje de estudiantes representa. (Esta información debe ser mostrada en el main). Generar un archivo de texto con la siguiente información: Nombre del estudiante, documento, teléfono, destino.

Problema 138 El Gremio que nuclea los docentes de San Juan necesita procesar la información de sus afiliados. La información de los mismos se encuentran guardados en un archivo de texto denominado “Afil.txt ” que se encuentra ubicado dentro del directorio Recursos del disco C:, teniendo en cuenta la siguiente estructura: • Apellido y Nombre del Docente (String de 30 caracteres, separados por espacio en blanco) • Numero de afiliado (entero largo) • Título profesional del docente(String de 15 caracteres) • Edad (entero sin signo)

Page 86: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

86

• Cantidad de cargos que ocupa (Entero sin signo) • Cantidad de horas cátedra que dicta todas las escuela (entero sin signo) • Antigüedad docente (entero sin signo) • Sueldo (Real) Nota: El campo de sueldo se encuentra inicialmente vacío . a) Leer el archivo de texto y asignarlo a un arreglo de estructuras en forma dinámica en la

memoria, teniendo en cuenta que se pueden agregar nuevos docentes. Se debe dejar a criterio del operario si se integran nuevos docentes en la lista. En ese caso es necesario actualizar el archivo original inmediatamente.

b) Completar el sueldo que cobra cada docente, teniendo en cuenta si el docente cobra por cargo o por horas cátedras. En caso de que cobre por cargo se debe partir que el sueldo básico es 1250$, a ello se le debe agregar 1300$ en adicionales por suma fija más un 15% respecto del básico, por cada 5 años de antigüedad que tenga. Un docente con 2 o más cargos solo se le agrega una vez la antigüedad y las sumas fijas. En caso de que tenga horas cátedras se le debe computar un básico de 120$, más 40$ por cada hora que dicta, incluyendo un 15% más por antigüedad con respecto al total de horas. Pueden existir docentes con cargos y horas cátedras.

c) Generar los respectivos archivos binarios que agrupan los docentes por cada título profesional que posee, donde cada archivo debe tener como nombre las primeras 8 letras del título, más la extensión “. bnn”. En dicho archivo se deberá colocar: Apellido y Nombre, número de afiliado, antigüedad, y sueldo. Se recomienda ordenar por título antes de realizar este proceso.

d) Generar un archivo binario de aquellos docentes que estén a punto de jubilarse. Se debe tener en cuenta que la antigüedad llegue o supere los 30 años y sea mayor de 60 años. Se exige el Apellido y Nombre, el número de Afiliado, la cantidad de Cargos, la cantidad total de horas cátedra. Al final del archivo guardar la cantidad total de docentes en esa condición.

e) Se dispone de un archivo de texto denominado “Listado.txt”, que contiene los números de afiliado y (separado por un tabulador: \t) el monto total en sueldos atrasados que el estado le adeuda a cada afiliado. Leer el archivo binario y generar un único string con los apellidos separados por un guión (-) y un espacio en blanco de todos los docentes afiliados en esa lista. Mostrar el nuevo string en el main().

Problema 139 Los datos relevantes de un grupo de alumnos de la Facultad de Ingeniería son: • Nombre (Cadena de caracteres) • Registro (Entero) • Código de especialidad (Carácter) • Cantidad de exámenes rendidos (Entero) • Notas de los exámenes (un conjunto de hasta 60 notas posibles). • Promedio de los exámenes (Real, sin incluir los aplazos. Este miembro no debe ser

ingresado, debe ser calculado por el programa ). Se pide escribir un programa en C que sea capaz de leer estos datos de todos los alumnos desde un archivo de texto cuyo nombre se debe ingresar por teclado. El archivo tiene extensión “.txt” y está ubicado en la unidad E:\ del disco duro. Se pide: a) Listar todos los alumnos que no tienen ningún examen reprobado, ordenados por código de

especialidad y registro.

Page 87: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

87

b) Se debe ingresar por teclado el código de una especialidad. Con estos valores crear un nuevo arreglo de estructuras de otro tipo con los datos correspondientes a Nombre, Número de Registro y Promedio formado por todos los datos de todos los alumnos que pertenezcan a la especialidad ingresada. Usar asignación dinámica de memoria .

c) Listar todos los datos correspondientes a los alumnos del arreglo creado, cuyo promedio sea superior a 6 (seis).

d) Calcular y mostrar el promedio de notas correspondiente a cada especialidad. Indicar cuál es la especialidad que posee mayor promedio y mostrar su valor.

e) Generar un archivo binario de nombre “Mejores.bin” que contenga el Nombre, registro, especialidad y promedio de notas de los mejores alumnos de cada especialidad.

Problema 140 Un instituto de capacitación recibe inscripciones para sus cursos de verano. Para cada inscripto se disponen de los siguientes datos. • Apellido y nombre • Edad • Cantidad de cursos que va a tomar • Código de cada uno de los cursos en los que se inscribió (arreglo de enteros máximo 5

elementos) • Turno elegido para todos los cursos. (M Mañana ó T Tarde). • Monto a pagar (este campo no está en el archivo, pero debe ser incluido en la estructura) Los cursos están codificados con enteros de la siguiente manera:

0Matemática 1Física 2Química 3Computación 4Redes 5Sistemas Contables.

Implementar un programa en lenguaje C que realice las siguientes tareas: Los datos de los inscriptos se encuentran almacenados en un archivo de texto "Inscrip.txt", estos datos deberán transferirse a memoria utilizando asignación dinámica y previendo que se pueden agregar unos cincuenta alumnos más a los ya inscriptos. Mediante un menú de opciones se deben realizar los siguientes ítems: a) Permitir la inscripción de un alumno en un curso. Puede pasar que el alumno sea nuevo, o

bien que el alumno ya esté inscripto en algún curso y quiera hacerlo en otro, para esto se le debe requerir al operador la información que sea necesaria según el caso. Se debe tener en cuenta de que un alumno no podrá inscribirse dos veces en el mismo curso, y que para los cursos de Matemática y Física no admiten más de 30 alumnos por turno y que la cantidad total de alumnos no supere lo previsto en la reserva de memoria.

b) (*) Permitir eliminar la inscripción de un alumno a un curso. En el caso que el alumno no esté inscripto en ningún curso, se lo debe borrar del arreglo de estructuras.

c) Calcular y almacenar el monto a pagar de cada uno de los alumnos teniendo en cuenta que los cursos de Química y Matemática cuestan $190 c/u, y el resto $240 c/u.

d) Ingresar por teclado un turno y generar un archivo binario que contenga los datos de los inscriptos en ese turno ordenado alfabéticamente por Apellido y nombre, escribiendo: Apellido y nombre, cantidad de cursos y el nombre completo de cada uno de los cursos en los que se inscribieron. El nombre del archivo estará formado por una primera letra que

Page 88: COMPUTACION II INFORMATICA II - UNSJdea.unsj.edu.ar/informatica2/recursos/Guias de... · considera como rechazada. Se deben ingresar los valores de densidad correspondientes a N muestras

Computación II / Informática II – Guía de Problemas Con Punteros, Estructuras y Archivos

88

corresponde al turno ingresado, seguido del año que deberá ser leído también por teclado y con la extensión ".dat"

e) Calcular cual es el curso que tiene más inscriptos indicando el nombre del curso correspondiente.

Problema 141 Una entidad financiera que administra y gerencia una tarjeta de crédito, al final del día, guarda en un archivo de texto toda la información de las compras realizadas por sus clientes durante el día que transcurrió. Los datos por cada compra realizada son los siguientes: • DNI del usuario (entero largo) • Apellido y Nombre del Usuario (alfanumérico) • Código del comercio donde realizó la compra (entero) • Hora de la compra (entero largo en la forma hhmmss) • Cantidad de tipos de productos comprados (entero de 1 a 10) • Cantidades de cada uno de los productos comprados (conjunto de enteros) • Precio unitario de cada tipo de los productos comprados (conjunto de reales). El archivo se denomina “CreditMMDD.txt” , donde MMDD corresponde al mes y día del corriente año, los cuales deberán en forma separada ingresarse por teclado y validarse sus valores antes de usarlos. Se pide diseñar un programa en lenguaje C que realice las siguientes tareas. a) Leer el contenido del archivo de texto y almacenarlo en un arreglo dinámico de estructuras.

Tenga en cuenta que deberá agregar a la estructura arriba descripta un campo destinado a almacenar el monto total de la compra para cada usuario.

b) Calcular el importe total de cada compra, completando el campo correspondiente en la estructura de datos.

c) Se debe calcular y mostrar el monto total que deberá abonar la empresa a cada uno de los comercios en los que se realizaron las operaciones de compra (tener en cuenta que en un mismo comercio pueden haber comprado más de un usuario). Además, esta misma información debe ser almacenada en un archivo de texto de nombre “pagos.txt”, donde se especifique el código de cada comercio y el monto a pagar, de manera que cada línea en este archivo de texto tenga la forma:

[codigo de comercio] [monto a pagar] d) Listar por pantalla los códigos de los comercios en los que se realizó por lo menos una

compra en un intervalo de tiempo de media hora en más o en menos respecto de una hora y minutos ingresados por teclado.

e) Se dispone de un archivo binario llamado “limite.dtt” , el cual contiene los DNI de todos los usuarios y su importe límite de crédito disponible hasta el momento. Este archivo debe ser actualizado con aquellos usuarios que hicieron uso de la tarjeta durante el día, descontando de dicho límite el monto gastado. En caso de haber un exceso de compra sobre el importe límite, este tomará un valor negativo, en ese caso se deberá mostrar por pantalla el nombre y DNI de los usuarios que tienen excedido el límite de compra.