Você está na página 1de 98

Aplicações Informáticas B | 12.

º ano Deolinda Pacheco · Ricardo Soares · Fernando Marques

A cópia ilegal viola os direitos dos autores.


Os prejudicados somos todos nós.
Oo
1
Introdução à programação
Algoritmia / Programação

1 Algoritmia 3 4 Sub-rotinas 68

1.1 Linguagens naturais e linguagens formais 3 4.1 Funções 68


1.2 Compreender a noção de algoritmo 5 4.2 Variáveis globais e variáveis locais 75
1.3 Elaborar algoritmos simples 7
5 Funções predefinidas da linguagem C 78
1.4 Teste e controlo de erros em algoritmia 9
5.1 A biblioteca-padrão do C string.h 78
2 Programação 12 5.2 Funções matemáticas 83
2.1 Utilizar uma linguagem
de programação imperativa 12 6 Arrays 91

2.2 Tipos de dados em programas 21 6.1 Vetores 91


2.3 Operadores e expressões 29 6.1.1 Operações com vetores 91
6.2 Matrizes 94
3 Estruturas de controlo 41
6.2.1 Operações básicas com matrizes 94
3.1 Estrutura sequencial 41
3.2 Estrutura de decisão ou seleção 43
3.2.1 Estrutura de seleção simples 44
3.2.2 Estrutura de seleção composta 46
3.2.3 Estrutura de seleção encadeada 48
3.2.4 Estrutura de seleção múltipla 51
3.3 Estruturas de repetição ou ciclos 54
3.3.1 Ciclo For (Para) 54
3.3.2 Ciclo While (Enquanto) 59
3.3.3 Ciclo Do… While (Fazer… Enquanto) 63
Introdução à
programação

1 Algoritmia
1.1 Linguagens naturais e linguagens formais
Pode definir-se linguagem como uma forma de comunicação que utiliza símbolos e
determinadas regras para os combinar. A linguagem pode ser natural ou formal.

A linguagem natural é a linguagem falada ou escrita, como, por exemplo, o português,


não tendo sido projetada pelas pessoas. Pode ter diversas interpretações e sofre
transformações naturais ao longo do tempo. Os termos, as regras sintáticas e semân-
ticas utilizados surgem posteriormente com o objetivo de sistematizar e organizar a
linguagem. A sintaxe da linguagem estuda os processos que geram ou combinam as
frases, especificando a sua estrutura interna e o seu funcionamento, enquanto a se-
mântica se ocupa do significado dos vários componentes dessa linguagem quadro 1.1.

quadro 1.1

Linguagem Associação de formas com significado.

Sintaxe Especificação da combinação das formas.

Semântica Especificação dos significados.

Ao contrário das linguagens naturais, as linguagens formais são previamente projeta-


das para determinados fins. A linguagem formal é delineada de modo a evitar equívo-
cos na utilização dos termos, como, por exemplo, a Matemática e as linguagens de
programação de computadores. Ao contrário das linguagens naturais, as formais são
desenvolvidas de modo a evitar a ambiguidade e a redundância. Numa linguagem for-
mal, os termos e as regras sintáticas e semânticas são previamente estabelecidos
antes de a linguagem ser usada quadro 1.2.

quadro 1.2

Não projetada pelas pessoas.


Linguagem natural
Passível de várias interpretações.

Previamente projetada para determinados fins.


Linguagem formal
Evita ambiguidades e redundância.

Um programa de computadores é constituído por uma sucessão de instruções que


permitem especificar ao processador da máquina as ações consecutivas a executar
COD12MD © Porto Editora

sobre um conjunto de dados. Normalmente, estes programas são escritos, isto é, codi-
ficados, com recurso às linguagens de programação. Estas são projetadas para as
aproximar da linguagem humana, isto porque as linguagens-máquina apenas manipu-
lam dados binários, isto é, uma sucessão dos valores lógicos 0 e 1.

3
Introdução à programação

As linguagens de programação apresentam um método normalizado para a elabora-

COD12MD © Porto Editora


ção das instruções dos programas de computadores, fazendo uso do conjunto de re-
gras sintáticas e semânticas da linguagem em causa. Assim, as linguagens de progra-
mação, entendidas pelos computadores, são linguagens construídas, isto é, do tipo
formal quadro 1.3.

quadro 1.3

Sistema de escrita formal constituído por um conjunto de


Linguagem de programação
regras para a escrita de programas de computador.

Programa (código) Conjunto de instruções numa linguagem de programação.

Instrução Especificação ao processador da ação a executar.

Existem milhares de linguagens de programação. O quadro 1.4 apresenta uma classifi-


cação das gerações e alguns exemplos, em função das características de evolução
das linguagens de programação. A primeira geração corresponde às linguagens de
mais baixo nível, a linguagem-máquina, enquanto as de nível superior se aproximam da
compreensão dos seres humanos. Mas cada instrução destas últimas equivale a vá-
rias da linguagem-máquina.

quadro 1.4

Nível Geração Descrição Exemplo

Baixo 1.ª Linguagem diretamente executável pelo processador do Linguagem-máquina


computador. Usa apenas os valores 0 e 1. ou binária

2.ª Linguagem de baixo nível que utiliza uma notação Linguagem


simbólica compreensível pelo ser humano com uma Assembly
correspondência direta com o código de uma
determinada máquina. Necessita de um assembler para
traduzi-la em linguagem-máquina.

Alto 3.ª Primeiras linguagens de alto nível projetadas para serem Fortran, ALGOL,
facilmente entendidas e escritas pelo ser humano. A COBOL, BASIC,
partir desta geração, as linguagens necessitam de Visual Basic, C, C++,
compiladores ou interpretadores para as traduzir para a C#, Pascal, Python
linguagem-máquina. e Java

4.ª Linguagens capazes de gerar código por si sós. A MATLAB, SQL,


principal diferença entre as linguagens de 3.ª e 4.ª Clipper, DBase
geração é que as primeiras descrevem passo a passo
como fazer algo, enquanto as últimas especificam o que
deve ser feito, estando mais voltadas para o resultado
final. Desta forma, as linguagens de 4.ª geração
dispensam o conhecimento profundo das funções de
programação.

5.ª Linguagens "inteligentes" tendem a uma maior LISP, Prolog, OPS5,


aproximação entre a linguagem natural e a linguagem de Mercury
programação.
Os utilizadores comunicam na sua linguagem nativa, não
necessitando de seguir a sintaxe do programa. A
linguagem deduz, infere e tira conclusões, apoiando-se
na informação contida em bases de conhecimento.

4
Algoritmia

Exercícios de aplicação 1
1‌ Assinale a opção correta nas questões seguintes.

1.1 O que distingue as linguagens naturais das linguagens formais?


(A) As linguagens naturais podem ser projetadas, enquanto as linguagens
formais não podem ser projetadas pelas pessoas.
(B) Ao contrário das linguagens naturais, as formais são desenvolvidas de forma
a evitar a ambiguidade e a redundância.
(C) Não existem diferenças entre as linguagens naturais e formais.
(D) A estrutura, a sintaxe e a semântica das linguagens naturais são previamente
estabelecidas.

1.2 Qual é a diferença entre uma linguagem de programação de alto nível e uma
linguagem de programação de baixo nível?
(A) É de alto nível quando se aproxima da linguagem máquina e é de baixo nível
quando se aproxima da compreensão dos seres humanos.
(B) É de alto nível quando se afasta da linguagem natural e é de baixo nível
quando se aproxima desta.
(C) É de alto nível quando se aproxima da compreensão dos seres humanos e é
de baixo nível quando se aproxima da linguagem máquina.
(D) Ambas as linguagens são diretamente executáveis pelo processador do
computador.

1.2 Compreender a noção de algoritmo


Uma linguagem de programação tem como objetivo expressar um processo que, com
o auxílio de um computador, tende a resolver um problema. Para resolver o problema,
é preciso criar um programa numa linguagem escolhida. No entanto, para efetuar a
passagem do problema para o programa, convém elaborar um algoritmo que possibi-
lite a compreensão e a descrição do problema e que seja de fácil conversão para qual-
quer linguagem de programação. Sendo assim, um algoritmo é uma sequência finita de
instruções descritas de forma lógica, ordenada, clara e precisa a fim de resolver o
problema quadro 1.5.

quadro 1.5

Problema O que se pretende resolver.

Sequência finita de instruções descritas de forma lógica,


Algoritmo
ordenada, clara e precisa a fim de resolver o problema.
COD12MD © Porto Editora

Programa Algoritmo codificado numa linguagem de programação.

5
Introdução à programação

Um algoritmo pode ser escrito com o auxílio de uma linguagem natural, utilizando ex-

COD12MD © Porto Editora


pressões precisas, mas existem outros modos de especificação, nomeadamente o flu-
xograma e o pseudocódigo. No primeiro caso, utiliza-se uma representação gráfica e,
no segundo, uma representação textual (português estruturado).

Os fluxogramas utilizam símbolos gráficos para representar o fluxo das ações neces-
sárias para resolver um problema, tal como está apresentado no quadro 1.6.

quadro 1.6

Início ou fim do algoritmo Conexão

Entrada ou saída de dados Linha de fluxo

Processo/Operação Sub-rotina

Decisão/Comparação

Os pseudocódigos utilizam uma representação textual (narrativa) constituída por pala-


vras da linguagem natural e pela sintaxe característica das linguagens de programa-
ção estruturada. Não existe uma notação standard do pseudocódigo, mas o quadro 1.7
apresenta alguns elementos presentes numa linguagem de programação estruturada
e que servem de base também às notações do pseudocódigo.

quadro 1.7

Estrutura Elemento

Dados Variáveis
Constantes

Tipos de dados Numéricos, lógicos, caracteres, cadeia de caracteres e estruturados

Operadores Aritméticos
Relacionais
Lógicos
De cadeia de caracteres

Instruções básicas Atribuição


De entrada
De saída

Estruturas de controlo Sequencial


Decisão ou seleção
Repetição ou de ciclos

6
Algoritmia

1.3 Elaborar algoritmos simples


A utilização de um fluxograma torna-se mais difícil de concretizar no caso de algorit-
mos extensos. Nestes casos, torna-se mais prático utilizar o pseudocódigo para estru-
turar o raciocínio no desenvolvimento de um algoritmo e para o converter mais facil-
mente num programa, utilizando uma linguagem de programação.

Para construir um algoritmo, é necessário:

1
Compreender
o problema

2
(o que se pretende).
Identificar os dados de entrada
(os dados fornecidos
e a sua situação inicial)

3
Identificar os dados de saída
(os dados resultantes
do processamento).

Identificar as operações

4
de processamento
(os cálculos e as restrições para
a obtenção dos dados de saída
a partir dos dados de entrada).

Elaborar o algoritmo, utilizando:

5
• as variáveis necessárias
para armazenar as entradas
e efetuar o processamento;

6
• as instruções necessárias,
permitindo realizar a entrada
Testar o algoritmo.
de dados, o processamento
e a saída do resultado.
COD12MD © Porto Editora

A soma de dois números é exemplificada no quadro 1.8, com a apresentação das dife-
rentes formas de descrever a resolução do problema, tendo em vista a elaboração de
um programa de computador. Neste exemplo, e nas situações que se seguem, os pro-
gramas são apresentados na linguagem de programação C.

7
Introdução à programação

quadro 1.8

COD12MD © Porto Editora


Linguagem natural

1. Início.
2. Ler dois valores inteiros (n1, n2).
3. Efetuar o cálculo da soma dos dois valores inteiros (s=n1+n2).
4. Escrever o resultado da soma (s).
5. Fim.

Fluxograma Pseudocódigo

Início
Algoritmo soma;
Variáveis n1,n2,s: inteiro;
Início
Escrever ("Digite um número inteiro") Escrever("Digite um número inteiro");
Ler(n1);
Ler (n1) Escrever("Digite outro número inteiro");
Ler(n2);
Escrever ("Digite outro número inteiro")
s←n1+n2;
Escrever("Soma = ",s);
Fim.
Ler (n2)

s ← n1 + n2

Escrever ("Soma = ",s)

Fim

Código em linguagem de programação C Resultado (Output)

#include <stdio.h> Digite um número inteiro


int main(void) 11
{ Digite outro número inteiro
int n1,n2,s; 13
printf("Digite um número inteiro "); Soma = 24
scanf("%d",&n1);
printf("Digite outro número inteiro ");
scanf("%d",&n2);
s=n1+n2;
printf("Soma = %d",s);
return(0);
}

O resultado (output) apresentado ocorre considerando os dados indicados.

De realçar que no algoritmo (pseudocódigo/fluxograma), tal como apresentado do


quadro 1.8, é utilizado o símbolo ← para representar a atribuição de valores e as instru-
ções Ler e Escrever para a entrada de dados (input) e a saída de dados (output).
No pseudocódigo, de acordo com os dados que as variáveis podem assumir, estas,
podem ser definidas com o tipo de dados: Inteiro, conjunto de números inteiros sem
casas decimais; Real, conjunto de números com casas decimais; Texto, carácter ou
conjunto de caracteres e Lógico, Verdadeiro ou Falso.

8
Algoritmia

1.4 Teste e controlo de erros em algoritmia


O teste e o controlo de erros num algoritmo permitem verificar se este resolve o pro-
blema pretendido. Para isso, utiliza-se a técnica do tracing (traçagem), que permite
acompanhar passo a passo a execução de um algoritmo, eliminando, desta forma, a
possibilidade de ocorrência de erros.

O tracing consiste, assim, em testar um algoritmo com valores de entrada, observando


o comportamento interno ao longo dos vários passos que compõem o algoritmo.

Na implementação desta técnica, começa-se por criar uma tabela quadro 1.9. De se-
guida, coloca-se na primeira linha as variáveis e as operações que se pretendem tes-
tar. Depois, enumeram-se os passos na primeira coluna. Por último, preenche-se a ta-
bela passo a passo, atribuindo valores às variáveis e executando as operações
presentes no algoritmo.

O quadro 1.9 apresenta o exemplo de um algoritmo e a respetiva traçagem, conside-


rando os dados de entrada n1=4 e n2=5.

quadro 1.9

Algoritmo soma; n1 n2 s←n1+ n2 Saída

Variáveis n1, n2, s : inteiro;


1.º passo 4
Início
Escrever("Digite um número inteiro");
2.º passo 4 5
Ler(n1);
Escrever("Digite outro número inteiro");
Ler(n2); 3.º passo 4 5 9
s ← n1+n2;
Escrever ("Soma = ",s);
Fim. 4.º passo 4 5 9 Soma = 9

Exercícios de aplicação 2
1‌ Selecione a opção correta nas seguintes questões:

1.1 Assinale a alínea que corresponde ao conceito de algoritmo.


(A) É um conjunto de instruções escritas com a ajuda de uma linguagem natural,
mas que não necessita de expressões precisas.
(B) É uma sequência de instruções que devem ser exatamente seguidas passo
a passo para resolver um determinado problema.
(C) É um conjunto de instruções codificadas numa linguagem de programação.
(D) É um conjunto de instruções que são descritas aleatoriamente para
COD12MD © Porto Editora

compreender um determinado problema.

9
Introdução à programação

COD12MD © Porto Editora


1.2 Complete a seguinte afirmação: "O __________ é uma representação textual
(narrativa), de alto nível, de um algoritmo que apresenta alguns elementos de
uma linguagem de programação estruturada, destinando-se à compreensão
humana.
(A) pseudocódigo
(B) algoritmo
(C) fluxograma
(D) programa

1.3 1.3 Defina o conceito de fluxograma.


(A) É uma linguagem de programação formal.
(B) É uma linguagem de programação natural.
(C) É uma representação textual de um algoritmo.
(D) É uma representação gráfica de um algoritmo.

2‌ Crie um algoritmo em linguagem natural que apresente as etapas necessárias


para concretizar as seguintes atividades do dia a dia:
a) Efetuar um levantamento de dinheiro no multibanco.
b) Mudar um pneu.

3‌ Crie um algoritmo em linguagem natural com as etapas necessárias para a


criação de um programa que efetue a leitura do seu primeiro nome e idade,
mostrando estes dados de acordo com o apresentado no seguinte exemplo:
"O João tem 17 anos."

4‌ Apresente o algoritmo do exercício anterior sob a forma de pseudocódigo e


fluxograma.

5‌ Considere o algoritmo seguinte:


Algoritmo troca_valores
Variáveis a, b, c: lógico;
Início
a ← true;
b ← false;
c ← a;
a ← b;
b ← c;
Escrever (a, b);
Fim
a) Apresente o algoritmo anterior sob a forma de fluxograma.
b) Efetue a traçagem deste algoritmo.

10
Algoritmia

6‌ Crie um algoritmo em linguagem natural para cada uma das situações seguintes:
a) efetue a leitura de um número inteiro e apresente os dois números inteiros
consecutivos de valor superior.
b) efetue a leitura de uma medida em metros e apresente em decímetros,
centímetros e milímetros;
c) efetue a leitura de dois números inteiros e apresente o resultado da diferença do
primeiro pelo segundo.
d) efetue a leitura de um número real e apresente o resultado do cálculo de 10%
deste.
e) efetue a leitura de um número real e apresente o dobro deste.

7‌ Apresente os algoritmos do exercício anterior sob a forma de pseudocódigo e


fluxograma.

8‌ Crie a traçagem do seguinte algoritmo, considerando o seguinte valor de entrada


n1=2.
Algoritmo exemplo;
variáveis n1, n2, n3: inteiro;
Início
Escrever("Indique um número inteiro");
Ler(n1);
n2 ← 2 + n1;
n3 ← n1 + n2;
n1 ← 2 * n3 + 2 * n2;
n2 ← n1 − 10;
Escrever (n1, n2, n3);
Fim.

9‌ Considere o cálculo da quantia total a receber por uma empresa de aluguer de


veículos ligeiros de passageiros. Sabendo que o valor a receber é de 10€ por dia
e de 0,60€ por quilómetro percorrido, acrescentando o valor correspondente à
taxa de IVA de 23%, calculado sobre o valor total a receber. O número mínimo de
dias de aluguer aceite é um dia.
O algoritmo deverá ser criado prevendo a apresentação das seguintes
mensagens, a serem apresentadas durante a execução do respetivo programa.
Digite o número de dias:
Digite o número de Km:
Quantia total a receber:
COD12MD © Porto Editora

11
Introdução à
programação

2 Programação
2.1 Utilizar uma linguagem de programação imperativa
O computador é uma máquina constituída por hardware e software que tem a capaci-

COD12MD © Porto Editora


dade de receber, armazenar e fornecer dados, depois de processados de forma auto-
mática, rápida e precisa quadro 2.1.

quadro 2.1

Hardware Conjunto de componentes físicos.

Software Conjunto de instruções (programas) que fazem funcionar o hardware.

O trabalho realizado por um computador é baseado em operações que envolvem os


seguintes componentes físicos:

▪ processador (CPU – Central Processing Unit), que manipula os dados e utiliza


as instruções, ambos armazenados na memória principal;
▪ memória principal, como a RAM, que armazena os dados e as instruções de
um programa;
▪ entradas e saídas que controlam e executam as operações de leitura e de
escrita da informação através dos periféricos que englobam os dispositivos:
– auxiliares de armazenamento de software e dados, como, por exemplo, as
unidades de discos;
– de saída, como, por exemplo, a impressora e o monitor;
– de entrada, como, por exemplo, o rato e o teclado.

O funcionamento e a gestão dos diferentes componentes do hardware de um compu-


tador, assim como a gestão dos processos (programas) em execução, dependem do
sistema operativo. Este consegue, assim, estabelecer a ligação entre o hardware e as
operações desencadeadas ao nível do software de aplicação.

Por outro lado, quando se programa na linguagem C para a criação de um programa,


diferentes etapas têm de ser percorridas até à sua execução. Como é uma linguagem
de alto nível, é necessário utilizar software de aplicação para a sua criação e, depois,
com a ajuda do sistema operativo e de outros programas, transformar o código criado
pelo programador por outro, que seja executável pelo computador.

A figura 2.1 ilustra, de uma forma simplificada, um esquema sequencial do desenvolvi-


mento de um programa em C num computador e o quadro 2.2 resume as diferentes
etapas desse desenvolvimento.

12
Programação

Utilizador

Aplicação Editor

Código Fonte (.c)

Pré-Processador

Compilador
Software

Sistema Assembler
operativo

Livrarias
Linker
externas

Loader
Hardware

Disco Processador RAM Entrada/Saída

Barramento do sistema
COD12MD © Porto Editora

figura 2.1 Esquema representativo da interligação do hardware com o software e as diferentes etapas de
desenvolvimento de um programa em C.

13
Introdução à programação

quadro 2.2

COD12MD © Porto Editora


Tipo de
Tipo de Tipo de
ficheiro Descrição do processo
software programa
de código
Aplicação Editor Fonte O editor é um programa que permite criar e modificar
o texto do ficheiro que contém as instruções do
programa. Este ficheiro, guardado em disco, contém
o código-fonte.
Sistema Pré-processador Expandido O pré-processador prepara o código-fonte para o
operativo compilador, efetuando ajustes de acordo com as
diretivas do pré-processador identificadas por #
(Sharp).
Compilador Objeto O compilador recebe o código-fonte expandido e
efetua a sua compilação, criando um ficheiro que
contém o código-fonte assembly.
Assembler Assembly O assembler transforma o código-fonte assembly no
código binário correspondente (código-máquina),
criando um ficheiro com o código-objeto.
Linker Executável O linker tem a função de juntar ao código-objeto os
vários módulos em falta constituintes do código-
fonte, criando e gravando em disco um único ficheiro
completo de código executável. Geralmente, estes
módulos fazem referência a funções do sistema
operativo, como, por exemplo, operações que
envolvem a entrada ou saída de dados, através do
teclado ou do monitor, ou a subprogramas que
controlam operações mais complexas. Estas últimas
são denominadas livrarias.
Loader Máquina O loader tem como função carregar na memória
principal o anterior código binário executável. Este
código é muitas vezes denominado código-máquina,
por estar codificado num formato associado a um
determinado processador que vai executar o programa.

A linguagem C foi criada em 1972, por Brian Kernighan e Dennis Ritchie, nos Estados
Unidos, na empresa AT&T Bell Labs. A origem e a designação desta linguagem ficaram
a dever-se à evolução da linguagem B, tendo sido ambas desenvolvidas pela mesma
empresa. Foi utilizada, inicialmente, no desenvolvimento do sistema operativo UNIX e,
posteriormente, no desenvolvimento, por exemplo: do sistema operativo Linux; da lin-
guagem de script PHP; do sistema de gestão de bases de dados MySQL; etc.

Ao longo do tempo, a linguagem C, tem vindo a ser revista e atualizada, inicialmente,


pela ANSI – American National Standards Institute e, também, posteriormente, pelo
comité técnico conjunto da ISO/IEC – International Organization for Standardiza-
tion / International Electrotechnical Commission, originando a definição de um con-
junto de padrões, como, por exemplo:

▪ ISO/IEC 9899:2011 INFORMATION TECHNOLOGY — PROGRAMMING


LANGUAGES — C;
▪ ISO/IEC 9899:2018 INFORMATION TECHNOLOGY — PROGRAMMING
LANGUAGES — C.

14
Programação

Na criação de programas em C é necessária a utilização de software de aplicação


disponibilizado online, ou ser previamente instalado no computador, do tipo editor
de código-fonte ou IDE (Integrated Development Environment). Para a criação de
programas na linguagem C, são apresentadas no quadro 2.3 as principais aplicações
disponibilizadas online e no quadro 2.4 as principais aplicações de instalação prévia
no computador.

quadro 2.3

Aplicação online OnlineGDB Descrição

IDE, que permite a escrita,


execução e depuração de
código em várias linguagens de
programação, como por
exemplo Python, Java, Perl,
Ruby, PHP, C++ e C.

Endereço

https://www.onlinegdb.com

Aplicação online ONLINE CPP Descrição

IDE, que permite a escrita com


reconhecimento automático da
sintaxe, a execução e a
depuração de código nas
linguagens C++ e C.

Endereço

https://www.online-cpp.com/
COD12MD © Porto Editora

15
Introdução à programação

COD12MD © Porto Editora


Aplicação online OneCompiler Descrição

IDE, que permite a escrita com


reconhecimento automático da
sintaxe, a execução e a
depuração de código em várias
linguagens, como por exemplo
Perl, PHP, C++, C# e C.

Endereço

https://onecompiler.com/c

Aplicação online jdoodle Descrição

IDE, destinado ao ensino,


desenvolvimento, avaliação e
colaboração. Permite a escrita,
depuração e compilação de
código em várias linguagens,
como por exemplo em C.

Endereço

https://www.jdoodle.com/
c-online-compiler/

Aplicação online Replit Descrição

IDE, destinado a escrita,


execução, depuração e
compilação de código em várias
linguagens de programação,
como por exemplo Python, Java,
VB, Ruby, PHP, C#, C++ e C.

Endereço

https://replit.com/~

16
Programação

quadro 2.4

Aplicação Notepad++ Descrição

Editor de código fonte com


inúmeros recursos e escrita com
reconhecimento automático da
sintaxe. Suporta várias linguagens
de programação, como por
exemplo Java, Python, Ruby,
JavaScript, CSS, C++, C# e o C.

Endereço

https://notepad-plus-plus.org/
downloads/

Aplicação CodeBlocks Descrição

IDE, do tipo Open Source,


funciona em várias plataformas,
como por exemplo Linux, Mac e
Windows. Suporta a escrita,
depuração e compilação de
código em várias linguagens de
programação, como por exemplo
Fortran, Java, Python, Ruby, C++
e o C.

Endereço

https://www.codeblocks.org/
downloads/

Aplicação Visual Studio Code Descrição

Editor de código fonte, podendo


ser configurado para a execução,
depuração e compilação de
programas. Funciona em várias
plataformas, como por exemplo
Linux, Mac e Windows. Suporta
várias linguagens de
programação, como por exemplo
JavaScript, CSS, TypeScript, C#
e o C.
COD12MD © Porto Editora

Endereço

https://code.visualstudio.com/

17
Introdução à programação

COD12MD © Porto Editora


Aplicação Dev-C++ Descrição

IDE, que permite a criação de


programas nas linguagens C e
C++.

Endereço

https://bloodshed-dev-c.
en.softonic.com/

Aplicação Eclipse Descrição

IDE, que permite a criação de


programas em diversas
linguagens de programação,
como por exemplo Java, C, C++,
Python, PHP, Ruby, JavaScript,
HTML, CSS.

Endereço

https://www.eclipse.org/

De salientar que, na criação dos programas, em linguagem C, apresentados neste ma-


nual foi utilizado o IDE OnlineGDB, disponibilizado online.
Depois dos conceitos introdutórios anteriores, convém perceber a estrutura de escrita
do ficheiro de código-fonte de um programa em linguagem C. Observando o quadro 2.5,
fazem parte da estrutura do programa os seguintes elementos:
▪ diretivas de inclusão, #include, que permitem fazer referência ao conjunto de
bibliotecas a serem incorporadas no programa;
▪ funções, constantes e variáveis globais, que são declaradas a seguir às
diretivas de inclusão;
▪ função main(), obrigatória num programa em C, sendo por esta que começa a
execução de um programa;
▪ constantes e variáveis locais, são declaradas dentro das funções, main() ou
outras;
▪ instruções do programa dentro das funções, main() ou outras.

18
Programação

quadro 2.5

Estrutura genérica Exemplo

diretivas #include <stdio.h>


…/declarações de funções /*Cálculo da soma de dois valores inteiros,
indicados pela utilizador*/
declaração de constantes globais;
int main(void)
declaração de variáveis globais; {
tipo_dado main(parametros) //declaração das variáveis
{ int a,b,soma;
declaração de constantes locais; //leitura de dois valores inteiros
printf("Indique um número inteiro ");
declaração de variáveis locais;
scanf("%d",&a);
comentários; printf("Indique outro número inteiro ");
… scanf("%d",&b);
instruções; /*soma dos valores das variáveis a+b sendo o
… resultado atribuído à variável soma*/
soma=a+b;
}
//escrita do resultado (no ecrã)
printf("Soma de %d com %d = %d",a,b,soma);
return 0;
}

Resultado (Output)
Indique um número inteiro 17
Indique outro número inteiro 13
Soma de 17 com 13 = 30

Neste exemplo quadro 2.5, o programa começa com a diretiva de inclusão "#include",
fazendo referência à biblioteca <stdio.h>. De seguida, na função main() são escritas as
declarações das variáveis e as instruções a executar, delimitadas pelas chavetas { }. Em
C, utiliza-se o ponto e vírgula (;) no fim de cada linha de instrução. A execução da função
main() termina com a instrução return 0.

São apresentados comentários, definidos por linhas de texto assinaladas no início por
//, podendo também ser delimitadas por /*… */, resultando, respetivamente, na defini-
ção de uma linha isolada de comentário ou num conjunto de linhas de comentário.
Estas linhas são ignoradas pelo compilador e são incorporadas nos programas pelos
programadores, com o objetivo de explicar determinados aspetos do código, permi-
tindo uma compreensão mais rápida deste.

Exercícios de aplicação 3
1‌ Defina o conceito de programa de computador.
(A) É uma sequência de instruções codificadas numa linguagem de programação.
(B) É uma representação gráfica de um algoritmo.
(C) É um conjunto de operações executadas numa linguagem de programação.
(D) É uma representação de um algoritmo numa linguagem natural.
COD12MD © Porto Editora

19
Introdução à programação

COD12MD © Porto Editora


2‌ Identifique o tipo de código associado a cada uma das afirmações seguintes.
a) São as instruções de um programa guardadas num ficheiro.
b) Código gerado pelo compilador.
c) Código ao qual podem ser adicionados módulos de livrarias externas do
sistema operativo.
d) Código executado diretamente pelo processador.
e) Prepara o código fonte para o processador.

3‌ No âmbito da linguagem C, classifique em verdadeiras ou falsas as seguintes


afirmações:
(A) Os comentários são linhas ignoradas pelo compilador.
(B) Para definir apenas uma linha de comentário, utiliza-se o símbolo *.
(C) As instruções de entrada servem para ler dados internos do programa.
(D) É utilizada a função input(), para a leitura de dados.
(E) As instruções de saída servem para escrever dados para o exterior do programa.

4‌ Indique o símbolo que permite definir um comentário com apenas uma linha na
linguagem C.
(A) :
(B) /*
(C) //
(D) */

Bibliotecas-padrão da linguagem C
As bibliotecas-padrão da linguagem C estão divididas pelas suas diferentes funcionalida-
des e são identificadas por nomes sugestivos terminados pela extensão '.h'. Disponibili-
zam macros, definições de tipo de dado e de funções, permitindo simplificar a realização
de inúmeras operações, como, por exemplo: cálculos matemáticos, manipulação de ca-
deias de caracteres, operações de Input/Output, etc. As bibliotecas podem ser incorpora-
das no início dos programas, através da diretiva do pré-processador #include<nome_bi-
blioteca.h>.

Esta funcionalidade permite, também, ao programador, o desenvolvimento das suas


próprias bibliotecas, evitando, assim, a necessidade de repetir partes extensas de có-
digo em cada programa.

No quadro 2.6, apresentam-se as bibliotecas-padrão mais comuns da linguagem C.

quadro 2.6

Bibliotecas-padrão Descrição

stdio.h Define um conjunto de funções relativas a operações de entrada/saída.

math.h Define um conjunto de funções matemáticas.

Define um conjunto de funções para conversão, alocação de memória e


stdlib.h
tarefas similares.

Define um conjunto de constantes que limitam o tamanho mínimo e máximo


limits.h
dos diferentes tipos de dados.

20
Programação

Bibliotecas-padrão Descrição

float.h Define um conjunto de funções para a determinação do tamanho dos tipos reais.

stdint.h Define um conjunto de tipos de inteiros com tamanhos diferentes.

string.h Define um conjunto de funções para manipulação de strings.

time.h Define um conjunto de funções de manipulação do tempo.

Permite a utilização do tipo de dado bool, em que True corresponde a 1 e


stdbool.h
False corresponde a 0.

ctype.h Define um conjunto de funções para a manipulação de caracteres.

Palavras reservadas da linguagem C


A linguagem C tem um conjunto de palavras reservadas que não podem ser utilizadas
como identificadores de constantes, variáveis e funções, entre outras.

No quadro 2.7 são apresentadas as palavras reservadas da linguagem C.

quadro 2.7

auto default float long sizeof unsigned _Atomic _Static_assert

break do for register static void _Bool _thread_local

case double goto restrict struct volatile _Complex

char else if return switch while _Generic

const enum inline short typedef _Alignas _Imaginary

continue extern int signed union _Alignof _Noreturn

2.2 Tipos de dados em programas


Variáveis e constantes
As variáveis são identificadores que designam valores que podem variar ao longo da
execução do programa. Associado a cada uma das variáveis é reservado um espaço
em memória de acordo com o seu tipo de dado.

Na linguagem C, as variáveis podem ser declaradas em qualquer parte do programa,


contudo, só são reconhecidas para utilização após a sua declaração.

Para declarar uma variável na linguagem C, é necessário especificar, primeiro, o tipo de


dado e, simultaneamente, pode ser atribuído um valor à variável. O quadro 2.8, apre-
senta a sintaxe e o respetivo exemplo da declaração de variáveis.

quadro 2.8

Sintaxe tipo_de_dado id1 <, id2, id3,… >;


COD12MD © Porto Editora

int soma, num1;


float peso = 70;
Exemplo
char cod_artigo[3] = "A13";
char nome[10];

21
Introdução à programação

As constantes são identificadores para designar valores que não variam ao longo

COD12MD © Porto Editora


da execução do programa. As constantes podem ser declaradas como macros,
através da diretiva do pré-processador #define ou através da instrução const. Se
definidas como macro, o pré-processador substitui o identificador pelo seu valor;
se definidas como const, será reservado espaço em memória de acordo com o
tipo de dado.

O identificador das constantes deve ser definido utilizando apenas letras maiúsculas,
permitindo distingui-las facilmente das variáveis.

O quadro 2.9 apresenta a sintaxe e o respetivo exemplo da declaração de constantes.

quadro 2.9

#define<ID> <valor>
Sintaxe ou
const tipo_de_dado < ID>=<valor>;

#define PI 3.1415926
Exemplo ou
const float PI = 3.1415926;

Identificadores
Os identificadores são designações definidas pelo programador, no código de um pro-
grama, identificando elementos como: constantes, variáveis e funções, entre outros. A
definição dos identificadores deve obedecer às regras seguintes:

▪ o primeiro carácter não pode ser numérico, tendo de ser alfabético (a…z,
A…Z) ou underscore (_);
▪ devem ser únicos, não se podendo repetir num programa;
▪ apenas devem ser compostos por caracteres alfanuméricos (a…z, A…Z e
0…9) e underscore (_);
▪ não podem ser uma palavra reservada da linguagem C;
▪ não podem ter espaços em branco, sendo utilizado o underscore para
interligar as palavras ou o primeiro carácter de cada palavra em maiúscula;
▪ devem ser palavras de fácil leitura, curtas e significativas (relacionadas com o
contexto);
▪ as letras maiúsculas e minúsculas são interpretadas de forma diferente,
sensíveis a maiúsculas e minúsculas, resultando identificadores diferentes
(linguagem C é case sensitive);
▪ os caracteres acentuados, como, por exemplo, ã, é, á, ê, não devem ser
utilizados.

Dados e tipos de dados


Podemos definir dados como elementos sobre os quais serão efetuadas operações.
Estes, de acordo com a sua natureza, podem estar associados a diferentes tipos. Um
determinado tipo de dados está associado a um conjunto de valores, que definem o
formato específico dos elementos desse tipo.

22
Programação

A linguagem C tem disponíveis os tipos de dados básicos: void, bool, int, char, float e
double. Por outro lado, existem ainda outros tipos de dados que são definidos a partir dos
tipos de dados básicos int, double e char, recorrendo à utilização dos modificadores:

▪ signed, com sinal, possibilitando valores negativos, nulo e positivos


(situação-padrão da linguagem C, podendo não ser indicada a palavra
signed);
▪ unsigned, sem sinal, possibilitando apenas valores positivos e nulo;
▪ long, longo, duplica o número de bytes ocupados e o intervalo de valores do
tipo de dado;
▪ short, curto, reduz a metade o número de bytes ocupados e o intervalo de
valores do tipo de dado.

Os bytes ocupados em memória e o intervalo de valores podem variar, de acordo com


o compilador e a arquitetura do processador, por exemplo 32 ou 64 bits.

O quadro 2.10 apresenta os tipos de dados básicos.

quadro 2.10

Tipos de Bytes
Descrição Intervalo de valores
dados básicos ocupados

void Vazio ou sem valor (utilizado nas funções para 0 −−


a especificação do tipo de retorno e para
indicar sem parâmetros).

int Números inteiros (valores negativos, nulo e 4 −2.147.483.648 a


positivos). 2.147.483.647

float Números reais de precisão simples. 4 −1.7×10−38 a 1.7×10+38

double Números reais de precisão dupla. 8 −3.4×10−308 a 3.4E+308

char Caracteres alfanuméricos, podendo ser 1 −128 a 127


apresentados sob a forma de carácter ou de
valor numérico.

bool Valores lógicos. 1 True, False ou 1, 0

O quadro 2.11 apresenta os tipos de dados modificados mais comuns.

quadro 2.11

Bytes
Tipos de dados Descrição Intervalo de valores
ocupados

unsigned char Caracteres sem sinal 1 0 a 255

unsigned int Números inteiro sem sinal 4 0 a 4.294.967.295

short int Números inteiro curto 2 −32.768 a 32.767

unsigned short int Números inteiro curto sem sinal 2 0 a 65.535


COD12MD © Porto Editora

long int Números inteiro longo 8 −4 294 967 296 a 4 294 967 294

unsigned long int Números inteiro longo sem sinal 8 0 a 264−1

long double Números duplo longo 16 −3.4×10−4932 a 3.4×104932

23
Introdução à programação

COD12MD © Porto Editora


Exercícios de aplicação 4
1‌ Classifique em verdadeiras ou falsas as afirmações seguintes.
(A) As palavras-chave ou reservadas podem ser usadas como nomes de
identificadores.
(B) O tipo de dados está associado a um conjunto de valores e condicionam o
conjunto de operações que podem ser aplicadas sobre esses valores.
(C) As variáveis e as constantes apenas podem ser declaradas como globais.
(D) Os dados do tipo Int são armazenados ocupando em memória 4 bytes.
(E) As strings são identificadas por aspas.

2‌ Classifique em verdadeiras ou falsas as afirmações seguintes.


(A) As bibliotecas podem ser incorporadas no início dos programas.
(B) Na linguagem C o programador pode criar as suas próprias bibliotecas.
(C) Na linguagem C, as variáveis apenas podem ser declaradas no momento em que
são utilizadas.
(D) Uma variável é um identificador.
(E) Os dados do tipo float são armazenados ocupando em memória 2 bytes.

3‌ Indique a que tipo de dados corresponde cada um dos seguintes valores:


a) −15
b) "25 de abril de 1974"
c) True
d) 167
e) 5,05X108

Instruções de entrada e de saída de dados


As instruções de entrada servem para ler dados exteriores ao programa (input), que
são armazenados em variáveis. Na linguagem C é utilizada a função scanf(), para a
leitura de dados formatados a partir do teclado (dispositivo de entrada-padrão). Na
lista de variáveis desta função é utilizado o operador "&" associado à variável, exceto
na leitura de cadeias de caracteres (strings), permitindo colocar os dados na memória
reservada para a variável. Por outro lado, na expressão de controlo são referidos os
especificadores de formato quadro 2.15, a aplicar de acordo com os tipos de dados das
variáveis indicadas, pela sua ordem.

O quadro 2.12 apresenta a sintaxe e os respetivos exemplos de entrada de dados.

quadro 2.12

Sintaxe scanf("expressão de controlo",lista de variáveis);

scanf("%d", &num_alunos);
Exemplo scanf ("%f %f", &classif1, &classif2);
scanf("%s",prim_nome);

24
Programação

As instruções de saída servem para escrever dados para o exterior do programa (out-
put). Na linguagem C é utilizada a função printf(), para a escrita de dados formatados,
no ecrã (dispositivo de saída padrão). A expressão de controlo desta função pode
apresentar texto, caracteres especiais começados pela \ quadro 2.13, e os especifica-
dores de formatos quadro 2.15, a aplicar de acordo com os tipos de dados das variáveis
indicadas, pela sua ordem.

O quadro 2.13 apresenta a sintaxe e os respetivos exemplos de saída de dados.

quadro 2.13

Sintaxe printf("expressão de controlo",lista de variáveis);

printf ("%d e %d é %f\n", a, b, c);


Exemplo printf("Total = %d", valor);
printf("%d", a, b);

O quadro 2.14 apresenta os caracteres especiais mais comuns.

quadro 2.14

Caracteres especiais Descrição Exemplo

\a Gera um sinal sonoro. #include <stdio.h>


//Demonstração caracteres especiais \a
int main(void)
{
printf("Gera um som \a");
return 0;
}

\b Backspace #include <stdio.h>


//Demonstração caracteres especiais \b
int main(void)
{
printf("ABC\b");
return 0;
}

\n Nova linha ou #include <stdio.h>


mudança de linha //Demonstração caracteres especiais \n
int main(void)
{
printf("Linha 1\n");
printf("Linha 2 (Nova linha)");
return 0;
}

\t Tab (tabulação horizontal) #include <stdio.h>


//Demonstração caracteres especiais \t
int main(void)
{
printf("NOME\tTURMA\n");
printf("Rosa\tA12\n");
return 0;
}

\" Colocação de aspas (") #include <stdio.h>


//Demonstração caracteres especiais \"
COD12MD © Porto Editora

int main(void)
{
printf("SIMBOLO \"Underscore\" ");
return 0;
}

25
Introdução à programação

O quadro 2.15 apresenta os principais especificadores de formato de tipos de dados

COD12MD © Porto Editora


utilizados nas funções de entrada e saída.

quadro 2.15

Especificadores
de formato de Descrição Exemplo
tipos de dados

%d Aplicável ao tipo de #include <stdio.h>


dado int (inteiro). //Demonstração do especificador de formato %d
int main(void)
{
int num;
printf("Digite um numero:\n");
scanf("%d",&num);
printf("Numero: %d\n",num);
return 0;
}

%u Aplicável ao tipo de #include <stdio.h>


dado unsigned int //Demonstração do especificador de formato %u
int main(void)
(inteiro sem sinal). {
unsigned int n;
printf("Ler o valor de n: ");
scanf("%u",&n);
printf("Saida do valor n: %u",n);
return 0;
}

%hd Aplicável ao tipo de #include <stdio.h>


dado short int (inteiro //Demonstração do especificador de formato %hd
int main(void)
curto). {
short int num;
printf("Digite um numero: \n");
scanf("%hd",&num);
printf("Numero: %hd\n",num);
return 0;
}

%hu Aplicável ao tipo de #include <stdio.h>


dado unsigned short //Demonstração do especificador de formato %hu
int main(void)
int (inteiro curto sem {
sinal). unsigned short num;
printf("Ler um numero: ");
scanf("%hu",&num);
printf("Saida: %hu",num);
return 0;
}

%ld Aplicável ao tipo de #include <stdio.h>


dado long int (inteiro //Demonstração do especificador de formato %ld
int main(void)
longo). {
long int num;
printf("Digite um numero: \n");
scanf("%ld",&num);
printf("Numero: %ld\n",num);
return 0;
}

%lu Aplicável ao tipo de #include <stdio.h>


dado unsigned long //Demonstração do especificador de formato %lu
int main(void)
int (inteiro longo sem {
sinal). unsigned long int num;
printf("Digite um numero: \n");
scanf("%lu",&num);
printf("Numero: %lu\n",num);
return 0;
}

26
Programação

Especificadores
de formato de Descrição Exemplo
tipos de dados

%f Aplicável ao tipo de #include <stdio.h>


dado float (reais de //Demonstração do especificador de formato %f
int main(void)
precisão simples).
{
float n=25.87530984;
printf("Saida de n: %f",n);
return 0;
}

%lf Aplicável ao tipo de #include <stdio.h>


dado double (reais de //Demonstração do especificador de formato %lf
int main(void)
precisão dupla).
{
double num;
printf("Ler numero: ");
scanf("%lf",&num);
printf("Saida: %lf",num);
return 0;
}

%Lf Aplicável ao tipo de #include <stdio.h>


dado long double //Demonstração do especificador de formato %Lf
int main(void)
(reais longos de
{
precisão dupla). long double num;
printf("Ler numero: ");
scanf("%Lf",&num);
printf("Saida: %Lf",num);
return 0;
}

%e Aplicável aos tipos de #include <stdio.h>


dados float e double, //Demonstração do especificador de formato %e
int main(void)
utilizando notação
{
científica. float num;
printf("Ler numero: ");
scanf("%e",&num);
printf("Saida: %e",num);
return 0;
}

%c Aplicável aos tipos de #include <stdio.h>


dados char e signed //Demonstração do especificador de formato %c
int main(void)
char (carácter e
{
carácter com sinal). char ch;
printf("Insira um caracter: ");
scanf("%c",&ch);
printf("Inseriu o caracter %c\n",ch);
return 0;
}

%s Aplicável às cadeias #include <stdio.h>


de caracteres, na //Demonstração do especificador de formato %s
int main(void)
linguagem C não
{
existe o tipo de dado char ch[20];
string, pelo que as printf("Digite uma palavra: ");
COD12MD © Porto Editora

strings são vetores do scanf("%s",ch);


tipo char (abordados printf("Palavra = %s\n",ch);
return 0;
no ponto 5).
}

27
Introdução à programação

Conversão do tipo de dado


A linguagem C permite efetuar a conversão (ou seja, alteração) do tipo de dado de
variáveis ao longo de um programa. Esta conversão pode ser efetuada de forma implí-

COD12MD © Porto Editora


cita ou explícita.

Na conversão implícita o tipo de dado de uma variável é alterado em resultado de


uma operação efetuada sobre os seus dados. Neste caso, a conversão é automática,
resultando das operações definidas.

O quadro 2.16 apresenta um programa em C, exemplificando a utilização da conversão


implícita do tipo de dado.
quadro 2.16

Exemplo Resultado (Output)


#include <stdio.h> 13
66.000000
int main(void)
{
float n1=66;
int n2=13.5;
printf("%d\n",n2);
printf("%f",n1);
return 0;
}

No programa do quadro 2.16 à variável n1 do tipo de dado float é atribuído um valor


inteiro e à variável n2 do tipo de dado int é atribuído um valor do tipo float. Ao serem
apresentados os valores de n1 e n2, no ecrã, verifica-se que os tipos de dados de
ambos foram alterados de acordo com o tipo de dados das variáveis a que foram
atribuídos.

Por outro lado, na conversão explícita as alterações efetuadas no tipo de dados das
variáveis ocorrem em resultado da indicação, entre parêntesis, do tipo de dado preten-
dido, por exemplo int e float.

O quadro 2.17 apresenta um programa em C, exemplificando a utilização da conversão


explícita do tipo de dado.
quadro 2.17

Exemplo Resultado (Output)


#include <stdio.h> Resultado = 4.500000

int main(void)
{
float divide;
int y=9, x=2;
divide=(float) y/x;
printf("Resultado = %f",divide);
return 0;
}

No programa do quadro 2.17 o tipo de dados da variável y é interpretado como float de


acordo com o indicado na operação de divisão, implicando que esta seja do tipo real e
que o resultado seja apresentado no tipo de dados float.

28
Programação

2.3 Operadores e expressões


Os operadores são elementos matemáticos que atuam sobre os operandos (variáveis

COD12MD © Porto Editora


e constantes) numa determinada expressão. As expressões, por sua vez, são uma
combinação de operandos e operadores que, uma vez resolvidas, resultam num deter-
minado valor.

Operadores aritméticos
Os operadores aritméticos permitem a realização de operações matemáticas com
valores do tipo numérico, cujo resultado é ainda um valor do tipo numérico. O quadro 2.18
apresenta os operadores aritméticos utilizados na linguagem C.

quadro 2.18

Operador Operação

+ Adição – Adiciona dois operandos.

− Subtração – Subtrai o segundo operando ao primeiro.

* Multiplicação – Multiplica ambos os operandos.

/ Divisão – Divide o dividendo pelo divisor.

% Módulo – Resto de divisão inteira.

O operador % (resto da divisão inteira) só pode ser aplicado a valores do tipo inteiro.
Uma operação entre valores inteiros resulta sempre num valor do tipo inteiro.

Por outro lado, uma operação em que pelo menos um dos operandos é real resulta
sempre num valor do tipo real.

O quadro 2.19 apresenta um programa em C, exemplificando a utilização dos operado-


res aritméticos.

quadro 2.19

Programa em C Resultado (Output)


#include <stdio.h> Adição = 5
//Demonstração dos operadores aritméticos Subtração = 1
int main(void) Multiplicação = 6
{ Resto da divisão inteira = 1
int a=3,b=2,c,d; Divisão inteira = 1
float e; Divisão real = 2
c=a+b;
printf("Adição = %d\n", c );
c=a-b;
printf("Subtração = %d\n", c );
c=a*b;
printf("Multiplicação = %d\n", c );
c=a%b;
printf("Resto da divisão inteira = %d\n", c );
c=a/b;
COD12MD © Porto Editora

printf("Divisão inteira = %d\n", c );


e=(float)a/2;
printf("Divisão real = %f\n", e );
return 0;
}

29
Introdução à programação

Operadores de atribuição

COD12MD © Porto Editora


Os operadores de atribuição permitem atribuir valores a uma variável. Estes podem
ser simples, permitindo apenas atribuir valores a uma variável ou compostos, possibili-
tando a realização de uma operação aritmética seguida de atribuição.

O quadro 2.20 apresenta os principais operadores de atribuição.

quadro 2.20

Operador Operação

= Atribuição simples

*= Atribuição de multiplicação

/= Atribuição de divisão

%= Atribuição de módulo

+= Atribuição de adição

−= Atribuição de subtração

O quadro 2.21 apresenta programas em C, exemplificando a utilização dos operadores


de atribuição simples e compostos.

quadro 2.21

Operador

Exemplo

#include <stdio.h>
//Demonstração do operador de atribuição
int main(void)
{
int n;
float m=13.9;
=
n=19;
printf("m = %f, n = %d\n",m,n);
return 0;
}

Resultado (Output)

m = 13.900000, n = 19

Exemplo

#include <stdio.h>
//Demonstração do operador *=
int main(void)
{
int m=4, n=6;
*= n*=m;
printf("Multiplica n por m = %d\n",n);
return 0;
COD12MD © Porto Editora

Resultado (Output)

Multiplica n por m = 24

30
Programação

Operador

COD12MD © Porto Editora


Exemplo

#include <stdio.h>
//Demonstração do operador /=
int main(void)
{
int m=4, n=6;
/= n/=m;
printf("Divisão inteira de n por m = %d\n",n);
return 0;
}

Resultado (Output)

Divisão inteira de n por m = 1

Exemplo

#include <stdio.h>
//Demonstração do operador %=
int main(void)
{
int m=4, n=6;
%= n%=m;
printf("Resto da divisão inteira de n por m = %d\n",n);
return 0;
}

Resultado (Output)

Resto da divisão inteira de n por m = 2

Exemplo

#include <stdio.h>
//Demonstração do operador +=
int main(void)
{
int m=4, n=6;
+= n+=m;
printf("Adiciona n a m = %d\n",n);
return 0;
}

Resultado (Output)

Adiciona n a m = 10

Exemplo

#include <stdio.h>
//Demonstração do operador −=
int main(void)
{
int m=4, n=6;
−= n-=m;
printf("Subtrai n a m = %d\n",n);
return 0;
}
COD12MD © Porto Editora

Resultado (Output)

Subtrai n a m = 2

31
Introdução à programação

Operadores unários

COD12MD © Porto Editora


Os operadores unários têm um único operando.

O quadro 2.22 apresenta os operadores unários mais comuns da linguagem C.

quadro 2.22

Operador

Operação

Mais unário – não altera o sinal e o resultado corresponde ao valor do


operando.

Exemplo

#include <stdio.h>
int main(void)
{
int a = −3;
+ printf("Valor inicial (negativo) = %d\n",a);
a = +3;
printf("Valor final (positivo) = %d\n",a);
return 0;
}

Resultado

Valor inicial (negativo) = −3


Valor final (positivo) = 3

Operação

Menos unário – altera o sinal e o resultado corresponde ao valor negativo


operando.

Exemplo

#include <stdio.h>
int main(void)
{
int a = +3;
− printf("Valor inicial (positivo) = %d\n",a);
a = −3;
printf("Valor final (negativo) = %d\n",a);
return 0;
}

Resultado
COD12MD © Porto Editora

Valor inicial (positivo) = 3


Valor final (negativo) = −3

32
Programação

Operador

COD12MD © Porto Editora


Operação

Incremento, aumenta o valor numérico do operando em um (pré e pós


incremento).

Exemplo

#include <stdio.h>
int main(void)
{
int a=1,b=1;
++
printf("Valores iniciais a = %d e b = %d\n",a,b);
printf("Pos-incremento a++ = %d\n",a++);
printf("Pre-incremento ++b = %d\n",++b);
return 0;
}

Resultado

Valores iniciais a = 1 e b = 1
Pos-incremento a++ = 1
Pre-incremento ++b = 2

Operação

Decremento, diminui o valor numérico do operando em um (pré e pós


decremento).

Exemplo

#include <stdio.h>
int main(void)
{
int a=1,b=1;
−−
printf("Valores iniciais a = %d e b = %d\n",a,b);
printf("Pos-decremento a-− = %d\n",a-−);
printf("Pre-decremento −-b = %d\n",−-b);
return 0;
}

Resultado

Valores iniciais a = 1 e b = 1
Pos-decremento a-− = 1
Pre-decremento −-b = 0

Operação

Devolve o endereço de memória de um operando.

Exemplo

#include <stdio.h>
int main(void)
& {
int num;
printf("Endereco de memoria da variável num = %d",&num);
return 0;
}
COD12MD © Porto Editora

Resultado

Endereco de memoria da variável num = 28447192

33
Introdução à programação

COD12MD © Porto Editora


Operador

Operação

Devolve o tamanho do armazenamento de um operando de uma expressão


ou tipo de dado (em bytes).

Exemplo

#include <stdio.h>
int main(void)
sizeof()
{
printf("Tamanho de um inteiro em bytes: %ld\n",sizeof(int));
return 0;
}

Resultado

Tamanho de um inteiro em bytes: 4

Operadores relacionais
Os operadores relacionais são usados para efetuar comparações entre expressões,
resultando sempre um dos valores lógicos: true (verdadeiro) ou false (falso). O
quadro 2.23 apresenta os operadores relacionais utilizados na linguagem C com os res-
petivos exemplos, em que o resultado pode assumir os valores inteiros de 0 corres-
ponde ao valor lógico de False, e 1 corresponde ao valor lógico de True. A coluna Re-
sultado apresenta o resultado das operações da coluna Exemplo, considerando que
às variáveis a e b são atribuídos os valores 13 e 5, respetivamente.

quadro 2.23

Exemplo
Operador Operação (considerando Resultado
que a = 13 e b = 5)

== igualdade a == b False (0)

!= diferente a != b True (1)

< menor a<b False (0)

> maior a>b True (1)

<= menor ou igual a <= b False (0)


COD12MD © Porto Editora

>= maior ou igual a >= b True (1)

34
Programação

O quadro 2.24 apresenta um programa em C, exemplificando a utilização dos operado-

COD12MD © Porto Editora


res relacionais.

quadro 2.24

Programa em C

#include <stdio.h>
/*Demonstração do funcionamento dos operadores relacionais*/
int main(void)
{
int a=13, b=5;
printf("OPERADORES RELACIONAIS\n");
printf("Considerando a = %d e b = %d (TRUE <=> 1 e FALSE <=> 0)\n",a,b);
printf("a==b = %d\n",a==b);//Operador de igualdade
printf("a!=b = %d\n",a!=b);//Operador diferente
printf("a<b = %d\n",a<b);//Operador menor
printf("a>b = %d\n",a>b);//Operador maior
printf("a<=b = %d\n",a<=b);//Operador menor ou igual
printf("a>=b = %d\n",a>=b);//Operador maior ou igual
return 0;
}

Resultado (Output)

OPERADORES RELACIONAIS
Considerando a = 13 e b = 5 (TRUE <=> 1 e FALSE <=> 0)
a==b = 0
a!=b = 1
a<b = 0
a>b = 1
a<=b = 0
a>=b = 1

Operadores lógicos
Os operadores lógicos realizam operações lógicas, devolvendo sempre um dos valo-
res lógicos: true ou false, de acordo com as tabelas de verdade.

O quadro 2.25 apresenta as tabelas de verdade dos operadores lógicos.

quadro 2.25

Operador a b Resultado

True − False
NOT
False − True

True True True

True False False


AND
False True False

False False False

True True True


COD12MD © Porto Editora

True False True


OR
False True True

False False False

35
Introdução à programação

O quadro 2.26 apresenta os operadores lógicos utilizados na linguagem C, com os res-

COD12MD © Porto Editora


petivos exemplos.

quadro 2.26

Exemplo
Operador Operação (considerando que Resultado
x = 13, y = 5 e z = 2)

AND / E
&& ((x>y) && (y<z)) False (0)
(conjunção)

OR / Ou
|| ((x<>y) || (y<z)) True (1)
(disjunção)

NOT / Não
! ! (x>y) False (0)
(negação)

A coluna Resultado apresenta o resultado das operações da coluna Exemplo, consi-


derando que às variáveis x, y e z são atribuídos os valores 13, 5 e 2, respetivamente. Os
resultados apresentados no quadro 2.26 têm por base os valores das tabelas de ver-
dade de cada operador lógico, apresentadas no quadro 2.25.

O quadro 2.27 apresenta um programa em C, exemplificando a utilização dos operado-


res lógicos.

quadro 2.27

Programa em C

#include <stdio.h>
//Demonstração do funcionamento dos operadores lógicos
int main(void)
{
int x=13, y=5, z=2;
printf("OPERADORES LÓGICOS (&&, ||, !)\n");
printf("Considerando x = %d, y = %d e z = %d (TRUE <=> 1 e FALSE <=> 0)\n",x,y,z);
//Operador de conjunção && (AND)
printf("((x>y)&&(y<z)) = %d\n",((x>y)&&(y<z)));
//Operador de disjunção || (OR))
printf("((x>y)||(y<z)) = %d\n",((x>y)||(y<z)));
//Operador de negação ! (NOT)
printf("!(x>y) = %d\n",!(x>y));
return 0;
}

Resultado (Output)

OPERADORES LÓGICOS (&&; ||, !)


COD12MD © Porto Editora

Considerando x = 13, y = 5 e z = 2 (TRUE <=> 1 e FALSE <=> 0)


((x>y)&&(y<z)) = 0
((x>y)||(y<z)) = 1
!(x>y) = 0

36
Programação

O quadro 2.28 apresenta um programa em C, exemplificando os valores lógicos das ta-

COD12MD © Porto Editora


belas de verdade dos operadores lógicos do quadro 2.25.

quadro 2.28

Programa em C

#include <stdio.h>
#include <stdbool.h>
//Tabelas de Verdade (Operadores lógicos &&, || e !)
int main(void)
{
bool a,b;
printf("Considerando True <=> 1 E FALSE <=> 0\n");
a=true;
printf("TABELA DE VERDADE − OPERADOR LÓGICO ! (NOT))\n");
printf("a=%d e !a=%d\n",a,!a);
a=false;
printf("a=%d e !a=%d\n",a,!a);
printf("TABELA DE VERDADE − OPERADOR LÓGICO && (AND))\n");
a=true;
b=true;
printf("a=%d b=%da&&b=%d\n",a,b,a&&b);
a=true;
b=false;
printf("a=%d b=%da&&b=%d\n",a,b,a&&b);
a=false;
b=true;
printf("a=%d b=%da&&b=%d\n",a,b,a&&b);
a=false;
b=false;
printf("a=%d b=%da&&b=%d\n",a,b,a&&b);
printf("TABELA DE VERDADE − OPERADOR LÓGICO || (OR))\n");
a=true;
b=true;
printf("a=%d b=%da&&b=%d\n",a,b,a||b);
a=true;
b=false;
printf("a=%d b=%da&&b=%d\n",a,b,a||b);
a=false;
b=true;
printf("a=%d b=%da&&b=%d\n",a,b,a||b);
a=false;
b=false;
printf("a=%d b=%da&&b=%d\n",a,b,a||b);
return 0;
}

Resultado (Output)

Considerando True <=> 1 E FALSE <=> 0


TABELA DE VERDADE − OPERADOR LÓGICO ! (NOT))
a=1 e !a=0
a=0 e !a=1
TABELA DE VERDADE − OPERADOR LÓGICO && (AND))
a=1 b=1 a&&b=1
a=1 b=0 a&&b=0
a=0 b=1 a&&b=0
a=0 b=0 a&&b=0
TABELA DE VERDADE − OPERADOR LÓGICO || (OR))
COD12MD © Porto Editora

