Está en la página 1de 12

Oposicions Informàtica

Problemes de programació
Índex de problemes per categories
1. Oposicions València 1999.....................................................................................................................1
2. Oposicions València 2000.....................................................................................................................1
3. Oposicions València 2001.....................................................................................................................2
4. Oposicions València 2002.....................................................................................................................4
5. Oposicions València 2004.....................................................................................................................8
6. Oposicions València 2005.....................................................................................................................9
7. Oposicions València 2006.....................................................................................................................9
8. Oposicions València 2006...................................................................................................................10
9. Oposicions València 2007...................................................................................................................10
10. Oposicions València 2009.................................................................................................................10
Oposicions Informàtica

1. Oposicions València 1999


Un árbol binario de búsqueda es aquel que cumple que todos los valores almacenados en el
subárbol izquierdo de cualquier nodo X son menores que el valor almacenado en X, y que todos
los valores almacenados en el subárbol derecho de cualquier nodo X son mayores que el valor
almacenado en X.

Desarrollar un programa en C, sin utilizar programación recursiva, que permita manipular un


árbol binario de búsqueda para datos de tipo entero que no se repitan. Concretamente el
programa deberá mostrar un menú inicial con las operaciones de inserción , búsqueda y
borrado de nodos. Si el usuario del programa desea crear una árbol binario de búsqueda,
deberá utilizar el módulo Insertar_nodo tantas veces como datos desee almacenar en la
estructura. El módulo Insertar_nodo permitirá crear tanto el nodo raíz como cualquier otro
nodo. El módulo Buscar_nodo devolverá la dirección o ubicación del nodo cuyo valor coincida
con el dato suministrado por el usuario o en su defecto NULL.

El módulo Borrar_nodo, eliminará un nodo con un determinado valor. Para simplificar esta
última operación, supondremos que el nodo a eliminar tiene un solo subárbol o ninguno.

2. Oposicions València 2000


Desarrollar un programa en lenguaje C, cuyo cuerpo sea un menú que permita las siguientes
opciones relativas al mantenimiento de nombres de ciudades:
OPCION 1.- Añadir nueva ciudad.
OPCION 2.- Visualizar todas las ciudades registradas.
OPCION 3.- Eliminar todas las ciudades registradas.
OPCION 4.- Finalizar la ejecución del programa.

La estructura de datos a utilizar será un array de punteros a bloques de memoria obtenidos por
petición dinámica. Cada uno de dichos bloques será del tamaño mínimo imprescindible para
almacenar la cadena de caracteres que supone cada uno de los nombres de ciudades en
cuestión. El array podrá referenciar hasta un máximo de 10 nombres de ciudad.

Para la introducción de datos por teclado se desarrollará una función de entrada filtrada de
caracteres, la cual dará por concluida la introducción del nombre de una ciudad al pulsar la
tecla RETURN. Para ello se utilizará una función estándar que capture el código de la tecla
pulsada, sin eco ni confirmación, devolviéndolo como valor de retorno.

No se podrá utilizar ninguna función estándar de manipulación de cadenas de caracteres.


Deberán ser desarrolladas en el caso de tener necesidad de ellas.

Minimizar en la medida de lo posible el uso del operador indexación “[]”, sustituyéndolo por la
utilización de punteros.

A. Moll, J. Murgui, J, Vidal 1


Oposicions Informàtica

3. Oposicions València 2001


i. ¿Cuál será la salida del siguiente programa?
#include <stdio.h>
#define TEXTO ”PALABRA”
void main(void) {
printf(“%f\n”,129.4573);
printf(“%2d\n\n”,335);
printf(“%3.2f\n”,128.444);
printf(“%5s\n”,TEXTO);
printf(“%-10.2s\n”,TEXTO);
}

a) b) c) d)
129.4573 129.4573 129.4573 error
33 335 335

128.44 128.44 128.44


TEXTO PALABRA PALABRA
TO PA PA

ii. La clase de almacenamiento que se toma por defecto en C para las variables locales es:

a) register
b) static
c) auto
d) int

iii. En C se suele llamar función a todos los subprogramas que:

a) Devuelven algun valor.


b) No devuelven algún valor.
c) Pueden devolver o no algún valor.
d) El valor devuelto debe ser de tipo int.

iv. ¿En cuál de los siguientes programas se utiliza correctamente el paso de parámetros
por referencia?

a) #include <stdio.h> b) #include <stdio.h>


