Você está na página 1de 22

12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

Imprimir

CONCEITOS DE PROGRAMAÇÃO

0
121 minutos

seõçatona reV
 Aula 1 - Introdução a conceitos de programação
 Aula 2 - Introdução à linguagem C

 Aula 3 - Estruturas condicionais em linguagem C

 Aula 4 - Operadores na linguagem C

 Referências

Aula 1

INTRODUÇÃO A CONCEITOS DE PROGRAMAÇÃO


Chegamos à unidade em que estudaremos os conceitos de lógica de programação aplicados a
uma linguagem específica de programação: a linguagem C!
33 minutos

INTRODUÇÃO
Olá, estudante! Chegamos à unidade em que estudaremos os conceitos de lógica de programação aplicados
a uma linguagem específica de programação: a linguagem C! Essa linguagem é o meio pelo qual os
comandos que indicarmos serão realizados pelo computador para produzir a saída esperada para o
programa. Você já aprendeu que a assertividade de um programa depende de sua construção, isto é, da
escolha correta dos passos que o compõem, e de forma que os comandos sejam executados em uma
sequência lógica. Nesta unidade, estudaremos como a linguagem de programação e um ambiente de
desenvolvimento nos fornecem as estruturas necessárias para realizarmos o processamento lógico das
informações. Te convido para vivenciar essa realidade que é a base de qualquer sistema ou produto digital,
vamos lá?

CONCEITOS BÁSICOS DE LINGUAGEM DE PROGRAMAÇÃO


Todos os sistemas que utilizamos no nosso dia a dia foram desenvolvidos em alguma linguagem de
programação! Do mais avançado software de engenharia ao jogo mais popular dos smartphones, todos eles
são uma construção de comandos de programação organizados de forma lógica. As linguagens de
programação foram evoluindo com o tempo, e para cada propósito de aplicação escolhemos a mais
adequada.

Uma analogia pode ser feita com a língua nativa, a língua estrangeira, ou ainda uma linguagem mais formal
ou mais descolada, que deriva de uma língua.

Ah, aqui também cabe uma observação interessante, um programa construído com uma linguagem de
programação tem o mesmo significado no mundo todo; outra informação importante é que praticamente
todas as linguagens de programação têm seus comandos escritos em inglês.

Nossa disciplina adota a linguagem C, uma linguagem amplamente utilizada e que é base para diversas
outras linguagens comerciais atualmente, e por meio dos exemplos práticos você verá como ela realiza as
operações necessárias no campo da programação. Em relação à linguagem adotada na nossa disciplina,
saiba que a linguagem C é umas das mais populares, e por suas características de acesso e manipulação de
recursos computacionais como a memória, é muito utilizada em áreas da engenharia, computação e
especialmente na eletrônica, além de também ser utilizada para construir bibliotecas nativas de outras
linguagens de programação.

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&ati… 1/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

Como toda linguagem, a linguagem C possui uma quantidade finita de palavras e símbolos, eles são
chamados de tokens, isso quer dizer que para criarmos um código-fonte devemos escolher tokens que
existam na linguagem. Cada token da linguagem tem um significado no contexto da programação, que
inclusive pode mudar conforme a ordem em que são organizados. Estes tokens podem ser um comando na
linguagem, um operador (relacional, condição ou lógico) ou ainda uma palavra reservada para caracterizar

0
algum identificador.

seõçatona reV
Agora que você já conhece as características de linguagens de programação pode estar se perguntando
como seus tokens são compreendidos pelo computador, certo? Aqui surge a necessidade de abordarmos o
Compilador e o Interpretador, que são os sistemas computacionais capazes de receber um código escrito
em uma linguagem de programação e tornar esse código um programa executável.

Os programadores escrevem códigos-fonte com comandos da linguagem de programação, e o compilador é


o responsável por criar um código de significado equivalente ao código do programador, de forma que o
computador processe esse código e execute os comandos adotados.

Aqui cabe destacar que problemas de lógica não são identificados pelo compilador, ou seja, um programa
que foi construído com os elementos corretos e respeitando as regras da linguagem pode, ainda assim,
apresentar erros de lógica e possíveis erros de execução dependendo das entradas a que foi submetido.

Tanto para elaborar quanto para editar o código-fonte é necessário um software, assim como o compilador
e o interpretador também são um software executável. É possível que um mesmo sistema integre o
software de editor e o compilador, a ele damos o nome de Ambiente Integrado de Desenvolvimento,
também conhecido pela sigla IDE, do inglês Integrated Development Environment. Uma descrição dessa
composição é apresentada pela Figura 1.

Figura 1 | Composição de uma IDE

Fonte: elaborada pela autora.

Até aqui você foi apresentado:

• À linguagem C.

• Ao compilador necessário para transformar o código escrito em C em um programa executável pelo


computador.

• E à IDE, uma ferramenta de software que serve como um ambiente de trabalho.

COMPILADORES E INTERPRETADORES
Para aprofundar mais nossos conhecimentos sobre as linguagens vamos conhecer mais algumas de suas
características:

• Podem ser de mais alto nível: como Python, java e php.

• Podem ser de mais baixo nível: como C e Assembly.

• E ainda existem linguagens que derivam de outras linguagens: como C# e C++.

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&ati… 2/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

Dizemos que uma linguagem é de alto nível quando o usuário se distancia dos aspectos estruturais do
código, utilizando um alto nível de abstração para executar comandos. Em uma comparação, é como se
estivéssemos localizando um país no globo terrestre, obtendo sua localização, limites e fronteiras, porém
sem maiores detalhes.

0
Já uma linguagem de baixo nível é aquela em que o usuário tem total controle e conhecimento das
estruturas e dados que estão sendo manipulados, o que também faz com que mais detalhes precisem ser

seõçatona reV
adicionados para a construção do programa. Utilizando a mesma comparação anterior, é como se
estivéssemos nos localizando em uma cidade com o GPS, observando as ruas e características das quadras.

Assim como na comunicação que conhecemos na sociedade, em que utilizamos as palavras disponíveis na
linguagem, e respeitamos as regras de construção das frases, no contexto de programação também há
regras a serem respeitadas em todas as linguagens, independentemente do nível em que esteja inserida.

Algumas linguagens como PHP e JavaScript normalmente não necessitam de compilador, e sim de
interpretador, enquanto a linguagem Java costuma depender tanto de compilador quanto de interpretador
e a linguagem C, utilizada na nossa disciplina, utiliza compilador (MANZANO, 2015), e mais adiante vamos
detalhar seu funcionamento prático.

Primeiramente, vamos entender o contexto e a necessidade de utilizar um compilador: o computador


trabalha com estruturas e objetos binários, ou seja, independentemente se o computador está manipulando
um texto, um número, uma imagem ou as instruções de um programa, na prática ele está processando 0s e
1s. Porém, você deve concordar que seria humanamente inviável para os programadores escreverem
programas e instruções somente com a representação de 0s e 1s.

Podemos então definir o compilador como um tradutor de linguagens, em que a linguagem de saída é
sempre de um nível mais baixo que o nível de entrada. O programa de saída costuma ser construído em
binário, linguagem simbólica ou linguagem de máquina, sempre constituído somente por cadeias de 0s e 1s.

