elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  duda matriz
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda matriz  (Leído 4,563 veces)
EMANI

Desconectado Desconectado

Mensajes: 2


Ver Perfil
duda matriz
« en: 30 Mayo 2022, 02:00 am »

buenas tardes tengo un problema  en el siguiente codigo requiero que imprima los asientos en una tabla pero el problema que tengo es que este solo registra cualquier valor en la fila de I por lo que es lo unico que me falla por lo que requiero una guia en que estoy mal y que debo hacer para que me registre en las demas filas saludos.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char asiento[9][9];
  5. int x,i,j, butaca;
  6. char a, fila;
  7.  
  8.  
  9. void iniciar(void);
  10. void reserva(void);
  11.  
  12. void mostrar (void);
  13.  
  14. int main (){
  15. int op1;
  16. iniciar ();
  17. for(;;){
  18.  
  19. printf("seleccione una opcion\n");
  20. printf("1- mostrar asientos\n");
  21. printf("2- reservar asientos\n");
  22. printf("4- salir");
  23. scanf("%d",&op1);
  24. switch (op1){
  25. case 1:
  26. mostrar();
  27. break;
  28.  
  29. case 2:
  30. reserva();
  31. break;
  32.  
  33. case 4:
  34. exit(1);
  35. break;
  36. default:break;
  37. }
  38. }
  39. }
  40.  
  41.  
  42. void iniciar(void){
  43. x=0;
  44. for(i=0;i<9;i++){
  45. for (j=0;j<5;j++){
  46. asiento [i][j]='0';
  47. }
  48. }
  49. }
  50. void reserva(void){
  51. do{
  52. printf("solo letras mayusculas de la A a la I\n");
  53. printf("Ingrese la Letra de la fila :\n");
  54. scanf("%c",&fila);
  55.  
  56. while(getchar() != '\n');
  57. } while(fila < 'A' || fila > 'I' );
  58.  
  59. do{
  60. printf("solo numeros de 0 a 4\n");
  61. printf("Ingrese numero asiento :\n");
  62. scanf("%d",&butaca);
  63.  
  64. while(getchar() != '\n');
  65. }while(butaca < 0 || butaca > 5) ;
  66.      if(fila =='A')
  67. x=0;
  68.     if(fila =='B')
  69. x=1;
  70.    if(fila =='C')
  71. x=2;
  72.    if(fila =='D')
  73. x=3;
  74.    if(fila =='E')
  75.        x=4;
  76.    if(fila=='F')
  77.        x=5;
  78.    if(fila=='G')
  79.        x=6;
  80.    if(fila=='H')
  81.        x=7;
  82.    if(fila='I')
  83.        x=8;
  84.  
  85.  
  86. if(asiento[x][butaca-1]=='X'){
  87. printf("el asiento %c%d Ya esta reservado\n vuelva a ingresar su reserva\n",fila,butaca);
  88. reserva();
  89. }else{
  90. printf("Usted eligio la fila %c numero %d\n", fila, butaca);
  91. asiento [x][butaca-1]= 'X';
  92. }
  93.  
  94. }
  95.  
  96.  
  97. void mostrar (void){
  98. a='A';
  99. printf("\t");
  100. for (j=0;j<5;j++){
  101. printf("%d ",j);
  102. }
  103. printf("\n");
  104.    for(i=0;i<9;i++){
  105. printf("%c\t", a);
  106. a= a+1;
  107. for (j=0;j<5;j++){
  108. if (j<5)
  109. printf("%c ",asiento[i][j]);
  110. else
  111. printf(" %c ",asiento[i][j]);
  112. }
  113. printf("\n");
  114. }
  115.  
  116. }


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.357


Ver Perfil
Re: duda matriz
« Respuesta #1 en: 30 Mayo 2022, 18:23 pm »

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):
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:

Código:
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.
         
Código:
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).

Código:
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.


« Última modificación: 30 Mayo 2022, 18:38 pm por Serapis » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: duda matriz
« Respuesta #2 en: 30 Mayo 2022, 21:14 pm »

Y otra cosa importante a tener en cuenta que creo que no se ha mencionado:
En la línea 82 tienes lo siguiente:
Código
  1. if(fila='I')
  2.  x=8;

No estás comparando si 'fila' es igual a 'I'. Estás asignando el valor 'I' a 'fila.
Esta instrucción se considera 'true' siempre ya que 'I' (en ASCII) es distinto de 0.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
EMANI

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: duda matriz
« Respuesta #3 en: 31 Mayo 2022, 01:15 am »

ok muchas gracias por su asistencia me pondre a ello en el caso de la I entonces utilizare otro orden de letras para que no tenga que utilizarla o en su defecto utilizare numeros lo que cuele primero saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
duda con arrays o matriz?
Programación Visual Basic
ricardovinzo 4 3,856 Último mensaje 10 Junio 2008, 23:36 pm
por CeLaYa
Duda - Buscar si existe una matriz dentro de otra matriz
Programación Visual Basic
EddyW 2 5,847 Último mensaje 14 Agosto 2010, 06:18 am
por EddyW
duda resultado de matriz [resuelto y con for incluido :) ]
Programación C/C++
flony 7 4,361 Último mensaje 16 Octubre 2010, 01:53 am
por Akai
Duda con la matriz de cadena en C.
Programación C/C++
orehmu 1 1,683 Último mensaje 1 Abril 2015, 05:12 am
por rir3760
Duda con matriz
Programación C/C++
bistec 1 1,613 Último mensaje 7 Abril 2017, 17:37 pm
por n-utz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines