When deleting a user, it is overwritten with the following

1

I am trying to do an exercise of a social network, and the functions are the 9 functions that are presented in the code.

I have two errors right now that I do not know how to solve.

If I add a user, I delete the same user and add it again, I get an error.

This is because users are deleted by overwriting the next user in their position, but of course if I have not added any user it is as if the user existed.

  

Example.

     

Add user pepe, delete user pepe, add user pepe

     

--- error the user already exists.

The second error I think has to do with the first, if I post a public message, delete the last user and add another user, this message is also copied to the user I just added.

(It should not be copied since at the time of publishing the message said user did not exist).

It must be said that I can not add the same user for the previous error.

  

Example

     

There are 4 users, user 1, user 2, user 3, user 4.

     

user 1 posts a public message: hello.

     

We delete user 4 , add user 5 , in the bulletin board you have a message "0" with the identifier of user 1 .

     

It only happens when you add the first one after the previous one is deleted. If we add another user now this will have the empty board.

I leave my code. It is quite dirty, since I made comments with my previous code which I modified and many do not make sense, there are also many cout to test some subfunctions.

#include <iostream>
#include <array>
#include <string>
using namespace std;

///Declaración de constantes
const unsigned  MAXUSERS = 10;
const unsigned MAXAMIGOS = 5;
const unsigned MAXMENSAJES = 15;

///Declaración de tipos
struct TMensaje{
    string id, msg;
};

typedef array<TMensaje,MAXMENSAJES> TListaMensajes;
struct TMuro{
    unsigned tamanyo = 0;                                                      //Asigno a tamanyo el valor cero, para tener un contador de mensajes
    TListaMensajes mensajes;
};

typedef array<string,MAXAMIGOS> TListaAmigos;

struct TUsuario{
    string id;
    TListaAmigos lamigos;
    TMuro muro;
    unsigned a_tamanyo = 0;                                                   //He añadido a_tamanyo para tener un contador de amigos
};

typedef array<TUsuario,MAXUSERS> TListaUsuarios;


struct TRedSocial{
    unsigned tamanyo = 0;                                                    // Asigno a tamanyo un cero para tener un contador de usuarios
    TListaUsuarios usuarios;
};

///FUNCIONES/PROCEDIMIENTOS EXIGIDOS
void inicializar(TRedSocial &red);
    /* Inicializa la Red Social */
void conectar (TRedSocial &red, const string &user,  bool &ok);
    /*Si el usuario con el identificador ‘user’ no existe en la red social  y hay hueco para añadirlo entonces añade un nuevo usuario con el identificador ‘user’ que tiene su lista de amigos y su muro vacíos, y devuelve true en la variable ’ok’; si hay algún error –por ejemplo el array de usuarios está lleno o ya existe el usuario - pues se devuelve ‘false’ en la variable ok.  */
void desconectar (TRedSocial &red, const string &user);
 /*Elimina un usuario de la red social y su identificador en la lista de amigos de otros usuarios; no elimina los mensajes suyos en otros usuarios. No hace nada si el usuario no existe. */
void peticion_amistad (TRedSocial &red, const string &user, const string &id_amigo,  bool &ok);
 /* Inserta un nuevo amigo, es decir el identificador ‘id_amigo’, en la lista de amigos del usuario ‘user’ si este se encuentra en la red social y el amigo no existe, y pone la variable ‘ok’ a true. Si hay algún error –por ejemplo ya existe el amigo, o no existe el usuario, o la lista de amigos está llena- entonces no se hace e nada y se devuelve ‘false’ en la variable ok. */
void  eliminar_amigo(TRedSocial &red, const string &user, const string &id_amigo);
 /* Elimina un amigo identificado por ‘id_amigo’ de la lista de amigos del usuario identificado por ‘user’. No hace nada si no es el caso, o sea, si el usuario ‘user’  no existe o si ‘id_amigo’ no se corresponde con un amigo que exista en su lista de amigos. */
void consultar_amigos(const TRedSocial &red, const string &user,  TListaAmigos &amgs, bool &ok);
 /* Devuelve la lista de amigos del usuario ‘user’ en el parámetro 'amgs' y pone ‘ok’ a true si el usuario existe en la Red Social; devuelve ‘ok’ a false si no es el caso */
void publicarMsg(TRedSocial &red, const string &user, const string &id_amigo, const TMensaje &msg, unsigned int nature, bool &ok);
 /* Añade un nuevo mensaje (es decir, un elemento de tipo 'TMensaje' (que incluye el identificador del usuario que lo manda y el texto en el parámetro ‘msg’) según la naturaleza indicada en el parámetro nature –ver más sobre esto abajo- y pone la variable ‘ok’ a true si todo fue bien; si hay algún error –por ejemplo no existe el usuario ‘suer’- pues se devuelve ‘false’ en la variable ok. */
void consultar_muro(const TRedSocial &red, const string &user, TMuro &muro, bool &ok);
 /* Devuelve el conjunto de mensajes del usuario ‘user’ en el parámetro 'muro' y ‘ok’ a true si el usuario existe en la Red Social; devuelve ‘ok’ a false si no existe el usuario. */
void mostrarUsuario(const TRedSocial &red, const string &user,TMuro &muro,TListaAmigos &amgs, bool &ok);
 /* Muestra en pantalla todos los datos del usuario con el identificador ‘user’, incluyendo los mensajes de su muro si este se encuentra en la red y pone la variable  ok a true; si no existe el usuario se devuelve false en la variable ‘ok’ */
void mostrarTodo(const TRedSocial &red,const string &user,TMuro &muro,TListaAmigos &amgs,bool &ok);
 /* Muestra en pantalla todos los datos de la red social; si está vacía muestra el mensaje de ‘RED VACIA’ */

///OTROS PROCEDMINEOTS/FUNCIONES EMPLEADOS EN LA FUNCIÓN PRINCIPAL.
char menu();
void error(bool ok);
void mostrarAmigos(const TListaAmigos &amgs);
void mostrarMuro(const TMuro &muro);

///OTRAS SUGERENCIAS DE POSIBLES FUNCIONES AUXILIRAES AUNQUE NO SE ESPECIFICA QUÉ HACEN. SIMPLEMENTE SE SUGIERE QUE SE IMPLEMENTEN OTRAS FUNCIONES/PROCEDIMIENTOS AUXILIARES YS E DEJA AL ALUMNO/A DECIDIR CUALES.
//bool existeUser(const TRedSocial &red, string user, unsigned &pos);
//void insertarAmigo (TRedSocial &red, const string &user, const string &id_amigo, unsigned pos1);

//void insertarMsgEnMuroDeAmigo(TRedSocial &red, unsigned pos, const TMensaje &msg, bool &ok);
//bool existeAmigo(const TListaAmigos &a, const string &id_amigo);


