[C con Clase] lista ciudad-personas

Toni tsptoni en gmail.com
Dom Abr 11 01:13:17 CEST 2010


Muchas gracias David, al final de mucho pensar mas tu ayuda logre que
funcione perfectamente:

void AlmacenarCiudad (T_ciudad& datos, const string& ciudad, bool& ok){

        //La primera vez que añado una ciudad, siempre dice que ya existe,
luego ya funciona
        //correctamente, si existe, avisa y no la añade, si no existe, la
añade y da mensaje afirmativo.
        // (SOLUCIONADO)

        T_ciudad aux;
        ok=false; //inciamos en false para decir que no hubo cambio, por lo
cual se añadio bien, sino es asi, cambiara a true.
        aux=datos;


        if (datos!=NULL){
        while ((aux->sig!=NULL) && (aux->ciutat!=ciudad)){

           aux=aux->sig;
         }
          if (aux->ciutat==ciudad){
              ok=true;  //la ciudad ya existe

           }
           if (aux->ciutat!=ciudad){
              aux->sig = new nodo1;
              aux->sig->ciutat=ciudad;
              aux->sig->sig=NULL;
          }
          }
          else{
            datos=new nodo1;
            datos->ciutat=ciudad;
            datos->sig=NULL;
            aux=datos;
          }
   if (ok==true){ //true y false funcionan correctamente
     cout<<"La ciudad ya existe"<<endl<<endl;
    }
    else{
       cout<<"La ciudad se anadio correctamente"<<endl<<endl;
     }
     system("PAUSE");
 }


y el otro quedo asi:

void AlmacenarPersona (T_ciudad& datos, const string& ciudad, const string&
persona, bool& ok){

     if (datos!=NULL){
       T_ciudad aux;
       T_persona aux2;
       aux=datos;
       ok=false;

         while ((aux->sig!=NULL)&&(aux->ciutat!=ciudad)){
           aux=aux->sig;
       //    system("PAUSE");
           }
        if (aux->ciutat==ciudad){
          ok=true;

             if(aux->per!=NULL){
               aux2=aux->per;
               aux->per=new nodo;
               aux->per->nombre=persona;
               aux->per->pers=aux2;
        //          cout<<"bucle persona2";
        //          system("PAUSE");
              }
             if (aux->per==NULL){
             aux->per=new nodo;
             aux2=aux->per;
             aux2->nombre=persona;
             aux2->pers=NULL;
             aux->per=aux2;
             }
         }
                         //Si introduzco una ciudad que no existe para
almacenar una persona
                         //en lugar de decir que no encontro la ciudad, el
programa da error...
                         // (SOLUCIONADO)
         if (ok==false){
           cout<<"No se ha encontrado la ciudad, no se almaceno la
persona"<<endl;
          }
         if (ok==true){
           cout<<"Se almaceno correctamente"<<endl;
          }

      }
     system("PAUSE");
 }


Muchas gracias!

El 10 de abril de 2010 22:23, Steven Davidson <srd4121 en njit.edu> escribió:

> Hola Toni,
>
>
> Toni wrote:
>
>> Hola buenas tardes,
>>
>> He escrito un programa para un trabajo, y me ocurren 2 pequeños
>> errores.
>> El programa en sí funciona, salvo los 2 errores que ahora explico:
>>
>> El primero es que cuando almaceno una ciudad, lo hace correctamente
>> pero da el mensaje "La ciudad ya existe", aun asi la añade, y las
>> posteriores ciudades que añado funciona correctamente, es decir, si
>> la ciudad realmente existe, dara el aviso y no la añadira, y si no se
>> encuentra en la lista, la añade y da el mensaje "añadido
>> correctamente".
>>
>>
> Esto ocurre porque realizas el bucle 'while' tanto si la lista 'datos'
> estaba originalmente vacía o no. Date cuenta que la primera sentencia 'if'
> trata el caso particular de una lista vacía. Su consecuencia es que agregas
> el nodo a 'datos' y por tanto, no necesitas hacer nada más. Deberías
> terminar de inmediato. El esquema del programa sería:
>
> // Caso particular: lista vacía => 0 nodos
> if( !datos )
> {
>  ...
> }
> else  // Caso general: lista existente => > 0 nodos
> {
>  ...
> }
>
> if( ok ) { ... }
> else { ... }
>
>
> De hecho, no necesitas usar 'aux' en el caso particular de una lista vacía.
>
>
>  El segundo error es cuando quiero almacenar a una persona, si añado
>> una persona a una ciudad existente, lo hace bien y da el aviso
>> "añadido correctamente", en cambio, si digo que añada a una persona a
>> una ciudad que no se encuentra en la lista, el programa en vez de
>> decir que no existe tal ciudad, lo que hace es dar un error y se
>> cierra.
>>
>>
> En primer lugar, si la lista está vacía, no sabemos el valor de 'ok'.
> Deberías asginar un valor inicial a 'ok'. Por ejemplo,
>
> ok = false;
>
> if( !datos )
> {
>  ...
> }
>
> if( ok )  ...
> else  ...
>
> En segundo lugar, al terminar el bucle 'while', inmediatamente accedes al
> miembro 'ciutat' apuntado por 'aux'. Sin embargo, no tienes en cuenta la
> posibilidad de que 'aux' sea nulo. Si se da este caso, entonces el acceso es
> denegado y lógicamente el sistema operativo te dará un error.
>
> Tienes que comprobar que 'aux' es un puntero válido antes de intentar
> usarlo. Por ejemplo,
>
> while( ... )  {...}
>
> if( aux )  // Si 'aux' es válido, entonces 'aux->ciutat == ciudad'
> {
>  ok = true;
>  ...
> }
>
> Por último, no veo que sea necesario usar 'aux2' en el caso de que la
> ciudad no contenga ninguna persona. Como 'aux->per' es nulo, el primer nodo
> que creamos va a ser el único nodo que va a tener a estas alturas.
>
>
> Espero que todo esto te sea de ayuda.
>
> Steven
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100411/e6b8cdfb/attachment.html>


Más información sobre la lista de distribución Cconclase