DEV Community

Cover image for Resumo básico da linguagem C para lógica de programação
Natália Oliveira
Natália Oliveira

Posted on • Updated on

Resumo básico da linguagem C para lógica de programação

Esse texto é para você que acabou de entrar na faculdade e está começando na matéria de lógica de programação, ou que é autodidata e está estudando o assunto. Este é um resumo básico da linguagem C e não contempla todos os seus aspectos, apenas o necessário para que você possa começar a escrever seus primeiros algoritmos.

A proposta aqui é ser um guia rápido, com código, significado, erros comuns e boas práticas, para que você perca menos tempo se preocupando com sintaxe (como “falar” em C por si só) e mais com a lógica e o raciocínio para resolver o problema.

Irei tratar de:

  1. Contexto de linguagens de programação e do C
  2. Estrutura básica de um programa em C
  3. Tipos de dados
  4. Atribuição
  5. Escrevendo informações na tela
  6. Lendo dados fornecidos pelo usuário
  7. Sequências de escape
  8. Variáveis e constantes
  9. Aritmética, operador de auto-incremento e auto-decremento
  10. Estruturas de decisão
  11. Operadores lógicos e operadores relacionais
  12. Estruturas de repetição
  13. Vetores

Observações: não copie os códigos, escreva linha por linha para treinar. Se encontrar um erro não se desespere. Leia o erro, tente entendê-lo, depois copie e pesquise na internet, caso já não tenha encontrado a solução.

Contexto de linguagens de programação e do C

Assim como utilizamos uma linguagem para nos comunicar (linguagem natural), também utilizamos linguagens para “conversar” com o computador. Utilizando uma linguagem podemos dizer ao computador o que fazer, por isso chamamos de linguagem de programação.

Como no final das contas o computador só entende em binário, 1 e 0, ele precisa traduzir e/ou interpretar a linguagem que estamos usando. No caso da linguagem C, ele será compilada para que o computador possa nos entender.

A linguagem C foi criada em 1972 por Dennis Ritchie e é bastante influente até hoje. Para saber mais sobre ela dê uma lida na página do Wikipédia sobre a linguagem.

Estrutura básica de um programa em C

Depois de baixar o software indicado pelo(a) professor(a), crie uma estrutura básica de C assim:

#include <stdio.h>

int main()
{

}
Enter fullscreen mode Exit fullscreen mode

A diretiva #include está dizendo que queremos incluir algo pronto no programa e o <stdio.h> é uma biblioteca padrão do C, que significa standard input/output (“entrada/saída padrão”). Uma biblioteca é como uma coleção de recursos prontos que podemos adicionar ao nosso código.

Erro comum: para fazer qualquer coisa básica no C você precisa colocar #include <stdio.h> no início do seu programa, senão dará erro de compilação.

O int é um indicativo de inteiro (pode pensar em números mesmo), e o main quer dizer função principal. O main será executado primeiro depois que o programa for compilado.

O que estamos expressando nas linhas de 3 a 6 é que queremos iniciar o programa com a função principal e que essa função tem um retorno inteiro. Os () indicam que o main é uma função, e as {} indicam o corpo da função: é onde você, inicialmente, colocará seus códigos.

Erro comum: nunca se esqueça de fechar parênteses, colchetes e chaves nos programas, sempre fazendo os pares.

Sempre que for iniciar um exercício de lógica de programação aproveite e escreva logo essa estrutura básica, para não se esquecer.

Para fazer comentários no programa utilize // comentário e escreva numa linha, ou então utilize o bloco de comentário /* comentário */.

Obs: é possível que seu professor utilize algo como int main(int argc, char *argv[]){}, mas essa estrutura vai mais a fundo na linguagem.

Tipos de dados

Para lidar com diferentes dados, como números ou letras, precisaremos utilizar diferentes tipos de dados. Basicamente você irá lidar com:

  • int: use para números inteiros, entre −32,767 e +32,767
  • float: use para números de ponto flutuante (com parte decimal), como 1555.456 (para o computador o ponto é a vírgula)
  • double: use para números de ponto flutuante bem grandes (tem duas vezes mais “espaço” que o float)
  • char: use para caracteres, como “a”, “M”, etc

