(Parte 1 de 9)

Apontamentos de Programação em C/C++ Paulo Baltarejo e Jorge Santos

Instituto Superior de Engenharia do Porto Departamento de Engenharia Informática

Versão Draft – Março de 2006

Aviso de licença de utilização: Este documento pode ser utilizado livremente para fins não comerciais, é permitido aos seus utilizadores, copiar, distribuir e exibir publicamente os seus conteúdos, desde que sejam ressalvados os direitos de autor do mesmo, nomeadamente, deverá ser sempre incluída esta página em todas as cópias. Paulo Baltarejo e Jorge Santos, 2006 i i

Índice

1.1 História da linguagem C/C++1
1.2 Estrutura de um programa em C++1
1.3 Criação de um programa em C++3
1.4 Modelo de compilação da linguagem C++4
1.5 Variáveis, Tipos de dados e Constantes4
1.5.1 Variáveis5
1.5.2 Tipos de dados6
1.5.3 Declaração de variáveis6
1.5.4 Constantes8
1.5.4.1 Literais8
1.5.4.2 Definidas9
1.5.4.3 Declaradas10
1.6 Estruturas de controlo1
1.6.1 Instruções de Sequência1
1.6.1.1 Operadores aritméticos12
1.6.1.2 Operadores relacionais e lógicos13
1.6.2 Exercícios Resolvidos16
1.6.2.1 Distância euclidiana entre dois pontos16
1.6.2.2 Determinar perímetro e área de circunferência17
1.6.3 Exercícios Propostos17
1.6.3.1 Calcular índice de massa corpórea (IMC)17
1.6.3.2 Converter horas, minutos e segundos18
1.6.3.3 Teorema de Pitágoras18
1.6.3.4 Converter temperaturas18
1.6.4 Instruções de Decisão18
1.6.4.1 Decisão binária18
1.6.4.2 Decisão múltipla19
1.6.5 Prioridade dos operadores21
1.6.6 Exercícios Resolvidos2
1.6.6.1 Distância euclidiana entre dois pontos2
1.6.6.2 Classificar em função da média23
1.6.6.3 Determinar o máximo de 3 valores23
1.6.6.4 Determinar triângulo válido24
1.6.7 Exercícios Propostos25
1.6.7.1 Classificar triângulo25
1.6.7.2 Divisão25
1.6.7.3 Resolver equação da forma ax2 + bx + c = 025

1 Programação em C/C++ 1 i

1.6.7.5 Calcular índice de massa corpórea (IMC)26
1.6.7.6 Determinar ano bissexto26
1.6.7.7 Parque de estacionamento26
1.6.8 Instruções de Repetição27
1.6.8.1 Instrução do-while27
1.6.8.2 Instrução while28
1.6.8.3 Instrução for28
1.6.9 Exercícios Resolvidos30
1.6.9.1 Calcular somatório entre dois limites30
1.6.9.2 Calcular factorial de um número31
1.6.9.3 Determinar se um número é primo32
um grupo32
notas de uma turma3
1.6.10 Exercícios Propostos34
1.6.10.1 Divisão através de subtracções sucessivas34
1.6.10.2 Determinar o máximo e mínimo de uma série35
1.6.10.3 Determinar quantidade de números primos35
1.6.10.4 Determinar se um número é perfeito35
1.6.10.5 Calcular potência por multiplicações sucessivas35
1.6.10.6 Maior número ímpar de uma sequência de valores35
1.6.10.7 Algarismos de um número35
1.6.10.8 Apresentação gráfica de temperaturas35
1.6.10.9 Soma dos algarismo de um número36
1.6.10.10 Jogo de adivinhar o número36
1.6.10.1 Capicua de um número36
1.6.10.12 Conversão de base numérica36
1.7 Funções36
1.7.1 Âmbito da variáveis – global e local38
1.7.2 Passagem de argumentos41
1.7.2.1 Passagem por valor41
1.7.2.2 Passagem por referência42
1.7.2.3 Valores por omissão nos argumentos43
1.7.3 Protótipos de funções4
1.7.4 Estrutura de um programa em C++45
1.7.5 Exercícios resolvidos46
1.7.5.2 Função que indica se um número é perfeito46
1.7.6 Exercícios propostos47
1.7.6.1 Função média de dois números47
1.7.6.2 Função lei de Ohm47
1.7.6.3 Função somatório48
1.7.6.4 Funções para codificar e descodificar números48
1.7.6.5 Números primos48
1.8 Vectores48
1.8.1 Definição de vectores49

