Tarefa 1 - Minicalculadora

Minicalculadora

Nesta tarefa, queremos implementar uma minicalculadora que realiza operações aritméticas básicas: soma, subtração, multiplicação e divisão.

Entrada

A entrada é formada por um número n de operações na primeira linha seguida de n linhas representado uma operação em cada linha, formatadas como no exemplo:

2
23.8 + 0.5
9 * 3.0

Saída

Para cada operação, seu programa deve imprimir uma linha com o resultado da operação. Para a entrada acima, o seu programa deve imprimir a seguinte saída:

24.3
27.0

Implementando

Vamos implementar somente um programa simplificado que só calcula uma operação de divisão, como em

27.0 / 3

e imprime

9.0

Em Python, poderíamos escrever o seguinte

#!/usr/bin/env python3

operando1, operador, operando2 = input().split()
operando1 = float(operando1)
operando2 = float(operando2)

# verificamos se o operador é de divisão
if operador == '/':
    resultado = operando1 / operando2
    print(resultado)
else:
    print("Erro: operador não reconhecido")

Mas queremos escrever um outro programa que faz a mesma coisa, dessa vez em C. A primeira coisa a observar é que, no código acima, começamos a escrever comandos em qualquer lugar do arquivo. Em C, nós só podemos escrever comandos dentro de funções. A função principal, que é por onde o programa começa a executar, é chamada de main. Todo programa em C se parece mais ou menos com esse:

#include <stdio.h>

int main() {
    /* seus comandos ficarão aqui! */
}

Vamos analisar programa em Python e tentar escrever um equivalente em C. O primeiro comando é operando1, operador, operando2 = input().split() que lê uma linha do teclado, divide essa linha em três partes separadas por espaço e guarda cada parte em uma variável. O motivo por que temos que utilizar a função float para operando1 e operando2 é que a função split irá devolver uma lista com três strings e não podemos realizar uma divisão entre strings. Assim, a função float converte cada um dos operandos em uma variável do tipo de número fracionário.

Neste ponto, temos uma diferença importante para C: enquanto em Python o tipo de uma variável pode mudar dinamicamente, cada variável em C só pode ter valores de um único tipo! Por isso, todas as variáveis em C devem ter o tipo declarado antes de podermos usá-las. Fazemos isso escrevendo o tipo antes do nome da variável, normalmente no início da função.

#include <stdio.h>

int main() {
    float operando1, operando2;
    float resultado;
    char operador;

    /* ... */
}

Lendo o código acima descobrimos que operador tem tipo char, que representa um caractere ASCII. Para terminar o nosso programa, só precisamos aprender a ler variáveis do teclado e imprimir dados na tela. Em C, a mesma função que lê do teclado (scanf), também converte o texto no tipo adequado e a mesma função que escreve na tela (printf), também escreve no formato adequado. O código completo para nosso problema simplificado seria:

#include <stdio.h>

int main() {
    float operando1, operando2;
    float resultado;
    char operador;

    scanf("%f %c %f", &operando1, &operador, &operando2);

    if (operador == '/') {
        resultado = operando1 / operando2;
        printf("%f\n", resultado);
    } else {
        printf("Erro: operador não reconhecido\n");
    }
}

A função scanf lê um texto do teclado que contém um número fracionário (%f), seguido de zero ou mais espaços, seguidos de um caractere (%c), seguido de zero ou mais espaços, seguidos de outro número fracionário (%f). Cada uma dessas partes indicadas com % é guardada na variável correspondente passada como parâmetro. Você deve estar se perguntando por que escrevemos &operando1, ao invés de operando1 etc. Isso serve para indicar que queremos mudar o valor de operando1 e vai ficar mais claro quando aprendermos sobre ponteiros.

A função printf escreve na tela a string do primeiro parâmetro. Se ela encontrar algum indicador especial, como %f, então ela substitui esse indicador pelo valor do parâmetro correspondente, no formato adequado. O motivo que adicionamos \n no final de cada string é que queremos quebrar uma linha; em Python, esse caractere é adicionado automaticamente depois de cada chamada a print.

Observe que tirando a sintaxe diferente (o uso de chaves, os parênteses do if etc.) e as declarações de variáveis, o programa em Python se parece muito com o programa em C. Vamos destacar as principais diferenças:

  1. todo os comandos em C devem estar dentro de funções e o programa começa na função main
  2. toda variável tem um único tipo e deve ser declarada no início da função
  3. usamos scanf e printf para ler e escrever, que convertem os tipos automaticamente usando indicadores especiais (%f para número fracionário, %c para caractere, %d para inteiro decimal etc.)

Resolvendo o exercício

Agora você deve terminar a tarefa sozinh@. Para isso, você deve fazer duas coisas.

  1. Fazer com que o código acima execute várias vezes, ao invés de uma só.
  2. Incluir código para que o programa aceito os outros tipos de operação

Leia os exemplos relacionados abaixo para descobrir como fazer isso.

Compilando e testando

Normalmente, você deve ter um ambiente de desenvolvimento completo que é composto de um editor, um compilador e um terminal de execução. Nas nossas tarefas, no entanto, iremos usar uma ferramenta online que já reúne todos esses elementos em só lugar, chamada repl.it. Nós recomendamos que você crie uma conta para poder salvar as suas tarefas, mas você também pode usar qualquer outra ferramenta de sua preferência. Para testar um programa usando repl.it, basta fazer o seguinte:

  1. Crie um novo projeto na linguagem de programação C.
  2. Escreva o código na janela do editor no meio.
  3. Clique em run no topo do editor.
  4. Clique janela do terminal no lado direito para digitar a entrada e ver a saída de seu programa.

Você já pode completar esta tarefa modificando o código acima para que ele realize diversas operações ao invés de uma só. Para começar com um template do repl.it, clique em Minicalculadora.

Exemplos relacionados

Repetindo um comando usando for:

#include <stdio.h>

int main() {
    int n;
    int i;
    scanf("%d", &n);
    for (i = 0; i < n; i += 1) {
        printf("%d elefantes incomodam muita gente!", i);
    }
}

Se digitamos 10 no teclado, esse programa escreverá

0 elefantes incomodam muita gente!
1 elefantes incomodam muita gente!
2 elefantes incomodam muita gente!
3 elefantes incomodam muita gente!
4 elefantes incomodam muita gente!
5 elefantes incomodam muita gente!
6 elefantes incomodam muita gente!
7 elefantes incomodam muita gente!
8 elefantes incomodam muita gente!
9 elefantes incomodam muita gente!

Escolhemos entre alternativas usando ifelse if else

#include <stdio.h>

int main() {
    int m, n;
    scanf("%d %d", &m, &n);
    if (n == 0) {
        printf("Não podemos dividir por 0!\n");
    } else if (m % n == 0) {
        printf("O número %d é divisível por %d.\n", m, n);
    } else {
        printf("O número %d NÃO é divisível por %d.\n", m, n);
    }
}

Devemos lembrar de usar usar chaves quando houver mais de um comando no bloco. Ao contrário de Python, em C, toda indentação é ignorada pelo compilador. No código a seguir, o último printf sempre é executado, independentemente de n == 0 ou n != 0.

#include <stdio.h>

int main() {
    int m, n;
    scanf("%d %d", &m, &n);
    if (n == 0)
        printf("Não podemos dividir por 0!\n");
    else
        printf("A divisão inteira é  %d.\n", n / n);
        printf("O resto da divisão é %d.\n", m % n); // essa linha NÃO faz parte do else
                                                     // e está mal indentada
}