No geral esses são os tipos mais comuns, mas você pode consultar essa tabela de tipos mais completa da linguagem C.

Erro comum: se você declarar uma variável de um tipo e guardar, escrever ou ler um dado de outro tipo tem grande chances de dar erro de compilação.

Atribuição

O sinal de igual = é um sinal de atribuição. Isso quer dizer que estamos atribuindo algum dado a uma variável ou constante no nosso programa, ou seja, guardaremos um dado na memória.

Exemplo:

#include <stdio.h>

int main()
{
    int numero = 10;
}
Enter fullscreen mode Exit fullscreen mode

Declaramos o tipo da nossa variável, demos o nome de número a ela e atribuímos o valor 10, que agora está guardado.

Se formos utilizar um char, por exemplo, declaros assim:

#include <stdio.h>

int main()
{
    char sexo = 'M';
}
Enter fullscreen mode Exit fullscreen mode

Não é necessário atribuir um valor logo que declaramos a variável ou constante, você pode apenas inicializá-la, como em int idade;.

Escrevendo informações na tela

Para escrever informações na tela para o usuário faça assim:

#include <stdio.h>

int main()
{
    printf("Olá, mundo");
}
Enter fullscreen mode Exit fullscreen mode

O printf é uma função que temos acesso por causa do <stdio.h>. Ela indica que algo será apresentado na tela para o usuário, e para mostrar a frase nós utilizamos aspas duplas.

Erro comum: lembre-se sempre de fechar as aspas da frase.

O uso de ponto e vírgula ao final de cada instrução é extremamente importante na linguagem C.

Erro comum: se você se esquecer do ponto e vírgula ao final dará erro de compilação.

Para “printar” um int na tela faça o seguinte:

#include <stdio.h>

int main()
{
    int numero = 10;
    printf("%d", numero);
}
Enter fullscreen mode Exit fullscreen mode

Veja como utilizamos o símbolo %d no printf para indicar que estamos printando um inteiro, fechamos as aspas duplas para representar o fim da frase, usamos uma vírgula e colocamos o nome da variável (iremos entender mais de variáveis depois). Cada tipo de dado, para ser printado ou lido, tem um indicador diferente. Veja:

  • int: use %d
  • float: use %f
  • double: use %lf
  • char: use %c

Erro comum: verifique se você usou o % ou se esqueceu de colocá-lo.

Se estiver printando um número de ponto flutuante e quiser definir o número de casas decimais, pode usar %.2f, por exemplo, para limitar para duas casas decimais.

Lendo dados fornecidos pelo usuário

Para ler dados do usuário que está interagindo com o seu programa, faça o seguinte:

#include <stdio.h>

int main()
{
    int idade;

    printf("Digite sua idade: ");
    scanf("%d", &idade);

    printf("Você tem %d anos", idade);
}
Enter fullscreen mode Exit fullscreen mode

Inicializamos uma variável e a deixamos pronta para receber um dado do tipo inteiro, perguntamos a idade com o printf, utilizamos a função scanf para “escanear” o que o usuário digitar, que deve ser um %d, e guardamos na variável idade utilizando o & (“e” comercial ou ampersand).

Erro comum: se você se esquecer de colocar o & o dado não será lido e dará erro.

Obs: para guardar uma string (uma sequência de caracteres, como “Olá”) você pode utilizar um vetor de char com o número de elementos que precisa, como, por exemplo char ola[3].

Sequências de escape

Em algum momento você verá que um print final está “colado” ao terminal, ou então precisará dar um espaço na margem, ou então tentará imprimir aspas duplas dentro de aspas duplas. Para resolver essas situações utilizamos o caracter de escape (backslash): \.

Algumas situações comuns e como representá-las:

  • Para pular uma linha use \n
  • Para adicionar uma tabulação (tab) use \t
  • Para mostra um backslash no print use \\
  • Para usar aspas duplas dentro de aspas duplas use \"