1.6.7.4 Converter entre escalas de temperaturas . . . . . . . 25 1.6.9.4 Determinar número e idade da pessoa mais nova de 1.6.9.5 Determinar o aluno melhor classificado e a média das 1.7.5.1 Função que devolve o maior algarismo de um número 46 iv

1.8.3 Acesso aos elementos de um vector50
1.8.4 Exercícios resolvidos51
1.8.4.1 Funções manipulando vectores51
1.8.5 Exercícios propostos52
1.8.5.1 Determinar desvio padrão de uma série52
1.8.5.2 Prova de atletismo52
1.8.5.3 Suavização53
1.9 Vectores multi–dimensionais53
1.9.1 Exercícios resolvidos5
1.9.1.1 Funções manipulação de matrizes5
1.9.2 Exercícios propostos58
1.9.2.1 Máximo local58
1.9.2.2 Determinar se uma matriz é simétrica58
1.10 Vectores como parâmetros58
1.1 Strings59
1.1.1 Iniciação de strings60
1.1.2 Funções para manipulação de strings61
1.1.3 Conversão de strings para outros tipos62
1.1.4 Exercícios resolvidos63
1.1.5 Exercícios propostos68
1.1.5.1 Função que determine o número de ocorrências68
1.1.5.3 Função que conta as palavras de uma string68
1.1.5.4 Função que formate uma string68
1.12 Ponteiros68
1.12.1 Operador endereço &68
1.12.2 Operador de referência *69
1.12.3 Ponteiros e vectores72
1.12.4 Ponteiros para ponteiros72
1.12.5 Ponteiros do tipo void73
1.13 Tipos de dados não nativos74
1.13.1 Estruturas de dados – instrução struct74
1.13.2 Definição de tipos – instrução typedef79
1.13.3 União – instrução union79
1.13.4 Enumeradores – instrução enum81
1.13.5 Exercícios resolvidos83
1.13.5.1 Ponto e recta83
1.13.5.2 Gestão de clientes de uma discoteca85
1.13.6 Exercícios propostos86
1.13.6.1 Empresa de construção civil86
1.13.6.2 Empresa de construção civil86
1.14 Programas de grandes dimensões90
1.14.1 Divisão em módulos91

vi vi

1.1 Ciclo de vida de um programa em C3
1.2 Modelo de compilação4
1.3 Execução de uma função38
1.4 Arquitectura do modelo de memória40
1.5 Execução da pilha41
1.6 Passagem de variáveis por valor42
1.7 Passagem de variáveis por referência43
1.8 Estrutura de um programa em C/C++45
1.9 Ilustração da lei de Ohm48
1.10 Representação gráfica do vector vec49
1.1 Representação gráfica de uma matriz53
1.12 Representação de uma string60
1.13 Representação da memória do computador69
1.14 Ponteiro70
1.15 Ponteiro para ponteiro73
1.16 Representação de uma união80
1.17 Tipos de dados83
1.18 Representação gráfica de um módulo91
1.19 Inclusão de um ficheiro92
1.20 Inclusão de um ficheiro (directivas de pré-processamento)93

Lista de Figuras vii viii viii

1.1 Palavras reservadas6
1.2 Tipos de dados7
1.3 Caracteres especiais9
1.4 Exemplo operadores compostos12
1.5 Operadores aritméticos13
1.6 Operadores aritméticos compostos13
1.7 Operadores de incremento (modo prefixo e sufixo)14
1.8 Operadores relacionais14
1.9 Exemplos de operadores relacionais14
1.10 Operadores lógicos15
1.1 Exemplos de operadores lógicos15
1.12 Tabelas de verdade: conjunção, disjunção e negação15
1.13 Operadores de manipulação de bits16
1.14 Tabela de verdade dos operadores de manipulação bits16
1.15 Relação de precedência dos operadores2
1.16 Índice de massa corpórea26

Lista de Tabelas ix x x

Resumo

Estes apontamentos têm como objectivo principal apoiar os alunos que pretendam aprender programação de computadores utilizando a linguagem C++, em particular aqueles que frequentam a disciplina de Introdução à Informática do Ano 0 leccionada no Instituto Superior de Engenharia do Porto (ISEP).

A estrutura destes apontamentos foi definida de acordo com a abordagem de aprender-por-exemplo, pelo que, os conceitos são apenas introduzidos de acordo com a necessidade de explicar a resolução de um determinado programa. De forma a suportar esta abordagem é apresentado um grande número de exercícios resolvidos.

Porto, Janeiro de 2006 Jorge Santos e Paulo Baltarejo xii xii

Capítulo 1 Programação em C/C++

1.1 História da linguagem C/C++