a=1 b=1 a||b=1


a=1 b=0 a||b=1
a=0 b=1 a||b=1
a=0 b=0 a||b=0

37
Introdução à programação

Prioridade dos operadores

COD12MD © Porto Editora


Em expressões com vários operadores matemáticos, é necessário conhecer as regras
de prioridade para obter os resultados corretos. O quadro 2.29 apresenta as principais
regras de prioridade e de associação utilizadas na linguagem C, que devem ser segui-
das na implementação de um programa, tendo em vista a correta resolução de um
determinado problema.

quadro 2.29

Prioridade Operador Associação

1.ª () Esquerda para direita

2.ª + – ! ++ –– (type) &sizeof Direita para esquerda

3.ª * / % Esquerda para direita

4.ª + – Esquerda para direita

5.ª < > <= >= Esquerda para direita

6.ª == != Esquerda para direita

7.ª && Esquerda para direita

8.ª || Esquerda para direita

9.ª = += −= *= /= %= Direita para esquerda

Os operadores apresentados no quadro 2.29, quando dispostos na mesma linha, ou


seja, com a mesma ordem de prioridade, agrupam-se maioritariamente da esquerda
para a direita.

De salientar que, no segundo nível de prioridade, as operações + e − referem-se, res-


petivamente, a mais unário e a menos unário. Por outro lado, no quarto nível de priori-
dade, as operações + e − referem-se, respetivamente, à soma e à subtração.

O quadro 2.30 exemplifica a aplicação das regras de prioridade dos principais operadores
na resolução de uma expressão e que faz uso de parênteses. De referir que, tal como na
matemática, o uso de parênteses nas expressões, dá prioridade às operações que se
encontram dentro dos parênteses, relativamente a outras que se encontram fora deles.

quadro 2.30

!((6 >= 3) && (5 != 6)) || 10 * 2 > 22

!(True && True) || 10 * 2 > 22

!(True) || 10 * 2 > 22

!(True) || 20 > 22

!(True) || False

False || False

False
COD12MD © Porto Editora

O quadro 2.31 apresenta um programa em C, exemplificando a aplicação das regras de


prioridade dos operadores da expressão apresentada no quadro 2.30.

38
Programação

quadro 2.31

COD12MD © Porto Editora


Programa em C

#include <stdio.h>
int main(void)
{
int c1,c2,c3,c4,c5,c6;
int a1;
printf("Linguagem C − exemplificação da aplicação das regras de prioridade dos
operadores\n");
printf("Determinar o resultado da expressão seguinte:\n");
printf("!((6>=3)&&(5!=6))||10*2>22\n");
c1=6>=3;
c2=5!=6;
printf("= !(%d && %d)||10*2>22\n",c1,c2); //1ª Prioridade −> ()
c3=c1&&c2;
printf("= !(%d)||10*2>22\n",c3); //1ª Prioridade −> ()
c4=!(c3);
printf("= %d||10*2>22\n",c4); // 2ª Prioridade −> !
a1=10*2;
printf("= %d||%d>22\n",c4,a1); //3ª Prioridade −> *
c5=a1>22;
printf("= %d||%d\n",c4,c5); //7ª Prioridade −> ||
c6=c5||c4;
printf("= %d",c6);
return 0;
}

Resultado (Output)

Linguagem C − exemplificação da aplicação das regras de prioridade dos operadores


Determinar o resultado da expressão seguinte:
!((6>=3)&&(5!=6))||10*2>22
= !(1&&1)||10*2>22
= !(1)||10*2>22
= 0||10*2>22
= 0||20>22
= 0||0
= 0

Exercícios de aplicação 5
1‌ Classifique em verdadeiras ou falsas as afirmações seguintes.
(A) A instrução que permite a entrada de dados é a função scanf().
(B) Os operandos são valores que recebem a ação dos operadores.
(C) O operador % pode ser aplicado a valores do tipo float.
(D) Uma operação em que pelo menos um dos operandos é real resulta sempre num
valor do tipo real.
COD12MD © Porto Editora

(E) De acordo com o conceito de prioridade, os operadores adição e subtração são


sempre executados antes dos operadores de multiplicação e divisão.

39
Introdução à programação

COD12MD © Porto Editora


2‌ Indique a função dos especificadores de formatos de tipos de dados utilizados
nas funções de entrada e saída.

Descrição Especificadores
Aplicável ao tipo de dado int.
Aplicável ao tipo de dado float.
Aplicável aos tipos de dado float e double, utilizando notação
científica.
Aplicável ao tipo de dado char e signed char (carácter e
carácter com sinal).
Aplicável ao tipo de dado string (cadeia de caracteres).

3‌ Indique a operação dos seguintes operadores.

Operador Operação
==
!=
&&
||
!

4‌ Determine os valores lógicos de cada uma das seguintes expressões, supondo


que X=10 e Y=2 (apresente os cálculos que permitem chegar aos resultados que
indicar).
a) (X >= 0) && (Y>= 0)
b) (X = 5) || (Y != 8)
c) ! (Y < 4) && ((X != 7) || (Y-X==3))
d) ! ((X < 10) || ((Y < 4) && (Y > 10)))

5‌ Identifique o resultado de cada um dos programas seguintes.

a) b)
#include <stdio.h> #include <stdio.h>
int main(void) int main(void)
{ {
int num; int num;
num=3; num=5;
num*=3; num=num/2;
printf("%d",num); printf("%d",num);
return 0; return 0;
} }

40
Introdução à
programação

3 Estruturas de controlo
As estruturas de controlo avaliam o desenrolar das instruções de um programa.
Estas subdividem-se em estruturas: sequencial, de decisão ou seleção e de repeti-
ção ou de ciclos.

3.1 Estrutura sequencial


Neste tipo de estrutura, as instruções de um programa são executadas numa determi-
nada sequência sem que esta possa sofrer alterações através dos dados de entrada.

No quadro 3.1 é apresentado o exemplo de um algoritmo em pseudocódigo e em fluxo-


grama que calcula o valor total de um produto, utilizando uma estrutura sequencial, e
no quadro 3.3 é apresentado o respetivo programa em linguagem C.

quadro 3.1

Pseudocódigo Fluxograma

Algoritmo Total_produto; Início


