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

 

 


Tema destacado: Curso de javascript por TickTack


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

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Ayuda Codigo C++
« en: 26 Noviembre 2014, 23:55 pm »

Pues tengo el problema de que cuando ejecuto el codigo todo sale bn, exepto la parte donde me dice las clases no asignadas, en la varaible edif.clasesasignadas lo uso para verificar si la clases fue o no asignada pero no funciona correctamente el resto si funciona bn!

Gracias por cualquier ayuda que me puedan brindar!

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <time.h>
  5.  
  6. using namespace std;
  7.  
  8. typedef struct edif{
  9. int edificio [5][5]={{21,35,36,41,20},{22,34,30,28,40},{25,31,27,25,36},{33,32,26,24,41},{37,23,29,37,38}};
  10. /*Se llena la matriz con valores estaticos para el programa */
  11. int salonvacios[5][5]; //Variable para saber que salones ya se encuentra ocupados.
  12. int clases[25] = { }; //Variable para guardar tamano de clases.
  13. int clasesasignadas[25]; //Varibale para saber clases no asignadas.
  14. int tamigual; //Variable para asignaciones iguales.
  15. int tam05=0; //Varibale para asignaciones diferencia 5.
  16. int tam10=0; //Varibale para asignaciones diferencia 10.
  17. int tam15=0; //Varibale para asignaciones diferencia 15.
  18. int tam20=0; //Varibale para asignaciones diferencia 20.
  19. int salonesnoasignados=0; //Contador Salones no asigandos.
  20. int clasesnoasignado=0; //Contador Clases no asignadas.
  21. int salonesasignados=0; //Contador Salones asigandos.
  22. int clasesasignado=0;  // Contador clases asignadas
  23. int temp0 = 0; //Variable temporal
  24. int temp1 = 0; //Variable temporal
  25. int temp2 = 0; //Variable temporal
  26. int temp3 = 0;
  27. };
  28.  
  29. edif edif;
  30.  
  31. int main(){
  32. srand(time(NULL));
  33. for (int q=0;q<25;q++){
  34. edif.clases[q]=20+(rand()%41); // Asigna valores al azar desde 20 a 60 para el numero de personas por clase
  35. /*Si el numero de peresona se predefine en la estructura eliminar esta linea*/
  36. edif.clasesasignadas[q] = 0;
  37. /*Se asigan valores en 0 en dado caso que que la direccion de memoria ya tenga un dado por OS*/
  38. cout << edif.clases[q] << endl;
  39. }
  40. for(int q =0; q<5; q++){
  41. for(int w=0; w<5; w++){
  42. edif.salonvacios[q][w] = 0;
  43. /*Se asigan valores en 0 en dado caso que que la direccion de memoria ya tenga un dado por OS*/
  44. }
  45. }
  46. for(int q=0;q<25;q++){
  47. edif.temp0=edif.clases[q];
  48. for(int w=0;w<5;w++){
  49. for(int e=0;e<5;e++){
  50. if((edif.temp0 == edif.edificio[w][e]) && (edif.salonvacios[w][e] == 0) ){
  51. edif.salonvacios[w][e] = 1;
  52. edif.clasesasignadas[q] = 1;
  53. edif.salonesasignados++;
  54. edif.clasesasignado++;
  55. edif.tamigual++;
  56. break;
  57. }
  58. edif.temp1 = edif.temp0 + 5;
  59. if((edif.temp1 > edif.edificio[w][e]) && (edif.temp0 < edif.edificio[w][e]) && (edif.salonvacios[w][e] == 0) ){
  60. edif.salonvacios[w][e] = 1;
  61. edif.clasesasignadas[q] = 1;
  62. edif.salonesasignados++;
  63. edif.clasesasignado++;
  64. edif.tam05++;
  65. break;
  66. }
  67. edif.temp1 = edif.temp0 + 10;
  68. if((edif.temp1 > edif.edificio[w][e]) && (edif.temp0 < edif.edificio[w][e]) && (edif.salonvacios[w][e] == 0) ){
  69. edif.salonvacios[w][e] = 1;
  70. edif.clasesasignadas[q] = 1;
  71. edif.salonesasignados++;
  72. edif.clasesasignado++;
  73. edif.tam10++;
  74. break;
  75. }
  76. edif.temp1 = edif.temp0 + 15;
  77. if((edif.temp1 > edif.edificio[w][e]) && (edif.temp0 < edif.edificio[w][e]) && (edif.salonvacios[w][e] == 0)){
  78. edif.salonvacios[w][e] = 1;
  79. edif.clasesasignadas[q] = 1;
  80. edif.salonesasignados++;
  81. edif.clasesasignado++;
  82. edif.tam15++;
  83. break;
  84. }
  85. edif.temp1 = edif.temp0 + 20;
  86. if((edif.temp1 > edif.edificio[w][e]) && (edif.temp0 < edif.edificio[w][e]) && (edif.salonvacios[w][e] == 0) ){
  87. edif.salonvacios[w][e] = 1;
  88. edif.clasesasignadas[q] = 1;
  89. edif.salonesasignados++;
  90. edif.clasesasignado++;
  91. edif.tam20++;
  92. break;
  93. }
  94. }
  95. }
  96. cout
  97. << "El numero de salones del edificion son 25" << endl
  98. << "El numero de clases a asignar son de 25" << endl
  99. << "Numero de salones Asignados" << endl
  100. << edif.salonesasignados << endl
  101. << "Numero de Salones Libres" << endl
  102. << 25-edif.salonesasignados << endl
  103. << "Numero de clases Asignadas" << endl
  104. << edif.clasesasignado << endl
  105. << "Igual" << endl
  106. << edif.tamigual << endl
  107. << "Diferencia de 5" << endl
  108. << edif.tam05 << endl
  109. << "Diferencia de 10" << endl
  110. << edif.tam10 << endl
  111. << "Diferencia de 15" << endl
  112. << edif.tam15 << endl
  113. << "Diferencia de 20" << endl
  114. << edif.tam20 << endl
  115. << "Numero de Salones No asignados" << endl
  116. << 25-edif.salonesasignados << endl
  117. << "Numero de clases no Asignadas" << endl
  118. << 25-edif.clasesasignado << endl;
  119.  
  120. for (int q=0;q<25;q++){
  121. if(edif.clasesasignadas[q] == 0){
  122. edif.clasesnoasignado++;
  123. cout
  124. << "\t\t La clase numero " <<  "   " << q << "no fue asignada. Tiene un valor de" <<  "   "<< edif.clases[q] << endl;
  125. }
  126. }
  127. for (int q=0;q<5;q++){
  128. for (int w=0;w<5;w++){
  129. if(edif.salonvacios[q][w] == 0){
  130. edif.salonesnoasignados++;
  131. cout
  132. << "\t\t El Salon numero " <<  "   " << q << "- " << w << "no fue asignado. Tiene un valor de" <<  " " << edif.edificio[q][w] << endl;
  133.  
  134. }
  135. }
  136. }
  137.  
  138. }


En línea

tremolero

Desconectado Desconectado

Mensajes: 270


Ver Perfil
Re: Ayuda Codigo C++
« Respuesta #1 en: 27 Noviembre 2014, 00:20 am »

Hola Judiu, pero cual es el problema que te salen warning y los quieres quitar, o directamente no te ejecuta?

Yo por lo que he visto te falta un "}"

Si no te ejecuta seguramente sera eso.

Un saludo.


En línea

Judiu

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Ayuda Codigo C++
« Respuesta #2 en: 27 Noviembre 2014, 00:28 am »

Si ejecuta totalmente el problema es el siguiente




Los resultados de las clases asignadas son correctos mietras el numero de la clase no asignada si no corresponde!!
En línea

tremolero

Desconectado Desconectado

Mensajes: 270


Ver Perfil
Re: Ayuda Codigo C++
« Respuesta #3 en: 27 Noviembre 2014, 00:51 am »

a ver, estoy mirando el codigo asi por encima, asi que si me lo explicas tu, mejor para todos.

Pero te digo, por lo que veo, siempre muestra 1.

ese valor lo saca de aqui "edif.clasesasignado"

y por lo que veo, eso lo manipulas dentro de los if que tienes en un for, por lo que veo esos if, estan cubriendo todas las posibilidades sino me equivoco eso lo sabras tu, porque no voy a comprobrarlos, la cosa es simple, si cubren todas las posibilidades y le dices al for que haga 24 pasadas, con esto "edif.clasesasignado++;" estas haciendo que ponga un 24, si al final le restas 25, siempre te va a dar uno.

Asi que si quieres explicas correctamente y te intento ayudar a encontrar el fallo, o tal vez tu ya me has entendido y has visto en lo que fallas.

Un saludo.
En línea

Judiu

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Ayuda Codigo C++
« Respuesta #4 en: 27 Noviembre 2014, 01:05 am »

Mira lo que hacer los for con ayuda de los if es hacer comparaciones entre edif.edificio y edif.clases de tal forma que si el salon es igual a la clase este deterimine que tanto el salon ya esta ocupado como la clase, esto lo hago para que cuando vuelva a pasar con el siguiente for no asigna dos clases a un mismo salon, con respecto a los salones a los que se asignaron clases estos si estan bien ya que los contadores muestras valores correctos con esto quiero decir que si se asignaron 23 clases por consiguiente 2 clases no fueron asignadas hasta hay bien, ahora me piden que diga que clase es la que no fue asignada para el caso de los salones si te fijas en la imagen el salon 0-4 no fue asignado y en la linea numero de salones no asignados esta corrrectamente que solo fue 1 salon al que no se le asigno clase, ahora bien las clases tambien dice que fue una que no se le asigno salon pero al quere mostrar que clases fueran las que no se les asignaron salones es cuando hay incoherencia en los resultados!!

En línea

tremolero

Desconectado Desconectado

Mensajes: 270


Ver Perfil
Re: Ayuda Codigo C++
« Respuesta #5 en: 27 Noviembre 2014, 01:31 am »

Vale, y una pregunta, tu sabes cual de los dos es el correcto?
el numero que hay debajo de "numero de clases no asignado" o el listado que se muestra despues?
En línea

Judiu

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Ayuda Codigo C++
« Respuesta #6 en: 27 Noviembre 2014, 01:37 am »

El numero de clases no asignado ya que si lo verificas con el numero de clases asignadas que es 24 y para un total de 25 entonces 25-24=1
Agregandole que el numero de salones asignados y el numero de clases asginadas tiene que ser iguales.




PD Pido disculpas por usar Paint, es que estoy de afan.
En línea

tremolero

Desconectado Desconectado

Mensajes: 270


Ver Perfil
Re: Ayuda Codigo C++
« Respuesta #7 en: 27 Noviembre 2014, 01:47 am »

Bueno a ver, ya he visto como solucionarlo, te explico mi metodo de encontrar el problema.

1.- Localizo en el codigo el error que has visto, en este caso hay un contador y luego un listado, asi que tenemos.

"edif.clasesasignado" esto es el contador.

if(edif.clasesasignadas[q] == 0) y esta la condicion que se debe cumplir para salir en la lista.

2.- busco en el codigo donde tienen relacion y veo que coinciden en varios puntos en este trozo.

Código:
for(int q=0;q<25;q++){
edif.temp0=edif.clases[q];
for(int w=0;w<5;w++){
for(int e=0;e<5;e++){
if((edif.temp0 == edif.edificio[w][e]) && (edif.salonvacios[w][e] == 0) ){
edif.salonvacios[w][e] = 1;
edif.clasesasignadas[q] = 1;
edif.salonesasignados++;
edif.clasesasignado++;
edif.tamigual++;
break;
}
edif.temp1 = edif.temp0 + 5;
if((edif.temp1 > edif.edificio[w][e]) && (edif.temp0 < edif.edificio[w][e]) && (edif.salonvacios[w][e] == 0) ){
edif.salonvacios[w][e] = 1;
edif.clasesasignadas[q] = 1;
edif.salonesasignados++;
edif.clasesasignado++;
edif.tam05++;
break;
}
edif.temp1 = edif.temp0 + 10;
if((edif.temp1 > edif.edificio[w][e]) && (edif.temp0 < edif.edificio[w][e]) && (edif.salonvacios[w][e] == 0) ){
edif.salonvacios[w][e] = 1;
edif.clasesasignadas[q] = 1;
edif.salonesasignados++;
edif.clasesasignado++;
edif.tam10++;
break;
}
edif.temp1 = edif.temp0 + 15;
if((edif.temp1 > edif.edificio[w][e]) && (edif.temp0 < edif.edificio[w][e]) && (edif.salonvacios[w][e] == 0)){
edif.salonvacios[w][e] = 1;
edif.clasesasignadas[q] = 1;
edif.salonesasignados++;
edif.clasesasignado++;
edif.tam15++;
break;
}
edif.temp1 = edif.temp0 + 20;
if((edif.temp1 > edif.edificio[w][e]) && (edif.temp0 < edif.edificio[w][e]) && (edif.salonvacios[w][e] == 0) ){
edif.salonvacios[w][e] = 1;
edif.clasesasignadas[q] = 1;
edif.salonesasignados++;
edif.clasesasignado++;
edif.tam20++;
break;
}
}
}

3.- Asi que viendo que el error debe de estar ahi, analizo que puede ocurrir y veo lo siguiente:

edif.clasesasignadas[q] = 1;
edif.clasesasignado++;

Ahi ya veo el error, resulta que estan dentro de un triple for, en el primero siempre le vas a escribir "1" aunque entre muchas veces pero en el segundo si entran varias veces se le sumara tantas veces como entre. Asi que ahi esta el problema, no he analizado si esos for son correctos y necesarios al igual que si los if son correctos, ya que no se exactamente que quieres hacer.

Asi que la solucion es que solo lo escriba una vez igual que en el primero.

Espero que lo hayas entendido, he preferido no ponerte la solucion al pie de la letra, de todas maneras si quieres que te la ponga, dimelo y te la escribo.

Un saludo.
En línea

Judiu

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Ayuda Codigo C++
« Respuesta #8 en: 27 Noviembre 2014, 02:06 am »

Tenienndo en cuenta lo que has dicho decidi hacer algo y que en el IF comprube si tambien la si la clase no se le ha asigando valor y ha funcionado ahora el problema es el siguiente y es que las comparaciones no funcionan bien con esto me refieron es que e numero de salones sin asingar son demasiados.

Código
  1. for(int q=0;q<25;q++){
  2. edif.temp0=edif.clases[q];
  3. for(int w=0;w<5;w++){
  4. for(int e=0;e<5;e++){
  5. edif.temp4 = edif.edificio[w][e];
  6. if((edif.temp0 == edif.temp4) && (edif.salonvacios[w][e] == 0) && (edif.clasesasignadas[q] == 0)){
  7. edif.salonvacios[w][e] = 1;
  8. edif.clasesasignadas[q] = 1;
  9. edif.salonesasignados++;
  10. edif.clasesasignado++;
  11. edif.tamigual++;
  12. break;
  13. }
  14. edif.temp1 = edif.temp0 + 5;
  15. if((edif.temp1 >= edif.temp4 >= edif.temp0) && (edif.salonvacios[w][e] == 0) && (edif.clasesasignadas[q] == 0) ){
  16. edif.salonvacios[w][e] = 1;
  17. edif.clasesasignadas[q] = 1;
  18. edif.salonesasignados++;
  19. edif.clasesasignado++;
  20. edif.tam05++;
  21. break;
  22. }
  23. edif.temp1 = edif.temp0 + 10;
  24. if((edif.temp1 >= edif.temp4 >= edif.temp0) && (edif.salonvacios[w][e] == 0) && (edif.clasesasignadas[q] == 0)){
  25. edif.salonvacios[w][e] = 1;
  26. edif.clasesasignadas[q] = 1;
  27. edif.salonesasignados++;
  28. edif.clasesasignado++;
  29. edif.tam10++;
  30. break;
  31. }
  32. edif.temp1 = edif.temp0 + 15;
  33. if((edif.temp1 >= edif.temp4 >= edif.temp0) && (edif.salonvacios[w][e] == 0) && (edif.clasesasignadas[q] == 0)){
  34. edif.salonvacios[w][e] = 1;
  35. edif.clasesasignadas[q] = 1;
  36. edif.salonesasignados++;
  37. edif.clasesasignado++;
  38. edif.tam15++;
  39. break;
  40. }
  41. edif.temp1 = edif.temp0 + 20;
  42. if((edif.temp1 >= edif.temp4 >= edif.temp0) && (edif.salonvacios[w][e] == 0) && (edif.clasesasignadas[q] == 0) ){
  43. edif.salonvacios[w][e] = 1;
  44. edif.clasesasignadas[q] = 1;
  45. edif.salonesasignados++;
  46. edif.clasesasignado++;
  47. edif.tam20++;
  48. break;
  49. }
  50. }
  51. }
  52. }

Para que te hagas una idea esto es lo que me piden

1. Hacer una asignación de los salones del edificio de acuerdo:

a. En primer lugar que el tamaño del salón sea igual al tamaño de la clase o curso, sin repetir el salón o clase asignada.

b. En segundo lugar que el salón asignado tenga un tamaño con una diferencia máximo cinco (5) estudiantes con respecto al tamaño de la clase, sin repetir el salón o clase asignada.

c. En tercer lugar que el salón asignado tenga un tamaño de diez (10) más con respecto al tamaño de la clase, sin repetir el salón o clase asignada.

d. En cuarto lugar que el salón asignado tenga un tamaño de 15 más con respecto al tamaño de la clase, sin repetir el salón o clase asignada.

e. En quinto lugar que el salón asignado tenga un tamaño a lo sumo 20 más con respecto al tamaño de la clase, sin repetir el salón o clase asignada.
En línea

tremolero

Desconectado Desconectado

Mensajes: 270


Ver Perfil
Re: Ayuda Codigo C++
« Respuesta #9 en: 27 Noviembre 2014, 02:06 am »

El numero de clases no asignado ya que si lo verificas con el numero de clases asignadas que es 24 y para un total de 25 entonces 25-24=1
Agregandole que el numero de salones asignados y el numero de clases asginadas tiene que ser iguales.




PD Pido disculpas por usar Paint, es que estoy de afan.

Esto no es correcto, ya que como te he explicado realmente el numero es el que esta mal, y el listado el que esta bien, por el hecho de que el listado tambien recorrer el triple for, la diferencia esta en que el primero aunque entre varias veces siempre escribe "1", sin embargo en el otro el contador sigue sumando. eso significa que en una situacion en el que en el primero se escribe un "1", en el otro el contador puede sumar 3 veces, eso significa que puede dar un resultado mayor el contador que el otro.

Ademas el contador tiene una resta con un numero estatico "25", es decir, el mismo numero que muestras arriba es el mismo numero que muestras abajo restandole 25, asi que al sumar ambos van a dar 25 si o si.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con Codigo
Programación Visual Basic
Mitsu_POWA 1 1,994 Último mensaje 26 Julio 2005, 00:25 am
por byebye
Ayuda con codigo en C (no me ejecuta un for y necesito ayuda) « 1 2 3 »
Programación C/C++
Søra 22 11,555 Último mensaje 22 Mayo 2010, 00:22 am
por Littlehorse
¿Cuál es la diferencia entre código objeto, código máquina y código binario?
Programación General
Aikanáro Anário 9 28,985 Último mensaje 23 Diciembre 2010, 15:19 pm
por pucheto
ayuda codigo
Programación C/C++
kunai 3 2,493 Último mensaje 1 Junio 2011, 12:56 pm
por Akai
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines