Why are you returning "Invalid Position"?

Asked

Viewed 53 times

0

When I type 3, instead of asking for the Position I want to enter, it returns 'Invalid Option'. Could anyone tell me why? Follow the code:

 #include<stdio.h>
#include<stdlib.h>
int Lista[5];
void Esvaziar()
{
    for(int x=0;x<5;x++)
    {
        Lista[x]=0;
    }
    printf("Lista esvaziada com sucesso!\n");
    _sleep(2000);
}
void Imprimir()
{
    for(int x=0;x<5;x++)
    {
        printf("[%d]",Lista[x]);
    }
    _sleep(2000);
}
int ListaVazia()
{
    if(Lista[0]==0)
    {
        return 0;//se ele retornar 0, a lista esta vazia
    }
    else
    {
        return 1;//se ele retornar 1, a lista não esta vazia
    }
}
int ListaCheia()
{
    if(Lista[4]!=0)
    {
        return 1;//se ele retornar 1, a lista esta cheia
    }
    else
    {
        return 0;// se ele retornar 0, a lista não esta cheia
    }
}
void Insere()
{
    int pos=0,valor;
    if(Lista[0]!=0)
    {
        printf("\nPosicao: ");
        scanf("%d",&pos);
    }   
    if(pos>=0 && pos<=4 && Lista[pos-1]!=0)
    {
        printf("\nValor: ");
        scanf("%d",&valor); 
        if(Lista[0]==0)
            Lista[0]=valor;
        else if(Lista[pos]!=0)
        {
            for(int x=4;x>pos;x--)
            {
                Lista[x]=Lista[x-1];    
            }       
            Lista[pos]=valor;
        }
        else if(Lista[pos-1]!=0 && Lista[pos]==0)
        {
            Lista[pos]=valor;
        }
    }
    else
    {
        printf("Posicao invalida\n");
        system("pause");
    }
}
void Retirar()
{
    int valor;
    printf("Valor: ");
    scanf("%d",&valor);
    if(valor==0)
    {
        printf("Valor invalido\n");
        _sleep(1000);
    }
    else
    {
        for(int x=0;x<5;x++)
        {
            if(valor==Lista[x])
            {
                if(Lista[x+1]==0)
                {
                    Lista[x]=0;
                }
                else
                {
                    while(x<4)
                    {
                        Lista[x]=Lista[x+1];
                        x++;
                    }
                    Lista[4]=0;
                }
            }
        }
    }
}
void Alterar()
{
    int pos, valor;
    printf("Posicao: ");
    scanf("%d",&pos);
    if(Lista[pos]==0)
    {
        printf("Posicao invalida\n");
        _sleep(1000);
    }
    else
    {
        printf("Valor: ");
        scanf("%d",&valor);
        if(valor == 0)
        {
            printf("Valor invalido\n");
            _sleep(1000);
        }
        else
        {
            Lista[pos]=valor;
        }
    }
}
int Menu()
{
    int opcao;
    printf("0 - Sair\n");
    printf("1 - Esvaziar\n");
    printf("2 - Imprimir\n");
    printf("3 - Inserir\n");
    printf("4 - Retirar\n");
    printf("5 - Alterar\n");
    printf("OPCAO: ");
    scanf("%d",&opcao);
    return opcao;
}
main()
{
    int op,verifica;
    do{ 
        system("cls");
        op=Menu();
        if(op==1)
        {
            Esvaziar();
        }
        else if(op==2)
        {
            Imprimir();
        }
        else if(op==3)
        {
            verifica=ListaCheia();
            if(verifica==1)
            {
                printf("Lista esta cheia\n");
                _sleep(1000);
            }
            else
                Insere();
        }
        else if(op==4)
        {
            verifica=ListaVazia();
            if(verifica==0)
            {
                printf("Lista vazia\n");
                _sleep(1000);
            }
            else 
                Retirar();
        }
        else if(op==5)
        {
            verifica=ListaVazia();
            if(verifica==0)
            {
                printf("Lista vazia\n");
                _sleep(1000);
            }
            else 
                Alterar();
        }

    }while(op!=0);
}
  • 1

    This code will never display "Invalid Option".

1 answer

0

The conditions that make the inserts skip are Lista[0] != 0 and Lista[pos-1] != 0. A simple solution would be, within the function Inserir(), switch operators != of if(Lista[0]!=0) and if(pos>=0 && pos<=4 && Lista[pos-1]!=0) for ==:

void Insere()
{
    int pos=0,valor;
    if(Lista[0]==0) // <- Aqui
    {
        printf("\nPosicao: ");
        scanf("%d",&pos);
    }   
    if(pos>=0 && pos<=4 && (ListaVazia() || Lista[pos-1]!=0)) // <- E aqui
    {
        printf("\nValor: ");
        scanf("%d",&valor); 
        // ...
    }
    else
    {
        printf("Posicao invalida\n");
        system("pause");
    }
}

However, Lista[pos-1] will return values outside the array (memory garbage) when pos equals 0 (when inserting for the first time, for example). So check before if pos is not 0 or better, if the list is empty (ListaVazia()), assuming that Lista[pos-1] != 0 serves to know if the previous position in List is occupied.

I also advise calling the function Esvazia() before reading the menu option, to ensure that the list itself is without memory junk when starting the program.

  • List[pos-1] to pos=0 will pick up memory junk, right?

  • 1

    You’re right, I edited my answer to correct that.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.