Pauta de correxión Certamen 2 Lenguaje de Programación
Jorge López R.


1. (1 punto)
a) Escriba la definición de archivo y describa lo que hace  cada una de las funciones que operan sobre ellos.
Solución:
definición:
Es una colección de información relacionada
Definida por su creador
.

fopen: abre un archivo.
fclose: cierra un archivo.
fread: lee en modo binario desde un archivo.
fwrite: graba en modo binario en un archivo.
fseek:  pposiciona el puntero dentro de un archivo.
ftell: devuelve el número del byte que está indicando el puntero dentro de un archivo.
fprintf: escribe en modo text dentro de un archivo.
fscanf: lee en modo texto desde un archiv

b) Escriba una definición de algoritmo.
Solución (una de las siguientes):
  • Es un procedimiento computacional bien definido que toma algún valor, o un conjunto de valores, como entrada y produce algún valor, o un conjunto de valores, como salida.
  • Es una secuencia de pasos computacionales para transformar la entrada en la salida.
  • Es una herramienta para solucionar un problema computacional bien especificado.
c) Solución: La cuarta línea hace imposible la existenacia de esta estructura porque implica que dentro de la estructura debe ir la misma estructura anidada hasta el infinito.
struct a{ 
int x;
char c[10];
struct a anterior;
struct a *siguiente;
};
d) Corrija el problema c), obtenga dinámicamente la memoria para dos instancias y haga el encadenamiento.
Solución:
struct a{ 
int x;
char c[10];
struct a *anterior;
struct a *siguiente;
};
struct a *p;
p = (struct a *)malloc(sizeof(struct a));
p->siguiente = (struct a *)malloc(sizeof(struct a));
p->siguiente->anterior=p;

2. (1 punto)
a) Solución: El siguiente programa imprime Correcto si se le entrega un argumento con cadenas de paréntesis que se encuentren pareados: (n)n
char * parA(char *, char *);
main(int argc, char * argv[]){
char *nextchar;
nextchar=parA(&argv[1][0],&argv[1][1]);
if (*nextchar == '\0')printf("Correcto\n");
else printf("Incorrecto\n");
}
char * parA(char *a,char *b){
if((*a == '
(')&&(*b == ')')) return b+1;
else if((*a == '(')&&(*b == '('))return parA(b,b+1)+1;
else exit(1);
}

b) Hacer una función que devuelva la suma de la diagonal principal de una matriz MxM:

Solución:
int a[5][5]={1,2,3,4,1,
6,1,8,1,0,
1,2,1,4,5,
6,1,8,1,0,
1,2,3,4,1};
main(){
printf("%d\n",sumaDiagonal(a,5));
}

int sumaDiagonal(int *mat, int M){
int i,s=0;
for(i=0;i<M;i++)s=s+(*(mat+M*i+i));
return s;
}

//solución para límite fijo (mitad de puntaje)
:
int sumaDiagonal(int mat[5][5], int M){
int i,s=0;
for(i=0;i<M;i++)s=s+mat[i][i];
return s;
}

3. (2 puntos) 
a) Se debe hacer la especificación formal  de la búsqueda recursiva  del nodo de una lista encadenada que contiene un entero k y devolver el puntero. Debe incluir la situaciones particulares de lista vacía y no existencia de un nodo que contenga a k. Sólo se cuenta con un puntero al final del la lista.
Solución:
           Entrada: puntero a lista, entero k
        Salida:    puntero a nodo que contiene entero igual a k
               /
               |   0L si p == 0L
busca(p, k) <   p si p->k == k
             |   busca(p->prox) si p->k != k
               \
 
b) Crear una función en C que implemente la especificación formal de a)  La estructura del nodo y la declaración del puntero:
struct nodo {
int k;
struct nodo *prox;
};
struct nodo *ultimo;

Solución:

struct nodo *busca(struct nodo * l, int K){
if (l==0L)return 0L;
else if (l->k==K)return l;
else return busca(l->prox,k);
}

4. (2 puntos)
Hacer un programa que rote circularmente  un archivo de enteros. El último pasa al primero. Suponga que existe la función:
 int fsize(FILE *), devuelve el número de bytes del archivo.
Solución que rota desde el primero en dirección al último:
#include <stdio.h>
main(){
FILE *f;
int entero, aux,i;
int NunEnteros;
f = fopen("aaa", "r+b");
NunEnteros = fsize(f)/sizeof(int);
fseek(f,-(sizeof(int)),SEEK_END);
fread(&aux,1, sizeof(int),f); //salva el último entero
for (i = NunEnteros-1;i>0;i--){
//copia anterior en el siguiente
fseek(f,(sizeof(int))*(i-1),SEEK_SET);
fread(&entero,1, sizeof(int),f);
fseek(f,(sizeof(int))*(i),SEEK_SET);
fwrite(&entero,1, sizeof(int),f);
}
fseek(f,0,SEEK_SET);
fwrite(&aux,1, sizeof(int),f); //guarda el último en el primero
fclose(f);
}