Em alguns casos, o erro apontado pelo compilador não o impede de gerar o programa em binário, porém,
em alguns casos, o compilador não consegue gerar o programador executável, sendo preciso localizar o erro
e corrigi-lo, para depois tentar compilar novamente. Essa é uma atuação importante do compilador, pois
evita que um programa com uma construção falha seja executado, pelo contrário, o compilador muitas
vezes aponta para o programador qual foi o erro encontrado.

Cada IDE tem uma forma visual de representar esses possíveis erros, algumas delas até mostram os erros
na construção do programa enquanto o programador digita, ou seja, ainda antes da análise do compilador.

• Essas e outras funcionalidades fazem com que as IDEs sejam vistas como ferramentas que melhoram a
produtividade dos programadores. As IDEs evoluíram muito com o tempo, há uma grande variedade
disponível para linguagens populares como o C, e algumas delas são: Visual Studio, CodeBlocks, DevC,
Eclipse, NetBeans.

E para outras linguagens também podem ser usadas as IDEs citadas acima ou ainda outras tantas existentes
no mercado.

AMBIENTE DE PROGRAMAÇÃO
Estudante, chegamos ao momento em que aplicamos os conceitos aprendidos!

Assim como na nossa língua, para o perfeito entendimento do código realizamos a análise léxica e a
sintática, sendo a primeira sobre a grafia correta ou existência de cada token presente no código-fonte, e a
segunda sobre a forma e a ordem em que os tokens foram inseridos no código-fonte, se há uma
concordância entre si.

Ou seja, na prática, a atividade do compilador é similar à de um tradutor que realiza a dublagem ou a


legenda de um filme, quando a frase ou a palavra que está sendo traduzida se apresenta de maneira
errônea, dúbia ou que não permita o entendimento, esse profissional busca entender o contexto, realiza
uma sugestão de adequação ou mesmo para a execução para elucidar a dúvida. No caso do compilador é
muito parecido, pois quando o programador cria um código que apresenta erros ou falhas em sua
construção, o compilador precisa reconhecer e apontar essa divergência, para que o programador proceda
com a correção.

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&ati… 3/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

Quando o código não apresenta erros, o compilador então cria um código de máquina “semanticamente
equivalente”, ao código criado pelo programador na linguagem de programação. Neste aspecto novamente
aparece a figura do ambiente de programação como um aliado do programador! Pois algumas IDEs
identificam em tela a estrutura física do código, a posição dos pares de parênteses, chaves e colchetes,
podendo realizar o autopreenchimento do nome de variáveis e ainda outras facilidades como sugestão de

0
melhoria e, consequentemente, menos erros no código. Um destaque de diferentes cores está apresentado
na Figura 2.

seõçatona reV
Figura 2 | Tela de um código sendo editado em uma IDE

Fonte: captura de tela de Code: Blocks elaborada pela autora.

Assim como existem variações entre ferramentas, existem IDEs mais amigáveis, mais robustas, mais
profissionais, mais leves e com mais ou menos recursos ao programadores, sendo que algumas são
gratuitas e outras são pagas. A escolha da IDE também dependerá da linguagem de programação adotada e
do compilador selecionado.

Os programadores podem (e devem!) configurar e customizar a IDE que escolheram para trabalhar, pois
além de realizar as atividades básicas de programação, ela acaba oferecendo outros recursos desejáveis
para o programador. A grande maioria das IDEs oferecem identificador de erros por meio de uma análise
léxica no próprio editor e no instante em que o programador digita, sem a necessidade de compilar o
código.

Esses e outros recursos são essenciais no dia a dia do programador para que ele ganhe em produtividade,
principalmente quando o tamanho dos projetos cresce consideravelmente.

Neste contexto, inicialmente a IDE parece ser muito complexa para programas simples, mas como ela é uma
ferramenta profissional, foi desenvolvida para organizar pacotes de software que precisam ter a referência
de bibliotecas, classes, scripts e outros códigos.

Importante destacar que a IDE é uma ferramenta, e embora seja certeza que você precisará de uma IDE
para construir e compilar seus códigos, você deve se concentrar em aprender a programar em uma
linguagem pelo menos, e então se adaptar à IDE será uma consequência! Nesta unidade serão apresentados
os códigos-fonte para que você acompanhe a disciplina, entenda a composição do código e a construção de
cada comando, para que, assim, você possa desenvolver seus próprios códigos.

Essa disciplina requer a leitura do material e a resolução de exercícios do material, e é indicado que você
programe “mão na massa” para também desenvolver seu raciocínio lógico e sua capacidade de resolver
problemas computacionais.

VÍDEO RESUMO
Olá, estudante! Conhecemos os conceitos de linguagem de programação, compiladores e ambientes de
desenvolvimento, e como eles se relacionam. Agora vamos aprofundar mais na parte prática quanto à
interface de desenvolvimento.

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&ati… 4/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

Neste vídeo, você conhecerá o funcionamento da IDE CodeBlocks, e alguns dos principais passos para
conferir se a instalação está 100%! Vamos lá?

0
 Saiba mais

seõçatona reV
O que fazer quando se faz necessário utilizar um outro computador para as tarefas da disciplina? Bem,
deixar de realizá-las não é uma opção!! Então eu trouxe para você uma opção de editor e compilador
online, o JDoodle!

Aproveite para salvar o link como uma opção a mais de estudo e ferramenta para praticar os exercícios
da disciplina caso você não esteja com outro Ambiente Integrado de Desenvolvimento local
devidamente instalado.

Aula 2

INTRODUÇÃO À LINGUAGEM C
Nesta aula você entenderá como manipular dados em C e realizar operações com eles,
sempre respeitando os comandos da linguagem.
29 minutos

INTRODUÇÃO
Olá, estudante! Agora que você já conhece a linguagem de programação da nossa disciplina e já sabe a
necessidade de adotar um ambiente de desenvolvimento, nesta aula, vamos conhecer com detalhes cada
estrutura do programa em linguagem C. Assim como uma receita seus ingredientes com unidades e ordens
pré-definidas, os algoritmos também têm campos para declaração do que será necessário para aquele
código-fonte, isso consiste em um padrão no qual o programa deve ser construído para que gere um código
de máquina válido ao ser interpretado pelo compilador. Nesta aula você entenderá como manipular dados
em C e realizar operações com eles, sempre respeitando os comandos da linguagem. Não deixe de realizar
os exercícios propostos, eles são essenciais para seu aprendizado! Vamos juntos conhecer esses comandos?

CONSTRUINDO UM PROGRAMA EM C
Vamos começar identificando quais as estruturas básicas de um programa em linguagem C, começando
com um exemplo na Figura 1. A linha 1 é o cabeçalho do programa, e entre as linhas 2 e 4 está o Programa
principal, identificado como main.

Figura 1 | Estrutura do Programa em Linguagem C

Fonte: elaborada pela autora.

Nas primeiras linhas ficam localizados os comandos de pré-processamento, ou pré-compilação, sempre


iniciando com o sinal # (hashtag), esses comandos servem para inclusão de bibliotecas e definições e
formam o cabeçalho do programa. Dependendo do tipo de estrutura a ser manipulada são adicionadas as
bibliotecas necessárias, no exemplo da Figura 1 foi necessário adicionar somente uma biblioteca, a stdio.h,
uma biblioteca que manipula funções de entrada e saída, e adicionando-a o programador pode
simplesmente chamar o comando scanf e printf dentro do programa principal, sem a necessidade de
conhecer os detalhes internos de operação destes comandos no sistema operacional.

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&ati… 5/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

