Vamos Programar? – Introdução à Programação #9

24 Comentários

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.

Vamos Programar? – Introdução à Programação #9



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:


Exercícios:

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.

Comentários

24

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Mega
    Mega

    Isto faz-me voltar ao 1º ano de faculdade hehehe

  2. Avatar de Só um gajo
    Só um gajo

    Quero só partilhar o seguinte:

    “A sanita é um buffer. Quando puxamos o autoclismo estamos a fazer flush ao buffer!”

    1. Avatar de Laz0r
      Laz0r

      lol essa comparação

  3. Avatar de Hugo
    Hugo

    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…

    1. Avatar de Henrique Dias

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

      1. Avatar de Hugo
        Hugo

        O netbeans não existe versão x64 nem x86 certo? O executável é o mesmo.

          1. Avatar de Hugo
            Hugo

            Já reeinstalei tudo nessa ordem e acho que correu bem. Estava difícil.
            Obrigado. Cumps

  4. Avatar de Marco Albuquerque
    Marco Albuquerque

    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);

    1. Avatar de Henrique Dias

      Mas isso apenas funciona com a função scanf. E se quiser utilizar a função getchar? 🙂

      1. Avatar de Marco Albuquerque
        Marco Albuquerque

        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.

  5. Avatar de Luís Soares

    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 🙂

    1. Avatar de Henrique Dias

      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,

  6. Avatar de Diogo
    Diogo

    A melhor linguagem para aprender a programar é Pascal, sem duvida!

  7. Avatar de PsySc0rpi0n
    PsySc0rpi0n

    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

    1. Avatar de Henrique Dias

      Eheh. Também é uma boa solução 🙂

      1. Avatar de PsySc0rpi0n
        PsySc0rpi0n

        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!

  8. Avatar de José Antonio Gaeta Mendes
    José Antonio Gaeta Mendes

    Caro Henrique, parabéns pelo curso. Está excelente!!!
    Uma curiosidade: qual é o programa que você está usando para montar as apresentações?

    1. Avatar de Henrique Dias

      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,

  9. Avatar de ricardo
    ricardo

    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;
    }

  10. Avatar de José Carlos Ferreira
    José Carlos Ferreira

    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

    1. Avatar de ricardo
      ricardo

      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

      1. Avatar de José Carlos Ferreira
        José Carlos Ferreira

        Era mesmo pelo rio de dados usados. No scanf, o %f é para floats e há uma flag para doubles mas não me recordo.