Livro Texto Unidade 2

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 64

Unidade II

Unidade II
3 ESTRUTURA DE DADOS

Uma estrutura de dados é qualquer representação de dados e suas operações associadas.


Mesmo um número inteiro ou um número de ponto flutuante armazenado no computador pode
ser visto como uma estrutura de dados simples. Normalmente, uma estrutura de dados deve ser
uma organização ou estruturação para uma coleta de dados e/ou itens. Uma lista classificada de
números inteiros armazenados em uma matriz é um exemplo dessa estruturação.

Assim, é possível realizar todas as operações em qualquer estrutura de dados. No entanto, o


uso da estrutura (de dados) adequada pode fazer a diferença entre um programa em execução em
alguns segundos e outro que requer muitos dias.

3.1 Dados homogêneos

Uma estrutura de dados é um esquema para organizar dados na memória de um computador,


uma maneira específica de armazenar e organizar dados em um computador a fim de que sejam
usados ​​com eficiência. Diferentes tipos de estruturas de dados são adequados para diferentes tipos
de aplicativos, e, em alguns casos, são altamente especializados para realizar tarefas específicas.

As estruturas de dados são usadas em quase todos os programas ou sistemas de software.


Estruturas de dados específicas são ingredientes essenciais de muitos algoritmos eficientes e
possibilitam o gerenciamento de enormes quantidades de dados, como grandes bancos de dados
e serviços de indexação de internet.

Ao selecionar uma estrutura de dados para resolver um problema, você deve seguir estas etapas:

• analise seu problema para determinar as operações básicas que devem ser suportadas;

• quantifique as restrições de recursos para cada operação;

• selecione a estrutura de dados que melhor atenda a esses requisitos.

A importância relativa dessas operações é abordada pelas três perguntas a seguir, que você
deve ter em mente sempre que precisar escolher uma estrutura de dados.

• Todos os itens de dados são inseridos na estrutura de dados no início ou são inserções intercaladas
com outras operações?

54
ALGORITMOS

• Os itens de dados podem ser excluídos?

• Todos os itens de dados são processados em


​​ alguma ordem ou procuram itens de dados específicos?

Algumas das estruturas de dados mais usadas incluem listas, matrizes, pilhas, filas, pilhas, árvores
e gráficos. A maneira como os dados são organizados afeta o desempenho de um programa para a
execução de tarefas diferentes. As estruturas de dados geralmente são baseadas na capacidade que
um computador tem em buscar e armazenar os dados em qualquer lugar em sua memória, lugar
esse especificado por um endereço – uma sequência de bits que pode ser ela mesma armazenada
na memória e manipulada pelo programa.

Os dados podem ser organizados de várias maneiras: o modelo lógico ou matemático de uma
determinada organização de dados é chamado estrutura de dados. O modelo de dados pode ser
rico o suficiente em estrutura para refletir o relacionamento real dos dados no mundo real. Por
outro lado, a estrutura deve ser simples para executar o processo dos dados quando necessário.

De acordo com Lakhwani (2013), a estrutura de dados pode ser classificada em dois tipos, linear
ou não linear.

• Linear: uma estrutura de dados é linear se seus elementos formarem uma sequência. Os elementos
da estrutura de dados linear são representados por meio de locais de memória sequencial. Exemplo:
matriz e lista de links.

• Não linear: uma estrutura de dados é considerada não linear se seus elementos compuserem
um relacionamento hierárquico entre elementos como árvores e gráficos. Todos os elementos
atribuem a memória de forma aleatória e você pode buscar elementos de dados através do
processo de acesso aleatório. Exemplo: árvores e árvores binárias.

3.1.1 Variáveis indexadas unidimensionais

Nas palavras de Manzano:

A matriz de uma dimensão é a forma mais simples de usar tabelas de


valores com apenas uma coluna e várias linhas de dados. Essa estrutura
de dados fica em uma única variável dimensionada com um determinado
tamanho. A dimensão de uma matriz é formada por constantes inteiras
e positivas. Os nomes dados a uma variável composta (matriz) seguem
as mesmas regras dos nomes dados a variáveis simples e também ao
comando var, com auxílio do comando conjunto na definição da matriz
(MANZANO, 2019, p. 133).

De acordo com Lakhwani (2013), o tipo mais simples de estrutura de dados é o vetor (ou uma
matriz linear/unidimensional). Essa estrutura utiliza uma lista de um número finito (composta
por n de elementos) de dados semelhantes referenciados, respectivamente, por um conjunto de
55
Unidade II

n números consecutivos (geralmente 1, 2, 3… n). Se escolhermos o nome A para o vetor, então o


elementos de A serão indicados pela notação de colchete:

A [1], A [2], A [3] ... A [N]

Nome da A[1]
variável
indexada (A)

Índice (1)

Figura 14 – Armazenamento de um vetor na memória

Independentemente da notação, o número K em A [K] é chamado de subscrito e A [K] é chamado


de variável subscrita.

Uma variável indexada unidimensional é aquela que, a partir de um único nome e de um


número (o índice), permite o armazenamento e a localização de um conjunto de dados. As variáveis
indexadas unidimensionais também são conhecidas por arranjos unidimensionais ou, ainda, vetores
(SOUZA et al., 2019).

Na imagem a seguir, temos a estrutura de uma variável indexada que possui o nome de A, que
representa quatro valores ao mesmo tempo.

...
98
99
100 -3
O vetor A possui os
valores -3, 4, 5, 0 e está 101 4
A
armazenado a partir da 102 5
posição 100 da memória
103 0
104
105
...
Memória

Figura 15 – Armazenamento de um vetor na memória

Um vetor é uma estrutura que armazena vários dados de mesmo tipo, ao


contrário das variáveis comuns, que só podem armazenar um valor de cada
vez. Em programação, é das estruturas mais simples. Os elementos individuais
são acessados por sua posição dentro do vetor. A posição é dada pelo
chamado índice, que, em geral, utiliza uma sequência de números inteiros,
que são acessados de forma rápida e eficiente (SOFFNER, 2013, p. 88).

56
ALGORITMOS

O vetor é uma multivariável. Permite armazenar muitos números diferentes, valores de ponto
flutuante, caracteres, cadeias ou qualquer tipo de variável em uma única unidade. Os vetores
são declarados como outras variáveis, embora o nome da variável termine com um conjunto
de colchetes:

int RA_Aluno[3];

Nesse exemplo, o vetor RA_Aluno é declarado e pode conter três itens (é o que o “3” entre
colchetes especifica). Os vetores também podem ser declarados e atribuídos ao mesmo tempo,
como pode ser visto na sequência.

float temperatura [] = {97.0, 98.2, 98.6, 99.1};

Esse vetor, denominado como temperatura, contém quatro valores de ponto flutuante. Cada
item dentro do vetor pode ser referenciado de forma individual. Os itens são conhecidos como
elementos. O primeiro elemento em um vetor é numerado pelo índice zero. Portanto, o elemento
zero na matriz temperatura é número 97.0.

Os valores também podem ser atribuídos aos vetores como às variáveis ​​regulares.

RA_Aluno [0] = 32;


RA_Aluno [1] = 17;
RA_Aluno [2] = 96;

Essas três instruções atribuem os valores 32, 17 e 96 ao vetor RA_Aluno. Observe que o primeiro
elemento é o índice zero (0).

A seguir, temos um algoritmo em Portugol de um programa que realiza o cálculo da média


aritmética dos elementos de um vetor.

Início
1. C ← 1
2. Soma ← 0
3. Enquanto C <= 6 Faça
4. Ler(Q[C])
5. Soma←Soma + Q[C]
6. C♂← C + 1
7. Fim Enquanto
8. Media ← Soma/6
9. Exibir(‘A média é:‘, Media)
Fim

57
Unidade II

Figura 16 – Algoritmo em Portugol para calcular a média aritmética dos elementos de um vetor
De acordo com Manzano (2019), a leitura dos dados de uma matriz é processada passo a passo,
um elemento por vez, por meio de um laço de repetição. A seguir, são apresentados o diagrama
de blocos e a codificação em português estruturado da leitura das médias de cada um dos alunos,
cálculo da média geral e a apresentação do resultado.
Diagramação Codificação

Início

SOMA ← 0

I ← 1, 8, 1

MD[I]

SOMA ← SOMA + MD[I]

MÉDIA ← SOMA/8

MÉDIA

Fim

Figura 17 – Diagrama de blocos para leitura dos elementos de uma matriz do tipo vetor

O processo de escrita dos dados de uma matriz é bastante parecido com o processo de leitura
desses dados. Em seguida, são apresentados o diagrama de blocos e a codificação em português
estruturado da escrita das médias individuais dos oito alunos antes de ser mostrado o resultado do
cálculo da média geral.

