Exercícios de variáveis, operadores e entrada/saída (printf e scanf) em C

Reunimos 13 exercícios, do iniciante ao avançado, que usam variáveis, operadores aritméticos e printf / scanf. Escreva seu código no navegador e clique em "Corrigir": ele é executado com gcc de verdade em várias entradas e a saída é verificada.

Como usar estes exercícios
  1. Leia o enunciado e o exemplo de execução e escreva seu código no campo abaixo
  2. Clique em "▶ Executar" para testar com a sua própria entrada
  3. Clique em "✔ Corrigir" para verificar a saída com várias entradas preparadas
  4. Travou? Abra a "Dica". Resolveu? Compare com "Solução e explicação"
Regras da correção
  • Imprima a saída exatamente como no exemplo. Não imprima mensagens pedindo a entrada, como "Digite um número"
  • Espaços no fim das linhas e linhas em branco no final são ignorados
  • Seu código é salvo automaticamente neste navegador

Obs.: Executar e Corrigir enviam seu código ao Wandbox, um serviço externo e gratuito de compilação, que o executa com gcc.

13 exercícios (Iniciante 4 · Intermediário 5 · Avançado 4)

Variáveis, operadores e E/S (13 exercícios)

B01 Iniciante

Exercício 1. As quatro operações com dois inteiros

Leia dois inteiros a e b (−10000 ≤ a, b ≤ 10000, b ≠ 0) separados por espaço e mostre a soma, a diferença (a−b), o produto, o quociente e o resto, um por linha, como no exemplo. O quociente e o resto devem ser exatamente os resultados de / e % em C.
Exemplo de execução (a entrada está sublinhada)
17 5 Soma: 22 Diferença: 12 Produto: 85 Quociente: 3 Resto: 2
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 5 entradas preparadas.
Entre dois int, a / b é uma divisão inteira (a parte fracionária é descartada) e a % b é o resto. Você pode mostrar o resultado diretamente, como em printf("Quociente: %d\n", a / b);.
#include <stdio.h>

int main(void) {
    int a, b;
    scanf("%d %d", &a, &b);

    printf("Soma: %d\n", a + b);
    printf("Diferença: %d\n", a - b);
    printf("Produto: %d\n", a * b);
    printf("Quociente: %d\n", a / b);
    printf("Resto: %d\n", a % b);
    return 0;
}
Explicação: A divisão inteira em C trunca em direção a 0. Por isso −7 / 2 dá −3, e não −4, e o resto é definido de modo que a == (a / b) * b + a % b, ou seja, −1 (o resto tem o mesmo sinal de a). No scanf, cuidado também para não esquecer o &, como em &a.
B02 Iniciante

Exercício 2. Área e perímetro do círculo

Leia o raio r de um círculo (0 < r ≤ 1000, pode ter casas decimais) e mostre a área e o comprimento da circunferência com duas casas decimais. Use 3.14159 como valor de pi.
Exemplo de execução (a entrada está sublinhada)
2.5 Área: 19.63 Perímetro: 15.71
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 5 entradas preparadas.
Como há casas decimais, use o tipo double. No scanf use %lf; no printf, para duas casas decimais, use %.2f. A área é PI * r * r e o perímetro é 2 * PI * r.
#include <stdio.h>

int main(void) {
    const double PI = 3.14159;
    double r;
    scanf("%lf", &r);

    printf("Área: %.2f\n", PI * r * r);
    printf("Perímetro: %.2f\n", 2 * PI * r);
    return 0;
}
Explicação: Para ler um double, escrever scanf("%f", &r) está errado (%f é para float). Memorize: %lf no scanf e %f no printf. %.2f arredonda a partir da terceira casa decimal e mostra duas casas (o valor da variável em si não muda). Porém, como o double é uma aproximação em binário, às vezes um "5" exatamente nessa posição não arredonda para cima, como 2.675 virando 2.67.
B03 Iniciante

