Curso de Introdução à Programação em C

Curso de Introdução à Programação em C

(Parte 1 de 4)

Curso de Introdução à Programação em C++ por monitoria GLAUCO BORGES VALIM DOS SANTOS

Porto Alegre, agosto de 2004.

05/1/2010Curso de Introdução à Programação e… w.inf.ufrgs.br/~johann/cpp2004/ 1/27

1) Esta' na cabeca de todo mundo 2) Todo mundo fala sobre isto o tempo todo 3) Na realidade, quase ninguem esta' fazendo 4) Os poucos que estao fazendo: a) Fazem da maneira errada b) Desculpam falando que a proxima vez talvez sera' melhor c) Nao praticam com seguranca

Resumo4
1Introdução................................................................................. 5
2Recursos para Programação Estruturada............................... 6
2.1Compilando o primeiro programa: Hello World.................................................. 6
2.2Declaração de variáveis e tipos de dados........................................................... 7
2.3Operadores, expressões e precedência.............................................................. 8
2.4Usando alguns vetores......................................................................................... 8
2.5Construções de controle de fluxo........................................................................ 8
2.5.1A construção if........................................................................................................ 8
2.5.2Blocos e escopos.................................................................................................... 9
2.5.3A construção for..................................................................................................... 9
2.5.4As construções while e do....................................................................................... 9
2.5.5As declarações break e continue.......................................................................... 10
2.5.6A construção switch.............................................................................................. 10
2.5.7O operador ?........................................................................................................ 1
2.5.8C++ tem label e goto, mas não contem para ninguém............................................ 1
2.6Recursos próprios de C++................................................................................. 1
2.6.1Namespaces.......................................................................................................... 1
2.6.2Strings em C++ e em C......................................................................................... 1
2.6.3Entrada e saída em C++ e em C............................................................................ 1
2.6.4Tratamento de exceções........................................................................................ 12
3Estruturas de Dados, Funções e Ponteiros............................ 13
3.1Vetores................................................................................................................ 13
3.2Funções............................................................................................................... 13
3.3Estruturas........................................................................................................... 14
3.3.1struct..................................................................................................................... 14
3.3.2union..................................................................................................................... 14

Sumário 05/1/2010Curso de Introdução à Programação e… w.inf.ufrgs.br/~johann/cpp2004/ 2/27

3.4typedef................................................................................................................ 14
3.5Ponteiros............................................................................................................. 15
3.6Constantes.......................................................................................................... 16
3.7Os quatro tipos de cast....................................................................................... 16
3.8Referências......................................................................................................... 17
3.9Ponteiros para estruturas................................................................................... 17
3.10Alocação de Memória........................................................................................ 17
4Recursos para Programação Orientada a Objetos............... 18
4.1Orientação a Objetos......................................................................................... 18
4.1.1Teoria................................................................................................................... 18
4.2Controle de Acesso............................................................................................ 18
4.3Construtores e destrutores................................................................................ 19
4.4Sobrecarga de operadores................................................................................. 20
4.5Membros estáticos e constantes....................................................................... 20
4.6Herança de classes............................................................................................. 20
4.6.1Classes base e derivada......................................................................................... 21
4.6.2Membros protected.............................................................................................. 21
4.6.3Construtores.......................................................................................................... 21
4.6.4Funções virtuais..................................................................................................... 21
4.6.5Funções virtuais puras e classes abstratas............................................................... 21
4.6.6Herança múltipla.................................................................................................... 2
5Modelagem e Estilos de Codificação...................................... 23
5.1Regras e recomendações................................................................................... 23
5.1.1Algumas regras de programação............................................................................ 23
5.1.2Algumas regras básicas de formatação................................................................... 23
5.2Programação em módulos.................................................................................. 24
5.3Listas encadeadas por herança e com ponteiros.............................................. 24
5.4Relações do tipo “é um” e “tem um”................................................................ 25
6Templates e STL..................................................................... 26
Anexo 1 Operadores e palavras reservadas27
Bibliografia29

w.inf.ufrgs.br/~johann/cpp2004/ 3/27

