Aula 02
Aula 02
Aula 02
LINGUAGEM DE PROGRAMAÇÃO I
Modularização e Compilação
(material baseado nas notas de aula do Prof. Silvio Sampaio e Prof.
César Rennó-Costa)
Compilação
O compilador g++
Introdução
• Antes de escrever e executar programas, é preciso entender em maior detalhe todo o
processo de construção de um programa em C++
Passo 1: Defina o problema a ser
resolvido
Passo 4: Compile os arquivos de Embora costumemos
programa (.h .cpp) compilar e ligar ao mesmo
tempo, é importante
entender estas duas fases
Passo 2: Projete a solução separadamente.
• Vale ressaltar que, quando o g++ indica o número da linha, isso não necessariamente
indica a linha do erro, mas sim a linha na qual o erro foi detectado
o Com isso, encontrar o ponto exato do erro pode exigir uma inspeção de outras partes do código
o Geralmente, o erro está próximo à linha no qual foi detectado
Exemplo
o Implementar funções, cada uma realizando uma tarefa específica e bem definida
o Implementar trechos de código que se repetem no programa como corpo de funções, chamadas em
substituição a tais trechos que se encontravam repetidos
Um exemplo
#include <iostream> switch(opcao) {
using std::cin; case 1:
using std::cout; conv = temp * 1.8 + 32;
using std::endl; cout << temp << "ºC = " << conv << "ºF" << endl;
break;
int main() { case 2:
int opcao; conv = (temp - 32) / 1.8;
cout << temp << "ºF = " << conv << "ºC" << endl;
cout << "Conversor de temperatura" << endl; break;
cout << "(1) Celsius -> Fahrenheit" << endl; default:
cout << "(2) Fahrenheit -> Celsius" << endl; cout << "Opcao invalida" << endl;
cout << "Digite sua opcao: "; }
cin >> opcao;
return 0;
float temp; }
cout << "Digite a temperatura: ";
cin >> temp;
float conv;
Modularizando em funções...
#include <iostream>
float temp;
using std::cin;
cout << "Digite a temperatura: ";
using std::cout;
cin >> temp;
using std::endl;
float conv;
float celsius2fahrenheit(float temp) {
switch(opcao) {
return temp * 1.8 + 32;
}
case 1:
conv = celsius2fahrenheit(temp);
float fahrenheit2celsius(float temp) {
cout << temp << "ºC = " << conv << "ºF" << endl;
return (temp - 32) / 1.8;
break;
}
case 2:
conv = fahrenheit2celsius(temp);
int main() {
cout << temp << "ºF = " << conv << "ºC" << endl;
int opcao;
break;
default:
cout << "Conversor de temperatura" << endl;
cout << "(1) Celsius -> Fahrenheit" << endl;
cout << "Opcao invalida" << endl;
cout << "(2) Fahrenheit -> Celsius" << endl; }
cout << "Digite sua opcao: ";
cin >> opcao; return 0;
}
Modularização externa
• Por convenção da linguagem C++, a organização do código de um programa pode ser feita
da seguinte maneira:
o Arquivos de cabeçalho (.h) contêm declarações de estruturas, tipos, variáveis globais, protótipos de
funções, constantes, etc. e não podem conter a função principal do programa (main)
o Arquivos de corpo (.cpp) implementam ou fazem chamadas ao que é definido nos arquivos de
cabeçalho
Voltando ao exemplo anterior...
#ifndef CONV_H
#define CONV_H O arquivo de cabeçalho conv.h
// Conversao de temperatura em escala Celsius para Fahrenheit
contém os protótipos das funções
float celsius2fahrenheit(float temp); que realizam as respectivas
// Conversao de temperatura em escala Fahrenheit para Celsius conversões de temperatura, uma
float fahrenheit2celsius(float temp);
para cada tipo
#endif
conv.h
Arquivos de cabeçalho em C++
• São incluídos no programa através da diretiva de pré-processamento #include seguida do
nome do arquivo de cabeçalho
o A inclusão copia o conteúdo de um arquivo em outro
• A fim de evitar duplicidade de cópias do código a cada nova inclusão, os arquivos de
cabeçalho precisam ser identificados e protegidos contra múltiplas inclusões, pois elas
podem levar a erros de redefinições
o A identificação é feita através da definição de um nome através da diretiva de compilação #define
o A proteção contra múltiplas inclusões é implementada com a definição do bloco #ifndef / #endif
(if not defined / end if) do pré-processador
Pré-processador
• O pré-processador é um programa que examina o código-fonte e executa certas
modificações nele, baseado nas diretivas de compilação
o As diretivas de compilação são comandos que não são compilados, sendo dirigidos ao pré-processador
o O pré-processador é executado pelo compilador antes da compilação propriamente dita
o Diretivas de compilação iniciam por um caractere # (sharp ou hashtag)
• O comando #include é uma diretiva de compilação que diz ao pré-processador para
copiar o conteúdo de um arquivo para outro, através de duas formas:
o Quando usando arquivos das bibliotecas
― #include <iostream> (biblioteca padrão de C++)
o Quando usando arquivos do próprio usuário
― #include "conv.h" (tipos e protótipos de sub-rotinas definidos pelo usuário)
Pré-processador
• O comando #define substitui palavras por valores, atuando como uma constante
o Por exemplo, #define PI 3.14159 permite substituir PI pelo valor 3.14159
• Os comandos #ifdef, #ifndef, #endif permitem evitar que partes do código sejam
inseridas no programa
o Úteis nos arquivos de cabeçalho para evitar duplicidade
o A diretiva de pré-processamento #include não verifica se um arquivo já foi incluído no programa, o
que pode ser feito através da diretiva #ifndef
#ifndef NOME_DO_ARQUIVO_H // Evita a redefinicao dos membros do arquivo
#define NOME_DO_ARQUIVO_H // Inicio da definicao de NOME_DO_ARQUIVO_H
// Codigo do arquivo
#include
conv.h conv.cpp
Voltando ao exemplo anterior...
#include <iostream> switch(opcao) {
using std::cin; case 1:
using std::cout; conv = celsius2fahrenheit(temp);
using std::endl; cout << temp << "ºC = " << conv << "ºF" << endl;
break;
#include "conv.h" case 2:
conv = fahrenheit2celsius(temp);
int main() { cout << temp << "ºF = " << conv << "ºC" << endl;
int opcao; break;
default:
cout << "Conversor de temperatura" << endl; cout << "Opcao invalida" << endl;
cout << "(1) Celsius -> Fahrenheit" << endl; } conv.h
cout << "(2) Fahrenheit -> Celsius" << endl;
cout << "Digite sua opcao: "; return 0;
cin >> opcao; }
float temp; #include #include
cout << "Digite a temperatura: ";
cin >> temp;
float conv;
conv.cpp main.cpp