Problem receiving char

-1

Why the first time I pass a char value of the error (as if it were empty)? Then on the second try it works normal?

  

After I received the Initial of the Position or Turn of the error and even then I gave   a WriteLine was with the correct value, being necessary to type   new.

/**
 * 5) Uma empresa possui dez funcionários com as seguintes características: 
 * código, número de horas trabalhadas no mês, 
 * turno de trabalho(M - Matutino, V - Vespertino ou N - Noturno), 
 * categoria (O - Operário ou G - Gerente), 
 * valor da hora trabalhada. 
 * Sabendo-se que esta empresa deseja informatizar a folha de pagamento, faça um programa que:
 * a) Leia as informações do funcionário, não permitindo que sejam informados turnos ou categorias
 * inexistentes. Trabalhar sempre com a digitação de letras maiúsculas.
 * 
 * Calcule o valor da hora trabalhada, conforme tabela a seguir: -- slide ---
 * 
 * Adote o valor de R$150,00 para o salário mínimo.
 * c) Calcule o salário inicial dos funcionários com base no valor da hora trabalhada e 
 * o número de horas trabalhadas.
 * d) Calcule o valor do auxílio alimentação recebido por funcionário, 
 * de acordo com o seu salário inicial, conforme tabela a seguir: --- slide -- **/


int codigo, controle = 1;
double h_trabalhadas, valor_h_trabalho;
char turno, categoria;
string aux;

while(controle <= 10)
{
    Console.WriteLine("-----------------------------------------");
    Console.WriteLine("Código do funcionário: ");
    aux = Console.ReadLine();
    codigo = Convert.ToInt16(aux);

    Console.WriteLine("Número de horas trabalhadas por mês: ");
    aux = Console.ReadLine();
    h_trabalhadas = Convert.ToDouble(aux);

    Console.WriteLine("Turno (M/V/N): ");
    aux = Console.ReadLine();
    turno = Convert.ToChar(aux);


    //Validar turno
    while((turno != 'M')||(turno != 'V')||(turno != 'N'))
    {
        Console.WriteLine("Turno inválido, tente novamente");
        Console.WriteLine("Turno (M/V/N): ");
        aux = Console.ReadLine();
        turno = Convert.ToChar(aux);

        if ((turno == 'M') || (turno == 'V') || (turno == 'N'))
            break;
    }

    Console.WriteLine("Categoria (O/P): ");
    aux = Console.ReadLine();
    categoria = Convert.ToChar(aux);

    //Validar categoria
    while ((categoria != 'O') || (categoria != 'P'))
    {
        Console.WriteLine("Categoria inválida, tente novamente");
        Console.WriteLine("Categoria (O/P): ");
        aux = Console.ReadLine();
        categoria = Convert.ToChar(aux);

        if ((categoria == 'O') || (categoria == 'P'))
            break;
    }

    Console.WriteLine("Valor da hora de trabalho: ");
    aux = Console.ReadLine();
    valor_h_trabalho = Convert.ToDouble(aux);

Test code: link

In this way, if I typed 'M' because you requested again ..

    
asked by anonymous 30.08.2017 / 20:42

2 answers

2

The while that validates this entry should be using && and not || .

That is:

  

If the value entered is different from M and also different from V and also different from N.

while((turno != 'M') && (turno != 'V') && (turno != 'N'))

See working in .NET Fiddle.

    
30.08.2017 / 21:26
1

The logic of your WHILE is the problem.

  

The while statement executes a statement or an instruction block until   that a specified expression evaluates to false.

Reference: link

For example, if I type an M, your while will look like:

while(false||true||true)

which is the same as:

while(true)

The same will happen to any of the other two values if they are chosen. Now note that regardless of the value entered, there will always be two expressions of your WHILE equal to true, this is enough for your WHILE to always be executed, regardless of the value entered to be correct.

    
30.08.2017 / 21:20