58
ALGORITMOS

Diagramação Codificação

Início

SOMA ← 0

I ← 1, 8, 1

MD[I]

SOMA ← SOMA + MD[I]

MÉDIA ← SOMA/8

I ← 1, 8, 1

MD[I]

MÉDIA

Fim

Figura 18 – Diagrama de blocos para escrita dos elementos de uma matriz do tipo vetor

Exemplo de aplicação

Pesquise exemplos de algoritmos que utilizam a estrutura das variáveis indexadas unidimensionais.

59
Unidade II

Saiba mais

Uma boa recomendação de leitura são as obras de Manzano. Você pode


ler, por exemplo, a que é indicada a seguir.

MANZANO, J. A. N. G. Algoritmos: lógica para desenvolvimento de


programação de computadores. São Paulo: Érica, 2019.

Vejamos agora o que diz Manzano.

Uma das operações mais importantes executadas com matrizes é, sem
dúvida, a organização dos dados armazenados.

A classificação numérica de dados pode ser efetuada na ordem crescente


(do menor valor numérico para o maior) ou na ordem decrescente (do maior
valor numérico para o menor).

A classificação alfabética de dados pode ser efetuada na ordem


ascendente (de “A” até “Z” ou de “a” até “z”) ou na ordem descendente (de “Z”
até “A” ou de “z” até “a”). Primeiramente ocorre a ordenação dos caracteres
alfabéticos maiúsculos e depois a ordenação dos caracteres minúsculos.

A classificação alfanumérica de dados pode ser feita na ordem ascendente


ou descendente. Esse tipo de classificação considera dados numéricos,
alfabéticos e demais caracteres gráficos previstos na tabela ASCII.

Para classificar dados em uma matriz de uma dimensão (ou mesmo


matrizes com mais dimensões) não há necessidade de um programador
desenvolver algoritmos próprios, pois já existe um conjunto de algoritmos
para essa finalidade. Basta conhecer e escolher aquele que atenda mais
adequadamente a uma necessidade específica. Entre as técnicas (os
métodos) de programação para classificação de dados existentes, pode-se
destacar as categorias:

a. Classificação por inserção (método da inserção direta, método da inserção


direta com busca binária, método dos incrementos decrescentes - shellsort).

b. Classificação por troca (método da bolha - bubblesort, método da


agitação - shakesort, método do pente - combsort, método de partição e
troca - quicksort).

c. Classificação por seleção (método da seleção direta, método da


seleção em árvore - heapsort, método de seleção em árvore amarrada -
threadedheapsort).
60
ALGORITMOS

d. Classificação por distribuição de chaves (método de indexação


direta - radixsort).

e. Classificação por intercalação (método da intercalação simples -


mergesort, método de intercalação de sequências naturais).

f. Classificação por cálculo de endereços (método das listas de colisão,


método da solução postergada das colisões) (MANZANO, 2019, p. 147-148,
grifo do autor).

A próxima imagem apresenta um programa que realiza a leitura de uma matriz dinâmica A com
N elementos do tipo cadeia (caracter/texto) para representar os nomes de algumas pessoas e, em
seguida, apresenta a lista de nomes que foram inseridos na matriz A.
Diagramação Codificação

Início

I ← 1, N, 1

A[I]

I ← 1, N, 1

A[I]

Fim

Figura 19 – Diagrama de blocos para programa com matriz dinâmica

61
Unidade II

Observação

O vetor pode ser definido como uma variável composta homogênea


unidimensional formada por uma sequência de variáveis do mesmo tipo de
dados, com o mesmo identificador e alocadas sequencialmente na memória.

3.1.2 Matriz bidimencional

Segundo Manzano:

A utilização de matrizes em programação é bastante ampla, que vai desde


o uso direto, quando o programador constrói a estrutura de dados e faz o
seu controle operacional, até o uso indireto, quando o programador usa um
sistema de gerenciamento de banco de dados para auxiliar a construção e
controle das operações em tabelas de dados (MANZANO, 2019, p. 146).

Até agora, o foco estava em como controlar algoritmos, examinando as construções e observando
de que forma podemos utilizar as estruturas para controlar a ordem e as circunstâncias nas quais
as etapas individuais de um algoritmo serão executadas. O motivo é que a escolha da estrutura de
controle mais adequada é importante para projetar um algoritmo eficiente e eficaz.

Entretanto, os algoritmos são projetados para manipular entradas na forma de dados e essas
entradas precisam ser consideradas ao se projetar um algoritmo. Geralmente, os dados que serão
processados ​​por um algoritmo compreendem os itens que estão relacionados de alguma forma
entre si, em vez de coleções arbitrárias de itens. Considere, por exemplo, os metadados que
compõem um perfil de usuário, como nome, idade, endereço, função, número de contato etc. Esses
itens são conectados logicamente entre si e não podem ser processados c​ omo uma coleção de itens
não relacionados por um algoritmo; deve-se, portanto, processar como um registro em que cada
registro compreende as informações sobre um usuário específico.

Segundo Soffner (2013, p. 95): “Uma matriz é um vetor multidimensional. Alguns autores
consideram ambas as expressões a mesma coisa, e o que muda é apenas o número de dimensões
(como no termo em inglês, array, que vale para as duas coisas)”.

Os dados devem ser organizados de maneira a capturar relações lógicas entre seus elementos,
que juntamente com suas inter-relações formam uma estrutura de dados estruturados. O tipo mais
comum de estrutura de dados é a sequência que compreende um conjunto de itens classificados
de maneira que cada item (exceto o último na sequência) tem um sucessor e cada item (com
exceção do primeiro na sequência) tem um antecessor.

62
ALGORITMOS

Estes são alguns exemplos comuns de sequências de fácil compreensão:

• um número apresentado como uma sequência de dígitos, por exemplo, 1512000 (1 é o primeiro,
0 é o último);

• uma palavra apresentada como uma sequência de letras, por exemplo, sequência (“s” é o primeiro,
“a” é o último).

Observação

A matriz pode ser definida como uma variável composta homogênea


multidimensional, formada por variáveis, todas do mesmo tipo de dados,
com o mesmo identificador.

De acordo com Christodoulou et al. (2018), uma sequência é uma estrutura ideal para os
itens que devem ser processados sequencialmente, um após o outro. A maneira mais comum de
progredir através de uma sequência é por meio do uso de uma estrutura de repetição. A matriz
é uma sequência de comprimento fixo em que cada elemento é identificado por sua posição na
sequência, uma coleção indexada de elementos homogêneos. Uma sequência de matriz possui as
seguintes propriedades:

• todos os elementos da matriz são do mesmo tipo de dados (homogêneo);

• em uma matriz composta por linhas e colunas, o tamanho de cada linha (número de colunas) é o
mesmo para todas as linhas;

• cada elemento de uma matriz é identificado por sua posição ao longo de cada dimensão (índice,
por exemplo: num [1][4], num [4][1] etc.);

• o tamanho de uma dimensão específica é constante.

A matriz de duas dimensões é uma estrutura de dados com mais de uma coluna e mais de uma
linha. A imagem a seguir apresenta uma matriz de uma dimensão e uma matriz de duas dimensões,
além das diferenças entre as suas estruturas.

63
Unidade II

Matriz A (1D) Matriz A Índice 1 2 3 4 5


Índice Elemento (1D) Elemento
1 Tabela horizontal de uma dimensão (uma linha e várias colunas)
2
3
4 Matriz A (2D)

5 Índices 1 2 3 4 5

Tabela vertical de uma 1


dimensão (uma coluna e 2
várias linhas)
3 Elemento
4
5
Tabela de duas dimensões (várias colunas e várias linhas)

Figura 20 – Matrizes de uma e duas dimensões

Exemplo de aplicação

Pesquise exemplos de algoritmos que utilizam a estrutura das matrizes bidimencionais.

De acordo com Manzano (2019), a leitura dos dados de uma matriz de duas dimensões, assim
como dos dados de matrizes de uma dimensão, é processada passo a passo por meio do comando
leia seguido do nome da variável mais os seus índices. Na imagem a seguir, é possível observar o
diagrama de blocos e a codificação em português estruturado da leitura de quatro notas bimestrais
de oito alunos, sem considerar o cálculo da média.

Início

I ← 1, 8, 1

J ← 1, 4, 1

Notas [I, J]

Fim

Figura 21 – Diagrama de blocos para leitura dos elementos de uma matriz do tipo tabela

64
ALGORITMOS

Esse exemplo apresenta a leitura das quatro notas (colunas) de oito alunos (linhas). Assim
sendo, a tabela em questão armazena 32 elementos. Um detalhe é a utilização de duas variáveis
para controlar os dois índices de posicionamento de dados na tabela. Nesse exemplo, a variável I
continua com o mesmo efeito e a segunda variável, a J, controla a posição da coluna.