Em seguida fica localizado o programa principal, sempre identificado por main(), e tendo delimitando os
comandos de seu trecho com os tokens { e }, que na Figura 1 estão entre as linhas 3 e 6. Observe que, ao ser
executado, este programa sempre executa o comando printf(), que é um comando de saída para mostrar
informações na tela, e a informação é sempre a mesma frase que está entre as aspas: “Meu primeiro
programa!!”.

0
Ele não recebe nenhuma entrada ou interação que dependa do usuário, mas as aplicações se tornam muito

seõçatona reV
mais diversas quando permitimos que o usuário interaja com o programa! Essa interação é feita por meio de
comandos de entrada, e o mais comum na linguagem C é o scanf(), que permite ler números ou letras do
teclado.

Quando o programa lê uma informação, ele precisa armazená-la em algum local apropriado da memória, e
depois recuperá-la. Isso é possível se o programador previamente reservar uma região da memória e dar a
ela um nome (identificador) para que possa ser acessada sempre que necessário. Então, no código, sempre
que for preciso utilizar essa informação, chamamos o identificador dela.

Imagine se na necessidade de alterar a informação a gente precisasse reservar uma outra região de
memória, e tentar usar o mesmo identificador? Seria um desperdício de espaço e uma confusão, não é
mesmo?

É por isso que esse espaço reservado recebe o nome de variável, pois sempre que for necessário substituir
seu conteúdo nós informamos o nome do identificador e o novo valor. Utilizando um raciocínio semelhante,
chegamos à definição de constante, uma região de memória reservada, com um nome identificador, porém
que não pode ter seu conteúdo alterado ao longo do programa.

Assim, as informações manipuladas pelo computador que estão em uma região específica de memória ou
são uma variável ou uma constante. Ambas as configurações constituem o que chamamos de dados. Os
dados têm um determinado tipo e tamanho, inclusive isso influencia no espaço ocupado na memória.

Todas as ações que realizamos com os dados são por meio dos operadores, e na linguagem C os operadores
podem ser:

• Aritméticos: para cálculos matemáticos, e estão apresentados na Figura 2.

• Relacionais: para comparar se dois valores são iguais, diferentes ou se um é maior que o outro.

• Lógicos: para combinar um ou mais operadores relacionais em uma lógica de multifatores de entrada.

Figura 2 | Operadores aritméticos

Operador Operação Tipo Resultado

+ Manutenção de sinal Unário -

- Inversão de sinal Unário -

% Resto de divisão (módulo) Binário Inteiro

/ Divisão Binário Inteiro ou Real

* Multiplicação Binário Inteiro ou Real

+ Adição Binário Inteiro ou Real

- Subtração Binário Inteiro ou Real

= Atribuição Binário Inteiro, Real ou Lógico

Fonte: adaptado de Manzano (2015), p. 44.

Isso quer dizer que tudo que o programa precisar processar será construído com base nos 3 tipos de
operadores disponíveis na linguagem e respeitando as limitações quanto ao tipo de dados e as construções
dos comandos.

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&ati… 6/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

PROGRAMAS PARA MANIPULAR DADOS


Agora que você já conhece os recursos que tornam o programa mais completo, vamos analisar um exemplo
que utiliza uma variável e um comando de leitura e escrita para calcular e mostrar o dobro de um valor:

1.#include<stdio.h>

0
2.int x;

seõçatona reV
3.int y;

4.int main() {

5. scanf("%i", &x);

6. y = 2 * x;

7. printf("valor de y: %i", y);

8 }

Neste programa, se a entrada for 3, a saída é 6, já se for 4, a saída é 8, e assim por diante, e percebemos isso
ao analisar a linha de código (y = 2 * x), que contém os operadores aritméticos como conhecemos.

Nas linhas 2 e 3 declaramos duas variáveis do tipo inteiro e sabemos que é do tipo inteiro pelo uso da
palavra reservada int. Se precisássemos de outro tipo de variável, iríamos usar outra palavra reservada para
declará-la. E x e y foram os nomes dados às variáveis, ou seja, seu identificador.

Podemos (e devemos!) utilizar identificadores que contextualizem melhor seu papel no programa, como
demonstrado no código a seguir:

1;#include<stdio.h>

2.int valor;

3.int dobro;