O C é uma linguagem de programação imperativa (procedimental) típica. Foi desenvolvida em 1970 por Dennis Ritchie para utilização no sistema operativo Unix. Esta linguagem é particularmente apreciada pela eficiência e é a mais utilizada na escrita de software para sistemas operativos e embora menos, no desenvolvimento de aplicações. A sua utilização também é comum no ensino, apesar de não ser a linguagem inicial para iniciados.

De acordo com Ritchie, o desenvolvimento inicial da linguagem C aconteceu nos laboratórios da AT&T entre 1969 e 1973. O nome "C"foi escolhido porque algumas das suas características derivavam de uma linguagem já existente chamada "B".

Em 1973, a linguagem C tornou-se suficientemente poderosa para suportar a escrita de grande parte do kernel do Unix que tinha sido previamente escrito em código assembly.

Em 1978, Ritchie e Brian Kernighan publicaram a primeira edição do livro "The

C Programming Language"[Kernighan e Ritchie, 1988] que durante muitos anos funcionou como a especificação informal da linguagem (K&R C). Posteriormente a segunda versão versou sobre a especificação ANSI C. A especificação K&R C é considerado o conjunto mínimo obrigatório que um compilador da linguagem deve implementar.

O C++ [Stroustrup, 2000], pronunciado "cê mais mais", é uma linguagem de programação genérica que suporta tanto os paradigmas da programação estruturada (procedimental) como o orientado ao objecto. A partir de 1990, o C++ tornou-se uma das linguagens de programação mais populares.

Bjarne Stroustrup desenvolveu o C++ (originalmente designado "C com classes") nos laboratórios da Bell em 1983, como um melhoramento da linguagem C. Este melhoramentos incluíram: adição de classes, funções virtuais, sobrecarga de operadores, múltipla herança, templates e tratamento de excepções.

O standard do C++ foi ratificado em 1998 como ISO/IEC 14882:1998, sendo que a versão actual, de 2003, é o ISO/IEC 14882:2003.

1.2 Estrutura de um programa em C++ Como primeira abordagem à linguagem C++, considere-se o programa 1.1.

ISEP/DEI - Jorge Santos e Paulo Baltarejo

Listing 1.1: Programa clássico - Bom dia mundo

1 // o meu primeiro programa em C++ 2 #include<iostream .h> 3 int main () 4 { 5 cout<<"Bom dia Mundo!"; 6 return 0; 7 }

Este programa depois compilado e executado produziria o seguinte resultado:

Bom dia Mundo!

Apesar do resultado simples, o programa contém um conjunto de elementos que merecem um análise detalhada.

• //O meu primeiro programa em C++

Isto é uma linha de comentário. Todas as linhas começadas por duas barras // são consideradas comentários e não tem qualquer efeito na compilação/execução do programa. Servem para inserir explicações e observações no código do programa;

• #include <iostream.h>

As linhas que começam pelo carácter cardinal (#) são directivas de pré-compilação. Estas não são linhas de código executável mas apenas indicações para o compilador. Neste caso #include <iostream.h> indica ao pré–processador do compilador que inclua os cabeçalhos existentes no ficheiro iostream.h relativos a funções utilizadas na entrada e saída de dados de um programa;

• int main()

Esta linha corresponde ao início da declaração da função main. A função main é o ponto por onde todos os programas em C++ começam a sua execução. main é seguido de parêntesis ((, )) porque é uma função. O conteúdo da função main que está imediatamente a seguir à declaração formal, está contido entre chavetas ({ }) conforme o exemplo;

• cout << "Bom dia Mundo!";

Esta instrução coloca no ecrã a frase "Olá Mundo!". cout (console output) é um objecto normalmente associado ecrã. cout está declarado no ficheiro de cabeçalhos (header file) iostream.h, portanto para poder usar o cout é necessário incluir o ficheiro iostream.h. Note–se que esta frase termina com ponto vírgula (;). Este carácter significa o fim da instrução e tem obrigatoriamente que ser incluído depois de qualquer instrução;

A instrução return provoca o fim da execução da função main e (devolve) retorna o que está a seguir, neste caso o zero (0).

Apontamentos de Programação C/C++

1.3 Criação de um programa em C++

O desenvolvimento de programas em linguagem C++, tal como na maioria das linguagens compiladas, é um processo que compreende quatro fases: escrita, compilação, "linking" e execução (ver figura 1.1).

Escrita do código-fonte ficheiro código-fonte .cpp ou .c ficheiro objecto .obj ou .o ficheiro executável .exe

Compilação Execução“Linking” ficheiros de cabeçalhos .h bibliotecas .lib

Erros de compilação

Erros de ”linking”

Erros de execução

Fluxo dados

Dependência funcional

(Parte 1 de 9)

Comentários