//--------------------------------------------------------------------------
///Se facilita la implementación del programa principal pero es sólo una ayuda. Puedes decidir usarlo tal cual está o modificarlo según creas oportuno.
int main()
{

    TRedSocial red;
    char op;
    string user, id_amigo;
    bool ok=true;
    TListaAmigos amgs;
    unsigned int nature;
    TMensaje msg;
    TMuro muro;

    inicializar(red);
    do {
        op = menu();
        switch (op) {
            case '1':
                cout << "Identificador del usuario: ";
                getline(cin, user);

                conectar (red, user, ok);
                break;
            case '2':
                cout << "Identificador del usuario: ";
                getline(cin, user);
                desconectar (red, user);
                break;
            case '3':
                cout << "Usuario que emite la peticion de amistad: ";
                getline(cin, user);
                cout << "usuario que recibe la peticion de amistad: ";
                getline(cin, id_amigo);

                peticion_amistad (red, user, id_amigo, ok);
                break;
            case '4':
                cout << "Usuario del cual eliminar amigo: ";
                getline(cin, user);
                cout << "Amigo a eliminar: ";
                getline(cin, id_amigo);

                eliminar_amigo(red, user, id_amigo);
                break;
            case '5':
                cout << "Identificador del usuario: ";
                getline(cin, user);
                consultar_amigos(red, user,  amgs, ok);
                //mostrarAmigos(amgs);
                break;
            case '6':
                cout << "Usuario que publica el mensaje: ";
                getline(cin, user);
                cout << "Naturaleza del mensaje (0=publico, 1 = amigos, 2 = privado): ";
                do{
                    cin >> nature;
                }while ((nature < 0 || nature > 2));
                cin.ignore();

                if (nature == 2){
                    cout << "Usuario que debe recibir el mensaje privado: ";
                    getline(cin, id_amigo);
                }

                cout << "Mensaje a publicar:";
                getline(cin, msg.msg);
                msg.id = user;

                 publicarMsg(red, user, id_amigo, msg, nature, ok);
                 break;
            case '7':
                cout << "Identificador del usuario: ";
                getline(cin, user);
                consultar_muro(red, user, muro, ok);
              //  mostrarMuro(muro);
                 break;
            case '8':
                cout << "Identificador del usuario: ";
                getline(cin, user);
                mostrarUsuario(red, user,muro,amgs,ok);
                 break;
            case '9':
                mostrarTodo(red,user,muro,amgs,ok);
                break;
        }
        error(ok);
    } while (op != '0');
}
//--------------------------------------------------------------------------
void inicializar(TRedSocial &red){

}

//Funcion que nos indicara si existe un usuario concreto o no , y nos indicara su posicion en el valor  "pos"

bool existeUser(const TRedSocial &red, string user, unsigned &pos){
    bool encontrado;
    int i = 0;
    while(encontrado == false && i < MAXUSERS){

        if(red.usuarios[i].id == user){
            encontrado = true;
            pos = i;
        }
        i++;
    }

    if (encontrado == false){
        cout << "El usuario no existe en la red social" << endl;
    }
    return encontrado;
}

//Funcion que nos indica si la red social esta llena o no

bool redSocialCompleta(const TRedSocial &red){
    bool esta_llena;
    if(red.tamanyo < MAXUSERS){
        esta_llena = false;
    }
    else{
        esta_llena = true;
    }
    return esta_llena;

}

//Funcion que nos indica si existe el amigo de un usuario dado, y si existe , nos indica en que posicion del array se encuentra el usuario, y en que posicion del array de amigos se encuentra el amigo

bool existeAmigo(const TRedSocial &red, const string &id_amigo,unsigned &pos_usuario,unsigned &pos_lista){
    bool existe;
    int i = 0,j = 0;
    for(i = 0; i <= red.tamanyo ; i++ ){
        while(existe != true && j < MAXAMIGOS){
             if(red.usuarios[i].lamigos[j] == id_amigo){
                existe = true;
                pos_usuario = i;    //en que usuarios existe dicho amigo
                pos_lista = j;      // posicion en la lista de amigos de dichos usuarios
            }
            j++;
        }
    return existe;
    }
}

//Funcion que añade un amigo a la lista de amigos de un usuario

void insertarAmigo (TRedSocial &red, const string &user, const string &id_amigo, unsigned pos1){

    for(int i = 0; i <= red.tamanyo ; i++){
        if(red.usuarios[i].id == user){
            pos1 = i;
        }
    }
    red.usuarios[pos1].lamigos[red.usuarios[pos1].a_tamanyo] = id_amigo;       //Añadiremos el amigo en la primera posicion vacia, teniendo en cuenta "a_tamanyo" , que nos indica cuantos amigos hay
    red.usuarios[pos1].a_tamanyo++;                                            //Aumentaremos "a_tamanyo" tras añadir el amigo
}

//Funcion que nos indicara si la lista de amigos de un usuario esta llena, imposibilitando añadir mas amigos