Escreva, compile e rode o código abaixo para ver o resultado:

#include <stdio.h>

int main()
{
    int idade;

    printf("\tOlá! Bem-vindo.\n\n");

    printf("Digite sua idade: \n");
    scanf("%d", &idade);

    printf("Você tem \"%d anos\" de idade\n", idade);
}
Enter fullscreen mode Exit fullscreen mode

Faça um teste: remova todos os \t, \n e \”, salve o código, compile e rode novamente para ver a diferença.

Erro comum: verifique se você está usando a barra invertida mesmo ou se por engano usou a barra comum (/).

Variáveis e constantes

Como já falamos aqui, utilizamos variáveis para guardar um dado no nosso programa. Como o nome já diz, esses dados podem mudar. Para guardar um dado que não deve mudar no seu código utilize constantes.

Variáveis e constantes são guardadas na memória do nosso computador, podendo ser declaradas de imediato (atribuindo um dado) ou apenas inicializadas (sem valor pronto, aguardando serem utilizadas).

Exemplos de variáveis:

#include <stdio.h>

int main()
{
    int idade;
    float area_do_quadrado;
    char sexo = 'M';
    double numero_double = 1222223.999999; 
}
Enter fullscreen mode Exit fullscreen mode

Para declarar constantes, coloque-as logo após a declaração de bibliotecas e utilize a diretiva #define:

#include <stdio.h>

#define SEXO = 'M'
#define PI = 3.14159265359

int main()
{
    int idade;
    float area_do_quadrado;
}
Enter fullscreen mode Exit fullscreen mode

Erro comum: não coloque ponto e vírgula ao final da declaração das constantes e não coloque a diretiva dentro da função main.

Obs: utilize nomes descritivos para as variáveis e constantes. Não é pecado usar um i numa estrutura for, por exemplo, mas sempre que possível tente dar nomes autoexplicativos. O código fica mais fácil de ler, para os outros e também para você mesmo.

Aritmética, operador de auto-incremento e auto-decremento

Lidar com aritmética em C é bastante simples. Veja como representar as expressões: matemáticas:

#include <stdio.h>

int main()
{
    int resultado;

    // soma
    resultado = 10 + 5; 
    printf("%d\n", resultado);

    // subtração
    resultado = 10 - 5;
    printf("%d\n", resultado);

    // multiplicação
    resultado = 10 * 5;
    printf("%d\n", resultado);

    // divisão
    resultado = 10 / 5;
    printf("%d\n", resultado);

    // resto da divisão
    resultado = 10 % 5;
    printf("%d\n", resultado);
}
Enter fullscreen mode Exit fullscreen mode

O operador % numa expressão aritmética é o módulo da divisão, ou seja, é o resto da divisão.

Erro comum: assim como na matemática, na linguagem C temos precedência de operadores, então utilize parênteses para indicar que alguma expressão deve ser calculada antes.

Quando quiser incrementar ou decrementar uma variável de forma automática, faça o seguinte:

  • i++: significa i = i + 1
  • i--: significa i = i - 1

Essas estruturas são muito úteis principalmente em estruturas de repetição. Repare que, como i é uma variável, ela pode ter seu valor atualizado.

Estruturas de decisão

Quando precisamos tomar uma decisão no nosso código utilizamos estruturas de decisão. Alguns exemplos do que isso significa:

  • Se x for igual a 10, incremente: aqui a estrutura que usamos é o if (se)
  • Se x for igual a 10, incremente. Senão, decremente: aqui usamos if else (se… senão)
  • Escolha x caso 1, senão caso 2, senão caso 3: para essa ideia, usamos switch...case (escolha-caso)

Essas situações acima podem ser representadas assim:

#include <stdio.h>

int main()
{
    int numero = 10;

    if (numero == 10)
    {
        print("O número é igual a 10");   
    }
    else
    {
        print("O número não é igual a 10");   
    }
}
Enter fullscreen mode Exit fullscreen mode

