Ayuda Codigo C++

Iniciado por Judiu, 26 Noviembre 2014, 23:55 PM

0 Miembros y 1 Visitante están viendo este tema.

Judiu

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 (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <time.h>

using namespace std;

typedef struct edif{
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}};
/*Se llena la matriz con valores estaticos para el programa */
int salonvacios[5][5]; //Variable para saber que salones ya se encuentra ocupados.
int clases[25] = { }; //Variable para guardar tamano de clases.
int clasesasignadas[25]; //Varibale para saber clases no asignadas.
int tamigual; //Variable para asignaciones iguales.
int tam05=0; //Varibale para asignaciones diferencia 5.
int tam10=0; //Varibale para asignaciones diferencia 10.
int tam15=0; //Varibale para asignaciones diferencia 15.
int tam20=0; //Varibale para asignaciones diferencia 20.
int salonesnoasignados=0; //Contador Salones no asigandos.
int clasesnoasignado=0; //Contador Clases no asignadas.
int salonesasignados=0; //Contador Salones asigandos.
int clasesasignado=0;  // Contador clases asignadas
int temp0 = 0; //Variable temporal
int temp1 = 0; //Variable temporal
int temp2 = 0; //Variable temporal
int temp3 = 0;
};

edif edif;

int main(){
srand(time(NULL));
for (int q=0;q<25;q++){
edif.clases[q]=20+(rand()%41); // Asigna valores al azar desde 20 a 60 para el numero de personas por clase
/*Si el numero de peresona se predefine en la estructura eliminar esta linea*/
edif.clasesasignadas[q] = 0;
/*Se asigan valores en 0 en dado caso que que la direccion de memoria ya tenga un dado por OS*/
cout << edif.clases[q] << endl;
}
for(int q =0; q<5; q++){
for(int w=0; w<5; w++){
edif.salonvacios[q][w] = 0;
/*Se asigan valores en 0 en dado caso que que la direccion de memoria ya tenga un dado por OS*/
}
}
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;
}
}
}
cout
<< "El numero de salones del edificion son 25" << endl
<< "El numero de clases a asignar son de 25" << endl
<< "Numero de salones Asignados" << endl
<< edif.salonesasignados << endl
<< "Numero de Salones Libres" << endl
<< 25-edif.salonesasignados << endl
<< "Numero de clases Asignadas" << endl
<< edif.clasesasignado << endl
<< "Igual" << endl
<< edif.tamigual << endl
<< "Diferencia de 5" << endl
<< edif.tam05 << endl
<< "Diferencia de 10" << endl
<< edif.tam10 << endl
<< "Diferencia de 15" << endl
<< edif.tam15 << endl
<< "Diferencia de 20" << endl
<< edif.tam20 << endl
<< "Numero de Salones No asignados" << endl
<< 25-edif.salonesasignados << endl
<< "Numero de clases no Asignadas" << endl
<< 25-edif.clasesasignado << endl;

for (int q=0;q<25;q++){
if(edif.clasesasignadas[q] == 0){
edif.clasesnoasignado++;
cout
<< "\t\t La clase numero " <<  "   " << q << "no fue asignada. Tiene un valor de" <<  "   "<< edif.clases[q] << endl;
}
}
for (int q=0;q<5;q++){
for (int w=0;w<5;w++){
if(edif.salonvacios[q][w] == 0){
edif.salonesnoasignados++;
cout
<< "\t\t El Salon numero " <<  "   " << q << "- " << w << "no fue asignado. Tiene un valor de" <<  " " << edif.edificio[q][w] << endl;

}
}
}

}

tremolero

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.

Judiu

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!!

tremolero

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.

Judiu

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!!


tremolero

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?

Judiu

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.

tremolero

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.

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.

Judiu

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 (cpp) [Seleccionar]
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++){
edif.temp4 = edif.edificio[w][e];
if((edif.temp0 == edif.temp4) && (edif.salonvacios[w][e] == 0) && (edif.clasesasignadas[q] == 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.temp4 >= edif.temp0) && (edif.salonvacios[w][e] == 0) && (edif.clasesasignadas[q] == 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.temp4 >= edif.temp0) && (edif.salonvacios[w][e] == 0) && (edif.clasesasignadas[q] == 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.temp4 >= edif.temp0) && (edif.salonvacios[w][e] == 0) && (edif.clasesasignadas[q] == 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.temp4 >= edif.temp0) && (edif.salonvacios[w][e] == 0) && (edif.clasesasignadas[q] == 0) ){
edif.salonvacios[w][e] = 1;
edif.clasesasignadas[q] = 1;
edif.salonesasignados++;
edif.clasesasignado++;
edif.tam20++;
break;
}
}
}
}


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.

tremolero

Cita de: Judiu 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.

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.