bool lamigos_llena(TRedSocial &red,const string user){
    unsigned pos;
    bool amigos;
    existeUser(red,user,pos);                                     //Comprobamos que existe el usuario y sacamos su posicion con "pos"
    if(red.usuarios[pos].a_tamanyo == MAXAMIGOS){                 //Vemos si el el numero de amigos ("a_tamanyo") coincide con el maximo de amigos
        amigos = true;
    }
    else{
        amigos = false;
    }

    return amigos;

}

//Comprobamos si existe el amigo o no, y en que posicion se encuentra dicho amigo en la lista de amigos
//La diferencia de esta y la anterior funcion "existeAmigo" es que esta no dice la posicion del usuario que es amigo en la red social,
//Se que podria haber hecho solo una funcion pero me he sentido mas comodos con estas dos

bool existe_amigo(TRedSocial &red,const string &user,const string &id_amigo,unsigned &pos_amigo){
    unsigned pos;
    int i = 0;
    bool existe;
    existeUser(red,user,pos);
    do{
       if(red.usuarios[pos].lamigos[i] == id_amigo){
            existe = true;
            pos_amigo = i;
        }
        else{
            existe = false;
        }
        i++;
    }while(existe == false && i < MAXAMIGOS );

    return existe;
}

//Funcion que inserta un mensaje en el muro de todos los usuarios salvo el usuario que lo manda, hecha para el caso de nature = 0(mensaje publico)

void insertarMsgEnMuro(TRedSocial &red,const string &user, unsigned pos, const TMensaje &msg, bool &ok){
    if(existeUser(red,user,pos) == true ){                                                                        //Comprobamos si existe el usuario(lo hacemos principalmente para saber su posicion)
        for(int i = 0; i < red.tamanyo; i++){
            if(red.usuarios[i].id != user){                                                              //Condicion que excluye al usuario que manda el mensaje
                red.usuarios[i].muro.mensajes[red.usuarios[i].muro.tamanyo].id = msg.id;             //Copia en todos los muros el mensaje "msg"
                red.usuarios[i].muro.mensajes[red.usuarios[i].muro.tamanyo].msg = msg.msg;
                red.usuarios[i].muro.tamanyo++;
                ok = true;
            }
        }
    }
    else{
        ok = false;
        cout << "el mensaje que intenta enviar no existe el user" << endl;
    }
}
//Funcion que inserta el mensaje en el muro de todos los amigos del usuario (hecha para el caso de nature = 1)

void insertarMsgEnMuroAmigos(TRedSocial &red,const string &user, unsigned pos, const TMensaje &msg, bool &ok){
    unsigned pos_amig;
    for(int i = 0; i < red.tamanyo ; i++){
        if(red.usuarios[i].id != user){
            if(existe_amigo(red,user,red.usuarios[i].id,pos_amig) == true){                          //Comprobamos tambien si los usuarios de la red social y el que envia el mensaje son amigos
              red.usuarios[i].muro.mensajes[red.usuarios[i].muro.tamanyo].id = msg.id;               //Si lo son copiamos el mensaje msg
              red.usuarios[i].muro.mensajes[red.usuarios[i].muro.tamanyo].msg = msg.msg;
              red.usuarios[i].muro.tamanyo++;
              ok = true;
            }
        }
    }
}
//Funcion que inserta el mensaje solo al usuario seleccionado, que ha de ser su amigo(hecha para el caso de nature = 2)

void insertarMsgEnMuroPrivado(TRedSocial &red,const string &user,const string &id_amigo,unsigned pos,const TMensaje &msg, bool &ok){
    unsigned pos_amig,p_amigo;
    if(existeUser(red,id_amigo,pos_amig) == true){
        if(existe_amigo(red,user,id_amigo,p_amigo) == true){

            red.usuarios[pos_amig].muro.mensajes[red.usuarios[pos_amig].muro.tamanyo].id = msg.id;
            red.usuarios[pos_amig].muro.mensajes[red.usuarios[pos_amig].muro.tamanyo].msg = msg.msg;
            red.usuarios[pos_amig].muro.tamanyo++;
            ok = true;
        }
        else{
            cout << "El usuario y el destinatario no son amigos, no puedes mandar un mensaje privado " << endl;
            ok = false;
        }
    }

    else{
        ok = false;
        cout << "El amigo no existe en la red social , asegurate de que has introducido bien el nombre" << endl;
    }
}

