(Parte 1 de 11)

Universidade Federal de Santa Catarina – UFSC Centro Tecnológico - CTC Departamento de Automação e Sistemas - DAS

Sistemas Industriais Inteligentes – S2i http://s2i.das.ufsc.br/

Curso de Linguaguem Computacional C/C++

Florianópolis, janeiro de 2002.

Curso de Linguagem Computacional C/C++

Índice2
1 Program ação em C7
2 Conceitos Básicos da Programação C9
2.1 Histórico de C9
2.2 Criando um Programa Executável9
2.3 A Estrutura Básica de um Programa em C10
2.4 Variáveis1
2.5 Tipos de Dados12
2.6 Constantes14
2.7 Ponteiros15
2.8 Exercícios16
3 Entrada/Saída Console17
3.1 Printf()17
3.2 Cprintf()19
3.3 Scanf()19
3.4 Getch(), Getche() e Getchar()20
3.5 Putch() ou Putchar()21
3.6 Exercícios21
4 Operadores23
4.1 Operadores Aritméticos23
4.2 Operadores Relacionais23
4.3 Operadores lógicos binários24
4.4 Operadores de Ponteiros25
4.5 Operadores Incrementais e Decrementais25
4.6 Operadores de Atribuição27
4.7 O Operador Lógico Ternário28
4.8 Precedência28
4.9 Exercícios:28
5 Laços30
5.1 O Laço For30
5.2 O Laço While31
5.3 O Laço Do-While32
5.4 Break e Continue3
5.5 Goto3
5.6 Exercícios3
6 Comandos para Tomada de Decisão34
6.1 If34
6.2 If-Else35
6.3 Switch35
6.4 Exercícios37
7 Funções39
7.1 Sintaxe39
7.2 Exem plos40
7.3 Prototipagem41
7.4 Classes de Armazenamento42

Índice 7.4.1 Auto ....................................................................................................................42

Curso de Linguagem Computacional C/C++

7.4.2 Extern42
7.4.3 Static43
7.4.4 Variáveis Estáticas Externas4
7.4.5 Register4
7.5 Exercícios4
8 Diretivas do Pré-Processador46
8.1 Diretiva #define46
8.2 Macros47
8.3 Diretiva #undef48
8.4 Diretiva #include48
8.5 Com pilação Condicional49
8.6 Operador defined49
8.7 Diretiva #error50
8.8 diretiva #pragma50
8.9 Exercícios50
9 Matrizes51
9.1 Sintaxe de Matrizes51
9.2 Inicializando Matrizes52
9.3 Matrizes como Argumentos de Funções54
9.4 Chamada Por Valor e Chamada Por Referência5
9.5 Strings57
9.5.1 Strings Constantes57
9.5.2 String Variáveis57
9.5.3 Funções para Manipulação de Strings58
9.6 Exercícios60
10 Tipos Especiais de Dados61
10.1 Typedef61
10.2 Enum erados (Enum)61
10.3 Estruturas (Struct)62
10.4 Uniões65
10.5 Bitfields6
10.6 Exercícios67
1 Ponteiros e a Alocação Dinâmica de Memória68
1.1 Declaração de Ponteiros e o Acesso de Dados com Ponteiros68
1.2 Operações com Ponteiros68
1.3 Funções & Ponteiros70
1.4 Ponteiros & Matrizes71
1.5 Ponteiros & Strings73
1.6 Ponteiros para Ponteiros74
1.7 Argumentos da Linha de Comando7
1.8 Ponteiros para Estruturas7
1.9 Alocação Dinâmica de Memória78
1.9.1 Malloc()79
1.9.2 Calloc()81
1.9.3 Free()81
1.10 Exercícios81
12 Manipulação de Arquivos em C83
12.1 Tipos de Arquivos83
12.2 Declaração, abertura e fechamento83

Curso de Linguagem Computacional C/C++

12.4 Fim de Arquivo (EOF)84
12.5 Leitura e escrita de strings85
12.6 Arquivos Padrões85
12.7 Gravando um Arquivo de Forma Formatada86
12.8 Leitura e escrita de valores binários87
12.9 Exercícios87
13 Program ação em C++89
13.1 Palavras-chave C++91
13.2 Sintaxe & Variáveis91
13.3 Laços e Comandos de Decisão92
13.4 I/O em C++: Stream92
13.4.1 A stream de saída cout92
13.4.2 A stream de entrada cin94
13.5 Funções95
13.5.1 Valores Default Para Argumentos de uma Função95
13.5.2 Sobrecarg a de Funções96
13.5.3 Funções Inline96
13.5.4 Operador Unário de Referência: &96
13.6 Alocação Dinâmica de Memória em C++97
13.7 Exercícios98
14 Classes e Objetos em C++9
14.1 Tipo Classe e o Encapsulamento de Dados100
14.2 Definindo Classes100
14.3 Membros Privados e Públicos101
14.4 Funções-Membro102
14.5 Construtores & Destrutores102
14.6 Criando Objetos103
14.7 Atributos do Tipo: Static104
14.8 Acessando Funções e Dados Públicos105
14.9 Objetos Const105
14.10 Tipo Objeto106
14.1 Exercícios106
15 Sobrecarg a de Operadores108
15.1 A Sobrecarga como uma Função Global109
15.2 Limitações e Características110
15.3 Sobrecarga de Operadores como Função-Membro1
15.4 Estudo de Casos112
15.5 Exercícios119
16 Herança120
16.1 Derivando uma Classe121
16.2 Dados Protected124
16.3 Construtores & Destrutores124
16.4 Construtor de Cópia & Alocação Dinâmica125
16.5 Chamadas a Funções126
16.6 Herança Pública e Privada126
16.7 Conversões de Tipos entre Classe-Base e Derivada127
16.8 Níveis de Herança127
16.9 Herança Múltipla128
16.10 Exercícios131