Variável quantidade: inteiro;
total, preco: real;
designa: texto; Escrever ("Digite a
Início designação do produto")
Escrever ("Digite a designação do produto");
Ler (designa);
Ler (designa)
Escrever ("Digite a quantidade do produto");
Ler (quantidade);
Escrever ("Digite o preço por unidade do produto"); Escrever ("Digite a
Ler (preco); quantidade de produto")
total ← quantidade * preco;
Escrever ("O valor total do produto ", designa," é ",total);
Fim. Ler (quantidade)

Escrever ("Digite o preço


por unidade de produto")

Ler (preço)

total ← quantidade * produto

Escrever ("O valor total do


COD12MD © Porto Editora

produto", designa, "é ",total)

Fim

41
Introdução à programação

O quadro 3.2 apresenta a traçagem do algoritmo do quadro 3.1, considerando os seguin-

COD12MD © Porto Editora


tes valores de entrada:

▪ designa igual a "Lápis";


▪ quantidade igual a 10;
▪ preco igual a 0.50.
quadro 3.2

designa quantidade preco total←quantidade*preço Saída

1.º passo Lápis

2.º passo Lápis 10

3.º passo Lápis 10 0.50

4.º passo Lápis 10 0.50 5.0

O valor total do produto


5.º passo Lápis 10 0.50 5.0
Lápis é 5.0

O algoritmo e o respetivo programa em C, apresentados nos quadros 3.1 e 3.3, referem-


-se à situação em que o utilizador introduz a designação de um produto, a sua quanti-
dade e o seu preço. De seguida, calcula o valor total do produto inserido. Por último, o
programa apresenta o nome do produto e o respetivo valor total.

quadro 3.3

Programa
#include<stdio.h>
//Estrutura de seleção simples
int main(void)
{
int quantidade;
float preco,total;
char designa[10];
printf("Digite a designação do produto\n");
scanf("%s",designa);
printf("Digite a quantidade do produto\n");
scanf("%d",&quantidade);
printf("Digite o preço\n");
scanf("%f",&preco);
total=quantidade*preco;
printf("O valor total do produto %s é %3.2f",designa,total);

return 0;
}

Resultado (Output)
Digite a designação do produto:
Lápis
Digite a quantidade do produto:
10
Digite o preço:
0.50
O valor total do produto Lápis é 5.00

42
Estruturas de controlo

A instrução printf("O valor total do produto %s é %3.2f",designa,total); imprime no


ecrã os resultados dos cálculos efetuados. O total é apresentado de acordo com a
especificação do formato %3.2f, podendo apresentar no máximo três dígitos nas uni-
dades e duas casas decimais.

A instrução return 0 é utilizada para retornar ao sistema operativo a informação de


que o programa terminou com sucesso. Ambas as funções, scanf() e printf(), perten-
cem à biblioteca "stdio.h".

Exercícios de aplicação 6
1‌ Crie um algoritmo, em pseudocódigo e em fluxograma, que permita a leitura de
dois números reais e apresente a sua média.

2‌ Crie um algoritmo, em pseudocódigo e em fluxograma, que permita a leitura de


um número inteiro, calculando e apresentando o seu quadrado.

3‌ Utilizando a linguagem C, crie os programas para cada um dos problemas


propostos nos exercícios 1 e 2.

4‌ Crie um algoritmo em fluxograma e o correspondente programa em C, que


permita a leitura de três números inteiros relativos ao tempo decorrido em horas,
minutos e segundos, de seguida, calcula e apresenta o tempo decorrido em
segundos.

5‌ Crie um algoritmo em pseudocódigo e o correspondente programa em C, que


permita a leitura de dois números reais relativos a uma quantia em euros e a taxa
de câmbio para dólar, de seguida, calcula e apresenta a quantia em dólar.

3.2 Estrutura de decisão ou seleção


As estruturas de decisão ou seleção permitem escolher uma opção, de entre as exis-
tentes, para o desenvolvimento de um programa, executando sequências alternativas
de acordo com os dados de entrada.

Este tipo de estrutura subdivide-se em estruturas de seleção:


COD12MD © Porto Editora

▪ simples;
▪ composta;
▪ encadeada;
▪ múltipla.

43
Introdução à programação

3.2.1 Estrutura de seleção simples


Através da utilização da estrutura de seleção simples, as instruções são executadas

COD12MD © Porto Editora


quando a condição de seleção for avaliada com o valor lógico True (1), caso contrário,
com o valor lógico False (0), o programa continua a execução das instruções fora
desta estrutura.

Os quadros 3.4 e 3.6 apresentam as sintaxes da estrutura de seleção simples, respetiva-


mente, em algoritmia e em linguagem C. Por outro lado, o quadro 3.4 apresenta o exem-
plo de um algoritmo em pseudocódigo e em fluxograma que calcula a diferença entre
dois pesos, se o peso introduzido pelo utilizador for inferior a 70 kg, e o quadro 3.6, o
respetivo programa em linguagem C.

De notar que, neste caso, não aparecem as palavras Senão e Else porque não é ne-
cessário desenvolver o ramo False da estrutura. É de realçar, também, que, na lingua-
gem C, pelo facto de existir mais do que uma instrução no ramo True da estrutura, é
necessário utilizar o conjunto {… } (Início… Fim) para agrupá-las e associá-las ao refe-
rido ramo. Na linguagem C é obrigatório o uso de chavetas, em determinadas estrutu-
ras, para agrupar as instruções.

quadro 3.4

Sintaxe Fluxograma

… Início
Se <expressão> Então

FimSe; Escrever (“Digite o
seu primeiro nome”)

Pseudocódigo
Ler (nome)
Algoritmo peso_inf_70;
Variável dif, peso: real;
Escrever ("Digite
nome: texto; o seu peso")
Início
Escrever (“Digite o seu primeiro nome”);
Ler (nome); Ler (peso)
Escrever (“Digite o seu peso”);
Ler (peso);
Se peso <70 Então Se peso < 70 Então False
dif←70-peso;
Escrever (“Falta ao ”,nome,” “,dif,” Kg para atingir os 70 Kg”); True
FimSe;
Escrever (“O programa vai terminar”); dif←70-peso
Fim.

Escrever ("Falta ao ",nome,"


",dif," Kg para atingir os 70 Kg")

Escrever ("O programa


vai terminar")

Fim

44
Estruturas de controlo

O quadro 3.5 apresenta a traçagem do algoritmo do quadro 3.4, considerando os seguin-


tes valores de entrada:

▪ primeiro nome igual a "Rui";


▪ peso igual a 67.

quadro 3.5

nome peso peso<70 dif←70−peso Saída

1.º passo Rui

2.º passo Rui 67

Rui 67 67<70
3.º passo
True

4.º passo Rui 67 − 3.0

5.º passo Rui 67 − 3.0 Falta ao Rui 3.0 kg para atingir os 70 kg

6.º passo Rui 67 − 3.0 O programa vai terminar

O algoritmo e o respetivo programa em C, apresentados nos quadros 3.4 e 3.6, referem-


-se à situação em que o utilizador introduz um nome e um peso. Depois, através da
condição peso < 70, é determinado se o peso inserido é inferior a 70 kg. Se for, é cal-
culada e apresentada a diferença entre o peso inserido e os 70 kg. Caso contrário, o
programa continua a sua execução. O programa termina sempre com a apresentação
da mensagem "O programa vai terminar".

quadro 3.6

Sintaxe Programa

if (expressão) #include <stdio.h>


{
int main(void)
instruções;
} {

float dif,peso;
char nome[25];

printf("Digite o seu primeiro nome\n");


scanf("%s",nome);
printf("Digite o seu peso\n");
scanf("%f",&peso);
if (peso<70) {
dif=70.0-peso;
printf("Falta ao %s %2.2fkg para atingir os 70 Kg\n",nome,dif);
}
printf("Programa vai terminar");
return 0;
}

Resultado (Output)

Digite o seu primeiro nome


Rui
COD12MD © Porto Editora

Digite o seu peso


67
Falta ao Rui 3.00kg para atingir os 70 Kg
Programa vai terminar

45
Introdução à programação

COD12MD © Porto Editora


Exercícios de aplicação 7
1‌ Crie um algoritmo, em pseudocódigo e em fluxograma, que permita a leitura de
dois caracteres alfanuméricos, determinando, a seguir, se são iguais. Caso sejam
iguais, aparece a mensagem "Inseriu dois caracteres iguais".

2‌ Utilizando a linguagem C, crie o programa relativo ao exercício anterior.

3.2.2 Estrutura de seleção composta


Através da utilização da estrutura de seleção composta, podem existir duas opções
possíveis para o desenrolar das instruções do programa que são selecionadas de
acordo com o valor lógico, True (1) e False (0), resultante da avaliação de uma condi-
ção ou expressão.

Os quadros 3.7 e 3.9 apresentam as sintaxes da estrutura de seleção composta, respetiva-


mente, em algoritmia e em linguagem C. Por outro lado, o quadro 3.7 apresenta o exemplo
de um algoritmo em pseudocódigo e em fluxograma que determina o maior de dois nú-
meros, e o quadro 3.9 apresenta o respetivo programa em linguagem C.

quadro 3.7

Sintaxe Fluxograma

… Início
Se <expressão> Então
… Escrever ("Digite
Senão um número inteiro")

FimSe Ler (num1)

Escrever ("Digite um
Pseudocódigo número inteiro
diferente do anterior")
Algoritmo maior_de_2;
Variável maior, num1, num2: inteiro;
Ler (num2)
Início
Escrever ("Digite um número inteiro");
Ler (num1); Se num1 > num2 False
Escrever ("Digite um número inteiro diferente do anterior");
Ler (num2); True
Se num1 > num2 então
maior ← num1 maior ← num1 maior ← num2
Senão
maior ← num2;
FimSe;
Escrever ("O maior de
Escrever ("O maior de dois números é ", maior); dois números é ", maior)
Fim.
Fim

46
Estruturas de controlo

O quadro 3.8 apresenta a traçagem do algoritmo do quadro 3.7, considerando os seguin-


tes valores relativos a duas entradas:

Primeira:

▪ num1 igual a 7
▪ num2 igual a 2
Segunda:

▪ num1 igual a 5
▪ num2 igual a 6

quadro 3.8

num1 num2 num1>num2 maior←num1 maior←num2 Saída

1.º passo 7

2.º passo 7 2

7>2
3.º passo 7 2
True

4.º passo 7 2 − 7 −

O maior de dois
5.º passo 7 2 − 7 −
números é 7

1.º passo 5

2.º passo 5 6

5>6
3.º passo 5 6
False

4.º passo 5 6 − − 6

O maior de dois
5.º passo 5 6 − − 6
números é 6

O algoritmo e o respetivo programa em C, apresentados nos quadros 3.7 e 3.9, referem-


COD12MD © Porto Editora

-se à situação em que o utilizador introduz dois números inteiros, diferentes entre si,
efetuando depois a sua comparação. Se o primeiro número for maior do que o se-
gundo, então o primeiro número é atribuído à variável maior. Caso contrário, o segundo
número é atribuído à variável maior. Por último, apresenta o maior dos dois números.

47
Introdução à programação

quadro 3.9

COD12MD © Porto Editora


Sintaxe Programa

if (expressão) #include <stdio.h>


instrução;
int main(void)
else
{
instrução; int maior,num1,num2;
printf("Digite um número inteiro ");
scanf("%d",&num1);
printf("Digite um número inteiro diferente do anterior ");
scanf("%d",&num2);
if(num1>num2)
maior=num1;
else
maior=num2;
printf("O maior dos dois números é %d ",maior);
return 0;
}

Resultado (Output)

Digite um número inteiro 7


Digite um número inteiro diferente do anterior 2
O maior dos dois números é 7

Exercícios de aplicação 8
1‌ Crie um algoritmo, em pseudocódigo e em fluxograma, que permita a leitura de
um valor inteiro e a seguir determina, se o valor é par ou ímpar, surgindo uma das
mensagens, respetivamente, "O valor inserido é par" ou "O valor inserido é ímpar".

2‌ Utilizando a linguagem C, crie o programa relativo ao exercício anterior.

3.2.3 Estrutura de seleção encadeada


Numa estrutura de seleção encadeada podem existir várias opções encadeadas para
o desenrolar das instruções do programa. Cada uma destas opções pode ser selecio-
nada de acordo com o valor lógico, True (1) e False (0), resultante da avaliação da sua
condição ou expressão.

Os quadros 3.10 e 3.12 apresentam as sintaxes da estrutura de seleção composta, respe-


tivamente, em algoritmia e em linguagem C. Por outro lado, os mesmos quadros apre-
sentam o exemplo de um algoritmo em pseudocódigo e em fluxograma, que deter-
mina se dois números são iguais entre si ou qual o maior deles, e o respetivo
programa em linguagem C.

48
Estruturas de controlo

quadro 3.10

Sintaxe Pseudocódigo

… Algoritmo Maior_Igual_2;
Se <expressão> Então Variável num1, num2: inteiro;
… Início
Senão Se <expressão> Então Escrever ("Digite um número inteiro");
… Ler (num1);
Senão Escrever ("Digite outro número inteiro");
… Ler (num2);
FimSe; Se num1 = num2 Então
FimSe; Escrever ("Os números são iguais")
… Senão Se num1 > num2 Então
Escrever ("O maior dos dois números é ",num1)
Senão
Escrever ("O maior dos dois números é ",num2);
FimSe;
FimSe;
Fim.

Fluxograma

Início

Escrever ("Digite
um número inteiro")

Ler (num1)

Escrever ("Digite
outro número inteiro")

Ler (num2)

Se num1 = num2 True

Escrever ("Os números


False
digitados são iguais")

Se num1 > num2 True

Escrever ("O primeiro número ",num1,


"é maior que o segundo número ",num2)
False

Escrever ("O primeiro número ",num2,


"é maior que o segundo número ",num1)
COD12MD © Porto Editora

Fim

49
Introdução à programação

O quadro 3.11 apresenta a traçagem do algoritmo do quadro 3.10, considerando os se-

COD12MD © Porto Editora


guintes valores relativos a duas entradas:

Primeira:

▪ num1 igual a 16
▪ num2 igual a 16
Segunda:

▪ num1 igual a 13
▪ num2 igual a 19

quadro 3.11

num1 num2 num1=num2 num1>num2 Saída

1.º passo 16

2.º passo 16 16

3.º passo 16 16

16=16
4.º passo 16 16
True

Os números
5.º passo 16 16 − −
são iguais

1.º passo 13

2.º passo 13 19

13=19
3.º passo 13 19
False

13>19
4.º passo 13 19 −
False

O maior dos dois


5.º passo 13 19 − −
números é 19

O algoritmo e o respetivo programa em C, mostrados nos quadros 3.10 e 3.12, referem-se


à situação em que o utilizador insere dois números inteiros. Ao efetuar a comparação,
verifica primeiro se os números são iguais, senão, verifica qual deles é o maior.

50
Estruturas de controlo

quadro 3.12

Sintaxe Programa

if(expressão) #include <stdio.h>


instrução;
int main(void)
else if(expressão)
{
instrução; int num1,num2;
else
instrução; printf("Digite um número inteiro\n");
scanf("%d",&num1);
printf("Digite outro número inteiro\n");
scanf("%d",&num2);
if(num1==num2)
printf("Os números são iguais");
else if(num1>num2)
printf("O maior dos dois números é %d",num1);
else
printf("O maior dos dois números é %d",num2);
return 0;
}

Resultado (Output)
Digite um número inteiro
16
Digite outro número inteiro
16
Os números são iguais

Exercícios de aplicação 9
1‌ Crie um algoritmo, em pseudocódigo e em fluxograma, que permita a leitura de
um número inteiro. De seguida, determina se o número é de valor positivo,
negativo ou nulo, apresentando uma mensagem correspondente a uma das três
situações possíveis.

2‌ Crie a traçagem do algoritmo criado no exercício 1, utilizando para a variável A os


seguintes valores de entrada 9, −19 e 0.

3‌ Crie um programa, em C, relativo ao exercício anterior.

3.2.4 Estrutura de seleção múltipla


Numa estrutura de seleção múltipla, é possível selecionar uma de múltiplas opções
para o desenrolar das instruções do programa de acordo com o valor de uma variável.
COD12MD © Porto Editora

Os quadros 3.13 e 3.15 apresentam as sintaxes da estrutura de seleção múltipla, respeti-


vamente, em algoritmia e em linguagem C. Por outro lado, os mesmos quadros apre-
sentam o exemplo de um algoritmo em pseudocódigo e em fluxograma, que

51
Introdução à programação

determina o dia da semana de acordo com o valor inserido, e o respetivo programa

COD12MD © Porto Editora


em linguagem C.

quadro 3.13

Sintaxe Fluxograma

… Início
Selecionar Caso <variável>
<valor1>:…
… Escrever
<valorn>: … ("Insira um número
Senão … inteiro de 1 a 7")
FimSelecionarCaso

Ler (dia)
Pseudocódigo

Algoritmo Designa_dias;
Variáveis dia:inteiro; Escrever
dia=1 True
("Segunda-feira")
Início
Escrever ("Insira um número inteiro de 1 a 7"); False
Ler (dia);
Seleccionar Caso Dia Escrever
dia=2 True
1: Escrever ("Segunda-feira"); ("Terça-feira")
2: Escrever ("Terça-feira");
False
3: Escrever ("Quarta-feira");
4: Escrever ("Quinta-feira");
Escrever
5: Escrever ("Sexta-feira"); dia=3 True
("Quarta-feira")
6: Escrever ("Sábado");
7: Escrever ("Domingo") False
Senão Escrever ("Inseriu um número inválido");
FimSelecionarCaso; Escrever
dia=4 True
("Quinta-feira")
Fim.
False

Escrever
dia=5 True
("Sexta-feira")

False

Escrever
dia=6 True
("Sábado")

False

Escrever
dia=7 True
("Domingo")

False

Escrever
("Inseriu um número inválido")

Fim

52
Estruturas de controlo

O quadro 3.14 apresenta a traçagem do algoritmo do quadro 3.13, considerando os se-


guintes valores relativos a duas entradas:

Primeira:
▪ dia igual a 4
Segunda:
▪ dia igual a 9
quadro 3.14

dia Saída

1.º passo 4

2.º passo 4 Quinta-feira

1.º passo 9

2.º passo 9 Inseriu um número inválido

O algoritmo e o respetivo programa em C, mostrados nos quadros 3.13 e 3.15, referem-se


à situação em que o utilizador insere um número inteiro. A partir deste valor é determi-
nada a opção correspondente e apresentado o respetivo dia da semana. Os valores
numéricos que podem ser inseridos pelo utilizador vão de 1 a 7, senão surge uma men-
sagem a informar que foi inserido um número inválido.

quadro 3.15

Sintaxe Programa

switch(variável) #include <stdio.h>


{
int main(void)
case const1:
<bloco de instruções> {
break;
int dia;
case const2:
<bloco de instruções> printf("Insira um número inteiro de 1 a 7\n");
break; scanf("%d",&dia);
default: switch(dia){
case 1: printf("Segunda-feira");
<bloco de instruções> break;
} case 2: printf("Terca-feira");
break;
case 3: printf("Quarta-feira");
break;
case 4: printf("Quinta-feira");
break;
case 5: printf("Sexta-feira");
break;
case 6: printf("Sábado");
break;
case 7: printf("Domingo");
break;
default: printf("Inseriu um número inválido");
}
return 0;
}
COD12MD © Porto Editora

Resultado (Output)
Insira um número inteiro de 1 a 7
4
Quinta-feira

53
Introdução à programação

A estrutura switch… case, de acordo com o valor da variável dia, permite apresentar o

COD12MD © Porto Editora


dia da semana, de acordo, com o valor da instrução case. A instrução break, utilizada
em cada case, permite terminar a execução das instruções dentro da estrutura
switch… case. A instrução default é executa quando o valor da variável dia não é igual
a qualquer um dos valores dos case.

Exercícios de aplicação 10
1‌ Crie um algoritmo, em pseudocódigo e em fluxograma, que permita efetuar a
leitura de dois números reais, em que o segundo número terá de ser diferente de
zero. Mediante a seleção de uma opção (carácter alfabético), deve ser efetuada
uma operação aritmética com os números lidos anteriormente e apresentado o
resultado da operação. Utilize uma estrutura de seleção múltipla (Selecionar
Caso) para implementar um menu com as seguintes opções:
a) Adição
b) Subtração
c) Multiplicação
d) Divisão
Caso seja selecionada uma opção diferente destas, será apresentada a
mensagem "Opção inválida".

2‌ Utilizando a linguagem C, crie o programa relativo ao problema proposto no


exercício anterior.

3.3 Estruturas de repetição ou ciclos


As estruturas de repetição ou ciclos permitem a iteração, ou seja, a repetição da exe-
cução de um conjunto de instruções de um programa controlado pelo resultado lógico,
True (1) e False (0), da avaliação de uma condição ou expressão.

Este tipo de estruturas subdivide-se em:

▪ ciclo For (Para);


▪ ciclo While (Enquanto);
▪ ciclo Do… While (Fazer… Enquanto).

3.3.1 Ciclo For (Para)


O ciclo For é um tipo de estrutura de repetição em que inicialmente é conhecido o nú-
mero de vezes que será repetida a execução do bloco de instruções. Para tal, utiliza
um contador automático implementado através de uma variável do tipo inteiro.

O valor desta variável vai ser incrementado ou decrementado, resultando a realização


de uma contagem crescente ou decrescente do número de repetições indicadas na
estrutura do ciclo.

54
Estruturas de controlo

Os quadros 3.16 e 3.19 apresentam as sintaxes da estrutura repetitiva do ciclo For, respe-
tivamente, em algoritmia e em linguagem C. Por outro lado, nos mesmos quadros pode
ver-se o exemplo de um algoritmo em pseudocódigo e em fluxograma, que calcula a
média de n números inteiros, e o respetivo programa em linguagem C.

quadro 3.16

Sintaxe Fluxograma

… Início
Para <variávelcontador:=valorinicial > Até <valorfinal> Fazer
<bloco de instruções>
Escrever ("Indique quantos
FimPara inteiros quer digitar")

Pseudocódigo Ler (n)

Algoritmo med_num;
Variáveis i, n, soma, num: inteiro; soma ← 0
media: real;
Início
i ← 1
Escrever ("Indique quantos inteiros quer digitar");
Ler (n);
soma ← 0;
Para i ← 1 Até n Fazer
Escrever ("Indique um número inteiro"); i < = n False
Ler (num);
soma ← soma + num; True
FimPara;
Escrever ("Indique
media ← soma / n; um número inteiro")
Escrever ("A média dos números indicados é ",media);
Fim.
Ler (num)

soma ← soma + num

i ← i + 1

media ← soma / n

Escrever ("A média dos


números indicados é ",media)

Fim

O algoritmo, em pseudocódigo e em fluxograma, mostrado nos quadros 3.16 e 3.19, refe-


rem-se à situação em que o utilizador começa por inserir um número inteiro (n) para a
variável contador (i) do ciclo For (Para), controlado pela variável (i). Em cada repetição
do ciclo, é inserido pelo utilizador um número inteiro (num), cujo valor vai sendo adicio-
COD12MD © Porto Editora

nado à variável soma, que funciona como um acumulador. Quando o número de itera-
ções terminar, é calculada a média tendo por base os valores que foram acumulados
na variável soma e a quantidade de números inteiros que foi indicada pelo utilizador
(n). Por último, é apresentado o resultado do cálculo da média.

55
Introdução à programação

O quadro 3.17 apresenta a traçagem do algoritmo do quadro 3.16, considerando os se-


guintes dados de entrada:

▪ n igual a 2;
▪ num igual a 10 e a 12.

quadro 3.17

COD12MD © Porto Editora


soma← media←
n soma←0 I←1 i<=n num I←i+1 Saída
soma+num soma/n

1.º passo 2

2º passo 2 0

3.º passo 2 0 1

1<=2
4.º passo 2 0 1
True

5.º passo 2 0 1 − 10

6.º passo 2 − 1 − 10 10

7.º passo 2 − − − 10 10 2

2<=2
8.º passo 2 − − 10 10 2
True

9.º passo 2 − − − 12 10 2

10.º passo 2 − − − 12 22 2

11.º passo 2 − − − 12 22 3

3<=2
12.º passo 2 − − 12 22 3
False

13.º passo 2 − − − 12 22 3 11

A média dos
14.º passo 2 − − − 12 22 3 11 números
indicados é 11

56
Estruturas de controlo

O quadro 3.18 apresenta a descrição passo a passo da traçagem do algoritmo apresen-


tada no quadro 3.17.

quadro 3.18

Passo Descrição

1.º É atribuído à variável n (número de iterações) o valor 2 (pelo utilizador).

2.º É inicializada a 0 a variável soma.

3.º É inicializada a 1 a variável contador (i) no ciclo For.

4.º É testada a condição i<=n (1<=2); como é True, continua a execução do ciclo For.

É executada a primeira instrução do ciclo, sendo atribuído o valor 10 à variável num (pelo
5.º
utilizador).

É executada a segunda instrução do ciclo, sendo adicionado o valor 10 ao acumulador


6.º
soma (soma←0+10).

É executada a terceira instrução do ciclo, sendo incrementada a variável contador (i) do


7.º
ciclo, passando de 1 para 2 (i←1+1).

8.º É testada a condição i<=n (2<=2); como é True, continua a execução do ciclo For.

É executada a primeira instrução do ciclo, sendo atribuído o valor 12 à variável num (pelo
9.º
utilizador).

É executada a segunda instrução do ciclo, sendo adicionado o valor 22 ao acumulador


10.º
soma (soma←10+12).

É executada a terceira instrução do ciclo, sendo incrementada a variável contador (i) do


11.º
ciclo passando de 2 para 3 (i←2+1).

12.º É testada a condição i<=n (3<=2); como é False, termina a execução do ciclo For.

É efectuado o cálculo da média (media), tendo por base o valor acumulado em soma
13.º
(soma←22) e o valor de n (n←2), resultando o valor 11.
COD12MD © Porto Editora

14.º É apresentada a mensagem "A média dos números indicados é 11".

57
Introdução à programação

O quadro 3.19 apresenta a sintaxe da estrutura repetitiva do ciclo For e o respetivo pro-

COD12MD © Porto Editora


grama em linguagem C.

quadro 3.19

Sintaxe


For (variável=valorinicial; variável<valorfinall; variável++)
{
<Bloco de intruções>
}

Programa

#include <stdio.h>

int main(void)
{
int i,n,soma=0,num;
float media;
printf("Indique quantos inteiros quer digitar\n");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("Indique um número inteiro\n");
scanf("%d",&num);
soma+=num;
}
media=(float)soma/n;
printf("A média dos números indicados é %f",media);

return 0;
}

Resultado (Output)

Indique quantos inteiros quer digitar


2
Indique um número inteiro
10
Indique um número inteiro
12
A média dos números indicados é 11.000000

Exercícios de aplicação 11
1‌ Qual das seguintes opções não é uma instrução específica das estruturas de
controlo?
(A) if
(B) for
(C) while
(D) printf

58
Estruturas de controlo

2‌ Indique o resultado (output) do seguinte código.


#include <stdio.h> (A) 123456
int main() (B) 123456
{ (C) 12345
int i;
(D) 12345
for(i=1;i<6;i++)
printf("%d ",i);
}

3‌ Sem utilizar uma estrutura de repetição, crie um algoritmo, em pseudocódigo,


que permita a leitura de quatro números inteiros, determinando e apresentando
para cada um deles se:
■ o número é de valor par e superior a dez;
■ o número é de valor ímpar e inferior a dez.

4‌ Crie um algoritmo em pseudocódigo, e o respetivo programa em C, que resolva o


problema indicado no exercício anterior, utilizando a estrutura de repetição ciclo
For (Para).

5‌ Desenvolva um programa, utilizando a linguagem C, que permita ao utilizador


indicar dois números inteiros, correspondentes aos limites inferior (variável lInf) e
superior (variável lSup) de um intervalo de números inteiros a serem gerados
pelo programa. De seguida, é necessário testar se o número indicado para o
limite superior é de valor superior ao número indicado para o limite inferior. Caso
seja, devem ser gerados e apresentados os números do intervalo. Caso
contrário, é apresentada a mensagem "Os limites, indicados para o intervalo,
estão errados" e o programa termina. Implemente este programa utilizando a
estrutura de repetição ciclo For (Para).

6‌ Crie um programa que permita apresentar os caracteres alfabéticos em


maiúsculas correspondentes aos códigos ASCII (American Standard Code for
Information Interchange), compreendidos entre 65 e 90.

7‌ Crie um programa que permita apresentar o caráter correspondente ao código


ASCII, número inteiro de 33 a 126, indicado pelo utilizador. Caso seja indicado um
número inteiro, código ASCII, fora deste intervalo 33 a 126, surge a mensagem
"Indicou um código inválido".

3.3.2 Ciclo While (Enquanto)


O ciclo While é um tipo de estrutura de repetição em que o número de vezes a repetir
o bloco de instruções é controlado pelo resultado Lógico, True (1) e False (0), da ava-
COD12MD © Porto Editora

liação de uma condição ou expressão.

Se o resultado da avaliação for True (Verdadeiro), o bloco de instruções é executado.


Se na primeira avaliação, o resultado for False (Falso), como a condição ou expressão

59
Introdução à programação

lógica é avaliada no início da estrutura, o bloco de instruções não chega a ser execu-

COD12MD © Porto Editora


tado uma única vez.

Este ciclo pode, também, ser implementado sabendo inicialmente o número de vezes
que a execução do bloco de instruções vai ser repetido. Neste caso, é utilizada uma
variável contador destinada a controlar a execução do ciclo, à semelhança do funcio-
namento do ciclo For.

Os quadros 3.20 e 3.23 apresentam as sintaxes da estrutura repetitiva do ciclo While


respetivamente, em algoritmia e em linguagem C, em que não se conhece previamente
o número de repetições a executar. Neste exemplo, o algoritmo apresentado em pseu-
docódigo e em fluxograma, e o respetivo programa em linguagem C, calcula o número
de nomes inseridos pelo utilizador.

quadro 3.20

Sintaxe Pseudocódigo

… Algoritmo Conta_nomes;
Enquanto <expressão> Fazer Variável conta: inteiro;
<bloco de instruções> nome: caracter;
FimEnquanto; Início
… conta ← 0;
Escrever ("Digite o primeiro nome");
Ler (nome);
Enquanto nome <> "Fim" Fazer
conta ← conta + 1;
Escrever ("Digite o primeiro nome");
Ler (nome);
FimEnquanto;
Escrever ("Foram digitados ",conta," primeiros nomes");
Fim.

Fluxograma

Início

conta ← 0

Escrever("Digite o primeiro nome")

Ler(nome)

nome <> "Fim" False

True

conta ← conta + 1

Escrever("Digite o primeiro nome")

Ler(nome)

Escrever("Foram digitados ",conta," primeiros nomes")

Fim

60
Estruturas de controlo

O quadro 3.21 apresenta a traçagem do algoritmo do quadro 3.20, considerando os se-


guintes dados de entrada:

▪ nome igual a "Rui";


▪ nome igual a "Ana";
▪ nome igual a "Fim".

quadro 3.21

conta←0 nome nome<>"Fim" conta←conta+1 Saída

1.º passo 0

2.º passo 0 Rui

Rui<>Fim
3.º passo 0 Rui
True

4.º passo − Rui − 1

5.º passo − Ana − 1

Ana<>Fim
6.º passo − Ana 1
True

7.º passo − Ana − 2

8.º passo − Fim − 2

Fim<>Fim
9.º passo − Fim 2
False
COD12MD © Porto Editora

Foram digitados
10.º passo − Fim − 2 2 primeiros
nomes

61
Introdução à programação

O quadro 3.22 apresenta a descrição passo a passo da traçagem do algoritmo apresen-


tada no quadro 3.21.

COD12MD © Porto Editora


quadro 3.22

Passo Descrição

1.º É inicializada a 0 a variável contador conta.

É atribuído à variável nome a palavra Rui (pelo utilizador). O conteúdo desta variável é
2.º testado na condição do ciclo While, antes de qualquer repetição de instruções no interior
do mesmo.

3.º É testada a condição nome<>"Fim" (Rui<>Fim); como é True, continua a execução do ciclo.

É executada a instrução do ciclo, sendo incrementada a variável contador (conta) do ciclo


4.º
passando de 0 para 1 (conta←0 + 1).

É executada a instrução do ciclo, sendo atribuída à variável nome a palavra Ana (pelo
5.º
utilizador).

É testada a condição nome<>"Fim" (Ana<>Fim); como é True, continua a execução do


6.º
ciclo.

É executada a instrução do ciclo, sendo incrementada a variável contador (conta) do ciclo


7.º
passando de 1 para 2 (conta←1 + 1).

É executada a instrução do ciclo, sendo atribuída à variável nome a palavra Fim (pelo
8.º
utilizador).

É testada a condição nome<>"Fim" (Fim<>Fim); como é False, termina a execução do ciclo


9.º
While.

10.º É apresentada a mensagem "Foram digitados 2 primeiros nomes".

O algoritmo e o respetivo programa em C, mostrados nos quadros 3.20 e 3.23, referem-


-se à situação em que o utilizador insere primeiros nomes até inserir a palavra Fim. Por
cada nome digitado, o contador, implementado pela variável conta, é atualizado so-
mando mais um ao seu valor anterior e, por último, o programa indica quantos primei-
ros nomes foram digitados.

62
Estruturas de controlo

quadro 3.23

Sintaxe Programa

… #include<stdio.h>
While <expressão> #include<string.h>
{
int main(void)
<Bloco de instruções> {
} int conta=0;
.... char nome[20];

printf("Digite o primeiro nome ");


scanf("%s",nome);
while(strcmp(nome,"Fim")!=0)
{
conta++;
printf("Digite o primeiro nome ");
scanf("%s",nome);
}
printf("Foram digitados %d primeiros nomes",conta);

return 0;
}

Resultado (Output)
Digite o primeiro nome Rui
Digite o primeiro nome Ana
Digite o primeiro nome Fim
Foram digitados 2 primeiros nomes

Exercícios de aplicação 12
1‌ Resolva os exercícios 4 e 5 do exercício de aplicação 11, criando programas na
linguagem C, substituindo o ciclo For pelo ciclo While.

3.3.3 Ciclo Do… While (Fazer… Enquanto)


O ciclo Do… While é um tipo de estrutura de repetição em que o número de vezes a
repetir o bloco de instruções é controlado pelo resultado lógico, True (1) e Falso (0), da
avaliação de uma condição ou expressão. Enquanto o resultado da avaliação for True
(verdadeiro), o bloco de instruções continua a ser executado. Como a condição ou
expressão lógica é avaliada no fim da estrutura, é sempre executado, pelo menos uma
vez, o bloco de instruções.

Este ciclo pode, também, ser implementado sabendo inicialmente o número de vezes
que a execução do bloco de instruções vai ser repetido. Neste caso, é utilizada uma
COD12MD © Porto Editora

variável contador que vai permitir controlar a execução do ciclo, à semelhança do fun-
cionamento do ciclo For.

63
Introdução à programação

Nos quadros 3.24 e 3.27 são apresentadas as sintaxes da estrutura de repetição do ciclo

COD12MD © Porto Editora


Do… While, respetivamente, em algoritmia e em linguagem C, em que não se conhece
previamente o número de ciclos a executar. Neste exemplo, o algoritmo apresentado
em pseudocódigo e em fluxograma, e o respetivo programa em linguagem C, calcula o
perímetro de um retângulo até que o utilizador escolha terminar este cálculo.

quadro 3.24

Sintaxe Fluxograma

… Início
Fazer

Enquanto <expressão>;

Pseudocódigo
Escrever ("Medidas
Algoritmo Retangulo; do retângulo")
Variável area, perimetro, comp, larg: real;
resp: caracter;
Início Escrever ("Indique a
Fazer largura em metro")
Escrever ("Medidas do retangulo");
Escrever ("Indique a largura em metro ");
Ler (larg); Ler (larg)
Escrever ("Indique o comprimento em metros");
Ler (comp);
Perímetro ← 2 * (larg + comp); Escrever ("Indique o
Escrever ("Perímetro = ",perimetro," metro"); comprimento em metro")

Escrever ("Pretende efetuar mais calculos (s/n)");


Ler (resp);
Enquanto (resp="s"); Ler (comp)
Fim.

Perímetro ←
2*(larg + comp)

Escrever ("Perímetro
= ",perimetro,"metro")

Escrever ("Pretende
efectuar mais
cálculos (s/n)")

Ler (resp)

True resp = "s"

False

Fim

64
Estruturas de controlo

O quadro 3.25 apresenta a traçagem do algoritmo do quadro 3.24, considerando os se-


guintes valores relativos a duas entradas:

Primeira:

▪ largura igual a 4
▪ comprimento igual a 12
Segunda:

▪ largura igual a 10
▪ comprimento igual a 20

quadro 3.25

larg comp perimetro←2*(larg+comp) Saídas resp (resp="s")

1.º passo 4

2.º passo 4 12

3.º passo 4 12 32

4.º passo 4 12 32 Perímetro = 32 metro

5.º passo 4 12 32 s

6.º passo 4 12 32 s True

7.º passo 10 12 32 s −

8.º passo 10 20 32 s −

9.º passo 10 20 60 s −

10.º passo 10 20 60 Perímetro = 60 metro s −

11.º passo 10 20 60 n −
COD12MD © Porto Editora

12.º passo 10 20 60 n False

65
Introdução à programação

O quadro 3.26 apresenta a descrição passo a passo da traçagem do algoritmo apresen-

COD12MD © Porto Editora


tada no quadro 3.25.

quadro 3.26

Passo Descrição

É executada a primeira instrução de entrada do ciclo, sendo atribuído à variável larg o valor
1.º
4 (pelo utilizador).

É executada a segunda instrução de entrada do ciclo, sendo atribuído à variável comp o


2.º
valor 12 (pelo utilizador).

É executada a instrução do cálculo do perímetro, sendo atribuído à variável perimetro o


3.º
resultado 32 (perimetro←2*(4 + 12)).

4.º É executada a instrução de saída, sendo apresentada a mensagem "Perímetro = 32 metro".

É executada a terceira instrução de entrada do ciclo, sendo atribuído à variável resp o


5.º
carácter s (pelo utilizador).

É executada a última instrução do ciclo, sendo testada a expressão resp="s" (s é igual a s).
6.º
Como o resultado do teste é True, o ciclo continua até que este seja False.

É executada a primeira instrução de entrada do ciclo, sendo atribuído à variável larg o valor
7.º
10 (pelo utilizador).

É executada a segunda instrução de entrada do ciclo, sendo atribuído à variável comp o


8.º
valor 20 (pelo utilizador).

É executada a instrução do cálculo do perímetro, sendo atribuído à variável perimetro o


9.º
resultado 60 (perimetro←2*(10 + 20)).

10.º É executada a instrução de saída, sendo apresentada a mensagem "Perímetro = 60 metro".

É executada a terceira instrução de entrada do ciclo, sendo atribuído à variável resp o


11.º
carácter n (pelo utilizador).

É executada a última, instrução do ciclo, sendo testada a expressão resp = "s" (n é


12.º
diferente de s). Como o resultado do teste é False, o ciclo termina.

O algoritmo e o respetivo programa em C, mostrados nos quadros 3.24 e 3.27, referem-


-se à situação em que o utilizador insere dois números reais relativos às medidas da
largura e do comprimento de um retângulo. Depois, é efetuado o cálculo do perímetro
e apresentado o respetivo resultado. Por último, o utilizador é questionado se pretende
efetuar mais cálculos: caso pretenda continuar, insere o carácter s; caso contrário,
termina inserindo um carácter diferente de s (n ou outro).

66
Estruturas de controlo

quadro 3.27

Sintaxe Programa

… #include<stdio.h>
do
int main(void)
{ {
float area,perimetro,comp,larg;
<Bloco de instruções> char resp;

do
} {
while (expressão); printf("Medidas do retangulo\nIndique a largura em metro ");
… scanf("%f",&larg);
printf("Indique o comprimento em metro ");
scanf("%f",&comp);
perimetro=(larg+comp)*2;
printf("Perimetro = %f' metro\n",perimetro);
printf("Pretende efetuar mais calculos (s/n) ");
scanf(" %c",&resp);
}
while(resp=='s');

return 0;
}

Resultado (Output)
Medidas do retangulo
Indique a largura em metro 4
Indique o comprimento em metro 12
Perimetro = 32.000000' metro
Pretende efetuar mais calculos (s/n) s
Medidas do retangulo
Indique a largura em metro 10
Indique o comprimento em metro 20
Perimetro = 60.000000' metro
Pretende efetuar mais calculos (s/n) n

Exercícios de aplicação 13
1‌ Resolva os exercícios 3 do exercício de aplicação 11, utilizando a representação
sob a forma de fluxograma e o respetivo programa na linguagem C, recorrendo à
estrutura de repetição ciclo Do… While (Fazer...Enquanto).

2‌ Desenvolva um programa, utilizando a linguagem C, que permita ao utilizador


indicar dois números inteiros, correspondentes aos limites inferior (variável linf) e
superior (variável lsup) de um intervalo de números inteiros a serem gerados pelo
programa. De seguida, é necessário testar se o número indicado para o limite
superior é de valor superior ao número indicado para o limite inferior. Caso seja,
devem ser gerados e apresentados os números do intervalo. Caso contrário, é
apresentada a mensagem "Os limites, indicados para o intervalo, estão errados"
COD12MD © Porto Editora

e o programa termina. Implemente este programa utilizando a estrutura de


repetição ciclo Do…While (Fazer...Enquanto).

67
Introdução à
programação

4 Sub-rotinas
As sub-rotinas são conjuntos de instruções identificadas por uma designação e que

COD12MD © Porto Editora


podem ser executadas, ou seja, chamadas o número de vezes necessárias num pro-
grama. Os programas desenvolvidos, utilizando sub-rotinas, estruturam-se de uma
forma modularizada, permitindo uma melhor organização e consequente entendi-
mento do seu código. As sub-rotinas, na linguagem C, são funções. Estas podem ser
funções predefinidas ou criadas pelo programador.

4.1 Funções
As funções criadas pelo programador, após a sua execução, podem retornar um resul-
tado, através do seu nome, para o local onde foram chamadas. O retorno tem um de-
terminado tipo de dado previamente definido nas funções. Caso não o seja, é conside-
rado, por defeito, do tipo de dado int. Podem existir situações em que a função realiza
as operações e não devolve qualquer valor. Neste caso, o tipo de dado do retorno é
definido pela palavra reservada void. Por outro lado, as funções podem ter parâmetros
associados a tipos de dados e, quando são criadas depois da função main(), têm de
ser declaradas no início do programa.

Uma função pode chamar outra, desde que esta seja declarada numa ordem acima da
que a chama.

Passagem de argumentos
A passagem de argumentos é utilizada em programas com funções, permitindo ao
programador controlar os dados que são trocados entre o programa principal e as
funções. A importância deste aspeto aumenta à medida que o tamanho e a complexi-
dade dos programas também aumentam. Os argumentos correspondem aos dados
que são passados através da instrução de chamada da função para o cabeçalho desta.
Estes dados são utilizados na função e têm de coincidir em número e tipo, na declara-
ção, no cabeçalho e na chamada desta.

A passagem de argumentos pode ser implementada por uma de duas formas: por
valor e por referência.

Na passagem por valor, ao ser chamada a função, são passadas cópias dos dados ou
das variáveis (argumentos) e atribuídas às variáveis (parâmetros) existentes na de-
claração e no cabeçalho da função. Neste caso, na função, a declaração das variáveis
dos parâmetros é precedida pela indicação dos tipos de dados.

Os dados recebidos nas funções, através dos seus parâmetros, podem sofrer altera-
ções nos seus valores. Mas estas não serão refletidas fora da função, ou seja, não
serão passadas para as variáveis que serviram de argumentos na chamada das fun-

68
Sub-rotinas

ções, uma vez que são efetuadas sobre as cópias.

Na declaração de funções com passagem por valor é utilizada, genericamente, a es-


trutura apresentada no quadro 4.1.

quadro 4.1

Sintaxe tipo_de_retorno nome_da_função (<tipo_de_dado nome_do_parâmetro, …>);

int soma(void);
float media(float nota1, float nota2);
Exemplos
conta_pares(int x, int y, int z);
void maximo(int x, float y);

O quadro 4.2 apresenta a sintaxe e um exemplo da estrutura de uma função com passa-
gem por valor.

quadro 4.2

tipo_de_retorno nome_da_função (<tipo_de_dado nome_do_parâmetro, …>)


{
Sintaxe
corpo da função
}

float media(float x, float y)


{
float m;
Exemplo
m=(x+y)/2;
return(m);
}

A chamada para execução de uma função, com passagem por valor, pode ser feita
através de uma instrução de atribuição, uma instrução de saída de resultados ou pela
indicação do nome da função, caso o retorno seja do tipo de dado void, tal como exem-
plificado no quadro 4.3.

quadro 4.3

Instrução Exemplo

Atribuição m = soma(a,b);

Saída de resultados printf ("Media = %f",media(x,y,z));

Nome da função maximo(n1,n2);


COD12MD © Porto Editora

O programa apresentado na figura 4.1 permite ao utilizador inserir três números intei-
ros. Depois, o programa determina e apresenta o máximo, calcula e apresenta a
soma e a média.

69
Introdução à programação

COD12MD © Porto Editora


#include <stdio.h>

void maximo(int a,int b,int c);


int soma(int a,int b,int c);
float media(int a,int b,int c);

int main(void)
{
int n1,n2,n3,m;
printf("Indique um número inteiro ");
scanf("%d",&n1);
printf("Indique um número inteiro ");
scanf("%d",&n2);
printf("Indique um número inteiro ");
scanf("%d",&n3);
maximo(n1,n2,n3);
printf("Média = %f\n",media(n1,n2,n3));
return (0);
}

void maximo(int a,int b,int c)


{
int max=a;
if(b>max)
max=b;
if(c>max)
max=c;
printf("Máximo = %d\n",max);
}

float media(int a,int b,int c)


{
float s=soma(a,b,c);
float calc_media=(s/3);
return(calc_media);
}

int soma(int a,int b,int c)


{
printf("Soma = %d\n",a+b+c);
return(a+b+c);
}

figura 4.1 Programa em C exemplificando a utilização


de funções com passagem por valor.

A figura 4.2 mostra o resultado da execução do programa apresentado na figura 4.1. No


programa principal, o utilizador insere três valores inteiros para três variáveis (n1, n2 e
n3). Ainda no programa principal, são chamadas a função maximo, através da indica-
ção do seu nome, e a função media, através de uma instrução de saída. De seguida, a
função soma é chamada a partir da função media, através de uma instrução de atri-
buição. Estas funções maximo, soma e media determinam, respetivamente, o máximo,
a soma e a média dos três valores inseridos pelo utilizador. A função maximo efetua a
apresentação do resultado internamente, ou seja, não retorna um valor (tipo de dados
de retorno void), e cada uma das funções soma e media retorna um valor, respetiva-
mente, do tipo de dado int e float.

Indique um número inteiro 12


Indique um número inteiro 13
Indique um número inteiro 15
Máximo = 15
Soma = 40
Média = 13.333333

figura 4.2 Resultado (output) da


execução do programa
apresentado na figura 4.1.

70
Sub-rotinas

Na passagem por referência, ao ser chamada a função, os endereços de memória


das variáveis dos argumentos são passados às variáveis dos parâmetros da função.
Para tal, na chamada da função, a designação das variáveis dos argumentos é prece-
dida pelo operador unário & (endereço de), possibilitando a passagem dos endereços
de memória às variáveis dos parâmetros. Por outro lado, na função, as designações
das variáveis dos parâmetros são precedidas pelo asterisco (*), ou seja, são variáveis
do tipo ponteiro, com capacidade de armazenarem as posições de memória das variá-
veis dos argumentos. Desta forma, as alterações efetuadas nos dados das variáveis
dos parâmetros, através da execução da função, refletem-se nas variáveis dos argu-
mentos, ou seja, no programa principal.
Na declaração de funções com passagem por referência é utilizada, genericamente, a
estrutura apresentada no quadro 4.4.
quadro 4.4

Sintaxe tipo_de_retorno nome_da_função (<tipo_de_dado *nome_do_parâmetro, …>);


int soma(int *n1, int *n2);
float media(float *nota1, float *nota2);
Exemplos
conta_pares(int *x, int *y, int *z);
void maximo(int *x, float *y);

O quadro 4.5 apresenta a sintaxe e um exemplo da estrutura de uma função com passa-
gem por referência.
quadro 4.5

tipo_de_retorno nome_da_função (<tipo_de_dado *nome_do_parâmetro, …>)


{
Sintaxe
corpo da função
}
float media(float *x, float *y)
{
float m;
Exemplo
m=(*x+*y)/2;
return(m);
}

Ao contrário da chamada para execução de uma função, com passagem por valor, a
passagem por referência apresenta o operador unário & antes dos nomes das variá-
veis dos argumento. A chamada para execução de uma função por referência é feita
através de uma instrução de atribuição, uma instrução de saída de resultados ou pela
indicação do nome da função, caso o retorno seja do tipo de dado void, tal como exem-
plificado no quadro 4.6.

quadro 4.6

Instrução Exemplo

Atribuição m = soma(&a,&b);
COD12MD © Porto Editora

Saída de resultados printf ("Media = %f",media(&x,&y,&z));

Nome da função maximo(&n1,&n2);

71
Introdução à programação

O programa apresentado na figura 4.3 permite ao utilizador inserir dois números in-

COD12MD © Porto Editora


teiros. Depois, o programa efetua a troca e o cálculo do dobro da soma, por último,
apresenta os resultados.

#include <stdio.h>

void leitura(int *a,int *b); //Passagem por referência


int soma_dobro(int *n,int *m); //Passagem por referência
int diferenca(int a,int b); //Passagem por valor
void troca(int *x,int *y); //Passagem por referência

int main(void)
{
int n1=0,n2=0;
float media;
printf("Valor inicial das variáveis n1=%d e n2=%d\n",n1,n2);
leitura(&n1,&n2); //Passagem por referência
printf("Valor das variáveis após leitura de dados n1=%d e n2=%d\n",n1,n2);
troca(&n1,&n2); //Passagem por referência
printf("Valor das variáveis após a troca n1=%d e n2=%d\n",n1,n2);
//Passagem por referência
printf("Soma=%d após calcular o dobro de n1 e n2\n",soma_dobro(&n1,&n2));
//Passagem por valor
printf("Resultado da diferença de %d-%d=%d\n",n1,n2,diferenca(n1,n2));
}

void leitura(int *x, int *y) //Passagem por referência


{
printf("Insira um valor inteiro para a variável n1 ");
scanf("%d",x);
printf("Insira um valor inteiro para a variável n2 ");
scanf("%d",y);
}

int diferenca(int x, int y) //Passagem por valor


{
return(x-y);
}

void troca(int *x,int *y) //Passagem por referência


{
int temp;
temp=*x;
*x=*y;
*y=temp;
}

int soma_dobro(int *x, int *y) //Passagem por referência


{
int soma;
*x=*x*2;
*y=*y*2;
soma=*x+*y;
return(soma);
}

figura 4.3 Programa em C exemplificando a passagem de argumentos por referência e por valor.

72
Sub-rotinas

A figura 4.4 mostra o resultado (output) da execução do programa apresentado na


figura 4.3. A partir da função main(), é executada a chamada das funções leitura, troca
e soma_dobro, implementadas com a passagem da referência endereço de memória
dos argumentos (n1 e n2) para as variáveis do tipo apontador dos parâmetros (*x e *y),
permitindo, respetivamente, ao utilizador inserir dois valores inteiros, efetuar a troca,
realizar o cálculo do dobro e a respetiva soma.

De seguida, a partir da função main(), é chamada a função diferenca e os valores das


variáveis dos argumentos (n1 e n2) são passados para as variáveis dos parâmetros (x
e y). Nesta função é calculada a diferença das variáveis dos parâmetros (*x e *y) e é
retornado o resultado pela designação da função para a função main().

Valor inicial das variáveis n1= e n2=0


Insira um valor inteiro para a variável n1 2
Insira um valor inteiro para a variável n2 3
Valor das variáveis após leitura de dados n1=2 e n2=3
Valor das variáveis apos a troca n1=3 e n2=2
Soma=10 após calcular o dobro de n1 e n2
Resultado da diferenca de 6−4=2

figura 4.4 Resultado (output) da execução do programa apresentado na


figura 4.3.

Exercícios de aplicação 14
1‌ Classifique em verdadeira ou falsa cada uma das afirmações seguintes.
(A) As funções criadas pelo programador para serem executadas não têm de ser
chamadas.
(B) É possível criar funções sem parâmetros.
(C) Para criar uma função utiliza-se a palavra reservada func.
(D) Funções com parâmetros para a passagem de argumentos, permitem ao
programador controlar os dados que são passados.
(E) As funções podem ter parâmetros associados a tipos de dados.
(F) Os dados recebidos nas funções, através dos seus parâmetros, não podem
sofrer alterações nos seus valores.
(G) Uma função pode chamar outra, desde que esta seja declarada numa ordem
acima da que a chama.
(H) A passagem de argumentos pode ser por valor e por referência.
COD12MD © Porto Editora

73
Introdução à programação

COD12MD © Porto Editora


2‌ Indique a saída do seguinte código:
#include <stdio.h>

int n=7;

void ainf(int n);

int main(void)
{
ainf(5);
return 0;
}

void ainf(int n)
{
printf("%d",n);
}

(A) 5
(B) 7e5
(C) 7
(D) Nenhuma das anteriores

3‌ Qual das seguintes opções é a sintaxe correta para retornar o valor de uma
função?
(A)
void dev_val(int x, int y)
{
int c;
c=y+y;
}

(B)
int dev_val(int x, int y)
{
int c;
c=y+y;
}

(C) Nenhuma das opções anteriores.

4‌ Crie uma função que permita inserir o primeiro nome e a idade. Imprima uma
mensagem que informe o ano em que fará 100 anos.

74
Sub-rotinas

5‌ No programa seguinte, identifique os parâmetros da função apresenta.


#include <stdio.h>

float apresenta(int x, int y);

int main(void)
{
apresenta(5,20);
return 0;
}

float apresenta(int x, int y)


{
int i;
for(i=x;i<y;i++)
printf("%d ",i);
}

(A) x, y
(B) i
(C) y, i
(D) x, i.

6‌ Crie um programa, em C, que permita efetuar a leitura de dois números reais.


Mediante a seleção de uma opção (carácter alfanumérico) deve ser efetuada
uma operação aritmética, adição e multiplicação, onde é apresentado o resultado
da operação. Utilize uma estrutura de seleção múltipla (Case) para implementar
um menu com as seguintes opções:
a) Adição
b) Multiplicação
Caso seja selecionada uma opção diferente destas, será apresentada a mensagem
"Opção Inválida".
Utilize funções para organizar o código relativo a cada um das operações aritméticas.
Devem ser utilizadas as seguintes declarações:
float adicao (float a, float b);
float Multiplicacao (float a, float b);

4.2 Variáveis globais e variáveis locais


As variáveis podem ser globais ou locais.

As variáveis globais são declaradas no início do programa, e os seus valores podem


ser utilizados quer ao nível da função main() quer ao nível das outras funções do pro-
COD12MD © Porto Editora

grama.

As variáveis locais são declaradas dentro das funções main() e outras, sendo apenas,
utilizadas dentro da função em que foram declaradas.

75
Introdução à programação

O programa apresentado na figura 4.5 calcula a área de um retângulo a partir dos va-

COD12MD © Porto Editora


lores inseridos nas variáveis globais (comprimento e largura), utilizando a função
area com uma variável local (calc_area).

#include <stdio.h>
float comprimento, largura;
void area(void);

int main(void)
{
printf("Digite a medida em metros da largura do retângulo ");
scanf("%f",&largura);
printf("Digite a medida em metros do comprimento do retângulo ");
scanf("%f",&comprimento);
area();
return(0);
}

void area(void)
{
float calc_area;
calc_area=comprimento*largura;
printf("Area do retangulo = %1.2f metros quadrados\n",calc_area);
}

figura 4.5 Programa em C exemplificando a utilização de variáveis locais e globais.

A figura 4.6 mostra o resultado (output) da execução do programa apresentado na


figura 4.5. O utilizador insere dois valores reais em duas variáveis globais (comprimento
e largura). Após a inserção dos valores, é chamada para execução a função area, per-
mitindo calcular a área do retângulo a partir dos valores existentes nas variáveis glo-
bais comprimento e largura. Na função, para efetuar o cálculo da área, é declarada a
variável local calc_area. Por último, através de uma instrução de saída existente na
função, é apresentado o resultado guardado na variável calc_area, com a formatação
de duas casas decimais. De salientar que a função area não retorna um valor, tendo
sido declarada com o tipo de dado de retorno void, e a chamada da função é efetuada
indicando o seu nome.

Digite a medida em metros da largura do retângulo 4


Digite a medida em metros do comprimento do retângulo 5.5
Area do retangulo = 22.00 metros quadrados

figura 4.6 Resultado (output) da execução do programa apresentado na


figura 4.5.

76
Sub-rotinas

Exercícios de aplicação 15
1‌ Classifique em verdadeira ou falsa cada uma das afirmações seguintes.
(A) As sub-rotinas são conjuntos de instruções que são sempre executadas apenas
uma única vez.
(B) As funções são sub-rotinas, podendo apresentar parâmetros no início.
(C) Depois de executadas, as funções nunca devolvem um resultado através do seu
nome.
(D) As variáveis globais e locais são declaradas na parte declarativa das sub-rotinas.

2‌ No programa seguinte, identifique as variáveis globais e as variáveis locais.

#include <stdio.h>

int num1=4, num2=5;

void mult(void)

int main(void)
{
mult();
return 0;
}

void mult(void)
{
int calculo, num3=4;
calculo=num3*num1*num2;
printf("Cálculo = %d",calculo);
}

3‌ Crie um programa, em C, que permita efetuar a leitura de dois valores reais, para
as variáveis globais altura e base, correspondentes às medidas da altura e
comprimento da base de um triângulo. De seguida, é efetuado o cálculo da área
do triângulo, utilizando a função float area_triangulo() e é apresentado o
resultado.

4‌ Crie um programa, em C, que permita efetuar a leitura de dois valores reais, para
as variáveis globais comp e larg, correspondentes as medidas do comprimento e
da largura de um retângulo. De seguida, é efetuado o cálculo do perímetro do
retângulo, sendo apresentado o resultado na função perimetro_retangulo().
COD12MD © Porto Editora

77
Introdução à
programação

5  unções predefinidas
F
da linguagem C
A linguagem C tem um conjunto de funções organizadas por bibliotecas, de acordo

COD12MD © Porto Editora


com a sua finalidade, possibilitando a implementação de inúmeras operações. Nos
quadros 5.1 e 5.3 são apresentadas as principais funções, respetivamente, das bibliote-
cas string.h e math.h.

5.1 A biblioteca-padrão do C string.h


quadro 5.1

Função Descrição sintaxe

strlen Devolve o número de caracteres existente numa string strlen(str1);


(str1).

strcpy Copia str2 para str1, substituindo o seu conteúdo. strcpy(str1, str2);

strncpy Copia os primeiros n caracteres de str2 para str1. strncpy(str1,str2,n_caracteres);

strcat Devolve o resultado da concatenação (junção) de duas strcat(str1,str2);


strings, adicionando str2 no final de str1.

strcmp Compara str1 com str2, carácter a carácter da strcmp(str1, str2);


esquerda para a direita, utilizando o código ASCII e
devolve 0, <0 ou >0, respetivamente, se str1=str2,
str1<str2 ou str1>str2.

strncmp Compara os primeiros n caracteres str1 com str2, strcmp(str1,str2,n_caracteres);


carácter a carácter da esquerda para a direita,
utilizando o código ASCII, e devolve 0, <0 ou >0,
respetivamente, se str1=str2, str1<str2 ou str1>str2.

Nos programas apresentados nas figuras 5.1 a figura 5.12 são exemplificadas as opera-
ções das funções predefinidas sobre strings, descritas no quadro 5.1, devendo ser con-
sideradas as seguintes situações:

▪ As cadeias de caracteres, também conhecidas por strings, na linguagem C,


são, na realidade, vetores do tipo char terminados pelo carácter nulo '\0',
permitindo guardar em memória conjuntos ordenados de caracteres. Estes
conjuntos podem conter caracteres alfabéticos, numéricos e símbolos.
▪ Por defeito, para declarar uma string, é necessário, primeiro, indicar o tipo de
dado da variável, char, e, de seguida, o nome da variável e o número de
elementos da cadeia de caracteres [tamanho] quadro 5.2. Não é, contudo,
obrigatório definir o seu tamanho, quando na sua declaração se atribui uma
string ou caracteres individuais.

78
Funções predefinidas da linguagem C

▪ No C, as aspas são utilizadas para delimitar strings "Aplicações", enquanto as


plicas são utilizadas para delimitar caracteres 'A'.
▪ função scanf(), quando utilizada para ler uma string, a variável não é
A
precedida pelo operador unário & e termina a leitura ao ser inserido um espaço.
▪ A leitura de uma string com espaços pode ser efetuada, em alternativa,
através da função scanf() com a seguinte sintaxe:
scanf("%num_caracteres[^\n]", str);. Nesta função é utilizado o formato
"%num[^\n]", que indica ao compilador para aceitar no máximo num
caracteres, podendo terminar antes, caso seja encontrado o sinal de Enter
representado por '\n'.

quadro 5.2

Sintaxe tipo_de_dado nome_da_ variável[tamanho];

char nome[20];
Exemplos char pais_nasc[ ] = "Portugal";
char palavra[ ] = {'N', 'u', 'm', ' e', 'r', 'o', '\0'};

A figura 5.1 apresenta um programa que exemplifica a utilização da função strlen(), da


biblioteca string.h, que efetua o cálculo do número de caracteres existentes numa
string inserida pelo utilizador.

#include <stdio.h>
#include <string.h>
//Exemplo função strlen()

int main(void)
{
char frase1[100];
int num;

printf("Insira uma pequena frase:\n");


scanf("%100[^\n]",frase1);
printf("Contar o número de caracteres:\n");
printf("Inseriu %d caracteres na frase %s\n",num=strlen(frase1),frase1);

return(0);
}

figura 5.1 Programa em C exemplificando a utilização da função strlen().

A figura 5.2 mostra o resultado da execução do programa apresentado na figura 5.1. De


acordo com a string inserida pelo utilizador, é apresentado o resultado obtido pela uti-
lização da função strlen().

Insira uma pequena frase:


Bom dia
Contar o número de caracteres:
COD12MD © Porto Editora

Inseriu 7 caracteres na frase: Bom dia

figura 5.2 Resultado (output) da execução do


programa apresentado na figura 5.1.

79
Introdução à programação

A figura 5.3 apresenta um programa que exemplifica a utilização da função strcpy(), da

COD12MD © Porto Editora


biblioteca string.h, que efetua a cópia de uma string para outra.

#include <stdio.h>
#include <string.h>
//Exemplo função strcpy()

int main(void)
{
char frase1[100],frase2[100];

printf("Insira uma pequena frase:\n");


scanf("%100[^\n]",frase2);
strcpy(frase1,frase2);
printf("String copiada: %s\n",frase1);

return(0);
}

figura 5.3 Programa em C exemplificando a utilização


da função strcpy).

A figura 5.4 mostra o resultado da execução do programa apresentado na figura 5.3. De


acordo com a string inserida pelo utilizador, é apresentado o resultado obtido pela uti-
lização da função strcpy().

Insira uma pequena frase:


Tecnologias de Informação
String copiada: Tecnologias de Informação

figura 5.4 Resultado (output) da execução do programa


apresentado na figura 5.3.

A figura 5.5 apresenta um programa que exemplifica a utilização da função strncpy(),


da biblioteca string.h, que efetua a cópia dos primeiros num caracteres de uma
string para outra.

#include <stdio.h>
#include <string.h>
//Exemplo função strncpy()
int main(void)
{
char frase1[100]="Marte (planeta)";
char frase2[100];
int num;

printf("Insira uma pequena frase:\n");


scanf("%100[^\n]",(frase2));
printf("Indique quantos caracteres pretende copiar: ");
scanf("%d",&num);
strncpy(frase1,frase2,num);
printf("Resultado da cópia: %s\n",frase1);

return(0);
}

figura 5.5 Programa em C exemplificando a utilização da função strncpy).

80
Funções predefinidas da linguagem C

A figura 5.6 mostra o resultado da execução do programa apresentado na figura 5.5. De


acordo com a string inserida pelo utilizador, é apresentado o resultado obtido pela uti-
lização da função strncpy().

Insira uma pequena frase:


Venus
Indique quantos caracteres pretende copiar: 5
Resultado da cópia: Venus (planeta)

figura 5.6 Resultado (output) da execução do programa


apresentado na figura 5.5.

A figura 5.7 apresenta um programa que exemplifica a utilização da função strcat(), da


biblioteca string.h, que efetua a concatenação de três strings, através da utilização
de duas funções.

#include <stdio.h>
#include <string.h>
//Exemplo função strcat()

int main(void)
{
char frase1[50]="Aplicações ";
char frase2[50]="Informáticas B";
char frase3[50]=" 12º Ano";
int num;

strcat(frase1,frase2);
printf("Juntar strings: %s\n", frase1);
strcat(frase1,frase3);
printf("Juntar strings: %s\n", frase1);

return 0;
}

figura 5.7 Programa em C exemplificando a utilização


da função strcat().

A figura 5.8 mostra o resultado da execução do programa apresentado na figura 5.7. O


programa exemplifica a concatenação de strings, com recurso à função strcat(), que
mostra a string resultante da concatenação do conteúdo de três variáveis, inicializadas
quando declaradas.

Juntar strings: Aplicações Informáticas B


Juntar strings: Aplicações Informáticas B 12º Ano

figura 5.8 Resultado (output) da execução do programa


COD12MD © Porto Editora

apresentado na figura 5.7.

A figura 5.9 apresenta um programa que exemplifica a utilização da função strcmp(), da


biblioteca string.h, que efetua a comparação de duas strings.

81
Introdução à programação

COD12MD © Porto Editora


#include <stdio.h>
#include <string.h>
//Exemplo função strcmp()

int main(void)
{
char frase1[]= {"Psicologia"};
char frase2[]= {"Psicologia"};
int resultado;
resultado=strcmp(frase1,frase2);
if (resultado==0)
printf("As strings são iguais\n");
else
printf("As strings são diferentes\n");

return(0);
}

figura 5.9 Programa em C exemplificando a utilização


da função strcmp().

A figura 5.10 mostra o resultado da execução do programa apresentado na figura 5.9. O


programa exemplifica a comparação de strings, com recurso à função strcmp(), que
mostra o resultado da comparação do conteúdo de duas variáveis do tipo string, inicia-
lizadas quando declaradas.

As strings são iguais

figura 5.10 Resultado (output) da


execução do programa
apresentado na figura 5.9.

A figura 5.11 apresenta um programa que exemplifica a utilização da função strncmp(),


da biblioteca string.h, que efetua a comparação dos primeiros num caracteres de
duas strings.

#include <stdio.h>
#include <string.h>
//Exemplo função strncmp()

int main(void)
{
char frase1[]="Linguagem C", frase2[100];
int num,resultado;

printf("Insira uma pequena frase:\n");


scanf("%100[^\n]",frase2);
printf("Indique quantos caracteres pretende comparar: ");
scanf("%d",&num);
resultado=strncmp(frase1,frase2,num);
printf("Resultado da comparação\n");
if (resultado==0)
printf("Conjunto indicado de caracteres iguais\n");
else
printf("Conjunto indicado de caracteres diferentes\n");

return(0);
}

figura 5.11 Programa em C exemplificando a utilização da função strncmp().

82
Funções predefinidas da linguagem C

A figura 5.12 mostra o resultado da execução do programa apresentado na figura 5.11. O


programa exemplifica a comparação dos primeiros num caracteres de duas strings,
com recurso à função strncmp(), que mostra o resultado da comparação do conteúdo
de duas variáveis do tipo string, sendo, neste caso, uma inicializada quando declarada
e a outra cujo conteúdo foi inserido pelo utilizador.

Insira uma pequena frase:


Linguagem
Indique quantos caracteres pretende comparar: 6
Resultado da comparação
Conjunto indicado de caracteres iguais

figura 5.12 Resultado (output) da execução do programa


apresentado na figura 5.11.

5.2 Funções matemáticas


A biblioteca math, integrada por defeito na biblioteca-padrão do C, permite aceder a
um conjunto de funções e constantes matemáticas. Através destas funções, é possível
realizar operações: trigonométricas, hiperbólicas, logarítmicas de potenciação e arre-
dondamentos.

O quadro 5.3 apresenta algumas das funções matemáticas mais comuns da linguagem C.

quadro 5.3

Função Descrição

pow() Função que calcula a potência da base elevada ao expoente.

sqrt() Função que calcula a raiz quadrada de um número.

round() Função que retorna o valor inteiro mais próximo do argumento.

trunc() Função que retorna a parte inteira de um argumento.

floor() Função que arredonda para baixo um número.

ceil() Função que arredonda para cima um número.

sin() Função que calcula o seno de um ângulo em radianos.

cos() Função que calcula o cosseno de um ângulo em radianos.

tan() Função que calcula a tangente de um ângulo em radianos.


COD12MD © Porto Editora

log10() Função que calcula o logaritmo base 10 de um argumento.

exp() Função que calcula o expoente de e elevado a X.

83
Introdução à programação

Nos programas apresentados nas figuras 5.13 e 5.34 são exemplificadas as principais

COD12MD © Porto Editora


operações predefinidas sobre as funções matemática.

A figura 5.13 apresenta um programa que exemplifica a utilização da função pow(), da


biblioteca math.h, que efetua o cálculo da área do quadrado.

#include <stdio.h>
#include <math.h>
//Cálculo da área de um quadrado

int main(void)
{

float area,lado;

printf("Digite o tamanho do lado de um quadrado (em metros): ");


scanf("%f",&lado);
area=pow(lado,2);
printf("A área do quadrado é %f metros quadrados",area);

return 0;
}

figura 5.13 Programa em C exemplificando a função pow().

A figura 5.14 mostra o resultado da execução do programa apresentado na figura 5.13.


Depois do valor inserido pelo utilizador, é efetuado o cálculo da medida da área do
quadrado, com recurso à função pow(). De seguida, apresenta a mensagem com a
medida da área do quadrado.

Digite o tamanho do lado de um quadrado (em metros): 12


A área do quadrado é 144.000000 metros quadrados"

figura 5.14 Resultado (output) da execução do programa apresentado na


figura 5.13.

A figura 5.15 apresenta um programa que exemplifica a utilização da função sqrt(), da


biblioteca math.h, que efetua o cálculo do lado de um quadrado.

#include <stdio.h>
#include <math.h>
//Cálculo da medida do lado de um quadrado

int main(void)
{
float area, lado;

printf("Digite a medida da área do quadrado (em metros quadrados): ");


scanf("%f",&area);
lado=sqrt(area);
printf("A medida do lado do quadrado é %f metros",lado);

return 0;
}

figura 5.15 Programa em C exemplificando a função sqrt.

84
Funções predefinidas da linguagem C

A figura 5.16 mostra o resultado da execução do programa apresentado na figura 5.15.


Depois do valor inserido pelo utilizador, é efetuado o cálculo da medida do lado do
quadrado, com recurso à função sqrt(). De seguida, apresenta a mensagem com a
medida do lado do quadrado.

Digite a medida da área do quadrado (em metros quadrados): 144


A medida do lado do quadrado é 12.000000 metros

figura 5.16 Resultado (output) da execução do programa apresentado na figura 5.15.

A figura 5.17 apresenta um programa que exemplifica a utilização da função round(), da


biblioteca math.h, que efetua o arredondamento de um determinado valor real para
o valor mais próximo.

#include <stdio.h>
#include <math.h>
//Exemplo da função round()
int main(void)
{
float num,resultado;
printf("Insira um número real: ");
scanf("%f",&num);
resultado=round(num); //Arredonda
printf("Número arredondado: %f\n",resultado);
return 0;
}

figura 5.17 Programa em C exemplificando a função round().

A figura 5.18 mostra o resultado da execução do programa apresentado na figura 5.17.


Depois do valor inserido pelo utilizador é efetuado o cálculo do arredondamento de
um número, com recurso à função round(). De seguida, apresenta a mensagem com
o valor arredondado.

Insira um número real: 13.65


Número arredondado: 14.000000
COD12MD © Porto Editora

figura 5.18 Resultado (output) da execução do


programa apresentado na figura 5.17.

A figura 5.19 apresenta um programa que exemplifica a utilização da função trunc(), da


biblioteca math.h, que trunca um valor real.

85
Introdução à programação

COD12MD © Porto Editora


#include <stdio.h>
#include <math.h>
//Exemplo da função trunc()

int main(void)
{
float num;
int resultado;

printf("Insira um número real: ");


scanf("%f",&num);
resultado=trunc(num); // Truncar
printf("Número truncado: %d\n",resultado);

return 0;
}

figura 5.19 Programa em C exemplificando a função


trunc().

A figura 5.20 mostra o resultado da execução do programa apresentado na figura 5.19.


Trunca o valor real inserido pelo utilizador e retorna a parte inteira desse valor, com
recurso à função trunc().

Insira um número real: 23.45


Número truncado: 23

figura 5.20 Resultado (output) da


execução do programa
apresentado na figura 5.19.

A figura 5.21 apresenta um programa que exemplifica a utilização da função floor(), da


biblioteca math.h, que permite arredondar para baixo um valor real.

#include <stdio.h>
#include <math.h>
//Exemplo da função floor()

int main(void)
{

float num;
double resultado;

printf("Insira um número real: ");


scanf("%f",&num);
resultado=floor(num);
printf("Arredondar para baixo: %lf\n",resultado);

return 0;
}

figura 5.21 Programa em C exemplificando a função floor().

A figura 5.22 mostra o resultado da execução do programa apresentado na figura 5.21.


Depois do valor inserido pelo utilizador, este é arredondado para baixo, com recurso à
função floor(). De seguida, apresenta a mensagem com o valor arredondado para baixo.

86
Funções predefinidas da linguagem C

Insira um número real: 45.679


Arredondar para baixo: 45.000000

figura 5.22 Resultado (output) da execução


do programa apresentado na
figura 5.21.

A figura 5.23 apresenta um programa que exemplifica a utilização da função ceil(), da


biblioteca math.h, que permite arredondar para cima um valor real.

#include <stdio.h>
#include <math.h>
//Exemplo da função ceil()

int main(void)
{
float num;
double resultado;

printf("Insira um número real: ");


scanf("%f",&num);
resultado=ceil(num);
printf("Arredondar para cima: %.0lf\n",resultado);

return 0;
}

figura 5.23 Programa em C exemplificando a função ceil().

A figura 5.24 mostra o resultado da execução do programa apresentado na figura 5.23.


Depois do valor inserido pelo utilizador, este é arredondado para cima, com recurso à
função ceil(). De seguida, apresenta a mensagem com o valor arredondado para cima.

Insira um número real: 45.679


Arredondar para cima: 46

figura 5.24 Resultado (output) da


execução do programa
apresentado na figura 5.23.

A figura 5.25 apresenta um programa que exemplifica a utilização da função sin(), da biblio-
teca math.h, que permite calcular o seno de um determinado ângulo em radianos.

#include <stdio.h>
#include <math.h>
//Exemplo da função seno()

int main()
{
double valor=3.14159/2;
printf("Valor de Seno de 180 graus = %f",sin(valor));
COD12MD © Porto Editora

return 0;
}

figura 5.25 Programa em C exemplificando a função sin().

87
Introdução à programação

A figura 5.26 mostra o resultado da execução do programa apresentado na figura 5.25.

COD12MD © Porto Editora


Depois de atribuir um número à variável valor, é efetuado o cálculo do seno, recor-
rendo à função sin() e apresenta a mensagem com o valor do seno.

Valor de Seno de 180 graus = 1.000000

figura 5.26 Resultado (output) da execução do


programa apresentado na figura 5.25.

A figura 5.27 apresenta um programa que exemplifica a utilização da função cos(), da


biblioteca math.h, que permite calcular o cosseno de um determinado ângulo em
radianos.

#include <stdio.h>
#include <math.h>
//Exemplo da função cos()

int main(void)
{

double valor=0;
printf("Valor de cosseno de 0 graus = %f\n\n",cos(valor));
return 0;
}

figura 5.27 Programa em C exemplificando a função cos().

A figura 5.28 mostra o resultado da execução do programa apresentado na figura 5.27.


Depois de atribuir um número à variável valor, é efetuado o cálculo do cosseno, recor-
rendo à função cos() e apresenta a mensagem com o valor do cosseno.

Valor de cosseno de 0 graus = 1.000000

figura 5.28 Resultado (output) da execução do


programa apresentado na figura 5.27.

A figura 5.29 apresenta um programa que exemplifica a utilização da função tan(), da


biblioteca math.h, que permite calcular a tangente de um determinado valor.

#include <stdio.h>
#include <math.h>
//Exemplo da função tan()

int main(void)
{
double valor=3.141592/4;
printf("Valor de tangente de 45 graus = %f\n",tan(valor));
return 0;
}

figura 5.29 Programa em C exemplificando a função tan().

88
Funções predefinidas da linguagem C

A figura 5.30 mostra o resultado da execução do programa apresentado na figura 5.29.


Depois de atribuir um número à variável valor, é apresentado o resultado do cálculo da
tangente, recorrendo à função tan().

Valor de tangente de 45 graus = 1.000000

figura 5.30 Resultado (output) da execução do


programa apresentado na figura 5.29.

A figura 5.31 apresenta um programa que exemplifica a utilização da função log(), da


biblioteca math.h, que permite calcular o logaritmo de um valor na base 10.

#include <stdio.h>
#include <math.h>
//Exemplo da função log10()

int main(void)
{
double valor=100,resultado;
printf("O Logaritmo de %.0f na base 10 é %.0f",valor,log10(valor));
return(0);
}

figura 5.31 Programa em C exemplificando a função log10().

A figura 5.32 mostra o resultado da execução do programa apresentado na figura 5.31.


Depois de inicializar a variável valor e efetuar o cálculo do logaritmo na base 10, recor-
rendo à função log10() é apresentado o resultado formatado com zero casas decimais.

O Logaritmo de 100 na base 10 é 2

figura 5.32 Resultado (output) da execução


do programa apresentado na
figura 5.31.

A figura 5.33 apresenta um programa que exemplifica a utilização da função exp(), da


biblioteca math.h, que permite calcular o expoente de um determinado valor.

#include <stdio.h>
#include <math.h>
//Exemplo da função exp()

int main()
{
double valor=1;

printf("O expoente de %f é %lf\n",valor,exp(valor));


COD12MD © Porto Editora

return(0);
}

figura 5.33 Programa em C exemplificando a função exp().

89
Introdução à programação

A figura 5.34 mostra o resultado da execução do programa apresentado na figura 5.33.

COD12MD © Porto Editora


Depois de inicializar a variável valor, efetua-se o cálculo do expoente, recorrendo à
função exp().

O expoente de 1.000000 é 2.718282

figura 5.34 Resultado (output) da execução


do programa apresentado na
figura 5.33.

Exercícios de aplicação 16
1‌ Classifique em verdadeiras ou falsas cada uma das seguintes afirmações.
(A) As cadeias de caracteres são vetores do tipo int.
(B) Para declarar uma string é necessário, primeiro, indicar o tipo de dado.
(C) As aspas são utilizadas para delimitar strings.
(D) As plicas são utilizadas para delimitar caracteres.

2‌ Crie um programa, em C, que permita ler uma string e calcular o seu


comprimento, sendo a string inseridos pelo utilizador.

3‌ Elabore um programa em C que permita calcular a expressão z= (x+y), sendo


os valores, inseridos pelo utilizador.

4‌ Elabore um programa em C cujo valor inserido pelo utilizador seja do tipo float e
mostre a parte inteiro do valor.

5‌ Elabore um programa em C que permita calcular o quadrado de um número


inserido pelo utilizador.

6‌ Elabore um algoritmo para realizar o cálculo do perímetro


Perímetro = 2 * PI * Raio.

90
Introdução à
programação

6 Arrays
Os arrays são variáveis, identificados por um nome, que contêm um conjunto de ele-
mentos do mesmo tipo. Estes são acessíveis através do respetivo nome e da variável
de índice correspondente à sua posição no array. Os arrays simplificam a utilização de
muitas variáveis do mesmo tipo a guardar em memória, com designações diferentes,
agrupando-as numa única variável.

Os arrays podem ter mais do que uma dimensão. Os mais utilizados são os arrays uni-
dimensionais (vetores) e arrays bidimensionais (matrizes).

6.1 Vetores
Os vetores (arrays unidimensionais) têm uma dimensão, utilizando, por isso, apenas
uma variável de índice, começando sempre por zero, para o acesso aos seus elemen-
tos.

O quadro 6.1 apresenta o exemplo do vetor km que guarda seis valores numéricos float,
correspondentes à medida de seis distâncias. Para tal, é utilizado um índice (variável i)
para aceder a cada um dos elementos deste vetor (km[i]).

quadro 6.1

i 0 1 2 3 4 5

km[i] km[0] km[1] km[2] km[3] km[4] km[5]

km 130 150 185 190 145 155

6.1.1 Operações com vetores


A declaração de vetores é efetuada, previamente à sua utilização.

Para declarar um vetor, é necessário, primeiro, indicar o tipo de dado da variável (array
unidimensional) e, de seguida, o nome da variável e o número de elementos do vetor
([tamanho]) quadro 6.2.

quadro 6.2

Sintaxe tipo_de_dado nome[tamanho];

Exemplos float km[6];


COD12MD © Porto Editora

No exemplo, apresentado no quadro 6.2, é declarada uma variável (array unidimensional)


com o nome km, do tipo array e com intervalo de índice de 0 a 5.

91
Introdução à programação

O quadro 6.3 apresenta a sintaxe das instruções de leitura, de escrita e de atribuição

COD12MD © Porto Editora


de um vetor.

quadro 6.3

Leitura scanf("%f", &km[a]);

Escrita printf("km =%f",km[a]);

Atribuição km[3]=100;

O programa apresentado na figura 6.1 calcula a distância total percorrida em cinco


viagens cuja distância é inserida pelo utilizador. Posteriormente, volta a calcular a
distância total e a apresentar os valores da distância percorrida em cada uma das
viagens, tendo em conta uma alteração ao conteúdo do vetor na posição do índice
três, com a atribuição do valor 100.

#include<stdio.h>

int main(void)
{

float total=0,km[5];
int a;

printf("Digite a distância percorrida (km) em cada uma das cinco viagens\n");

for(a=0;a<5;a++)
{
printf("Viagem %d ",a);
scanf("%f", &km[a]);
total+=km[a];
}

printf("O total de km percorridos nas cinco viagens é %.2f",total);

km[3]=100;
total=0;

for(a=0;a<5;a++)
{
printf("\nkm %d = %1.2f",a,km[a]);
total+=km[a];
}

printf("\nO total de km percorridos nas cinco viagens é %.2f",total);

return 0;
}

figura 6.1 Programa em C exemplificando a utilização de um vetor.

No programa em C apresentado na figura 6.1, as instruções assinaladas dentro dos re-


tângulos a vermelho têm as seguintes finalidades:

▪ no primeiro retângulo, o primeiro ciclo For permite ao utilizador inserir os


valores relativos às distâncias percorridas para o vetor km. Permite, também,
efetuar o cálculo do total das distâncias percorridas (total);

92
Arrays

▪ no segundo retângulo, a instrução de atribuição coloca no vetor km, índice 3, o


valor 100;
▪ no último retângulo, após a atribuição anterior e a inicialização da variável
total a 0, o segundo ciclo For permite a listagem atualizada de todo o
conteúdo do vetor km e mostra o novo valor da variável total.

A figura 6.2 apresenta o resultado da execução do programa apresentado na figura 6.1,


para os valores inseridos pelo utilizador.

Digite a distância percorrida (km) em cada uma das cinco viagens


Viagem 0 4
Viagem 1 5
Viagem 2 6
Viagem 3 23
Viagem 4 56
O total de km percorridos nas cinco viagens é 94.00
km 0 = 4.00
km 1 = 5.00
km 2 = 6.00
km 3 = 100.00
km 4 = 56.00
O total de km percorridos nas cinco viagens é 171.00

figura 6.2 Resultado (output) da execução do programa apresentado na figura 6.1.

Exercícios de aplicação 17
1‌ Elabore um programa que permita declarar um vetor de 6 elementos (array
unidimensional) para registar as temperaturas verificadas em seis dias
sucessivos, a uma determinada hora numa cidade.
a) Utilize a seguinte declaração para o vetor: float temp [6].
b) Crie a função Insira, para permitir ao utilizador digitar as seis temperaturas para
o vetor, apresentadas no exemplo ao lado.
c) Crie a função TempMax, para determinar a temperatura máxima.
d) Crie a função TempMin, para determinar a temperatura mínima.
e) Crie a função Listagem, para efetuar a listagem de forma semelhante à
apresentada no exemplo seguinte.

Dia Temperatura
1 23
2 20
3 18
4 15
5 20
COD12MD © Porto Editora

6 27

93
Introdução à programação

COD12MD © Porto Editora


f) Crie a função CalcMedia, para efetuar o cálculo da média das temperaturas
registadas nos seis dias.
g) Crie a função Sup20, para determinar a quantidade de temperaturas superiores
a 20ºC.

2‌ Responda às alíneas, tendo em atenção a seguinte estrutura do vetor


temperaturas.

26,5 10,2 2,50 17,5

a) Indique qual a posição cuja temperatura é igual a 2,50.


b) Indique qual a posição da temperatura mínima registada no vetor.
c) Calcule a diferença entre as temperaturas máxima e mínima das registadas no
vetor.
d) Declare o vetor, tendo em atenção o tipo de dado dos valores dos elementos
apresentados.

6.2 Matrizes
As matrizes, arrays bidimensionais, têm duas dimensões, utilizando, por isso, duas variá-
veis de índice, uma para a linha e outra para a coluna, para o acesso aos seus elementos.
A sua representação gráfica corresponde a uma tabela de dupla entrada (linha × coluna).

O quadro 6.4, apresenta o exemplo da matriz classifica que guarda 15 números do tipo
inteiro, correspondentes às classificações da disciplina de Aplicações Informáticas.
Estas classificações referem-se a três períodos de um ano letivo (linhas) de cinco alu-
nos de uma turma (colunas). Para tal, são utilizados dois índices (variáveis l e c) para
aceder a cada um dos elementos da matriz (classifica[l,c]).

quadro 6.4

C
L 0 1 2 3 4

classifica[0,0] classifica[0,1] classifica[0,2] classifica[0,3] classifica[0,4]


0
12 14 16 17 13

classifica[1,0] classifica[1,1] classifica[1,2] classifica[1,3] classifica[1,4]


1
15 13 17 19 15

classifica[2,0] classifica[2,1] classifica[2,2] classifica[2,3] classifica[2,4]


2
16 15 16 19 16

6.2.1 Operações básicas com matrizes


A declaração das matrizes deve ser feita previamente à sua utilização e de acordo
com o tipo de dado, são alocadas posições sequenciais de memória.

Para declarar uma matriz (array bidimensional), é necessário, primeiro, indicar o tipo
de dado da variável e, de seguida, o nome da variável e o número de elementos da ma-
triz [nº linhas] [nº colunas] quadro 6.5.

94
Arrays

quadro 6.5

Sintaxe tipo_de_dado nome_da_variável [nº linhas][nº colunas];

Exemplos int classifica[5][3];

No exemplo apresentado no quadro 6.5, é declarada uma variável com o nome classifica,
do tipo de dado inteiro e com os intervalos de índices 0 a 4 (linhas) e 0 a 2 (colunas).

O quadro 6.6 apresenta a sintaxe das instruções de leitura, de escrita e de atribuição


a uma matriz.
quadro 6.6

Sintaxe Exemplo

Atribuição nome [linha][coluna]:=valor; Total[0][1] = 10;

Leitura scanf("%d", &nome[linha][coluna]); scanf("%d", &classifica[l][c]);

Escrita printf("%d", nome[linha][coluna]); printf("classifica =%d",classifica[l][c]);

O programa apresentado na figura 6.3 permite inserir seis temperaturas pelo utiliza-
dor. Depois, são efetuadas duas alterações em dois valores da matriz. Por último,
apresenta duas listagens.

#include<stdio.h>

int main(void)
{

float temperatura[2][3];
float total,media;
int l,c;

printf("Digite os 6 valores de temperaturas\n");

for(l=0;l<2;l++)
for(c=0;c<3;c++)
{
printf("Dia %d registo %d = ",c,l);
scanf("%f",&temperatura[l][c]);
}
printf("\nAtribuicao do valor 10 para temperatura[1,0] temperatura[0,1]]\n");
temperatura[1][0]=10;
temperatura[0][1]=10;
total=0;
printf("\nListagem dos valores de temperaturas da matriz, apos alteração dos
valores\n");
for(l=0;l<2;l++)
for(c=0;c<3;c++)
printf("Dia %d registo %d = %f\n",c,l,temperatura[l][c]);
printf("\nListagem dos valores de temperaturas superiores a 10 da matriz\n");
for(l=0;l<2;l++)
for(c=0;c<3;c++)
if(temperatura[l][c]>10)
printf("Dia %d registo %d = %f\n",c,l,temperatura[l][c]);
COD12MD © Porto Editora

return(0);
}

figura 6.3 Programa em C exemplificando a utilização de uma matriz.

95
Introdução à programação

De realçar que numa matriz, para referenciar os seus elementos, é necessário fazer

COD12MD © Porto Editora


variar os valores de duas variáveis de índice relativas às linhas e às colunas. Neste sen-
tido, é necessário utilizar dois ciclos, sendo o mais adequado o ciclo For.

No exemplo apresentado na figura 6.3, o ciclo For (l=0;l<2;l++) representa o índice rela-
tivo às linhas (l) e o ciclo For (c=0;c<3;c++) representa o índice relativo às colunas (c).
Sempre que se efetuar uma operação que envolva percorrer todos os elementos da
matriz, é necessário utilizar os dois ciclos.

A figura 6.4 mostra o ecrã resultante da execução do programa apresentado na figura 6.3.
Depois dos valores inseridos, na matriz temperatura, com seis elementos (Li-
nhas × Colunas => 2 × 3 => 6), são realizadas duas atribuições, ambas de valor 10, a
duas posições da matriz, identificadas pela linha 1, coluna 0, e pela linha 0, coluna 1.
Após as atribuições, é efetuada uma listagem de todos os valores da matriz. Por úl-
timo, é efetuada a listagem dos valores superiores a 10 da matriz.

Digite os 6 valores de temperaturas


Dia 0 registo 0 =12
Dia 1 registo 0 =22
Dia 2 registo 0 =13
Dia 0 registo 1 =6
Dia 1 registo 1 =7
Dia 2 registo 1 =11

Atribuicao do valor 10 para temperatura[1,0] temperatura[0,1]

Listagem dos valores de temperaturas da matriz, apos alteração dos valores


Dia 0 registo 0 = 12.000000
Dia 1 registo 0 = 10.000000
Dia 2 registo 0 = 23.000000
Dia 0 registo 1 = 10.000000
Dia 1 registo 1 = 7.000000
Dia 2 registo 1 = 11.000000

Listagem dos valores de temperaturas superiores a 10 da matriz


Dia 0 registo 0 = 12.000000
Dia 2 registo 0 = 23.000000
Dia 2 registo 1 = 11.000000

figura 6.4 Resultado (output) da execução do programa apresentado na figura 6.3.

96
Arrays

Exercícios de aplicação 18
1‌ Responda às alíneas, tendo em atenção a seguinte estrutura da matriz km.

11 102 250 170


130 120 146 1400
140 121 118 1425

a) Indique qual a posição (linha e coluna) cujos quilómetros são iguais a 146.
b) Indique qual a posição (linha e coluna) da máxima distância registada na matriz.
c) Calcule a diferença entre as distâncias máxima e mínima das registadas na
matriz.
d) Declare a matriz, tendo em atenção os valores dos elementos apresentados.