//Funcion que introduce a un usuario en la red social

void conectar (TRedSocial &red, const string &user,bool &ok){
    unsigned pos;
    cout << "el usuario nuevo " << red.usuarios[0].id << endl;

    if( (existeUser(red,user,pos) == false) && redSocialCompleta(red) == false){   //Comprobamos si existe el usuario que queremos introducir y si la red social esta completa

        red.usuarios[red.tamanyo].id = user;                                       //Tras cumplir dichas condiciones, asignamos al primer hueco libre del array("red.tamanyo") el usuario

        for(int i = 0; i < MAXAMIGOS ; i++ ){
            red.usuarios[red.tamanyo].lamigos[i] = "0";                            //Colocaremos un "0" en todas las posiciones de los amigos(interpretaremos el "0" como vacio) de dicho usuario
        }

        for(int i = 0; i < MAXMENSAJES ; i++){
            red.usuarios[red.tamanyo].muro.mensajes[i].msg = "0";                  //Colocaremos un "0" en todas las posiciones de los mensajes de dicho usuario
        }
        red.tamanyo++;
        ok = true;
    }
    else{
        cout << " El usuario que desea introducir ya existe o la red social esta completa y no puede introducir mas usuarios " << endl;
        ok = false;
    }
}

//Funcion que hace que eliminemos a un usuario de la red junto a su lista de amigos

void desconectar (TRedSocial &red, const string &user){
    unsigned pos;
    unsigned pos_amig;
    string u_aux;
    string amigo_aux;
    unsigned contador = 0;

        for(unsigned i = 0; i < red.tamanyo ; i++){
            if( existe_amigo(red,red.usuarios[i].id,user,pos_amig) == true){
                    cout << " existe el amigo " << red.usuarios[i].id << " es el hombre " << "user" << "el que queremos eliminar" << user << endl;
                    eliminar_amigo(red,red.usuarios[i].id,user);
            }
        }

    if (existeUser(red,user,pos) == true){                                          //Comprobamos si existe el usuario en la red social

        for(unsigned i = pos; i < red.tamanyo-1; i++){
            cout << "la posicion es " << i << endl;
            contador ++;
            red.usuarios[i] = red.usuarios[i+1];
        }                                                                                   //Asignamos al usuario la posicion maxima y luego reducimos el tamaño de la red
        red.tamanyo--;
    cout << "el contador es " << contador;





    }
    cout << red.tamanyo << " es el num de usuarios " << endl;
}


//Funcion que agrega al primer usuario a la lista de amigos del segundo usuario y viceversa (se sobreentiende que es el primer usuario y segundo usuario que pasemos, no el primero y segundo de la red social)

void peticion_amistad (TRedSocial &red, const string &user, const string &id_amigo,  bool &ok){
    unsigned pos;
    unsigned pos1;
    if(id_amigo != user){
        if( (existeUser(red,id_amigo,pos) == true) && (existeUser(red,user,pos) == true)){
            if(lamigos_llena(red,user) == false){
                if(existe_amigo(red,user,id_amigo,pos1) == false){
                    insertarAmigo(red,id_amigo,user,pos);    //Insertaremos el usuario en la lista de amigos del id del amigo
                    insertarAmigo(red,user,id_amigo,pos);    //Insertaremos el id del amigo en la lista de amigos del usuario
                    ok = true;
                }
                else{
                    ok = false;
                    cout << "el usuario no existe " << endl;
            }
            }else{
                ok = false;
                cout << "La lista de amigos esta llena" << endl;
            }
        }
        else{
            ok = false;
            cout << " 1.Los usuarios ya son amigos. " << endl;
        }

    }
    else{
        cout << "El amigo no puede llamarse igual que el usuario " << endl;
    }



}

//Funcion que va a eliminar al primer usuario de la lista de amigos del segundo usuario y viceversa (se sobreentiende que es el primer usuario y segundo usuario que pasemos, no el primero y segundo de la red social)