Ao analisar o diagrama de blocos, tem-se a inicialização das variáveis I


(linhas) e J (coluna) como o valor 1, ou seja, a leitura é feita na primeira
linha da primeira coluna. Em seguida é iniciado em primeiro lugar o laço
da variável I para controlar a posição de um elemento em relação às linhas,
depois é iniciado o laço da variável J para controlar a posição do elemento
em relação às colunas (MANZANO, 2019, p. 178).

O processo de escrita de dados de uma matriz de duas dimensões é semelhante ao processo de


leitura desses dados. Por exemplo, vamos imaginar que, após a leitura das notas dos oito alunos,
houvesse a necessidade de apresentá-las. Acompanhe o diagrama de blocos e a codificação em
português estruturado das quatro notas dos oito alunos.
Diagramação Codificação

Início

I ← 1, 8, 1

J ← 1, 4, 1

Notas [I, J]

Fim

Figura 22 – Diagrama de blocos para escrita dos elementos de uma matriz do tipo tabela

3.2 Dados heterogêneos

Vejamos o que diz Manzano:

Um dos grandes problemas enfrentados pelos profissionais da área de


desenvolvimento de software em microinformática é acumular funções.
Nas áreas de minicomputadores e de computadores de grande porte
essa incidência ocorre num nível muito pequeno e de forma esporádica
(MANZANO, 2019, p. 190).

65
Unidade II

E, agora, retomemos algumas palavras de Soffner:

As estruturas permitem que armazenemos diversos tipos de dados diferentes


na mesma estrutura, ao contrário dos vetores e matrizes que, como visto,
trabalham apenas elementos do mesmo tipo. Isso aumenta em muito
a capacidade de manipulação de dados do programa. As estruturas são
chamadas por alguns autores de registros (SOFFNER, 2013, p. 111).

3.2.1 Tipo de dado derivado: estrutura de registro

Sobre a estrutura de registro, diz Pressman:

A estrutura de registro é um recurso que possibilita combinar vários dados


de tipos diferentes (os quais serão chamados de campos) em uma mesma
estrutura de dados. Por esta razão, esse tipo de estrutura de dados é
considerado heterogêneo. De forma mais ampla, pode-se dizer que registro
é uma coleção designada de dados que descreve um objeto de dados como
sendo uma abstração de dados (PRESSMAN, 1995, p. 422).

Um recurso preexistente em algumas linguagens de programação é a estrutura de registros


para a composição da heterogeneidade de dados. A imagem a seguir apresenta um exemplo do
layout básico de uma ficha de cadastro escolar de aluno, com os campos nome, primeira nota,
segunda nota, terceira nota e quarta nota.

Escola de computação XPTO


Cadastro escolar de aluno

Nome

Turma Sala 1ª nota


2ª nota
3ª nota
4ª nota

Figura 23 – Exemplo do layout de um registro com seus campos

O tipo derivado preexistente registro deve ser declarado pelo comando


tipo antes do comando var, uma vez que a variável que conterá a estrutura
heterogênea de dados deve ser declarada com o tipo de dado registro
definido no comando tipo. A declaração do tipo registro é uma tarefa
delicada e precisa ser feita com cuidado, pois é a base para tabela ou tabelas
heterogêneas que serão utilizadas no programa. Um erro na montagem de
uma tabela heterogênea ocasiona grande problema no desenvolvimento do

66
ALGORITMOS

programa. Além da criação do diagrama de blocos, que representa a linha


de raciocínio utilizada pelo programador, é ideal fazer a documentação da
estrutura dos dados a ser utilizada pelo programa (MANZANO, 2019, p. 192).

A leitura de um registro é realizada com a instrução leia seguida do nome da variável do tipo
registro e seu campo correspondente separado por um caractere “.” (ponto). A imagem a seguir
apresenta o diagrama de blocos e o código em português estruturado.
Diagramação Codificação

Início

ALUNO.NOME

ALUNO.TURMA

ALUNO.SALA

ALUNO.NOTA1

ALUNO.NOTA2

ALUNO.NOTA3

ALUNO.NOTA4

Fim

Figura 24 – Exemplo de leitura de um registro

O processo de escrita de um registro é realizado com a instrução escreva de forma semelhante ao


processo de leitura. Observe na imagem a seguir o diagrama de blocos e o código em português estruturado.

67
Unidade II

Diagramação Codificação

Início

ALUNO.NOME

ALUNO.TURMA

ALUNO.SALA

ALUNO.NOTA1

ALUNO.NOTA2

ALUNO.NOTA3

ALUNO.NOTA4

Fim

Figura 25 – Exemplo de escrita de um registro

Exemplo de aplicação

Pesquise exemplos de algoritmos que utilizam a estrutura de registro.

3.2.2 Estrutura de matriz de registros

Vejamos o que diz Manzano:

Com as técnicas de programação [...], passou-se a ter muita mobilidade


para trabalhar de forma mais adequada com diversos tipos de problema,
principalmente aqueles que envolvem dados heterogêneos, facilitando a
construção de programas que necessitam operar com uma estrutura de
dados mais flexível. Os programas apresentados com registros só fizeram

68
ALGORITMOS

menção à leitura e escrita de um único registro, mas não em relação a um


número maior de registros. Assim sendo, introduz-se a matriz de registros
que permite a construção de programas que fazem entrada, processamento
e saída de diversos registros (MANZANO, 2019, p. 199).

De acordo com Manzano (2019), a leitura dos elementos da matriz de registros deve ser feita com dois
laços. Essa estrutura é bastante similar a uma matriz de duas dimensões. Observe a seguir o diagrama
de blocos e o código correspondente em português estruturado.
Diagramação Codificação

Início

I ← I, 8, 1

ALUNO[I].NOME

ALUNO[I].TURMA

ALUNO[I].SALA

J ← 1, 4, 1

ALUNO[I].NOTA[J]

Fim

Figura 26 – Exemplo de leitura de um conjunto de registros

O laço da variável I controla o número de alunos da turma, no caso oito, e o laço da variável J
controla o número de notas, até quatro por aluno. Para cada movimentação de mais um na variável I,
existem quatro movimentações na variável J.

O processo de escrita dos elementos de uma matriz de registros é similar aos já estudados.
Observe a seguir o diagrama de blocos e o código correspondente em português estruturado.

69
Unidade II

Diagramação Codificação

Início

I ← 1, 8, 1

ALUNO[I].NOME

ALUNO[I].TURMA

ALUNO[I].SALA

J ← 1, 4, 1

ALUNO[I].NOTA[J]

Fim

Figura 27 – Exemplo de escrita de um conjunto de registros

Exemplo de aplicação

Pesquise exemplos de algoritmos que utilizam a estrutura de matriz de registros.

Lembrete

Uma estrutura de dados é qualquer representação de dados e suas


operações associadas. Mesmo um número inteiro ou um número de
ponto flutuante armazenado no computador podem ser vistos como uma
estrutura de dados simples.

4 LINGUAGEM C

De acordo com Oram e Naik [ca. 2010], a linguagem de programação C foi desenvolvida nos
Laboratórios Bell da AT&T, nos Estados Unidos, em 1972. Desenhada e escrita por Dennis Ritchie no
final da década de 1970, a linguagem C começou a substituir os idiomas mais familiares da época,
como PL / I, ALGOL etc.

70
ALGORITMOS

As principais partes de sistemas operacionais populares como Windows, UNIX, Linux ainda
estão escritas em C. Isso ocorre porque, ainda hoje, quando se trata de desempenho (velocidade de
execução), nada supera essa linguagem. Além disso, se for necessário estender o sistema operacional
para trabalhar com novos dispositivos, é necessário escrever programas de driver de dispositivo.
Esses programas são escritos exclusivamente em C.

Vejamos as características da linguagem e como conseguimos criar um programa em C.

4.1 Noções de ambiente de desenvolvimento de programas em C

Existe uma analogia próxima entre aprender inglês e aprender a linguagem C. O método
clássico para conseguir aprender um novo idioma, como é o caso do inglês, consiste em, a princípio,
conhecer o alfabeto usado no idioma, aprender ao processo de combinação desse alfabeto
para formar palavras que, por sua vez, são combinadas para formar frases, as quais, associadas,
constituirão parágrafos.

Aprender a programar na linguagem em C é semelhante, e talvez até mais fácil. Assim, em vez
de aprender imediatamente como escrever programas, precisamos primeiro saber quais alfabetos,
números e símbolos são usados ​​em C, depois, como usá-los para a criação de constantes, variáveis​​
e palavras-chave e, finalmente, como eles são combinados para formar uma instrução.

