Tienes varios 'pequeños' errores... que incluyendo comentarios te señalo:
- Empezando por la declaración de la matriz. la declaras 'de 9, 9', pero luego la inicializas con: 0-9, 0-4
- Cuando solicitas la butaca, el limite en cambio es 0-5
- Inicializas la matriz 'asiento' (de tipo char), con valor char '0'. Que luego podría confundir... Es aceptable, si lueog eres consecuente con ello, aunque hubiera sido preferible que se declarara como un valor numérico. Al efecto es más útil y además en conjunto sería más util declarar dos constantes (numericas): BUTACA_LIBRE = 0 y BUTACA_OCUPADA = 1
- Igualmente es aceptable que el máximo de filas y de butacas por fila fueren declaradas también como constantes... (cualquier cambio a posterior basta cambiar el valor en 1 solo sitio en todo el código, donde se declaran y asigna el valor de la constante).
- El conjunto 'si fila = letra', podrías meterlo mejor en un bloque switch (salvo que no lo hayais dado aún).
- Tu mayores errores aparecen en (y a lo largo de las siguientes líneas de código):
if (asiento[x][butaca-1]=='X'
----- Primero por restar 1 a butaca. Si (el usuario) eligió la butaca 0, estás preguntando por la butaca -1 (0-1= -1, error que te saltará por que la matriz no lo contempla). Más preocupante aún... ocupada una butaca en la matriz asientos, como preguntas por la butaca anterior podría dar libre u ocupada, pués preguntas por una que no es la solicitada (esto es un error semántico, no habrá ningún mensaje de error, pero el resultado final es incierto), nota como la última butaca de cada fila, jamás será ocupada.
----- Segundo, si la comparación señala que la butaca está ocupada, reinvocas recursivamente la función 'reserva'... no es adecuado invocar una función recursiva sin dos preceptos: Saber que pasará con las variables, invocar innecesariamente... en tu caso al no recibir parámetros, puede parecer que carece de importancia, pero, cuando regrese de una llamada, seguirá ejecutando lo que reste de la función, por lo que sigue afectando a las variables en curso (que se declararon a nivel de módulo y no de función) y por ello, se debe estar seguro que valor mantiene al regreso de cada llamada. No he revisado que sucederá ante tales llamadas, pero es muy fácil que radique ahí lo que parece ser para tí tu error principal...
Pero básicamente porque (la llamada recursiva) es innecesaria...
Es preferible una de dos situaciónes: O bien 'reserva' es una función que devuelve un buleano (en tes caso el nombre de la función no sería el adecuado), solicitando fila y butaca e indicando si el asiento está libre (y por referencia la fila y butaca), y al regreso reinvocar la función o hacer la reserva en función dle valor devuelto... (pero en realidad para un principante esto puede complicarte la cuestión, al tener que mover código entre una función y otra, etc...)
...o bien envuelves todo el código en otro bucle while (es lo más simple en tu caso presente), he aquí en pseudocódigo la adaptación:
funcion reservar
buleano ocupada = FALSE
do
si (ocupada = TRUE)
printf("el asiento %c%d Ya esta reservado\n vuelva a ingresar su reserva\n",fila,butaca);
fin si
... //todo el código previo de la función va aquí
ocupada = (asientos[fila][butaca] == BUTACA_OCUPADA)
while (ocupada == TRUE)
printf("Usted eligio la fila %c numero %d\n", fila, butaca);
asiento [x][butaca]= 'X'; // nota que se ha eliminado el '-1'
fin funcion
Estudia y entiende bien, los cambios mostrados en esta esquematización...
- En la función 'mostrar', esto (lo que sigue) es redundante, solo se diferencia en 'un espacio'. es preferible alterar el dato a presentar, que la diferencia sea más notable no un mero espacio.
if (j<5)
printf("%c ",asiento[i][j]);
else
printf(" %c ",asiento[i][j]);
Es más sensato que la función mostrar señale fila a fila y butaca a butaca el estado del asiento: algo que se vea como (aunque usando un carácter, yo hubiera eligido como libre el carácter '-'):
-: 123456789
-----------------
0: 000XX00XX
1: XX00X0XXX
....
La primera línea es la numeración de cada butaca, y el primer carácter de cada fila, es la numeración de cada fila (sería aún mejor que fuera un carácter A-I, para coincidir con lo que está en uso en el ejercicio, por comodidad yo he puesto un número).
funcion mostrar
imprimir "-: "
bucle para butaca de 0 a 9 // numerar las butacas d ela fila
imprimir butaca
siguiente
bucle para fila de 0 a 9
imprimir salto de línea
imprimir fila + ": "
bucle para butaca de 0 a 9 // imprimir si ocupada o libre
si asiento[fila][butaca] == BUTACA_LIBRE
imprimir "0"
sino
imprimir "X"
fin si
siguiente
siguiente
imprimir salto de línea
fin funcion
...y eso es todo, es tu turno.