void eliminar_amigo(TRedSocial &red, const string &user, const string &id_amigo){
    unsigned pos;
    unsigned pos_amigo;
    unsigned pos_amigo1;
    unsigned pos1;
    string auxiliar;
    string auxiliar_amigo;
    if ((existe_amigo(red,user,id_amigo,pos_amigo) == true) &&(existeUser(red,user,pos) == true)){        //Comprobamos si existe el usuario y si existe el amigo, obtenemos a su vez la posicion del amigo y la posicion del usuario en la red
        auxiliar = red.usuarios[pos].lamigos[pos_amigo];                                                  //Guardamos el id del amigo en una variable auxiliar
        auxiliar_amigo = user;
        for(unsigned i = pos_amigo ; i < red.usuarios[pos].a_tamanyo-1 ; i++){
            red.usuarios[pos].lamigos[i] = red.usuarios[pos].lamigos[i+1];
        }
        red.usuarios[pos].a_tamanyo--;
                                                               //Asignamos el cero a ese amigo para dar a entender que se ha borrado
    }
        existe_amigo(red,auxiliar,auxiliar_amigo,pos_amigo);                                              //FASE 2. Hacerlo viceversa. Obtenemos la posicion en la que se encuentra el user en la lista de amigos de id amigo
        existeUser(red,auxiliar,pos);                                                                     //Obtenemos la posicion de id amigo en la red social
        for(unsigned i = pos_amigo; i < red.usuarios[pos].a_tamanyo-1 ; i++){
            red.usuarios[pos].lamigos[i] = red.usuarios[pos].lamigos[i+1];
        }
        red.usuarios[pos].a_tamanyo--;
}
//Funcion que escribe los amigos de un usuario dado en el parametro "amgs"

void consultar_amigos(const TRedSocial &red, const string &user,  TListaAmigos &amgs, bool &ok){
    unsigned pos;
    if(existeUser(red,user,pos) == true){
        for(int i = 0; i <  red.usuarios[pos].a_tamanyo ; i++){                                           //Ciclo que itera un numero de veces equivalente al numero de amigos del usuario
        amgs[i] = red.usuarios[pos].lamigos[i];                                                           //Vamos guardando la lista de amigos en el parametro
        cout << amgs[i] << endl;                                                                          //Lo mostramos por pantalla. He considerado mas comodo mostrarlo por aqui que usar la funcion mostrarAmigos.
        ok = true;
        }
    }
    else{
        cout << "El usuario no existe en la red social. Compruebe que ha introducido los datos correctamente" << endl;
        ok = false;
    }

}

//Funcion que publica un tipo de mensaje segun el valor de nature

void publicarMsg(TRedSocial &red, const string &user, const string &id_amigo, const TMensaje &msg, unsigned int nature, bool &ok){
    unsigned pos;
    switch(nature){
        case 0:
             insertarMsgEnMuro(red,user,pos,msg,ok);
             break;
        case 1:
             insertarMsgEnMuroAmigos(red,user,pos,msg,ok);
             break;
        case 2:
             insertarMsgEnMuroPrivado(red,user,id_amigo,pos,msg,ok);
             break;
    }
}

//Funcion que muestra el muro de un usuario

void consultar_muro(const TRedSocial &red, const string &user, TMuro &muro, bool &ok){
    unsigned pos;
    if(existeUser(red,user,pos) == true){
        for(int i = 0; i < red.usuarios[pos].muro.tamanyo ; i++){
            muro.mensajes[i].id = red.usuarios[pos].muro.mensajes[i].id;
            muro.mensajes[i].msg = red.usuarios[pos].muro.mensajes[i].msg;
            muro.tamanyo = red.usuarios[pos].muro.tamanyo;
            cout << "Nombre: ";
            cout << muro.mensajes[i].id << endl;
            cout << "Mensaje:";
            cout << muro.mensajes[i].msg << endl;
        }
        if(muro.tamanyo > 0){
        cout << "Total de mensajes " << muro.tamanyo << endl;
        ok = true;
        };
    }
    else{
        cout << "No existe el usuario" << endl;
        ok = false;
    }
}