Instruções seriam combinadas posteriormente para formar um programa. Portanto, um programa


de computador é apenas uma coleção das instruções necessárias para resolver um problema.
As operações básicas de um sistema de computador formam o que é conhecido como um conjunto
de instruções do computador.

Lembrete

Em vez de aprender imediatamente como escrever programas, precisamos


primeiro saber quais alfabetos, números e símbolos são usados em C, depois,
como usá-los para a criação de constantes, variáveis e palavras‑chave e,
finalmente, como eles são combinados para formar uma instrução.

4.1.1 Linha de comentário

Através da linha de comentário é possível incluir, no código fonte o objetivo do programa,


explicações sobre os processos que estão sendo executados e outras informações.

/*…………………………………*/

Figura 28 – Símbolo representando a linha de comentário

71
Unidade II

A linha de comentários é usada para aumentar a legibilidade do programa. É útil para incluir no
código as explicações, sendo geralmente usada também para auxiliar na documentação. A linha de
comentário pode ser única ou múltipla, mas não deve ser aninhada; pode estar em qualquer lugar
do programa, exceto dentro da constante ou no caractere da string constante.

4.1.2 Directiva do pré-processador (preprocessor directive)

A indicação #include<stdio.h> orienta o compilador a incluir informações sobre a biblioteca


padrão de entrada/saída. Também é usada em constante simbólica, como #define PI para representar
o valor 3,14.

O stdio.h (arquivo de cabeçalho de saída de entrada padrão) contém a definição e a declaração


da função definida pelo sistema, como printf(), scanf(), pow() etc. Geralmente, a função printf() é
usada para exibir informações para o usuário e a função scanf() é utilizada para ler (gravar) o valor
digitado pelo usuário.

4.1.3 Declaração global (global declaration)

Essa é a seção em que as variáveis ​​são declaradas de forma global para que possam ser acessadas
por todas as funções usadas no programa. E geralmente é declarada fora da função main().

A partir da função main(), o programa é iniciado e está dentro do par de chaves. Ela pode
estar em qualquer lugar do programa, mas, na prática, geralmente é colocada logo na primeira
posição do código.

Sintaxe:

main() {
……..
……..
// restante do código
……..
……..
}

4.1.4 A função main

A função main() retorna um valor quando é declarado um tipo de dados, conforme pode ser
visto no exemplo a seguir.

int main () {
return 0;
}

72
ALGORITMOS

A função principal não retorna nenhum valor quando é atribuído o indicador void (significa
nulo/vazio), como pode ser visto a seguir.

void main (void) ou void main()


{
printf (“Linguagem em C”);
}
Output / Saída: Linguagem em C

A execução do programa começa com as chaves de abertura e termina com as chaves de


fechamento. No final de cada linha, obrigatoriamente, devemos colocar o ponto e vírgula (que
indica o encerramento de instrução). Veja um exemplo a seguir.

Figura 29 – Primeiro programa c com declaração de retorno (imagem do programa Dev C++)

4.1.5 Etapas para compilar e executar os programas em C

Um compilador é um programa de software que analisa um programa desenvolvido em uma


determinada linguagem de computador e depois a converte em um formato adequado para
execução em um sistema de computador específico.

De acordo com Oram e Naik [ca. 2010], podemos relacionar algumas etapas em relação ao
processo de criação e compilação de um programa utilizando a linguagem em C.

Etapa 1

O programa a ser compilado é digitado primeiro em um arquivo no diretório do sistema de um


computador. Existem várias convenções usadas para nomear arquivos, normalmente qualquer nome,
desde que os dois últimos caracteres sejam “.c” ou arquivo com a extensão “.c”. Portanto, o nome do
arquivo prog1.c pode ser um nome de arquivo válido para um programa em C.

