1a)
  • Memoria: para almacenar programas y datos.
  • CPU (Unidad Central de Procesos): para realizar las instrucciones del programa.
  • Controladores de E/S: para controlar a los dispositivos periféricos.
  • Buses: para transportar datos y programas entre Memoria, CPU y Controladores.
1b)
programa fuente 1 ---> compilador ----> programa objeto 1
programa fuente 2 ---> compilador ----> programa objeto 2

programa objeto 1 -->|
| -->  enlazador ---> programa ejecutable
programa objeto 2 -->|


1c)
  • Identificador: Nombres usados para referirse a las variables, identificar  funciones o  etiquetas  definidos por el usuario. Ejemplo:   abc_76r
  • Palabra reservada: identificador reservado del lenguaje y no puden ser cambiado. Ejemplo: for
  • Variable Global: variable que es definida fuera de las funciones y es visible a todas ellas. Ejemplo:
int x;
main(){
x = ......;
}
  • Puntero: es una variable cuyo contenido es una dirección de memoria. Ejemplo:  int *p;
1d)
 Una variable local al igual que una variable que es declarada como argumento de una función, tiene existencia sólo dentro de la función y mientras esta está en ejecución. La diferencia es que la el valor inicial de la variable argumento es el valor que tiene el parámetro de la llamada a la función.
Ejemplo:
main(){
fun(5);
}
void fun(int a){
int x = 1;
... = a ....; // a vale 5
}

2.(2 puntos) Qué imprimen los siguientes programas:
 
a) Imprime:
Hola
Chao
Hola
struct s {
      char m[40];
};
void estructura(struct s b);
main(){
     struct s a;
     strcpy(a.m,"Hola");
     estructura(a);
  printf("%s\n",a.m);
}
void estructura(struct s b){
     printf("%s\n",b.m);
     strcpy(b.m,"Chao");
     printf("%s\n",b.m);
}


b) Imprime:
0
0
999
888
777

int dato[2];
main(){
     int x;
  x = almacen(999);
       printf("%d\n",x);
       x = almacen(888);
       printf("%d\n",x);
       x = almacen(777);
       printf("%d\n",x);
       x = almacen(666);
       printf("%d\n",x);
       x = almacen(555);
       printf("%d\n",x);
}
int almacen(int entrada){
        int salida;
     salida = dato[1];
       dato[1] = dato[0];
      dato[0] = entrada;
      return salida;
}
c)  Imprime:
1108544020
1108544020
1108544020
1108544020
1108544020


"son variables locales inicilaizadas con valores indeterminados."
main(){
 int x;
  x = almacen(999);
       printf("%d\n",x);
       x = almacen(888);
       printf("%d\n",x);
       x = almacen(777);
       printf("%d\n",x);
       x = almacen(666);
       printf("%d\n",x);
       x = almacen(555);
       printf("%d\n",x);
}
int almacen(int entrada){
     int dato[2]; 
   int salida;
     salida = dato[1];
     dato[1] = dato[0];
     dato[0] = entrada;
     return salida;
}
d)  Imprime:
334
main(){
  int x=333;
    int *y;
y = &x;
  *y = *y + 1;
    printf("%d\n", x);
}
e) Imprime:
222
555
struct s {
      int x;
  struct s *p;
};
main(){
  struct s a, b;
  a.p = &b;
  a.x = 555;
  b.p = &a;
  b.x = 222;
  printf("%d\n", a.p->x);
  printf("%d\n", a.p->p->x);
}


-----


3.
(2 puntos)
 
a) Crear una función  que ordene de menor a mayor el contenido de tres variables enteras que son locales a las funciones que la llaman. El prototipo de debe ser:
void ordena(int ..., int ..., int ....);
Se debe reemplazar correctamente los puntos suspensivos de los parámetros del prototipo.
- si sabe intercambiar 0,3 ptos.
- si sabe usar parámetros por referencia: 0,3 ptos. 

void ordena(int *x,int *y, int *z){
int aux;
if(*x > *y){aux = *x;*x=*y;*y=aux;}
if(*y > *z){aux = *y;*y=*z;*z=aux;}
if(*x > *y){aux = *x;*x=*y;*y=aux;}
}

b) Crear una función que retorne el menor dígito decimal de un número almacenado en una variable entera. El prototipo debe ser:

int menor(int n);
- Si sabe separar los dígitos 0,5 ptos.
- Si sabe terminar la separación 0,3 ptos.

int menor(int x){
int menor,y;
y = x % 10;
menor = y;
while(x > 0){
x = x/10;
y = x % 10;
if ((menor > y)&&(x>0))menor =y;
}
return menor;
}

4. (2 puntos)

Hacer un programa que lea por teclado un string de unos y ceros, debe imprimir "aceptar" si el string tiene un número par de dígitos y es simétrico. Ej.: 11000011,     00011000
- Si hace comparación con índices correctos: 0,5 ptos.
- Si itera adecuadamente: 0,5 ptos.
- si determina que es par el número de caracteres del string: 0,5 ptos.

char s[100];
main(){
int i,igual=1;
scanf("%s",s);
if(strlen(s)%2==0){
for(i=0;i<strlen(s)/2;i++){
if(s[i]!=s[strlen(s)-1-i])igual=0;
}
if(igual==1)printf("aceptar\n");
}
}