//Muestra todos los datos de un usuario

void mostrarUsuario(const TRedSocial &red, const string &user,TMuro &muro,TListaAmigos &amgs,bool &ok){
    unsigned pos;
    if (existeUser(red,user,pos) == true){
        cout << " Identificador del usuario: "<< user << endl;
        cout << " Los amigos del usuario son: " << endl;
        consultar_amigos(red,user,amgs,ok);
        consultar_muro(red,user,muro,ok);
    }
    else{
        cout << "No existe el usuario" << endl;
        ok = false;
    }
}

void mostrarTodo(const TRedSocial &red,const string &user,TMuro &muro,TListaAmigos &amgs,bool &ok){
    for(int i = 0; i < red.tamanyo ; i++){
        mostrarUsuario(red,red.usuarios[i].id,muro,amgs,ok);
    }

}


//ALGUNAS SOPERACIONES AUXILIARES
//--------------------------------------------------------------------------
char menu()
{
    cout << endl;
    cout << "0.- Fin" << endl;
    cout << "1.- Conectar nuevo usuario" << endl;
    cout << "2.- Eliminar usuario de la red" << endl;
    cout << "3.- Peticion de amistad." << endl;
    cout << "4.- Eliminar amigo." <<endl;
    cout << "5.- Consultar Amigos de un usuario" << endl;
    cout << "6.- Publicar mensaje" << endl;
    cout << "7.- Consultar Muro de un Usuario" << endl;
    cout << "8.- Mostrar Datos de un usuario" << endl;
    cout << "9.- Mostrar toda la red" << endl;
    char op;
    cin.clear();
    do {
        cout << "    Opcion ? ";
        cin >> op;
    } while (op < '0' || op > '9');
    cout << endl;
    cin.ignore();
    return op;
}

//--------------------------------------------------------------------------
void error(bool ok)
{
    if (!ok) {
        cout << "  Operacion erronea" << endl;
    }
}

///Las siguentes dos operaciones pueden ser usadas luego en el MostrarTodo. Se sugiere implementarlas pero no es necesario. Si no se implementan en el programa principal deben evitarse ser llamadas.
void mostrarAmigos(const TRedSocial &red,const TListaAmigos &amgs){
}


void mostrarMuro(const TRedSocial &red,const TMuro &muro){

}

I would appreciate if you could tell me how to solve the two errors mentioned above. Also if I can somehow optimize my code.

    
asked by Skydez 12.02.2017 в 01:38
source

1 answer

2

It is good to verify that the index will not exceed the size of the array, but TRedSocial has a variable that indicates the number of elements that array has. You should use this value instead of MAXUSERS :

bool existeUser(const TRedSocial &red, string user, unsigned &pos){
    bool encontrado;
    int i = 0;
    while(encontrado == false && i < red.tamanyo ){

        if(red.usuarios[i].id == user){
            encontrado = true;
            pos = i;
        }
        i++;
    }

    if (encontrado == false){
        cout << "El usuario no existe en la red social" << endl;
    }
    return encontrado;
}

Although for iterations in which the maximum number of elements is known I would opt for a loop for , I find it easier to maintain:

for( int i = 0; i < red.tamanyo && !encontrado; ++i ) {
    if(red.usuarios[i].id == user){
        encontrado = true;
        pos = i;
    }
}

And I would even avoid showing the error message inside this same function ... If you call the function, for example, to make sure that a user does not exist because you are going to register it, it does not make sense for you to get the message that " The user does not exist in the social network " ...

Regarding the second error, you have two options:

  • Deleting a user also deletes all messages associated with that account
  • You create an identification system independent of the nick, so that each user receives a unique identification.

The first option is simple, by deleting a user iterates on the list of messages and discard those belonging to that user. The second one I do not implement because I imagine that you will not be able to modify the data structures of the program.

    
answered by 13.02.2017 в 09:57