Um editor de texto geralmente é usado para inserir o programa C em um arquivo. Por exemplo,
ao longo deste livro-texto, usaremos o programa Dev C++ (disponível de forma gratuita para
download no seguinte link: https://sourceforge.net/projects/orwelldevcpp/).

73
Unidade II

Figura 30 – Imagem do programa Dev C++

O programa que é inserido no arquivo é conhecido como programa de origem porque representa
a forma original do programa expresso na língua C.

Etapa 2

Depois que o programa de origem for inserido em um arquivo, devemos continuar com o
processo de compilação. O processo de compilação é iniciado digitando um comando especial
em um sistema. Quando esse comando é inserido, o nome do arquivo que contém o programa de
origem também deve ser especificado.

Na primeira etapa do processo de compilação, o compilador examina cada linha contida no


programa de origem, verificando sua estrutura para garantir que esteja em conformidade com a
sintaxe e a semântica da linguagem. Se algum erro for descoberto pelo compilador durante essa
fase, ele será relatado ao usuário e o processo de compilação termina.

Os erros devem ser corrigidos no programa de origem (com o uso de um editor) e o processo
de compilação deve ser reiniciado. Os erros relatados durante essa fase de compilação podem
ser classificados como: erro sintático (devido a uma expressão que possui parênteses colocados
de forma equivocada) ou erro semântico (devido ao uso de uma variável que não foi “definida”
anteriormente).

74
ALGORITMOS

Etapa 3

Quando todos os erros sintáticos e semânticos forem removidos do diretório do programa, o


compilador passará a traduzir cada instrução do programa em um formato “inferior” equivalente
ao programa em uma linguagem de máquina (assembly).

Etapa 4

Após a tradução do programa, a próxima etapa na compilação é o processo de traduzir as


instruções da linguagem assembly em máquinas reais. O assembler pega cada declaração da
linguagem assembly e a converte em um formato binário conhecido como código de objeto, que é
gravado em outro arquivo no sistema.

Etapa 5

Após o programa ser traduzido em código de objeto, ele está pronto para ser vinculado. O objetivo
da fase de vinculação é obter o programa em um formato final para execução no computador.

Se o programa usar outros programas que foram anteriormente processados pelo compilador,
tais programas serão vinculados nessa etapa. Os programas usados ​​na biblioteca de programas do
sistema também são pesquisados ​​e vinculados com o programa objeto durante essa fase.

O processo de compilação e vinculação de um programa geralmente é chamado de construção.


O arquivo final vinculado, que está em um formato de código de objeto executável, é armazenado
em outro arquivo no sistema, pronto para ser executado.

Etapa 6

Quando o programa é executado, cada uma das instruções do programa é executada de forma
sequencial. Se o programa solicitar dados do usuário, conhecido como entrada, o programa
suspende temporariamente sua execução para que a entrada possa ser informada. O programa também
pode simplesmente esperar por um evento, como o clique do mouse.

Se o programa não produzir os resultados desejados, é necessário voltar e reanalisar a lógica.


Isso é conhecido como fase de depuração, durante a qual é feita uma tentativa de correção de
todos os problemas ou bugs descobertos do programa.

Os programas são desenvolvidos em uma sequência de edição, compilação,


linkedição e execução.

Depois que o código-fonte foi digitado em um editor de texto, o compilador


verifica sua sintaxe e, se ela estiver correta, cria um arquivo intermediário
chamado de arquivo-objeto (.obj). A partir desse, o linkeditor criará o

75
Unidade II

arquivo-executável (.exe), a partir da ligação do arquivo-objeto com as


funções providas pelas bibliotecas correspondentes.

Os erros que podem surgir em programação são do tipo lógico (bug) ou de


sintaxe. No primeiro, o programa não gera o resultado esperado; portanto, é
mais perigoso que o segundo, no qual as regras da linguagem são violadas
mas o compilador barra a geração do arquivo executável até que o erro seja
corrigido (SOFFNER, 2013, p. 36).

4.1.6 Nomenclatura dos identificadores (nome das variáveis)

De acordo com Oram e Naik [ca. 2010], os identificadores são palavras definidas pelo usuário
para nomear entidades como variáveis, matrizes, funções, estruturas etc. As regras para nomear
identificadores são:

• o nome deve consistir apenas de alfabetos (maiúsculas e minúsculas), dígitos e sinal de


sublinhado (_);

• os primeiros caracteres devem ser alfabéticos ou sublinhados;

• o nome não deve ser uma palavra-chave;

• como a linguagem em C diferencia maiúsculas de minúsculas, as maiúsculas e minúsculas são


consideradas de maneira diferente;

• os identificadores geralmente são dados em algum nome significativo, como valor, idade,
dados etc.

4.2 Estrutura e estilo de programas em linguagem C

4.2.1 Palavra-chave (keyword)

Há certas palavras reservadas para realizar tarefas específicas nos programas em C. Essas palavras
são conhecidas como palavras reservadas ou palavras-chave. Essas palavras são predefinidas e
sempre devem ser escritas em letras minúsculas. Vale ressaltar que tais palavras-chave não podem
ser usadas como nome de uma variável com significado fixo.

De acordo Soffner (2013), a linguagem C possui um total de 32 palavras reservadas (conforme


definido pela American National Standards Institute – ANSI), listadas no quadro a seguir.

76
ALGORITMOS

Quadro 5 – Palavras reservadas da Linguagem C

Auto Double Int Struct


Break Else Long Switch
Case Enum Register Typedef
Char Extern Return Union
Const Float Short Unsigned
Continue For Signed Void
Default Goto Sizeof Volatile
Do If Static While

Fonte: Soffner (2013, p. 36).

4.2.2 Sequências de escape

Sobre a sequência de escape, Soffner sintetiza bem o assunto ao dizer:

Utilizamos também uma sequência (ou um caractere) de escape “\n”, que


executa uma operação de formatação no texto impresso na tela.

As principais sequências de escape são:

\n = newline (nova linha)


\a = ASCII beep
b = backspace
\f = form feed (avanço de página)
r = carriage return (enter)
\t = tabulação horizontal
\\ = barra invertida
\’ = aspas simples
\” = aspas duplas
\? = interrogação
\xnn = caractere ASCII em hexadecimal (nn); Exemplo: \xDC, \xC9, \xCD
(SOFFNER, 2013, p. 38).

4.2.3 Especificadores de formato

Retomemos as palavras de Soffner sobre o assunto:

Os especificadores de formato, que, como o nome diz, formatam a entrada


e a saída-padrão. São eles:

%d = inteiro decimal
%f = real (ponto flutuante)

77
Unidade II

%o = inteiro octal
%x = hexadecimal
%c = caractere em formato ASCII
%s = string de caracteres
%p = valor ponteiro (SOFFNER, 2013, p. 38).

4.3 Tipos e variáveis primitivos

4.3.1 Tipos de dados (data types)

Oram e Naik [ca. 2010] apontam que os tipos de dados se referem a um amplo sistema usado
para declarar variáveis ou
​​ funções de tipos diferentes antes de seu uso. O tipo de uma variável
determina quanto espaço ela irá ocupar no armazenamento e como o padrão de bits armazenado
é interpretado. Vale ressaltar que o valor de uma variável pode ser alterado a qualquer momento.

A linguagem C possui os seguintes tipos de dados:

• Internos básicos (basic built-in data types): int, float, double, char.

• De enumeração (enumeration data type): enum.

• Derivados (derived data type): pointer, array, structure, union.

• Nulos (void data type): void.

Uma variável do tipo int pode ser usada somente para conter valores integrais (ou seja, valores
que não contêm casas decimais). Uma variável do tipo float pode ser usada para armazenar
números de ponto flutuante (valores contendo casas decimais). O tipo double é igual ao tipo
float, apenas com aproximadamente duas vezes sua precisão. Uma variável char pode armazenar
apenas o valor do tipo de caractere (o tipo de dados char pode ser usado para armazenar um único
caractere, como a letra a, o caractere de dígito 6 ou um ponto e vírgula da mesma forma).

4.3.2 Variáveis (variables)

Variável é um nome de dados usado para armazenar algum valor de dados ou nomes simbólicos
para armazenar os cálculos e resultados que serão executados pelo programa. O valor da variável
pode ser alterado durante a sua execução. A regra para nomear as variáveis é​​ igual à regra para
nomeação do identificador.

É sempre recomendável que se inicialize uma variável com um valor


adequado para evitarmos erros de tempo de execução, pois essa variável
pode reter valores anteriores que gerarão surpresas desagradáveis durante
a execução do programa.

78
ALGORITMOS

O nome da variável deve sempre lembrar o que vai guardar, e não pode ser
igual às palavras reservadas da linguagem.

A vírgula em Linguagem C é o ponto, e vice-versa (ao contrário do que


fazemos no Brasil).

Quando não se declara o tipo da variável, o compilador assume o tipo int.

Exemplos de declarações adequadas de variáveis:

int habitantes = 200000; // cidadãos de uma cidade


short int pessoas = 20; // grupo pequeno de pessoas
char letra = ‘a’; // caractere ‘a’
float salario = 1000.00; // valor monetário, com duas casas decimais
(SOFFNER, 2013, p. 34, grifo do autor).

Antes de ser usado no programa, o valor deve ser declarado. A declaração de variáveis especifica
seu nome e tipos de dados (o intervalo do valor que as variáveis podem armazenar depende de
sua classificação).

Sintaxe:

int a;
char c;
float f;

4.3.2.1 Inicialização das variáveis (variable initialization)

Quando atribuímos qualquer valor inicial à variável durante a declaração, esse processo é
chamado de inicialização de variáveis. Devemos atribuir o tipo de dado, incluir o nome da variável
e a sua constante.

Data type Nome_variavel = constante;

Exemplo:

int valorA = 20;

ou

int valorA;
valorA =20;

79
Unidade II

Saiba mais

A obra indicada a seguir pode ajudá-lo a entender mais detalhes


sobre vários conceitos estudados aqui.

SOFFNER, R. Algoritmos e programação em linguagem C. São Paulo:


Saraiva, 2013.

4.4 Operadores matemáticos e lógicos

4.4.1 Expressões

Uma expressão é uma combinação de variáveis, constantes, operadores e chamadas da função.


Pode ser aritmética, lógica e relacional. Veja alguns exemplos.

// expressão aritmética
int z = x + y;

// relacional
a>b

// lógico
a == b

// chamada de função
func (a, b)

Expressões que consistem inteiramente em valores constantes são chamadas de expressões


constantes. Veja um exemplo a seguir.

121 + 17 – 110

Essa expressão é denominada constante porque cada um de seus termos é composto de um


valor constante. Caso fosse declarada uma variável inteira, a expressão não representaria uma
expressão constante. Veja o caso a seguir.

180 + 2 - j

4.4.2 Operadores

Os operadores são os símbolos usados para executar alguma operação em variáveis, operandos
ou constante. Existem vários operadores que podem ser utilizados nas linguagens de programação:
operador aritmético, atribuição, incremento, decremento, lógico, condicional, vírgula, entre outros.
80
ALGORITMOS

Operador aritmético

Esse operador é utilizado para a realização de cálculos numéricos. Podemos classificar os


operadores aritméticos como operadores unários e operadores binários.

O operador aritmético unário é necessário apenas um operando como as atribuições +, -, ++, --.
E os operadores podem utilizar os princípios matemáticos como: + (adição), - (subtração), * (multiplicação),
/ (divisão).

O operador aritmético binário, por outro lado, utiliza obrigatoriamente dois operandos
requeridos e seus operadores são: + (adição), - (subtração), * (multiplicação), / (divisão), % (módulo).
No módulo, não pode ser aplicado com um operando de ponto flutuante (número real), bem como
não há operador expoente em C.

Podemos usar ainda: +=, -=, *=, /=

Operador de atribuição

Um valor pode ser armazenado em uma variável com o uso do operador de atribuição. O operador
de atribuição (=) é usado na declaração de atribuição e na expressão de atribuição. O operando no lado
esquerdo deve ser a variável e o operando no lado direito pode ser uma variável, uma constante ou
qualquer expressão.

Por exemplo:

int x = y

int somaValorProduto = produto1 + produto 2 + produto 3

Incremento e decremento

Os operadores unários ++ e -- são usados como incremento e decremento que atuam sobre um
único operando. O operador de incremento (++) aumenta o valor da variável em um, já o operador
de decremento (--), semelhantemente, diminui o valor da variável em um.

Esses operadores podem ser usados apenas com a variável; não podendo ser usados com uma
expressão ou uma constante, como nos exemplos a seguir.

++ 6

++ (x + y + z)

81
Unidade II

Operador relacional

É usado para comparar o valor de duas expressões, dependendo de sua relação. A expressão
que contém operador relacional é denominada expressão relacional. Nessa estrutura, o valor é
atribuído de acordo com o parâmetro true (verdadeiro) ou false (falso).

Quadro 6 – Operador relacional

== Igualdade
< Menor
> Maior
>= Maior ou igual
<= Menor ou igual
!= Diferente

Por exemplo:

(a >= b) || (b> 50)


(b> a) && (c> b)
(a != 80)

Operador lógico ou booleano

O operador lógico deve ser usado com um ou mais operandos e retorna o valor zero (caso a
afirmação seja falsa) ou um (caso a afirmação seja verdadeira). O operando pode ser uma constante,
variáveis ​​
ou expressões. A expressão que combina duas ou mais expressões é denominada
expressão lógica.

Quadro 7 – Os três operadores lógicos de C

&& e
|| ou
! não

O operador ! (não) é unário e os outros dois operadores são binários. O operador lógico && (e)
fornece o resultado true se as duas condições forem verdadeiras, caso contrário, o resultado é false.
Já o operador lógico || (ou) fornece resultado true se uma das validações forem atendidas, caso
contrário, o resultado será false.

82
ALGORITMOS

4.5 Estrutura de decisão e laços de repetição

Geralmente, a instrução do programa na linguagem em C é executada na ordem em que aparece


no programa, mas, às vezes, usamos condições de tomada de decisão para executar apenas uma
parte do programa, a chamada instrução de controle. A instrução de controle define como o
controle é transferido de uma parte para a outra parte do programa. É possível utilizar várias
instruções de controle como as estruturas if...else, case, while, do...while e for. Neste tópico, vamos
trabalhar esses princípios.

4.5.1 Estrutura de decisão

Segundo Soffner:

Você já reparou que tomamos decisões o tempo todo? Quando caminhamos
dentro de casa, quando precisamos aplicar nosso dinheiro, quando aparece
um problema em casa ou no trabalho, no trânsito – as decisões são parte da
natureza de sobrevivência do animal neste planeta e, em especial, da nossa,
dos seres humanos, em razão da racionalidade característica da espécie –;
assim, decisões são tomadas a todo o momento, conscientemente ou não
(SOFFNER, 2013, p. 46).

If

A instrução if executa um conjunto de comandos apenas quando a condição é verdadeira. Se


o corpo da instrução if consistir em várias afirmações, é necessário utilizar um par de chaves para
organizar a sua validação. Caso a condição seja falsa, o compilador irá executar o próximo bloco
de instruções.

Sintaxe:

if (condição / teste) {
//Declaração 1;
//Declaração 2;
}

Veja um exemplo a seguir.

83
Unidade II

A)