Exercício 3. De Celsius para Fahrenheit

Leia uma temperatura C em graus Celsius (−100 ≤ C ≤ 1000, pode ter casas decimais) e mostre a temperatura em Fahrenheit, F = C × 9 / 5 + 32, com uma casa decimal.
Exemplo de execução (a entrada está sublinhada)
36.6 Fahrenheit: 97.9
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 5 entradas preparadas.
Se você escrever a fórmula diretamente como c * 9 / 5 + 32, como c é double, o cálculo também é feito em double. Cuidado com formas de escrever que calculam 9 / 5 primeiro.
#include <stdio.h>

int main(void) {
    double c;
    scanf("%lf", &c);

    double f = c * 9 / 5 + 32;
    printf("Fahrenheit: %.1f\n", f);
    return 0;
}
Explicação: Se você escrever c * (9 / 5) + 32, 9 / 5 vira 1 por ser uma divisão entre inteiros, e a fórmula fica errada: F = C + 32. Escreva um dos números com casa decimal, como 9.0 / 5, ou multiplique por c primeiro (da esquerda para a direita) para virar double antes de dividir.
B04 Iniciante

Exercício 4. Dígitos de um número de 3 algarismos e o número invertido

Leia um inteiro N de 3 algarismos (100 ≤ N ≤ 999) e mostre o algarismo das centenas, das dezenas e das unidades. Em seguida, mostre como inteiro o número formado pelos algarismos em ordem inversa (por exemplo, para 120, mostre 21). Não é preciso usar laços.
Exemplo de execução (a entrada está sublinhada)
123 Centenas: 1 Dezenas: 2 Unidades: 3 Invertido: 321
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
As centenas são n / 100, as dezenas n / 10 % 10 e as unidades n % 10. O número invertido pode ser montado com unidades * 100 + dezenas * 10 + centenas.
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    int h = n / 100;
    int t = n / 10 % 10;
    int o = n % 10;

    printf("Centenas: %d\n", h);
    printf("Dezenas: %d\n", t);
    printf("Unidades: %d\n", o);
    printf("Invertido: %d\n", o * 100 + t * 10 + h);
    return 0;
}
Explicação: Pense em / como "descartar os algarismos de baixo" e em % como "manter só os algarismos de baixo": assim você extrai qualquer posição. Se você mostrar o invertido colocando os três lado a lado com printf("%d%d%d", o, t, h), para 120 aparece 021, que não é o inteiro 21.
B05 Intermediário

Exercício 5. Total e média de 3 notas

Leia as notas de 3 disciplinas (inteiros de 0 a 100) separadas por espaço e mostre o total e a média. A média deve ser mostrada com duas casas decimais.
Exemplo de execução (a entrada está sublinhada)
80 75 91 Total: 246 Média: 82.00
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 5 entradas preparadas.
Calcule o total como int. Para a média, em vez de sum / 3, use (double)sum / 3 ou sum / 3.0, para dividir mantendo as casas decimais.
#include <stdio.h>

int main(void) {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);

    int sum = a + b + c;
    double avg = (double)sum / 3;

    printf("Total: %d\n", sum);
    printf("Média: %.2f\n", avg);
    return 0;
}
Explicação: Mesmo escrevendo double avg = sum / 3;, o lado direito é uma divisão entre int, então a parte decimal é descartada antes: 299 / 3 vira 99 → 99.00. O segredo é converter o tipo (cast) com (double) antes de dividir. Escrever (double)(sum / 3), com parênteses, não adianta, pois a conversão acontece depois do truncamento.
B06 Intermediário

Exercício 6. Converter segundos em horas:minutos:segundos