int cuadrado(int val); int cuadrado(int *val);
void main(void) { void main(void) {
int n=5; int n=5;
n=cuadrado(n); n=cuadrado(&n);
printf(“\n%d^2=%d”,5,n); printf(“\n%d^2=%d”,5,n);
} }
int cuadrado(int val) { int cuadrado(int *val) {
Oposicions Informàtica

val*=val; *val*=*val;
return(val); }
}
c) #include <stdio.h> d) El lenguaje C no permite paso por
int cuadrado(int &val); referencia.
void main(void) {
int n=5;
n=cuadrado(*n);
printf(“\n%d^2=%d”,5,n);
}
int cuadrado(int &val) {
*val*=*val;
}

v. ¿Cuál de los programas siguientes recibe un nombre como parámetro en la línea de


comandos y lo muestra por pantalla con todos los caracteres en mayúsculas?

a) #include <stdio.h> b) #include <stdio.h>


void main (int n, char *p[]){ #include <ctype.h>
int i=0; void main (int argc, char
while(p[1][i]!=’\0’) { *argv[]){
if((p[1][i]>=’a’) && (p[1] int i=0;
[i]<=’z’)) while(argv[i]!=’\0’) {
p[1][i]=p[1][i]+’A’-‘a’; argv[i]=toupper(argv[i]);
i++; i++;
} }
printf(“\n%s”,p[1]); printf(“\n%s”,argv[1]);
} }
c) #include <stdio.h> d) No se puede pasar parámetros en la
#include <ctype.h> línea de comandos.
void main(int argc, char
*argv[]){
int i=0;
char nombre[80];
printf(“\nIntroduzca un
nombre en la línea de
comandos: “);
scanf(“%s”,nombre);
while(nombre[i]!=’\0’){
nombre[i]=toupper
(nombre[i]);
i++;
}
printf (“\n%s”,nombre]);
}

A. Moll, J. Murgui, J, Vidal 3


Oposicions Informàtica

vi. Para crear una lista enlazada hay que realizar:

a) Sólo una llamada a la función malloc al principio.


b) Sólo una llamada a la función calloc al inicio.
c) Una llamada a la función malloc por cada elemento de la lista.
d) Sólo podemos insertar por la cabeza de la lista.

vii. ¿Qué ocurrirá si se asigna un valor a un elemento de un array estático cuyo índice
excede el tamaño del array?

a) El elemento valdrá 0.
b) Error de compilación.
c) Otros datos pueden ser sobrescritos.
d) Se aumenta el tamaño del segmento de datos.

viii. ¿Cuál será la salida del siguiente programa?


#include <stdio.h>
void main(void) {
int x=5; int *px=&x;
printf(“%d”,*px);
for(++*px; putchar(‘*’),*px;printf(“%2d”,*px), --*px)
putchar(‘#’);
}

a) error de compilación
b) 5*# 4*# 3*# 2*# 1*
c) 5*# 6*# 5*# 4*# 3*# 2*# 1*#
d) 5*# 6*# 5*# 4*# 3*# 2*# 1*

ix. Dada la siguiente instrucción:


if (fseek (f1, valor, SEEK_SET)) puts(“error”);

a) f1 es una estructura.
b) valor es de tipo int.
c) el puntero se posiciona tomando como origen el fin del fichero.
d) Todas las anteriores son falsas.

4. Oposicions València 2002


i. Dadas las definiciones de tipos:

#define LCAD 81
typedef struct
{
int c1;
char c2[LCAD];
Oposicions Informàtica

char c3;
float c4;
} Treg;

typedef struct
{
int c1;
float c2;
char c3;
char cad1[LCAD],cad2[LCAD],cad3[LCAD];
} R;

typedef Treg* Ptreg;

Y las siguientes declaraciones de variables:

char c;
int i,j;
int * pi;
float x;
char palabra[LCAD];
FILE *f, *fdat, *ftxt;

Se define:

typedef struct { int dia, mes, anyo; } Fecha;


typedef struct {long dni; Fecha fecha_nacim;} Tp;
Tp* p;

Indique cuál de las siguientes expresiones recoge por teclado el mes de nacimiento del
registro apuntado por p:

a) scanf ("%d", *p.fecha_nacim.mes);


b) scanf ("%d", p->fecha_nacim.mes);
c) scanf ("%d", &p->fecha_nacim.mes);
d) scanf ("%d", p->&fecha_nacim.mes);

ii. Para crear una lista enlazada hay que realizar:

a) Sólo una llamada a la función malloc al principio


b) Sólo una llamada a la función calloc al inicio
c) Una llamada a la función malloc por cada elemento de la lista
d) Una llamada a la función malloc para el primero y el último elemento de la lista