B)

Figura 31 – Exemplo da estrutura condicional: if (imagem do programa Dev C++)

Retomemos o que diz Manzano:

Como um exemplo, considere o seguinte problema: ler dois valores


numéricos, efetuar a adição e apresentar o seu resultado caso o valor
somado seja maior que 10. Veja o diagrama de blocos e a codificação em
português estruturado.

Algoritmo

1. Conhecer dois valores incógnitos (estabelecer variáveis A e B).

2. Efetuar a soma dos valores incógnitos A e B, implicando o valor da


soma na variável X.

3. Apresentar o valor da soma na variável X, caso seja maior que 10


(MANZANO, 2012, p. 60).
84
ALGORITMOS

Diagramação Codificação

Início

A, B

X←A+B

N S
X > 10

Fim

Figura 32 – Exemplo da utilização da estrutura se...então (if)

A partir dessa representação, é possível implementar o programa na linguagem de programação C.


A seguir é dado o código.

85
Unidade II

A)

B)

Figura 33 – Implementação do problema apresentado (imagem do programa Dev C++)

If...else

A estrutura if...else é uma declaração de controle condicional bidirecional que contém uma
condição e duas ações possíveis.

A condição pode ser verdadeira ou falsa, sendo o valor diferente de zero considerado verdadeiro
e zero considerado falso. Se a condição for verdadeira, então um único ou um bloco de declaração
será executado, caso contrário, outro único ou bloco de declaração será executado.

Sintaxe:

if (condição / teste) {
//Declaração 1
//Declaração 2
} else {
//Declaração 1
//Declaração 2
}

86
ALGORITMOS

Veja o exemplo a seguir.

A)

B)

Figura 34 – Exemplo da estrutura condicional: if...else (imagem do programa Dev C++)

Diz Soffner:

Vejamos agora um exemplo de algoritmo que decide se um aluno foi aprovado


em dada disciplina escolar, em função das notas recebidas nas avaliações.

Teste da aprovação de um aluno

Dados de entrada: notas bimestrais.

Processamento: cálculo da média final e teste em relação à média


de aprovação.

Dados de saída: “aprovado” ou “reprovado”.

87
Unidade II

O algoritmo receberá duas notas de avaliações, calculará a média aritmética


dessas notas e comparará a média com o valor 6,0 (que é a média de
aprovação da escola). Agora vem a decisão: se a média for maior ou igual
a 6,0 (seis), o aluno está “aprovado”; caso contrário, ele está “reprovado”
(SOFFNER, 2013, p. 47, grifo do autor).

Início

N1, N2

Média = (N1+N2)/2

Sim
Média>=6,0? “Aprovado“

Não

“Reprovado“ Fim

Figura 35 – Representação gráfica da memória de um computador com variáveis

A partir dessa representação, é possível implementar o programa na linguagem de programação C.


Veja a seguir o código.

88
ALGORITMOS

A)

B)

Figura 36 – Implementação do problema apresentado (imagem do programa Dev C++)

Else if

Nesse tipo de aninhamento, há uma instrução if else em todas as partes, exceto na última. Se a
condição for um controle falso, passará para o bloco em que a condição é novamente verificada. Esse
processo continua até que não haja instrução if no último bloco, ou seja, caso uma das condições
seja atendida (válida), as próximas condições do bloco aninhado “else if” não serão executadas.

89
Unidade II

Essa dinâmica possui uma desvantagem sobre a declaração if else: na declaração if else, sempre
que a condição for verdadeira, outra condição não será verificada; já aqui, todas as condições serão
verificadas de forma hierárquica.

Sintaxe:

if (condição / teste) {
//Declaração 1
//Declaração 2
}

else if (condição / teste) {


//Declaração 1
//Declaração 2
}

else if (condição / teste) {


//Declaração 1
//Declaração 2
}

else {
//Declaração 1
//Declaração 2
}

Veja um exemplo a seguir.

90
ALGORITMOS

A)

B)

Figura 37 – Exemplo da estrutura condicional: else if (imagem do programa Dev C++)

Segundo Manzano:

Desenvolver um programa que solicite a entrada de um valor numérico


inteiro e apresente uma das seguintes mensagens: “você entrou o valor 1”
se for dada a entrada do valor numérico 1; “você entrou o valor 2” se for
dada a entrada do valor numérico 2; “você entrou valor muito baixo” se for dada
a entrada de um valor numérico menor que 1 ou “você entrou valor muito
alto” se for dada a entrada de um valor numérico maior que 2.

Veja a descrição das etapas de entendimento do problema e a representação


das ações a serem efetuadas pelo programa:

a. Definir a entrada de um valor numérico inteiro (variável N).

91
Unidade II

b. Verificar se N = 1 e, se for, apresentar a mensagem “você entrou o valor 1”.

c. Verificar se N = 2 e, se for, apresentar a mensagem “você entrou o valor 2”.

d. Verificar se N < 1 e, se for, apresentar a mensagem “você entrou


valor muito baixo”.

e. Verificar se N > 2 e, se for, apresentar a mensagem “você entrou valor


muito alto” (MANZANO, 2012, p. 66).

Diagrama de blocos Português estruturado

Início

N S
N=1

“Você entrou o
valor 1“

N S
N=2

“Você entrou o
valor 2“

N S
N<1

“Você entrou o
valor muito baixo“

N S
N>2

“Você entrou o
valor muito alto“

Fim

Figura 38 – Exemplo da utilização da estrutura se...então (if)

A partir dessa representação, é possível implementar o programa na linguagem de programação C.


Veja o código a seguir.

92
ALGORITMOS

A)

B)

Figura 39 – Implementação do problema apresentado (imagem do programa Dev C++)

Switch...Case

A instrução Switch...Case testa o valor de uma variável e a compara com vários casos. Depois que
a correspondência de caso é encontrada, um bloco de instruções associado a esse caso específico
deverá será ser executado.

O valor fornecido pelo usuário é comparado com todos os casos dentro do bloco da estrutura
Switch...Case até que a correspondência seja encontrada. Se uma correspondência de caso não for
encontrada, a instrução padrão será executada e o controle sairá do bloco.

93
Unidade II

Sintaxe:

switch( expressão ) {
case valor-1:
//Declaração 1
//Declaração 2
Break;

case valor -2:


//Declaração 1
//Declaração 2
break;

case valor-n:
//Declaração 1
//Declaração 2
break;

default:
//Declaração 1
//Declaração 2
break;
}

Veja um exemplo a seguir.

94
ALGORITMOS

A)

B)

Figura 40 – Exemplo da estrutura condicional: case (imagem do programa Dev C++)

95
Unidade II

Observe a seguir a descrição das etapas básicas de entendimento do problema e a representação


das ações a serem efetuadas pelo programa.

Algoritmo

Efetuar a leitura de um valor numérico inteiro (variável MÊS).

Se a variável MÊS for igual a 1, apresentar a mensagem “Janeiro”.

Se a variável MÊS for igual a 2, apresentar a mensagem “Fevereiro”.

Se a variável MÊS for igual a 3, apresentar a mensagem “Março”.