4.int main() {

5. scanf(\"%i\", &valor);

6. dobro = 2 * valor;

7. printf(\"O dobro é: %i\", dobro);

8. }

Embora essa mudança melhore consideravelmente o entendimento e a legibilidade do programa, como


regra, nem todas as combinações de letras e números são válidas como identificadores de variáveis e
constantes (MANZANO, 2015):

• Máximo de 32 caracteres de letras e números, sem espaço.

• Iniciar com uma letra ou “_” (underline), nunca com um número.

• Não pode ser uma palavra reservada da linguagem C, ou seja, uma palavra que já tem uma funcionalidade
atribuída na linguagem.

• Não pode utilizar outro caractere especial, o único permitido é “_”.

Já que mencionamos as regras dos identificadores, vamos conhecer outros tipos de dados presentes na
linguagem C, alguns deles estão descritos na Tabela 1.

Tabela 1 | Tipos de dados na linguagem C

Tamanho
Menor valor Maior valor Exemplo de
Tipo de dado em Usado para
representado representado aplicação
memória

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&ati… 7/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

Contagem de
int 16 bits - 32.768 32.767 Inteiros em geral
números inteiros

Contagem de
unsigned short
16 bits 0 65.535 Inteiros em geral números naturais

0
int
(não negativos)

seõçatona reV
Grandes quantidades
long int 32 bits - 2.147.483.648 2.147.483.647 Inteiros grandes
de inteiros

Ponto flutuante
Valores com precisão
float 32 bits - 3.4028235e38 3.4028235e38 (notação de 10-38 a 1038
exponencial)

Caracteres especiais,
char 8 bits - - Símbolos
letras ou números

Fonte: adaptada de Manzano (2015).]

O comando scanf() da linha 5 tem duas regras de construção importantes:

• “%i” significa que irá ler um número do tipo inteiro, para outros tipos é necessário usar outra construção.

• &valor significa que irá armazenar o valor lido na variável valor.

Já o comando printf() da linha 7 tem as seguintes regras:

• O conteúdo das aspas será mostrado na íntegra, exceto quando houver o símbolo %, que representa um
código de escape.

• Para mostrar o conteúdo de uma variável do tipo inteiro utilizamos %i e %d, para outros tipos é necessário
usar outra construção.

• Após o fechamento das aspas, deve vir uma vírgula e o nome da variável de interesse;

• Se for necessário mostrar mais uma variável, adiciona-se mais uma vírgula e a outra variável.

CONSTRUINDO PROGRAMAS MAIS ROBUSTOS


Nós já estudamos que um programa válido é aquele que respeita as regras da linguagem no quesito léxico e
semântico, e que irá gerar um código de máquina que realize o processamento lógico desejado. Isso nos
leva a 2 pontos importantes:

1. Assim como em toda operação matemática, o resultado obtido não necessariamente depende de como
os operadores aparecem na linha do comando, e sim de acordo com a regra de precedência de operadores,
que é a ordem em que são executados.

Essa ordem está apresentada na Figura 5.

Figura 5 | Ordem das operações matemáticas

Fonte: elaborada pela autora.

2. As construções dos comandos dependem do tipo de dado que será manipulado, então, para utilizar os
comandos scanf() e printf() em dados do tipo não inteiros, utilizamos após o sinal % as seguintes
construções sintáticas:

- %c para o tipo char;

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&ati… 8/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

- %lf para o tipo double;

- %f para o tipo float, com a opção de determinar a quantidade de casas antes e após a vírgula, como
descrito no código a seguir:

1.#include<stdio.h>

0
2.float pi;

seõçatona reV
3.int main() {

4. pi = 3.14159265359;

5. printf(\"PI: %5.2f\", pi);

6. }

Agora vamos conhecer os operadores relacionais da linguagem C, em que dois termos são comparados
por meio do operador, sendo que os termos podem ser variáveis, constantes ou números fixados no código.
Os operadores relacionais estão apresentados na Tabela 2, com seu respectivo significado de teste.

Tabela 2 | Operadores relacionais na linguagem C

Operador Relação testada

< Primeiro operando menor que o segundo operando

> Primeiro operando maior que o segundo operando

<= Primeiro operando menor ou igual ao segundo operando

>= Primeiro operando maior ou igual ao segundo operando

== Primeiro operando igual ao segundo operando

!= Primeiro operando diferente do segundo operando

Fonte: adaptada de Microsoft (2022).

A saída de uma relação testada pode ser falsa ou verdadeira, na linguagem C usa-se o valor “0” (zero) como
indicativo falso deste teste, e 1 ou qualquer outro valor diferente de zero é considerado verdadeiro. Duas
comparações estão sendo apresentadas no código a seguir, sendo a primeira comparando se doze é igual a
zero, com resultado falso (como esperado, mostrando 0 na tela!), e a segunda em que comparamos se a
variável chamada número é menor que o número 12, e como seu conteúdo é 10, o resultado é verdadeiro,
mostrando 1 na tela.

1.#include <stdio.h>

2.#include <stdlib.h>

3.int numero;

4.int resultado1, resultado2;

5.int main()

6.{

7. numero = 10;

8. resultado1 = (12 == 0);

9. printf(\"Resultado 1: %i \n\", resultado1);

10. resultado2 = (numero < 12);

11. printf(\"Resultado 2: %i \n\", resultado2);

12. return 0;

13.}

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&ati… 9/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

Esses operadores relacionais que produzem como saída “falso” ou “verdadeiro” ficam ainda mais
interessantes quando usados de forma combinada, por meio dos operadores lógicos! Assim como na
matemática esses operadores relacionam 2 condições em sua tabela verdade, e tanto sua entrada como sua
saída são valores lógicos, ou seja, verdadeiro ou falso.

0
Os operadores lógicos estão apresentados na Tabela 3, com seu respectivo significado na lógica booleana.

Tabela 3 | Operadores lógicos na linguagem C

seõçatona reV
Token na linguagem C Operador matemático Significado

&& And (E) Conjunção

! Not (NÃO) Negação

|| Or (OU) Disjunção inclusiva

^ Xor (XOR) Disjunção exclusiva

Fonte: elaborada pelo autor.

Com esses recursos, nós conseguimos construir programas para diversas aplicações matemáticas!

VÍDEO RESUMO
Estudante, nesta aula, conhecemos como manipular dados em linguagem C, por meio de variáveis e
constantes, também estudamos como funcionam os comandos de entrada e saída de dados e sua
importância para tornar o programa mais dinâmico. Estudamos também os operadores aritméticos,
relacionais e lógicos, que são estruturas essenciais para construirmos programas mais profissionais. Venha
comigo no próximo vídeo para executarmos um programa que abrange todos estes conteúdos!

 Saiba mais
Para melhor entendimento dos operadores lógicos é importante que você conheça a tabela verdade
dos operadores, um conceito matemático e de muita aplicação na computação.

Você pode desenvolver a tabela verdade conforme a necessidade do programa em desenvolvimento, e


se precisar validar ou tirar a prova real de algum operador você pode acessá-la online!

Acesse a Calculadora Online (Tabela-Verdade) para treinar seus conhecimentos em lógica booleana.

Aula 3

ESTRUTURAS CONDICIONAIS EM LINGUAGEM C


Você deverá observar os sistemas que utiliza, como o gerenciador de e-mails, o editor de texto
e o aplicativo do banco.
31 minutos

INTRODUÇÃO
Olá, estudante! Nesta aula, você deverá observar os sistemas que utiliza, como o gerenciador de e-mails, o
editor de texto e o aplicativo do banco. Esses sistemas interagem com você e respondem de acordo com as
suas ações, por meio de condições que foram previamente implementadas. Isso só é possível porque, a
cada opção que você pode acionar no sistema, há uma programação que determina qual caminho o
programa deve seguir ou o que ele deve fazer. Neste contexto, você está convidado a conhecer como
construímos essas opções e os possíveis caminhos do programa. Vamos nessa? Lembre-se de reforçar os
conceitos estudados com os exercícios da aula!

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 10/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

PROGRAMAS COM OPÇÕES


A linguagem C é executada linha a linha, assim como você acompanha este material – e, se necessário,
desvia a sua leitura para uma linha diferente, ou para outra área específica do programa. Na linguagem de
programação, os possíveis caminhos que um programa pode tomar são organizados nas estruturas

0
condicionais, mais precisamente nos desvios condicionais.

seõçatona reV
À primeira vista, o código tem seu mesmo aspecto textual e em sequência tradicional, mas ele pode, a cada
comando, ter seu curso alterado de acordo com a interação do usuário. Quando pensamos em programas
que interagem de acordo com nossas entradas, estamos lidando com o contexto dessas estruturas
condicionais, e como o próprio nome diz, a forma de sua execução depende de uma condicional.

Na prática, essas estruturas organizam o código de forma que as entradas fornecidas pelo usuário sirvam
como decisores lógicos quanto aos próximos passos de execução do programa.

A lógica das estruturas condicionais é muito parecida com o nosso raciocínio ao resolver desafios do dia a
dia. Por exemplo: se abrimos um e-mail para lê-lo, o gerenciador remove a notificação de nova mensagem,
assim como ele exibirá uma mensagem de erro se for identificado que estamos sem internet. O comando
para essa lógica é o if(), pois if, em inglês, significa “se”.

Esse conjunto de verificação e reação é chamado de estrutura condicional e é composto por uma verificação
acerca de uma condição e uma reação a ser executada se essa condição for satisfeita. Tal condição pode ser
a relação de um ou mais eventos, e a reação pode ser a execução de um conjunto de comandos ou de um
único comando.

Inclusive, a reação a ser executada pode ser outra estrutura condicional, consistindo em uma estrutura
dentro de outra, chamada de estrutura condicional encadeada. Por serem muito versáteis, essas estruturas
permitem inúmeras combinações.

Adicionalmente, pode haver um senão acompanhando a lógica do se. Por exemplo: se a bateria estiver com
a carga abaixo de 15%, mostre o ícone em vermelho; senão, mostre o valor da carga. Na linguagem C, o
comando equivalente ao senão é o else, e veremos mais adiante os exemplos de sua implementação.

Muitas vezes, são tantas as possibilidades do programa que uma estrutura condicional poderia tornar
confusa sua legibilidade. Nessas circunstâncias, utilizamos a seleção de casos, a qual é muito útil quando o
usuário tem diversas opções, sendo por isso também chamada de estrutura de controle com múltipla
escolha. Na linguagem C, o comando para essa seleção é o switch.

Assim como as estruturas condicionais são a base para organizar desvios no programa, elas também servem
como estruturas de controle de repetição, devido ao mesmo princípio. A linguagem C tem dois recursos
diferentes para essa finalidade: o for e o while, sendo que ambos também avaliam condições para controlar
as repetições.

CONHECENDO AS ESTRUTURAS CONDICIONAIS


Um ponto relevante para detalharmos as estruturas condicionais é a sua base de verificação: uma lógica
constituída por operadores lógicos e relacionais. Os operadores relacionais sempre retornam verdadeiro ou
falso, e os operadores lógicos atuam combinando esses retornos de acordo com a tabela verdade de cada
operador.

Sendo assim, a condição será testada na execução do comando, e somente se ela for verdadeira o programa
acessará o trecho especial do código. Em uma linguagem bem desprendida, podemos dizer que o programa
“entrou” no if. A demonstração da sintaxe e da construção do comando da estrutura condicional simples if
pode ser vista no código a seguir:

1.#include<stdio.h>

2.int main() {

3. float temperatura;

4. printf(\"Digite a temperatura da sua cidade no dia de hoje: \n\");

5. scanf(\"%f\", &temperatura);

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 11/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

6. if (temperatura < 5)

7. {

8. printf(\"Teste verdadeiro \n\");

0
9. printf(\"Prepare o agasalho!! \n\");

10. }

seõçatona reV
11. printf(\"A temperatura digitada foi: %f\", temperatura);

12. }

Na instrução if, a condição testada fica entre parênteses. No exemplo, temos um único teste sendo
executado no programa, e quando ele é verdadeiro o programa entra no bloco de código e mostra na tela as
duas frases: “Teste verdadeiro” e “Prepare o agasalho!!”. Quando a condição é falsa, o programa sai da linha
de verificação do comando if e vai para o final do código, que exibe na tela: “A temperatura digitada foi:”, ou
seja, a linha localizada imediatamente após a estrutura condicional do if.

Já no código a seguir está apresentada uma estrutura condicional composta. Neste caso, o programa tem
somente duas opções de execução: o bloco referente ao if, quando a condição testada é verdadeira, ou o
bloco referente ao else, quando a condição testada é falsa. Ou seja, ele mostrará “saldo negativo” somente
se o teste do comando if der verdadeiro, ou saltará, ignorando o bloco do if, e entrará no bloco do else,
mostrando “saldo positivo”. Após executar o bloco do if ou do else, ele sempre irá para a linha que mostra
“Fim do programa”. Veja o código com instrução if e else a seguir:

1.#include<stdio.h>

2.int main() {

3. float saldo = 12.00;

4. if (saldo < 0)

5. printf(\"Saldo negativo \n\");

6. else

7. printf(\"Saldo positivo \n\");

8. printf(\"Fim do programa.\");

9.}

E se quisermos deixar o programa ainda mais elaborado, podemos utilizar a estrutura condicional
composta, a qual é apresentada no código a seguir. Observe que o if que testa se o saldo é igual a zero só é
acessado pelo programa quando a condição do primeiro teste for falsa, ou seja, quando não é um número
negativo. Observe também que a segunda estrutura condicional, dentro do primeiro else, representa um
único comando, e embora tenha sido escrita em quatro linhas, ela não precisa de delimitadores de chaves {
} em sua sintaxe. Veja o código com instrução if encadeada, a seguir:

1. #include<stdio.h>

2. int main() {

3. float saldo = -12.00;

4. if (saldo < 0)

5. printf(\"Saldo negativo \n\");

6. else

7. if (saldo == 0)

8. Printf(\"Saldo zerado \n\");

9. else

10. printf(\"Saldo positivo \n\");

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 12/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

11. printf(\"Fim do programa.\");

12.}

Observe nesse código com a instrução if encadeada que temos um ótimo exemplo de como utilizar recursos
de indentação, que consiste no deslocamento padrão do início do código na linha para caracterizar em que

0
nível ele está. Embora a indentação auxilie na leitura humana do código, quando se faz necessário utilizar
muitas estruturas condicionais encadeadas é recomendado empregar seleção de casos, como no código a

seõçatona reV
seguir. Veja o código com seleção de casos, a seguir:

1. #include<stdio.h>

2. int main() {

3. int opcaoDigitada;

4. printf(\"Digite um numero:\");

5. scanf(\"%d\", &opcaoDigitada);

6. switch (opcaoDigitada)

7. {

8. case 1: printf(\"Um\"); break;

9. case 2: printf(\"Dois\"); break;

10. case 3: printf(\"Tres\"); break;

11. case 4: printf(\"Quatro\"); break;

12. case 5: printf(\"Cinco\"); break;

13. case 6: printf(\"Seis\"); break;

14. default: printf(\"Invalido\"); break;

15. }

16. }

Observe que dentro de cada “case” há uma única instrução “printf;” entretanto, também poderia haver um
bloco de comandos, e ele seria delimitado por chaves. É importante observar que qualquer outra tecla ou
valor digitado e lido no “scanf”, que não estivesse nas opções, cairia no caso da linha 14: Invalido.

Se este último código tivesse sido escrito somente com condicionais, certamente o programa ficaria bem
menos elegante. Antes que você pense que isso pode ser bobagem, imagine realizar a manutenção em um
código escrito por outra pessoa (ou por você mesmo) há um tempo. A forma de elaborar o código facilitará
ou dificultará o trabalho e o entendimento no futuro.

PROGRAMAS COM LAÇOS


Muito do propósito dos sistemas computacionais é realizar tarefas e ações repetitivas, e para isso a
linguagem C tem comandos específicos. Em português, chamamos essa circunstância de laço (loop, em
inglês). Na prática, o programa fica executando um comando ou um conjunto de comandos de forma
repetida, em looping, enquanto uma condição for verdadeira.

Na linguagem C, utilizamos o comando while() – o termo while significa “enquanto”, em inglês –, e sua
construção é muito similar à do comando if, mas com algumas diferenças. A principal delas é que, quando a
condição é verdadeira, além de o programa entrar naquele trecho de código, ele continuamente repete o
ciclo de executar os comandos e checar novamente essa condição, parando de executar os comandos
desse trecho quando a condição for falsa.

Um exemplo prático é o de verificar a autenticação de um usuário pela digitação correta da senha. Se


usássemos só o comando if, realizaríamos a verificação e retornaríamos indicando se a senha estava correta
ou não, porém ainda não teríamos um mecanismo que repetisse essa verificação até que o usuário digitasse
a senha correta. O código-fonte a seguir resolve o problema da senha. Veja o código com while, a seguir:

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 13/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

1. #include<stdio.h>

2. int main() {

3. int senhaDigitada;

0
4. int senhaCadastrada = 1923;

5. printf(\"Digite a sua senha: \n\");

seõçatona reV
6. scanf(\"%d\", &senhaDigitada);

7. while (senhaCadastrada != senhaDigitada)

8. {

9. printf(\"\nSenha incorreta, por favor digite a sua senha: \n\");

10. scanf(\"%d\", &senhaDigitada);

11. }

12. printf(\"Fim do programa! \n\n\");

13.}

Observe o comando de leitura da senha: se quisermos deixar o programa mais compacto, poderemos
utilizar o comando do { } while. Neste tipo de comando, a instrução (ou o conjunto de instruções) é
executada e depois se realiza a verificação da condição. O código a seguir apresenta essa construção. Veja o
código com do while, a seguir:

1. #include<stdio.h>

2. int main() {

3. int senhaDigitada;

4. int senhaCadastrada = 1923;

5. do

6. {

7. printf(\"\nPor favor digite a sua senha: \n\");

8. scanf(\"%d\", &senhaDigitada);

9. }

10. while (senhaCadastrada != senhaDigitada);

11. printf(\"Fim do programa! \n\n\");

12. }

Quando você estiver construindo seus programas, identificará quais são o comando e a construção mais
adequados para o problema a ser resolvido. Em resumo (MANZANO, 2015):

• O comando while é chamado de laço pré-teste, pois realiza o teste lógico no início do laço, verificando se é
possível executar o trecho de instruções subordinadas a ele.

• O comando do while é chamado de laço pós-teste. Ele sempre executa o bloco subordinado ao laço pelo
menos uma vez, e então realiza o teste lógico para decidir se continua no looping ou se sai dele.

Tanto o comando while quanto o do while permitem que sejam criados laços iterativos e interativos:

• Iterativo: que se repete.

• Interativo: que interage com o usuário.

Como a condição de parada é o teste lógico dar falso, ao construir os comandos o programador precisa
estabelecer o controle dessa parada, ou seja, quando o programa deve sair do loop. Porém, há casos em
que há a necessidade de manter o programa em um loop infinito, como um código que monitora

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 14/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

constantemente um processo industrial ou uma cancela de pedágio, por exemplo. Para casos assim, é
comum encontrar a seguinte construção: while (1), pois 1 é sempre verdadeiro e o programa ficará
permanentemente neste loop.

A linguagem C ainda oferece uma terceira opção para execuções sequenciais: o comando for (para, em

0
português). Podemos ler o comando da seguinte maneira: “para i variando de 0 a 10, de um em um, faça tal
ação”. Uma característica dessa construção é que, normalmente, ela é utilizada para laços com um número

seõçatona reV
finito e conhecido de execuções, como processar dados de uma lista ou um conjunto de números.

Um exemplo da utilização do comando for é apresentado no código a seguir.

1.#include<stdio.h>

2.int main() {

3. int i, resultado;

4. for (i = 0; i <= 10; i++)

5. {

6. resultado = i * 2;

7. printf(\"2 x %d = %d \n\", i, resultado);

8. }

9.}

VÍDEO RESUMO
Estudante, nesta aula conhecemos como utilizar condições para controlar os desvios e as repetições dos
nossos programas. Você viu como o uso dos operadores lógicos e relacionais é a base para toda a
construção das lógicas e o controle da execução do programa. A partir de estruturas condicionais como if e
else, podemos criar desvios, e com os comandos while, do while e for conseguimos estruturar repetições de
trechos específicos do código, sujeitos à parada por intervenção do usuário ou não, a depender da forma
que são construídos. Vamos agora estudar mais alguns aspectos de implementação do nosso conteúdo?

 Saiba mais
Como saber se seu programa está executando passo a passo de forma correta? Ou então, quando ele
apresenta uma resposta incorreta, como saber em que momento o algoritmo se perdeu, para que
possa ser estudada uma estratégia de correção? Na nossa aula, que aborda os desvios e os laços, vimos
que é essencial poder “entrar” na execução do programa e acompanhar passo a passo cada linha
executada.

A melhor alternativa para isso é debugar seu código. A maioria dos ambientes de desenvolvimento
integrado (IDEs) possui esse recurso.

Como você sabe, cada IDE tem sua interface e seu posicionamento de botões. Então, para conseguir
acessar o recurso na sua versão instalada, você deve realizar uma pesquisa no Google contendo o
nome do IDE que você está utilizando, além dos termos “debugar” e “watches”.

Na maioria dos IDEs instalados localmente, você deve posicionar o mouse em linhas estratégicas, que
contenham as operações de interesse, e dar um clique duplo na linha ou clique com botão direito. O
objetivo é inserir um ponto de interrupção (ou breakpoint), simbolizado por um círculo colorido,
naquela linha.

Ao executar o programa, ele parará em todos os pontos criados e mostrará os conteúdos de memória e
os últimos cálculos realizados.

Para excluir estes pontos, o processo é o mesmo.

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 15/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

Outra possibilidade é utilizar o IDE OnlineGBD, que também permite o debug online. Neste caso, basta
clicar uma vez ao lado esquerdo do número da linha para adicionar o breakpoint, e realizar um click
duplo para removê-lo.

Figura 1 | Tela do OnlineGBD com breakpoint na linha 17

0
seõçatona reV
Fonte: elaborada pela autora.

Aula 4

OPERADORES NA LINGUAGEM C
Nesta aula, veremos como as operações de atribuição podem ser versáteis e nos fornecer
mais opções de implementação quando complementadas com os operadores aritméticos.
27 minutos

INTRODUÇÃO
Olá, estudante! Nesta aula, veremos como as operações de atribuição podem ser versáteis e nos fornecer
mais opções de implementação quando complementadas com os operadores aritméticos. Você deve ter
percebido que quanto mais recursos uma linguagem possui, melhores ficam o entendimento e a legibilidade
do código-fonte, mais opções de comando o programador possui à sua disposição e há mais o que
aprender. Muitas vezes, uma sutil alteração no sinal ou na escolha dos tipos e operadores pode produzir
resultados totalmente diferentes, e consequentemente impactar a execução do programa. Venha conosco
nesta aula para aprender as variações desses comandos e não ter problemas em seu código-fonte!

ATRIBUIÇÕES E TIPOS DE DADOS NA EXECUÇÃO


Estudante, você tem visto na criação de programas com a linguagem C que é necessário realizar uma série
de predefinições já no início da construção do código-fonte, como a definição dos tipos de variáveis. Ao
longo do código, uma escolha que também impactará em como será o funcionamento do programa é a
forma com que construímos os comandos para realizar operações matemáticas, por meio dos operadores
aritméticos, já que a linguagem permite variações com o mesmo símbolo.

Isso quer dizer que, caso não conheçamos as particularidades da linguagem, podemos correr o risco de
escrever um programa que apresente uma execução diferente daquela que esperávamos. Essas
particularidades são decisões internas que o compilador está programado para tomar e que nem sempre
estão explícitas no código ou no nosso pensamento lógico.

Vamos tomar como ponto de partida a atribuição simples e, então, seguiremos estudando suas variações. O
operador de atribuição, que tem seu símbolo representado por um único sinal de igual (=), é utilizado para
inserir no termo à sua esquerda o resultado processado da operação à sua direita. Por exemplo: “resultado
= 2 * valor”.

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 16/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

Embora essa construção seja a mais simples que existe quando se trata de atribuição, pode ocorrer de o
programador definir as variáveis “resultado” e “valor” em tipos diferentes, e o compilador precisar decidir
sobre como processar o resultado, se apresenta um erro, se aceita a construção ou se realiza uma
conversão durante essa atribuição. A conversão em tempo de execução junto com a atribuição é chamada
de conversão de tipos em atribuições, e estudaremos suas variedades ao longo desta aula.

0
Além desse tipo básico de atribuição, a linguagem C também permite outros, como as atribuições múltiplas,

seõçatona reV
em que é possível atribuir o mesmo valor para múltiplas variáveis em um mesmo comando, como mostrado
no código a seguir:

1.#include <stdio.h>

2.int main()

3.{

4. int x, y, z;

5. x = y = z = 0;

6.}

Devido a outro recurso interessante e bastante utilizado nos programas profissionais, as operações de
atribuição também podem conter elementos aritméticos na sua construção, os quais são chamados de
operadores aritméticos, como o incremento e o decremento, ambos apresentados no código a seguir:

1.#include <stdio.h>

2.int main()

3.{

4. int x, y;

5. x = y = 10;

6. x++; // o resultado dessa linha é x = 11

7. y--; // o resultado dessa linha é y = 9

8.

9. printf(\"x = %d, e y = %d\", x, y);

10.}

Observe que, ao utilizar “x++”, o programador consegue o mesmo resultado que teria se usasse “x = x+1”,
porém com uma escrita mais compacta. E quando usadas em conjunto com um comando de atribuição,
tanto a operação de incremento quando a de decremento possuem dois tipos de construção, como pode
ser visto no exemplo do código a seguir:

1.#include <stdio.h>

2.int main()

3.{

4. int x, A, B;

5. x = 10;

6. A = ++x; // incrementa antes de atribuir

7. printf(\"x = %d, e A = %d \n\", x, A);

8.

9. x = 10;

10. B = x++; // atribui e depois incrementa

11. printf(\"x = %d, e B = %d\", x, B);

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 17/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

12.}

Existe uma diferença sutil entre as sintaxes “++x” e “x++”, e como estão sendo utilizadas junto com uma
atribuição, a forma com que são construídos os comandos interfere muito em seu significado para o
programa. No primeiro caso, é realizado o incremento na variável x, e ao atribuir esse valor para a variável A,

0
seu conteúdo já está incrementado, ou seja, ambas passam a valer 11. Já no segundo caso, o conteúdo de x,
que é 10, primeiro é atribuído a B, e depois a variável x é incrementada para 11. Assim, B tem conteúdo igual

seõçatona reV
a 10 e x é igual a 11.

Estudante, você percebeu que a linguagem C permite uma ampla variedade nessas construções? Isso
proporciona a você mais opções e recursos, mas ao mesmo tempo exige maior entendimento de suas
regras.

CONHECENDO AS VARIAÇÕES DAS ATRIBUIÇÕES


Os operadores em C podem ser unários, binários e ternários, e essa classificação está relacionada a quantos
operandos constituem uma sentença correta para o operador. Vamos conhecer cada um deles com um
exemplo:

• Unários: realizam uma modificação (ou não) em relação a apenas uma variável, como o sinal de menos.
Exemplo: -x; -10.

• Binários: relacionam-se com os conteúdos de dois valores para retornar um terceiro valor como resultado,
como o operador soma ou, ainda, o de atribuição. Exemplo: a + b; x = 10.

• Ternários: relacionam-se com três conteúdos, sendo usados para substituir as sentenças “if then else”.

Assim como existe a notação de incremento e decremento nessa construção mais compacta, também
existem opções compactas para implementar outras operações na linguagem C. Vamos conhecer as
principais delas na Tabela 1.

Tabela 1 | Operadores de atribuição

Operador Operação executada Equivalente a

*= Atribuição de multiplicação saida = saida * 2

/= Atribuição de divisão saida = saida / 2

%= Atribuição restante saida = saida % 2

+= Atribuição de adição saida = saida + 2

-= Atribuição de subtração saida = saida - 2

Fonte: adaptada de Microsoft (2022, [s. p.]).

Um exemplo desses operadores sendo implementados em um código-fonte é apresentado a seguir:

1.#include <stdio.h>

2.int main()

3.{

4. int saida;

5. saida = 6;

6. printf(\"saida multiplicacao = %d \n\", saida *= 2);

7.

8. saida = 6;

9. printf(\"saida divisao = %d \n\", saida /= 2);

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 18/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

10.

11. saida = 6;

12. printf(\"saida restante = %d \n\", saida %= 2);

0
13.

14. saida = 6;

seõçatona reV
15. printf(\"saida adicao = %d \n\", saida += 2);

16.

17. saida = 6;

18. printf(\"saida subtracao = %d \n\", saida -= 2);

19.}

Observe que a cada comando precisamos atribuir novamente o valor inicial 6 na variável saida, pois o
comando de atribuição aritmética realiza tanto a operação aritmética quanto a atribuição na variável,
atualizando seu valor. Por manipular dois operandos, os operadores da Tabela 1 são considerados binários.

Outra classe interessante dos operadores é sua aplicação com valores binários. Para demonstrá-los,
considere:

• Uma variável X, de valor 18, em binário 0001 0010.

• Uma variável Y, de valor 98, em binário 0110 0010.

A operação AND bit a bit entre X e Y se refere a realizar a operação AND (operador lógico) entre todos os bits
do número, um a um, e escrever o valor correspondente. Para o exemplo, X & Y resulta em: 0000 0010, ou
seja, 2. Cabe destacar que a operação lógica && realizada em valores decimais produz um resultado
diferente da operação AND bit a bit, representada pelo símbolo unitário &.

O operador &= realiza o AND bit a bit entre as variáveis que compõem o comando e atribui esse valor ao
operando da esquerda.

Seguindo o mesmo raciocínio, considere também os outros operadores específicos para representações em
binário, apresentados na Tabela 2.

Tabela 2 | Operadores de atribuição para binários

Operador Operação executada Equivalente a

<<= Atribuição de shift esquerda Deslocamento de bits para a esquerda

>>= Atribuição de shift direita Deslocamento de bits para a direita

&= Atribuição AND bit a bit Realizar a operação AND nos valores

^= Atribuição OR exclusivo bit a bit Realizar a operação OR exclusivo nos valores

|= Atribuição OR inclusivo bit a bit Realizar a operação OR inclusivo nos valores

Fonte: adaptada de Microsoft (2022, [s. p.]).

E uma aplicação em código-fonte resulta no código a seguir.:

1.#include <stdio.h>

2.int main()

3.{

4. // 3 = 0b0111;

5. int x;

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 19/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

6. x = 0b1001; //valor 9 em decimal

7. x &= 3; // será 0b0001, ou seja, 1.

8. printf(\"saida AND bit a bit = %d \n\", x);

0
9.

10. x = 0b00001001; //valor 9 em decimal

seõçatona reV
11. x <<= 3; // será 0b01001000, ou seja, 72.

12. printf(\"saida shift esquerda = %d \n\", x);

13.}

O operador de deslocamento atua deslocando todos os bits do número à esquerda ou à direita, sendo que,
conforme os bits são deslocados para um dado sentido, zeros são usados para preencher as lacunas. No
exemplo apresentado no código, a variável binária x teve seus bits deslocados em três posições para a
esquerda, e como esse novo número foi atribuído a ela, deixou de ser o número 0b00001001 (9 em decimal)
para ser 0b01001000 (72 em decimal).

Uma curiosidade a respeito de números binários é que cada deslocamento para a esquerda é equivalente a
multiplicar o número por 2. Sua aplicação se dá principalmente na programação de microcontroladores ou
drivers que necessitam de controle do hardware.

O maior desafio na utilização desses operadores é que a escrita deles é muito similar às operações
matemáticas tradicionais. Ao analisá-la, o programador precisa ter o mesmo entendimento que o
compilador terá ao realizar o build do código, pois muitas vezes podemos cair em ambiguidades permitidas
pela linguagem. Na dúvida, devemos fazer o debug do código, a fim de verificar por meio dos testes de mesa
se a execução do nosso programa está ocorrendo conforme esperado.

APLICANDO CONCEITOS DE CONVERSÕES DE TIPOS


Outro aspecto que também requer a atenção do programador diz respeito ao tipo das variáveis
manipuladas e aos desdobramentos lógicos que podem ocorrer ao longo da execução do programa. Esse
tipo de situação ocorre com a utilização dos operadores multiplicação (*), divisão (/) e restante (%), pois
essas operações costumam interferir no tipo do operando. Considere que temos os números 13 e 5 para
realizar uma divisão. Sabemos que 13 dividido por 5 é igual a 2,6. Ao mesmo tempo, quando lidamos com
problemas do dia a dia, podemos ter a necessidade de construir raciocínios mais específicos.

Por exemplo: recebemos 13 camisetas para serem distribuídas para 5 pessoas. Como não faria sentido
cortar as camisetas, teríamos que 13 (int) dividido por 5 (int) é igual a 2 (int) com resto 3 (int).

Com os operadores, essas sentenças seriam escritas como: 13 / 5 = 2 para a divisão com inteiros e 13 % 5 = 3
para o cálculo da operação resto, também chamada de restante ou módulo.

1.#include <stdio.h>

2.int main()

3.{

4. float resultado;

5. int x, y;

6.

7. x = 13; y = 5;

8. printf(\"resultado = %f \n\", resultado = x/y);

9.

10. x = 13.0; y = 5.0;

11. printf(\"resultado = %f \n\", resultado = x/y);

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 20/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

12.

13. x = 13.0; y = 5.0;

14. printf(\"resultado = %f \n\", resultado = x%y);

0
15.}

Observe que, mesmo tentando inserir um valor do tipo real nas variáveis x e y, o resultado apresentado na

seõçatona reV
divisão não é 2.6, pois x e y foram declarados como inteiros e nas linhas de atribuição eles já perdem a
precisão de 13.0 e 5.0, sendo tratados como inteiros 13 e 5.

Avaliando o mesmo código-fonte, porém com x e y do tipo float, percebemos que a divisão é feita como
esperado, mas o código apresenta um erro de compilação na linha do último printf, pois o operador % não
pode ser utilizado com variáveis de tipo float, já que o compilador tentaria realizar a divisão com diversas
casas após a vírgula, tantas quantas fossem necessárias, conforme a quantidade de dígitos do tipo da
variável escolhida, e, portanto, a divisão não apresentaria resto.

Tipos diferentes podem incorrer em truncamento ou perda de precisão, como detalhado a seguir:

• O truncamento consiste em salvar a parte inteira de um número, ignorando as casas decimais.

• A perda de precisão é a representação de um número com menos casas decimais do que ele possui, o que
também ignora parte dos dígitos.

Ao mesmo tempo, a linguagem C permite que o programador “adeque” tipos de variáveis para contornar
problemas de tipos que poderiam ocorrer em tempo de execução, como o truncamento ou a perda de
precisão. A realização dessa modificação pelo programador recebe o nome de casting. Damas (2016)
descreve que o casting se dá quando queremos modificar o tipo de uma variável ou expressão, alterando-o
para um tipo maior ou para um tipo mais baixo, e que podemos indicar o tipo ao qual queremos “promover”
esse valor colocando o tipo pretendido entre parênteses antes do valor.

Um exemplo dessa modificação é apresentado no código a seguir:

1.#include <stdio.h>

2.int main()

3.{

4. float result;

5. int valor, div;

6.

7. valor = 10;

8. div = 4;

9.

10. result = valor / div;

11. printf(\"Resultado: %f \n\", result); // resultado truncado

12.

13. result = 1.0 * valor / div;

14. printf(\"Resultado: %f \n\", result); // resultado forçado pelo 1.0 *

15.

16. result = (float) valor / div;

18. printf(\"Resultado: %f \n\", result); // valor convertido em float (casting)

19.

20. result = valor / (float) div;

21. printf(\"Resultado: %f \n\", result); // div convertido em float (casting)

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 21/22
12/10/2023, 00:34 wlldd_231_u3_alg_log_pro

Observe que esse código indica a solução para o problema do código anterior, que não apresentava a saída
em número real.

Neste último código também vemos outro recurso interessante, que é o comentário no código. Tudo o que

0
está escrito na mesma linha após o // é ignorado pelo compilador. Então, tal recurso é usado para que o
programador possa registrar comentários que auxiliem na leitura e no entendimento do código, embora as

seõçatona reV
boas práticas de programação digam que um código bem escrito, com padrão na nomenclatura de variáveis,
não necessita de comentários.

VÍDEO RESUMO
Estudante, aprendemos nesta aula como o programa pode apresentar respostas inesperadas ou
incompletas se não definirmos os tipos de variáveis corretamente. Vimos que o compilador segue à risca os
tipos que definimos, mas também permite alguns recursos que alteram o tipo da variável mesmo em tempo
de execução, realizando uma conversão explícita. Quanto aos exemplos, eles não acabaram, então
acompanhe o vídeo para estudarmos como funciona a conversão de tipos implícita.

 Saiba mais
A manipulação de caracteres e inteiros pode ocasionar dificuldades na legibilidade do código,
principalmente pelas conversões implícitas que a linguagem C permite na execução dos programas.
Para essas construções específicas, Luís Damas organizou uma subseção em sua obra, com alguns
exemplos detalhadamente descritos.

O livro Linguagem C está na nossa biblioteca virtual, e o capítulo que aborda esse assunto está na
subseção Situações em que inteiros e caracteres não se devem misturar, na página 43.

REFERÊNCIAS
1 minutos

Aula 1
MANZANO, J. A. N. G. Linguagem C: Acompanhada de uma xícara de café. São Paulo: Érica, 2015.

Aula 2
MANZANO, J. A. N. G. Linguagem C: Acompanhada de uma xícara de café. São Paulo: Érica, 2015.

MICROSOFT. Operadores relacionais e de igualdade C. Disponível em: https://learn.microsoft.com/pt-


br/cpp/c-language/c-relational-and-equality-operators?view=msvc-170. Acesso em: 22 nov. 2022.

Aula 3
MANZANO, J. A. N. G. Linguagem C: acompanhada de uma xícara de café. São Paulo: Érica, 2015.

Aula 4
DAMAS, L. Linguagem C. 10. ed. Rio de Janeiro: LTC, 2016.

MANZANO, J. A. N. G. Linguagem C: acompanhada de uma xícara de café. São Paulo: Érica, 2015.

MICROSOFT. Operadores de atribuição C. 2022. Disponível em: https://learn.microsoft.com/pt-br/cpp/c-


language/c-assignment-operators?view=msvc-170. Acesso em: 27 nov. 2022.

Imagem de capa: Storyset e ShutterStock.

https://www.colaboraread.com.br/integracaoAlgetec/index?usuarioEmail=natalia.gois.santos%40gmail.com&usuarioNome=NATALIA+GOIS+DOS+SANTOS+LOPES&disciplinaDescricao=&atividadeId=3662477&a… 22/22

Você também pode gostar