O programa acima vai printar “O número é igual a 10”, pois a variável numero é igual a 10. Leia da seguinte forma: “se a variável numero for igual a 10, print que o número é igual a 10, senão, print que não é igual a 10”.

Observe que você pode utilizar somente if sem else, exemplo: “se isso, faça aquilo”. Mas não pode utilizar o else sem um if antes, até porque não faz sentido. Podemos aninhar quantos ifs e elses forem necessários para nossa lógica.

Temos também o else if, onde podemos adicionar mais uma opção para o caso de não cair no 1º if. Observe:

#include <stdio.h>

int main()
{
    int numero = 12;

    if (numero == 10)
    {
        numero++;
    }
    else if (numero == 12)
    {
        printf("Igual a 12.\n");
    }
    else
    {
        printf("Não é igual a nenhuma das opções!\n");
    }
}
Enter fullscreen mode Exit fullscreen mode

Como aqui o numero é igual a 12, irá cair no else if e irá printar “Igual a 12” na tela.

Por fim, temos a estrutura de decisão switch...case, onde pré-determinamos todas as opções que podem ocorrer:

#include <stdio.h>

int main ()
{
  int numero;

  printf ("Digite um numero de 1 a 3: ");
  scanf("%d", &numero);

  switch (numero)
  {
    case 1 :
        printf ("Digitou 1\n");
    break;

    case 2 :
        printf ("Digitou 2\n");
    break;

    case 3 :
        printf ("Digitou 3\n");
    break;

    default :
        printf ("Número inválido!\n");
  }
}
Enter fullscreen mode Exit fullscreen mode

Cairemos no default quando o número digitado não for 1, 2 ou 3.

Obs: preste atenção na indentação do seu código. Indentar é dar aquele espacinho entre a margem esquerda e o começo do código, de modo a deixar a estrutura mais legível. Para o C é muito comum usar 4 espaços (spaces), e basta dar um “Tab” para ajustar. Sempre que você estiver aninhando uma estrutura dentro de outra, por exemplo, é interessante utilizar um recuo.

Operadores lógicos e operadores relacionais

Para relacionar expressões usamos os seguinte operadores:

  • Maior que: >
  • Maior que ou igual a: >=
  • Menor que: <
  • Menor que ou igual a: <=
  • Igual: ==
  • Diferente !=

Pense como na matemática: você estará relacionando duas ou mais expressões.

Veja o exemplo:

#include <stdio.h>

int main()
{
    int idade = 17;

    if(idade > 18)
    {
        printf("Você é maior de idade.\n");
    }
    else
    {
        printf("Você não é maior de idade.\n");
    }
}
Enter fullscreen mode Exit fullscreen mode

Como 17 não é maior que 18, o else entra em ação e printa a mensagem adequada.

Já para fazer expressões lógicas (verdadeiro ou falso) em C temos alguns operadores:

  • E (and): use &&
  • OU (or): use ||
  • NÃO (not): use !

Exemplo:

#include <stdio.h>

int main()
{
    int idade;

    printf("Digite sua idade: \n");
    scanf("%d", &idade);

    if(idade < 18 && idade >=  16)
    {
        printf("Voto facultativo.\n");
    }
}
Enter fullscreen mode Exit fullscreen mode

Repare que na expressão idade < 18 && idade >= 16 estamos relacionando para ver se a idade é menor que 18 E se também é maior ou igual a 16.

Para entender melhor as expressões lógicas, veja a tabela-verdade abaixo:

Alt Text

O && só retorna verdadeiro se ambas expressões forem verdadeiras, o || só precisa que uma seja verdadeira para retornar verdadeiro e o ! inverte a expressão (se for falsa, vira verdadeiro, se for verdadeiro, vira falso). Você pode ler um pouco mais sobre tabelas-verdade aqui.

Erro comum: para evitar confusão em quais expressões lógicas serão verificadas primeiro, adicione parênteses, por exemplo, (idade < 18 && idade >= 16) || (idade > 70).

Estruturas de repetição

