Auxiliar 1 - CC31A Programación de software sistema Auxiliar: Paul Leger 31 de marzo de 008 Pregunta 1 Para esta pregunta, no puede utilizar funciones de biblioteca de C, salvo malloc. Escriba un programa que utilize una función que concatena dos strings en un string nuevo (copia distinta de sus parámetros, obtenido con malloc) y lo retorna. La función debe tener la siguiente firma: char *concat(char *s1, char *s); Pregunta Escriba un programa en C que invierte las líneas de su entrada en su salida, es decir: %./programa 1 linea 3 final ˆD 3 final 1 linea % Las funciones para leer y escribir líneas son: 1
char *fgets(char *s, int tam, FILE *flujo); int fputs(const char *s, FILE *flujo); La salida estándar es stdout y la entrada estándar es stdin, y se pasan como flujo. Puede suponer un máximo de largo de cada línea (500 chars). No puede suponer un número máximo de líneas en el archivo. Pregunta 3 Programe un scheduler con prioridades para una administración de printjobs. Cada printjob tiene una entidad llamada Job que lo representa en la impresora. Un printjob contiene el tiempo de demora, la prioridad y una descripción opcional del printjob, estos campos son asignados cuando sea una entidad printjob. El scheduler tiene una cola jobs donde están esperando los printjobs para imprimirse. Cuando un job ingresa al scheduler su prioridad es igual a su tiempo de demora, y decrementa mientras esta en la cola y no es ejecutado. El scheduler elige el printjob con menor prioridad para ejecutarlo y extraerlo de la cola en cada ciclo de tiempo. Cuando el scheduler ejecuta un printjob, y por ende lo extrae de cola, permite ingresar otro printjob. Diseñe e implemente las estructuras y funciones necesarias para simular el funcionamiento del scheduler mencionado. Pregunta 4 Para esta pregunta, no puede utilizar funciones de biblioteca de C, salvo malloc. Escriba un programa que implemente la función que busca un patrón dentro de un string. El patrón puede calzar en forma parcial y en ese caso debemos retornar el calce más largo que figura en el string. El string retornado, que es un substring del patrón, debe estar en memoria nueva (pedida con malloc). Si no se encuentra ningún calce de ningún tipo, debe retornar el string vacío. char *substring(char *patron, char *string); Ejemplos: substring("arm", "artista") --> "ar" substring("arm", "arte armado")
--> "arm" substring("arm", "XXXXX") --> "" Pregunta 5 En esta sección ud. debe construir programas que utilizen las siguientes funciones. 1. char *DescomponerNumero(int). La función debe recibir un número entero y debe entregar un string que contenga la descomposición del número en números primos. printf( Descomposicion 100 es %s,descomponernumero(140)); Descomposicion 100 es **5*5. int contardigitos(int). La función devuelve cuantos digitos tiene un numero. printf( Los digitos de 4535 es %d,contardigitos(4535)); Los digitos de 4535 es 4 Pregunta 6 Escriba un programa que construya un árbol binario con una función recursiva que construya un árbol binario de búsqueda (los hijos izquierdos siempre tienen elementos menores al nodo y los hijos derechos siempre tienen elementos mayores). La función debe retornar un árbol binario nuevo (pedido con malloc) que contiene los elementos de un arreglo ordenado de menor a mayor. La función es: typedef struct Tree { int val; struct Tree *left; 3
struct Tree *right; }Tree; Tree *maketree(int a[], int i, int j); La función solo usa los elementos entre a[i] y a[j] (inclusives). Por lo que la primera llamada para obtener todos los elementos de un arreglo con n elementos es: int a[n]; tree = maketree(a[], 0, n-1); La lógica de la función es siempre dejar como raíz del árbol al elemento que está en la mitad del arreglo y dejar en el sub-árbol izquierdo los elementos anteriores a ese y en el sub-árbol derecho a los posteriores. Pregunta 7 Explique claramente cual es el problema de este programa. Por qué se produce el error?. Nota: Grafique el uso de la memoria. #include<stdio.h> int contar = 0; void recursiva() { contar++; if (contar%100 == 0 ) printf("\nllamada %d",contar); } recursiva(); int main() { recursiva(); 4
} printf("\nfinal \n"); return 0; 5