Resumo

Esta apostila é material de apoio a um curso de extensão ministrado pelo professor Marcelo de Olieira

Johann na UFRGS, em agosto de 2004. O curso é eminentemente prático, com exemplos que demonstram os recursos e funcionalidades sendo oferecidos pelo professor, alterados em sala de aula, e com a proposição de exercícios para os alunos, a serem realizados durante a aula e como trabalhos extra-classe de fixação de conteúdo.

Devido à extensão e complexidade dos recursos oferecidos pela linguagem C++, o curso tem uma abordagem seletiva de conteúdos, e prioriza o desenvolvimento da habiliade de programação produtiva com um subconjunto adequadamente selecionado destes recursos. Outros recursos oferecidos pela linguagem, como sobrecarga de operadores, herança múltipla, programação de algoritmos em templates, são apresentados pela sua definição, objetivo, forma geral, mas não trabalhados em detalhe, permitindo que os alunos se concentrem em um modelo orientado a objetos e não se dispersem com a complexidade e detalhes de todas as opções da linguagem..

Palavras-chave: Programação, Linguagens, C++

05/1/2010Curso de Introdução à Programação e… w.inf.ufrgs.br/~johann/cpp2004/ 4/27

1 Introdução

A linguagem C++ foi desenvolvida inicialmente por Bjarne Stroustrup na AT&T, de 1979 a 1983, à partir da linguagem C, tendo como idéia principal a de agregar o conceito de classes, de orientação à objetos, àquela linguagem. Razão porque iniciamente chamva-se de “C com classes”. Bjarne procurou tanto quanto possível manter retrocompatibilidade com C, de modo que programas em C pudessem ser compilados por um compilador C++ com um mínimo de alterações. Entretanto, encarar C++ como um superconjunto de C é um erro, e C++ deve ser vista como uma “outra linguagem”, por diversas razões. Em primeiro lugar, nem todo o programa escrito em C é compilado em C++ sem erros, e pode nem mesmo gerar o mesmo resultado, já que a sintaxe e a semântica de algumas construções diferem. Ao ligar-se partes de um programa em C++ com partes em C, estas devem ser bem especificadas, pois as convenções de funcionamento do código compilado também diferem. Além disso, C++ oferece um conjunto de mecanismos básicos que não estavam presentes em C, e estes devem ser usados para produzir software mais modular e confiável explorando-se as verificações disponíveis no compilador. Finalmente, os mecanismos de C++ devem inspirar a programação segundo o paradigma de orientação a objetos e, portanto, não se deve programar em C++ como se faz em C.

A partir da primeira versão de 1983, a linguagem foi sendo revisada e evoluindo, tornou-se disponível fora da AT&T em 1985, e após um longo processo foi padronizada pela ISO no final de 1997, pelo padrão ISO/IEC 14882. Você pode obter mais informações sobre o desenvolvimento da linguagem na página do próprio autor em [STR 2004].

STL é uma parte do padrão C++, e consiste em uma biblioteca de funções e estruturas de dados que todo compilador C++ deve oferecer, provê as implementações mais comuns em um programa, e pode-se utilizá-la com diferentes tipos de dados. Um bom ponto de partida para leitura específica sobre STL é na página da Silicon Graphics, Inc. em [STL 2004].

De forma geral, é possível obter muito material de referência da linguagem através de páginas na

Internet. Tente por exemplo pesquisar com a expressão “C++ reference” no Google. Também é muito produtivo criar o hábito de pesquisar por problemas bem específicos. Tente, por exemplo, pesquisar “iostream.h iostream difference”, ou “STL hash_map code example”. Pode-se obter cursos [BRA 1998], livros e exemplos de código [ECK 2000]

Os compiladores do projeto GNU também podem ser obtidos livremente através da Internet. O ambiente BloodShed Dev-C++ roda sobre Windows e utiliza os compiladores gcc e g++. É possível baixálo de: http://www.bloodshed.net/devcpp.html Há também inúmeros fóruns e listas de discussão sobre aspectos técnicos da linguagem. Então, use e abuse da Internet para aprendê-la e resolver seus problemas.