Quando precisamos repetir alguma lógica utilizamos as seguintes estruturas:

  • Enquanto houver a condição x, faça isso: aqui utilizamos um while
  • Repita x até que y: é o caso do for
  • Faça x, enquanto houver a condição y: utilizamos o do...while
#include <stdio.h>

int main()
{
    int numero;

    while (numero > 0)
    {
        printf("Digite um número: ");
        scanf("%d", &numero);
    }
}
Enter fullscreen mode Exit fullscreen mode

O programa acima pede para você digitar um número, e enquanto esse número for positivo, ele continuará te perguntando e lendo os números que você digitar. Ou seja, só vai sair da estrutura while quando você digitar um número negativo.

#include <stdio.h>

int main()
{
    int soma = 0;
    int contador;

    for (contador = 1; contador <= 5; contador++)
    {
        soma = soma + contador;
    }

    printf("Soma: %d\n", soma);
}
Enter fullscreen mode Exit fullscreen mode

Nesse programa nós declaramos que a soma inicial é 0 e inicializamos a variável contador. No for, começamos com o contador em 1, e enquanto o contador for menor que ou igual a 5 ele irá atualizar o valor da soma, somando o que já tinha com o valor atual do contador. No final das contas teremos “Soma: 15” printado na tela, que é a soma de 1 + 2 + 3 + 4 + 5.

Repare que:

  1. contador = 1 só é utilizado no começo
  2. verificamos se contador <= 5, ou seja, se o valor atual do contador ainda satisfaz essa condição
  3. realizamos a ação de dentro do bloco do for, ou seja, dentro dos {}
  4. incrementamos 1 ao valor atual do contador
  5. verificamos se contador <= 5
  6. realizamos a operação do bloco
  7. incrementamos 1…

E por aí vai, até que o contador não satisfaça mais a condição.

Agora vamos ao exemplo de do...while:

#include <stdio.h>

int main()
{
    int numero = 1;

    do
    {
        printf("Numero: %d\n", numero);
        numero++;
    }while (numero <= 3);
}
Enter fullscreen mode Exit fullscreen mode

No exemplo acima iremos printar o numero atual, incrementar 1 a variável numero e continuar fazendo isso enquanto ela seja menor ou igual a 3. A diferença do do...while para o while é que no do...while nós iremos entrar no bloco independente se a condição no while do final é verdadeira ou falsa. No while se a condição não for satisfeita inicialmente nem vamos entrar no bloco.

Erro comum: analise bem se você está utilizando a estrutura correta para resolver o problema.

Vetores

Usamos vetores para armazenar uma quantidade certa de dados do mesmo tipo. Declaramos assim:

#include <stdio.h>

int main()
{
    int tabuada[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    char sexo[2];
    char iniciais = {"F", "G", "V"};
}
Enter fullscreen mode Exit fullscreen mode

No código acima nós declaramos um vetor do tipo inteiro chamado tabuada, sendo que o [10] expressa a quantidade de elementos que temos no vetor, que são os números de 1 a 10. Se o vetor tivesse 5 elementos teríamos [5].

Para identificar cada elemento do vetor usamos o seu índice, que começa a ser contado no 0. Exemplo: cada elemento {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} do exemplo acima poderá ser acessado com tabuada[0] que corresponde ao 1, tabuada[1] que corresponde ao 2, tabuada[2] que corresponde ao 3 e por aí vai.

Erro comum: lembre-se de verificar se você está olhando o número correto a partir do seu índice, ou se está contando erroneamente a partir do 1 ao invés de 0.


Por hora é isso. Acompanhe as aulas ou tutoriais que esteja fazendo e acompanhe com esse artigo para se lembrar da sintaxe. Para aprofundar seu conhecimento na linguagem C recomendo fortemente o livro Linguagem C: Completa e descomplicada, do professor André Backes.


Fontes:
Photo by CDC on Unsplash
C data types
Truth table Wikipedia


Esse texto não tem intenção de esgotar o tema. Acrescente nos comentários, e também aponte erros quando os identificar.

Top comments (0)