2‌ Classifique em verdadeira ou falsa cada uma das afirmações seguintes, relativas


aos elementos de um array implementado na linguagem C.
(A) Têm de ser todos do mesmo tipo de dados;
(B) Só podem ser do tipo de dados inteiro;
(C) Podem ser de diferentes tipos de dados;
(D) A sua localização é indicada entre parêntesis retos.

3‌ Indique o resultado do seguinte código.


#include <stdio.h>
int main(void)
{
char texto[]="Multimédia";
int p;
for(p=1;p<=4;p++)
{
printf("%c",texto[p]);
}
return 0;
}

(A) Média.
(B) Ulti.
(C) Multi.
(D) Multimédia.
COD12MD © Porto Editora

97
Introdução à programação

COD12MD © Porto Editora


4‌ Indique o resultado (output) do seguinte código.
#include <stdio.h>
int main(void)
{
int c1[6]={2,10,4,12,4,1};
int p,prod=1, soma=0;
for(p=0;p<6;p++)
{
prod*=c1[p];
}
printf("%d\n",prod);
return 0;
}

(A) 3940
(B) 3840
(C) 3324
(D) 1724

5‌ Elabore um programa, em C, que permita criar um array unidimensional e execute


as operações seguintes.
a1=[12,10,4]
a) Calcule o produto dos seus elementos.
b) Calcule a soma dos seus elementos.

6‌ Elabore um programa, em C, que permita declarar uma matriz (array


bidimensional) de 2 colunas por 3 linhas para registar as classificações de 2
alunos em 3 disciplinas (o número do aluno corresponde ao número da linha e o
número da disciplina corresponde ao número da coluna).
O programa tem de permitir:
a) inserir as classificações;
b) mostrar a classificação de um aluno a uma disciplina;
c) mostrar todas as classificações de um aluno;
d) calcular a média de um aluno;
e) calcular a média de uma disciplina;
f) determinar qual a nota máxima de um aluno, indicando a disciplina em que se
registou.

98

Você também pode gostar