Se a variável MÊS for igual a 4, apresentar a mensagem “Abril”.

Se a variável MÊS for igual a 5, apresentar a mensagem “Maio”.

Se a variável MÊS for igual a 6, apresentar a mensagem “Junho”.

Se a variável MÊS for igual a 7, apresentar a mensagem “Julho”.

Se a variável MÊS for igual a 8, apresentar a mensagem “Agosto”.

Se a variável MÊS for igual a 9,apresentar a mensagem “Setembro”.

Se a variável MÊS for igual a 10, apresentar a mensagem “Outubro”.

Se a variável MÊS for igual a 11, apresentar a mensagem “Novembro”.

Se a variável MÊS for igual a 12, apresentar a mensagem “Dezembro”.

Se a variável MÊS for menor que 1 ou maior que 12, apresentar a mensagem
“Valor inválido” (MANZANO, 2012, p. 72).

96
ALGORITMOS

Diagrama de blocos Português estruturado

Início

Mês

S
Mês=1 “Janeiro“

N
S
Mês=2 “Fevereiro“

N
S
Mês=3 “Março“

N
S
Mês=4 “Abril“
N
S
Mês=5 “Maio“

N
S
Mês=6 “Junho“

N
S
Mês=7 “Julho“

N
S
Mês=8 “Agosto“

N
S
Mês=9 “Setembro“

N
S
Mês=10 “Outubro“

N
S
Mês=11 “Novembro“

N
S
Mês=12 “Dezembro“

“Valor inválido”

Fim

Figura 41 – Exemplo da tomada de decisão por seleção (case)

97
Unidade II

A partir dessa representação, é possível implementar o programa na linguagem de programação C.


Veja a seguir o código.

A)

B)

Figura 42 – Implementação do problema apresentado (imagem do programa Dev C++)

98
ALGORITMOS

4.5.2 Laços de repetição

Os laços de repetição são um bloco de instruções que executam um conjunto de instruções. Nos
loops, é possível repetir uma parte específica do programa por um número especificado de tempo
ou até que um determinado número de condições seja satisfeito. Existem três tipos de loops em C:

• while;

• do ... while;

• for.

While

Na estrutura while, a condição de teste pode ser qualquer expressão. Quando queremos repetir
uma instrução, mas não se sabe a quantidade exata de iterações, podemos utilizar essa estrutura
para realizar as devidas validações.

Aqui, a primeira condição é verificada e, caso a validação seja verdadeira, o corpo do loop é
executado; caso contrário, se a condição for falsa, o controle sairá do loop.

Sintaxe:

while (condição / teste) {


//Declaração 1;
//Declaração 2;
}

99
Unidade II

Exemplo de aplicação:

A)

B)

Figura 43 – Exemplo da estrutura de repetição: while (imagem do programa Dev C++)

A título de ilustração de uso do laço com controle condicional pré-teste verdadeiro em um


contexto operacional, considere os problemas a seguir, observando detalhadamente as etapas de
ação de um programador de computador: entendimento, diagramação e codificação. Os programas
demonstram os laços nas formas iterativa e interativa.

100
ALGORITMOS

Exemplo com laço iterativo

Elaborar um programa que efetue a entrada de um valor numérico inteiro qualquer. Em seguida,
processar o cálculo do valor de entrada, multiplicando-o por 3 e apresentando seu resultado.
Proceder à execução dos passos anteriores cinco vezes (MANZANO, 2019).

Início

I←1

N
I <= 5
S
N

R←N⊗3

I←I+1

Fim

Figura 44 – Exemplo da instrução enquanto...faça/fim_enquanto iterativa

A partir dessa representação, é possível implementar o programa na linguagem de programação C.


Veja o código a seguir.

101
Unidade II

A)

B)

Figura 45 – Implementação do problema apresentado (imagem do programa Dev C++)

Com relação a tal tema, comenta Manzano:

No problema exposto, é necessário definir um laço que vai executar a


vontade do usuário. Assim, não há possibilidade de saber quantas vezes o
laço será executado. O número de vezes vai depender da vontade do usuário,
por isso esse tipo de laço chama-se interativo.

Atente para os passos descritos a seguir:

102
ALGORITMOS

1. Criar uma variável de controle para ser utilizada como resposta


(variável RESP).

2. Enquanto o valor da variável RESP for igual a “S”, executar os passos 3 a


5; caso contrário, desviar a execução do programa para o passo 8.

3. Ler um valor inteiro qualquer (variável N).

4. Efetuar a multiplicação do valor de N por 3, colocando o resultado


na variável R.

5. Apresentar o valor calculado que está armazenado na variável R.

6. Perguntar para o usuário se ele deseja continuar a execução do programa.

7. Retornar a execução do programa ao passo 2.

8. Encerrar o programa (MANZANO, 2019, p. 117).

Início

RESP←”S”

N
RESP=”S”

S
N

R←N⊗3

“Deseja
continuar?“

RESP

Fim

Figura 46 – Exemplo da instrução enquanto...faça/fim_enquanto iterativa

103
Unidade II

A partir dessa representação, é possível implementar o programa na linguagem de programação C.


Veja o código a seguir.

A)

B)

Figura 47 – Implementação do problema apresentado (magem do programa Dev C++)

Do ... while

A declaração (do ... while) também é usada para o desenvolvido da estrutura de repetição. O
corpo desse loop pode conter uma única declaração ou um bloco de declaração.

Sintaxe:

do{
//Declaração 1;
//Declaração 2;
} while (condição);

104
ALGORITMOS

A seguir um exemplo da aplicação.

A)

B)

Figura 48 – Exemplo da estrutura de repetição: Do...while (imagem do programa Dev C++)

Manzano esclarece:

O problema é o mesmo exposto anteriormente. A diferença é a forma de


construção da condição e do laço.

Atente para os passos descritos a seguir:

1. Criar uma variável de controle para servir como contador com valor
inicial 1 (variável I).

2. Ler um valor inteiro qualquer (variável N).

3. Efetuar a multiplicação do valor de N por 3, colocando o


resultado na variável R.

105
Unidade II

4. Apresentar o valor calculado que está armazenado na variável R.

5. Acrescentar o valor 1 ao valor existente da variável I, definida no passo 1.

6. Verificar se a variável contador é maior que 5; sendo, executar os passos


2 a 4; caso contrário, desviar o programa para o passo 7.

7. Encerrar a execução do programa. (MANZANO, 2019, p. 123).

Início

I←1

R←N⊗3

I←I+1

N
I>5

S
Fim

Figura 49 – Exemplo de laço repita/até_que iterativa

A partir dessa representação, é possível implementar o programa na linguagem de programação C.


Veja o código a seguir.

106
ALGORITMOS

A)

B)

Figura 50 – Implementação do problema apresentado (imagem do programa Dev C++)

Segundo Manzano:

Por ser um problema semelhante a uma situação já exposta, basta escolher


um laço que vai satisfazer a vontade do usuário do programa. Assim, não é
possível saber quantas vezes o laço será executado. Atente para os passos
descritos a seguir:

1. Criar uma variável de controle para ser utilizada como resposta


(variável RESP).

107
Unidade II

2. Ler um valor inteiro qualquer (variável N).

3. Efetuar a multiplicação do valor de N por 3, colocando o resultado na


variável R.

4. Apresentar o valor calculado que está armazenado na variável R.

5. Perguntar para o usuário se ele deseja continuar o programa.

6. Caso o valor da variável RESP seja diferente de “S”, executar os passos 2 a 4;


caso contrário, ir para o passo 7.

7. Encerrar o programa (MANZANO, 2019, p. 124).

Início

RESP ← “S“

R←N⊗3

“Deseja
continuar?“

RESP

N
RESP <> “S“

S
Fim

Figura 51 – Exemplo de laço repita/até_que iterativa

A partir dessa representação, é possível implementar o programa na linguagem de programação C.


Veja o código a seguir.

108
ALGORITMOS

A)

B)

Figura 52 – Implementação do problema apresentado (imagem do programa Dev C++)

For

Em um programa que utiliza a estrutura de repetição for, geralmente conseguimos definir


o número de iterações que serão executadas no início do programa. O corpo do loop pode ser
composto de uma única instrução ou várias instruções.

Sintaxe:

for (inicialização; validação; incremento/decremento){


//Declaração 1;
//Declaração 2;
}

109
Unidade II

Observe a seguir um exemplo.

A)

B)

Figura 53 – Exemplo da estrutura de repetição: For (imagem do programa Dev C++)

Vejamos o que propõe Manzano:

A título de ilustração de uso do laço incondicional em um contexto


operacional, considere o problema a seguir, observando detalhadamente
as etapas de ação de um programador de computador: entendimento,
diagramação e codificação.

