Pauta Certamen 1 Lenguaje de Programación 2006 


1. (0.25 puntos c/u)
 
a) Nombre  los componentes del Sistema Procesador y describa la función de cada uno de ellos.
  • 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.
b) Mediante un diagrama, explique el proceso paso a paso para obtener un programa ejecutable a partir de dos archivos fuente.
programa fuente 1 ---> compilador ----> programa objeto 1
programa fuente 2 ---> compilador ----> programa objeto 2

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

c) Describe en palabras lo que ocurre con la siguiente de definición de estructura:
struct s {
      int x;
  struct s *p;
  struct s yo;
};
La línea struct s yo; es un error. No se puede anidar dentro de una variable una variable del mismo tipo porque implica que nuevamente hay otra dentro y asi indefinidamente.
d) Identifica  el error de los siguientes  programas:
main(){
char *x="hola";
char y[10];
scanf("%s",y);
if(x == y)printf("saludando\n");
//resto del programa sin error
}
El error es la comparación de las cadenas x e y. En C no existen como tipo de datos básico y se debe usar una función o comparar caracter por caracter.
main(){
int x;
char s[10];
scanf("%d %s",y,s);
//resto del programa sin error
}

No existe la declaración de la variable "y". No se puede asegurar si se debe usar &. Por ejemplo, estaría correcta si "y" es declarada como sigue:
int *y;
int x;
y = &x;
scanf("%d",y);
pero estaría incorrecta si es declarada:
int y;
2.(0.5 puntos c/u) Qué imprimen los siguientes programas?(si haces el trazado, se valora el procedimiento):
Se evaluará el procedimiento si es que aparece el trazado en la respuesta.
a) 
#define FC
int x[
FC][FC]={1,2,3,
4,5,6,
7,8,9};

int y[
FC]={0,
0,
0};

main(){
int i,j;
for(i=0;i<
FC;i++)
for(j=0;j<
FC;j++)
y[i]=y[i]+x[i][j];
for(i=0;i<
FC;i++)
printf("y[%d]: %d\n",i,y[i]);
}

La impresión es:
y[0]: 6
y[1]: 15
y[2]: 24
b)
void push(int);
int pop(void);
int notEmpty(void);
int dato[100];
int tope=0;
main(){
  int x;
  push(111);

  if(notEmpty()){
x =
pop();
  printf("%d\n",x);
}
  if(notEmpty()){
x =
pop();
  printf("%d\n",x);
}

}
void
push(int in){
  dato[tope]=in;
tope=tope+1;
}
int pop(void){
if(tope>0){
tope=tope-1;
return dato[tope];
}
}
int notEmpty(void){
if(tope > 0) return 1;
else return 0;
}

La impresión es:
111
c)
int buffer(int);
main(){
  int x;
  x =
buffer(111);
  printf("%d\n",x);
  x =
buffer(222);
  printf("%d\n",x);
  x =
buffer(333);
  printf("%d\n",x);
}
int
buffer(int in){
  int dato[2]; 
  int out;
  out = dato[1];
  dato[1] = dato[0];
  dato[0] = in;
  return out;
}

La impesión es indeterminada porque se ha declarado como local a la función buffer el arreglo.

d)
main(){
 int x=987;
 int *y;
y = &x;
x = x/10;
printf("%d\n",x);
 *y = *y%10;
 printf("%d\n",x);
}


La impresión es:

98
8

e)
struct s {
      int x;
  struct s *p;
};
main(){
  struct s a, b, *n;
  a.p = &b;
  a.x = 555;
  b.p = &a;
  b.x = 222;
n = a.p->p;
  printf("%d\n",a.p->x);
  printf("%d\n",a.p->p->x);
printf("%d\n",n->p->x);
}

La impresión es:

222
555
222
3. (1.1 puntos c/u)
 
a) Crear una función  que retorna el menor  de tres variables enteras que son locales a las funciones que la llaman. El prototipo de debe ser:
int menor(int ..., int ..., int ....);
Se debe reemplazar correctamente los puntos suspensivos de los parámetros del prototipo .
int menor (int *x, int *y, int *z){
int menor;
menor = *x;
if(menor > *y)menor = *y;
if(menor > *z)menor = *z;
return menor;
}
b) Crear una función que retorne el promedio de un conjunto almacenado en un vector de 10 enteros.

float promedio(int x[],int m){
    int i;
    int s=0.0;
    for (i=0;i< m;i++)s=s+x[i];
    return s/m;
}
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 impar de caracteres y es simétrico, "rechazar" si no. Ej. aceptar: 1100m0011,     abc9z9cba,  818, etc.
Ej. rechazar: 01, ab1ab, zrrrr, etc.

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