Minicalculadora
Nesta tarefa, queremos implementar uma minicalculadora que realiza operações aritimé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:
- todo os comandos em C devem estar dentro de funções e o programa começa na
função
main
- toda variável tem um único tipo e deve ser declarada no início da função
- usamos
scanf
eprintf
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.
- Fazer com que o código acima execute várias vezes, ao invés de uma só.
- 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:
- Crie um novo projeto na linguagem de programação C.
- Escreva o código na janela do editor no meio.
- Clique em run no topo do editor.
- 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 if
... else 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 }