05/1/2010Curso de Introdução à Programação e… w.inf.ufrgs.br/~johann/cpp2004/ 5/27

2 Recursos para Programação Estruturada

Este capítulo apresenta recursos básicos da linguagem C++ que servem para o modelo de programação conhecido como bloco-estruturado. São vistos os tipos de dados primitivos e as principais construções que servem para descrever operações e algoritmos, como controle de fluxo, juntamente com recursos diversos da linguagem. Em função da compatibilidade, muitos desses recursos são idênticos aos da liguagem C, e por isso essa parte é semelhante a uma breve “revisão” da linguagem C, seguida da apresentação dos mecanismos que são próprios de C++.

2.1Compilando o primeiro programa: Hello World

O melhor meio de aprender uma linguagem é através de exemplos. Eis o primeiro programa, que dá sinal de vida apresentano uma mensagem. Identificamos nele os elementos: #include, função main, geração de saída de dados na tela, e como se colocam comentários.

A diretiva #include serve para fazer com que o compilador inclua como parte desse código outro arquivo de código fonte. Em geral, esse recurso é usado para incluir definições de dados e código que serão utilizados por nosso programa, mas já foram compilados e estão disponíveis em uma biblioteca. É função da etapa de ligação montar o executável final incluindo o código compilado para o nosso programa com o código compilado dessas bibliotecas.

Todo programa em C++, assim como em C, pode ser visto como um conjunto de funções. As funções serão apresentadas no capítulo 2, mas é necessário saber primeiro que todos os comandos da linguagem devem estar dentro de funções, e que, portanto, um programa deve ter no mínimo uma função. Essa função principal tem o nome de main, sendo esse nome o que identifica por onde a execução inicia.

O namespace é um recurso utilizado para evitar que, quando se constróem grandes programas, nomes de variáveis, classes e funções conflitem. Esse conceito será apresentado mais adiante, mas aqui precisamos dele, pois a saída padrão, cout, está definida dentro do espaço chamado std, de standard. Dados podem ser impressos enviando-os para a saída adrão, cout. Da mesma forma, dados podem ser lidos através da entrada padrão, cin. Também nesse caso o tipo de dado lido depende da variável para a qual se está fazendo a leitura.

Todas as declarações e comandos da linguagem devem ser terminados por ‘;’. Esse sinal não serve apenas como separador nas declarações, mas serve para identificar composição de seqüência entre os comandos, isto é, primeiro é executado um e depois o outro. Utilize vários comandos de impressão para gerar uma saída mais longa.

2.2Declaração de variáveis e tipos de dados

Declarações de variáveis, ao contrário dos comandos, podem ser feitas tanto dentro quanto fora de funções. Se estão fora de uma função, elas são globais, e acessíveis a qualquer função do programa. As variáveis declaradas dentro de uma função são variáveis locais, e são acessíveis somente a essa função. As variáveis podem ser inicializadas, opcionalmente, na sua declaração, ou terem algum valor atribuído dentro de uma função, através da atribuição. Ao contrário de C, C++ não exige que todas as declarações de variáveis ocorram antes de todos os comandos em uma função. As declarações podem ser feitas em

05/1/2010Curso de Introdução à Programação e… w.inf.ufrgs.br/~johann/cpp2004/ 6/27 qualquer lugar. chapter2/2.2-01-declaration.cpp

A tabela 1 apresenta os tipos de dados básicos da linguagem, exemplos de valores literais, e intervalos de valores aceitos. Cada tipo de dado possui representação de valores literais adequados, tanto para inicialização quanto para atribuições. Em geral usa-se bool, char, int, long e double mais freqüentemente, onde long é uma abreviação para long int.

boolValores booleanostrue falsetrue false charCaracteres simples‘a’ ‘A’ ‘+’ ‘\t’ ‘\n’0 a 255, isto é, 8 bits intNúmeros inteiros100 0x3F16 bits ou mais, 32 normal floatNúmeros reais1.2f .23f 1.f 1.5e-15f doubleReais dupla precisão1.2 .23 1. 1.5e-15

