Vamos Programar? – Introdução à Programação #9
Receber números e letras do utilizador: O mundo está constantemente a evoluir: desde o mais pequeno inseto à espécie Humana. Evolução, mudança, futuro – são das palavras que mais são ouvidas atualmente. Aliás, a programação também evoliu.
A tecnologia tem revolucionado o mundo das mais diversas formas. Se quer entrar no mundo da tecnologia e deixar a sua marca, pode começar aqui.
Visualize este vídeo no YouTube
Interação com o utilizador
Numa aplicação, a interação com os utilizadores é algo extremamente fundamental. Se não houver interação com o utilizador, a aplicação é, na maioria das vezes, algo inútil.
Na sequência disto, irá aprender a receber dados do utilizador utilizando duas funções: scanf e getchar. Todas diferentes mas, ao mesmo tempo, todas úteis.
scanf
A função "scanf" permite-nos obter diversos tipos de dados do utilizador: números inteiros, decimais e também caracteres. Exemplo:
Como pode ver na oitava linha, o primeiro argumento da função "scanf" contém o tipo de variável que vai ser inserido (tal como na função "printf").
Os argumentos seguintes serão o nome das variáveis, precedidos por um "&", a que os valores vão ser atribuídos. Pode ler a linha 8 da seguinte forma: "atribuir um número inteiro a idade".
Quando se executa o código acima, irá aparecer a mensagem "Digite a sua idade: " e o cursor irá posicionar-se logo após essa frase aguardando que um valor seja inserido. Depois de inserir o valor e pressionar ENTER, será imprimida uma mensagem com a idade que inseriu.
Relembrando, pode utilizar as seguintes expressões para definir o tipo de dados a ser introduzido:
- %d → Números inteiros (int)
- %f → Números decimais (float e double)
- %c → Caracteres (char)
Pedir mais do que um item
Podemos pedir mais do que um valor/caracter da seguinte forma:
Ou seja, depois de aparecer a mensagem "Digite dois números:", terá que inserir dois números e pode identificar a sua separação com um espaço, enter ou tab.
Como pode ver, é muito simples utilizar a função scanf. Apesar de apenas termos utilizado números inteiros, pode utilizar números decimais ou caracteres com esta função.
getchar
Existe outra forma, mais simples, de pedir caracteres ao utilizador: a função "getchar". Compare os seguintes dois exemplos (primeiro com scanf e segundo com getchar):
Como pode verificar, a utilização da função "getchar" é bastante simples e permite-nos receber, mais facilmente, caracteres do utilizador.
Buffer e a sua limpeza
Olhando para o código acima, irá pensar que coloco duas letras como "H" e "E" e que, no final é imprimido «O seu nome começa com "H" e termina com "E".» mas não. Não é isso que acontece. Experimente correr o código.
Como deve ter verificado, logo após digitar a primeira letra, o programa terminando deixando o espaço para a segunda letra em branco.
O que aconteceu aqui? Quando nós clicamos no ENTER para submeter a primeira letra, além dessa letra, o ENTER ("\n") é submetido para a memória e quando aparece um novo pedido para inserir um caracter, o "\n" é automaticamente assumido como esse novo caracter.
Para que isto não aconteça, basta limpar o buffer antes de utilizar novamente a função. No Windows utilizamos a função "fflush(stdin)" e no Linux "__fpurge(stdin)" de forma a limpar o buffer do stdin (teclado).
Então, ficaria assim:
1 - Crie um programa que gere um número aleatório entre 1 e 10; de seguida peça-lhe um número e, se acertar no número gerado recebe uma mensagem a dizer que ganhou. Caso contrário, recebe uma mensagem a dizer que perdeu.
2 - Crie um programa, baseando-se no da aula anterior, que peça os três números de uma equação de 2º grau e a resolva. Caso esta seja impossível, o utilizador deverá ser alertado.
3 - Crie um programa que, primeiro, peça dois números do tipo float e, de seguida, imprima as seguintes instruções:
De seguida deverá pedir a opção ao utilizador e mostrar o resultado consoante a escolha. O resultado deverá ter 3 casas decimais.
Mais uma vez, gostávamos de saber a sua opinião. Se tiver alguma dúvida, pode sempre utilizar os comentários para colocar a questão. Caso o faça, pedimos que utilize a keyword [DUVIDA] no início do seu comentário.
Este artigo tem mais de um ano
Isto faz-me voltar ao 1º ano de faculdade hehehe
Eheh 🙂
Quero só partilhar o seguinte:
“A sanita é um buffer. Quando puxamos o autoclismo estamos a fazer flush ao buffer!”
lol essa comparação
Tenho problemas ao instalar o Cygwin x64 e por isso instalei o x86.
Agora tento corro o compilador no netbeabeans dá-me erro e não consigo sequer que apareça o “Hello World”.
Tenho instalado o netbeans 8 C/C++ com o JDK x64.
Alguma ajuda pff? Já google e já segui as dicas do site do netbeans e do Cygwin…
Olá Hugo!
Experimenta desinstalar tudo isso e voltar a instalar a versão x86 de TODOS pela seguinte ordem: JDK, Cygwin e, finalmente, o Netbeans com C/C++.
O netbeans não existe versão x64 nem x86 certo? O executável é o mesmo.
Sim.
Já reeinstalei tudo nessa ordem e acho que correu bem. Estava difícil.
Obrigado. Cumps
Uma alternativa à limpeza do buffer e bem mais simples é colocar uma espaço antes do %c. Assim \n,\t, espaços, é tudo ignorado.
Ex: sscanf(” %c” , &letra1);
Mas isso apenas funciona com a função scanf. E se quiser utilizar a função getchar? 🙂
Sim apenas funciona para scanf, mas como o scanf é muito mais utilizado, eu considero esta alternativa bastante util. Para o getchar() tem que se limpar o buffer.
parabéns ao autor. muito boa, esta série de artigos.
deixo apenas a pergunta: será que o C é o mais didático/pedagógico? eu comecei com o Scheme, embora haja muita gente a começar no C.
tens de escrever um livro 🙂
Olá Luís.
Em primeiro lugar, quero agradecer-lhe pelo elogio. Em segundo, acho que sim, que C é uma linguagem bastante boa para aprender primeiro. Pode não ser a mais fácil, mas é a raiz: aquela que vai dar noções (tanto meramente teóricas como em termos de sintaxe) de outras muitas linguagens.
Cumps,
A melhor linguagem para aprender a programar é Pascal, sem duvida!
Eu comecei com VisuaBasic 5 há uns anos atrás num curso que tirei, mas foi apenas o básico. Depois comprei um livro que me deu mais alguns conhecimentos.
Há 2 anos comecei a tirar um curso superior e aprendemos C. Gosto de C e recomendo para quem quer começar. Pascal também é bom para começar mas talvez um pouco menos intuitivo que C.
Como aprendi C no âmbito do curso, não sou nenhum expert mas já dá para fazer algumas brincadeiras simples. Neste momento estamos a aprender Assembly e C “misturado” que nós chamamos de Assembly inline. Usamos para programarmos microcontroladores!
Como alternativa ao fflush (stdin),e porque não conhecia o equivalente para linux __fpurge (stdin), eu usava uma macro:
#define CLEAR_INPUT while (getchar() != ‘\n’) /*void*/
Assim podia usar em Windows e em Linux!
cUMPs
Eheh. Também é uma boa solução 🙂
Também é possível criar um include guardian e deixar o próprio sistema operativo escolher qual a função a usar.
Neste momento não me recordo bem como é, mas sei que é algo como:
#if defined(__linux__)
…
#else if defined(_WIN32)
… #else #error “unsupported OS”
#endif
Mas já não me recordo bem desta parte!
Caro Henrique, parabéns pelo curso. Está excelente!!!
Uma curiosidade: qual é o programa que você está usando para montar as apresentações?
Olá José Mendes!
Em primeiro lugar, obrigado. Em segundo, o programa que estou a utilizar para criar as apresentações é o clássico PowerPoint e o Camtasia para gravar o ecrã 😉
Cumprimentos,
Boas, preciso de uma ajuda no segundo exercicio , o da formula resolvente. Dá-me sempre Impossivel, mesmo para casos em que o delta >0. Eu tenho isto:
#include
#include
#include
int main ()
{
double a, b, c, delta, x1, x2;
printf (“Introduza o a, o b e o c: “);
scanf (“%f %f %f”, &a, &b, &c);
delta = (b*b)-(4*a*c);
if (delta < 0)
{
printf("Impossivel");
}
else
{
x1 = (-b – sqrt(delta))/(2*a);
x2 = (-b + sqrt(delta))/(2*a);
printf("%.2f e %.2f", x1, x2);
}
return 0;
}
Ricardo, experimenta a = 2, b = 8 e c = 3. Não sei porquê mas quando copiei esse code para o meu compilador, tive que alterar umas aspas e uns parêntesis porque a compilação dava erro, mas em termos de código não alterei nada!
https://ideone.com/yIMLhK
Descobri o problema, em vez de utilizar a função double, utilizei o float nas definição variáveis e ficou a dar. Não percebi foi o porque do double não funcionar. Mas obrigado pela ajuda
Era mesmo pelo rio de dados usados. No scanf, o %f é para floats e há uma flag para doubles mas não me recordo.