Elaborar um programa que efetue a entrada de um valor numérico inteiro


qualquer. Em, seguida, calcular o valor de entrada, multiplicando-o por 3
e apresentando seu resultado. Proceder à execução dos passos anteriores
cinco vezes (MANZANO, 2019, p. 132).

110
ALGORITMOS

Início

I ← 1, 5, 1

R←N⊗3

Fim

Figura 54 – Exemplo do laço execute/ enquanto_for iterativo

Continuemos seguindo o raciocínio de Manzano:

O problema exposto já é conhecido, mas desta vez sua operação será mais
dinâmica. Atente para os passos descritos a seguir:

1. Definir uma variável do tipo contador (variável I), variando de


1 a 5, de 1 em 1.

2. Ler um valor inteiro qualquer (variável N).

3. Efetuar a multiplicação do valor de N por 3, colocando o resultado na


variável R.

4. Apresentar o valor calculado que está armazenado na variável R.

5. Repetir os passos 2, 3, 4 e 5 até o valor da variável chegar a 5.

6. Encerrar a execução do programa.

O conjunto de instruções subordinadas ao bloco adjacente é executado


entre os comandos para e fim_para, sendo a variável I (variável de controle)
inicializada com valor 1 e incrementada de mais 1 por meio do comando
passo até a variável I atingir o valor 5. Esse tipo de estrutura pode ser
utilizado todas as vezes que houver a necessidade de repetir trechos
finitos, em que se conhecem os valores do laço: inicial, final e incremento
(MANZANO, 2019, p. 133).

111
Unidade II

A partir dessa representação, é possível implementar o programa na linguagem de programação C.


Veja o código a seguir.

A)

B)

Figura 55 – Implementação do problema apresentado (imagem do programa Dev C++)

Resumo

Vimos que a estrutura de dados é uma forma de organizar dados


na memória de um computador, uma maneira específica de armazenar
e organizar dados em um computador para que possam ser usados
com eficiência. Diferentes tipos de estruturas de dados são adequados
para diferentes tipos de aplicativos e, em alguns casos, são altamente
especializados para realizar tarefas específicas.

As estruturas de dados são usadas em quase todos os programas ou


sistemas de software. Estruturas de dados específicas são ingredientes
essenciais de muitos algoritmos eficientes e possibilitam o gerenciamento

112
ALGORITMOS

de enormes quantidades de dados, como grandes bancos de dados e


serviços de indexação de internet.

Observou-se que a utilização de matrizes em programação é bastante


ampla, indo desde o uso direto, quando o programador constrói a estrutura
de dados e faz o seu controle operacional, até o uso indireto, quando o
programador usa um sistema de gerenciamento de banco de dados para
auxiliar a construção e o controle das operações em tabelas de dados.

Geralmente, a instrução do programa na linguagem em C é executada na


ordem em que aparece no programa, mas, às vezes, pode-se usar condições
de tomada de decisão para executar apenas uma parte do programa, a
instrução de controle. A instrução de controle define como o controle é
transferido de uma parte para a outra parte do programa.

Vimos ainda que a instrução if executa um conjunto de comandos apenas


quando a condição dada é verdadeira. Se o corpo da instrução if consistir
em várias afirmações, é necessário utilizar um par de chaves para organizar
a sua validação. Caso a condição seja falsa, o compilador irá executar o
próximo bloco de instruções. Já a estrutura if...else é uma declaração de
controle condicional bidirecional que contém uma condição e duas ações
possíveis. A condição pode ser verdadeira ou falsa, sendo o valor diferente
de zero considerado verdadeiro e zero considerado falso. Se a condição for
verdadeira, então um único ou um bloco de declaração será executado,
caso contrário, outro único ou bloco de declaração será executado.

A instrução switch...case testa o valor de uma variável e a compara com


vários casos. Depois que a correspondência de caso é encontrada, um bloco
de instruções associado a esse caso específico deverá será ser executado.
O valor fornecido pelo usuário é comparado com todos os casos dentro do
bloco da estrutura Switch...Case até que a correspondência seja encontrada.
Se uma correspondência de caso não for encontrada, a instrução padrão
será executada e o controle sairá do bloco.

Encerramos a unidade abordando sobre os laços de repetição que


são um bloco de instruções que executam um conjunto de instruções.
Nos loops é possível repetir uma parte específica do programa por um
número especificado de tempo ou até que um determinado número de
condições seja satisfeito. Existem três tipos de loops de repetição: While,
Do ... While e For.

113
Unidade II

Exercícios

Questão 1. Considere o código em C a seguir e analise as afirmativas.

#include <stdio.h>
void main()
{
int break;
break = 3 + 2;
printf(“%i”, break);
}

I – O código faz a soma de números inteiros dados pelo usuário do programa.

II – O código apresenta erro por utilizar uma palavra reservada como variável.

III – O código apresenta erro na linha em que se faz a saída de dados.

IV – A primeira linha do código usa uma biblioteca com as funções padrão de entrada e de
saída de dados.

É correto o que se afirma apenas em:

A) I e III.

B) II e IV.

C) I e IV.

D) I, III e IV.

E) IV.

Resposta correta: alternativa B.

Análise das afirmativas

I – Afirmativa incorreta.

Justificativa: note que não temos entrada de dados por parte do usuário, o que poderia ocorrer
pela função scanf() se os dados fossem digitados na tela. O programa faz o cálculo a partir dos
números dados no próprio código e retorna, portanto, sempre o mesmo resultado.

114
ALGORITMOS

II – Afirmativa correta.

Justificativa: no código, é usada a variável break, uma palavra reservada da linguagem C que
não pode ser usada para nomear uma variável. O comando break interrompe um bloco de código.

III – Afirmativa incorreta.

Justificativa: a linha que faz a saída de dados é a seguinte:

printf(“%i”, break);

Como primeiro argumento da função, temos o tipo de variável que desejamos usar para
impressão, e %i indica tipo inteiro, que é como a variável foi definida. Como segundo argumento,
temos o nome da variável que deve ser impressa. A sintaxe dessa linha de código está correta.

IV – Afirmativa correta.

Justificativa: a primeira linha do código faz a inclusão da biblioteca stdio.h, que contém
as funções básicas (std) de entrada e saída (io) de dados. Sem incluirmos essa biblioteca, não
poderíamos usar a função printf no código.

Questão 2. Considere o programa em C a seguir e analise as afirmativas.

#include <stdio.h>
#include <stdlib.h>

int main (void)


{
int a, b, c;
b=0;

printf(“Digite dois números inteiros \n”);


scanf(“%i”,&a);
scanf(“%i”,&c);
while (a*b <2)
{ a=a+2;
b=b+2;
c=c+2;
}
printf(“%i”,a*b*c);
}

115
Unidade II

I – O programa usa três variáveis do tipo inteiro, duas com valor fornecido pelo usuário e uma
com valor atribuído no código.

II – O programa não apresenta uma estrutura de repetição.

III – A condição da função while() é a seguinte: o produto do valor contido na variável a quando
multiplicado pelo valor contido na variável b é menor do que 2.

IV – Quando executado o programa, os valores contidos em todas as variáveis são somados de


duas unidades pelo menos uma vez, independentemente dos valores fornecidos pelo usuário.

É correto o que se afirma apenas em:

A) I e II.

B) I, II e III.

C) I e III.

D) II, III e IV.

E) III e IV.

Resposta correta: alternativa A.

Análise das afirmativas

I - Afirmativa correta.

Justificativa: na declaração de variáveis, vemos que o programa tem três variáveis do tipo inteiro.

int a, b, c;

Em seguida, vemos que b tem valor inicial fixo determinado pelo código:

b=0;

Confirmamos que o conteúdo das variáveis a e c são dados pelo usuário do programa por meio
da função de entrada de dados scanf():

scanf(“%i”,&a);
scanf(“%i”,&c);

116
ALGORITMOS

II – Afirmativa correta.

Justificativa: no código, é usada a variável break, e essa é uma palavra reservada da linguagem C,
não podendo ser usada para nomear uma variável. O comando break interrompe um bloco de código.

III – Afirmativa incorreta.

Justificativa: o argumento passado para a função while() é a condição para a permanência no


looping. No caso, temos:

while (a*b <2)

Logo, vemos que a condição de permanência é a seguinte: o produto dos valores contidos nas
variáveis a e b é menor do que 2.

IV – Afirmativa incorreta.

Justificativa: a condição de entrada/permanência na estrutura de repetição é a*b<2. O código


atribui valor zero para b. O valor de a é dado pelo usuário. Logo, independentemente do valor de a,
temos a*b=0, e a condição é satisfeita. Concluímos que a estrutura de repetição é executada pelo
menos uma vez.

117

Você também pode gostar