💻

Introdução a Lógica de Programação / Estrutura Sequencial (C)



Nesta guia você será introduzido à linguagem de programação C, dando um resumo e a tradução dos conceitos/comandos já estudados antes. Nas próximas guias teremos explicações mais longas e minuciosas.


1 - Introdução


Sobre a linguagem

A linguagem de programação C é uma das linguagens mais velhas, tendo sido criada na década de 70. Embora tenha os seus 50 anos de história e o seu uso simples, ela segue sendo uma das mais populares entre os programadores e a base para outras linguagens (Java, C++,C# e Python).

Usos de C

C é uma linguagem usada para a realização de tarefas que possuem um padrão, são imperativas, previsíveis e possuem uma estrutura. Portanto, softwares como Windows e Linux usam de C. Também é usado em robótica, telecomunicação e em jogos 3D.

Tipada ou não?

Essa linguagem é muito parecida com o portugol que utilizamos no VisualG, que precisa da declaração de explícita das variáveis, sendo portanto tipada.

Compiladores

Para conseguir escrever em C/C++ no Visual Studio Code, você precisará de um compilador.
Os computadores da escola já possuem um compilador:


Lista dos exemplos

Todos os códigos mostrados aqui estão na pasta (compactada) abaixo. Caso você queria mexer no código e testar para compreender melhor a teoria lida aqui, sinta-se em casa!


2 - Sintaxe

2.1 - O básico

Como dito anteriormente, C possui uma sintaxe muito parecida com o Portugol. Para você entender melhor, aqui vai um exemplo:

💡

#include <stdio.h>

int main() {

printf("Hello World!");

return 0;

}

Comparação de código.

Coisas que não mudaram do Visual G:

Coisas que mudaram do Visual G:

Observação:
Assim como no VisualG, os algoritmos em linguagem C também pulam linhas em branco (ou espaços no geral). Portanto, o código acima pode ser escrito assim:
int main(){printf("Hello World!");return 0;}
No entanto, por razões de compreensão na leitura, é sempre bom dar espaços entre comandos para facilitar a decodificação de bugs futuros.


2.2 - Variáveis

As variáveis que conhecemos possuem nomes diferentes no C:

Tipo de variável (Portugol/C)O que realizamExemplo de comando
InteiroVariável guarda números inteiros;num: inteiro
IntVariável guarda números inteiros;int num;
RealVariável guarda números reais (vírgula);num_real: real
Float ou Double
(Há uma diferença)
Variável guarda números reais (vírgula);float num_real;
CaractereVariável guarda caracteres;nome: caracter
CharVariável guarda caractere;char nome;
StringVariável guarda caracteres;char nome[] = “Maria”;
Observação: O comando Char apenas suporta uma letra. Caso você tente colocar uma palavra maior que uma letra, ele apenas guardará a última letra. Por isso, temos a variável "String", que suporta mais do que uma letra.

Declaração de Variáveis

O sintaxe da declaração de variáveis é parecido;

💡

C:
tipo NomeDaVariável;

int idade;

//Dar um valor para a variável:

idade = 15
————————————————
Portugol:
NomeDaVariável: tipo

nome: caracter

//Dar um valor para a variável:

nome ← Maria

Para declarar múltiplas variáveis também;

💡

C:

int idade, peso; //Apenas declaração;
int idade = 15, peso = 50; //Declaração e dar um valor ao mesmo tempo;
————————————————
Portugol:

nome, cidade: caracter

nome ← Maria
cidade ←Uberaba


Imprimir variáveis

Porém, para imprimir as variáveis, há diferenças gritantes (Os comandos de Portugol “Início, Var, Fimalgoritmo” foram pulados para fins educativos, já que já o entendemos):

💡

Portugol:
nome: caracter //Declaração
nome ← Maria//Dando valor para a variável
escreval(nome)
Resultado: Maria
//Apenas retiramos as aspas para indicar que o “nome” é um comando.
————————————————
C:
int main() {

char nome[] = "Maria"; //Declaração

printf(”%s”,nome); //O equivalente à escreva

return 0;
}
Resultado: Maria
//Além das diferenças de declaração e de dar o valor, para “imprimir” uma variável possuímos comandos e sintaxes específicas.

VariávelComando para imprimirExemplo
Int%d ou %iprintf(”%d”, num);
Float%f ou %Fprintf(”%f”, dizima);
Double%lfprintf(”%lf”, dizima2);
Char%cprintf(”%c”, letra);
String%sprintf(”%s”, nome);
Teste você mesmo: https://www.w3schools.com/c/tryc.php?filename=demo_data_types

Números reais (Float/Double)

Observe um exemplo de código C:

💡

int main() {
float myFloatNum = 3.5;

double myDoubleNum = 19.99;

printf("%f\n", myFloatNum); //O comando \n é o equivalente à quebrar uma linha

printf("%lf", myDoubleNum);
return 0;

}

Pergunta: Quantos dígitos depois da vírgula você acredita que serão imprimidos?

Provavelmente você pensou em um para o primeiro número e dois para o segundo; Entretanto, isso é o que irá ser imprimido:

💡

3.500000

19.990000

Ao contrário do Portugol, em C as variáveis "float/double" imprimem e carregam 6 dígitos após a vírgula.

Tipo de variávelTamanhoDescrição
Float4 bytesGuarda números fracionados, contendo um ou mais decimais. Suficiente para armazenar 6-7 dígitos.
Double8 bytesGuarda números fracionados, contendo um ou mais decimais. Suficiente para armazenar 15 dígitos.

Portanto, para encurtar a quantidade de números após a vírgula, usamos esses comandos:

💡

float myFloatNum = 3.5;

printf("%f\n", myFloatNum);   // Como padrão, 6 números aparecerão depois da vírgula

printf("%.1f\n", myFloatNum); // Mostrará apenas um digíto

printf("%.2f\n", myFloatNum); // Mostrará dois digítos

printf("%.4f", myFloatNum);   // Mostrará quatro digítos

Resultado:

3.500000

3.5

3.50

3.5000


Constantes

Quando você não quer que outros (ou você mesmo) consigam mudar o valor de uma variável, usamos o comando de constante:

💡

const int idade = 15

Fazendo isso, sua variável ficará permanente e apenas para leitura.

Para declarar uma variável constante, apenas a declaração em uma linha funcionará. Caso o contrário, dará erro:

💡

const int idade = 15


const int idade

idade = 15 //ERRO! Declaração de variável constante

Tentar dar outro valor para a constante também dará erro:

💡

const int idade = 15

idade = 17 //ERRO!

Dica: Para variáveis constantes, programadores normalmente declaram o nome em maiúsculo, para facilitar a leitura e o entendimento futuro da próprio programador ou de outros da mesma equipe.

Nomeação e escrita do C

Ao contrário do VisualG, que foi feito em portugol (ou seja, linguagem português-Brasil), o C foi escrito e feito em inglês. Portanto, palavras com acentuação e cedilha não serão aceitas pelo programa, fazendo-o dar erros de visualização não muito bonitos:

De acordo com vários sites, é possível retirar esse erros utilizando comandos e selecionando a nossa língua como português-Brasil. No entanto, não consegui seguir os tutoriais com sucesso e irei escrever sem os acentos ou cedilha. Caso você queira tentar você mesmo, aqui está os links:

https://linguagemc.com.br/localizacao-de-programas-com-locale-h/#:~:text=Também é possível configurar o,Vejamos um segundo exemplo.&text=Utilizamos a função setlocale(),e acentuação específicos do idioma.&text=Um programa escrito em C,detalhadamente a sintaxe da função.&text=onde:,uso corrente do sistema operacional.

https://programacaopratica.com.br/2019/09/17/acentuacao-de-caracteres-em-c-com-locale-h


2.3 Operadores Aritméticos e Relacionais

Aritméticos – O resultado da avaliação é do tipo numérico: inteiro ou real.

OperaçãoOperadorDescriçãoExemplo
Soma+Soma os números;x + y
Subtração-Subtrai os números;x - y
Multiplicação*Multiplica os números;x * y
Divisão/Divide os números;x / y
Resto%Retorna o resto da divisão;x % y
Incremento++Aumenta o valor por 1;++x
Decréscimo- -Diminui o valor por 1;—x

Relacionais – Comparação realizada entre dois valores do mesmo tipo básico.

OperaçãoOperadorDescriçãoExemplo
Igual a==Retorna o valor 1 se as variáveis forem iguais;x==y
Diferente de!=Retorna o valor 1 se as variáveis forem diferentes;x!=y
Maior que>Retorna o valor 1 se uma das variáveis for maior do que a outrax>y
Menor que<Retorna o valor 1 se uma das variáveis for menor do que a outrax<y
Maior ou igual a>=Retorna o valor 1 se uma das variáveis for maior ou igual a outrax>=y
Menor ou igual a<=Retorna o valor 1 se uma das variáveis for menor ou igual a outrax<=y

2.4 - Operadores Lógicos e de Declaração

Utilizaremos três operadores básicos para a formação de novas proposições lógicas compostas a partir de outras proposições lógicas simples.

OperaçãoOperadorDescriçãoExemplo
E&&Retorna o valor 1 se ambas as afirmações forem verdadeiras;x < 5 && x < 10
Ou||Retorna o valor 1 se uma das afirmações forem verdadeiras;x < 5 || x < 4
Não!Reverte o resultado da afirmação (se a afirmação der 1 o não reverte para 0, vice-versa)!(x < 5 && x < 10)

Utilizamos operadores de declaração como jeitos encurtados de declarar/mudar o valor de variáveis. É uma maneira mais rápida de escrever algo, mas não é obrigatória— apenas salva o seu tempo.

OperadorO mesmo queExemplo
=x = 5x = 5
+=x = x + 3x += 3
-=x = x - 3x -= 3
*=x = x * 3x *= 3
/=x = x / 3x /= 3
%=x = x % 3x %= 3
&=x = x & 3x &= 3
|=x = x | 3x |= 3
^=x = x ^ 3x ^= 3
>>=x = x >> 3x >>= 3
<<=x = x << 3x <<= 3

2.5 - Ordem de Operações

Quando há mais do que uma operação, a linguagem C segue a seguinte ordem de operações:


3 - Estrutura Condicional

Importante: Quando usamos as estruturas condicionais, precisamos usar #include <stdbool.h> no cabeçalho do C, caso contrário dará erro.

3.1 - Se, se não, se senão: Sintaxe

if (condição) {
  // bloco de código para ser executado caso a condição for verdadeira.
}

if (condição) {
  // bloco de código para ser executado caso a condição for verdadeira.
} else {
  // bloco de código para ser executado caso a condição for falsa.
}

if (condição1) {
  // bloco de código para ser executado caso a condição1 for verdadeira.
} else if (condição2) {
  // para ser executado caso a condição1 for falsa e condição 2 for verdadeira.
} else {
  // para ser executado caso a condição1 for falsa e condição 2 for falsa.
}

if (condição) {
  // bloco de código para ser executado caso a condição for verdadeira.
  if (condição1) {
    // bloco de código para ser executado caso a condição e condição1 for verdadeira.
  }
}

Tradução:If” = “se”, “Else” = “se não” e “Else If” = “senão se”.

Exemplos:

if (x > 10) {
 printf("X é maior do que 10.")
}

if (x > 10) {
 printf("X é maior do que 10.")
 } else {
  printf("X é menor do que 10.")
  }
  
 if (x > 10) {
 printf("X é maior do que 10.")
 } else if (x = 10) {
  printf("X é igual a 10.")
  } else {
   printf("X é menor do que 10.")
  }
  
  if (x > 10) {
  printf("X é maior do que 10.");
  // Se dentro de um se
  if (y > 20) {
    printf("X é maior que 20 também.");
  }
}

3.2 - Se e Operador lógico

Operador lógico E

int a = 200;
int b = 33;
int c = 500;

if (a > b && c > a) {
  printf("Ambas as condições são verdadeiras\n");
}

Operador lógico OU

int a = 200;
int b = 33;
int c = 500;

if (a > b || a > c) {
  printf("Pelo menos uma condição é verdadeira\n");
}

Operador lógico NÃO

int a = 33;
int b = 200;

if (!(a > b)) { 
  printf("A não é maior que B\n");
}

3.3 - Caso: Sintaxe

switch (variável) {
  case x:
    // bloco de código
    break;
  case y:
    // bloco de código
    break;
  default: //outro caso
    // bloco de código
}

O Comando Break

O comando break automaticamente acaba com o comando, salvando o tempo que a máquina precisaria para verificar se os outros casos são verdadeiros ou não.

Pense assim: “break”, em inglês, pode significar tanto quebra quanto intervalo — Break é um intervalo onde a máquina pode parar o comando e “relaxar” assim que o trabalho estiver pronto (ou seja, a condição seja encontrada).

O default (outrocaso) é opcional na estrutura switch, e não precisa, obrigatoriamente, do comando break (falaremos mais sobre ele nos próximos tópicos).

Tradução:Switch” = “Troca, trocar”, “Default” = “Padrão” e “Case” = “caso”.

Exemplo:

int day = 4;

switch (day) {
  case 6:
    printf("Hoje é Sábado");
    break;
  case 7:
    printf("Hoje é Domingo");
    break;
  default:
    printf("Esperando o final de semana de novo...");
}
//Nesse caso sairá o "Esperando o final de[..]";

4 - Estruturas de Repetição

4.1 - Enquanto: Sintaxe

while (condição) {
  // bloco de código a ser executado;
}

A estrutura de repetição while repete um bloco de código enquanto uma condição for verdadeira.

int i = 0;

while (i < 5) {
  printf("%d\n", i);
  i++;
}
//Sairá os números: 1, 2, 3 e 4.
Teste você mesmo aqui: https://www.w3schools.com/c/tryc.php?filename=demo_while_loop

Contagem regressiva:

Não se esqueça de mudar a variável na condição, porque se não o código nunca vai terminar.
int countdown = 3;

while (countdown > 0) {
  printf("%d\n", countdown);
  countdown--;
}
printf("Feliz Ano Novo!!\n");
Se a condição do while começar falsa, o bloco de código nunca será realizado.

4.2 - “Repita”: Sintaxe

do {
  // bloco de código a ser executado;
}
while (condição);

O comando do/while é uma variante do comando while, onde ele irá executar o bloco de comando uma vez e depois verificar se a condição é verdadeira ou não.

Tradução:Do” = “faça” e “While” = “enquanto”.

Exemplo:

int i = 0;

do {
  printf("%d\n", i);
  i++;
}
while (i < 5);
//Sairá os números: 1, 2, 3 e 4.

Mesmo que a condição em questão seja falsa desde o início, o código ainda será executado:

int i = 10;

do {
  printf("i é %d\n", i);
  i++;
} while (i < 5);
// Sairá "i é 10".
💡

Esse comando possui diferenças do comando “repita”, embora sejam parecidos em sintaxe e uso. Do/While é interessante de se usar quando você quer que uma coisa apareça pelo menos uma vez não importando a condição ser verdadeira ou falsa, como por exemplo um aviso ao usuário.

Um exemplo que estamos bem familiarizados com:

#include <stdio.h>

int main() {
  int number;

  do {
    printf("Entre com um número positivo: ");
    scanf("%d", &number);
  } while (number > 0);

  return 0;
}

O código acima irá pedir para o usuário entrar com um número positivo até ser digitado o número 0.

Iremos aprender melhor sobre o comando “scanf” (o equivalente à leia) nos próximos tópicos.

4.3 - Para: Sintaxe

for (expressão 1; expressão 2; expressão 3) {
// bloco de código a ser executado;
}

Expressão 1 é executada (uma vez) antes da execução do bloco de código.

Expressão 2 é a condição para a execução do código.

Expressão 3 é executado (toda vez) depois que o código é considerado executado.

O exemplo abaixo irá contar os números até 4:

int i;

for (i = 0; i < 5; i++) {
  printf("%d\n", i);
}
//Sairá: 1, 2, 3, 4

Expressão 1 Dá um valor à variável antes do loop começar;

Expressão 2 Define a condição para a execução do código. O bloco de código será executado enquanto a condição for verdadeira.

Expressão 3 É executado (toda vez) depois do código, aumentando o valor da variável por um.

💡

Porém, caso você ache melhor, a expressão 1 e 3 não precisar ser colocada dentro dos parênteses do for. Exemplo abaixo:

int i = 0;

for (; i < 5;) {
	i++;
  printf("%d\n", i);
}
//Sairá: 1, 2, 3, 4
💡

É necessário dos “;” antes e depois da expressão 2 do for.

Loop dentro de um Loop

int i, j;

// Loop de fora
for (i = 0; i <= 2; ++i) {
  printf("Dentro: %d\n", i);  // Executa 2 vezes

  // Loop de dentro
  for (j = 0; j <= 3; ++j) {
    printf("Fora: %d\n", j);  // Executa 6 vezes (2 * 3)
  }
}

//ou

int i = 1, j = 1;

// Loop de fora
for (;i <= 2;) {
  printf("Outer: %d\n", i);  // Executa 2 vezes
	++i
  // Loop de dentro
  for (;j <= 3;) {
    printf(" Inner: %d\n", j);  // Executa 6 vezes (2 * 3)
     ++j
  }
}

5 - Array/Vetor

Sintaxe

int myNumbers[] = {num, num, num, num};

Quando criado um array, evite colocar variáveis de tipo diferente do especificado para o vetor, caso contrário dará erro.

For com Array com tamanho específico:

int myNumbers[] = {25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
  printf("%d\n", myNumbers[i]);
}

For com Array com tamanho variável:

int myNumbers[] = {25, 50, 75, 100};

int length = sizeof(myNumbers) / sizeof(myNumbers[0]);
int i;

for (i = 0; i < length; i++) {
  printf("%d\n", myNumbers[i]);
}

5.1 Multidimensional Array/Matriz

Uma matriz é um tipo de vetor, com colunas e linhas.

int matriz[2][2] = { {1, 4, 2}, {3, 6, 8} };

O primeiro número entre colchetes ([]) significa o número de linhas e o segundo é o número de colunas. Os números entre chaves correspondem a linha 0 e linha 1:

Coluna 0Coluna 1Coluna 2
Linha 0142
Linha 1368
Lembre-se: A primeira coluna/linha na linguagem C é sempre a coluna/linha 0.


6 - Comandos específicos

Break

Você já viu o comando break quando utilizado para finalizar o comando switch (caso). Ele também pode ser usado em loops:

int i;

for (i = 0; i < 10; i++) {
  if (i == 4) {
    break;
  }
  printf("%d\n", i);
}

//Sairá: 1, 2, 3

Continue

O comando continue quebra uma interação dentro do comando de repetição, assim que uma condição específica é verdadeira, para continuar o próximo loop:

int i;

for (i = 0; i < 10; i++) {
  if (i == 4) {
    continue;
  }
  printf("%d\n", i);
}
//Sairá: 1, 2, 3, 5, 6, 7, 8, 9

Scanf() - Leia

Sabemos que usamos printf() para escrever coisas na tela do usuário.

Para recebermos valores do usuário, utilizamos o comando scanf():

int myNum;

printf("Escreva um numero: \n");
//Pegar e salvar o número que o usuário digitar;
scanf("%d", &myNum);

// Escrever o número digitado pelo usuário;
printf("Seu numero e: %d", myNum);

//Sairá:
//Escreva um numero:
//1
//Seu numero e: 1

A função scanf() toma dois argumentos: o tipo da variável e a referência da operação, que armazena o endereço de memória da variável.

Nesse caso, o scanf() espera um número inteiro ser digitado pelo usuário. Caso qualquer coisa que não seja o que o computador espera seja inserida, isso acontece:

Curiosidade: O número “32758” aparece em vez de algo como “0” por causa do jeito que o tipo das variáveis é operado pela linguagem C: 32758 é o número máximo para uma variável do tipo int.

Scanf() - Múltiplos Inputs

Ao contrário do comando “leia” do VisualG, a função scanf() consegue armazenar duas variáveis ao mesmo tempo:

int myNum;
char myChar;

printf("Digite um numero e uma letra e pressione enter: \n");

scanf("%d %c", &myNum, &myChar);

printf("Seu numero e: %d\n", myNum);

printf("Sua letra e: %c\n", myChar);

//Sairá:
//Digite um numero e uma letra e pressione enter:
//3 M
//Seu numero e: 3
//Sua letra e: M

Scanf() - Ler uma linha de texto

Em conjunto com as strings, a função scanf() também consegue ler grandes linhas de texto:

char firstName[30];

printf("Enter your first name: \n");

scanf("%s", firstName);

printf("Hello %s", firstName);
Nota: o string não inclui palavras depois de um espaço, pois ele lê o espaço como o fim do comando.

Para resolver esse problema, precisamos utilizar esses comandos: fgets() para ler uma linha de texto. A sintaxe deve seguir: variável, sizeof(string_name), e stdin:

char fullName[30];

printf("Digite seu nome inteiro: \n");
fgets(fullName, sizeof(fullName), stdin);

printf("Ola %s", fullName);

// Digite seu nome inteiro:
// Maria Cecília
// Ola Maria Cecília

Strings e String

Como já dito anteriormente, usamos string quando queremos guardar mais do que uma só letra (char).

char greetings[] = "Hello World!";

Ao contrário de várias linguagens de programação, o C não possui um tipo de variável específico para guardar texto- portanto, usamos um vetor (que é o string), podendo ser escrito dessa forma:

char greetings[] = "Hello World!";
printf("%c", greetings[0]);
//Sairá: H
Nota: estamos usando o especificador “%c" para imprimir apenas uma letra. Quando utilizamos o comando string normalmente, utilizamos o especificador próprio dele: “%s".

Sabendo que strings não são nada mais do que um vetor, podemos fazer todo tipo de coisa baseado nisso:

char greetings[] = "Hello World!";
greetings[0] = 'J';
printf("%s", greetings);
// Sairá Jello World! em vez de Hello World!
//Loopagem de uma string
char carName[] = "Volvo";
int i;

for (i = 0; i < 5; ++i) {
  printf("%c\n", carName[i]);
}
//Sairá: V o l v o

Strings - Funções especiais

Utilizando do <string.h> no cabeçalho de seu código, temos acesso à diferentes comandos com o string:

Contagem de strings:

char alfabeto[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("%zu", strlen(alfabeto));

//Sairá: 26
Comando utilizados: strlen e %zu

Combinação de strings:

char str1[20] = "Hello ";
char str2[] = "World!";

// Combinar str1 com str2, combinação armazenada na str1
strcat(str1, str2);

// Print str1
printf("%s", str1);
//Sairá: Hello World!
Comando utilizado: strcat

Copiar strings:

char str1[20] = "Hello World!";
char str2[20];

// Copy str1 to str2
strcpy(str2, str1);

// Print str2
printf("%s", str2);
Comando utilizado: strcpy

Comparação de strings:

char str1[] = "Oi";
char str2[] = "Oi";
char str3[] = "Ola";

printf("%d\n", strcmp(str1, str2));  // Retorna 0 (as strings são iguais)

printf("%d\n", strcmp(str1, str3));  // Retorna -4 (as strings não são iguais)
Comando utilizado: strcmp


7 - Prática

Faça todos os exercícios das listas 01 e 02 utilizando a linguagem C.


Copyleft 🄯 2025 - Professor Mauro Borges França.