iii. Dada la invocación: hacer (*pi,&x,palabra,fdat); podemos decir que el


prototipo de este procedimiento es:

A. Moll, J. Murgui, J, Vidal 5


Oposicions Informàtica

a) void hacer (int, float *, char [], FILE *);


b) void hacer (int *, float *, char [], FILE *);
c) void hacer (int , *float, char *, FILE *);
d) void hacer (int, float &, char [], FILE *);

iv. Dada la definición:


R registro = {28, 25.6, 'A', "Manuel", "Alonso", "García"};
Indique cuál de las siguientes sentencias permite acceder a la 'c' de García:

a) registro.cad3[3]
b) registro[3].cad3[3]
c) registro [5][3]
d) registro[3].cad3

v. Una función tiene que ordenar una tabla t de registros de tipo Treg por el campo c3.
La sentencia de comparación entre dos elementos de la tabla dentro de la función es:

a) if (t[i]->c3 < t[j]->c3)


b) if (t[i].c3 < t[j].c3)
c) if (strcmp(t[i].c3,t[j].c3)<0)
d) if (*(t[i].c3) < *(t[j].c3))

vi. Para detectar el final de una cadena de caracteres char s[10], que almacena la
palabra “HOLA”, el lenguaje C:

a) Almacena en el elemento 0 la longitud de la cadena, es decir, s[0] valdría 4.


b) Coloca un carácter ‘\0’ después del último carácter utilizado, es decir, s[4]
valdría ‘\0’.
c) Coloca un carácter ‘\0’ en la última posición declarada de la cadena, es decir,
s[9] valdría ‘\0’.
d) Ninguna de las anteriores.

vii. Para acceder al número entero almacenado en la componente 3 de un vector de


registros declarado como:
struct {
int c1;
char c2;
} v[10];

a) v[3].int
b) v(3).c1
c) v.c1[3]
d) (v+3)->c1

viii. Dado un fichero binario de registros de tipo Treg, la sentencia que posiciona el cursor
de lectura preparado para leer el tercer registro es:

a) fseek(fdat,3*sizeof(Treg),SEEK_SET);
Oposicions Informàtica

b) fseek(fdat,2*sizeof(Treg),SET_SEEK);
c) fseek(fdat,2*sizeof(Treg),SEEK_SET);
d) fseek(fdat,3*sizeof(Treg),SEEK_CUR);

ix. ¿Qué doble bucle for imprime los elementos de una matriz n x n que se encuentren por
debajo de la diagonal principal? Es decir dada int t[3]
[3]={1,2,3,4,5,6,7,8,9} imprimiría 4 7 8.

a) for(i=0;i<n;i++) for(j=0;j<i;j++) printf ("%d ",t[i][j]);


b) for(i=0;i<n;i++) for(j=0;j<i+1;j++) printf ("%d ",t[i][j]);
c) for(i=0;i<n;i++) for(j=i;j<n;j++) printf ("%d ",t[i][j]);
d) for(i=0;i<n;i++) for(j=0;j<=i;j++) printf ("%d",t[i][j]);

x. Si fdat es una variable fichero asociada al fichero binario datos.dat, para abrirlo sólo
para escribir y borrar su contenido si fdat existe, la sentencia necesaria es:

a) fopen(fdat,"datos.dat","wb");
b) fopen("datos.dat","wb",fdat);
c) fdat = fopen("datos.dat","wb+");
d) fdat = fopen("datos.dat","wb");

xi. Se declara char s[20];, se ejecuta la siguiente instrucción: scanf("%s", s); se


introduce por teclado: PEPITO GRILLO, e inmediatamente se ejecuta la instrucción:
puts(s); ¿Cuál de los siguientes literales se visualizará en la pantalla?

a) PEPI
b) PEPITO GRILLO
c) PEPITO
d) PEPIT

xii. Si se declara: float x, *p; ¿Cuál de las siguientes expresiones es correcta?

a) p=&x;
b) x=p*;
c) &x=p;
d) &p=x;

xiii. Sea el siguiente código:


void desplaza (int t[], int *pos) {
t[*pos]=0;
if (*pos <= 9)
*pos=0;
else
*pos++;
t[*pos]=1;
}

Si la tabla de enteros tab contiene los valores {0,0,0,0,0,0,0,0,0,0} y la variable

A. Moll, J. Murgui, J, Vidal 7


Oposicions Informàtica