Há quatro modificadores que alteram a representação desses tipos básicos. Os modificadores signed e unsigned alteram o significado dos dados para representação de números negativos. Os modificadores short e long alteram a quantidade de bits com que o dado é representado. A linguagem não padroniza completamente o tamanho da representação binária de números, e esse é um aspecto que pode comprometer a portabilidade.

Assim como C, C++ é uma linguagem que permite programação em baixo nível. Assim, a linguagem não possui propriamente caracteres, mas o tipo char é apenas um núemro de no mínimo 8 bits, e os literais (‘a’,’X’) podem ser atribuídos a qualquer variável numérica.

Um tipo de dado pode ser convertido em outro tipo com um cast. O cast deve preceder um valor e consiste no tipo para o qual se deseja converter, entre parênteses, como, por exemplo: (int) ‘a’. Esse cast simples introduzido aqui é o mesmo da linguagem C, mas deve-se evitar utilizá-lo, pois em seu lugar C++ possui outros quatro tipos diferentes de cast que são mais seguros, a serem apresentados adiante.

2.3Operadores, expressões e precedência

Operadores são elementos fundamentais para efetuar computação. Eles atuam sobre um ou mais operandos, e produzem um resultado, que é o valor da expressão formada por eles e seus operandos. Por exemplo 2 + 2 é uma expressão que utiliza o operador +, ordena que o computador efetue esse cálculo, e oferece como resultado o valor 4. Assim, se você escreve a = 3 * (2 + 2), a variável a deve receber o valor 12. Elementar, por enquanto! Mas ocorre que C++ possui 42 operadores, com as mais variadas finalidades. Além disso, como em C, o conceito de expressão é extremamente abrangente, e utilizado em várias construções. Isso será mostrado passo por passo, mas iniciemos guardando bem esses conceitos: variável, literal, atribuição, operador, operando e expressão.

2.4Usando alguns vetores

Assim como declaramos uma variável de um tipo determinado, podemos declarar um vetor de

05/1/2010Curso de Introdução à Programação e… w.inf.ufrgs.br/~johann/cpp2004/ 7/27 qualquer tipo com a seguinte sintraxe: tipo nome[tamanho]. Por exemplo, o programa abaixo declara um vetor de inteiros, assinala valores a algumas posições, e as imprime. Vetores serão melhor estudados adiante, mas são aqui introduzidos para enriquecer os exemplos iniciais.

2.5Construções de controle de fluxo

A seguir são apresentadas as principais construções de controle de fluxo de execução. Elas servem para produzir seqüências de execução mais complexas que a seüência do texto do programa, por desvio ou repetição. Em uma linguagem bloco-estruturada, não se deve pensar em desvios para posições arbitrárias, mas em uma formação do programa como conjunto de repetições e execuções condicionais propriamente aninhadas.

2.5.1A construção if
1-Escreva um programa que lê um valor da linha de comando e diz se ele é par ou ímpar.
2-Escreva um programa que recebe a nota final de um aluno e imprime seu conceito, conforme

A construção if tem a seguinte sintaxe, sendo opcional a parte do else em diante: if (condição) comando_para_resultado_verdadeiro; else comando_para_falso; Exercícios: a tabela abaixo:

3-Escreva um programa que lê 3 valores na linha de comando e imprime a média, dizendo

"Parabéns!!!" se a media for superior a um limiar pré-defido, ou "Que pena..." se for inferior.

2.5.2Blocos e escopos

Se for necessário colocar mais de um comando aninhado dentro de uma construção condicional (ou de iteração) usa-se um bloco. Um bloco é uma construção que permite tratar um conjunto de comandos como se eles fossem um só. O bloco consiste nesse conjunto de comando entre chaves ( {, }). Um bloco define um escopo de variáveis. Isto significa que se uma nova variável é declarada dentro de um bloco com o mesmo nome de uma variável fora desse bloco, somente a variável interna é acessada desse ponto em diante até o final do bloco.

2.5.3A construção for

