Ir ao conteúdo

Posts recomendados

Postado

Boa noite.

Foi me passado um código no Visual Studio porém queria escrever o mesmo no codeblocks por questões acadêmicas.

Preciso substituir o

_gettche();

que é usado no VS para o codeblocks.

Qual função substitui esse _gettche no codeblocks?

 

 

 

Agradeço

  • Curtir 1
Postado

@Dan Azevedo A linguagem não é a mesma? Você não está programando em C?

 

53 minutos atrás, Dan Azevedo disse:

_gettche();

O que você quer fazer? Você não mostrou código nenhum.

 

Talvez a própria getchar() sirva... Ela lê um caractere da stdin, que normalmente é o teclado do usuário.

  • Obrigado 1
Postado
#include "stdafx.h"
#include "stdlib.h"
int main()
{
char resposta = 's';
float nota1, nota2, nota3, media;
while (resposta == 's')
{
system("cls");
printf("Digite a primeira nota: "); //entrada de dados
scanf_s("%f", &nota1);
printf("Digite a segunda nota: ");
scanf_s("%f", &nota2);
printf("Digite a terceira nota: ");
scanf_s("%f", &nota3);
media = (nota1 + nota2 + nota3) / 3; //processamento
printf("A media do aluno foi: %.2f \n", media); //saída de dados
if (media >= 6) //saída de
dados
printf("APROVADO \n");
else
printf("REPROVADO \n");
printf("Deseja digitar as notas de outro aluno? (s/n): ");
resposta = _gettche(); //ESSA PARTE QUE NÃO CONSIGO REPRODUZIR NO CODEBLOCKS
printf("\n\n");
}
 return 0;
}

Essa seria a resolução do meu exercício pelo VS.

Queria fazer o mesmo pelo codeblocks, porém, não obtive sucesso por causa do gettche

  • Curtir 1
Postado

@Dan Azevedo Teste aí, e não se esqueça que Indentação é importante:

#include <stdio.h>
#include <stdlib.h>

int main()
{
char resposta = 's';
float nota1, nota2, nota3, media;

while (resposta == 's')
{
    system("cls");
    printf("Digite a primeira nota: ");
    scanf("%f%*c", &nota1);
    
    printf("Digite a segunda nota: ");
    scanf("%f%*c", &nota2);
    
    printf("Digite a terceira nota: ");
    scanf("%f%*c", &nota3);
    
    media = (nota1 + nota2 + nota3) / 3; //média
    printf("A media do aluno foi: %.2f \n", media);
    
    if (media >= 6){
        printf("APROVADO \n");
    }else{
        printf("REPROVADO \n");
    }
    printf("Deseja digitar as notas de outro aluno? (s/n): ");
    scanf("%c", &resposta);
    printf("\n\n");
}
 return 0;
}

 

  • Curtir 1
  • Obrigado 1
Postado
3 horas atrás, Dan Azevedo disse:

Foi me passado um código no Visual Studio porém queria escrever o mesmo no codeblocks por questões acadêmicas

 

Que significa?

 

Code::Blocks e Visual Studio são apenas IDE, ambientes de desenvolvimento. Está trocando de compilador?

 

3 horas atrás, Dan Azevedo disse:

_gettche();

 

Essa função nada tem a ver com o Visual Studio ou o Code::Blocks, mesmo porque eles não tratam de funções: não são compiladores.

 

Essa função deriva de uma biblioteca da Borland dos anos '80 que acompanhava um programa chamado Turbo C que vinha em dois disketes de 1.2MB.  Aqueles de 5.25".

 

Não consigo imaginar que exista uma razão acadêmica para usar isso desde o início dos '90. De todo modo pode conseguir isso ainda hoje em SourceForge.net. Postei um link hoje aqui por brincadeira até: 

em https://sourceforge.net/projects/conio/ pode conseguir isso.

 

Code::Blocks não vai te acrescentar muito em termos de oportunidade de aprender ou de eficiência. Vai ser mais um adversário. E certamente a conio.h toda também não. Mas esse link serve.

 

E uma função para ler uma tecla não faz assim muita falta ;) Mas está lá.

 

  • Curtir 1
  • Obrigado 2
  • 3 semanas depois...
Postado

@arfneto Estava dando uma passada aqui e decidi testar:

Em 13/09/2020 às 21:21, arfneto disse:

void _gettche() {
FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), INFINITE);
};

Esta função WaitForSingleObject() espera por qualquer entrada? Não teria como limitar para algo vindo apenas do teclado?

Postado
10 minutos atrás, Lucca Rodrigues disse:

@arfneto Estava dando uma passada aqui e decidi testar:

Esta função WaitForSingleObject() espera por qualquer entrada? Não teria como limitar para algo vindo apenas do teclado?


 

Sim, single quer dizer único, solteiro, desacompanhado  Ela tem uma irmã,


DWORD WaitForMultipleObjects(
  DWORD        nCount,
  const HANDLE *lpHandles,
  BOOL         bWaitAll,
  DWORD        dwMilliseconds
);

 

Que você pode usar para, digamos, múltiplos objetos. Como deve imaginar são funções muito importantes.

 

No caso da versão single, recebendo o handle de uma console, é o que faz. Se for o STD_INPUT_HANDLE é o teclado.

  • Obrigado 1
Postado

@arfneto Com essa WaitForSingleObject(), se eu até mesmo mover o cursor do mouse já conta como entrada, e acaba sendo um pouco inconveniente.

53 minutos atrás, Lucca Rodrigues disse:

Não teria como limitar para algo vindo apenas do teclado?

O que eu queria dizer é algo do teclado, sem o mouse.

Postado
10 minutos atrás, Lucca Rodrigues disse:

O que eu queria dizer é algo do teclado, sem o mouse.

 

Não acho que faça diferença. O tratamento é o mesmo. Eu não postei um exemplo completo? 

Ao ter a console signaled você de todo modo tem que ler e testar umas estruturas para saber o que houve. E lá está a origem do sinal. E isso é lido no programa. O programa não para a menos que você queira e se você quer você testa. O atraso é mínimo, de ms

 

adicionado 9 minutos depois

🤔

O que eu postei aqui não é o exemplo que eu pensava. A discussão aqui ficou muito tosca e eu não postei o programa que eu achava que tinha postado. 

No caso de substituir _getche() o WAIT é INFINITE e isso não é comum. Em geral você quer exatamente o contrário: 0.

 

 

adicionado 17 minutos depois

@Lucca Rodrigues Acho que eu te mostrei um programa que trata menus, baseado em curses, semanas atrás. Deve ler aquele programa e vai entender a diferença. Eu te mandei um link pra isso acho.

 

De todo modo esse é o tratamento para ler APENAS

  • ESCAPE
  • ENTER
  • SETAS para cima e para baixo
  • 0 para voltar o menu para a seleção padrão
  • + e menos no teclado comum e numérico

SEM PARAR o PROGRAMA e sem read() ou qualquer parada para ler, como gets() ou scanf().

 

O menu "sólido" como te falei na ocasião. Não mexe na tela, não para, não lê e só aceita o previsto. E apaga.

 

Nesse trecho abaixo tem sua resposta: trata apenas o teclado.

 

		do
		{
			FlushConsoleInputBuffer(Console);
			if ( WaitForSingleObject(Console, tempo) != tem_tecla) continue;
			int n = PeekConsoleInput(Console, buffer, 32, (LPDWORD)&total);
			if (total == 0) break;
			for (DWORD i = 0; i < total; i += 1)
			{
				if (buffer[i].Event.KeyEvent.bKeyDown) continue;
				v = buffer[i].Event.KeyEvent.wVirtualKeyCode;
				c = buffer[i].Event.KeyEvent.uChar.AsciiChar;
				// todos os testes sao definitivos entao so retorna
				if (v == VK_ADD) return _SOBE_;
				if (v == VK_SUBTRACT) return _DESCE_;
				if (v == VK_DOWN) return _SOBE_;
				if (v == VK_UP) return _DESCE_;
				if (v == VK_OEM_PLUS) return _SOBE_;
				if (v == '0') return _DEFAULT_;
				if (v == '+') return _SOBE_;
				if (v == VK_ESCAPE) return _ESCAPE_;
				if (v == VK_RETURN) return _ENTER_;
				if (c == '+') return _SOBE_;
				if (c == '-') return _DESCE_;
				if (c == '0') return _DEFAULT_;
			}
		} while (sem_escolha);

 

  • Obrigado 1

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!