Ir ao conteúdo

Posts recomendados

Postado

Olá amigos, eu estou com um pequeno problema no meu código, eu não consigo entender o porque do meu comando while não está funcionando. Alguém consegue me ajudar? o meu objetivo é recolher uma das duas respostas e caso ela seja diferente exibir a mensagem de erro, caso for uma delas prosseguir com o resto do programa;

 


                    

				char sexolocal;
                                printf("\nQual o seu sexo? Por favor responda com M ou F: ");
                                scanf("%c",&sexolocal);

                                    while (sexolocal != "m" || sexolocal!="f") //Já tentei usar && mas também dá erro
                                    {
                                    if (sexolocal != "m"|| sexolocal!= "f")
                                    printf("Resposta Invalida! Por favor responda novamente: ");
                                    scanf("%c",&sexolocal);
                                      } 

 

Postado
1 hora atrás, GabrielGFaustino disse:

(sexolocal != "m" || sexolocal!="f")

 

A notação para uma constante char em C é 'c' e não "c" que indicaria uma coisa do tipo const char* e seria um endereço na memória onde estariam um 'c' e um 0, um depois do outro.

 

Mas seu problema é de lógica. A condição (a OU b) é verdade se a ou b forem verdade. Você está testando se algo é diferente de 'm' OU diferente de 'f'. 

 

Pense bem:
 

Citação

qualquer coisa é diferente de duas coisas diferentes...


Sempre vai ser verdade. 

 

Pode avaliar como descrito aqui

 

57 minutos atrás, Matheus Maldi disse:
while (!((c == 'm') || (c == 'f')))

Isso que você queria

 

O mais eficiente no entanto é escrever 

while ( (c != 'm') && (c != 'f') )

A razão é que testar por igual ou diferente dá na mesma em termos de custo. É uma instrução só. Mas usando ! (NOT) você sempre vai fazer uma inversão, depois de fazer um ou dois testes. No segundo caso você faz apenas 1 ou dois testes

 

Postado
2 horas atrás, arfneto disse:

A razão é que testar por igual ou diferente dá na mesma em termos de custo. É uma instrução só. Mas usando ! (NOT) você sempre vai fazer uma inversão, depois de fazer um ou dois testes. No segundo caso você faz apenas 1 ou dois testes

 

 

O custo do ! (not) para um retorno de verdadeiro ou falso é ZERO.

testando os código abaixo no godbolt temos o resultado do binário idêntico:

#include <stdio.h>

int main(int argc, char** argv)
{
    char c = argv[0][0]; // Necessario para o compilador não eliminar tudo
  
    while ( (c != 'm') && (c != 'f') )
    // while (!((c == 'm') || (c == 'f')))
        printf("%c", c);

    return 0;
}

e assembly gerado com as flags -O3:

main:
        push    rbx
        mov     rax, QWORD PTR [rsi]
        movsx   ebx, BYTE PTR [rax]
        cmp     bl, 109
        je      .L2
        cmp     bl, 102
        je      .L2
.L3:
        mov     edi, ebx
        call    putchar
        jmp     .L3
.L2:
        xor     eax, eax
        pop     rbx
        ret

 

Postado

Essa é uma situação simplificável e gera o mesmo código. Entenda as duas condições:

  1.  NOT ( A || B ) 
  2. NOT A && NOT B

Para avaliar a primeira você tem que avaliar A e B primeiro e depois inverter. Isso pode significar por exemplo chamar funções presentes em B, mas tem que ser feito porque é um OR e só depois vai invertido.

 

Para avaliar a segunda você avalia a primeira e apenas se ela for falsa avalia a segunda e só vai avaliar B se A for verdadeiro.

 

 

 

 

 

 

Postado
11 horas atrás, Matheus Maldi disse:

O custo do ! (not) para um retorno de verdadeiro ou falso é ZERO.

testando os código abaixo no godbolt temos o resultado do binário idêntico [...]

Então, tudo se resume à preferência pessoal porque são tecnicamente iguais.

 

Bons Estudos.

Postado

Eu me lembrei de uma discussão sobre algo assim aqui meses atrás e na ocasião eu postei um programa que implementa uma fila de prioridade e alimenta um painel de atendimento de uma clínica médica, onde mostra as tais últimas 5 senhas e a senha sendo atendida e simula a fila com prioridade para os idosos numa clínica.
 