A construção for serve para fazer repetições, e é bastante flexível ao contrário da maioria das linguagens. ela é composta por 4 elementos, identificados assim:

for ( expr1; expr2; expr3 ) comando;

05/1/2010Curso de Introdução à Programação e… w.inf.ufrgs.br/~johann/cpp2004/ 8/27

expr1; expr2; {comando; expr3; expr2; } {comando; expr3; expr2;}

A execução do for corresponde à seguinte seqüência:

Em expr1 e expr3 pode-se escrever qualquer código de inicialização e de preparação para a próxima repetição, atuando sobre quaisquer variáveis. Essas expressões podem conter vários assinalamentos separados por vírgulas. A expressão expr2 controla o laço, e também pode conter código arbitrário. Ela é executada antes da primeira repetição, de modo que o comando não é executado nenhuma vez se a expressão expr2 é falsa inicialmente.

1-Escreva um programa que lê um conjunto de 10 valoes inteiros e verifica se algum deles é

Exercícios: negativo.

2-Escreva um programa que lê um conjunto de 10 números na linha de comando e imprime o

número de pares e ímpares

2.5.4As construções while e do

A construção while (expr) comando; é idêntica a um for (;expr;) comando;. Já a construção do comando; while (expr) difere das anteriores no sentido de que executa pelo menos uma vez o comando, mesmo quando a expressão expr é inicialmente falsa.

1-Escreva um programa que fique indefinidamente lendo valores de entrada do usuário, dizendo

Exercícios: se o valor é par ou ímpar, até que este digite um número especial de saída, como 9, por exemplo.

2-Escreva o programa que lê 3 valores na linha de comando e imprime a média de forma que,

após realizar o primeiro cálculo de média, ele pergunte ao usuário se ele deseja fazer outro.

2.5.5As declarações break e continue

A declaração break interrompe o comando de repetição mais interno dentro da qual ela se encontra.

Serve também para separar casos da construção switch, vista adiante. Já a declaração continue interrompe apenas uma das repetições do laço, passando diretamente à execução da próxima repetição.

1-Escreva um programa que lê dez valores e os imprime em ordem inversa após a leitura.

Exercícios:

Porém a leitura deve ser interrompida caso um valor negativo seja lido, imprimindo "VALOR INCORRETO".

2-Escreva um programa para dar o conceito de alunos em função da nota, conforme a mesma

tabela de exercício anterior, mas que consulte três vetores de números inteiros, cada um com 10 posições, correspondendo aos 10 alunos. O primeiro vetor tem 0 se o aluno desistiu e cancelou o curso, e você não deve simplesmente ignorá-lo, ou 1 em caso contrário. O segundo vetor tem o número de aulas assistidas, e se for menor do que 3 (de 5 aulas) o aluno receberá conceito ‘F’ (falta de freqüência). Finalmente o terceito vetor contém a nota do aluno, para classificação segundo os outros conceitos.

05/1/2010Curso de Introdução à Programação e… w.inf.ufrgs.br/~johann/cpp2004/ 9/27

2.5.6 A construção switch

A construção switch serve para testar uma variável ou expressão contra diversos valores constantes.

Casa valor deve aparecer separado em uma cláusula case. E cada cláusula case precisa ser interrompida por uma declaração break, caso contrário os comandos deste ponto em diante sontinuam sendo executados.

1-Escreva um programa que leia valores entre 0 e 100 indefinidamente e calcule sempre a

Exercícios: média atual. Deve ser impresso "Média ok", "Média insatisfatória" e "Média insuficiente" respectivamente, para valores nos intervalos [80-100], [60-79] e [0-59]. Caso o valor lido não seja um número entre 0 e 100, abortar o programa com uma mensagem de erro

2.5.7O operador ?

O par de operadores ? : funciona como a construção condicional if, mas sob a forma de expressão.

Isto é, esse operador retorna um valor, o valor da expressão que foi avaliada. Um exemplo de uma expressão com esse operador, já usada em um assinalamento, é a seguinte:

(Parte 1 de 4)

Comentários