Leia uma quantidade de segundos N (0 ≤ N ≤ 360000) e mostre-a no formato "horas:minutos:segundos". Minutos e segundos devem ter 2 dígitos (com zero à esquerda quando tiverem 1 dígito); as horas são mostradas como estão, sem largura fixa.
Exemplo de execução (a entrada está sublinhada)
3725 1:02:05
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 5 entradas preparadas.
As horas são n / 3600, os minutos n % 3600 / 60 e os segundos n % 60. Para mostrar com 2 dígitos preenchidos com zero, use %02d.
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    int h = n / 3600;
    int m = n % 3600 / 60;
    int s = n % 60;

    printf("%d:%02d:%02d\n", h, m, s);
    return 0;
}
Explicação: Se os minutos forem n / 60, 3725 segundos dão 62 minutos, ou seja, incluem também os minutos que já viraram horas. Primeiro use % 3600 para ficar com "o que sobra abaixo de 1 hora" e depois divida por 60. Com %2d o preenchimento é feito com espaços e sai 1: 2: 5; para preencher com zeros, use %02d.
B07 Intermediário

Exercício 7. Dividir um valor em notas e moedas

Leia um valor de N ienes (0 ≤ N ≤ 100000) e, usando notas de 1000 ienes e moedas de 500, 100, 50, 10, 5 e 1 iene, mostre quantas de cada são usadas para pagar com o menor número total de notas e moedas, no formato do exemplo, da maior para a menor.
Exemplo de execução (a entrada está sublinhada)
1888 1000 ienes: 1 500 ienes: 1 100 ienes: 3 50 ienes: 1 10 ienes: 3 5 ienes: 1 1 iene: 3
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
Começando pelo maior valor, calcule a quantidade com n / 1000 e atualize o valor restante com n %= 1000;. Continue assim com 500, 100, …
#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    printf("1000 ienes: %d\n", n / 1000);
    n %= 1000;
    printf("500 ienes: %d\n", n / 500);
    n %= 500;
    printf("100 ienes: %d\n", n / 100);
    n %= 100;
    printf("50 ienes: %d\n", n / 50);
    n %= 50;
    printf("10 ienes: %d\n", n / 10);
    n %= 10;
    printf("5 ienes: %d\n", n / 5);
    n %= 5;
    printf("1 iene: %d\n", n);
    return 0;
}
Explicação: É a combinação clássica de / e %: "o quociente é a quantidade, o resto é o valor que passa para a próxima". n %= 1000; é a forma abreviada (atribuição composta) de n = n % 1000;. Se você esquecer de atualizar o restante, o resultado fica estranho, como 18 moedas de 100 ienes para 1888 ienes.
B08 Intermediário

Exercício 8. Código do caractere, maiúsculas e minúsculas

Leia uma letra maiúscula (A a Z) e mostre, no formato do exemplo, o seu código de caractere (código ASCII), a minúscula correspondente e a sua posição no alfabeto (A é a posição 1).
Exemplo de execução (a entrada está sublinhada)
C Código: 67 Minúscula: c Posição: 3
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
Um char é um inteiro pequeno: mostrado com %d vira o código do caractere, e com %c vira o caractere. A minúscula pode ser calculada com c - 'A' + 'a' e a posição com c - 'A' + 1.
#include <stdio.h>

int main(void) {
    char c;
    scanf(" %c", &c);

    printf("Código: %d\n", c);
    printf("Minúscula: %c\n", c - 'A' + 'a');
    printf("Posição: %d\n", c - 'A' + 1);
    return 0;
}
Explicação: 'A' é um inteiro que representa o valor do código do caractere (65 em ASCII). Em ASCII, A a Z e a a z ficam em sequência, então basta somar ou subtrair "quanto a letra está distante de A" para converter. Escrever 'a' - 'A' deixa a intenção mais clara do que escrever diretamente um número como 32.
B09 Intermediário

Exercício 9. Parte inteira, parte fracionária e arredondamento