É esse seu caso e basta acrescentar mais umas prioridades e funções. Só que as funções são dadas por uma letra e as letras são tratadas num switch que já está lá. E a engine do programa é baseada numa função chamada ciclo() que pode ou não ser alimentada por um menu... Acho que deu pra entender: deve ser muito simples usar para sua simulação. Sugiro ler o programa que está em 

https://github.com/ARFNeto-CH/ch-191026-filapq e tem lá um botão de download do projeto pronto. São 3 arquivos só eu acho.

 

Pense em seu programa e veja main() desse outro como é similar: 
 

int			main(int argc, char** argv)
{
	//
	// opcao: rodar com 'fila rotina'
	// por exemplo 'fila NNNNPPPPLA'
	// sao NPLA para
	// N - entra cliente normal
	// P - entra cliente com prioridade de atendimento
	// L - lista a situacao
	// A - tenta atender alguem
	//
	// cad letra indica uma acao para nao ter que ficar usando o menu
	//
	if( argc > 1 )	// veio algo na linha de comando
	{	
		inicia_trabalhos();
		testa_rotina(argv[1]);
		return 0;
	}	// end if
	inicia_trabalhos();
	//char* rotina = "LNNNNNNNLAAAAAAALPPPAAAL";
	//char* rotina = "LNNNPAALALAL";
	//char* rotina = "LNNNNPPPPLAAAAAAAL";
	char* rotina = "LNNNNPPPPLAAAAAAAPPPPLAAALAL";
	//char* rotina = "A";
	testa_rotina(rotina);
	return 0;
}	// end main()

E veja sua tabela de eventos

image.png.6c816934dd712afa83077234f67f5ce7.png


E a rotina ciclo() no programa:


int		ciclo(char servico)
{
	switch (servico)
	{

	case ATENDE:
		break;

	case NORMAL:
		break;

	case PRIORIDADE:
		break;
	
	case LISTA:
		break;

	case LIVRE:
	default:
		break;
	}	// end switch
	return 0;
}	// end ciclo()

Se você acrescenta suas funções no menu basta colocar no switch() e o ciclo() faz acontecer. O engine é baseado numa sequência de serviços que entram em uma simples string e podem vir do menu ou de qualquer lugar. O programa até aceita as rotinas de teste direto na linha de comando.

 

E o programa tem até um gerador de dados que você pode adaptar para gerar eventos de todos os tipos que precisa, no automático. 5 ou 500 ou 50.000.

 

Em relação ao menu postei um programa para ajudar alguém dias atrás e ele lê e grava arquivos em disco, e tem um menu. Só que o menu também vem do disco então é muito rápido de implementar, porque na verdade já está pronto: basta digitar o texto do menu num editor e colocar as opções no switch(). Nada mais. 

 

Está em https://github.com/ARFNeto-CH/chc-200402play

 

Estive pensando e juntando isso é praticamente seu programa. A saída é até parecida já. Apenas coloque seus eventos.


Veja uma sequência de atendimento no programa inicial

***** iniciando expediente CAPACIDADE=6 CLIENTES *****



***** Rotina=[LNNNNPPPPLAAAAAAAPPPPLAAALAL] *****

Total de acoes: 28


---------- ---------- ---------- ----------

Painel
Fila Vazia

---------- ---------- ---------- ----------
    CADASTRADO 'Jose dos Santos de 2501 Jr.' com senha 501 na fila [Normal] pos=1
    CADASTRADO 'Jose dos Santos de 2502 Jr.' com senha 502 na fila [Normal] pos=2
    CADASTRADO 'Jose dos Santos de 2503 Jr.' com senha 503 na fila [Normal] pos=3
    CADASTRADO 'Jose dos Santos de 2504 Jr.' com senha 504 na fila [Normal] pos=4
    CADASTRADO 'Jose dos Santos de 2505 Jr.' com senha 505 na fila [Prioridade] pos=5
    CADASTRADO 'Jose dos Santos de 2506 Jr.' com senha 506 na fila [Prioridade] pos=6
    SEM mais senhas. Por favor AGUARDE
    SEM mais senhas. Por favor AGUARDE

---------- ---------- ---------- ----------

Painel
Tamanho da fila:......   6
Normal:...............   4
Prioritario: .........   2

Fila (6 clientes):

