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:
- Contexto de linguagens de programação e do C
- Estrutura básica de um programa em C
- Tipos de dados
- Atribuição
- Escrevendo informações na tela
- Lendo dados fornecidos pelo usuário
- Sequências de escape
- Variáveis e constantes
- Aritmética, operador de auto-incremento e auto-decremento
- Estruturas de decisão
- Operadores lógicos e operadores relacionais
- Estruturas de repetição
- 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()
{
}
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 ofloat
) -
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;
}
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';
}
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");
}
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);
}
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);
}
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);
}
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;
}
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;
}
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);
}
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++
: significai = i + 1
-
i--
: significai = 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");
}
}
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");
}
}
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");
}
}
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");
}
}
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");
}
}
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:
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);
}
}
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);
}
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:
-
contador = 1
só é utilizado no começo - verificamos se
contador <= 5
, ou seja, se o valor atual docontador
ainda satisfaz essa condição - realizamos a ação de dentro do bloco do
for
, ou seja, dentro dos{}
- incrementamos 1 ao valor atual do
contador
- verificamos se
contador <= 5
- realizamos a operação do bloco
- 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);
}
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"};
}
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)