entera posicion tiene el valor 9, ¿cuál será el contenido de la tabla tab tras la llamada
desplaza (tab,&posicion); ?

a) {1,0,0,0,0,0,0,0,0,0}
b) {1,0,0,0,0,0,0,0,0,1}
c) {0,0,0,0,0,0,0,0,0,1}
d) {0,0,0,0,0,0,0,0,0,0}

xiv. Si se quiere leer una variable c de tipo carácter de un fichero de texto denominado
ftxt, una posible sentencia sería:

a) &c=fgetc(ftxt);
b) fscanf("%c",&c,ftxt);
c) fscanf(ftxt,"%c",c);
d) fscanf(ftxt,"%c",&c);

xv. El siguiente fragmento de código se compila correctamente, pero tiene errores que
pueden provocar resultados inesperados durante la ejecución. Indicar dónde están estos
errores y explicar brevemente por qué se pueden producir.
void main(void) {
int i,j,v[50],*p;
char *s;
float f;

j=10;
for(i=0;i<=10;i++){
v[i]=0;
v[j]=5;
j-=2;
}
s=”Una cadena”;
p=v;
p++;
*p=f;
p=(int *)malloc(50*sizeof(int));
p=&i;
*p=20;
free(p);
}

5. Oposicions València 2004


Proximament
Oposicions Informàtica

6. Oposicions València 2005


Realizar un programa en C para fusionar los datos contenidos en dos ficheros llamados
“agenda1” y “agenda2”. Los ficheros “agenda1” y “agenda2” tienen los siguientes campos:

• Nombre
• Teléfono
• E-mail

Y se encuentran ordenados ascendentemente por el campo Nombre. El fichero resultante se


llamará “agneda3” y también debe quedar ordenado ascendentemente por el mismo campo.
Los campos y longitudes de la estructura de “agenda3” serán:

• Nombre (20)
• Teléfono (15)
• E-mail (20)
• Un cuarto campo que se obtendrá de concatenar los números de telefónico con la
primera letra del e-mail. Su longitud es 25.

El programa se hará utilizando el lenguaje de programación C. No se podrá utilizar la librería


string.h y debe atender a las siguientes indicaciones:

a) Crear la función comparar cadena con la sintaxis:


int compara(cadena1, cadena2);

Esta función devuelve 0 si las dos cadenas son iguales, devuelve 1 si la primera cadena
es mayor que la segunda y devuelve -1 si la segunda es mayor que la primera.

b) Crear la función mezcla ficheros con la siguiente sintaxis:


void mezclar(FILE *pfich1, FILE *pfich2, FILE *pfich3);

c) Si se considera necesario crear una función para concatenar el Teléfono con la primera
letra del E-Mail, la sintaxis será:
void concatena(cadena1, cadena2);

d) La sintaxis de las funciones fopen, fread y fwrite son las siguientes:


int fopen(FILE fichero, modo);
int fread(void *puntero, int tamaño, int numero, FILE *fichero);
int fwrite(void* puntero, int tamaño, int numero, FILE *fichero);

7. Oposicions València 2006


En un programa en C se tiene una lista con cabecera. Los nodos de la lista almacenan nombres
de paises (sin repetir) con sus capitales (estos datos son arrays dinámicos). Diseñar una

A. Moll, J. Murgui, J, Vidal 9


Oposicions Informàtica

función en C que reciba la lista y el nombre de un país y elimine este país con su capital (en
caso de que esté en la lista) o muestre un mensaje (en caso de que no esté). La función debe
realizar las funciones de liberación de memoria necesarias. También se debe declarar la
estructura en C utilizada para los nodos de la lista.

8. Oposicions València 2006


Se define un árbol de Fibonacci de orden n cómo un árbol binario que cumple las siguientes
propiedades:

• Un árbol vacio és un árbol de Fibonacci de orden 0.

• Un árbol con un único nodo es un arbol de Fibonacci de orden 1.

• Un árbol de Fibonacci de orden n > 1 consta de una raiz, un subárbol izquierdo que es
un árbol de Fibonacci de orden n – 1 y un subárbol derecho que és un árbol de
Fibonacci de órden n – 2.

a) Escribir un algoritmo recursivo usando el lenguaje de programación C, tal que, dado un


árbol binario, compruebe si és o no un árbol de Fibonacci y que en caso afirmativo,
devuelva su orden.

b) ¿Cuál seria la profundidad de un árbol de Fibonacci de órden n? Definirlo para todos


los casos possibles.

9. Oposicions València 2007


Proximament

10. Oposicions València 2009


Proximament

También podría gustarte