#  1: [Jose dos Santos de 2501 Jr.], Senha 501 [N]
#  2: [Jose dos Santos de 2502 Jr.], Senha 502 [N]
#  3: [Jose dos Santos de 2503 Jr.], Senha 503 [N]
#  4: [Jose dos Santos de 2504 Jr.], Senha 504 [N]
#  5: [Jose dos Santos de 2505 Jr.], Senha 505 [P]
#  6: [Jose dos Santos de 2506 Jr.], Senha 506 [P]

---------- ---------- ---------- ----------
    ATENDENDO [Jose dos Santos de 2505 Jr.] senha 505 [PRIORIDADE]
    ATENDENDO [Jose dos Santos de 2501 Jr.] senha 501 [NORMAL]
    ATENDENDO [Jose dos Santos de 2502 Jr.] senha 502 [NORMAL]
    ATENDENDO [Jose dos Santos de 2506 Jr.] senha 506 [PRIORIDADE]
    ATENDENDO [Jose dos Santos de 2503 Jr.] senha 503 [NORMAL]
    ATENDENDO [Jose dos Santos de 2504 Jr.] senha 504 [NORMAL]
    ATENDIMENTO: Fila Vazia
    CADASTRADO 'Jose dos Santos de 2507 Jr.' com senha 507 na fila [Prioridade] pos=1
    CADASTRADO 'Jose dos Santos de 2508 Jr.' com senha 508 na fila [Prioridade] pos=2
    CADASTRADO 'Jose dos Santos de 2509 Jr.' com senha 509 na fila [Prioridade] pos=3
    CADASTRADO 'Jose dos Santos de 2510 Jr.' com senha 510 na fila [Prioridade] pos=4

---------- ---------- ---------- ----------

Painel
Tamanho da fila:......   4
Normal:...............   0
Prioritario: .........   4

Fila (4 clientes):

#  1: [Jose dos Santos de 2507 Jr.], Senha 507 [P]
#  2: [Jose dos Santos de 2508 Jr.], Senha 508 [P]
#  3: [Jose dos Santos de 2509 Jr.], Senha 509 [P]
#  4: [Jose dos Santos de 2510 Jr.], Senha 510 [P]

Ja atendidos: 6. Ultimas 5 senhas chamadas: 504  503  506  502  501

Ultima: 504

---------- ---------- ---------- ----------
    ATENDENDO [Jose dos Santos de 2507 Jr.] senha 507 [PRIORIDADE]
    ATENDENDO [Jose dos Santos de 2508 Jr.] senha 508 [PRIORIDADE]
    ATENDENDO [Jose dos Santos de 2509 Jr.] senha 509 [PRIORIDADE]

---------- ---------- ---------- ----------

Painel
Tamanho da fila:......   1
Normal:...............   0
Prioritario: .........   1

Fila (1 clientes):

#  1: [Jose dos Santos de 2510 Jr.], Senha 510 [P]

Ja atendidos: 9. Ultimas 5 senhas chamadas: 509  508  507  504  503

Ultima: 509

---------- ---------- ---------- ----------
    ATENDENDO [Jose dos Santos de 2510 Jr.] senha 510 [PRIORIDADE]

---------- ---------- ---------- ----------

Painel
Fila Vazia

Ja atendidos: 10. Ultimas 5 senhas chamadas: 510  509  508  507  504

Ultima: 510

---------- ---------- ---------- ----------

Parte de uma simples string com a rotina de serviço, que podia ser a sua, ou podia vir do menu porque dá na mesma

    char* rotina = "LNNNNPPPPLAAAAAAAPPPPLAAALAL";

ou da linha de comando mesmo. Se não entendeu ainda o paradigma eis um exemplo

  • chegam 6 clientes com prioridade normal e 3 com alta prioridade
  • lista a fila e vai ver os 9
  • atende 5. deve ver as senhas sendo chamadas e os caras com atendimento prioritário vão ser atendidos na ordem
  • lista a fila e vai ver os 4 que sobraram
  • atende os 4 
  • lista a fila e vai estar vazia

Para esse teste você poderia usar

porque NNNPPPNNNLAAAAALAAAAL

Direto na linha de comando se seu programa se chamasse p q  . E poderia testar vários cenários sem voltar ao programa a menos que ache um erro...
 

Se você colocar suas ações ao invés dessas seu simulador vai rodar facinho. E pode pegar o menu do outro programa que também roda normal, e EDITAR o texto. Sem printf() nem nada. Só ler as opções e implementar as ações.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...