Tercera Experiencia. Laboratorio de Estructuras de Computadores 02/2000 a) Estudiar los siguientes programas en C. b) Compilarlos en ambiente DOS o Windows, en un PC. Estudiar el ambiente de edición, compilación, ligado, y ejecución. Ver las opciones, y setearlas para tener un directorio para dejar los programas ejecutables y los fuentes. c) Ejecutarlos. Observar las salidas, entendiendo los algoritmos de las diferentes funciones. 1. Operadores al bit. Pasos por referencia. #include <stdio.h> void prt(int); /*prototipos. Ya que las funciones se definen después de main*/ void f2(int * ); void f1(int * ); int main(void) { int i=1024; prt(i); i = 0x25; f1(&i); prt(i); i = -1; prt(i);f2(&i); prt(i); return(1); } void f1(int *i) {* i = (*i | 0x8000); } void f2(int *i) { *i = (*i>>3); *i = (*i&0x7fff); } void prt(int i) { int j; for (j=15; j>=0; j--) (1<< j )&i ? printf("1") : printf("0"); printf("\n"); } 2. Pasos por referencia y por valor. #include <stdio.h> int f1(int *, int); int f2(int *, int); int main(void) { int k,m =1; k = f1(&m,5); printf("%3d \n %3d ", k,m); k = 2; m = 3; m= f2(&m,m); printf("%3d \n", m ); k = 4; m = 6; k = f1( &m, f1(&m,3)+5 ); printf("%3d \n %3d \n", k, m); Laboratorio de Estructuras de Computadores. Lab03 16-08-00 1 return(1); } int f1(int *i , int j) { j = j+*i ; *i = *i-j; return(*i+j); } int f2(int *i, int j) { *i = j+3+*i; return(2*j+*i); } 3. Estructuras. #include <stdio.h> struct punto{ int x; int y; }; struct molde{ int a[2]; char c; struct punto p; }; struct molde m1={{1,2},'p',{3,4}}, m2={{5,6},'q',{7,8}}; struct molde *pm=&m2; int *pi=&(m1.p.y); int main(void) { printf("%d \n", *pi ) ; printf("%d \n",m2.a[1] + m1.p.x ); printf("%d \n", pm->a[1] + pm->p.x ); printf("%d \n", *(pi-1)) ; pi = &m2.a[0]; printf("%d \n", *(pi+1)); return(1); } 4. Pasos por valor y por referencia. Cast. #include <stdio.h> int func(int *, float *, char); void show(); float f1=1.0,f2=2.2; int i1=2, i2; int main(void) { i2 = func(&i1, &f2, '1'); show(); i1 = func(&i2, &f1, '2'); show(); return(1); } Laboratorio de Estructuras de Computadores. Lab03 16-08-00 2 void show(void) { printf("\ni1= %d i2= %d",i1, i2); printf("\nf1= %f f2= %f",f1, f2); } int func(int *i, float *f, char ch) { *f = (float)(*i+2); *i = (int)(*f)+2; printf("\n%c ", ch); return(*i+2); } Para el punto: a) En el punto 1: Qué efectúa la función prt. Qué tipo de corrimiento efectúa f2( con o sin signo) Qué sucede si se cambia el tipo a unsigned en f2( el corrimiento será con o sin signo?) Usando la rutina de impresión probar una función(que tiene que diseñar) que corra a la derecha sin signo una variable(pasada por referencia), la cantidad de bits especificada en un segundo argumento(pasado por valor). b) Explicar los valores que se imprimen en punto 3. c) Probar que sucede si no se colocan los cast del punto 4. ¿Dónde se detecta dicha omisión? ¿Al compilar o al ejecutar? Laboratorio de Estructuras de Computadores. Lab03 16-08-00 3