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


1. (2 puntos)
a)  Escriba la definición de archivo y nombre las funciones que operan sobre ellos anivel binario. 
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.
b) ¿ Cual es la diferencia entre archivo tipo texto y uno tipo binario?
Solución :
El archivo tipo texto almacena los datos, incluyendo los numéricos, en código ascii imprimible.
El archivo de tipo binario almacena los datos de la forma que se almacenan en la memoria, incluyendo los formatos numéricos, usando la representación que usa la CPU (arquitectura).
c) Solución: La cuarta línea de la estructura b incluye en forma anidada a la estructura a, lo cual no representa problema. Pero la estructura incluye en forma anidada nuevamente a la estructura b. La conecuencia de esto es que abria anidamiento imposible por que una estructura se debe contener a si misma.
struct a{ 
int z;
struct b s;
struct a *p;
};
struct b{
int x;
char c[10];
struct a r;
struct b *siguiente;
};
d) Solución:
struct n{
char m[256];
struct n *anterior;
struct n *siguiente;
};
run
__\__ __     __ __ __   __ __ __
|--->|  |  |  |--->|  | | |--->|  |  |  |- --|
| |--|__|__|__|<---|__|__|__|<---|__|__|__|<-| |
| |__________________________________________| |
|______________________________________________|

aux = (struct n *)malloc(sizeof(struct n));
aux->siguiente = run->siguiente;
aux->anterior = run;
aux->siguiente->anterior = aux;
run->siguiente = aux;
2. (1 punto)
a) Solución: El programa imprime: 11 y la función
imprime en formato octal el entero.

b) Solución:
int a[5][5]={200,200,300,40,6,
300,200,800,60,0,
100,200,200,40,5,
700,200,800,10,0,
200,200,300,40,6};

int yy(int mat[5][5], int col){
int i,s=0;
for (i = 0; i < 5; i++)s = s + a[i][col];
return s;
}

void zz(int x[5][5]){
int i,j;
for (i = 0; i < 5; i++){
for (j = 0; j < 5; j++)printf("%d ",a[j][i]);
printf("\n");
}
}

main(int argc, char * argv[]){
printf("%d\n",yy(a,atoi(argv[1])));
zz(a);
}

3. (1 punto) 
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 copie desde un archivo a otro nuevo, sólo las estructuras que tienen un valor negativo en su saldo. Al final, debe imprimir desde este nuevo archivo los nombres de los clientes con saldo negativo. Los nombres de los archivos se deben pasar como los argumentos 1 y 2  de main y se debe chequear que estén presentes al ejecutarse. La estructura usada en los archivos es la siguiente:
struct cliente {
int saldo;
char nombre[100];
};
Solución:
main(int argc, char * argv[]){
FILE *f, *f1;
struct cliente aux;
f = fopen(argv[1], "r+b");
f1 = fopen(argv[2], "w");
while(fread(&aux,1, sizeof(struct cliente),f)>0)
if(aux.saldo < 0) fwrite(&aux,1, sizeof(struct cliente),f1);
fclose(f);
fclose(f1);
f1 = fopen(argv[2], "r+b");
while(fread(&aux,1, sizeof(struct cliente),f1)>0)printf("%s\n",aux.nombre);
fclose(f1);
}