Leia um número decimal x não negativo (0 ≤ x < 100000, com até duas casas decimais) e mostre a parte inteira, a parte fracionária (com duas casas decimais) e o inteiro obtido arredondando na primeira casa decimal (0.5 arredonda para cima). Use cast (conversão de tipo) e não use funções de math.h.
Exemplo de execução (a entrada está sublinhada)
3.7 Parte inteira: 3 Parte fracionária: 0.70 Arredondado: 4
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 5 entradas preparadas.
(int)x descarta a parte fracionária e dá a parte inteira. A parte fracionária é x - (int)x. Arredondar é "somar 0.5 e depois truncar", ou seja, (int)(x + 0.5).
#include <stdio.h>

int main(void) {
    double x;
    scanf("%lf", &x);

    int ip = (int)x;
    double fp = x - ip;
    int rounded = (int)(x + 0.5);

    printf("Parte inteira: %d\n", ip);
    printf("Parte fracionária: %.2f\n", fp);
    printf("Arredondado: %d\n", rounded);
    return 0;
}
Explicação: A conversão de double para int trunca em direção a 0. Se você escrever (int)x + 0.5, primeiro trunca e depois soma 0.5, o que não arredonda (atenção à posição dos parênteses). Além disso, somar 0.5 só funciona quando x é 0 ou positivo; com números negativos, −2.7 viraria −2.
B10 Avançado

Exercício 10. IMC e peso ideal

Leia o peso w [kg] (pode ter casas decimais) e a altura h [cm] (inteiro) separados por espaço e mostre o IMC = peso ÷ (altura[m])² e o peso ideal = 22 × (altura[m])², com uma casa decimal (30 ≤ w ≤ 200, 100 ≤ h ≤ 250).
Exemplo de execução (a entrada está sublinhada)
60 170 IMC: 20.8 Peso ideal: 63.6kg
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 5 entradas preparadas.
Primeiro converta a altura para metros. Como h é int, h / 100 vira uma divisão inteira. Use h / 100.0 e guarde o resultado em um double.
#include <stdio.h>

int main(void) {
    double w;
    int h;
    scanf("%lf %d", &w, &h);

    double m = h / 100.0;
    double bmi = w / (m * m);
    double std = 22 * m * m;

    printf("IMC: %.1f\n", bmi);
    printf("Peso ideal: %.1fkg\n", std);
    return 0;
}
Explicação: Em double m = h / 100;, 170 / 100 vira 1 pela divisão inteira e só depois é atribuído ao double, então m = 1.0. A armadilha é que, mesmo que a variável de destino seja double, o cálculo do lado direito é feito com os tipos do lado direito. Além disso, w / m * m significa (w / m) * m e volta praticamente a w, por isso os parênteses são necessários.
B11 Avançado

Exercício 11. Montar um recibo

Leia 3 linhas no formato "preço quantidade" (preço unitário de 1 a 99999 e quantidade de 1 a 99, inteiros) e mostre um recibo como no exemplo. Cada linha de item deve ser mostrada com o formato printf("%5d x %2d = %6d\n", preço, quantidade, valor). Em seguida, mostre Subtotal, Imposto (10% do subtotal, descartando frações de iene) e Total, cada um no formato "Subtotal: %d\n".
Exemplo de execução (a entrada está sublinhada)
120 3 1980 1 85 12 120 x 3 = 360 1980 x 1 = 1980 85 x 12 = 1020 Subtotal: 3360 Imposto: 336 Total: 3696
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 4 entradas preparadas.
%5d significa "largura mínima de 5 caracteres, alinhado à direita". Se você calcular o imposto em int como sub * 10 / 100, a divisão inteira já descarta as frações de iene.
#include <stdio.h>

