Livro
Livro
Livro
Princípios de
++
Programação em C
Uma abordagem introdutória
e prática para a Engenharia de
Alimentos
Primeira Edição
++
Princípios de Programação em C
Uma abordagem introdutória e prática para a
Engenharia de Alimentos
Editora UFLA
Universidade Federal de Lavras
2022
Página intencionalmente deixada em branco
Dedico este livro aos meus sobrinhos Daniel e Danilo, à minha mãe
Maria da Glória, à minha irmã Flávia, ao Robinson, e a todos os
estudantes do curso de Engenharia de Alimentos do DCA/UFLA.
Roney
Dedico este livro aos meus pais, Maria Auxiliadora e Geraldo Lúcio,
e à minha irmã, Isabela, que sempre me incentivaram e apoiaram
mesmo a distância.
Ana Carolina
5 Desvios condicionais 96
5.1 Desvios condicionais em C++ . . . . . . . . . . . . . . . . . . . . . 96
5.1.1 Desvio condicional simples . . . . . . . . . . . . . . . . . . 96
5.1.1.1 Uso do operador interrogação (operador ternário) 96
5.1.2 Desvio condicional composto . . . . . . . . . . . . . . . . . 98
5.1.3 if’s aninhados . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.1.4 As instruções switch(), case, break e default . . . . . . . . 103
5.2 Atividades para fixação da aprendizagem . . . . . . . . . . . . . . . 106
Bibliografia 327
Lista de Figuras
FUNDAMENTOS TEÓRICOS E
PRÁTICOS DE PROGRAMAÇÃO
Capítulo 1
Conteúdo do capítulo
1.1 Um breve histórico do C++ . . . . . . . . . . . . . . . . . . 1
1.2 Principais características do C++ como linguagem de
programação . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Compiladores C++ e interfaces gráficas do usuário . . . . 3
1.4 Algumas aplicações do C++ em Engenharia . . . . . . . . 4
1.5 Como estudar C++
e aplicá-lo para ajudar a resolver
problemas de engenharia . . . . . . . . . . . . . . . . . . . 5
1
++
Princípios de programação em C
• Apesar de ser uma linguagem de alto nível, o C++ também permite a programa-
ção de funções e subrotinas em baixo nível, por meio de códigos Assembly, que
podem ser intercalados e inseridos diretamente aos códigos C++ . Isso permite
ao programador a comunicação e o acesso às funcionalidades dos hardwares e
equipamentos instalados ao computador.
• A portabilidade é uma característica que faz com que os programas C++ possam
ser compilados para serem executados em diferentes sistemas operacionais e
dispositivos, com nenhuma ou pouquíssimas modificações.
• O C++ trabalha com muitos tipos de dados: inteiros, caracteres, texto, byte,
booleano, etc., o que implica em uso adequado e eficaz dos recursos de memória
do computador. Essa característica confere ao C++ a particularidade de ser
uma linguagem fortemente tipada, ou seja, é necessário especificar exatamente
o tipo de variável memória que será utilizado para armazenar um determinado
valor, seja ele inteiro, caractere, booleano, etc.
2
++
Princípios de programação em C
• O termo programação modular é uma característica que faz com que uma
aplicação C++ possa ser construída a partir de vários arquivos de códigos que
serão compilados em separado e a seguir unidos a partir de um procedimento
conhecido como linkedição. A vantagem desse recurso está na economia de
tempo, pelo fato de não ser necessário recompilar todo o código novamente ao
realizar uma pequena mudança em seu conteúdo. Apenas o arquivo contendo
a modificação é que será compilado novamente.
3
++
Princípios de programação em C
4
++
Princípios de programação em C
5
Capítulo 2
Conteúdo do capítulo
2.1 Download da versão atual do Code::Blocks . . . . . . . . 7
2.2 Instalando o Code::Blocks no Microsoft Windows . . . . 7
2.3 Instalando o Code::Blocks no Linux Mint e no Ubuntu . 7
2.3.1 Configurações pós-instalação do Code::Blocks . . . . . . . 8
2.4 O primeiro programa em C++ . . . . . . . . . . . . . . . . 8
2.4.1 Escrevendo e salvando o programa em um arquivo .cpp . . 8
2.4.2 Compilando e executando o primeiro programa . . . . . . 11
2.4.3 Avaliando erros de digitação e erros de sintaxe no código . 13
2.5 Atividades para fixação da aprendizagem . . . . . . . . . 14
6
++
Princípios de programação em C
7
++
Princípios de programação em C
8
++
Princípios de programação em C
Nessa janela apenas clique no botão Next. Na próxima janela selecione a opção
C++ e clique em Next novamente (Figura 2.2). Na próxima janela (Figura 2.3)
informe o caminho e o nome da pasta onde o projeto deverá ser construído. Isso é
feito no campo intitulado Folder to create project in. Nessa mesma janela informe
um nome para o projeto (no campo Project title) e clique em Next.
9
++
Princípios de programação em C
Após isso surgirá uma nova janela, também com o título Console application, na
qual é possível escolher um outro compilador, diferente do GNU GCC. Não modifique
as informações contidas nessa janela, apenas clique em Finish. O Code::Blocks sal-
vará o projeto na pasta informada nos passos anteriores e criará automaticamente um
programa-modelo em C++ , que será apresentado em sua janela principal, conforme
mostrado na Figura 2.4.
Esse programa é bem simples e quando compilado sua função será imprimir na tela
do computador a expressão de boas vindas: ”Hello world!”. Observe na Figura 2.4
que alguns comandos internos do C++ aparecem destacados em cores diferentes. Ao
utilizar o Code::Blocks você perceberá que isso é feito automaticamente à medida em
que os comandos são digitados pelo programador. Além das cores, alguns comandos
e símbolos que compõem o código também podem estar destacados em negrito.
10
++
Princípios de programação em C
3 int main () {
4 printf ( " Hello world ! " ) ;
5 return 0;
6 }
11
++
Princípios de programação em C
12
++
Princípios de programação em C
5 int main ()
6 {
7 cout << " Hello world ! " << endl ;
8 return 0
9 }
Ao fazermos isso o compilador irá gerar uma mensagem de erro, sugerindo que
está faltando um ponto e vírgula antes da linha 9. Além disso imediatamente à linha
onde está o erro será inserido um pequeno marcador retangular na cor vermelha,
como mostrado na Figura 2.7.
Além das mensagens dos erros de compilação, exibidos na barra de mensagens, há
também um procedimento mais detalhado e completo para analisar os tipos de erros
ocorridos durante a execução dos programas e inspecionar dinamicamente os valores
das variáveis. Esse procedimento de verificação é conhecido pela expressão ”debugar
o código”, e é especialmente útil para análise de erros de lógica de programação.
O Code::Blocks possui recursos de debugger que serão apresentados e discutidos
em maiores detalhes na seção 3.7 do Capítulo 3 (p.39).
13
++
Princípios de programação em C
14
++
Princípios de programação em C
5. Características da linguagem C ++
15
++
Princípios de programação em C
16
Capítulo 3
Conteúdo do capítulo
3.1 Estruturas básicas de um programa C++ . . . . . . . . . 18
3.1.1 Bibliotecas padrões e a função int main() . . . . . . . . . 18
3.1.2 O uso de chaves e o marcador de final de linha em C++ . 19
3.1.3 Inserção de comentários e espaços em branco no código . . 20
3.1.3.1 Exemplo de comentário inline . . . . . . . . . . 21
3.1.3.2 Exemplo de comentários multiline . . . . . . . . 21
3.1.4 Instrução de retorno para o sistema operacional . . . . . . 21
3.2 Declaração de variáveis de memória . . . . . . . . . . . . 22
3.3 Tipos de valores que podem ser atribuídos às variáveis . 24
3.4 Escopo de variáveis: as declarações local e global . . . . 25
3.5 Entradas e saídas de dados padrões do programa . . . . 26
3.5.1 Entrada e saída de dados: uso da biblioteca stdio.h . . . . 26
3.5.1.1 As funções printf() e scanf() da linguagem C . . 27
3.5.1.2 Principais caracteres de formatação utilizados pe-
las funções printf() e scanf() . . . . . . . . . . . 32
3.5.2 Entrada e saída de dados: uso da biblioteca iostream . . . 33
3.5.2.1 Os objetos cin e cout do C++ . . . . . . . . . . . 33
3.6 Inserção de caracteres da língua portuguesa nos pro-
gramas C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.7 Depuração nos códigos de programas C++ . . . . . . . . 39
3.8 Atividades para fixação da aprendizagem . . . . . . . . . 46
17
++
Princípios de programação em C
5 int main ()
6 {
7 cout << " Hello world ! " << endl ;
8 return 0;
9 }
18
++
Princípios de programação em C
19
++
Princípios de programação em C
5 int main ()
6 {
7 int x = 10;
8 if ( x == 10)
9 {
10 cout << " Valor igual a 10 " << endl ;
11 }
12 return 0;
13 }
• Comentários inline: ocupam uma única linha do código. Começam com a barra
dupla ’//’ e vão até o término da linha. Opcionalmente pode-se colocar um
ponto e vírgula para indicar o seu final.
20
++
Princípios de programação em C
• Comentários multiline: Começam com ’/*’ e terminam com ’*/’. Todo o texto
colocado entre esses marcadores será considerado comentário e, portanto, des-
prezado pelo compilador.
5 int main () {
6 int x = 10; // Exemplo de comentario inline ;
7 if ( x == 10) {
8 cout << " Valor igual a 10 " << endl ;
9 } return 0;
10 }
1 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
2 /* Programa para exemplificar o uso de comentarios multili */
3 /* ne no codigo C ++ - Universidade Federal de Lavras / UFLA */
4 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
5 # include < iostream >
6
21
++
Princípios de programação em C
• Podemos inserir numerais no nome da variável, mas desde que esse não seja
o primeiro caractere do nome. Exemplo: ”Tanque2” é um nome de variável
permitido, enquanto que ”2Motor” não é permitido, e irá gerar um erro de
compilação, impossibilitando a execução do programa.
22
++
Princípios de programação em C
4 int main () {
5 int UFC ; /* Unidades formadoras de colonia */
6 float pH ; /* Potencial hidrogenionico */
7 double Aw ; /* Atividade de agua */
8 return 0; /* Retorno ao sistema operacional */
9 }
Ao declarar uma variável o programador deverá estar ciente sobre qual valor será
colocado em seu interior. Na linha 5 do exemplo acima, a instrução int faz com
que seja reservado um espaço na memória física do computador para a criação de
uma variável chamada ”UFC”, que deverá receber obrigatoriamente algum valor do
tipo inteiro, porém nesse programa, nenhum valor numérico foi atribuído à variável
UFC, e isso pode gerar um grande problema, visto que um valor arbitrário qualquer,
originalmente presente no mesmo endereço da memória onde UFC foi criada, poderá
ser atribuído a essa variável.
Assim, ao declarar uma variável o programador deverá sempre ficar atento ao seu
conteúdo e, se possível, inicializá-la com algum valor conhecido. No fragmento de
código apresentado a seguir as variáveis são inicializadas com valores numéricos no
mesmo instante em que são declaradas.
1 # include < iostream >
2 using namespace std ;
3
4 int main () {
5 int UFC = 250; /* Unidades formadoras de colonia */
6 float pH = 6.82; /* Potencial hidrogenionico */
7 double Aw = 0.86; /* Atividade de agua */
8
É possível declarar mais de uma variável, ao mesmo tempo, em uma mesma linha
de código, como apresentado a seguir. Nesse código são declaradas três variáveis do
tipo inteiro: a, b e c.
1 int a , b , c ;
23
++
Princípios de programação em C
Declarações especiais, como para as variáveis do tipo vetor e matriz, serão apre-
sentadas oportunamente, no Capítulo 10, a partir da p.172.
Tabela 3.1: Tipos de dados mais comuns permitidos em C++ , bytes ocupados na
memória do computador e seus intervalos de valores numéricos.
Tipo de dado Bytes na memória Intervalo permitido de valores
short int 2 -32.768 a 32.768
signed int 2 -32.768 a 32.768
signed short int 2 -32.768 a 32.768
wchar_t 2 -32.768 a 32.768
signed wchar_t 2 -32.768 a 32.768
unsigned short int 2 0 a 65.535
unsigned wchar_t 2 0 a 65.535
int 4 -2.147.483.648 a 2.147.483.648
long int 4 -2.147.483.648 a 2.147.483.648
signed long int 4 -2.147.483.648 a 2.147.483.648
unsigned int 4 0 a 4.294.967.295
unsigned long int 4 0 a 4.294.967.295
char 1 -128 a 127
signed char 1 -128 a 127
unsigned char 1 0 a 255
bool 1 true ou false
float 4 1,2 × 10−38 a 3,4× 10+38
double 8 2,2 × 10−308 a 1,8× 10+308
long double 8 2,2 × 10−308 a 1,8× 10+308
Fonte: Elaborada pelos autores, adaptado de GREGOIRE (2014).
24
++
Princípios de programação em C
8 int main () {
9 float pH = 6.82; /* Potencial hidrogenionico */
10 double Aw = 0.86; /* Atividade de agua */
11 return 0; /* Retorno ao sistema operacional */
12 }
8 int main () {
9 float pH = 6.82; /* Potencial hidrogenionico */
10 double Aw = 0.86; /* Atividade de agua */
11
12 {
13 int x , y , z ;
14 x = 8; y = 9; z = 6;
15 pH = 4.25; Let = 6.85;
16 }
25
++
Princípios de programação em C
17
• Entrada e saída padrão C++ : faz o uso da biblioteca iostream, por meio dos
objetos cin e cout.
• Entrada e saída padrão C: faz o uso da biblioteca stdio.h, por meio das funções
scanf() e printf(). Por uma questão de compatibilidade, todas as funcionalida-
des do C foram mantidas no C++ e por isso essas funções ainda são utilizadas
por muitos programadores, sendo oportuno apresentá-las aqui.
26
++
Princípios de programação em C
A função printf(): Na sua forma mais simples, a função printf() é usada da seguinte
maneira:
1 # include < stdio .h >
2 int main () {
3 printf ( " Engenharia de Alimentos " ) ;
4 return 0;
5 }
O código acima irá imprimir o texto passado como argumento da função printf()
na tela do computador, e o cursor ficará piscando imediatamente após a letra ’s’ que
está no final do texto. Outras frases ou textos também podem ser enviados para a
tela do computador, como apresentado a seguir, entretanto o comando printf() fará
a impressão de modo serial, ou seja, não saltará nenhum espaço entre os textos que
foram enviados para a tela (Figura 3.1).
1 # include < stdio .h >
2 int main () {
3 printf ( " Engenharia de Alimentos " ) ;
4 printf ( " Universidade Federal de Lavras " ) ;
5 printf ( " Departamento de Ciencia dos Alimentos " ) ;
6 return 0;
7 }
Exemplo - +
+
Figura 3.1: Tela do terminal do Windows com a saída dos comandos printf() envi-
ados em sequência. (Fonte: autores)
27
++
Princípios de programação em C
Exemplo - +
+
Engenharia de Alimentos
Universidade Federal de Lavras
Departamento de Ciencia dos Alimentos
Figura 3.2: Tela do terminal do Windows com a saída dos comandos printf() envi-
ados com caractere de quebra automática de linha. (Fonte: autores)
Exemplo - +
+
28
++
Princípios de programação em C
Variáveis de outros tipos também podem ser passadas como argumento para o
comando printf(). Além disso, o comando printf() aceita mais de um argumento por
vez, como apresentado nos exemplos do código a seguir.
Deve-se observar também que para cada de tipo de dado, é necessário informar
o caractere de formatação correto, caso contrário, poderá haver algum erro de com-
pilação, erro em tempo de execução do programa, ou mesmo acontecer de alguns
caracteres estranhos serem apresentados na tela do computador, na mesma posição
onde deveria ser exibido o valor desejado. A seguir, um exemplo um pouco mais
detalhado, mostrando a utilização do comando printf().
1 # include < stdio .h >
2 int main () {
3 float pHLote = 4.5; int QtdLatas = 22;
4 double Preco = 425.36; char TipoLata = ’S ’;
5 float Tempo = 15.2; float Temper = 121.5;
6 float Vazao = 3.2512; char Filial [] = " Jardim Botanico " ;
7
18 return 0;
19 }
Uma particularidade dos marcadores de formatação ’%f’ e ’%lf’ é que eles permi-
tem, de uma forma bastante simples, formatar o número de casas decimais a serem
exibidas em resultados numéricos como, por exemplo, no valor da variável vazão do
vapor, na linha 15 do código. Neste caso, o valor ’.2’ que aparece entre os caracteres
’%’ e ’f’ serve para indicar que o valor da vazão do vapor deverá ser expresso com
duas casas decimais. A função printf() se encarregará de fazer os devidos arredon-
damentos numéricos no valor de saída. Exemplos complementares de formatação
utilizando o printf() estão apresentados nos Anexos deste livro, seção 17.4, p. 316.
29
++
Princípios de programação em C
Exemplo - +
+
CARACTERIZACAO DO LOTE:
BINOMIO DE ESTERILIZACAO:
A função scanf(): Na sua forma mais simples, a função scanf() é usada da seguinte
maneira:
1 # include < stdio .h >
2 int main () {
3 int Numero ;
4
Na linha 3 do código acima é declarada uma variável inteira com o nome ”Nu-
mero”. Na linha 6, o primeiro parâmetro da função scanf() é o especificador de
formatação ”%d”, que informa que a função receberá, a partir do teclado do compu-
tador, um valor numérico do tipo inteiro. O segundo argumento da função scanf()
é &Numero.
O símbolo ”&” é sempre colocado na frente do nome da variável ao utilizar a fun-
ção scanf() para fazer a leitura de valores numéricos e caracteres. Outros exemplos
30
++
Princípios de programação em C
3 int main () {
4 int Numero ; float Preco ;
5 double Volume ; char Letra ;
6 char Nome [31]; /* Ate 30 caracteres */
7
8 printf ( " Digite um numero : "); scanf ( " % d " , & Numero ) ;
9 printf ( " Digite o preco ..: "); scanf ( " % f " , & Preco ) ;
10 printf ( " Digite o volume .: "); scanf ( " % lf " , & Volume ) ;
11 printf ( " Digite uma letra : "); scanf ( " % c " , & Letra ) ;
12 printf ( " Digite um nome ..: "); scanf ( " % s " , Nome ) ;
13
• A função scanf() não consegue ler vetores de caracteres que contenham espa-
ços em branco em seu interior como, por exemplo, nos espaços presentes nos
nomes de pessoas, de ruas, etc.
Para essa situação pode-se utilizar a função fgets() como exemplificado a se-
guir.
Nesse exemplo, deve-se ficar atento ao fato de a função fgets() fazer a leitura
de todo vetor de caracteres, inclusive o caractere <ENTER> digitado no final
do nome. Assim, o printf() na linha 3 irá saltar uma linha imediatamente após
imprimir na tela o nome armazenado na variável ’cNome’.
31
++
Princípios de programação em C
Exemplo - +
+
Digite um numero: 226
Digite o preco..: 1454.26
Digite o volume.: 158.44
Digite uma letra: H
Digite um nome..: Pectina
INFORMACOES DIGITADAS:
Numero....: 226
Preco.....: 1454.260010
Volume....: 158.440000
Letra.....: H
Nome......: Pectina
Figura 3.5: Saídas dos exemplos de usos da função scanf(). (Fonte: autores)
32
++
Princípios de programação em C
33
++
Princípios de programação em C
instrução endl é enviada para a tela do computador, e isso fará com que o cursor se
movimente para o início da próxima linha.
Na linha 8 o objeto cout incialmente imprime uma mensagem na tela do com-
putador (”Numero digitado”) e, em seguida, utiliza um outro operador de inserção
() para imprimir o valor da variável ’Numero’ na tela e, no final da linha 8 uma
nova instrução endl é enviada para a tela, de modo a reposicionar o cursor no início
da próxima linha.
Os objetos cin e cout podem ser utilizados para operações de entrada e saída
de duas ou mais variáveis simultaneamente, como mostrado nos exemplos a seguir.
Nesses exemplos observe que é o ’ponto e vírgula’ que define o final de uma linha
de instruções em C++ .
1 # include < iostream > /* Obrigatorio para cin e cout */
2 using namespace std ; /* Obrigatorio para cin e cout */
3 int main () {
4
5 int main ()
6 {
7 float pH , Tempo , Temper ;
8
11 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
12 /* A entrada de dados sera feita digitando - se cada va */
13 /* lor solicitado e , em seguida , pressiona - se a tecla */
14 /* ENTER para confirmar a leitura a partir do teclado */
15 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
16
34
++
Princípios de programação em C
5 int main ()
6 {
7 int Numero ;
8
11 cout << " Valor hexadecimal : " << hex << Numero << endl ;
12 cout << " Valor octal ......: " << oct << Numero << endl ;
13 cout << " Base decimal .....: " << dec << Numero << endl ;
14
15 return 0;
16 }
Nos códigos acima, as palavras hex, oct e dec fazem a mudança de base do
numeral digitado para as bases hexadecimal, octal e decimal.
1 # include < iomanip > /* Para uso de setiosflags () */
2 # include < iostream > /* Obrigatorio para cin e cout */
3
6 int main ()
7 {
8
9 float Temperatura ;
10
11 Temperatura = 121.58746587;
12
35
++
Princípios de programação em C
34 return 0;
35 }
4 int main ()
5 {
6 char Nome [80];
7 cout << " Digite Nome completo : " << endl ;
8 cin . getline ( Nome , 80) ;
9
36
++
Princípios de programação em C
6 int main ()
7 {
8
O código acima utiliza os objetos cin e cout para ler e apresentar os valores das
variáveis no cálculo da nota média de três provas de um estudante. Na Figura 3.6 a
seguir está a saída que esse programa produz no terminal do Linux ao ser executado.
Exemplo - + +
Nome do aluno...: Bjarne Silva
Valor da Prova 1: 64.28
Valor da Prova 2: 82.47
Valor da Prova 3: 98.77
Figura 3.6: Exemplo de uso dos objetos cin e cout para leitura das notas das provas
de um estudante, cálculo da média e exibição de seu valor no terminal do Linux.
(Fonte: autores)
Nos exemplos anteriores vimos o uso do caractere de formatação ”\n” para fazer
o salto de linha e posicionamento do cursor no início da nova linha. Vimos também
37
++
Princípios de programação em C
que o caractere ”\t” (Tabelas 3.2 e 3.3) pode ser utilizado para promover um espa-
çamento padrão no texto, correspondendo ao mesmo efeito que teríamos com o uso
da tecla TAB.
Além do ”\n” e do ”\t” há também outros caracteres de formatação, denominados
de ”sequências de escapes”, que podem ser utilizadas em conjunto com as funções
printf() e scanf(), e também com os objetos cin e cout. Na Tabela 3.3 apresentada
a seguir estão listados alguns desses caracteres. Fica como exercício para o leitor a
tarefa de utilizá-los na realização de alguns testes de programação.
38
++
Princípios de programação em C
5 int main () {
6 setlocale ( LC_ALL , " portuguese " ) ; // Funcao para habilitar
7 return (0) ; // caracteres da lingua
8 } // portuguesa
5 int main ()
6 {
7 int x;
8 float y;
9 char z;
10 double w;
11
17 return 0;
18 }
39
++
Princípios de programação em C
Para a maioria das situações, o C++ não verifica o conteúdo das variáveis,
ficando essa tarefa exclusivamente a cargo do programador, que deverá manter ano-
tações e um controle rigoroso sobre quais variáveis foram criadas dentro de seu
código e quais valores há nelas em qualquer parte do programa.
O procedimento de depuração do código será apresentado a seguir tendo, como
exemplo, o código apresentado acima, e o seu passo-a-passo será ilustrado por meio
de algumas de figuras.
A seguir, na Figura 3.7, há uma coluna vertical (na lateral esquerda da figura)
contendo a enumeração sequencial que identifica as linhas de código do programa.
Essa coluna de enumeração é útil porque auxiliará o programador na inserção de
pontos de interrupção (breakpoints) nos quais o programa deverá obrigatoriamente
realizar uma pausa, de modo a permitir ao programador inspecionar os valores con-
tidos em cada uma de suas variáveis durante a execução do programa.
Na Figura 3.7, inicialmente vamos colocar um breakpoint em cada uma das linhas
com os números 12 e 17.
Os breakpoints são pontos de parada, ou seja, interrupções que podemos solicitar
ao compilador de modo que quando o programa estiver sendo executado este será
pausado ao chegar nessas linhas.
Para adicionar um breakpoint a uma linha, basta clicar nessa linha com o botão
direito do mouse e escolher a opção ”Add breakpoint”, na primeira linha do menu
popup que irá aparecer, como mostrado na Figura 3.7.
40
++
Princípios de programação em C
Figura 3.7: Menu popup para inserção de breakpoints nas linhas de um programa
por meio da IDE do Code::Blocks. (Fonte: autores)
41
++
Princípios de programação em C
Figura 3.8: Identificação de linhas do código que servirão como pontos de parada
(breakpoints) durante a execução do programa. (Fonte: autores)
42
++
Princípios de programação em C
43
++
Princípios de programação em C
Figura 3.11: Botão de comandos ”Debugging windows” utilizado para abrir a janela
”Watches” do Code::Blocks. (Fonte: autores)
44
++
Princípios de programação em C
Para a variável ’z’, que é do tipo char, a janela ”Watches” informa dois valores.
Primeiro valor é o numeral 77, que corresponde ao código ASCII do caractere M
(maiúsculo), digitado arbitrariamente neste exemplo, e depois a letra M, que é o
conteúdo armazenado na variável z. Nas Tabelas 17.2 a 17.5 (p.312 – 315) estão
listados os códigos dos caracteres ASCII discutidos nos exemplos deste livro.
Program Console - +
+
warning: GDB: Failed to set controlling terminal: Operação não permitida
Valor inteiro...: 225
Precisao simples: 6.045 Whatches
+
Caractere.......: M Function arguments
Dupla precisao..: 12.0054878
Locals
x 225
y 6.04500008
z 77 'M
w 12.005487799999
A mensagem ”warning: GDB: Failed to set...” na Figura 3.13 não tem nenhuma
relação ou interferência no processo de debugging. Essa mensagem informa apenas
que o software de debugger do Code::Blocks (o GDB) não teve permissão para
acesso a uma pasta no Linux, sistema operacional onde foi instalado o Code::Blocks
utilizado para trabalhar com os exemplos deste capítulo. Essa mensagem pode,
portanto, ser desconsiderada, e não deverá aparecer no terminal caso o sistema
operacional seja o Microsoft Windows.
O código utilizado para exemplo de debugging apresentado nesta seção é re-
lativamente simples, e possui apenas quatro variáveis. O recurso de debugging do
Code::Blocks se torna especialmente útil quando o programa apresenta erros de lógica
ou há um número muito grande de variáveis de memória para serem inspecionadas,
45
++
Princípios de programação em C
(a) Explique o que são ’comentários’ no código C++ . Qual a sua finalidade?
Em que situações são utilizados?
(b) Qual a diferença entre comentários inline e comentários multiline? Dê
um exemplo.
(c) Escreva um pequeno programa em C++ e mostre como ele pode ser do-
cumentado por meio de comentários.
2. Variáveis de memória
46
++
Princípios de programação em C
i. Nome, v. e-mail,
ii. Endereço, vi. idade,
iii. Cidade, vii. Curso e
iv. telefone, viii. Período da graduação.
(a) Crie um programa que leia, a partir do teclado, cinco números inteiros,
dois números do tipo float, três do tipo double e dois caracteres. Em
seguida, imprima na tela todos os valores digitados, um por linha.
47
++
Princípios de programação em C
(b) Crie um programa que leia o número do lote de um produto (valor inteiro),
e codifique o valor lido para hexadecimal.
(c) Crie um programa que leia, a partir do teclado, quatro valores de tempe-
ratura. Os valores lidos serão digitados pelo usuário com 5 (cinco) casas
decimais. O programa deverá imprimir os valores na tela do computador,
um valor por linha, com apenas duas casas decimais.
(d) Crie um programa em que o usuário informe, a partir do teclado, os dados
de um determinado produto. Após a entrada de dados, o programa deverá
imprimi-los na tela do computador. Os dados a serem processados são:
• Dados do produto
i. Descrição do produto. (char[40])
ii. Classe. (standard, gourmet, max premium) (char[14])
iii. Destino.(mercado nacional, exportação) (char[20])
iv. Número da nota fiscal. (char[12])
v. Nome da transportadora. (char[40])
vi. Quantidade atual em estoque (int)
vii. Quantidade mínima em estoque (int)
viii. Código de barras produto. (char[30])
ix. Preço unitário, em R$ (double)
x. Vida de prateleira, em dias. (int)
• Dados do processamento
i. Número do Lote. (char[8])
ii. Qtd. de embalagens por lote (int)
iii. Código do tipo de embalagem. (int)
iv. Responsável técnico pelo processamento do produto. (char[60])
v. Tempo de cozimento, em min. (float)
vi. Temperatura de cozimento, em Celsius. (float)
vii. Código do conservante químico (int)
viii. Concentração de conservante (float)
ix. Pressão do vapor (float)
x. Temperatura da água de resfriamento (float)
(a) Utilize o debugger do Code::Blocks para verificar o valor final das variáveis
x1 , x2 , y1 , y2 , z1 , z2 , w1 e w2 no programa apresentado a seguir. Em seu
relatório final coloque os ’prints’ da janela Watches do debugger.
48
++
Princípios de programação em C
6 x1 = 15; x2 = 125 - x1 ;
7 y1 = (3 * x2 ) - (2 * x1 ) ; y2 = x1 + x2 + y1 ;
8 z1 = x2 + y2 - x1 ; z2 = (2 * z1 ) + (4 * x2 ) ;
9 x1 = x1 - (2 * z1 ) ; x2 = x1 + (2 * x2 ) ;
10 w2 = x2 + x1 - z1 ; w1 = x1 + z2 - y2 + z1 ;
11 x2 = x1 + x2 ;
12 w2 = 4 + (6 * y2 ) - (2 * z1 ) + 5;
13 return 0;
14 }
49
Capítulo 4
Conteúdo do capítulo
4.1 Os tipos de dados mais comumente utilizados em C++ . 51
4.1.1 Variáveis booleanas e variáveis inteiras . . . . . . . . . . . 51
4.1.2 Os tipos float e double . . . . . . . . . . . . . . . . . . . . 54
4.1.3 Variáveis do tipo string nos padrões C e C++ . . . . . . . 56
4.1.3.1 Variáveis string no padrão C . . . . . . . . . . . 56
4.1.3.1.1 Saídas formatadas com o sprintf(): . . . 61
4.1.3.2 Variáveis string no padrão C++ . . . . . . . . . . 62
4.1.4 Enumerações . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.1.5 Variáveis especiais para armazenamento de data e hora . . 71
4.1.6 O comando typedef para tipos de dados personalizados . . 76
4.1.7 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.1.8 Definição de macros por meio da diretiva #define . . . . . 81
4.2 Os argumentos argc e argv da função int main() . . . . 82
4.3 Comandos de atribuição e comparação de valores . . . . 84
4.3.1 Comandos de atribuição simples e múltipla . . . . . . . . 84
4.3.2 Operador de comparação de valores . . . . . . . . . . . . . 84
4.4 Operadores matemáticos, regras de precedência, con-
versão entre tipos e castings . . . . . . . . . . . . . . . . . 84
4.4.1 Conversão entre tipos de dados . . . . . . . . . . . . . . . 86
4.5 Operadores lógicos e relacionais . . . . . . . . . . . . . . . 89
4.6 Operadores numéricos de incremento e de decremento . 90
4.7 Declaração de variáveis com a instrução register . . . . . 91
4.8 Atividades para fixação da aprendizagem . . . . . . . . . 91
50
++
Princípios de programação em C
5 int main ()
6 {
7 bool TanqueCheio = false ;
8 int VolMax = 20;
9 int VolAtual = 0;
10
11 cout << " Volume atual do tanque ..: " ; cin >> VolAtual ;
12 cout << endl ;
13 TanqueCheio = ( VolAtual >= VolMax ) ;
14 cout << " Tanque esta cheio \? " << TanqueCheio << endl ;
15
16 return 0;
17 }
51
++
Princípios de programação em C
riável ’VolMax’), e armazenar o valor 1 (um, true) caso o atual volume do tanque
seja maior ou igual ao limite máximo. O valor atual do volume do tanque é um
numeral inteiro, que deverá ser informado pelo programador em tempo de execução
do programa.
No próximo exemplo é mostrada a utilização de uma variável booleana para a
interrupção de um laço de repetição while(). Não se preocupe nesse momento com
os comandos desconhecidos, como while() e if(), eles serão apresentados oportuna-
mente.
Nesse código, o comando while() irá executar indefinidamente todo o bloco de
instruções entre as linhas 11 e 19, até que seja alcançado um critério de parada. Esse
critério é dado pela variável ’Continua’, que assumirá o valor ”false” (ou zero) quando
a variável i assumir o valor 11 (onze). A cada vez que o comando while() executar
o bloco de instruções entre as linhas 11 e 19, a variável inteira i será incrementada
em uma unidade, como mostrado na linha 13.
1 # include < iostream >
2
5 int main ()
6 {
7 bool Continua = true ;
8 int i = 1;
9
10 while ( Continua )
11 {
12 cout << " Linha ..: " << i << endl ;
13 i = i + 1;
14
15 if (i >10)
16 {
17 Continua = false ;
18 }
19 }
20 return 0;
21 }
• short: É utilizado para modificar o tipo int para que esse fique com um tama-
52
++
Princípios de programação em C
• long: Ao contrário do modificador short, o long faz com que o tipo int es-
tenda sua capacidade de armazenamento, podendo armazenar números ainda
maiores.
4 int main () {
5 int x1 ; // -2147483648 a 2147483647;
6 short int x2 ; // -32768 a 32767;
7 long int x3 ; // -2147483648 a 2147483647;
8 signed int x4 ; // -2147483648 a 2147483647;
9 unsigned int x5 ; // 0 a 4294967295;
10 short signed int x6 ; // -32768 a 32767;
11 long signed int x7 ; // -2147483648 a 2147483647;
12 short unsigned int x8 ; // 0 a 65535;
13 long unsigned int x9 ; // 0 a 4294967295;
14
25 return 0;
26 }
53
++
Princípios de programação em C
6 int main ()
7 {
8
18 return 0;
19 }
54
++
Princípios de programação em C
Ao tentar dividir um numeral por zero, o compilador irá gerar uma mensagem
com o texto inf e a apresentará na tela do computador, indicando que esse valor
tende a infinito. A tentativa de dividir zero por zero fará com que o compilador gere
uma mensagem com o texto -nan (not a number ), indicando uma indeterminação
matemática, como mostrado no exemplo a seguir. Os erros apresentados pelo com-
pilador não interrompem a execução do programa, e são erros que podem ocorrer
na realização de cálculos matemáticos e numéricos envolvendo o uso de variáveis do
tipo float e double.
1 # include < iostream >
2
5 int main ()
6 {
7
20 return 0;
21 }
55
++
Princípios de programação em C
1 double x = 3 . 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 2 6 4 3 3 8 3 2 7 9 5 0 2 8 8 ;
2 float y = 3 . 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 2 6 4 3 3 8 3 2 7 9 5 0 2 8 8 ;
3 ...
4 if ( x == y ) {...}
• Ao trabalhar com números muito grandes ou muito pequenos, uma boa es-
tratégia é reescaloná-los com o auxílio da função logaritmo. Por exemplo, ao
invés de dividir diretamente um número W , exageradamente grande, por um
número R, também exageradamente grande (W/R), calcule log(W )−log(R),
e aplique exp() ao resultado final (COOK, 2014). Detalhes sobre as funções
log() e exp() serão apresentados no Capítulo 7, seção 7.1, a partir da p.135.
56
++
Princípios de programação em C
O exemplo a seguir mostra que é possível verificar que outros caracteres, como
o espaço em branco (linha 2) e o salto de linha (’\n’, na linha 4), também podem
ser incluídos em variáveis caractere.
1 char a = ’A ’ ;
2 char b = ’ ’ ;
3 char c = ’D ’ ;
4 char d = ’\ n ’;
5 char e = ’P ’ ;
6
M a r i a '\0'
Figura 4.1: Vetor de caracteres de seis posições. O caractere nulo vem sempre na
última posição. (Fonte: autores)
57
++
Princípios de programação em C
58
++
Princípios de programação em C
P a u l a '\0'
M a r i a '\0'
6 int main ()
7 {
8 char Nome1 [6] = " Paula " ;
9 char Nome2 [6] = " \0 " ;
10
17 return 0;
18 }
5 int main ()
6 {
7 char Nome1 [6] = " Paula " ;
8 char Nome2 [6] = " \0 " ;
59
++
Princípios de programação em C
13 return 0;
14 }
A função strcmp permite comparar duas strings. Esta função possui a sintaxe
apresentada a seguir, e retorna os seguintes possíveis valores:
1 int strcmp ( char * s1 , char * s2 ) ;
60
++
Princípios de programação em C
No código anterior, ’Texto1’ é menor que ’Texto2’, pois a terceira letra (’c’)
em ’Texto1’ vem antes da terceira letra (’t’) em ’Texto2’, e a função strcmp irá
retornar algum valor menor do que zero.
É importante notar que a função strcmp faz diferenciação de caracteres maiús-
culos e minúsculos. Assim, as strings ’Aw’ e ’aw’ serão consideradas diferentes por
essa função. Várias outras funções para busca de substrings, cópia, comparação e
separação de fragmentos de texto, baseadas no uso de delimitadores, estão definidas
na biblioteca cstring.
A biblioteca cctype também possui um número de funções para conversão e testes
em caracteres individuais nos vetores de caracteres como, por exemplo, conversão
para maiúsculo e minúsculo, checagem para verificar se o caractere é numérico ou
alfanumérico, e muitas outras funções.
6 int main () {
7 double Pressao = 142.147852; // Seis casas decimais
8 float pH = 4.256581; // Seis casas decimais
9 char Msg1 [30] = { ’ \0 ’ };
10 char Msg2 [30] = { ’ \0 ’ };
11 char Msg3 [30] = { ’ \0 ’ };
12 char MsgFinal [30];
13
25 return 0;
26 }
61
++
Princípios de programação em C
A declaração de uma variável string é feita por meio da palavra reservada string,
como exemplificado a seguir:
1 string Nome ; // Declara a variavel string ’ Nome ’
6 int main () {
7
21 return 0;
22 }
62
++
Princípios de programação em C
6 int main () {
7
63
++
Princípios de programação em C
44 return 0;
45 }
6 cout << " Texto 1.: " << Texto1 << endl ;
7
8 /*
9 Saida : PrimeiroSegundo
10 */
64
++
Princípios de programação em C
A comparação direta entre duas strings pode ser feita com os operadores listados
na Tabela 4.2. As comparações referem-se à ordenação alfabética. Assim, por
exemplo, ao comparar str1 = ’Ana’ e str2 = ’Maria’, o teste comparativo indicará
que ’Ana’ é menor do que ’Maria’, devido ao fato de ’Ana’ vir antes de ’Maria’
quando estes nomes são dispostos em ordem alfabética.
O exemplo a seguir mostra como variáveis do tipo string podem ter seus valores
comparados com a utilização dos operadores apresentados na Tabela 4.2.
1 # include < iostream > // Exemplos de comparacao de strings
2 # include < string >
3 using namespace std ;
4
5 int main () {
6
10 if ( Aluno1 == Aluno2 )
11 {
12 cout << " Os nomes sao iguais " << endl ;
13 }
14 else if ( Aluno1 < Aluno2 )
15 {
16 cout << " Aluno1 < Aluno2 " << endl ;
17 }
65
++
Princípios de programação em C
23 return 0;
24 }
6 int main () {
7
21 return 0;
22 }
4 cout << " Aluno 1..: " << Aluno1 << endl ; // Ana Paula
5 cout << " Aluno 2..: " << Aluno2 << endl ; // Paula Silva
6
10 cout << " Aluno 1..: " << Aluno1 << endl ; // Paula Silva
11 cout << " Aluno 2..: " << Aluno2 << endl ; // Ana Paula
66
++
Princípios de programação em C
O método find, na linha 2 do próximo exemplo, mostra como este comando pode
ser utilizado para procurar um fragmento de texto dentro de uma string e indicar
qual a posição onde ele começa.
Neste exemplo, o find foi utilizado para procurar a substring ”ind” dentro de
’Texto1’, começando a busca a partir da segunda posição. Caso nenhuma ocorrência
da subtring seja localizada dentro da string, o find retornará um valor string::npos,
que corresponde ao maior valor numérico que pode ser armazenado em um unsigned
int.
1 string Texto1 = " Processos industriais " ;
2 cout << " Posicao : " << Texto1 . find ( " ind " , 2) << endl ;
3 // Saida : Posicao : 10
O método substr é utilizado para extrair uma substring a partir de uma string.
Para utilizá-lo é necessário informar a posição inicial a partir da qual a substring
deverá ser extraída e o seu comprimento, como mostrado a seguir.
1 string Texto1 = " Processos industriais " ;
2 cout << " Substring : " << Texto1 . substr (10 , 3) << endl ;
3 // Saida : Substring : ind
6 int main () {
67
++
Princípios de programação em C
7 double pH = 6.278975;
8 string Texto1 = " Valor do pH ..: " ;
9 char vTemp [10]; // Vetor temporario
10
15 return 0;
16 }
4.1.4 Enumerações
Enumerações correspondem a um tipo de dado que é definido pelo programador, e
que consiste em atribuir valores do tipo inteiro a nomes pré-definidos. Para decla-
rar uma enumeração utiliza-se a palavra reservada enum, como mostrado a seguir.
Neste exemplo, observe que a enumeração é do tipo ’Escala’, porém é a variável
inteira ’Nota’ que será utilizada no corpo do programa para armazenar os valores de
escores sensoriais.
1 # include < iostream >
2
5 int main () {
6
7 enum Escala { D e s g o s t e i _ E x t r e m a m e n t e = 1,
8 Desgostei_Muito = 2,
9 Desgostei_Moderadamente = 3,
10 Desgostei_Ligeiramente = 4,
11 Indiferente = 5,
12 G os t e i _L i g ei r a me n t e = 6,
13 Gostei_Moderadamente = 7,
14 Gostei_Muito = 8,
15 G os t e i _E x t re m a me n t e = 9} Nota ;
16
19 cout << " Escore sensorial : " << Nota << endl ;
20 /* Saida : Escore sensorial : 8 */
21
22 return 0;
23 }
68
++
Princípios de programação em C
desvios condicionais if() e switch(). O exemplo a seguir mostra como utilizar uma
enumeração para decidir sobre a escolha de algum tipo de fruta. Neste exemplo, a
variável ’Escolha’ é declarada explicitamente como int no código.
1 enum Frutas { Banana , Goiaba , Pera , Morango };
2 int Escolha = Morango ;
3
4 if ( Escolha == Morango ) {
5 cout << " Fruta escolhida : morango " << endl ;
6 } else {
7 cout << " Fruta escolhida : " << Escolha << endl ;
8 }
11 switch ( TipoTT ) {
12 case Esterilizacao :
13 cout << " Processo : Esterilizacao " ;
14 break ;
15 case Pasteurizacao :
16 cout << " Processo : Pasteurizacao " ;
17 break ;
18 case Branqueamento :
19 cout << " Processo : Branqueamento " ;
20 break ;
21 case Termizacao :
22 cout << " Processo : Termizacao " ;
23 break ;
24 default :
25 cout << " Valor indefinido " ;
26 }
27 return 0;
28 }
69
++
Princípios de programação em C
4 int main () {
5 enum Meses { janeiro = 1,
6 fevereiro = 2,
7 marco = 3,
8 abril = 4,
9 maio = 5,
10 junho = 6,
11 julho = 7,
12 agosto = 8,
13 setembro = 9,
14 outubro = 10 ,
15 novembro = 11 ,
16 dezembro = 12};
17 int i ;
18
70
++
Princípios de programação em C
4 int main () {
5 int dia , mes , ano ;
6 cout << " Dia : " ; cin >> dia ; cin . ignore () ;
7 cout << " Mes : " ; cin >> mes ; cin . ignore () ;
8 cout << " Ano : " ; cin >> ano ; cin . ignore () ;
9 cout << endl << dia <<" / " << mes <<" / " << ano << endl ;
10 return 0;
11 }
Variáveis do tipo vetor de inteiros (Capítulo 10, Seção 9.1, p.172) também podem
ser empregadas para o armazenamento de datas, assim como estruturas de dados
(Capítulo 12, Seção 10.9, p.224).
Da mesma forma que para as datas, os valores referentes a horas também podem
ser armazenados em variáveis inteiras, vetores de inteiros e estruturas de dados. O
código a seguir é o mesmo apresentado anteriormente, com ligeiras modificações.
1 # include < iostream >
2 using namespace std ;
3
4 int main () {
5 int hora , min , seg ;
6 cout << " Hora : " ; cin >> hora ; cin . ignore () ;
7 cout << " Min .: " ; cin >> min ; cin . ignore () ;
8 cout << " Seg .: " ; cin >> seg ; cin . ignore () ;
9 cout << endl << hora <<" : " << min <<" : " << seg << endl ;
10 return 0;
11 }
71
++
Princípios de programação em C
7 int main ()
8 {
9
27 }
A biblioteca ctime define quatro tipos básicos que podem ser utilizados na mani-
pulação de data e hora: tm, clock_t, time_t e size_t. A estrutura tm definida em
ctime é padrão das linguagens C/C++ , e mantém informações sobre a data e a hora
do sistema operacional. Ela é composta pelos seguintes elementos:
72
++
Princípios de programação em C
1 struct tm {
2 int tm_sec ; // segundos de minutos , de 0 ate 61
3 int tm_min ; // minutos de hora , de 0 ate 59
4 int tm_hour ; // horas do dia , de 0 a 24
5 int tm_mday ; // dia do mes , de 1 a 31
6 int tm_mon ; // mes do ano , de 0 a 11
7 int tm_year ; // ano desde 1900
8 int tm_wday ; // dias , desde domingo
9 int tm_yday ; // dias , desde primeiro de janeiro
10 int tm_isdst ; // horas de horario de verao
11 }
73
++
Princípios de programação em C
• size_t strftime(): esta função serve para formatar a data e a hora antes de
apresentá-las na tela ou armazená-las em uma variável.
5 int main () {
6
19 cout << " Ano ...: " << 1900 + LocTime - > tm_year << endl ;
20 cout << " Mes ...: " << 1 + LocTime - > tm_mon << endl ;
21 cout << " Dia ...: " << LocTime - > tm_mday << endl ;
22 cout << 1 + LocTime - > tm_min << " : " ;
23 cout << 1 + LocTime - > tm_sec << endl ;
24 }
25 // ======================================================
26 // Saida :
27 // ------------------------------------------------------
28 // Numero de segundos desde 01 jan 1970: 1571409569
29 // Ano ...: 2019
30 // Mes ...: 10
31 // Dia ...: 18
32 // Hora ..: 12:40:30
33 // ======================================================
74
++
Princípios de programação em C
6 int main () {
7 cout << " Texto 1 " << endl ;
8 sleep (5) ; // Espera 5 segundos ;
9 cout << " Texto 2 " << endl ;
10 usleep (500000) ; // Espera 500 mil microsegundos ;
11 cout << " Texto 3 " << endl ;
12
13 return 0;
14 }
75
++
Princípios de programação em C
5 int main ()
6 {
7 cout << " Pressione uma tecla para continuar " << endl ;
8 cin . get () ; // Aguarda o pressionar de alguma tecla ;
9
7 int main ()
8 {
9
16 return 0;
17 }
Na construção de programas para fins específicos como, por exemplo, para cál-
culos de pagamentos de funcionários, fornecedores, controles de estoque, gestão de
frotas de veículos, peças ou contabilidade (próximo exemplo), o código fica visivel-
mente mais simples e compreensível pelo programador.
Outros tipos de dados também podem ser renomeados com o comando typedef, e
sua aplicação vai além dos exemplos mostrados aqui, visto que ele pode ser utilizado
em estruturas, classes, e outros recursos do C++ que estão fora do escopo deste
76
++
Princípios de programação em C
livro-texto.
1 # include < iostream >
2
7 int main ()
8 {
9
13 Moeda PgtoTotal ;
14
17 cout << " Salario ...: " << Salario << endl ;
18 cout << " Desconto ..: " << Desconto << endl ;
19 cout << " Pgto Total : " << PgtoTotal << endl ;
20
21 return 0;
22 }
4.1.7 Constantes
Em C++ as ’constantes’ são muito parecidas com as variáveis, porém com a carac-
terística de o seu valor permanecer inalterado durante toda a execução do programa.
As constantes podem ser de valores numéricos e também de valores não numéricos,
como strings, por exemplo. Qualquer tentativa de modificar o valor de uma cons-
tante irá gerar, em tempo de execução, um erro no programa. Há basicamente duas
formas de declarar uma constante:
As ’constantes globais’ são definidas antes da função int main(), como no exem-
plo a seguir:
77
++
Princípios de programação em C
3 # define Pi 3.14159
4 # define g 9.80665
5 # define R 8.31446
6 # define Erro1 " Erro ao ler os dados ! "
7 # define Erro2 " Erro ao gravar os dados "
8 # define ICMS 0.18
9
12 int main () {
13 float Raio = 2.25;
14 float Area = Pi * Raio * Raio ;
15 float Massa = 5.0;
16 float Dens = Massa / ( Raio * Area ) ; // Altura = Raio ;
17 float Preco = 2500.00;
18 float Imposto = Preco * ICMS ;
19
20 cout << " Densidade ...........: " << Dens << endl ;
21 cout << " Constante dos gases .: " << R << endl ;
22 cout << " Imposto da compra ...: " << Imposto << endl ;
23 cout << " Mensagem ............: " << Erro1 << endl ;
24
25 return 0;
26 }
6 int main () {
7
78
++
Princípios de programação em C
16
23 cout << " Densidade ...........: " << Dens << endl ;
24 cout << " Constante dos gases .: " << R << endl ;
25 cout << " Mensagem ............: " << Erro1 << endl ;
26
27 return 0;
28 }
6 int main () {
7
12 cout << " Amostra ....: " ; cin . get ( vAmostra , TamMax ) ;
13 cin . ignore () ;
14
18 cout << " Analista ...: " ; cin . get ( vTec , TamMax ) ;
19 cin . ignore () ;
20
21 return 0;
22 }
79
++
Princípios de programação em C
14 # endif
6 int main () {
7 cout << " Valor do PI : " << PI << endl ;
8 return 0;
9 }
3
É o mesmo que incluir ou ’chamar’ o arquivo externo para dentro do programa principal, por meio
de uma referência ao seu nome e à sua localização no computador.
80
++
Princípios de programação em C
6 int main ()
7 {
8 float Base = 5.25;
9 float Altura = 6.24;
10 float Area = AreaRet ( Base , Altura ) ;
11 cout << " Area do retangulo : " << Area << endl ;
12 return 0;
13 }
7 int main () {
8 float Valor1 = 7.56;
9 float Valor2 = 8.87;
10 cout << " Maior valor : " << Maior ( Valor1 , Valor2 ) << endl ;
11 cout << " Menor valor : " << Menor ( Valor1 , Valor2 ) << endl ;
12 return 0;
13 }
81
++
Princípios de programação em C
Muitas macros já vêm pré-definidas pelo compilador C++ e podem ser acessadas
sem nenhuma declaração prévia. Algumas dessas macros estão apresentadas no
código a seguir.
1 # include < iostream >
2 using namespace std ;
3
4 int main () {
5
6 cout << " Data atual ..........: " << __DATE__ << endl ;
7 cout << " Hora atual ..........: " << __TIME__ << endl ;
8 cout << " Nome do arquivo .....: " << __FILE__ << endl ;
9 cout << " Linha atual .........: " << __LINE__ << endl ;
10 cout << " Compilador ANSI C ...: " << __STDC__ << endl ;
11 cout << " Versao do compilador : " << __VERSION__ << endl ;
12 cout << " C ou C ++............: " << __cplusplus << endl ;
13 return 0;
14 }
Além das macros apresentadas nas linhas 6 e 7 do código acima, alguns recursos
para manipulação de data e hora já foram abordados anteriormente neste capítulo,
na seção 4.1.5, p.71.
• argc: é um valor inteiro que informa para a int main() a quantidade de argu-
mentos que serão passados no prompt de comandos ao chamar o programa.
82
++
Princípios de programação em C
O exemplo a seguir mostra como podemos passar para um programa dois nume-
rais a partir do prompt de comandos e processar internamente esses valores numé-
ricos.
1 # include < iostream >
2 # include < cstdlib > // Para a funcao atof ;
3
14 cout << " Maior valor ....: " << Maior ( Valor1 , Valor2 ) <<
endl ;
15 cout << " Qtd . argumentos : " << argc << endl ;
16
17 return 0;
18 }
No código acima, a função atof() da biblioteca cstdlib serve para converter para
float a informação alfanumérica armazenada nas posições 1 e 2 de argv. Para a
conversão de valores inteiros deve-se utilizar a função atoi(). A seguir é mostrado
um exemplo de como esse código é executado na linha de comandos do terminal do
MS Windows e a sua saída correspondente.
1 C :\ > Teste . exe 9.668 6.478 < ENTER >
2 Maior valor ....: 9.668
3 Qtd . argumentos : 3
83
++
Princípios de programação em C
84
++
Princípios de programação em C
√
Avaliação 2:) 36/5 = (6/5) = 1, 2
85
++
Princípios de programação em C
5 int main () {
6
5 int main () {
6 char vValor1 [10] , vValor2 [10];
7 cout << " Digite float 1: " ; cin . getline ( vValor1 , 10) ;
8 cout << " Digite float 2: " ; cin . getline ( vValor2 , 10) ;
9
12 cout << " Soma ..........: " << Soma << endl ;
13 return 0;
14 }
86
++
Princípios de programação em C
6 int main () {
7
12 cout << " Valor inteiro : " << ValorInt << endl ;
13 cout << " Valor float ..: " << ValorFlt << endl ;
14 cout << " Valor double .: " << ValorDbl << endl ;
15
16 return 0;
17 }
6 int main () {
7 int ValorInt ;
8 double ValorDbl = 7.745;
9
12 cout << " Valor double .: " << ValorDbl << endl ; // 7.745
13 cout << " Valor inteiro : " << ValorInt << endl ; // 8
14
15 return 0;
16 }
87
++
Princípios de programação em C
Caso a função round() não seja utilizada, o casting (int) fará a conversão do valor
float/double para inteiro, tomando apenas a sua parte inteira, ou seja, antes do ponto
decimal, e todos os numerais que vêm após a casa decimal serão descartados.
1 ValorInt = ( int ) ( ValorDbl ) ;
2 cout << " Valor double .: " << ValorDbl << endl ; // 7.745
3 cout << " Valor inteiro : " << ValorInt << endl ; // 7
6 int main () {
7
17 cout << " Volume ..: " << Volume << endl ; //
18
88
++
Princípios de programação em C
1 if ( a > b ) {...}
2 if ( pH <= 4.5) {...}
3 if ( Temper == 82.5) {...}
4 if ( Concentracao != 7.78) {...}
5 if (( pH >= 4.5) && ( Temper <= 85.8) ) {...}
6 if ((( x > L1 ) && ( x < L2 ) ) || (( y < L3 ) && ( y > L4 ) ) ) {...}
7 float ( pH =3.89) , Temper ; pH < 4.25 ? Temper =121: Temper =90;
89
++
Princípios de programação em C
90
++
Princípios de programação em C
91
++
Princípios de programação em C
(a) Escreva um programa que utilize variáveis declaradas como ’string’ para ler
o nome de quatro empresas fornecedoras de produtos para uma indústria.
Após a digitação dos nomes pelo usuário, esses devem ser impressos na
tela do computador, juntamente com o tamanho da string que foi digitada.
(b) O que você entende por ’concatenação de strings’? Explique e dê dois
exemplos.
(c) Explique para que servem os métodos clear(), insert(), append() e com-
pare() que operam sobre ’strings’. Dê um exemplo da utilização de cada
um desses métodos.
92
++
Princípios de programação em C
(d) Explique para que servem os métodos swap(), erase(), find() e substr()
que operam sobre ’strings’. Dê um exemplo da utilização de cada um
desses métodos.
5. Enumerações
(a) Explique o são as ’enumerações’. Para que servem? Quando são utiliza-
das?
(b) Escreva um programa (à sua escolha!) que obrigatoriamente utilize uma
enumeração para decidir sobre turnos de trabalho em uma indústria: ’ma-
nhã=1’, ’tarde=2’, ’noite=3’.
(a) Escreva um programa que utilize o comando typedef para criar os seguin-
tes tipos personalizados:
i. ’Temperatura’, ’Produto’ e ’Lote’.
8. Constantes e macros
(a) Escreva três programas (i, ii e iii) nos quais sejam declaradas e utilizadas
as seguintes constantes:
i. Gravidade, g = 9, 80665, e massa M = 12, 5 kg.
ii. pH crítico, pH = 4, 5, e Temperatura de esterilização Te = 121, 1 o C.
iii. Pressão máxima, PMax = 1, 82 atm, e Força F~ = 16 N.
93
++
Princípios de programação em C
(a) Escreva um programa que leia 5 (cinco) valores inteiros digitados pelo
usuário. Se algum dos valores digitados for exatamente igual à ’-1’, então
o programa deverá exibir uma mensagem para o usuário: ’Programa ter-
minado!’, aguardar 5 segundos (função sleep()) e, em seguida, encerrar
o programa.
(b) Explique qual é a diferença entre o ’operador de atribuição’ e o ’operador
de comparação’ em C++ . Dê um exemplo.
(a) O que são castings? Para que eles servem? Em que situações são utili-
zados? Dê três exemplos.
(b) O que você entende por ’conversão’ de tipos de dados? Explique e dê
três exemplos.
(a) O que são operadores lógicos relacionais? Para que servem? Explique e
dê quatro exemplos de sua utilização.
94
++
Princípios de programação em C
95
Capítulo 5
Desvios condicionais
Conteúdo do capítulo
5.1 Desvios condicionais em C++ . . . . . . . . . . . . . . . . 96
5.1.1 Desvio condicional simples . . . . . . . . . . . . . . . . . . 96
5.1.1.1 Uso do operador interrogação (operador ternário) 96
5.1.2 Desvio condicional composto . . . . . . . . . . . . . . . . 98
5.1.3 if ’s aninhados . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.1.4 As instruções switch(), case, break e default . . . . . . . . 103
5.2 Atividades para fixação da aprendizagem . . . . . . . . . 106
<Condição>?<Verdadeiro>:<Falso>
96
++
Princípios de programação em C
5 int main () {
6
7 int x ;
8
13 ( x >= 10) ? ( cout << " X >= 10 " ) : ( cout << " X < 10 " ) ;
14
15 return 0;
16 }
6 int main () {
7
15 ( pH < 4.5) ? ( Seguranca = " SIM " ) : ( Seguranca = " NAO " ) ;
16
17 cout << " Pode ser consumido ? " << Seguranca << endl ;
18
19 return 0;
20 }
97
++
Princípios de programação em C
if(<Condição>)
{
instruções;
}
else
{
instruções;
}
A ’<condição>’ é um parâmetro que deve ser obrigatoriamente informado ao
utilizar o comando if()...else(). O par de chaves delimita o espaço dentro do qual
as instruções devem ser inseridas, para serem executadas caso a condição seja ver-
dadeira. O ’else’ não é obrigatório, mas se for utilizado serve para especificar uma
tomada de decisão alternativa, caso a condição seja falsa. Os operadores de compa-
ração utilizados pelo comando if()...else() são os mesmo que já foram apresentados
anteriormente na Tabela 4.2, p.89.
1 x = 10;
2
3 if ( x >= 45)
4 {
5 cout << " Temperatura maior ou igual a 45 Celsius " << endl ;
6 }
7 else
8 {
9 cout << " Temperatura menor que 45 Celsius " << endl ;
10 }
98
++
Princípios de programação em C
1 if ( !( x > 5) )
2 { ... instrucoes ;}
A condição a ser avaliada também poderá ser uma função, uma subrotina ou
mesmo uma macro declarada com #define, como no exemplo a seguir.
1 # include < iostream >
2 # define Soma (x , y ) ( x ) +( y )
3
6 int main () {
7
18
28 return 0;
29 }
99
++
Princípios de programação em C
baseadas em faixas de valores numéricos dentro das quais pode haver exceções.
No exemplo a seguir a condição será verdadeira se os valores de x estiverem
dentro da faixa que vai de 10 a 110, inclusive esses valores extremos, situação essa
na qual o processador irá executar os comandos compreendidos entre as linhas 2 e
4. Caso o valor de x esteja fora desse intervalo, então o processador irá executar
o bloco alternativo de códigos, compreendido entre as linhas 6 e 8, mas esse bloco
alternativo somente será executado se o valor de x for diferente de 120.
1 if ( ( x >= 10) && ( x <= 110) )
2 {
3 ... instrucoes aqui ;
4 }
5 else if ( ( x != 120) )
6 {
7 ... instrucoes aqui ;
8 }
É permitido ter mais de uma cláusula ’else’, como mostrado no código a seguir.
O compilador avaliará todas as cláusulas ’else’, uma por vez, e sairá imediatamente
do comando if()...else() assim que encontrar algum ’else’ que possa ser executado.
1 # include < iostream >
2 using namespace std ;
3
4 int main () {
5
No exemplo a seguir, apenas a condição (x > 20) é que será executada. Ao ter-
minar de executar o bloco contido entre as linhas 12 e 14, o processador abandonará
100
++
Princípios de programação em C
101
++
Princípios de programação em C
4 int main () {
5
6 float pH = 4.2; // pH ;
7 float ConcX = 0.50; // Concentracao de X ;
8 float ConcY = 1.25; // Concentracao de Y ;
9 float DQO = 0.00; // Demanda oxigenio ;
10
11 if ( pH < 4.5)
12 {
13 if ( ( ConcX > 0.25) && ( ConcX <= 045) )
14 {
15 DQO = 2.47 * ConcY ;
16 }
17 else
18 {
19 DQO = 0.58 * ConcY ;
20
21 if ( DQO > 8)
22 {
23 DQO = 6.25;
24 }
25 else
26 {
27 DQO = 4.82;
28 }
29 }
30 }
31 else
32 {
33 DQO = 1.26;
34 }
35
41 return 0;
42 }
102
++
Princípios de programação em C
6 cout << " ===[ CONVERSAO DE TEMPERATURA ]=== " << endl ;
7 cout << " 1 - De Celsius para Kelvin " << endl ;
8 cout << " 2 - De Kelvin para Celsius " << endl ;
9 cout << " 3 - De Celsius para Fahrenheit " << endl ;
10 cout << " = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = " << endl ;
11 cout << " --> DIGITE 1 , 2 ou 3 ou outra le " << endl ;
12 cout << " tra para sair " << endl ;
13 cout << " = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = " << endl ;
14 cout << " --> ESCOLHA .: " ;
15 cin >> Escolha ; // Le a tecla digitada pelo
16 cin . ignore () ; // usuario : 1 , 2 ou 3
17 cout << endl ;
103
++
Princípios de programação em C
18
19 switch ( Escolha )
20 {
21 case 1:
22 cout << " Temperatura em Celsius .: ";
23 cin >> Temper ;
24 Temper += 273.15;
25 cout << " Temperatura em Kelvin ..: " << Temper << endl ;
26 break ;
27 case 2:
28 cout << " Temperatura em Kelvin ..: ";
29 cin >> Temper ;
30 Temper -= 273.15;
31 cout << " Temperatura em Celsius .: " << Temper << endl ;
32 break ;
33 case 3:
34 cout << " Temperatura em Celsius .: ";
35 cin >> Temper ;
36 Temper = ( Temper * 1.8) + 32;
37 cout << " Temperatura Fahrenheit .: " << Temper << endl ;
38 break ;
39
40 default :
41 cout << " Terminado ! " << endl << endl ;
42 }
43 return 0;
44 }
No programa acima, o bloco identificado por ’default’ (na linha 40) será execu-
tado se o usuário informar qualquer outro valor diferente dos valores 1, 2 ou 3 no
menu de opções.
O switch pode ser combinado com quaisquer outros elementos e comandos da
programação C++ com o objetivo de aumentar as funcionalidades de um programa.
No exemplo a seguir o switch é utilizado para avaliar o tipo de parâmetro passado
como argumento na linha de comando do programa por meio de argc e argv.
1 # include < iostream >
2
104
++
Princípios de programação em C
12 case ’b ’:
13 cout << " O parametro foi <b > " ;
14 break ;
15 case ’c ’:
16 cout << " O parametro foi <c > " ;
17 break ;
18 default :
19 cout << " Parametro desconhecido " << endl << endl ;
20 }
21 return 0;
22 }
4 int main ()
5 {
6 int CodCor ;
7 enum Cor { Verde = 1,
8 Azul = 2,
9 Branco = 3,
10 Amarelo = 4};
11
16 switch ( CodCor )
17 {
18 case Verde :
19 cout << " Escolheu cor VERDE " << endl ; break ;
20 case Azul :
21 cout << " Escolheu cor AZUL " << endl ; break ;
22 case Branco :
23 cout << " Escolheu cor BRANCA " << endl ; break ;
24 case Amarelo :
25 cout << " Escolheu cor AMARELA " << endl ; break ;
26 default :
27 cout << " Cor invalida ! Tente outra " << endl << endl ;
28 }
29
30 return 0;
31 }
105
++
Princípios de programação em C
(a) O que é o operador ternário ’ ?’. Como ele deve ser utilizado? Dê quatro
exemplos de sua utilização.
ρ × v̄ × D
NRey = (5.1)
µ
106
++
Princípios de programação em C
107
++
Princípios de programação em C
108
++
Princípios de programação em C
109
++
Princípios de programação em C
==========================================================
CTRL DE ESTOQUE DE MATERIAIS - LABORATORIO DE DNP - UFLA
==========================================================
>>>> MENU PRINCIPAL DO MODULO DE CTRL DE ESTOQUE:
----------------------------------------------------------
[A] - INCLUSAO DE NOVOS PRODUTOS
[X] - EXCLUSAO DE PRODUTOS <BUSCA POR CODIGO DE BARRAS>
[D] - EXCLUSAO DE PRODUTOS <BUSCA POR DESCRICAO>
[M] - ALTERACAO DE DADOS DE CADASTRO DO PRODUTO
110
Capítulo 6
Conteúdo do capítulo
6.1 Laços de repetição em C++ . . . . . . . . . . . . . . . . . . 111
6.1.1 O laço ’for()’ . . . . . . . . . . . . . . . . . . . . . . . . . 112
6.1.2 O laço ’while{}’ . . . . . . . . . . . . . . . . . . . . . . . 117
6.1.3 O laço ’do while{}’ . . . . . . . . . . . . . . . . . . . . . . 118
6.1.4 Laços aninhados e os comandos break e continue . . . . . 119
6.1.5 O temido salto incondicional goto . . . . . . . . . . . . . . 122
6.2 O tratamento de exceções com try, throw e catch . . . . 123
6.3 Atividades para fixação da aprendizagem . . . . . . . . . 126
111
++
Princípios de programação em C
Variável: É uma variável inteira ou de ponto flutuante que será utilizada como con-
tador durante os ciclos de repetição.
4 int main () {
5 cout << " 1 " << endl ;
6 cout << " 2 " << endl ;
7 cout << " 3 " << endl ;
8 cout << " 4 " << endl ;
9 cout << " 5 " << endl ;
10 cout << " 6 " << endl ;
11 cout << " 7 " << endl ;
12 cout << " 8 " << endl ;
13 cout << " 9 " << endl ;
14 cout << " 10 " << endl ;
15 return 0;
16 }
112
++
Princípios de programação em C
valores muito maiores, como 1 × 108 , por exemplo. Neste caso a construção do
programa se tornaria uma tarefa impraticável.
O comando for() permite reescrever o mesmo programa acima, porém de uma
forma mais elegante e simplificada, como mostrado a seguir.
1 # include < iostream >
2
5 int main ()
6 {
7
Ou então:
1 for ( i =1; i <=1000; i = i +1)
113
++
Princípios de programação em C
O programador deve ficar atento para não extrapolar os limites numéricos permi-
tidos para o tipo da ’variável contadora’ utilizada dentro do for(). Faixas de valores
para diferentes tipos de dados estão listados na Tabela 3.1, p.24.
Os valores de início e fim de um laço for() podem ser obtidos como resultado
de algum cálculo, serem valores constantes, definidos com #define ou const, ou
mesmo serem informados a partir do teclado.
1 int inicio = 1; int fim = 1000; int i = 0;
2
É possível fazer com o que laço for() execute quase infinitamente um bloco de
instruções. Para isso basta colocar alguma condição de parada que nunca se torne
verdadeira, ou então não especificar nenhuma condição de parada, como mostrado
a seguir.
1 for ( int i =0; ; i ++) {...} // laco for () infinito
114
++
Princípios de programação em C
1 long int i = 1;
2 for ( ; ; ) { // laco for () infinito
3 cout << i << endl ;
4 i ++;
5 }
O critério de parada poderá ser uma condição particular para alguma situação
específica. No Capítulo 4, Seção 4.1.3.1, p.57, discutiu-se que as strings do tipo
’vetor de caracteres’ terminam com o símbolo ’\0’. Assim, o comando for() pode ser
utilizado para percorrer todas as posições de um vetor de caracteres e parar apenas
quando o símbolo ’\0’ for encontrado. O próximo exemplo mostra como isso pode
ser feito.
1 # include < iostream >
2 using namespace std ;
3
4 int main () {
5 char vNome [80];
6 cout << " Digite seu nome .: " ; cin . getline ( vNome , 80) ;
7
Se a declaração de uma variável do tipo string for feita com a instrução string, da
biblioteca string 1 , então o comando for() pode ser utilizado para percorrer todos os
caracteres contidos na variável, conforme mostrado a seguir. Neste caso é utilizado
o método size() para obter o tamanho total do texto contido na variável ’Aluno’.
O método size() já foi apresentado anteriormente2 ao discutir diferentes formas de
trabalhar com variáveis do tipo string.
1 # include < iostream >
2 # include < string >
3 using namespace std ;
4
5 int main () {
6 string Aluno = " Jose da Silva " ;
7 for ( register int i = 0; i < Aluno . size () ; i ++) {
8 cout << Aluno [ i ] << endl ;
9 }
10 return 0;
11 }
1
Ver Capítulo 4, Seção 4.1.3.2, p.62
2
Ver Capítulo 4, Seção 4.1.3.2, p.63
115
++
Princípios de programação em C
Há também uma forma de saltar iterações dentro de um laço for(), e isso é feito
pelo comando continue. Esse comando quebra uma iteração do ciclo e vai para a
próxima iteração. No exemplo a seguir, o laço for() está programado para fazer 10
iterações e listar na tela o valor da variável i para cada uma dessas iterações, exceto
quando i assumir os valores 3 ou 5.
1 for ( int i = 1; i <= 10; ++ i )
2 {
3 if ( i == 3 || i == 5) { // Salta se : i =3 ou i =5
4 continue ;
5 }
6 cout << i << endl ;
7 }
O comando continue pode ser utilizado em várias outras situações dentro do laço
for(). No exemplo a seguir apenas os numerais ímpares de 1 a 100 serão listados
na tela do computador. Para fazer o for() saltar os números pares, foi utilizado o
continue e o operador ’%’, que calcula o resto da divisão entre dois números.
1 for ( int i = 1; i <= 100; i ++)
2 {
3 if ( i % 2 == 0) // Se o resto da divisao de i por 2
4 { // for igual a zero , entao nao faz
5 continue ; // nada , e salta para proxima iteracao
6 } // Imprime apenas os numeros impares
7 else
8 {
9 cout << i << endl ;
10 }
11 }
116
++
Princípios de programação em C
4 int main ()
5 {
6 int vSoma = 0;
7
8 for ( ; ; )
9 {
10 cout << " Digite valor inteiro [ ou 0 para sair ]: " ;
11 int vNumero ;
12 cin >> vNumero ;
13 cin . ignore () ;
14
while([condição])
{
instruções;
}
A seguir é apresentado um exemplo de uso do while() com teste a priori. O bloco
de códigos dentro do while() será executado enquanto a condição avaliada na linha
117
++
Princípios de programação em C
8 for verdadeira.
1 # include < iostream >
2 # include < string >
3 using namespace std ;
4
5 int main () {
6 int i =0;
7
14 return 0;
15 }
5 int main () {
6 int i =0;
7
14 return 0;
15 }
118
++
Princípios de programação em C
Qualquer comando ou combinação dos comandos vistos até agora poderá ser
utilizado dentro do while(). Variáveis declaradas dentro de um while() serão válidas
apenas dentro do while() no qual elas foram declaradas3 .
4 int main ()
5 {
6
119
++
Princípios de programação em C
5 int main ()
6 {
7
120
++
Princípios de programação em C
8 int Escolha ;
9
10 do
11 {
12 system ( " clear " ) ; // Limpa a tela
13 cout << " ====[ PROCESSAMENTO TERMICO ]==== " << endl ;
14 cout << " \ t [1] - Branqueamento " << endl ;
15 cout << " \ t [2] - Pasteurizacao " << endl ;
16 cout << " \ t [3] - Esterilizacao " << endl ;
17 cout << " = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = " << endl ;
18 cout << " Digite aqui ..: " ;
19 cin >> Escolha ;
20 cin . ignore () ;
21 } while (( Escolha <1) ||( Escolha >3) ) ;
22
23 switch ( Escolha )
24 {
25 case 1:
26 {
27 cout << " Voce escolheu BRANQUEAMENTO " << endl ;
28 break ;
29 }
30 case 2:
31 {
32 cout << " Voce escolheu PASTEURIZACAO " << endl ;
33 break ;
34 }
35 case 3:
36 {
37 cout << " Voce escolheu ESTERILIZACAO " << endl ;
38 break ;
39 }
40 }
41 return (0) ;
42 }
121
++
Princípios de programação em C
4 int main ()
5 {
6 int i =0;
7
12 if (i >=60)
13 {
14 goto Termina ; // Vai imediatamente para a linha 19
15 }
16
17 }
18
19 Termina :
20 cout << " Termina o programa abruptamente " << endl ;
21
22 return 0;
23 }
122
++
Princípios de programação em C
18 return (0) ;
19 }
123
++
Princípios de programação em C
4 int main () {
5
18 try
19 {
20 if ( Den == 0)
21 {
22 throw 1; // Lanca uma excecao com valor
23 } // igual a 1 caso o denominador
24 else // seja igual a zero
25 {
26 cout << ( Num / Den ) ;
27 }
28 }
29 catch ( int erro ) // Gera uma mensagem descrevendo
30 { // o tipo de erro quando a exce
31 if ( erro == 1) // cao lancada for igual a 1
32 {
33 cout << " Erro de divisao por zero " << endl ;
34 }
35 }
36
37 return (0) ;
38 }
Dentro do bloco try (entre as linhas 18 e 28) é feito um teste lógico para verificar
se o denominador é igual à zero (linha 20). Caso essa condição seja verdadeira
e o denominador for igual a zero, então será ’lançada’ na linha 22 uma exceção
(um erro) com valor igual a ’1’ (um). Se a condição especificada na linha 20 for
124
++
Princípios de programação em C
falsa e o denominador for algum valor numérico diferente de zero, então não haverá
necessidade de lançar nenhuma exceção, e o comando dentro do bloco else (entre
as linhas 25 e 27) será executado normalmente, e o resultado da divisão Num/Den
será impresso na tela (linha 26).
Caso o denominador seja igual a zero e uma exceção tenha sido lançada (throw )
na linha 22, então essa exceção será capturada pelo bloco catch na linha 29, e o
número da exceção que foi lançada na linha 22 será passada como argumento para
o catch (linha 29). Dentro do bloco catch o erro será avaliado pelo comando if()
(na linha 31) e uma mensagem apropriada, referente ao erro de ’divisão por zero’
será exibida na tela do computador (linha 33), sem que ocorra nenhuma interrupção
ou fechamento forçado do programa.
Neste exemplo, apenas uma única exceção foi tratada, entretanto o programador
poderá avaliar, a seu critério, um número maior de exceções, bastando, para isso,
acrescentar mais condições a serem avaliadas dentro do bloco catch do código. O
exemplo a seguir mostra como isso pode ser feito quando o programador também
deseja impedir que denominadores sejam digitados com sinal negativo.
1 try
2 {
3 if ( Den == 0)
4 {
5 throw 1; // Lanca a primeira excecao
6 }
7 else
8 {
9 if ( Den < 0)
10 {
11 throw 2; // Lanca a segunda excecao
12 }
13 else
14 {
15 cout << ( Num / Den ) ;
16 }
17 }
18 }
19 catch ( int erro )
20 {
21 if ( erro == 1)
22 {
23 cout << " Erro de divisao por zero " << endl ;
24 }
25 if ( erro == 2)
26 {
27 cout << " Numeros negativos nao permitidos " << endl ;
28 }
29 }
125
++
Princípios de programação em C
(a) Escreva um programa que gere uma listagem dos valores de temperatura
entre 35 e 63 graus Celsius, e suas respectivas conversões para as escalas
Kelvin, Fahrenheit e Rankine, conforme o modelo apresentado a seguir.
As temperaturas devem ter incrementos de 0.001 graus Celsius, e devem
ser apresentadas na tela com três casas decimais. Para facilitar a leitura
do relatório, o início de cada linha deve ter uma enumeração sequencial,
começando de ’0001’. O relatório deve apresentar apenas 18 linhas por
página na tela do computador. No rodapé da tela deve haver uma opção
para o usuário encerrar o programa ou continuar a exibição da próxima
página da listagem.
===========================================================
TABELA DE CONVERSAO - ESCALAS DE TEMPERATURA
===========================================================
-----------------------------------------------------------
[Pg. 01] [Emitido em: 21/11/2019 - 13:52:00]
-------+---------------------------------------------------
| CELSIUS KELVIN FAHRENHEIT RANKINE
-------+---------------------------------------------------
0001 | 35.000 308.150 95.000 554.701
0002 | 35.001 308.151 95.002 554.672
0003 | 35.002 308.152 95.004 554.674
.... | ...... ....... ...... .......
0018 | 35.017 308.167 95.031 554.701
-------+--------------------------------------------------
126
++
Princípios de programação em C
uma variável numérica inteira muito grande, esta deve ser dimensionada
como ’long int’. O objetivo do programa é estimar, em segundos, o tempo
que o computador gasta para contar desde zero até cem milhões.
(d) Escreva um programa que gere valores de x, y , z e w nas faixas de valores
especificados a seguir. Esses dados serão utilizados pela Equação 6.1 para
calcular o valor de φ. Os dados de todas as variáveis deverão ser impressos
na tela conforme o seguinte exemplo de relatório, que deverá apresentar
apenas 18 linhas por página na tela do computador. No rodapé da tela
deve haver uma opção para o usuário encerrar o programa ou continuar a
exibição da próxima página da listagem.
sen(3 ∗ x) 1
+ 1, 125 ∗ (z 0,08 ) + √ (6.1)
φ(x, y , z, w ) = 3
2 + cos(y ) w
x ∈ [2; 18], y ∈ [5; 9], z ∈ [7; 11], w ∈ [2; 6]. Todas as variáveis deverão
ter incremento de 0,01 dentro do laço for().
===========================================================
TABELA DE DADOS DA EQUAÇÃO PHI(x, y, z, w)
===========================================================
-----------------------------------------------------------
[Pg. 01] [Emitido em: 21/11/2019 - 20:06:07]
-------+--------------------------------+------------------
| x y z w | PHI(x, y, z, w)
-------+--------------------------------+------------------
0001 | 2.00 5.00 7.00 2.00 | 1.985846
0002 | 2.00 5.00 7.00 2.01 | 1.984527
0003 | 2.00 5.00 7.00 2.02 | 1.983218
.... | .... .... .... .... | ........
-------+--------------------------------+------------------
127
++
Princípios de programação em C
4 int main () {
5 int x , y , z ;
6 x = y = z = 104;
7
128
++
Princípios de programação em C
y
y=f(x)
A1 A2 A3 A4 A5 A6 A7 A8
a x
b
Z b
I= f (x)dx (6.2)
a
b−a
m= (6.3)
h
• O valor aproximado da integral I é dado pela Equação 6.4.
h
I= [f0 + 4 (f1 + f3 + f5 + · · · + fm−1 ) + 2 (f2 + f4 + f6 + · · · + fm )]
3
(6.4)
129
++
Princípios de programação em C
Z0 2 h i
2
iii. V = π 2x − x 2 − (2 − x)2 dx
Z1 8
9
iv. V = π 2
64 − x dx
0 64
(i) Com a finalidade de determinar aproximadamente o volume de molho que
pode ser colocado em um frasco de polietileno, você utilizou uma régua
milimetrada e fez algumas medições, subdividindo o comprimento longi-
tudinal do frasco em 10 subintervalos (x1 a x10 ), conforme apresentado
na Figura 6.2. Com auxílio de uma planilha de cálculos (Microsoft Ex-
cel, por exemplo) você ajustou uma função de interpolação a cada um
dos intervalos, de modo que os polinômios representassem corretamente
o semi-contorno da embalagem (curva em azul). Os dados obtidos de sua
medição estão apresentados na Tabela 6.1.
0
x
x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
130
++
Princípios de programação em C
Com base nos dados da Tabela 6.1, e da Equação 6.5 (’integral do vo-
lume’), faça um programa que calcule a soma dos volumes dos sólidos
de revolução de todos os subintervalos (a até b), de modo a estimar,
aproximadamente, o volume total de molho que pode ser colocado no
frasco.
Z b
V =π [y (x)]2 dx (6.5)
a
2. O laço while()
(a) Faça um programa que leia, a partir do teclado, números reais maiores
do que zero. Quando o usuário digitar o zero, então o programa deverá
apresentar na tela do computado a quantidade total de números digitados,
a média desses números, o maior e o menor deles.
(b) Faça um programa que leia, a partir do teclado, uma senha, composta por
4 (quatro) números inteiros. O programa deverá verificar se a senha está
correta e, caso não esteja, deverá apresentar a mensagem ’Senha incor-
reta!’. Caso a senha esteja correta, então o programa deverá apresentar
a mensagem ’Acesso autorizado’.
(c) Faça um programa para simular uma urna eletrônica de votação para a
escolha da ’Rainha do Rodeio de Lavras, MG’. Os nomes (fictícios) das
candidatas devem ser apresentados na tela:
• 1 - Luiza (Veterinaria)
• 2 - Cristine (Eng. Alimentos)
• 3 - Sophia (Eng. Ctrl. e Automação)
131
++
Princípios de programação em C
Peso
IMC = (6.6)
(Altura)2
132
++
Princípios de programação em C
133
Capítulo 7
Conteúdo do capítulo
7.1 A biblioteca cmath . . . . . . . . . . . . . . . . . . . . . . . 135
7.1.1 Funções trigonométricas . . . . . . . . . . . . . . . . . . . 135
7.1.2 Funções hiperbólicas . . . . . . . . . . . . . . . . . . . . . 136
7.1.3 Funções exponenciais e logarítmicas . . . . . . . . . . . . 136
7.1.4 Função Erro e função Gamma . . . . . . . . . . . . . . . . 138
7.1.5 Funções de truncamento e arredondamento . . . . . . . . 139
7.1.6 Operações com números complexos . . . . . . . . . . . . . 141
7.2 Bibliotecas para cálculos numéricos avançados . . . . . . 143
7.3 Macros pré-definidas na biblioteca <math.h> . . . . . . 144
7.4 Atividades para fixação da aprendizagem . . . . . . . . . 145
134
++
Princípios de programação em C
5 int main () {
6 float Valor = 18.53;
7 cout << " Cos ..: " << cos ( Valor ) ; // 0.949375
8 return (0) ;
9 }
135
++
Princípios de programação em C
136
++
Princípios de programação em C
4 int main () {
5
9 Valor = 81.0;
10 Res = frexp ( Valor , & Expoente ) ;
11 printf ( " % f = % f * 2^% d \ n " , Valor , Res , Expoente ) ;
12 return (0) ; // 81.000000 = 0.632812 * 2^7
13 }
4 int main () {
5
8 Valor = 3.14159265;
9 PartFrac = modf ( Valor , & PartInt ) ;
10 printf ( " % f =%2.8 f + %2.8 f \ n " , Valor , PartInt , PartFrac ) ;
11
137
++
Princípios de programação em C
• erfc: Retorna o valor complementar da função erro para uma variável x. Exem-
plo:
1 float Valor = 2.6;
2 float FuncErroC = erfc ( Valor ) ; // 0.000236035
3 cout << " Funcao Erro Compl : " << FuncErroC ;
138
++
Princípios de programação em C
• floor: Arredonda para baixo o valor de x. O valor obtido será o maior valor
inteiro que não seja maior do que x. Exemplo:
1 float Vr1 = 2.045; float Vr2 = 1.875; float Vr3 = 0.345;
2 cout << " Floor Valor 1: " << floor ( Vr1 ) << endl ; // 2
3 cout << " Floor Valor 2: " << floor ( Vr2 ) << endl ; // 1
4 cout << " Floor Valor 3: " << floor ( Vr3 ) << endl ; // 0
139
++
Princípios de programação em C
• round: Arredonda o valor de x para o valor inteiro mais próximo a ele. Exemplo:
1 double Valor1 = 2.045;
2 double Valor2 = 1.875;
3 double Valor3 = 0.128;
4 double Valor4 = 5.001;
5 double Valor5 = 4.998;
6 double Valor6 = 2.500;
7
12 // 1 0 0 0 1 1 1 1
140
++
Princípios de programação em C
• isnan: Retorna verdadeiro (1) se x não for um número. Para caracteres ASCII
individuais, a função leva em consideração o seu valor correspondente na tabela
ASCII e, portanto, são considerados valores numéricos. Exemplo:
1 char vChar = ’c ’;
2 int vNum1 = 10;
3 double vNum2 = sqrt ( -1) ;
4
5 cout << " vChar .: " << isnan ( vChar ) << endl ; // 0
6 cout << " vNum1 .: " << isnan ( vNum1 ) << endl ; // 0
7 cout << " vNum2 .: " << isnan ( vNum2 ) << endl ; // 1
7 int main () {
8 complex < double > NumComplexo (10.25 , 15.82) ;
9 cout << " Parte real ..: " << real ( NumComplexo ) << endl ;
10 return (0) ;
11 }
141
++
Princípios de programação em C
142
++
Princípios de programação em C
15 return 0;
16 }
Além dessas funções básicas, a biblioteca complex possui também várias outras
funções para a manipulação de números complexos, entre elas funções trigonomé-
tricas, hiperbólicas, exponenciais, logarítmicas, etc.
143
++
Princípios de programação em C
Exemplo de aplicação:
1 # include < iostream >
2 # include < iomanip >
3 # include < math .h >
4 using namespace std ;
5 int main () {
6 cout . precision (19) ;
7 cout << " O valor de Pi : " << M_PI << endl ;
8 return (0) ;
9 }
144
++
Princípios de programação em C
(a)
s
L
θ = 2π (7.1)
g
145
++
Princípios de programação em C
(f)
p − 12
C= + 16, 95 (7.6)
0, 040 − 0, 0644p
146
++
Princípios de programação em C
(k)
! i=60,i6
i=120
X 4, 125 + [6 ∗ (i 1,125 )] X=42 22 − i
F = p + √ (7.11)
i=1 2, 226i + 3e (1,224) i=2
5 + 2i
147
++
Princípios de programação em C
∞
X 1 4 2 1 1
π= − − − (7.15)
k=0
16k 8k + 1 8k + 4 8k + 5 8k + 6
(s) Modifique o programa anterior, de modo que ele possa também calcular o
valor de π por meio da Equação 7.16. Esta equação deverá ser resolvida
pela regra de 1/3 de Simpson (ver Equações 6.2 a 6.4, p.129).
Z 1 p
π =2× 1 − x 2 dx (7.16)
−1
ii.
∞
X (−1)n 2n+1
sen(x) = x , para: x = 0, 05 (7.18)
n=0
(2n + 1)!
iii.
∞
X (−1)n
cos(x) = x 2n , para: x = 0, 25 (7.19)
n=0
(2n)!
1
Uma função recursiva para o cálculo do fatorial de um número inteiro não negativo está descrita
no Capítulo 8, p.162.
148
Capítulo 8
Conteúdo do capítulo
8.1 A segmentação do código em procedimentos e funções . 149
8.1.1 Procedimentos em C++ . . . . . . . . . . . . . . . . . . . 152
8.1.1.1 Passagem de parâmetros para procedimentos e
funções em C++ . . . . . . . . . . . . . . . . . . 152
8.1.1.2 Protótipos de procedimentos e de funções . . . . 153
8.1.2 Particularidades sobre procedimentos e funções em C++ . 154
8.1.2.1 Funções inline . . . . . . . . . . . . . . . . . . . 156
8.1.2.2 Sobrecarga de procedimentos e funções . . . . . 156
8.1.2.3 Domínio de funções em cálculos matemáticos . . 158
8.1.2.4 Parâmetros padrões de procedimentos e funções 160
8.1.2.5 Recursividade . . . . . . . . . . . . . . . . . . . 162
8.1.2.6 Funções para limpar e posicionar o cursor na tela 163
8.2 Atividades para fixação da aprendizagem . . . . . . . . . 165
149
++
Princípios de programação em C
11 int main ()
12 {
13 Linha () ; // Chamado aqui (1 a vez )
14 cout << " O valor de Pi ....: " << M_PI << endl ;
15 cout << " Numero de Euler ..: " << M_E << endl ;
16 cout << " Raiz de 2........: " << M_SQRT2 << endl ;
17 Linha () ; // Chamado aqui (2 a vez )
18 cout << " Pi /2.............: " << M_PI_2 << endl ;
19 cout << " Pi /4.............: " << M_PI_4 << endl ;
20 cout << " Ln (2) ............: " << M_LN2 << endl ;
21 Linha () ; // Chamado aqui (3 a vez )
22
23 return (0) ;
24 }
150
++
Princípios de programação em C
de códigos que pode ser chamado várias vezes dentro do programa, mas que ao ser
executado ele não retorna nenhum valor, apenas executa um bloco de instruções.
No próximo exemplo temos uma situação um pouco diferente. Temos um proce-
dimento que irá retornar um valor. Todo procedimento que retorna algum tipo de
valor é chamado de ’função’. Assim, basicamente, pode-se dizer que o que diferencia
uma ’função’ de um ’procedimento’ é o fato de a função sempre retornar um valor.
1 # include < iostream >
2
12 // - -[ Programa principal ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
13
14 int main ()
15 {
16 float Valor1 = 32.25;
17 float Valor2 = 63.28;
18 float Valor3 = 11.29;
19 float Valor4 = 16.19;
20
21 float Total1 ;
22 float Total2 ;
23 float Total3 ;
24
29 cout << " Total 1..: " << Total1 << endl ;
30 cout << " Total 2..: " << Total2 << endl ;
31 cout << " Total 3..: " << Total3 << endl ;
32
33 return (0) ;
34 }
Na linha 5 (cinco) do exemplo acima, foi construída a função Soma, cuja finali-
dade é somar dois valores, x e y , do tipo float que são passados externamente como
argumentos para a função. A passagem de valores para dentro de uma função é
feita especificando-se, dentro do par de parêntesis, as variáveis que serão passadas
e os seus respectivos tipos.
151
++
Princípios de programação em C
152
++
Princípios de programação em C
153
++
Princípios de programação em C
9 // - -[ Programa principal ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10
11 int main ()
12 {
13 float Valor1 = 32.25; float Valor2 = 63.28;
14 float Total ;
15
154
++
Princípios de programação em C
4 // - -[ Prototipos de funcoes ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5 void Linha ( void ) ;
6 float F a r e n h e i t P a r a C e l s i u s ( float F ) ;
7 float ListaNaTela ( float F ) ;
8
9 int main () {
10 float nFarenheit = 365.82;
11 cout << " Celsius .: " << ListaNaTela ( nFarenheit ) << endl ;
12 Linha () ;
13 return (0) ;
14 }
15
26 float F a r e n h e i t P a r a C e l s i u s ( float F )
27 {
28 float nCelsius ;
29 nCelsius = ( F - 32.0) / (1.80) ;
30 return nCelsius ;
31 }
32
No Capítulo 4, Seção 4.1.7, p.80, vimos que é possível criar um arquivo externo,
com a extensão .h, no qual as constantes de um programa podem ser colocadas.
Da mesma forma que para as constantes, é mais conveniente colocar todas as
funções e procedimentos de um programa em um ou mais arquivos externos, e
referenciá-los no programa principal. Essa é uma prática muito recomendada, além
de permitir uma maior portabilidade e reaproveitamento de funções, que poderão ser
reutilizadas por diferentes programas, além de tornar menor os códigos do programa
principal. O Capítulo 13 mostrará exemplos de como isso pode ser feito.
155
++
Princípios de programação em C
156
++
Princípios de programação em C
10 // - -[ Programa principal ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
11
12 int main ()
13 {
14 float fV1 = 32.25;
15 int iV2 = 44;
16 double dV3 = 1.45;
17 float Resp1 = Soma ( fV1 , iV2 ) ;
18 int Resp2 = Soma ( iV2 , iV2 ) ;
19 double Resp3 = Soma ( dV3 , iV2 ) ;
20
21 cout << " Soma 1: " << Resp1 << endl ; // 76.25
22 cout << " Soma 2: " << Resp2 << endl ; // 88
23 cout << " Soma 3: " << Resp3 << endl ; // 45.45
24 return (0) ;
25 }
26
Basicamente, o que diferenciará uma função da outra que possua o mesmo nome
são os seus parâmetros e tipo de retorno. Designa-se por ’sobrecarga da função’ o
fato de termos diferentes funções (ou ’sobrecarga do procedimento’, para procedi-
mentos) com o mesmo nome.
No Code::Blocks, ao inserir o nome de um procedimento ou função sobrecar-
regada, automaticamente será aberto um menu de contexto, permitindo escolher
qual função será utilizada, como mostrado na Figura 8.1. Não é necessário se pre-
ocupar com qual função deverá ser escolhida, visto que isso será feito pelo próprio
compilador, em função dos tipos das variáveis passadas como argumentos para a
157
++
Princípios de programação em C
função.
158
++
Princípios de programação em C
encontra sob o símbolo de radical (√) seja obrigatoriamente maior ou igual a zero,
como mostrado na Equação 8.2.
x 2 − 4x − 5
≥0 (8.2)
4 − 4x + x 2
+ +
-1 5 x
a = 1, (a > 0) -
∆ = 36
r1 = −1, r2 = 5
a = 1, (a > 0) + + +
∆=0 x
2
r1 = r2 = 2
Figura 8.3: Estudo do sinal da função y2 (x). (Fonte: autores)
159
++
Princípios de programação em C
y1 (x)
Estudo do domínio de : O estudo do domínio da inequação 8.2 deve levar
y2 (x)
y1 (x)
em consideração uma análise dos intervalos dos sinais da razão , conforme
y2 (x)
apresentado na Figura 8.4.
+ - - +
y(x):
1 -1 5 x
+ + + +
y(x):
2 2 x
y(x) + - - +
1
:
y(x) -1 2 5 x
2
Figura 8.4: Estudo do sinal da inequação descrita pela Equação 8.2. (Fonte: autores)
Com base nos intervalos permitidos de valores para a Equação 8.2, apresentado
na Figura 8.4, conclui-se que os valores permitidos para a função 8.1 são: x ≤ −1 e
x ≥ 5. Caso o programador não fique atento a essas restrições e utilize valores fora
da faixa permitida, o programa implementado em C++ poderá não funcionar e gerar
erros em tempo de execução.
Deve-se observar a partir do protótipo (ou cabeçalho) da função que, uma vez
que um parâmetro tenha um valor padrão, então todos os parâmetros subsequentes
a ele também deverão possuir algum valor padrão.
160
++
Princípios de programação em C
10 int main ()
11 {
12
17 return 0;
18 }
Os parâmetros default também podem ser utilizados para outros tipos de variá-
veis, além do double, int e float. No código a seguir um exemplo de como uma
variável do tipo string pode receber um valor padrão em uma função.
1 # include < iostream >
2 # include < cstring >
3 using namespace std ;
4
9 int main () {
10
161
++
Princípios de programação em C
8.1.2.5 Recursividade
Recursividade é uma propriedade que permite que uma função chame a si mesma.
O objetivo da recursão é quebrar ou subdividir um problema maior em problemas
menores, dentro de um ciclo iterativo, até que alguma condição de interrupção do
ciclo possa ser alcançada.
Não é algo muito comum trabalhar com funções recursivas em problemas de
engenharia, visto que nem sempre é fácil identificar quando podemos escrever uma
solução para um dado problema em função desse próprio problema. Porém, há inú-
meras aplicações de funções recursivas na resolução de problemas de inteligência
computacional, otimização combinatória, logística de transportes, localização de fa-
cilidades, pesquisa operacional, análise de dados em árvores binárias, algoritmos de
ordenação de dados (Quick sort, Merge sort, etc.), jogos (Puzzle, Chess, Candy
Crush, etc), métodos de busca de sequências de DNA e RNA em bancos de dados
de sequenciamento genético (bioinformática), entre outras aplicações.
No que se refere ao processo recursivo, em cada nova chamada à função, o sis-
tema operacional irá criar na memória do computador uma nova ocorrência dessa
função, com instruções, comandos e variáveis completamente independentes de ocor-
rências anteriores. A função será executada iterativamente, em ciclos, até que al-
guma condição de parada seja estabelecida. Deve-se observar que se esse critério
de interrupção não for bem estabelecido há o risco eminente de a função entrar em
um loop infinito. Além disso, se o loop recursivo for muito grande, então haverá a
necessidade de alocar uma quantidade maior de espaço na memória do computador
para instanciar novas ocorrências dos comandos e variáveis da função, o que não é
uma boa opção.
Na grande maioria das situações, a solução tradicional (sem apelar para recur-
sividade) é suficiente para resolver a quase totalidade dos problemas e, por isso, a
recursividade é apresentada aqui apenas para fins didáticos. No exemplo a seguir é
declarada uma função recursiva para calcular o fatorial (n!) de um número.
1 # include < iostream >
2 using namespace std ;
3
4 // - -[ Prototipo da funcao ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5
9 if ( ( n == 1) || ( n == 0) ) {
10 return 1;
11 } else
12 {
13 return ( fatorial (n -1) * n ) ; // Aqui a funcao chama ela
14 } // mesma , de modo recursivo
15 }
162
++
Princípios de programação em C
16
17 // - -[ Programa principal ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
18
19 int main ()
20 {
21
28 cout << " O fatorial de " << Numero << " vale : " ;
29 cout << fatorial ( Numero ) << endl ;
30
31 return 0;
32 }
163
++
Princípios de programação em C
0
0
164
++
Princípios de programação em C
10 // - -[ Programa principal ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
11
12 int main () {
13 LimpaTela () ;
14 GotoXY (1 ,10) ; // Imprime na coluna 1 e linha 10
15 cout << " Teste " << endl ;
16 return 0;
17 }
18
165
++
Princípios de programação em C
(a) Escreva o programa e a função C++ para calcular o C(p), com p do tipo
double, conforme a Equação 8.3.
p − 12
C(p) = + 16, 95 (8.3)
0, 040 − 0, 0644p
(b) Escreva o programa e a função C++ para calcular o y (a, b, c, d, x), todos
do tipo float, conforme a Equação 8.4.
y = a + bx + 10c+dx (8.4)
26
B = 366 − 4, 638c + + 0, 01064(100,04084c )
e 0,14(27,5−c) + e 0,14(c−27,5)
(8.5)
(d) Escreva o programa e a função C++ para calcular o valor de L(n, D, d),
em que D e d são variáveis são do tipo float. L representa o comprimento
total de um rolo de papel. n é o número inteiro de voltas (600 a 5.000).
D é o diâmetro do rolo (14 a 34 in). d é o diâmetro do rolo oco interno,
que serve apenas de suporte do papel enrolado a ele (diâmetro de 2 a 6
in).
πn (D + d)
L= (8.6)
24
(e) Escreva o programa e a função C++ para calcular o valor de pH(V, t) de
uma solução na qual está mergulhado um eletrodo de calomelano, usado
juntamente com uma solução saturada de cloreto de potássio. Na Equa-
ção 8.7, V é o potencial em volts (0,2 a 1,2 volts), e t é a temperatura
(10 a 60 graus Celsius).
V − 0, 2458 − 0, 0002t
pH = (8.7)
0, 000198 (t + 273)
(f) Analise a função apresentada a seguir. O que ela faz? Explique detalha-
damente como é o seu funcionamento.
166
++
Princípios de programação em C
11 return ( ff ) ;
12 }
(g) Analise a função apresentada a seguir. O que ela faz? Explique deta-
lhadamente como é o seu funcionamento. Como essa função pode ser
utilizada dentro de um programa C++ . Dê um exemplo.
1 void RepCh ( char ch , int qtd )
2 {
3 for ( register int i =0; i < qtd ; i ++)
4 {
5 cout << ch ;
6 }
7 cout << endl ;
8 }
M = f (L, A, B, z, bi , bf ) (8.8)
W = f (L, A, B, z, bi , bf ) (8.9)
167
++
Princípios de programação em C
168
++
Princípios de programação em C
2. Funções inline
(a) O que são funções inline? Qual a vantagem de utilizá-las? Como é feita
a declaração de uma função inline?
(b) Escreva uma função inline que retorne a média geométrica dos valores
contidos em um vetor de 10 elementos.
(c) (FGV-SP) A curva de aprendizagem é um conceito criado por psicólogos
que constataram a relação existente entre a eficiência de um indivíduo e
a quantidade de treinamento ou experiência possuída por este indivíduo.
Um exemplo de Curva de Aprendizagem é dado pela seguinte expressão
(Equação 8.10).
169
++
Princípios de programação em C
F V = P V (1 + i )n
1
PV = FV
(1 + i )n
n
(1 + i ) − 1
F V = P MT
i
Equações = (8.11)
i
P MT = F V
(1 + i )n − 1
(1 + i )n − 1
P V = P MT
i (1 + i )n
n
i (1 + i )
P MT = P V
(1 + i )n − 1
3. Sobrecarga de funções
170
++
Princípios de programação em C
4. Recursividade
171
Capítulo 9
Vetores e matrizes
Conteúdo do capítulo
9.1 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
9.1.1 Declaração e utilização de vetores . . . . . . . . . . . . . . 173
9.1.2 A classe vector . . . . . . . . . . . . . . . . . . . . . . . . 178
9.1.3 Pilhas de memória . . . . . . . . . . . . . . . . . . . . . . 179
9.2 Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
9.2.1 Declaração de matrizes e operações sobre seus elementos . 184
9.2.2 Matrizes de strings de caracteres . . . . . . . . . . . . . . 186
9.2.3 Operações numéricas e algébricas com matrizes . . . . . . 186
9.2.3.1 Soma e subtração de matrizes . . . . . . . . . . . 186
9.2.3.2 Multiplicação de matrizes . . . . . . . . . . . . . 188
9.2.3.3 Transposição de uma matriz . . . . . . . . . . . 190
9.2.3.4 Outras operações algébricas com matrizes . . . . 192
9.3 Atividades para fixação da aprendizagem . . . . . . . . . 193
9.1 Vetores
Vetores (do inglês arrays) compreendem variáveis subdivididas em elementos dispos-
tos em série na memória do computador, sendo que todos os elementos devem ser
do mesmo tipo (int, float, etc), e cada posição pode ser acessada por meio de um
índice numérico. Na Figura 9.1 está a representação gráfica de um vetor de dez
elementos, sendo que o primeiro índice é o zero, o segundo índice é um, e assim por
diante.
Muitos problemas práticos no campo das ciências exatas são resolvidos com a
utilização de vetores. Entre os que aparecem mais frequentemente, estão aqueles
172
++
Princípios de programação em C
Elemento
(no índice 8)
Primeiro índice
0 1 2 3 4 5 6 7 8 9 Índices
Para atribuir valores às posições do vetor é necessário que o valor seja do mesmo
tipo suportado pelo vetor. Além disso é necessário informar qual posição do vetor
deverá ser acessada. Assim, por exemplo, para armazenar o valor 36 à primeira
posição do vetor ’nMeuVetor’, a seguinte notação deve ser utilizada:
1 int nMeuVetor [0] = 36;
173
++
Princípios de programação em C
5 int main () {
6
23 return 0;
24 }
Um vetor pode ser declarado como mostrado na linha 7 do exemplo acima, sem
nenhum valor atribuído aos seus elementos. Neste caso, cada elemento poderá
conter algum valor arbitrário, vulgarmente chamado de ’lixo de memória’, que já
estava anteriormente guardado na mesma posição da memória onde agora aquele
elemento ocupa. Alternativamente pode-se inicializar o vetor com valores numéricos
como apresentado a seguir.
1 double vProvas [4] = {62.47 , 86.25 , 87.65 , 92.68};
O vetor também pode ser inicializado com zeros em todos os seus elementos.
1 double vProvas [10] = {0}; // Inicializa com zeros
Assim como para valores numéricos, os vetores também podem conter strings.
1 # include < iostream >
2 # include < cstring >
3
174
++
Princípios de programação em C
6 int main ()
7 {
8 string Carros [4] = { " Volvo " , " BMW " , " Ford " , " Mazda " };
9
A função getline() pode ser usada para fazer a leitura de strings a partir do
teclado, como no exemplo a seguir.
1 # include < iostream >
2 # include < cstring >
3 using namespace std ;
4
5 int main () {
6 string Nome [3];
7
16 return 0;
17 }
Um vetor pode ser inicializado sem que o seu tamanho seja especificado. No
código abaixo, nenhum tamanho foi informado para o vetor ’Carros’. O seu tamanho
será, portanto, igual ao número de elementos utilizados em sua inicialização que,
neste caso, é quatro.
1 string Carros [] = { " Volvo " , " BMW " , " Ford " , " Mazda " };
175
++
Princípios de programação em C
5 int main () {
6
É importante observar que o compilador C++ não fará nenhuma verificação para
problemas desse tipo durante a compilação. Fazer esse tipo de verificação é uma
tarefa que caberá exclusivamente ao programador. O programa será compilado nor-
malmente, porém ao tentar percorrer elementos que não existam no vetor, uma
mensagem de erro será exibida e o programa poderá ser abortado em tempo de
execução.
O índice ou o tamanho de um vetor também pode ser definido por meio de uma
constante (declarada com #define ou const).
1 # include < iostream >
2
176
++
Princípios de programação em C
8 int main () {
9 float cNotas [ TAM ];
10
O exemplo a seguir mostra como utilizar vetores para calcular a diferença total
entre duas cores de tomate (no padrão L*a*b* de cores) por meio da distância
euclidiana entre suas coordenadas espaciais.
1 # include < iostream >
2 # include < cmath >
3 using namespace std ;
4
5 int main () {
6
19 return 0;
20 }
177
++
Princípios de programação em C
5 int main () {
6
24 cout << " Soma ..: " << nSoma << endl ; // 9.999 e +07;
25 cout << " Media .: " << nMedia << endl ; // 9999;
26 return 0;
27 }
1
Ver detalhes sobre conversão de tipos no Capítulo 4, Seção 4.4, p.84.
178
++
Princípios de programação em C
O acesso aos elementos de um vetor é feito por meio de seu índice, que deve ser
informado dentro de um par de colchetes. O índice sempre começa a contar a partir
do zero.
1 MeuVetor [1] = 430;
2 int cNum = MeuVetor [1];
3 cout << cNum << endl ;
É possível também inicializar um vetor vazio, bastando, para isso, não informar
o seu tamanho. Para testar se um vetor está vazio, o programador pode utilizar a
função ’empty()’.
1 vector < int > OutroVetor ; // Retorno :
2 cout << OutroVetor . empty () << endl ; // 1 >> vetor vazio
3 // 0 >> vetor nao vazio
179
++
Princípios de programação em C
A operação de uma pilha é sempre feita por uma de suas extremidades. Alguns
exemplos de típicos do dia-a-dia estão listadas logo a seguir, e podem ser facilmente
implementados em vetores por meio das operações de push (inserir na pilha) e pop
(remover da pilha).
1 2 3 4 5 6 7
Empilhamento 7
6 6
5 5 5
4 4 4 4
3 3 3 3 3
2 2 2 2 2 2
1 1 1 1 1 1 1
7 6 5 4 3 2 1
Esvaziamento da pilha
7
6 6
5 5 5
4 4 4 4
3 3 3 3 3
2 2 2 2 2 2
1 1 1 1 1 1 1
2
Notação Polonesa Reversa, modo de processamento típico de algumas calculadoras científicas.
180
++
Princípios de programação em C
9 int main () {
10
23 return 0;
24 }
25
181
++
Princípios de programação em C
11 int main () {
12 Alunos . push_back ( " Paulo " ) ;
13 Alunos . push_back ( " Joaquim " ) ;
14 Alunos . push_back ( " Antonio " ) ;
15 Alunos . push_back ( " Simone " ) ;
16 Alunos . push_back ( " Liliam " ) ;
17 Alunos . push_back ( " Cristine " ) ;
18
6 int main () {
7
182
++
Princípios de programação em C
16
17 if ( Vetor1 == Vetor2 ) {
18 cout << " Os vetores sao iguais " << endl ;
19 } else {
20 cout << " Os vetores sao diferentes " << endl ;
21 }
22
23 return 0;
24 }
A exclusão dinâmica de dados de um vetor é feita com a função erase(). Ela pode
ser utilizada para excluir o elemento de uma posição específica como, por exemplo,
para excluir o elemento na quinta posição do vetor.
1 Vetor1 . erase ( Vetor1 . begin () +4) ;
E pode ser utilizada também para excluir uma faixa de valores. No exemplo a
seguir ela irá excluir os três primeiros elementos do vetor.
1 Vetor1 . erase ( Vetor1 . begin () , Vetor1 . begin () +3) ;
Outros recursos para manipulação de pilhas em C++ podem ser obtidos com o
uso da biblioteca padrão stack, mas sua abordagem está fora do escopo deste livro,
e sua utilização fica como um exercício para o leitor.
1 # include < stack >
9.2 Matrizes
Matrizes são muito semelhantes a vetores, porém, diferentemente dos vetores, que
possuem apenas uma dimensão, as matrizes são tipicamente multidimensionais. Ma-
trizes são, portanto, um conjunto de variáveis do mesmo tipo, com um nome em
comum, que podem ser referenciadas e acessadas por um índice.
A Figura 9.3 mostra a configuração típica de dois tipos de matrizes, mais à
esquerda está uma matriz de duas dimensões, com dez (dez) colunas e 8 (oito)
linhas. A configuração mais à direita nesta Figura é uma matriz de três dimensões,
com 6 (seis) colunas, 6 (seis) linhas e 6 (seis) elementos de profundidade.
183
++
Princípios de programação em C
Elemento
(Posição: Col = 5, Lin = 3)
0 1 2 3 4 5 6 7 8 9 Índices
0 Elemento
(Posição: Col = 0, Lin = 0, Prof = 0)
1
2
3
4
5
6
Índices
Uma observação a ser feita é que muitos softwares de planilhas eletrônicas, como
o Microsoft Excel e o GNumeric, utilizam a mesma disposição de seus elementos (ou
células) da configuração bidimensional apresentada na Figura 9.3.
184
++
Princípios de programação em C
Matrizes de muitas dimensões devem ser utilizadas com algum cuidado visto que
podem ocupar muito espaço na memória do computador. No exemplo anterior a
matriz ’nMatriz3’ possui um total de 12 × 16 × 9 × 7 × 22 = 226.112 células.
O preenchimento das posições de uma matriz é feito exatamente da mesma
maneira que para os vetores. É necessário apenas informar a posição do elemento
dentro da matriz, por meio de índices, e utilizar o operador de atribuição ’=’, conforme
mostrado a seguir.
0 1 2 3 4 5 6
0 21 36 97 2 44 21 9
1 60 13 17 5 11 87 14
2 22 83 69 18 1 99 7
3 40 26 31 66 92 3 15
185
++
Princípios de programação em C
13 cout << " Fruta 1.: " << cFrutas [0] << endl ; // Melancia
14 cout << " Fruta 2.: " << cFrutas [1] << endl ; // Goiaba
15 cout << " Fruta 3.: " << cFrutas [2] << endl ; // Morango
16 cout << " Fruta 4.: " << cFrutas [3] << endl ; // Abacate
17 return 0;
18 }
a11 a12 · · · a1n b11 b12 · · · b1n s11 s12 · · · s1n
a21 a22 · · · a2n b21 b22 · · · b2n s21 s22 · · · s2n
.. .. . . . .. + .. .. ... .. = .. .. . . . ..
. . . . . . . . .
am1 am2 · · · amn bm1 bm2 · · · bmn sm1 sm2 · · · smn
(9.1)
186
++
Princípios de programação em C
6 int main () {
7 srand (( unsigned ) time ( NULL ) ) ;
8 int nMin = 0; // Valor minimo para aleatorio
9 int nMax = 100; // Valor maximo para aleatorio
10
15 int Aleatorio = 0;
16
187
++
Princípios de programação em C
37
46
a11 a12 b11 b12 (a11 × b11 + a12 × b21 ) (a11 × b12 + a12 × b22 )
+ =
a21 a22 b21 b22 (a21 × b11 + a22 × b21 ) (a21 × b12 + a22 × b22 )
(9.3)
188
++
Princípios de programação em C
n
X
cij = aik × bkj (9.4)
k=1
6 int main () {
7 srand (( unsigned ) time ( NULL ) ) ;
8 int nMin = 0; // Valor minimo para aleatorio
9 int nMax = 100; // Valor maximo para aleatorio
10 int nNotas1 [3][3];
11 int nNotas2 [3][3];
12 int nProd [3][3] = {0};
13 int Aleatorio = 0;
14
189
++
Princípios de programação em C
190
++
Princípios de programação em C
AT (9.6)
ij
= [A]ji
6 int main ()
7 {
8 srand (( unsigned ) time ( NULL ) ) ;
9 int nMin = 0; // Valor minimo para aleatorio
10 int nMax = 100; // Valor maximo para aleatorio
11 int nMatriz [5][3]; int nTransp [3][5]; int Aleatorio = 0;
12
36 // - -[ Calcula a transposta ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
37 for ( int Linha =0; Linha <3; Linha ++)
38 {
39 for ( int Coluna =0; Coluna <5; Coluna ++) {
40 nTransp [ Linha ][ Coluna ] = nMatriz [ Coluna ][ Linha ];
41 }
42 }
43 cout << endl << endl ;
191
++
Princípios de programação em C
44
An×n · A−1 −1
n×n = An×n × An×n = In×n (9.7)
192
++
Princípios de programação em C
(a) Faça um programa no qual seja declarado um vetor R. Esse vetor deve
possuir 10 posições (n = 10 elementos) do tipo double. O programa
deverá fazer as seguintes operações sobre esse vetor:
i. Atribuir valores entre 10,0 e 50,0 aos elementos do vetor. Esses
valores serão digitados a pelo usuário do programa
ii. Calcular a soma e a média aritmética dos elementos do vetor e apre-
sentar os resultados na tela do computador
iii. Calcular a variância amostral (σ̂ 2 , Equação 9.8) dos elementos do
vetor e apresentar o resultado na tela do computador.
i=n
X
(xi − x̄)2
i=1
σ̂ 2 = (9.8)
(n − 1)
iv. Listar na tela todos os elementos do vetor, começando da maior
posição, até a sua primeira posição.
(b) Modifique o programa do exercício anterior, de modo que na tela do com-
putador, além dos valores originalmente contidos nas posições do vetor,
sejam listados também os valores quadráticos (xi2 ) de cada um de seus
elementos.
(c) Escreva um programa que leia a partir do teclado um vetor de 20 posições.
Em seguida, leia também os valores de duas variáveis inteiras, X e Y (com
x, y ∈ [0; 19]). X e Y indicam as posições do vetor, a partir das quais os
valores contidos nessas posições deverão ser lidos e apresentados na tela.
(d) Escreva um programa que leia um vetor de inteiros com 20 posições. Em
seguida, o programa deverá listar na tela a quantidade total de números
pares e de ímpares nesse vetor. O programa deverá também apresentar
na tela qual o maior e o menor valor.
(e) Escreva um programa que leia o valor de 10 medidas de pH. Para isso,
trabalhe com um vetor do tipo float de 10 posições. O programa deverá
listar na tela do computador a média e o desvio-padrão (σ̂, Equação 9.9)
dos valores de pH.
v
u i=n
uX
u
u (xi − x̄)2
t i=1
σ̂ = (9.9)
(n − 1)
193
++
Princípios de programação em C
(f) Escreva um programa que leia o valor de 20 números reais a partir do te-
clado (tipo float ou double), e liste na tela a quantidade total de números
negativos e de números positivos que foram digitados.
(g) Modifique o programa anterior, de modo que ele mostre também a posição
do vetor onde está o maior e o menor valor digitado.
(h) Modifique o programa anterior de modo que ele mostre na tela se há
algum valor duplicado dentro do vetor, ou seja, se há valores repetidos no
vetor. Se houver, o programa deverá indicar as posições onde estão os
valores repetidos.
(i) Modifique o programa anterior de modo que seja atribuído o valor zero à
todos os elementos que possuírem valores negativos.
(j) Escreva um programa que receba, a partir do teclado, os valores dois veto-
res do tipo float, M e N, cada um com 10 elementos. O programa deverá
calcular a diferença quadrática entre os elementos desses dois vetores,
(Mi − Ni )2 , e apresentar na tela a soma total dessas diferenças.
(k) Escreva um programa que leia um número inteiro inicial, uma razão, e
calcule os termos de uma progressão aritmética (PA), armazenando os
seus valores em um vetor de tamanho 20. Ao final, os valores do vetor
deverão ser listados na tela.
(l) Modifique o programa anterior para que o mesmo possa calcular os valores
digitados para uma ’progressão geométrica’ (PG), com o vetor armaze-
nando apenas os 8 primeiros elementos da PG. Ao final, os valores do
vetor deverão ser listados na tela.
2. Matrizes
194
++
Princípios de programação em C
195
++
Princípios de programação em C
12x1 + 4x2 + 3x3 = 46
M = 2x1 + 6x2 + 2x3 = 38 (9.10)
8x1 + 4x2 + 8x3 = 64
(o) Modifique o programa anterior, de modo que os coeficientes (β) das equa-
ções e os termos independentes (φ) possam ser digitados pelo usuário do
196
++
Princípios de programação em C
β0 x1 + β1 x2 + β2 x3 = φ0
M = β3 x1 + β4 x2 + β5 x3 = φ1 (9.11)
β6 x1 + β7 x2 + β8 x3 = φ2
(p) Modifique o programa anterior de modo que ele possa ser utilizado para
resolver um sistema linear de equações com 10 variáveis.
3. Pilhas
(a) Considere uma agroindústria que fabrica uma bebida pronta para consumo,
feita à base de soja (extrato solúvel de soja). Nessa indústria há um galpão
no qual os caminhões entram, realizam a pesagem da carga e descarregam
a soja em uma moega.
Em função da grande movimentação diária de caminhões, há uma longa
avenida, que fica próxima ao galpão de descarga de grãos, na qual os
caminhões ficam aguardando a sua vez de descarregar.
Essa avenida é como uma ’rua sem saída’, visto que uma de suas ex-
tremidades está fechada por um muro, e há apenas uma única entrada,
controlada por uma cancela eletrônica, que serve também de saída para
os caminhões. Essa avenida tem capacidade para acomodar até 36 cami-
nhões enfileirados.
A descarga dos caminhões não é feita pela ordem de chegada, mas sim,
em função do tempo em que o produto já se encontra no caminhão, o
tempo total de transporte, decorrido desde o fornecedor de grãos até a
agroindústria.
Assim, se um caminhão é convocado para ser descarregado, então podem
acontecer duas situações:
i. Se o caminhão está próximo ao local de saída da avenida, e sem
nenhum outro caminhão atrás dele para atrapalhar, então ele sai e
vai descarregar sua carga de soja.
ii. Se o caminhão não está próximo ao local de saída da rua, então todos
os caminhões que estão enfileirados bloqueando sua saída deverão ser
manobrados, retirados da avenida, e só depois o caminhão convocado
poderá sair. Após isso, os caminhões que foram manobrados e reti-
rados retornam normalmente para a avenida, na mesma ordem que
estavam, e continuam esperando para serem convocados.
197
++
Princípios de programação em C
198
Capítulo 10
Ponteiros e structs
Conteúdo do capítulo
10.1 Ponteiros em C++ . . . . . . . . . . . . . . . . . . . . . . . 199
10.1.1 Declaração e uso de ponteiros . . . . . . . . . . . . . . . . 200
10.2 Ponteiros em procedimentos e funções . . . . . . . . . . . 202
10.2.1 Passagem de parâmetros por valor . . . . . . . . . . . . . 202
10.2.2 Passagem de parâmetros por ponteiros . . . . . . . . . . . 203
10.3 Ponteiro para vetores e matrizes . . . . . . . . . . . . . . 204
10.4 Ponteiros para outros ponteiros . . . . . . . . . . . . . . . 209
10.5 Vetores de ponteiros . . . . . . . . . . . . . . . . . . . . . . 210
10.6 Passagem de vetores e matrizes para procedimentos e
funções por meio de ponteiros . . . . . . . . . . . . . . . . 211
10.7 Alocação dinâmica de memória com as funções mal-
loc(), realloc() e free() . . . . . . . . . . . . . . . . . . . . 214
10.7.1 A função malloc() . . . . . . . . . . . . . . . . . . . . . . 215
10.8 Alocação dinâmica de memória com os operadores new
e delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
10.8.1 O operador new . . . . . . . . . . . . . . . . . . . . . . . 220
10.8.2 O operador delete . . . . . . . . . . . . . . . . . . . . . . 221
10.8.3 Declaração dinâmica de vetores com o operador new . . . 223
10.9 Estruturas de dados com o comando struct{} . . . . . . 224
10.10Atividades para fixação da aprendizagem . . . . . . . . . 233
199
++
Princípios de programação em C
uma outra variável, e diz-se que o ponteiro ’aponta’ para essa outra variável.
Para compreender melhor como isso funciona, suponha que uma variável inteira,
’x1’, ocupe a posição 0001 da memória RAM do computador (Tabela 10.1). O
conteúdo de ’x1’ é o numeral hexadecimal 0x02, que é o ’endereço’ que a variável
’x3’ ocupa na memória do computador. Observe que o valor de ’x3’ é 25, um valor
inteiro. Assim, diz-se que: ’A variável x1 (inteiro) é um ponteiro que armazena o
endereço 0x02, que pertence à variável x3 (inteiro) e, portanto, ’x1 aponta para x3’
(x1 → x3).’ (Tabela 10.1).
Em C++ o nome, o tipo e o conteúdo da variável ’x3’ foram definidos pelo
programador, da maneira usual, como mostrado a seguir.
1 int x3 = 25;
200
++
Princípios de programação em C
1 int x3 = 25;
2 int * x1 ; // Ponteiro x1
3 x1 = & x3 ; // x1 aponta para x3
Na linha 1 código anterior, é criada a variável ’x3’ do tipo inteiro. Essa variável
recebe o valor 25. Na linha 2 é declarado ’x1’, um ponteiro do tipo inteiro. Na
declaração do ponteiro foi utilizado o símbolo asterisco para indicar que se trata de
um ponteiro. Na linha 3 foi utilizado o símbolo ’&’ para indicar que a variável ’x1’
aponta para o endereço de memória da variável ’x3’.
O programador poderá, por exemplo, criar uma outra variável, ’nValor’, que re-
ceberá o conteúdo da variável apontada por ’x1’.
1 int nValor ;
2 nValor = * x1 ; // nValor recebe o valor 25
201
++
Princípios de programação em C
ponteiros para qualquer outro tipo de dado, além do inteiro, utilizado nos exemplos
anteriores.
1 double X , Y ;
2 int Z ;
3 double * W ;
4 X = 10.25;
5 Y = 32.63;
6 Z = 73;
7 W = &X;
8 Y = X + (* W ) ;
9 Z = ( int ) ( Y ) ;
10 Z ++;
202
++
Princípios de programação em C
1 // - -[ Variaveis globais ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2 int x = 10;
3 int y = 20;
4
5 // - -[ Funcao ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6 void TrocaValor ( int ValorX , int ValorY )
7 {
8 int vTemp ;
9 vTemp = ValorX ;
10 ValorX = ValorY ;
11 ValorY = vTemp ;
12 }
13
203
++
Princípios de programação em C
1 // - -[ Variaveis globais ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2 int x = 10; int y = 20;
3
4 // - -[ Funcao ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5 void TrocaValor ( int * ValorX , int * ValorY )
6 {
7 int vTemp ;
8 vTemp = * ValorX ;
9 * ValorX = * ValorY ;
10 * ValorY = vTemp ;
11 }
12 // - -[ Dentro de ’ int main () ’] - - - - - - - - - - - - - - - - - - - - - - - - - - - -
13 TrocaValor (& x , & y ) ;
14 cout << " x : " << x << ’\ t ’ << " y : " << y << endl ;
O mesmo ocorre para as variáveis ’ValorY’ e ’y’. Como resultado desta ’passagem
de parâmetros por ponteiro’, os valores apresentados na tela, pelo uso de cout na
linha 13, são x=20 e y=10. Como pode ser observado, os valores das variáveis ’x’ e
’y’, externas à função ’TrocaValor()’ foram efetivamente trocados entre si, e isso só
foi possível por causa da utilização de ponteiros.
3 v [0] = 2;
4 v [1] = 4;
5 v [2] = 6;
6 v [3] = 8;
7 v [4] = 10;
8
9 int * p ;
10 p = v;
Na linha 9 é declarado um ponteiro ’p’ do tipo inteiro. Esse ponteiro aponta para
o primeiro elemento do vetor ’v’ (linha 10), ou seja, aponta para a posição ’v[0]’.
204
++
Princípios de programação em C
Para listar na tela o conteúdo e o endereço de memória apontado por ’p’ pode-se
utilizar o objeto cout.
1 cout << p << endl ; // Endereco : 0 x7fff4c8d6ff4
2 cout << * p << endl ; // Conteudo : 2
O valor de uma posição do vetor (ou matriz) pode ser modificado com o uso de
ponteiros. Exemplo:
1 int * p ; // Declara o ponteiro ’p ’;
2 p = v; // Aponta para a primeira posicao
3 // de v []. Nao utiliza o simbolo ’& ’
4 cout << * p << endl ; // Imprime o valor de v [0]: 2
5 p = & v [4]; // Aponta para a quinta posicao de
6 // v []
7 * p = 30; // Muda o valor da quinta posicao de
8 // p para 30
9 cout << * p << endl ; // Imprime o valor de p na quinta po
10 // sicao : 30
11 cout << v [4] << endl ; // Imprime o valor de v [] na quinta
12 // posicao : 30
No código acima, uma outra forma de modificar o valor da quinta posição de ’p’
é a que está indicada na linha 4 do código a seguir.
Se ’p’ aponta para a primeira posição do vetor ’v’ (v[0]), então ’(p+4)’ apontará
para a quinta posição de ’v’.
O asterisco antes do parêntesis a linha 4 faz referência ao ’valor numérico’ ar-
mazenado na posição apontada pelo ponteiro.
Se ’p’ aponta para um elemento particular de um vetor, então (p+1) aponta para
o próximo elemento desse vetor. E, de um modo genérico, pode-se dizer que se
’p’ aponta para um elemento particular de um vetor, então (p+i) apontará para o
elemento localizado i posições, a partir da atual posição indexada nesse vetor.
205
++
Princípios de programação em C
1 int * p ;
2 p = v; // Aponta para a primeira posicao
3 // de v []
4 *( p +4) = 80; // Muda o valor da quinta posicao
5 // de p para 80
6
Da mesma forma que para outras variáveis, um ponteiro do tipo inteiro pode ser
inicializado como um ’ponteiro nulo’, bastando, para isso, atribuir o valor ’zero’ a
esse ponteiro.
1 int * p = 0;
16 return 0;
17 }
206
++
Princípios de programação em C
6 int * p ; p = v ;
7
14 // - -[ Saidas :] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
15 //
16 // v [0]: 0 x7ffdefb35770 2
17 // v [1]: 0 x7ffdefb35774 4
18 // v [2]: 0 x7ffdefb35778 6
19 // v [3]: 0 x7ffdefb3577c 8
20 // v [4]: 0 x7ffdefb35780 10
21 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
207
++
Princípios de programação em C
Não somente nos vetores, mas também as posições dos elementos nas matrizes
são acessados de modo contíguo por meio de ponteiros.
Assim, a matriz armazenada na memória do computador possui suas células (seus
elementos) dispostos de modo sequencial, semelhante à disposição de um vetor, não
havendo, portanto, nenhuma organização bi-dimensional (linhas × colunas), como
mostrado na Figura 10.1.
0,0
Primeira linha
1,0 da matriz
2,0
3,0
Elementos dispostos de modo contíguo na memória
208
++
Princípios de programação em C
209
++
Princípios de programação em C
1 int ** p ;
4 int main ()
5 {
6 int Temper ; // Variavel ’ Temper ’
7 int * pTemper ; // Ponteiro para ’ Temper ’
8 int ** ppTemper ; // Ponteiro para o ponteiro de ’ Temper ’
9
10 Temper = 90;
11 pTemper = & Temper ;
12 ppTemper = & pTemper ;
13
14 cout << " Valores das variaveis : " << endl ; // Saidas :
15 cout << " Temper ...: " << Temper << endl ; // 90
16 cout << " pTemper ..: " << * pTemper << endl ; // 90
17 cout << " ppTemper .: " << ** ppTemper << endl ; // 90
18
19 return 0;
20 }
Ponteiros que apontam para outros ponteiros também podem ser colocados em
uma sequência maior, encadeada com a adição de mais asteriscos para fazer a sua
declaração.
1 int *p;
2 int ** p ;
3 int *** p ;
4 int **** p ;
210
++
Princípios de programação em C
1 int * p [10];
4 int main ()
5 {
6 char * Frutas [5] = { " Goiaba " ,
7 " Manga " ,
8 " Laranja " ,
9 " Caju " ,
10 " Morango " };
11
17 return 0;
18 }
211
++
Princípios de programação em C
10 int main ()
11 {
12
21 return 0;
22 }
23
35 nSoma = ( nSoma / n ) ;
36
37 return nSoma ;
38 }
Para passar uma matriz como argumento de uma função (ou procedimento),
é necessário declarar um ponteiro para a matriz, além de outros dois parâmetros,
212
++
Princípios de programação em C
8 int main ()
9 {
10 float mTemper [3][3];
11
18 cout << " Temper Media .: " << TemperMedia ( mTemper [0] , 3 , 3) ;
19
20 return 0;
21 }
22
35 return nMedia ;
36 }
213
++
Princípios de programação em C
5 int main () {
6 float mTemper [3][3];
7
214
++
Princípios de programação em C
6 int main ()
7 {
8 char * cLetra ;
9 cLetra = ( char *) malloc (1) ;
10 cin >> cLetra ;
11 cout << cLetra ;
12 return 0;
13 }
215
++
Princípios de programação em C
5 int main () {
6 int * nVetor ;
7 nVetor = ( int *) malloc ( sizeof ( int ) *10) ;
8 cout << " Digite os elementos do vetor : " << endl ;
9
A linha 18 do código acima traz uma novidade, que é a função ’free()’, utilizada
para liberar dinamicamente da memória todo o espaço que havia sido reservado para
o vetor ’nVetor’. A função ’free()’ deve ser sempre utilizada para liberar o espaço
de memória, quando esse não for mais utilizado pelo programa.
Embora seja algo que ocorra raramente, nem sempre o sistema operacional con-
segue alocar memória para uma variável quando utilizamos malloc(), e isso pode
ocorrer por diversas razões, entre as quais, pelo fato de haver muitos programas
abertos simultaneamente e acessando a memória, ou algum outro tipo de falha.
Para testar se a alocação de memória ocorreu corretamente, pode-se proceder
da seguinte forma, colocando um teste condicional imediatamente após a linha que
contém a função malloc() (linha 8 do programa anterior).
1 if ( nVetor == NULL )
2 {
3 cout << " \ nErro ! Memoria nao pode ser alocada ! " ;
4 exit (0) ;
5 }
Não apenas o tipo inteiro, mas qualquer outro tipo de dado pode utilizar da
função malloc() para fazer a alocação de espaço na memória. O código a seguir,
mostra como alocar um vetor de double, com tamanho w = 100 na memória do
computador, e preencher todos os seus elementos com o valor 120, 00.
Deve-se observar que o asterisco que aparece entre a variável ’w ’ e a função
sizeof(), na linha 11, é meramente o símbolo de matemático de multiplicação, não
tendo nenhuma relação com o símbolo de ponteiro, que também é um asterisco.
216
++
Princípios de programação em C
8 double * Temper ;
9 int w = 100;
10
13 if ( Temper == NULL )
14 {
15 cout << " \ nErro ! Memoria nao pode ser alocada ! " ;
16 exit (0) ;
17 }
18
217
++
Princípios de programação em C
5 int main ()
6 {
7 double * Temper ; int w = 10;
8
11 if ( Temper == NULL )
12 {
13 cout << " \ nErro ! Memoria nao pode ser alocada ! " ;
14 exit (0) ;
15 }
16
28 free ( Temper ) ;
29
30 return 0;
31 }
218
++
Princípios de programação em C
5 int main ()
6 {
7 int m = 3; // Qtd . de linhas
8 int n = 4; // Qtd . de colunas
9
13 if ( M == NULL )
14 {
15 cout << " Erro ! Nao foi possivel alocar memoria ! " << endl ;
16 exit (0) ;
17 }
18
39 // Libera a memoria
40 for ( int i = 0; i < m ; i ++)
41 {
42 free ( M [ i ]) ;
43 }
44 free ( M ) ; return 0;
45 }
219
++
Princípios de programação em C
M[0]
m linhas
M[1]
M[2]
M[3]
n colunas
Figura 10.3: Diagrama esquemático do modo como uma matriz bidimensional do tipo
’vetor de vetores’ está organizada na memória do computador. (Fonte: autores)
No exemplo acima, *a não é uma variável do tipo inteiro, mas sim um ponteiro,
alocado dinamicamente, e que deverá conter o endereço de uma variável com algum
valor inteiro.
O espaço que o operador new reserva na memória do computador é exatamente
do mesmo tamanho do tipo de dado alocado por ele que, para este exemplo, é o
tamanho do tipo inteiro (4 bytes). Embora no exemplo acima tenha sido declarado
220
++
Princípios de programação em C
um vetor do tipo inteiro, o programador deve ter em mente que outros tipos de
dados poderiam ter sido declarados: float, char, double, um vetor, uma matriz, uma
struct, um número complexo, etc.
A sintaxe básica para a utilização do operador new é a que está mostrada a
seguir:
tipo *ponteiro = new tipo
Nessa sintaxe, o compilador se encarregará de verificar que o tipo de dado utilizado
pelo ponteiro no lado esquerdo do sinal de igual é do mesmo tipo que aquele utilizado
no lado direito do sinal de igual. Caso sejam diferentes ocorrerá um típico erro de
sintaxe, e o compilador irá gerar uma mensagem de erro na tela do computador
durante a compilação do programa. O exemplo apresentado a seguir mostra como
declarar dinamicamente uma variável inteira chamada ’Qtd’.
1 # include < iostream >
2
5 int main ()
6 {
7 int * Qtd = NULL ;
8 * Qtd = new int ;
9
10 * Qtd = 256;
11
12 cout << " Valor ..: " << * Qtd << endl ;
13 delete Qtd ;
14 return (0) ;
15 }
221
++
Princípios de programação em C
sempre verificar se o valor NULL foi atribuído a ele durante a execução do programa,
como mostrado no código a seguir.
1 # include < iostream >
2
5 int main ()
6 {
7 int * Qtd = NULL ;
8 Qtd = new int ;
9
22 return 0;
23 }
Observe que a função ’return’ na linha 13 do código acima tem como parâmetro
o valor ’−1’. Essa função foi utilizada com a finalidade de abortar a execução
do programa, em função da impossibilidade de alocação de memória. O correto,
contudo, seria o programador construir alguma subrotina de tratamento de exceção
com as instruções try, throw e catch, apresentadas e discutidas no Çapítulo 6.
Além de servir para abortar o programa, a instrução return também serve para
informar ao programador o tipo de erro ocorrido durante sua execução. O parâmetro
−1 foi utilizado aqui para indicar uma situação na qual a saída do programa tenha
ocorrido mediante o surgimento de algum tipo de erro para o qual não era espe-
rado de ocorrer, afinal os computadores modernos geralmente possuem memória em
quantidade suficiente para a alocação de uma variável inteira. As convenções mais
utilizadas para o parâmetro de return são os seguintes:
Positivo: Em geral, utiliza-se o valor ’1’ como parâmetro da instrução return. Serve
para indicar que algo de potencialmente errado, mas previsível, ocorreu na
execução do programa como, por exemplo, falha na abertura de um arquivo,
falha na conexão com um servidor remoto, etc.
222
++
Princípios de programação em C
4 int main () {
5 int n ;
6 cout << " Informe a Qtd de latas a processar ..: " ;
7 cin >> n ; cin . ignore () ;
8 cout << endl ;
9
223
++
Princípios de programação em C
224
++
Princípios de programação em C
Assim, cria-se uma variável chamada ’FichaDeDados’, cujo tipo de dado não é
inteiro, float ou double, mas sim, o tipo ’Efluente’.
Agora é possível atribuir valores aos membros da variável ’FichaDeDados’, e isso
é feito por meio de um ’ponto’, como mostrado a seguir.
1 # include < iostream >
2 using namespace std ;
3
4 struct Efluente {
5 float pH ; // pH
6 float Condut ; // Condutividade eletrica
7 int Turbidez ; // Indice de turbidez
8 float Temper ; // Temperatura
9 float DBO ; // Demanda Bioquimica de Oxigenio
10 float DQO ; // Demanda Quimica de Oxigenio
11 };
12
13 int main ()
14 {
15 Efluente FichaDeDados ;
16
24 cout << " Condutividade : " << FichaDeDados . Condut << endl ;
25 cout << " DBO ..........: " << FichaDeDados . DBO << endl ;
26 cout << " DQO ..........: " << FichaDeDados . DQO << endl ;
27 cout << " pH ...........: " << FichaDeDados . pH << endl ;
28 cout << " Temperatura ..: " << FichaDeDados . Temper << endl ;
29 cout << " Turbidez .....: " << FichaDeDados . Turbidez << endl ;
30
31 return 0;
32 }
225
++
Princípios de programação em C
Os valores são atribuídos aos membros da struct da mesma maneira que para
qualquer outro tipo de variável bastando, portanto, utilizar o símbolo convencional
de atribuição de valores (’=’).
Para extrair o valor armazenado em um membro da struct é necessário apenas
referenciar esse membro no código. Exemplo:
1 cout << " Condutividade : " << FichaDeDados . Condut << endl ;
4 struct Efluente {
5 float pH ; // pH
6 float Condut ; // Condutividade eletrica
226
++
Princípios de programação em C
13 int main ()
14 {
15 Efluente FichaET1 , FichaET2 ;
16
17 FichaET1 . pH = 6.25;
18 FichaET2 . pH = 7.26;
19
23 return 0;
24 }
Uma estrutura pode conter outras estruturas aninhadas como membros. O exem-
plo apresentado a seguir possui três estruturas. Na primeira (linha 5) estão membros
que guardam informações sobre aspectos da embalagem do alimento, como peso
líquido (em gramas), altura da embalagem (cm), e diâmetro da embalagem (cm).
Os membros da segunda struct (linha 10) servem para armazenar dados de vida
de prateleira, como dia, mês e ano. A terceira struct (linha 15) possui informações
gerais sobre o alimento, mas observe que nesta terceira estrutura, a variável ’Emb’
é do tipo ’Embalagem’, e refere-se ao tipo de dado descrito pela primeira struct.
Na terceira estrutura, a variável ’Valid’ é do tipo ’Validade’, um tipo de dado
definido pela segunda struct.
Outra coisa a observar é que a terceira struct só reconhece os tipos ’Embalagem’
e ’Validade’ porque as estruturas que definem esses tipos foram especificadas no
código antes da terceira estrutura, ou seja, o tipo ’Embalagem’ especificado na linha
17 só é compreendido pelo compilador por que a estrutura que o define foi declarada
na linha 5, antes da linha 17. O mesmo é válido para o tipo ’Validade’. Esse tipo
só é reconhecido pelo compilador por que a estrutura que o define foi declarada na
linha 10, antes da linha 18.
1 # include < iostream >
2 # include < cstring > // strcpy ;
3 using namespace std ;
4
5 struct Embalagem {
6 float PesoLiq ; // Massa do alimento
7 float Altura ; // Altura da lata
8 float Diametro ; // Diametro da lata
9 };
227
++
Princípios de programação em C
10 struct Validade {
11 int Dia ;
12 int Mes ;
13 int Ano ;
14 };
15 struct Alimento {
16 char Descricao [30];
17 Embalagem Emb ;
18 Validade Valid ;
19 };
20
21 int main () {
22 Alimento Embutido ;
23
32 cout << " Descricao ....: " << Embutido . Descricao << endl ;
33 cout << " Altura lata ..: " << Embutido . Emb . Altura << endl ;
34 cout << " Diametro lata : " << Embutido . Emb . Diametro << endl ;
35 cout << " Peso liquido .: " << Embutido . Emb . PesoLiq << endl ;
36 cout << " Validade .....: " << Embutido . Valid . Dia << " -"
37 << Embutido . Valid . Mes << " -"
38 << Embutido . Valid . Ano << endl ;
39 return 0;
40 }
Os ponteiros podem ser criados não somente para as variáveis dos tipos inteiro,
float, double, etc., mas também podem ser declarados para apontar para estruturas.
No exemplo a seguir, a variável ’R’ é uma instância da estrutura ’Componente’.
Já a variável ’Resistor’ é um ponteiro do tipo ’Componente’, que aponta para a
variável ’R’.
1 # include < iostream >
2 using namespace std ;
3
228
++
Princípios de programação em C
10 int main () {
11 Componente * Resistor , R ;
12
13 Resistor = & R ;
14
21 cout << " Corrente : " << (* Resistor ) . Corrente << endl ;
22 cout << " Tensao ..: " << (* Resistor ) . Tensao << endl ;
23
24 return 0;
25 }
O ponteiro para ’R’ pode ter acesso ao conteúdo de qualquer um dos membros
da sua estrutura por meio da notação apresentada nas linhas 22 e 23 do código
acima. Entretanto, uma forma mais simples de escrever os comandos nessas linhas é
o que está apresentado a seguir, que utiliza setas para a direita (’->’) para acessar
os membros da estrutura.
1 cout << " Corrente : " << Resistor - > Corrente << endl ;
2 cout << " Tensao ..: " << Resistor - > Tensao << endl ;
10 int main () {
11 Complexo Coord [3]; // Um vetor de 3 posicoes
12
229
++
Princípios de programação em C
16
17 cout << " Ponto 1: " << "(" << Coord [0]. Real
18 << " ," << Coord [0]. Imag
19 << ")" << endl ;
20 cout << " Ponto 2: " << "(" << Coord [1]. Real
21 << " ," << Coord [1]. Imag
22 << ")" << endl ;
23 cout << " Ponto 3: " << "(" << Coord [2]. Real
24 << " ," << Coord [2]. Imag
25 << ")" << endl ;
26 return 0;
27 }
9 int main () {
10 Coord Ponto [100]; // Declara vetor com 100 posicoes
11
230
++
Princípios de programação em C
O exemplo a seguir mostra como passar uma struct como argumento de uma
função, conforme discutido no início deste tópico. Neste exemplo, a função ’Calcu-
laDistancia()’ é usada para calcular a distância Euclidiana (Equação 10.1) entre dois
pontos coordenados, dados pelas variáveis ’Origem’ e ’Destino’.
q
dOr ig,Dest = (XOr ig − XDest )2 − (YOr ig − YDest )2 (10.1)
6 struct Coord
7 {
8 int X ; // Coordenada X
9 int Y ; // Coordenada Y
10 };
11
14 int main () {
15 Coord Ponto [100]; // Declara vetor com 100 posicoes
16
231
++
Princípios de programação em C
6 struct Pessoa
7 {
8 string Nome ;
9 string Ident ;
10 int Idade ;
11 char Sexo ;
12 };
13
14 int main ()
15 {
16 Pessoa Funcionario ;
17
18 cout << " Nome ......: "; getline ( cin , Funcionario . Nome ) ;
19 cout << " Identidade : "; getline ( cin , Funcionario . Ident ) ;
20 cout << " Idade .....: "; cin >> Funcionario . Idade ;
21 cout << " Sexo ......: "; cin >> Funcionario . Sexo ;
22
232
++
Princípios de programação em C
233
++
Princípios de programação em C
(j) Crie um procedimento que receba como parâmetros ponteiros para dois
vetores X e Y , ambos do tipo double, e ambos do mesmo tamanho n = 12.
A função deverá retornar um ponteiro para um terceiro vetor R (vetor de
respostas). O vetor R possui cinco posições. As posições de R terão os
seguintes conteúdos:
i. Média aritmética dos valores de X
ii. Média aritmética dos valores de Y
iii. Variância dos valores de X
iv. Variância dos valores de Y
v. Coeficiente de correlação (ρ̂) entre as variáveis X e Y (Equação 10.2)
! !
i=n
X i=n
X
i=n
Xi Yi
X
i=1 i=1
(xi × yi ) −
n
i=1
ρ̂ = v !2 !2 (10.2)
u i=n i=n
u X X
u
u i=n Xi
i=n
Yi
uX X
i=1 i=1
Xi2 − × Yi 2 −
u
n n
u
u i=1
t i=1
(k) Modifique o programa anterior, de modo que ele seja também capaz de
estimar os parâmetros m e b de uma equação linear de primeiro grau, do
234
++
Princípios de programação em C
i=n
! " i=n
! i=n
!#
X X X
n X i × Yi − Xi Yi
i=1 i=1 i=1
m= ! !2 (10.3)
i=n
X i=n
X
n Xi2 − Xi
i=1 i=1
i=n
! i=n
!
X X
Yi −m Xi
i=1 i=1
b= (10.4)
n
(l) Crie um vetor W com n valores do tipo float. O vetor somente deverá ser
alocado na memória após o usuário digitar a quantidade n de elementos.
(m) O que há de errado com o código a seguir?
1 int * w ;
2 w = malloc (60 * sizeof ( int ) ) ;
3 w [0] = 200;
4 free ( w +2) ;
2. Structs
235
++
Princípios de programação em C
(d) Escreva um programa que contenha uma struct para armazenar dados
da rota a ser percorrida pelos caminhões que fazem a distribuição dos
alimentos de uma fábrica. A struct deve possui os seguintes dados:
i. Nome do motorista (char[40])
ii. Nome do cliente (char[40])
iii. Cidade origem (char[30])
iv. Cidade destino (char[30])
v. Tempo de viagem (float)
vi. Distância total (float)
vii. Velocidade máxima registrada no tacógrafo (float)
viii. Qtd. combustível (float)
ix. Produto transportado (string)
x. Qtd. de caixas de produtos (int)
xi. Temperatura do produto durante o transporte (float)
(e) Escreva um programa que contenha uma struct para armazenar dados da
frota de veículos de uma indústria de alimentos. O programa deverá ler os
dados de 10 veículos (digitados pelo usuário) e listá-los na tela. Além da
struct para armazenar os dados do veículo, o programa deverá também
conter uma outra struct, para armazenar informações de datas, conforme
apresentado a seguir.
• Struct ’data’ para armazenar datas
i. Dia (int)
ii. Mês (int)
iii. Ano (int)
• Struct para armazenar dados dos veículos
i. Motorista responsável pelo veículo (string)
ii. Descrição do veículo (string)
iii. Modelo/Marca do veículo (string)
iv. Ano de fabricação (int)
v. Número da placa (string)
vi. Número do chassis (string)
vii. Capacidade máxima de transporte, ton. (float)
viii. Tara do caminhão (peso sem carga), ton. (float)
ix. Consumo médio na cidade, km/litro (string)
x. Consumo médio na rodovia, km/litro (string)
xi. Caminhão refrigerado? (bool)
xii. Data da última manutenção (data)
xiii. Data da próxima manutenção (data)
236
++
Princípios de programação em C
237
++
Princípios de programação em C
Café
Lote
% arábica
Mês Talhão
Quantidade colhida [ton]
Ano
Mês
Processamento
Ano
Tipo
Mês Acidez
Ano Doçura
Anál. sensorial
R L*
RGB B b*
CIELab
238
Capítulo 11
Conteúdo do capítulo
11.1 Os números aleatórios e suas aplicações em simulações
e cálculos de engenharia . . . . . . . . . . . . . . . . . . . 239
11.1.1 As funções rand() e srand() da biblioteca cstdlib . . . . . 240
11.2 Atividades para fixação da aprendizagem . . . . . . . . . 245
239
++
Princípios de programação em C
6
8
4
5 7
3
Figura 11.1: Caminho destacado evidenciando parte da rota ótima entre diversas
cidades a serem percorridas na solução do Problema do Caixeiro Viajante. (Fonte:
autores)
240
++
Princípios de programação em C
32767 entre as diferentes implementações1 do C++ . Este valor pode ser obtido
ao listar na tela o conteúdo da constante RAND_MAX com o objeto cout:
1 # include < iostream >
2 # include < cstdlib >
3 using namespace std ;
4
5 int main ()
6 {
7 cout << " Valor maximo ..: " << RAND_MAX << endl ;
8 return 0;
9 }
• srand(): Esta função também gera números inteiros aleatórios, porém de modo
diferente da função rand(). A função srand() gera os valores aleatórios com
base em um valor de referência, ou ’ponto de partida’, conhecido como ’se-
mente’ (ou seed, em inglês).
Assim, se o programador utilizar, por exemplo, uma seed igual a 10 (dez),
então caso mande gerar uma lista com 5 números aleatórios, a função srand()
irá gerar sempre a mesma sequência de números aleatórios em todas as vezes
que o programa for executado com a seed igual a 10. Mas se o programador
modificar o valor da seed para algum outro valor (12, por exemplo), então
outros números aleatórios serão gerados, mas essa sequência de novos valores
aleatórios será exatamente a mesma a cada vez que o programa for novamente
executado, enquando a seed não for modificada.
• Exemplo de uso da função rand(). Neste exemplo são gerados 10 (dez) núme-
ros aleatórios inteiros. Se o programa for executado várias vezes, a sequência
será sempre a mesma todas as vezes.
1 # include < iostream >
2 # include < cstdlib > // rand () e srand () ;
3 using namespace std ;
4
5 int main () {
6
1
Na versão do Code::Blocks utilizada ao escrever este livro (versão 20.03, gcc 5.4.0, Linux -
Unicode, 64 bits), o valor de RAND_MAX declarado na biblioteca cstdlib é 2147483647.
241
++
Princípios de programação em C
• Exemplo de uso da função srand() com seed igual a 10. Neste exemplo são
gerados 20 (vinte) números aleatórios inteiros. Se o programa for executado
várias vezes, a sequência será sempre a mesma todas as vezes. Caso o progra-
mador tenha interesse em que o programa gere uma outra sequência, então
ele deverá utilizar um outro valor para seed.
1 # include < iostream >
2 # include < cstdlib >
3 using namespace std ;
4
5 int main () {
6 srand (10) ;
7
Uma pergunta que pode surgir é a seguinte: ’Como os números gerados são
aleatórios se eles se repetem a cada vez que o programa é executado?’ A resposta
para isso é bem simples. Eles não são verdadeiramente aleatórios.
Os valores gerados pelas funções rand() e srand() são pseudoaleatórios. Para
melhorar a aleatoriedade na geração desses números, o programador pode se valer
de um artifício bastante simples: ao invés de informar um valor fixo para a seed,
basta ele informar um valor que muda a cada instante.
A função time() da biblioteca ctime permite obter o número de segundos de-
corridos2 desde 00:00:00 UTC do dia 1 de janeiro de 1970 até o momento atual,
quando o parâmetro passado a ela é o valor ’NULL’3 .
1 # include < iostream > // O valor aleatorio sera ge
2 # include < cstdlib > // rado com uma seed dada pe
3 # include < ctime > // lo instante de tempo atu
4 using namespace std ; // al ( em quantidade de se
5 // gundos decorridos desde a
6 int main () { // zero hora do dia 01 de ja
7 srand (( unsigned ) time ( NULL ) ) ; // neiro de 1970 ate o ins
8 for ( int i =0; i <10; i ++) { // tante de tempo atual ) . Es
9 cout << rand () << endl ; // se valor de seed muda to
10 } // da vez que o programa for
11 return 0; // executado .
12 }
2
Ver detalhes no Capítulo 4, Seção 4.1.5, p.73.
3
Em C++ ’NULL’ é definido como sendo numericamente igual a zero.
242
++
Princípios de programação em C
Vimos que a função rand() sempre retorna um número inteiro entre zero e
RAND_MAX. Assim, para gerar um número aleatório compreendido entre dois va-
lores, nMin e nMax, a função rand() pode ser utilizada como apresentado a seguir.
1 int Aleatorio = rand () %(( nMax - nMin ) + 1) + nMin ;
Exemplo:
1 # include < iostream >
2 # include < cstdlib >
3 # include < ctime >
4 using namespace std ;
5 int main () {
6 srand (( unsigned ) time ( NULL ) ) ;
7 int nMin = 5; int nMax = 120;
8 for ( int i =0; i <1000; i ++) {
9 int Aleatorio = rand () %(( nMax - nMin ) + 1) + nMin ;
10 cout << Aleatorio << endl ;
11 }
12 return 0;
13 }
7 int main () {
8 int CaraOuCoroa ;
9 CaraOuCoroa = JogarMoeda () ;
10
11 if ( CaraOuCoroa == 0) {
12 cout << " Deu Cara " << endl ;
13 } else {
14 cout << " Deu Coroa " << endl ;
15 }
16 return 0;
17 }
18 int JogarMoeda ( void ) {
19 srand (( unsigned ) time ( NULL ) ) ;
20 int nFace ;
21 nFace = rand () % 2; // O operador ’% ’ calcula o
22 return ( nFace ) ; // resto da divisao por n =2;
23 }
243
++
Princípios de programação em C
O sorteio de um número entre 1 e 6 pode, por exemplo, ser usado para simular
as jogadas de um dado para escolher a ordem dos tratamentos a serem aplicados a
parcelas de um delineamento experimental.
1 # include < iostream >
2 # include < cstdlib >
3 # include < ctime >
4 using namespace std ;
5 int JogoDeDados ( void ) ; // Prototipo de funcao
6
7 int main () {
8 srand (( unsigned ) time ( NULL ) ) ;
9 for ( int i =1; i <=10; i ++) {
10 cout << " Jogada : " << i << ’\ t ’ <<
11 " Face : " << JogoDeDados () << endl ;
12 }
13 return 0;
14 }
15
Valores numéricos aleatórios com casas decimais também podem ser gerados com
as funções rand() e srand(), em um intervalo pré-definido pelo programador.
1 # include < iostream >
2 # include < cstdlib >
3 # include < ctime >
4 # include < iomanip >
5 using namespace std ;
6 double Aleatorio ( double Min , double Max ) ; // Prototipo
7 int main () {
8 srand (( unsigned ) time ( NULL ) ) ;
9 cout . precision (6) ;
10 cout << setiosflags ( ios :: fixed ) ;
11 for ( int i =1; i <=10; i ++) { // gera valores nume
12 cout << Aleatorio (51 , 82) << endl ; // ricos aleatorios
13 } // entre 51 e 82.
14 return 0;
15 }
16 double Aleatorio ( double Min , double Max ) {
17 double nTemp = ( Max - Min ) ;
18 nTemp = nTemp * ((( double ) RAND_MAX ) - (( double ) rand () ) ) ;
19 nTemp = nTemp / (( double ) RAND_MAX ) ; nTemp = Max - nTemp ;
20 return nTemp ;
21 }
244
++
Princípios de programação em C
5. Crie um jogo simples em C++ . Este jogo deverá sortear um número inteiro entre
0 e 100, mas não mostrá-lo ao usuário do programa. O usuário deverá tentar
acertar o número sorteado, digitando sua escolha. Caso o usuário não acerte,
será dada a ele uma nova tentativa, e o jogo deverá informar se essa tentativa
foi maior ou menor do que o valor sorteado. Quando o usuário finalmente
acertar o número sorteado, o programa deverá indicar quantas tentativas foram
necessárias para acertar o número sorteado. (MATOS (2020)).
6. Escreva um programa para gerar números aleatórios inteiros entre 1 e 12. Es-
ses números serão utilizados para definir a ordem de aplicação dos tratamentos
às parcelas de um experimento com embalagens de alimentos. Os números ale-
atórios deverão ser colocados em um vetor de inteiros, alocado dinamicamente
em tempo de execução do programa. No seu código, certifique-se que nenhum
elemento do vetor poderá estar repetido. Liste os dados na tela e libere a
memória ao término do programa.
7. Para um determinado tipo de processo industrial, foi verificado que o seu custo
operacional é uma função de quatro outras variáveis, x, y , z e w . Dada a
245
++
Princípios de programação em C
√
função: custo(x, y , z, w ) = 4, 25x 3 − 7, 25y z + xz w /100 , com x ∈ [20; 100],
y ∈ [52; 104], z ∈ [16; 49] e w ∈ [67; 206]. Obtenha valores de x, y , z e
w , de modo que o custo fique próximo de R$ 411.832, 21. Para fazer isso,
escreva um programa que gere números aleatórios (double) nas faixas de valores
permitidos para cada uma das variáveis. Faça um laço infinito de repetição com
o comando while() de modo que, em cada ciclo iterativo, os valores aleatórios
que melhorem aproximação do custo desejado sejam armazenados em um vetor
de 4 posições, sendo uma posição para cada variável. Deixe o programa ser
executado por um longo intervalo de tempo como, por exemplo, 2 a 3 minutos,
e avalie os resultados obtidos.
0000
1 2 3
4 5 6
7 8 9
X 0 OK
Figura 11.2: Teclado de quatro dígitos utilizado para digitar a senha de desbloqueio
de um antigo equipamento industrial. (Fonte: autores)
246
Capítulo 12
Conteúdo do capítulo
12.1 Conceitos básicos sobre manipulação de arquivos de da-
dos em C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
12.2 Modos de abertura de arquivos de dados . . . . . . . . . 249
12.3 Análise do status de abertura de um arquivo de dados . 251
12.3.1 Fechando o arquivo de dados com close() . . . . . . . . . 251
12.4 Leitura e escrita em arquivos de dados no modo texto . 252
12.5 Leitura de caracteres em um arquivo de dados com a
função get() . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
12.6 Leitura e escrita de dados binários em arquivos de acesso
aleatório . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
12.7 Sistemas de Gestão de Bases de Dados, SGBD . . . . . . 271
12.8 Arquivos para plotagem de funções matemáticas . . . . 272
12.9 Atividades para fixação da aprendizagem . . . . . . . . . 273
247
++
Princípios de programação em C
• Fechamento de um arquivo.
248
++
Princípios de programação em C
249
++
Princípios de programação em C
• ifstream: ios::in
• ofstream: ios::out
O próximo exemplo mostra como abrir um arquivo para gravação. Neste caso a
gravação é feita em modo ’append’, e os novos dados serão acrescentados ao final
do arquivo.
1 ofstream ArqDados ;
2 ArqDados . open ( " c :\ temp \ Nomes . dat " , ios :: out | ios :: app ) ;
250
++
Princípios de programação em C
251
++
Princípios de programação em C
6 int main () {
7 ofstream ArqDados ; // Cria uma ofstream para um
arquivo
8 ArqDados . open ( " Alunos . txt " , ios :: out ) ;
9
10 if (! ArqDados ) {
11 cout << " Erro ao abrir o arquivo " ;
12 exit ( EXIT_FAILURE ) ; // Fecha o programa ;
13 } else {
14 ArqDados << " Maria Silva " << ’\ t ’ << " SP " << endl ;
15 ArqDados << " Jose Augusto " << ’\ t ’ << " MG " << endl ;
16 ArqDados << " Pedro Paulo " << ’\ t ’ << " BA " << endl ;
17 ArqDados << " Roberta Souza " << ’\ t ’ << " SP " << endl ;
18 ArqDados << " Ana Clara " << ’\ t ’ << " RS " << endl ;
19 }
20 ArqDados . close () ; // Fecha o arquivo de dados ;
21 return 0;
22 }
252
++
Princípios de programação em C
Figura 12.1: Exemplo de saída de dados para um arquivo físico externo. (Fonte:
autores)
6 int main () {
7
12 if (! ArqDados ) {
13 cout << " Erro ao abrir o arquivo " ;
14 exit ( EXIT_FAILURE ) ;
15 } else {
16 while (! ArqDados . eof () ) {
17 ArqDados . getline ( cTexto , 40) ;
18 cout << cTexto << endl ;
19 }
20 }
21 ArqDados . close () ;
22 return 0;
23 }
253
++
Princípios de programação em C
8 int main () {
9 double x , y , z ;
10
11 fstream ArqDados ;
12 ArqDados . open ( " Tabela . txt " , ios :: out ) ; // Abre p / gravacao
13
14 if (! ArqDados ) {
15 cout << " Erro ao abrir o arquivo " ; exit ( EXIT_FAILURE ) ;
16 } else {
17 ArqDados . precision (12) ;
18 ArqDados << setiosflags ( ios :: fixed ) ;
19
29 if (! ArqDados ) {
30 cout << " Erro ao abrir o arquivo " ; exit ( EXIT_FAILURE ) ;
31 } else {
32 cout . precision (4) ;
33 cout << setiosflags ( ios :: fixed ) ;
34
254
++
Princípios de programação em C
conseguiu, ou não, abrir esse arquivo corretamente. Caso esse arquivo não exista,
então a função open() irá criar um arquivo vazio com o nome ’Tabela.txt’.
A criação de um arquivo vazio pela função open() é feita somente quando o
arquivo está sendo aberto em modo gravação. Caso a função open() estivesse
tentando abrir o arquivo em modo de leitura (ios::in) e esse arquivo não existisse,
ou por algum motivo não pudesse ser aberto (por exemplo, erro no hard disk),
então um erro seria gerado em tempo de execução do programa, e o mesmo seria
imediatamente abortado.
Nas linhas 17 e 18 do programa são especificados os parâmetros que definem
o número de casas decimais para valores numéricos, que neste caso optou-se por
trabalhar com 12 casas decimais. Entre as linhas 20 e 25 o comando for() é usado
para gerar os valores de x, y e z e gravar esses dados com o operador de inserção
(<<) no arquivo ’Tabela.txt’ (linha 23).
Imediatamente após a gravação dos dados no arquivo, este é fechado com a fun-
ção ’close()’ (linha 26). A segunda parte do programa consiste em abrir novamente
o arquivo de dados (linha 27), porém agora ele será aberto em modo leitura (ios::in).
A abertura do arquivo é feita com a mesma stream ArqDados, e ao ser aberto, o
ponteiro do arquivo é imediatamente deslocado para o seu início. Ao abrir o arquivo
em modo leitura, faz-se um novo teste lógico para verificar se o comando open()
conseguiu abrir o arquivo corretamente (linha 29).
Os comandos nas linhas 32 e 33 determinam que os valores numéricos deverão
estar com 4 (quatro) casas decimais. O comando while() na linha 35 deve ser
interpretado da seguinte maneira: ”faça enquanto não for o final do arquivo (eof:
end of file)”.
A leitura do arquivo será feita desde o início até o seu final, e o operador de
extração (’>>’) será utilizado para ler ar informações contidas no arquivo e colocar
esses valors nas variáveis x,y e z. Imediatamente após a leitura do arquivo de dados,
este é fechado pela função ’close()’ (linha 40).
255
++
Princípios de programação em C
6 ifstream dbProcTerm ;
7 dbProcTerm . open ( " ProcTerm . txt " , ios :: in ) ;
8 char cLetra ;
9 while (! dbProcTerm . eof () ) {
10 dbProcTerm . get ( cLetra ) ;
11 cout << cLetra ;
12 }
13 dbProcTerm . close () ;
14 return 0;
15 }
5 int main () {
6 ifstream dbProcTerm ;
7 dbProcTerm . open ( " ProcTerm . txt " , ios :: in ) ;
8
5 int main () {
6 ifstream dbProcTerm ;
7 dbProcTerm . open ( " ProcTerm . txt " , ios :: in ) ;
256
++
Princípios de programação em C
17 dbProcTerm . close () ;
18 cout << " Qtd de palavras .: " << nQtd ;
19 return 0;
20 }
O programa a seguir mostra como a função ’getline()’ pode ser usada para contar
o número de linhas em um arquivo, considerando que, neste exemplo, cada linha não
tenha mais do que 250 caracteres.
1 # include < fstream >
2 # include < iostream >
3 using namespace std ;
4
5 int main () {
6 ifstream dbProcTerm ;
7 dbProcTerm . open ( " ProcTerm . txt " , ios :: in ) ;
8
257
++
Princípios de programação em C
códigos apresentados, mas o programador deve ter em mente que esses testes sempre
devem ser realizados.
1 # include < iostream >
2 # include < fstream >
3 using namespace std ;
4
5 int main () {
6 ifstream dbArqLeitura ;
7 dbArqLeitura . open ( " ProcTerm . txt " , ios :: in ) ;
8
9 ofstream dbArqGravacao ;
10 dbArqGravacao . open ( " CopiaProcTerm . txt " , ios :: out ) ;
11
12 char cLetra ;
13 while (! dbArqLeitura . eof () ) {
14 dbArqLeitura . get ( cLetra ) ;
15 if ( cLetra != ’a ’) {
16 dbArqGravacao << cLetra ;
17 }
18 }
19
20 dbArqLeitura . close () ;
21 dbArqGravacao . close () ;
22 return 0;
23 }
258
++
Princípios de programação em C
Tabela 12.1: Exemplo da estrutura de uma tabela com registros e campos de dados
de estudantes.
Matrícula Nome NotaP1 NotaP2 NotaP3
145 Ana Clara 86.2 68.9 76.4
874 José Carlos 92.7 72.6 69.5
478 Cláudio Oliveira 82.4 86.8 67.6
.. .. .. .. ..
. . . . .
475 Priscila Silva 89.4 98.6 86.6
Fonte: Elaborada pelos autores.
Para utilizar essa estrutura é necessário declarar uma variável do tipo ’Ficha’,
1 Ficha Estudante ;
259
++
Princípios de programação em C
função strcpy da biblioteca cstring, visto que se trata de um campo tipo vetor de
caracteres. Operações com structs já foram apresentadas e discutidas anteriormente
no Capítulo 10, p.224.
1 Estudante . Matricula = 145;
2 strcpy ( Estudante . Nome , " Ana Clara " ) ;
3 Estudante . NotaP1 = 86.2;
4 Estudante . NotaP2 = 68.9;
5 Estudante . NotaP3 = 76.4;
Após a entrada dos dados a partir do teclado é necessário criar uma stream, que
será utilizada para estabelecer uma comunicação com o arquivo externo. Para este
exemplo, o arquivo será chamado de ’CadAluno.dat’.
Como o acesso ao arquivo de dados será tanto para leitura quanto para gravação,
então a stream será do tipo fstream.
1 fstream ArqDados ;
260
++
Princípios de programação em C
Como de costume, sempre que a função open() é utilizada para estabelecer uma
comunicação com um arquivo externo, é necessário verificar se essa comunicação foi
estabelecida com sucesso ou não.
1 if (! ArqDados )
2 {
3 cout << " Erro ao abrir cadastro de alunos " ;
4 exit (0) ; // Recurso da biblioteca < cstdlib >
5 } else {
6 // Processamento dos dados aqui ;
7 }
Após a gravação o arquivo de dados deverá ser fechado com a função close().
1 ArqDados . close () ;
261
++
Princípios de programação em C
A função clear() serve para limpar o status de erro de uma stream, enquanto
que a função ’seekg()’ serve para movimentar o ponteiro do arquivo para a próxima
posição a ser lida (get) em uma stream. Neste caso, o seu primeiro argumento é
um valor de offset (desvio), relativo ao segundo argumento.
O segundo argumento da função seekg() (ios::beg) refere-se ao início do arquivo.
Em outras palavras, o programador pode utilizar essas duas linhas de código quando
desejar movimentar o ponteiro para o início do arquivo, quando em uma operação
de leitura de dados.
A movimentação do ponteiro para a leitura de um registro específico também é
feita com a função seekg().
Na linha 2 do código a seguir o ponteiro será movimentado para uma posição
que leva em conta o comprimento total de um registro (em bytes), e o número de
registros a ser percorrido, desde o início do arquivo de dados, até chegar no registro
de interesse do programador.
Assim, caso o ele tenha interesse em acessar os dados do terceiro registro, então
ele deverá movimentar o ponteiro do arquivo de dados para a posição ’3 × (tamanho
de um registro de dados)’. Neste exemplo, o tamanho de um registro de dados é
obtido pela função ’sizeof()’.
1 int NumReg = 2;
2 ArqDados . seekg ( ( NumReg ) * sizeof ( Ficha ) ) ;
262
++
Princípios de programação em C
Uma vez encontrado o registro de interesse, podemos ler os seus dados e colocar
nas variáveis da estrutura (struct) ’Estudante’. A leitura de dados de um arquivo
binário aleatório é feita com a função ’read()’.
1 ArqDados . read ( ( char *) & Estudante , sizeof ( Ficha ) ) ;
Uma vez lidos os dados a partir do arquivo, estes são colocados nas variáveis da
estrutura ’Estudante’, essas variáveis podem ser listadas na tela ou utilizadas para
qualquer outra finalidade.
1 cout << Estudante . Nome << endl ;
2 cout << Estudante . Matricula << endl ;
3 cout << Estudante . NotaP1 << endl ;
4 cout << Estudante . NotaP2 << endl ;
5 cout << Estudante . NotaP3 << endl ;
7 struct Ficha {
8 int Matricula ; // Campo matricula : tipo inteiro ;
9 char Nome [31]; // Campo Nome : tipo vetor de caracteres ;
10 float NotaP1 ; // Campo NotaP1 : tipo float ;
11 float NotaP2 ; // Campo NotaP2 : tipo float ;
12 float NotaP3 ; // Campo NotaP3 : tipo float ;
13 };
14 int main () {
15
16 Ficha Estudante ;
17 fstream ArqDados ;
18 ArqDados . open ( " CadAluno . dat " , ios :: out |
19 ios :: in | ios :: binary |
20 ios :: app ) ;
21 if (! ArqDados ) {
22 cout << " Erro ao abrir cadastro de alunos " ;
23 exit ( EXIT_FAILURE ) ;
24 } else {
25 ArqDados . clear () ; // Limpa o status de erro
26 ArqDados . seekg (0 , ios :: beg ) ; // Inicio do arquivo
27
28 int NumReg ;
29 cout << " Informe numero do registro procurar : " ;
263
++
Princípios de programação em C
35 cout << " Nome .....: " << Estudante . Nome << endl ;
36 cout << " Matricula : " << Estudante . Matricula << endl ;
37 cout << " Nota P1 ..: " << Estudante . NotaP1 << endl ;
38 cout << " Nota P2 ..: " << Estudante . NotaP2 << endl ;
39 cout << " Nota P3 ..: " << Estudante . NotaP3 << endl ;
40 }
41 ArqDados . close () ;
42 return 0;
43 }
Caso o programador tenha interesse, ele pode usar um loop do tipo while() e
percorrer todos os registros de um arquivo, a partir do início. O while() será inter-
rompido apenas quando o ponteiro indicar que o final do arquivo foi alcançado.
A função função ’eof()’ (end of file) é utilizada para verificar se o final do arquivo
foi alcançado. Caso isso ocorra ela retorna true. De modo semelhante, há também
a função ’beg()’ (begin of file), que serve para testar se o início do arquivo foi
alcançado, caso o loop esteja percorrendo o arquivo de baixo para cima, em direção
ao primeiro registro.
1 while ( true ) {
2 ArqDados . read ( ( char *) & Estudante , sizeof ( Ficha ) ) ;
3
4 if ( ArqDados . eof () ) {
5 break ; // Sai do while ()
6 }
7
8 cout << " Nome .....: " << Estudante . Nome << endl ;
9 cout << " Matricula : " << Estudante . Matricula << endl ;
10 cout << " Nota P1 ..: " << Estudante . NotaP1 << endl ;
11 cout << " Nota P2 ..: " << Estudante . NotaP2 << endl ;
12 cout << " Nota P3 ..: " << Estudante . NotaP3 << endl ;
13 cout << endl ;
14 }
264
++
Princípios de programação em C
4 if ( ArqDados . eof () ) {
5 break ;
6 } else {
7 float P3 = Estudante . NotaP3 ;
8 if ( P3 > 60) { // Condicao !
9 cout << " Nome .....: " << Estudante . Nome << endl ;
10 cout << " Matricula : " << Estudante . Matricula << endl ;
11 cout << " Nota P1 ..: " << Estudante . NotaP1 << endl ;
12 cout << " Nota P2 ..: " << Estudante . NotaP2 << endl ;
13 cout << " Nota P3 ..: " << Estudante . NotaP3 << endl ;
14 cout << endl ;
15 }
16 }
17 }
2. Criar um arquivo de dados auxiliar, apenas para uso temporário (ex: ’dbTemp.tmp’).
3. Fazer um loop que percorra todo o arquivo de dados principal. Dentro desse loop,
todos os registros serão copiados para o arquivo temporário, exceto o registro
a ser excluído.
5. Renomear o arquivo de dados principal para algum nome que indique que ele não
será mais utilizado como, por exemplo, ’ArqDados.old’. É recomendado não
excluir de imediato o arquivo de dados principal antes de certificar que todo o
procedimento de cópia foi bem sucedido.
6. Renomear o arquivo de dados temporário de modo que ele fique com o nome do
arquivo de dados principal. Exemplo: ’ArqDados.dat’.
7. Utilizar esse ’novo’ ArqDados.dat, que agora não contém o registro excluído.
6 struct Ficha {
265
++
Princípios de programação em C
7 int Matricula ;
8 char Nome [31];
9 float NotaP1 , NotaP2 , NotaP3 ;
10 };
11 int main () {
12 Ficha Estudante ;
13
18 if (! ArqTemp ) {
19 cout << " Erro ao criar o arquivo temporario " ;
20 exit ( EXIT_FAILURE ) ;
21 }
22
25 ifstream ArqDados ;
26 ArqDados . open ( " CadAluno . dat " , ios :: in | ios :: binary ) ;
27
28 if (! ArqDados ) {
29 cout << " Erro ao abrir cadastro de alunos " ;
30 exit ( EXIT_FAILURE ) ;
31 } else {
32 int nMat = 0;
33 cout << " Excluir aluno matricula .: " ;
34 cin >> nMat ;
35 cin . ignore () ;
36
37 ArqDados . clear () ;
38 ArqDados . seekg (0 , ios :: beg ) ;
39
40 while ( true ) {
41 ArqDados . read (( char *) & Estudante , sizeof ( Ficha ) ) ;
42
43 if ( ArqDados . eof () ) {
44 break ;
45 }
46
49 if ( nMat != nMatReg ) {
50 ArqTemp . write (( char *) & Estudante , sizeof ( Ficha ) ) ;
51 }
52 }
53 }
266
++
Princípios de programação em C
54
55 ArqDados . close () ;
56 ArqTemp . close () ;
57
62 return 0;
63 }
No código acima, a função ’rename()’ foi utilizada para alterar o nome do ar-
quivo físico pre-existente no computador. A função ’remove()’ foi usada para excluir
fisicamente o arquivo.
É necessário ter um certo cuidado ao utilizar a função remove() visto que ao
excluir um arquivo, este será definitivamente excluído, não sendo possível, de modo
algum, recuperar as informações que haviam nesse arquivo.
Na prática, a exclusão real de um registro nem sempre é desejável, e nem sempre é
feita do modo como foi apresentado aqui. Pode ocorrer que um registro importante
seja excluído por engano de um arquivo de dados. Assim, para evitar esse tipo
de problema, a exclusão de um registro não é feita de verdade. O que se faz é
acrescentar ao registro alguma indicação de estatus, como apresentado na Tabela
12.2.
O último campo desta Tabela serve para indicar o estatus de cada registro. Aque-
les assinalados com a letra ’A’ são registros ’ativos’, ou seja, que não estão marcados
como ’excluídos’. Os registros assinalados com a letra ’E’ são aqueles que estão mar-
cados como ’excluídos’.
Em geral, trabalha-se apenas com os registros que estejam com o estatus ’A’
(ativos), entretanto essa estratégia de trabalhar com registros marcados com algum
estatus de exclusão pode ser difícil de ser utilizada em programas muito grandes,
com muitos arquivos de dados, exigindo bastante atenção por parte do programador.
Em algumas situações é necessário editar (ou modificar, atualizar) os dados que
267
++
Princípios de programação em C
A seguir um exemplo que mostra como fazer a edição dos dados de um registro
sobrescrevendo os dados que já se encontram nele.
1 # include < iostream > // Biblioteca padrao
2 # include < fstream > // Para acesso a dados
3 # include < cstdlib > // Para funcao : exit (0)
4 using namespace std ;
5
6 struct Ficha
7 {
8 int Matricula ;
9 char Nome [31];
10 float NotaP1 , NotaP2 , NotaP3 ;
11 };
12
13 int main ()
14 {
15
16 Ficha Estudante ;
17
22 if (! ArqDados )
23 {
24 cout << " Erro ao abrir cadastro de alunos " ;
25 exit ( EXIT_FAILURE ) ;
26 } else {
27 int nMat = 0;
28 cout << " Procurar por matricula .: " ;
268
++
Princípios de programação em C
32 ArqDados . clear () ;
33 ArqDados . seekg (0 , ios :: beg ) ;
34 int nReg = 0; // Para identificar o num do registro ;
35
36 while ( true ) {
37 ArqDados . read (( char *) & Estudante , sizeof ( Ficha ) ) ;
38
39 if ( ArqDados . eof () ) {
40 break ;
41 }
42
46 if ( nMat == nMatReg ) {
47 break ;
48 }
49 }
50
53 ArqDados . clear () ;
54 ArqDados . seekg (0 , ios :: beg ) ;
55
269
++
Princípios de programação em C
76 }
Um loop while() pode ser utilizado para listar na tela todos os registros do arquivo
de dados, como mostrado a seguir.
1 # include < iostream > // Biblioteca padrao
2 # include < fstream > // Para acesso a dados
3 # include < cstring > // Para funcao : strcpy ()
4 # include < cstdlib > // Para funcao : exit (0)
5 # include < iomanip > // Para funcao setw ()
6 using namespace std ;
7
8 struct Ficha {
9 int Matricula ;
10 char Nome [31];
11 float NotaP1 , NotaP2 , NotaP3 ;
12 };
13
14 int main ()
15 {
16
17 Ficha Estudante ;
18
19 ifstream ArqDados ;
20 ArqDados . open ( " CadAluno . dat " , ios :: in | ios :: binary ) ;
21
22 if (! ArqDados )
23 {
24 cout << " Erro ao abrir cadastro de alunos " ;
25 exit (0) ;
26 } else {
27 cout << " Nome " << ’\ t ’ << ’\ t ’ << ’\ t ’ << ’\ t ’ <<
28 " Matric " << ’\ t ’ <<
29 " Prova 1 " << ’\ t ’ <<
30 " Prova 2 " << ’\ t ’ <<
31 " Prova 2 " << endl ;
32
33 while ( true ) {
34 ArqDados . read (( char *) & Estudante , sizeof ( Ficha ) ) ;
35
36 if ( ArqDados . eof () ) {
37 break ;
38 }
39
270
++
Princípios de programação em C
271
++
Princípios de programação em C
1
Disponível para download em: http://www.gnuplot.info/
272
++
Princípios de programação em C
Figura 12.2: Plotagem dos dados de y (x) = sen(x) utilizando o pacote matemático
Gnuplot. (Fonte: autores)
273
++
Princípios de programação em C
2. Modifique o programa acima, de modo que ele possa também armazenar dados
de prestação de serviços. Entre os dados que podem ser armazenados, estão:
3. Modifique o programa acima, de modo que ele possa também armazenar dados
de materiais que tenham sido utilizados nas prestações de serviços:
Para cada cliente poderá ser utilizado diferentes tipos e quantidades de mate-
riais. O programa deverá ter uma opção para listar na tela todos os materiais
que foram utilizados para um determinado cliente, as quantidades utilizadas,
preços e as datas de utilização.
4. Utilizando o Gnuplot, faça um programa C++ que plote os gráficos das seguin-
tes funções:
w
• p(w ) = 1, 544w 2 × , w ∈ [0, 60]
(5, 666 + w )2
274
++
Princípios de programação em C
dS I
= −β S (12.1)
dt N
dI I
= β S − γI (12.2)
dt N
dR
= γI (12.3)
dt
No modelo S-I-R:
275
++
Princípios de programação em C
In
Sn+1 = −β Sn × ∆t + Sn (12.4)
N
In
In+1 = β Sn − γIn × ∆t + In (12.5)
N
276
++
Princípios de programação em C
277
++
Princípios de programação em C
278
++
Princípios de programação em C
Empresa
CNPJ Nome
Núm.
Dia
CEP
Mês
Vigência no cadastro Data final
Ano
279
Capítulo 13
Conteúdo do capítulo
13.1 Subdivisão do código em arquivos .h e .cpp . . . . . . . . 280
13.1.1 Alguns comentários sobre arquivos de cabeçalho . . . . . . 285
13.2 Subdivisão de arquivos de cabeçalho com namespaces . 286
13.2.1 Arquivo de cabeçalho MinhasFuncoes.h . . . . . . . . . 287
13.2.2 Arquivo de implementações MinhasFuncoes.cpp . . . . 287
13.3 Atividades para fixação da aprendizagem . . . . . . . . . 289
280
++
Princípios de programação em C
externo, e esse arquivo ser utilizado para a elaboração de diferentes programas, sem
a necessidade de reescrever essa função a cada novo programa.
Dessa forma, o programador poderá construir suas próprias bibliotecas de funções,
procedimentos, constantes e macros e utilizá-las sempre que necessário, diminuindo
sobremaneira a quantidade de trabalho, esforço e tempo ao construir diferentes pro-
gramas.
No Capítulo 4, p.80, foi mostrado como incluir um arquivo externo de macros
ao corpo do programa principal por meio da diretiva ’#include’. O mesmo será
feito aqui neste Capítulo 13, porém, além de constantes e macros, será mostrado
também como declarar e utilizar funções a partir de um arquivo externo.
Para uma abordagem mais prática de como montar uma biblioteca de funções,
as seguintes funções serão utilizadas:
1. Uma função que calcula a soma de dois valores numéricos do tipo float: x e
y:
1 float Soma ( float x , float y ) {
2 float Resp = 0.00;
3 Resp = ( x + y ) ;
4 return ( Resp ) ;
5 }
2. Uma função que calcula a média de dois valores numéricos do tipo float: x e
y.
1 float Media ( float x , float y ) {
2 float Resp = 0.00;
3 Resp = ( ( x + y ) / 2.00 ) ;
4 return ( Resp ) ;
5 }
3. Uma função que retorna o maior entre dois valores numéricos do tipo float:
x e y.
1 float Maior ( float x , float y ) {
2 float Resp = 0.00;
3
4 if ( x > y ) {
5 Resp = x ;
6 } else if ( y > x ) {
7 Resp = y ;
8 } else if ( x = y ) {
9 Resp = 0;
10 }
11 return ( Resp ) ;
12 }
281
++
Princípios de programação em C
a) Um arquivo com a extensão .h, que contém apenas os protótipos das funções.
Em geral, esse arquivo é denominado arquivo de interface para as funções. A
extensão .h vem de ’cabeçalho’ em inglês (’header’).
Na Figura 13.1, as linhas 1 e 2, bem como a linha 10, devem ser obrigato-
riamente incluídas, e em maiúsculo. Essas linhas são geralmente chamadas
de ’include guard’, ’macro guard’ ou ’header guard’. Elas tem a função de
informar ao compilador que o arquivo de cabeçalho ’MinhasFuncoes.h’ já foi
incluído no programa principal. Caso esse arquivo de cabeçalho seja incluído
novamente no programa, isso irá gerar um erro de compilação.
O problema da dupla inclusão fica mais evidente ao observar a Figura 13.3,
que mostra que a biblioteca ’MinhasFuncoes.h’ foi incluída diretamente no
programa principal (por meio de ’MinhasFuncoes.h’ na linha 2) e também na
Figura 13.2, que mostra que ’MinhasFuncoes.h’ foi incluída indiretamente no
programa principal por meio do arquivo ’MinhasFuncoes.cpp’, o que caracteriza
uma dupla inclusão. Assim, o ’header guard’ tem a função de informar essa
dupla inclusão para o compilador, evitando o erro de compilação.
A primeira inclusão de ’MinhasFuncoes.h’ no programa principal faz com que a
macro MINHASFUNCOES_H_INCLUDED seja definida (Figura 13.1). Em seguida,
282
++
Princípios de programação em C
283
++
Princípios de programação em C
284
++
Princípios de programação em C
• Os nomes das macros nos header guards são definidos pelo programador.
285
++
Princípios de programação em C
286
++
Princípios de programação em C
14 # endif // M I N H A S F U N C O E S _ H _ I N C L U D E D
4 namespace CalcEstat
5 {
6 float Soma ( float x , float y )
7 {
8 float Resp = 0.00;
9 Resp = ( x + y ) ;
10 return ( Resp ) ;
11 }
12
287
++
Princípios de programação em C
20
21 namespace CalcEcon
22 {
23 double ValorFuturo ( double PV , double i , int n )
24 {
25 double FV = 0.00;
26 FV = PV * pow ( ( 1.00 +( i / 100.00) ) , n ) ;
27 return ( FV ) ;
28 }
29 }
8 int main () {
9 cout << Soma (3 , 4) << endl ;
10 cout << ValorFuturo (1000 , 0.5 , 12) << endl ;
11 return 0;
12 }
6 int main ()
7 {
8 cout << CalcEstat :: Soma (3 , 4) << endl ;
9 cout << CalcEcon :: ValorFuturo (1000 , 0.5 , 12) << endl ;
10 return 0;
11 }
288
++
Princípios de programação em C
2. Escreva uma biblioteca que contenha funções para o cálculo das estatísticas
descritivas básicas listadas a seguir. As funções terão como parâmetro de
entrada um ou dois vetores, com elementos do tipo double.
desvio-padrão
σ̂
CV% = × 100 = × 100
média µ̂
289
++
Princípios de programação em C
290
Parte II
PROGRAMAÇÃO APLICADA
Capítulo 14
Módulo 1: Construção de um
programa para cálculo de perda de
carga em válvulas e acessórios de
tubulação
Conteúdo do capítulo
14.1 Referencial teórico da atividade prática . . . . . . . . . . 292
14.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
14.3 Detalhamento e recomendações para a construção do
programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
14.3.1 Passo 1: Cálculo do Número de Reynolds . . . . . . . . . 295
14.3.2 Passo 2: Cálculo da perda de carga total, F . . . . . . 296
P
ρv D
NRey = (14.1)
µ
292
++
Princípios de programação em C
2
v12 v12 v12
A1
hex = 1− = (1) = (14.2)
A2 2α 2α 2α
A2 v22 v2
hc = 0, 55 − = (0, 55) 2 (14.3)
A1 2α 2α
v12
hf = (kf ) (14.4)
2
293
++
Princípios de programação em C
294
++
Princípios de programação em C
m
F~ = m × a~ → N = kg × 2 (14.5)
s
Ao dividir ambos os lados da Equação 14.5 por kg, obtém-se a relação apresen-
tada na Equação 14.6.
N m
= 2 (14.6)
kg s
Multiplicando-se ambos os lados da Equação 14.6 por m, obtém-se a relação
apresentada na Equação 14.7
N ×m m2
= 2 (14.7)
kg s
Na Equação 14.7, o numerador da fração à esquerda do sinal de igual tem unidade
de energia, ’Joules’ (J = N × m), e esta equação pode ser reescrita como mostrado
na Equação 14.8.
J m2
= 2, (equivalência das unidades de medida para a perda de carga.) (14.8)
kg s
14.2 Objetivos
• O programa deverá solicitar ao usuário que informe todos os acessórios pre-
sentes na tubulação, suas respectivas quantidades e tipos.
295
++
Princípios de programação em C
P
14.3.2 Passo 2: Cálculo da perda de carga total, F
O programa deverá solicitar ao usuário que informe todos os acessórios presentes
na tubulação, bem como as quantidades de cada um. Após entrar com todas essas
informações, o programa deverá apresentar na tela um relatório semelhante ao que
está apresentado a seguir. O programa deverá também gerar e exportar esse relatório
para um arquivo externo, com o nome PerdaLoc.txt.
===================================================================
CALCULO DA PERDA DE CARGA LOCALIZADA - UFLA - GCA187 - 2020
===================================================================
[Emitido em: 04/11/2019 - 09:22:23]
DADOS DO PROBLEMA:
------------------
>> Densidade......: 998.20 [kg/m^3]
>> Vel. media.....: 1.2 [m/s]
>> Viscosidade....: 1.005e-3 [Pa.s]
>> Numero Reynolds: 90821.30 [Regime: turbulento (alfa = 1.0)]
===================================================================
CONTABILIDADE DA PERDA DE CARGA EM VALVULAS E ACESSORIOS
===================================================================
ID Descricao Qtd F unitario [J/kg] F parcial [J/kg]
-------------------------------------------------------------------
01 Contracao 1 0.396 0.396
02 Expansao 1 0.720 0.720
03 Joelho 6 0.540 3.240
04 Valvula globo 8 4.320 34.560
05 Valvula retencao 4 1.440 5.760
-------------------------------------------------------------------
PERDA DE CARGA TOTAL [J/kg].................: 44.676
===================================================================
296
Capítulo 15
Módulo 2: Construção de um
programa para cálculo da perda de
carga em tubos retos
Conteúdo do capítulo
15.1 Referencial teórico da atividade prática . . . . . . . . . . 297
15.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
15.3 Detalhamento e recomendações para a construção do
programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
15.3.1 Passo 1: Cálculo do número de Reynolds . . . . . . . . . . 298
15.3.2 Passo 2: Cálculo da rugosidade relativa . . . . . . . . . . 298
15.3.3 Passo 3: Cálculo do valor de f , fator de fricção de Fanning 299
15.3.3.1 Como utilizar a Equação 15.7 . . . . . . . . . . . 300
ρv D
NRey = (15.1)
µ
297
++
Princípios de programação em C
• : É a rugosidade média dos tubos retos, dada em metros (m). Esse valor
depende, sobretudo, do tipo de material de constituição dos tubos, condições
de utilização, idade, se é um tubo novo ou usado, etc. Valores de rugosi-
dade () podem ser encontrados em livros de operações unitárias, tubulações
industriais, hidráulica e em materiais disponibilizados pelos fabricantes e forne-
cedores de tubos. também pode ser medido experimentalmente por meio de
um instrumento denominado ’rugosímetro’.
15.2 Objetivos
• O programa deverá solicitar ao usuário que informe a quantidade de tubos retos
(em metros lineares de cano), rugosidade (), diâmetro interno e o número de
Reynolds para o escoamento.
r = (15.2)
D
298
++
Princípios de programação em C
L v2
Ff = 4f (15.3)
D 2
Assim, antes de efetivamente utilizar a equação 15.3, é necessário calcular o
valor de f , que pode ser obtido a partir de ábacos ou, mais precisamente, a partir da
equação de Colebrook, Equação 15.4, (IBARZ e BARBOSA-CÁNOVAS (2003)). O
inconveniente da equação de Colebrook está no fato de ao utilizá-la, não ser possível
isolar a variável de interesse (fD ).
1 2, 51 fD
p = −2 log D + p , f = (15.4)
fD 3, 71 NRey fD 4
f (xn )
xn+1 = xn − , n ∈ N, xn = x0 (15.5)
f 0 (xn )
n=0
Na Equação 15.5, x0 é uma aproximação inicial para o ciclo iterativo, dada pelo
programador ou usuário do programa. n é a n-ésima iteração. f 0 (xn ) é a derivada da
função no ponto xn .
Devemos agora aplicar o método de Newton-Raphson (Equação 15.5) à equação
de Colebrook (Equação 15.4), mas antes vamos reescrevê-la, de modo a tornar essa
tarefa um pouco mais fácil, como apresentado na Equação 15.6.
" #
1 K D 2, 51
p + 2 log K1 + p 2 = 0, K1 = , e K2 = (15.6)
fD fD 3, 71 NRey
299
++
Princípios de programação em C
1 K
q + 2 log K1 + q 2
fDN fDN
fDN+1 = fDN − (15.7)
K2 1
− −
3/2
N
K2 2 f D
N 3/2
fD ln (10) K1 + q
fDN
300
++
Princípios de programação em C
f N+1
Output: f ← D
4
Após calcular o valor de f (fator de fricção de Fanning), este deverá ser inserido
na Equação 15.3, juntamente com os valores de comprimento total de tubo (L, em
metros), diâmetro interno do tubo (D, em metros), e velocidade (m/s). O algoritmo
apresentado a seguir mostra como isso pode ser feito.
301
++
Princípios de programação em C
===================================================================
CALCULO DA PERDA DE CARGA EM TUBOS RETOS - UFLA - GCA187 - 2020
===================================================================
[Emitido em: 04/11/2019 - 20:19:44]
DADOS DO PROBLEMA:
-----------------
>> Rugosidade........: xxxx [m]
>> Densidade.........: xxxx [kg/m^3]
>> Velocidade media..: xxxx [m/s]
>> Diametro..........: xxxx [m]
>> Viscosidade.......: xxxx [Pa.s]
>> Chute inicial.....: 0.01 [adimensional]
>> Comprimento total.: xxxx [m]
===================================================================
VALORES CALCULADOS PELO PROGRAMA
===================================================================
>> Numero de Reynolds.................: xxxxx [turbulento]
>> Rugosidade relativa................: xxxxx [adimensional]
>> f_D (Fator fric. Darcy-Weisbach)...: xxxxx [adimensional]
>> f (Fator fric. Fanning)............: xxxxx [adimensional]
-------------------------------------------------------------------
>> Ff (PERDA DE CARGA EM TUBOS RETOS).: xxxxx [J/kg]
===================================================================
302
Capítulo 16
Módulo 3: Construção de um
programa para dimensionamento de
uma bomba hidráulica
Conteúdo do capítulo
16.1 Referencial teórico da atividade prática . . . . . . . . . . 303
16.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
16.3 Detalhamento e recomendações para a construção do
programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
303
++
Princípios de programação em C
∆P = P2 − P1 (16.1)
∆Y = Y2 − Y1 (16.2)
1m3
10.000l 1mi n 10.000 1
Φ= = = ≈ 0, 0056m3 /s
30mi n 1.000l 60s 30 × 1.000 × 60 180
(16.3)
304
++
Princípios de programação em C
1 ∆P X
v22med − v12med + g (∆Y ) + (16.4)
+ F = −Ws
2α ρ
16.2 Objetivos
• O programa deverá solicitar ao usuário que informe a diferença de pressão
(∆P ) entre os pontos 1 e 2, a cota (∆Y ) entre os pontos 1 e 2, o valor de α, a
velocidade média do escoamento nos pontos 1 e 2, a densidade (ρ) do fluido,
e a perda de carga total de todo o sistema, ou seja a perda de carga primária
total (com auxílio do programa do Capítulo 15) e a perda de carga secundária
total (com auxílio do programa do Capítulo 14).
305
++
Princípios de programação em C
Após obter o valor da potência da bomba (−Ws ) por meio da Equação 16.4, será
necessário converter esse valor de J/kg para Watts. Isso pode ser feito multiplicando-
se o valor em J/kg pela densidade (ρ) fluido, e também pela vazão (Φ), como
apresentado no exemplo a seguir.
0, 005 m3
−153, 93 J 998, 20 kg
Ws = × × = −768, 26 J/s = −768, 26 W
kg m3 s
(16.6)
306
++
Princípios de programação em C
768, 26 W 768, 26 W
Wcor r = = = 1181, 93 W (16.7)
η 0, 65
Considerando que 1 HP = 745, 7 W , então podemos obter o valor da potência
da bomba em HP .
1 HP
HP = (1181, 93 W ) × = 1, 585 HP ≈ 1, 6 HP (16.8)
745, 7 W
===================================================================
CALCULO DE POTENCIA DE BOMBA HIDRAULICA - UFLA - GCA187 - 2020
===================================================================
[Emitido em: 04/11/2019 - 09:22:23]
DADOS DO PROBLEMA:
------------------
>> Numero Reynolds...: 61810 [Regime: turbulento (alfa = 1.0)]
>> V1_Media..........: 0.683 [m/s]
>> V2_Media..........: 0.683 [m/s]
>> Delta Y....[cotas]: 15.00 [m]
>> Delta P..[pressao]: 24.472 [kPa]
>> Densidade.........: 998.20 [kg/m^3]
>> Vazao.............: 0.005 [m^3/s]
>> Perda carga total.: 6.837 [J/kg]
===================================================================
POTENCIA DA BOMBA
===================================================================
>> Fator de rendimento.......................: 0.65
>> Trabalho de eixo (Ws).....................: -153.96 [J/kg]
>> Potencia nao corrigida com fator de rendim: 768.42 [Watts]
>> Potencia real (corrigida).................: 1182.18 [Watts]
>> Potencia real (corrigida).................: 1.585 [HP]
-------------------------------------------------------------------
POTENCIA REAL RECOMENDADA PARA AQUISICAO..: 2.000 [HP]
===================================================================
Uma boa alternativa é agrupar os códigos das atividades propostas nos Capítulos
14, 15 e 16 em um único programa, de modo a oferecer ao usuário alguma facili-
dade e flexibilidade para o dimensionamento de bombas hidráulicas. Os programas
307
++
Princípios de programação em C
propostos nesses três capítulos são apenas para fins didáticos e podem ser acres-
centados de muitas outras funcionalidades como, por exemplo, a inserção de uma
quantidade maior de acessórios de tubulação, valores tabelados de rugosidade, tipos
de materiais de constituição de tubos (aço carbono, aços inoxidáveis, cobre, PVC,
etc). Também podem ser acrescentadas funções para cálculo de NPSH e curva ca-
racterística de bombas, bem como informações sobre fornecedores e preços atuais
desses equipamentos.
308
Parte III
ANEXOS
Capítulo 17
Anexos
310
++
Princípios de programação em C
311
++
Princípios de programação em C
312
++
Princípios de programação em C
313
++
Princípios de programação em C
314
++
Princípios de programação em C
315
++
Princípios de programação em C
1 J = 1 N · m = 1 kg · m2 /s2
1 kg · m2 /s2 = 1 J (Joule) = 107 g · cm2 /s2 (erg)
1 btu = 1.055, 06 J = 1, 05506 kJ
1 btu = 252, 16 cal (termoquímica)
1 kcal (termoquímica) = 1.000 cal = 4, 1840 kJ
1 cal (termoquímica) = 4, 1840 J
1 cal (IT) = 4, 1868 J
1 btu = 251, 996 cal (IT)
1 btu = 778, 17 ft · lbf
1 hp · h = 0, 7457 kW · h
1 hp · h = 2.544, 5 btu
1 ft · lbf = 1, 35582 J
1 ft · lbf /lbm = 2, 9890 J/kg
316
++
Princípios de programação em C
317
++
Princípios de programação em C
318
++
Princípios de programação em C
Produz1 : ␣␣␣␣␣5
1 printf ( " %6 d " , -5) ;
Produz: ␣␣␣␣-5
1 printf ( " %6 d " , 1013254488) ;
Produz: 1013254488
1 printf ( " %6 d " , -1013254488) ;
Produz: -1013254488
Produz: ␣␣␣␣␣␣␣␣86
Produz: abc
1
O símbolo ␣ refere-se a um caractere de espaço simples no texto de saída da função printf().
319
++
Princípios de programação em C
Produz: 6␣␣␣␣␣␣␣
1 printf ( " % -8 d " , -17) ;
Produz: -17␣␣␣␣␣
Produz: 0000008
1 printf ( " %07 d " , -192) ;
Produz: -000192
Produz: ␣␣␣␣+125
1 printf ( " %+08 d " , 125) ;
Produz: +0000125
1 printf ( " %+08 d " , -125) ;
Produz: -0000125
1 printf ( " %+ -8 d " , 5) ;
Produz: +5␣␣␣␣␣␣
1 printf ( " %+ -8 d " , -4) ;
Produz: -4␣␣␣␣␣␣
1 printf ( " % -8 d " , 4) ; // Com espaco apos o %
Produz: ␣4␣␣␣␣␣␣
1 printf ( " %+08 d " , 0) ;
Produz: +0000000
320
++
Princípios de programação em C
Produz: ␣␣␣␣␣␣
1 printf ( " %6 s " , " a " ) ;
Produz: ␣␣␣␣␣a
1 printf ( " %6 s " , " abc " ) ;
Produz: ␣␣␣abc
1 printf ( " %6 s " , " abcdefghijk " ) ;
Produz: abcdefghijk
1 printf ( " % -6 s " , " " ) ;
Produz: ␣␣␣␣␣␣
1 printf ( " % -6 s " , " r " ) ;
Produz: r␣␣␣␣␣
1 printf ( " % -6 s " , " kwr " ) ;
Produz: kwr␣␣␣
1 printf ( " % -6 s " , " abcdefghijk " ) ;
Produz: abcdefghijk
Produz: ␣␣␣␣␣3
321
++
Princípios de programação em C
Produz: ␣␣␣3.1
1 printf ( " %6.2 f \ n " , Pi ) ;
Produz: ␣␣3.14
1 printf ( " %6.3 f \ n " , Pi ) ;
Produz: ␣3.142
1 printf ( " %6.10 f \ n " , Pi ) ;
Produz: 3.1415927410
322
Bibliografia
ARMSTRONG, J. C++ for Financial Mathematics. New York: Chapman & Hall,
2017.
BERK, Z. Food Process Engineering and Technology. New York: Elsevier, 2009.
BRONSON, G. J. C++ for Engineers and Scientists. 4th. ed. Boston: Cengage
Learning, 2013.
DAS, V. V. Principles of Data Structures Using C and C++ . New Delhi: New Age
International, 2006.
323
DAVIS, D. S. Nomography and Empirical Equations. New York: Reinhold Pu-
blishing Corporation, 1955.
DAVIS, S. R. C++ for Dummies. 7th. ed. New Jersey: John Wiley & Sons, 2014.
DEITEL, P.; DEITEL, H. C++ : How to Program. 8th. ed. Nova Jersey: Prentice
Hall, 2011.
GADDIS, T.; WALTERS, J.; MUGANDA, G. Starting Out With C++ Early Ob-
jects. 8th. ed. Boston: Addison-Wesley, 2014.
GREGOIRE, M. Professional C++ . 3rd. ed. Indianapolis: John Wiley & Sons, 2014.
324
INTERSYSTEMS CORPORATION. Our Clients and Partners. Disponí-
vel em: https://www.intersystems.com/who-we-are/our-clients-and-partners/.
Acesso em: 02 jan. 2020b.
PRATA, S. C++ Primer Plus. Developer’s Library. 6th. ed. Boston: Addison-
Wesley, 2012.
RAO, S. Sams Teach Yourself C++ in One Hour a Day. 7th. ed. London: Pearson
Education, 2012.
325
REESE, R. Understanding and Using C Pointers. Sebastopol: O’Reilly Media,
2013.
SAHIN, S.; SUMNU, S.G. Physical properties of foods. New York: Springer Science
+ Business Media, 2006. 257p. Food Science Text Series.
SAHNI, S. Data Structures, Algorithms and Applications in C++ . 2nd. ed. Hyde-
rabad:. Universities, 2005.
326
SUN, D.W. (ed.) Thermal Food Processing: new technologies and quality issues.
Boca Raton: CRC, 2006. 640p.
SWOKOWSKI, E.W. Cálculo com geometria analítica. São Paulo: Makron Books,
1983.
WEISS, M. A. Data Structures and Algorithm Analysis in C++ . 4th. ed. London:
Pearson Education, 2014.
ZEITZ, P. The Art and Craft of Problem Solving. 2nd. ed. New York: John Wiley
& Sons, 2007.
327
328