17 Funções Virtuais e Amigas ..........................................................................................132

Curso de Linguagem Computacional C/C++

17.1 Funções Virtuais132
17.2 Destrutores Virtuais134
17.3 Classe-Base Virtual134
17.4 Funções Amigas135
17.5 Classes Amigas137
17.6 Exercícios137
18 Operações com Arquivos Iostream139
18.1 Estudo de Caso140
18.2 A função Open()143
18.3 Testando Erros143
18.4 Escrevendo e Lendo em Buffers de Caracteres144
18.5 Im primindo em Periféricos145
18.6 Exercícios145
19 Na mespaces146
19.1 Examplo e Sintaxe146
19.2 Qualified Names, Using Declarations and Directives147
19.3 Prevenindo Conflitos de Nomes148
19.4 Na mespaces sem Nome148
19.5 Apelidos para Namespace149
19.6 Declarando Nomes149
19.7 Atualizando Códigos Antigos149
19.8 Namespaces são Abertos150
20 Tem plates151
20.1 ClasseTem plates151
20.1.1 Especificação151
20.1.2 Membros da Classe Template151
20.1.3 Parâm etrosTemplate152
20.2 Funções Templates152
20.2.1 Function Template Arguments153
20.2.2 Sobreescrevendo Funções Templates153
20.3 Especialização154
20.4 Derivação e Templates154
20.5 Polim orfismo155
21 Conteiner156
21.1 Iteradores156
21.2 Tipos de Conteineres156
21.2.1 Conteineres Seqüenciais156
21.2.2 Contêineres Associativos:156
21.3 Exem plo de Conteiner156
2 Exceptions Handling158
2.1 Exceção158
2.2 Como as exceções são usadas158
2.3 Biblioteca Except <except.h>160
2.3.1 Term inate()160
2.3.2 Set_term inate()161
2.3.3 Unexpected()161
2.3.4 Set_unexpected()161
Trabalho 1162
Trabalho 2162

Trabalho 3 .............................................................................................................................162

Curso de Linguagem Computacional C/C++

Trabalho 4162
Referências Bibliográficas166
Hot Sites167
Anexo 1 – Metodologia para o Desenvolvimento de Softwares168

Anexo 2 – Sumário da Modelagem UML.............................................................................169

Curso de Linguagem Computacional C/C++

Atualmente, empregam-se cada vez mais sistemas computacionais na automatização de processos industriais. Os sistemas computacionais empregados (ver Figura 1) variam desde um simples circuito lógico digital, passando por uma circuito composto por um microprocessador ou um CLP, até sistemas complexos envolvendo um ou mais microcomputadores ou até estações de trabalho. Um engenheiro que atua nesta área deve conhecer os sistemas computacionais disponíveis e ser capaz de selecionar o melhor equipamento para uma dada aplicação. Além disto, este profissional deve conseguir instalar este sistema, configurá-lo e acima de tudo programá-lo para que este execute a tarefa de automatização atendendo os requisitos industrias do sistema, como imunidade a falhas ou comportamento determinístico com restrições temporais (sistemas temporeal). Neste contexto, a programação destes sistemas se faz de suma importância. Basicamente, a inteligência dos sistemas automatizados é implementada através de programas computacionais, comandando os componentes de hardware para executar a tarefa com o comportamento desejado.

Sistemas Digitais

Microprocessadores CLP

Micro-Computador

Redes de Computadores capacidade computacional custo flexibilidade complexidade expandabilidade

Figura 1 : Comparação entre os diversos sistemas computacionais para aplicações industriais.

Nas últimas décadas, o desenvolvimento em hardware permitiu que cada vez mais os processos industrias sejam automatizados e interligados através de sistemas computacionais. Entretanto, a evolução em software não se deu em tamanha velocidade como a de hardware. Desta forma, um dos grandes paradigmas tecnológicos hoje é o desenvolvimento de programas para a realização de tarefas complexas e que exigem um alto grau de inteligência.

A maneira de se comunicar com um computador chama-se programa e a única linguagem que o computador entende chama-se linguagem de máquina. Portanto todos os programas que se comunicam com a máquina devem estar em linguagem de máquina.

Para permitir uma maior flexibilidade e portabilidade no desenvolvimento de software, foram implementados nos anos 50 os primeiros programas para a tradução de linguagens semelhantes à humana (linguagens de "alto nível") em linguagem de máquina.

A forma como os programas são traduzidos para a linguagem de máquina classifica-se em duas categorias:

• Interpretadores: Um interpretador lê a primeira instrução do programa, faz uma consistência de sua sintaxe e se não houver erro converte-a para a linguagem de máquina para finalmente executá-la. Segue, então, para a próxima instrução, repetindo o processo até que a última instrução seja executada ou a consistência aponte algum erro. São muito bons para a função de depuração ("debugging") de programas, mas são mais lentos. Ex.: BASIC Interpretado, Java.

• Compiladores: Traduzem o programa inteiro em linguagem de máquina antes de serem executados. Se não houver erros, o compilador gera um programa em disco com o sufixo

Curso de Linguagem Computacional C/C++

.OBJ com as instruções já traduzidas. Este programa não pode ser executado até que sejam agregadas a ele rotinas em linguagem de máquina que lhe permitirão a sua execução. Este trabalho é feito por um programa chamado “linkeditor” que, além de juntar as rotinas necessárias ao programa .OBJ, cria um produto final em disco com sufixo .EXE que pode ser executado diretamente do sistema operacional.

Compiladores bem otimizados produzem código de máquina quase tão eficiente quanto aquele gerado por um programador que trabalhe direto em Assembly. Oferecem em geral menos facilidades de depuração que interpretadores, mas os programas são mais rápidos (na ordem de 100 vezes ou mais). Ex.: BASIC Compilado, FORTRAN, PASCAL, MÓDULA - 2, C, C++. Além da velocidade, outras vantagens podem ser mencionadas:

• é desnecessária a presença do interpretador ou do compilador para executar o programa já compilado e linkeditado;

• programas .EXE não podem ser alterados, o que protege o código-fonte.

Desta forma, os compiladores requerem o uso adicional de um editor de ligações ("Linker"), que combina módulos-objetos ("Traduzidos") separados entre si e converte os módulos assim "linkados" no formato carregável pelo sistema operacional (programa .EXE).

Estudaremos aqui uma das linguagens de alto-nível mais utilizadas na indústria: a linguagem

"C" e, posteriormente, a sua sucessora a linguagem “C++”, resultado da introdução da programação “Orientada a Objetos” à linguagem “C”.

A programação é uma atividade que requer paciência, concentração e organização. O aprendizado desta técnica deve acontecer de forma gradual para que o programador entenda bem os conceitos envolvidos e compreenda os diversos mecanismos disponíveis. Por isso, o aluno deve prosseguir neste aprendizado no seu ritmo, permitindo-se consolidar os conhecimentos através dos exemplos e exercícios. O aluno deve buscar formar uma boa “base” antes de se preocupar com as estruturas mais complexas. A caminhada é feita passo a passo, com calma e segurança.

Curso de Linguagem Computacional C/C++

2.1 Histórico de C

O compilador "C" vem se tornando o mais difundido em ambiente industrial. A linguagem

"C" se originou das linguagens BCPL e B desenvolvidas em 1970. A primeira versão de "C" foi implementada para o sistema operacional UNIX pela Bell Laboratories, especificamente por Dennis M. Ritchie e Ken Thompson no início da década de 70, e rodava em um DEC PDP11 (Digital Equipment Corporation). A linguagem “C” foi utilizada para portar o UNIX para outros computadores. A linguagem "C" possui uma característica dual:

• É considerada linguagem estruturada de alto-nível e

• "Assembly" de alto-nível, que permite escrever programas muito próximos à linguagem de máquina, sendo usada para desenvolver muitas aplicações como compiladores, interpretadores, processadores de texto e mesmo sistemas operacionais. Ex: UNIX, MSDOS, TPW.

A linguagem de programação “C” tornou-se rapidamente uma das mais importantes e populares, principalmente por ser muito poderosa, portátil, pela padronização dos compiladores existentes (através da norma ANSI C) e flexível. Os programas em “C” tendem a ser bastante compactos e de execução rápida.

A linguagem “C” é baseada em um núcleo pequeno de funções e estruturas básicas, desta forma, todo programa é desenvolvido a partir deste núcleo básico. Isto implica na grande portabilidade de “C”, haja vista que basta a implementação deste núcleo básico para um dado processador e automaticamente já estará disponível um compilador “C” para este processador. Por esta razão, existem compiladores “C” para a grande parte dos sistemas computacionais atualmente disponíveis. Devido também a este pequeno núcleo, um programador C é capaz de desenvolver programas tão eficientes, pequenos e velozes quanto os programas desenvolvidos em Assembly. Por isso, diz-se que C é uma linguagem de baixo nível, i.e., próxima da linguagem de máquina.

2.2 Criando um Programa Executável

Arq1.C Arq1.Obj Programa: "Olá Mamãe!!!" compilar linkar

Arq2.Obj linkar

Arq3.Obj linkar MyProgram.Exe

Figura 2 : Ilustração do processo de criação de um programa em C.

Curso de Linguagem Computacional C/C++

Primeiro, datilografe o seu programa com o auxílio de um processador de textos em modo

ASCII. Grave o programa em disco dando a ele um nome como sufixo .C. O programa gerado é chamado de código fonte.

(Parte 1 de 11)

Comentários