int main(void) {
    int p1, q1, p2, q2, p3, q3;
    scanf("%d %d", &p1, &q1);
    scanf("%d %d", &p2, &q2);
    scanf("%d %d", &p3, &q3);

    int s1 = p1 * q1;
    int s2 = p2 * q2;
    int s3 = p3 * q3;
    printf("%5d x %2d = %6d\n", p1, q1, s1);
    printf("%5d x %2d = %6d\n", p2, q2, s2);
    printf("%5d x %2d = %6d\n", p3, q3, s3);

    int sub = s1 + s2 + s3;
    int tax = sub * 10 / 100;
    printf("Subtotal: %d\n", sub);
    printf("Imposto: %d\n", tax);
    printf("Total: %d\n", sub + tax);
    return 0;
}
Explicação: A largura indicada é a largura mínima, então valores com mais de 6 dígitos, como 9899901, não são cortados e aparecem inteiros (3º teste). Se você calcular com decimais, como sub * 0.1, o tipo não combina com o %d na hora de mostrar. O mais seguro é manter dinheiro em int e multiplicar antes de dividir (na ordem sub / 100 * 10, 1343 ienes dariam 130 ienes de imposto).
B12 Avançado

Exercício 12. Divisão e resto com números negativos

Leia um inteiro a (−10000 ≤ a ≤ 10000) e um inteiro positivo b (1 ≤ b ≤ 10000) e mostre os valores de a / b e a % b em C, o valor de (a / b) * b + a % b como verificação e o resto matemático (o resto que fica entre 0 e b − 1).
Exemplo de execução (a entrada está sublinhada)
-7 3 Quociente: -2 Resto: -1 Verificação: -7 Resto matemático: 2
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 5 entradas preparadas.
Em C, % devolve um resto negativo quando a é negativo. Somando b e tirando de novo o resto da divisão por b, ou seja, (a % b + b) % b, você obtém sempre um resto maior ou igual a 0.
#include <stdio.h>

int main(void) {
    int a, b;
    scanf("%d %d", &a, &b);

    int q = a / b;
    int r = a % b;
    int m = (r + b) % b;

    printf("Quociente: %d\n", q);
    printf("Resto: %d\n", r);
    printf("Verificação: %d\n", q * b + r);
    printf("Resto matemático: %d\n", m);
    return 0;
}
Explicação: Desde o C99, a divisão inteira trunca em direção a 0 (−7 / 3 é −2.33… → −2). O resto é definido para que (a / b) * b + a % b == a valha, por isso é −1. Ao lidar com valores negativos em cálculos de dia da semana ou de relógio, só r + b não basta, pois dá b quando r = 0; por isso no final se aplica % b mais uma vez.
B13 Avançado

Exercício 13. Somar minutos a um horário

Leia a hora h (0 a 23) e os minutos m (0 a 59) de um horário inicial e um tempo decorrido de t minutos (0 ≤ t ≤ 100000), separados por espaço, e mostre o horário após t minutos no formato HH:MM (ambos com 2 dígitos e zero à esquerda, formato 24 horas). Na linha seguinte, mostre quantos dias a data avançou, no formato +N dia(s).
Exemplo de execução (a entrada está sublinhada)
23 30 90 01:00 +1 dia(s)
Seu código
"Executar" roda seu código com a entrada acima. "Corrigir" testa com 5 entradas preparadas.
Não trate horas e minutos separadamente: primeiro converta tudo em "minutos totais desde 0h00", h * 60 + m + t. A partir daí, os dias são / 1440 e os minutos dentro do dia são % 1440.
#include <stdio.h>

int main(void) {
    int h, m, t;
    scanf("%d %d %d", &h, &m, &t);

    int total = h * 60 + m + t;
    int days = total / 1440;
    int rest = total % 1440;

    printf("%02d:%02d\n", rest / 60, rest % 60);
    printf("+%d dia(s)\n", days);
    return 0;
}
Explicação: Somar 45 aos minutos e, se passar de 60, aumentar a hora em 1… fazer o "vai um" separadamente aumenta os desvios condicionais e facilita erros. Converter primeiro para a menor unidade (minutos) e depois decompor com / e % é a técnica padrão para horários e conversões de unidade (1 dia = 24 × 60 = 1440 minutos).

Revise estas aulas

← Voltar para todos os exercícios