Baixe o app para aproveitar ainda mais
Prévia do material em texto
UNIVERSIDADE DO ESTADO DO RIO DE JANEIRO Centro de Tecnologias e Ciências Faculdade de Engenharia Departamento de Engenharia de Sistemas e Computação Rachel Reuters da Silva Características das Linguagens de Programação: C/C++ Rio de Janeiro 2013 Rachel Reuters da Silva Características das Linguagens de Programação: C/C++ Trabalho apresentado ao Curso de Engenharia Elétrica, da Universidade do Estado do Rio de Janeiro, como requisito parcial para a disciplina de Características das Linguagens de Programação. Orientador: Prof. Dr.Oscar Farias Rio de Janeiro 2013 Autorizo, apenas para fins acadêmicos e científicos, a reprodução total ou parcial desta dissertação. Assinatura: Data: ___________________________________________ _________ Rachel Reuters da Silva Características das Linguagens de Programação: C/C++ Trabalho apresentado ao Curso de Engenharia Elétrica, da Universidade do Estado do Rio de Janeiro, como requisito parcial para obtenção do grau da disciplina Características das Linguagens de Programação. Aprovado em: ________________________________________________ Banca Examinadora: ___________________________________________ ___________________________________________ Prof. Dr. Oscar Farias Faculdade de Engenharia da UERJ Rio de Janeiro 2013 RESUMO Este trabalho objetiva uma análise abrangente das características de uma das mais importantes Linguagens de Programação da atualidade: C/C++. Serão estudados nesta apresentação os seguintes tópicos: Evolução Histórica, Paradigmas de Programação, Sintaxe e Semântica, Variáveis, Expressões, Comandos, Tipos de Dados, Escopo, Abstração de Dados e Tratamento de Exceções. PALAVRAS-CHAVE: C ; C++ ; Programação. 1 INTRODUÇÃO Esta pesquisa tem a finalidade de apresentar uma ampla visão de C/C++ que, de acordo com o indicador de popularidade das Linguagens de Programação TIOBE [ranking publicado no mês de Novembro do ano de 2012 no site http://www.tiobe.com], estão entre as cinco mais utilizadas no mundo. Inicialmente, o principal objetivo da linguagem C era o desenvolvimento do Sistema Operacional Unix [http://www.cprogramming.com/]. Foi base para diversas outras linguagens como C++, que será abordada nesse trabalho, C# entre outras. 2 REFERÊNCIA HISTÓRICA 2.1 Contexto Histórico de C A linguagem C foi inventada e implementada pela primeira vez por Dennis Ritchie em uma máquina DEC PDP-11, em 1972, usando o sistema operacional UNIX. A linguagem C é o resultado do processo de desenvolvimento iniciado com a linguagem BCPL, que também influenciou a invenção da linguagem B. Em 1973, com a adição do tipo struct, a maioria do núcleo do Unix foi reescrito em C. Em 1978, Brian Kernighan e Dennis Ritchie publicaram a primeira edição do livro “The C Programming Language” que serviu como uma especificação informal da linguagem, e ainda hoje é o livro mais importante de C. Ao fim da década de 1970, a linguagem C começou a substituir a linguagem BASIC como a linguagem de programação de microcomputadores mais usada. E durante a década de 1980, foi adaptada para uso no PC IBM, e a sua popularidade começou a aumentar significativamente. Flexível e poderosa, a linguagem C tem sido utilizada na criação de alguns dos mais importantes produtos de software dos últimos anos. Porém, a linguagem encontra seus limites quando o tamanho de um projeto ultrapassa um tamanho de programa entre 25.000(vinte e cinco mil) e 100.000 (cem mil) linhas, tornando-se problemático o gerenciamento, tendo em vista que é difícil compreendê-lo como um todo. 2.2 C++, a evolução de C Para resolver o problema de tamanho extensivo e dificuldade de gerenciamento, Bjarne Stroustrup, em 1980, trabalhando nos laboratórios da Bell®, em Murray Bill, New Jersey, acrescentou várias extensões à linguagem C e chamou inicialmente esta nova linguagem de “C com classes”. Em 1983, o nome mudou para C++. O objetivo principal de Bjarne era implementar uma versão distribuída do núcleo Unix. Alguns dos desafios incluíam simular a infraestrutura da comunicação entre processos num sistema distribuído ou de memória compartilhada e escrever drivers para tal sistema. A linguagem Simula 67 possuía características bastante úteis para o desenvolvimento de software, mas era muito lenta para uso prático. Bjarne começou a acrescentar elementos do Simula 67 no C, especialmente os recursos de criação e manipulação de objetos. Outras linguagens também serviram de inspiração para o nascimento de C++, entre elas ALGOL 68, Ada, CLU e ML. Em 1985 foi lançada a primeira edição do livro “The C++ Programming Language”, contendo referências para a utilização da linguagem, já que ainda não era uma norma oficial. Em 1990 foi lançado o livro “The Annotated C++ Reference Manual”, que foi base para o futuro padrão. 3 AMBIENTE DE PROGRAMAÇÃO 3.1 IDE: DevC++ Dev-C++® é um Ambiente de Desenvolvimento Integrado para programação na linguagem C/C++. Ele usa a Mingw do GCC (GNU Compiler Collection®) como seu compilador. O programa cria executáveis nativos no Win32, console ou GUI. Dev-C++ também pode ser usado juntamente com o Cygwin. Dev-C++ é gratuito e de código aberto e é totalmente escrito em Delph®. [http://www.baixaki.com.br/download/dev-c-.htm] Foi escolhida esta ferramenta devido a sua maior praticidade de instalação e configuração no Sistema Operacional em execução, Windows. Também foram testados: Eclipse-cpp-Juno® , CodeBlocks®, Netbeans® e MinGW Developer Studio®. 3.2 Instalando e criando um novo projeto com DevC++ Ao instalar a ferramenta, selecionar a opção FULL, como mostra a Figura 1 abaixo. Figura 1 Concluindo a instalação, selecionar a opção executar Dev-C++® como mostra a Figura 2. Figura 2 A IDE irá ser carregada, como mostra a Figura 3 abaixo. Figura 3 Para iniciar um novo Projeto, selecionar a opção File -> New -> Project , como mostra a Figura 4 abaixo. Figura 4 Em seguida, na nova janela, selecionar Empty Project, criando um nome para ele e escolher a opção de linguagem desejada (C ou C++), como mostrado na figura 5. Figura 5 Para criar um novo arquivo dentro do Projeto criado, selecione com o botão direito no Projeto e escolha New File, como mostrado na Figura 6 abaixo. Figura 6 3.3 Compilando e Executando no DevC++ O primeiro programa, como de costume, será o Hello World em C: #include <stdio.h> int main() { printf("Hello World"); system("pause"); return 0; } Após digitar o código, para executá-lo, é necessário, primeiramente, compila-lo, como mostra a Figura 7 abaixo. Figura 7 Em seguida será preciso salvar o arquivo como mostra a Figura 8. Figura 8 Em seguida, o compilador irá informar que o seu programa foi compilado sem erros e está pronto para ser executado, como mostra a Figura 9 abaixo. Figura 8 Finalmente, o programa está pronto para ser executado, selecionando a opção Run. O programa foi executado, como mostrado na Figura 9 abaixo. Figura 9 4 PARADIGMAS DE PROGRAMAÇÃO “A classificação de linguagens em paradigmas é uma consequência de decisões de projeto que têm impacto na forma segundo a qual uma aplicação real é modelada do ponto de vista computacional.” (SILVA Edilberto. Paradigmas da Programação.) 4.1 Paradigmas característicos de C A Linguagem C constitui-se dos seguintes paradigmas: estruturado, imperativo e procedural. 4.1.1 Programação Estruturada de C Na programação estruturada, a estruturação está baseada em um pequeno número de estruturas de controle: • controle sequencial; • controle de decisão; • controle de seleção múltipla; • controle de iteração do tipo enquanto-faça; • controle de iteração do tipo repita-enquanto. Pode-se estabelecer o Princípioda Programação Estruturada (Hehl, 1986):“Qualquer algoritmo pode ser escrito combinando-se blocos formados pelas estruturas de controle acima”. (MARTHA, Luiz Fernando. Fundamentos de Programação Estruturada em C) Um exemplo de decisão em C: if (a > b) { z = a; } else { z = b; } 4.1.2 Programação Imperativa de C Programação imperativa descreve a computação como ações, enunciados ou comandos que mudam o estado (variáveis) de um programa. Muito parecido com o comportamento imperativo das linguagens naturais que expressam ordens, programas imperativos são uma sequência de comandos para o computador executar. Exemplo em C: float potencia(double val, unsigned pow) { double ret_val = 1.0; unsigned i; for(i = 0; i < pow; i++) ret_val *= val; return(ret_val); } 4.1.3 Programação Procedural de C A Programação Procedural constitui-se de chamadas a procedimentos, rotinas, subrotinas, métodos, ou funções. Exemplo em C: #include <stdio.h> int main() { potencia(5, 3) return 0; } 4.2 Paradigmas característicos de C++ A Linguagem C++ foi desenvolvida para aceitar diversos paradigmas. O seu diferencial com relação a Linguagem C é permitir a Programação Orientada a Objetos (POO). 4.2.1 Programação Orientada a Objetos em C++ A programação orientada a objetos implementa um conjunto de classes que definem os objetos presentes no software. Cada classe determina o comportamento (definido nos métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento com outros objetos. Exemplo em C++: class Passaro { public: virtual void MostraNome() { std::cout << "um passaro"; } virtual ~Passaro() {} }; class Cisne: public Passaro { public: void MostraNome() { std::cout << "um cisne"; } }; int main() { Passaro* passaro = new Cisne; passaro->MostraNome(); delete passaro; } 5 SINTAXE E SEMÂNTICA 5.1 Escopo de Variáveis Escopo é o nível em que um dado pode ser acessado. É um contexto que delimita os valores e expressões as quais estão associados. O tipo de escopo vai determinar quais tipos de entidades este pode conter e como estas são afetadas, em outras palavras, a sua semântica. Normalmente, o escopo é utilizado para definir o grau de ocultação da informação, isto é, a visibilidade e acessibilidade às variáveis em diferentes partes do programa. Tanto C quanto C++ são Case-Sensitive, isto é, há diferença entre maiúsculas e minúsculas. 5.1.1 Escopo de C As variáveis em C podem ser declaradas basicamente de três maneiras: dentro de uma função, fora de uma função, e como parâmetro de uma função. Essas maneiras de declaração fazem com que as variáveis sejam chamadas de locais, globais ou parâmetros formais, respectivamente. 5.1.2 Escopo de C++ Um diferencial da Linguagem C++ é a implementação do operador de escopo. É permitido declarar variáveis de escopo global e local com mesmo nome, para isso utiliza-se o operador de resolução de escopo simbolizado por :: Exemplo: #include<iostream.h> #include<conio.h> int x=3; // variável de escopo global int main() { int x=0; // variável de escopo local cout << "utilização da variável de escopo global: "<< ::x << endl; cout << "utilização da variável de escopo local : "<< x << endl; return 0; } 5.2 Palavras Reservadas 5.2.1 Em C A lista de palavras reservadas está definida na Tabela 1 abaixo: auto double int long break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while Tabela 1 5.2.2 Em C++ A lista de palavras reservadas está definida na Tabela 2 abaixo: alignas (since C++11) alignof (since C++11) and and_eq asm auto(1) bitand bitor bool break case catch char char16_t(since C++11) char32_t(since C++11) class register reinterpret_cast wchar_t while virtual void enum explicit export extern false float for friend goto if inline int long mutable namespace new xor xor_eq volatile unsigned using(1) union return short signed sizeof static static_assert(since C++11) static_cast struct switch template this thread_local(since C++11) throw true try typedef typeid typename or_eq private protected public compl const constexpr(since C++11) const_cast continue decltype(since C++11) default(1) delete(1) do double dynamic_cast else noexcept(since C++11) not not_eq nullptr (since C++11) operator or Tabela 2 5.3 Tipos de Dados Primitivos 5.3.1 Em C Os tipos básicos de dados em C são: char, int, float, double e void, como mostrado na Tabela 3, com seus respectivos intervalos e tamanhos. Uma característica peculiar da Linguagem C é de não possuir um tipo string. Para utilizar strings em C é necessário declarar uma variável como sendo um vetor de caracteres. Outra característica incomum em C é que não possui tipo boolean, para criar uma variável lógica basta associar os valores de 0 ou 1 para ela. Tabela 3 5.3.2 Em C++ Os tipos básicos de dados em C++ são: char, int, float, double, void, boolean e wchar_t, como mostrado na Tabela 4, com seus respectivos tamanhos e descrições. Tipo Descrição Tamanho bool Valores Aceitos true ou false 1 byte ou 8 bits char Intervalos de -128 a 127 1 byte ou 8 bits int Intervalos de -2.147.483.648 a 2.147.483.647 4 bytes ou 32 bits float Intervalos de 1,2e-38 até 3,4e+38. 4 bytes ou 32 bits double Intervalos de 2,2e-308 a 1,8e+308 8 bytes ou 64 bits long Intervalos de -2.147.483.648 a 2.147.483.647 4 bytes ou 32 bits wchat_t Intervalos de -32.768 a 32.767 4 bytes ou 32 bits Tabela 4 #include <iostream.h> #include <stdlib.h> int main(){ cout << "bool " << sizeof(bool) << endl; cout << "char " << sizeof(char) << endl; cout << "int " << sizeof(int) << endl; cout << "float " << sizeof(float) << endl; cout << "long " << sizeof(long) << endl; cout << "double " << sizeof(double) << endl; cout << "wchar_t " << sizeof(wchar_t) << endl; return 0;} 5.3.3 Modificadores de tipos Com a exceção do tipo void os tipos básicos de dados podem ter vários modificadores precedendo-os. Um modificador é usado para alterar o significado do tipo base para adequá-los melhor às necessidades da situação. São eles: signed, unsigned, long, short. As combinações possíveis são mostradas na Tabela 5 abaixo. Sequência Bytes ocupados Faixa (ou intervalo) short int signed int signed short int wchat_t signed wchar_t 2 -32.768 a 32.767 unsigned short int unsigned wchar_t 2 0 a 65.535 int long int signed long int 4 -2.147.483.648 até 2.147.483.647 unsigned int unsigned long int 4 0 a 4.294.967.295 char signed char 1 -128 a 127 unsigned char 1 0 a 255 bool 1 true ou false float 4 1,2e-38 a 3,4e+38 double long float 8 2,2e-308 a 1,8e+308 Tabela 5 5.4 Regras de Precedência e Associatividade de C/C++ As Linguagens possuem uma série de regras de precedência de operadores, para que o compilador saiba decidir corretamente qual operador será executado primeiro, em uma expressão com vários operadores. Essas regras seguem basicamente as regras algébricas. Além disso, é possível o uso de parênteses para forçar o compilador a executar uma parte de uma expressão antes das outras. Além das regras de precedência, existem também certas regras de associatividade para determinados operadores que possuem o mesmo nível de precedência, como por exemplo os operadores de divisão e multiplicação. Quando o compilador encontra dois operadores com o mesmo nível de precedência em uma expressão, ele verifica se estes operadores possuem associatividade esquerda-para-direita ou direita-para-esquerda. Associatividade esquerda-para-direita significa que se estes dois operadores agirem sobre um mesmo operando, o operador da esquerda será aplicado primeiro. Da mesma forma, associatividade direita-para-esquerda significa que na mesma situação, o operador da direitaserá aplicado primeiro. Por exemplo, os operadores divisão e multiplicação possuem associatividade esquerda-para-direita. As regras citadas acima estão relacionadas na Tabela 6 abaixo. Precedência Operador Associatividade Explicação 1 (expressão) Agrupamento 2 () E-D Chamada de função ++ Operador de incremento, pósfixado -- Operador de decremento, pósfixado 3 (todos unários) ! D-E Negação lógica ~ Negação Bitwise + Mais unário (sinal positivo) - Menos unário (sinal negativo) ++ Operador de incremento, pré-fixado -- Operador de decremento, pré-fixado & Endereço * Conteúdo de endereço () Modelador de tipo "(tipo) nome" sizeof Tamanho em bytes new Alocação Dinâmica de memória new [] Alocação Dinâmica de matriz delete Liberação Dinâmica de memória delete [] Liberação Dinâmica de matriz 4 (todos binários) * E-D Multiplicação / Divisão % Resto de divisão 5 (todos binários) + E-D Adição - Subtração 6 << E-D Shift para esquerda >> Shift para direita 7 < E-D Menor que <= Menor que ou igual a >= Maior que ou igual a > Maior que 8 == E-D Igual a != Não igual a 9 (binário) & E-D Bitwise AND 10 ^ E-D Bitwise XOR (OR exclusivo) 11 | E-D Bitwise OR 12 && E-D AND Lógico 13 || E-D OR Lógico 14 = D-E Atribuição simples *= Multiplicação e atribuição /= Dividir e atribuição %= Achar resto da divisão e atribuição += Adição e atribuição -= Subtração e atribuição &= Bitwise AND e atribuição ^= Bitwise XOR e atribuição |= Bitwise OR e atribuição <<= Shift para esquerda e atribuição >>= Shift para direita e atribuição 15 :? D-E Condicional 16 , E-D Combina duas expressões em uma só Tabela 6 5.5 Códigos de Barra Invertida As linguagens C e C++ fornecem constantes-caractere com a barra invertida, úteis para caracteres que não são facilmente inseridos através do teclado. Estes códigos são mostrados na Tabela 7 abaixo. Código Significado Código Significado \b Retrocesso \f Alimentação de formulário \n Nova linha \r Retorno de carro \t Tabulação horizontal \" Aspas \' Apóstrofo \0 Nulo \\ Barra invertida \v Tabulação vertical \a Sinal sonoro \N Constante octal \xN Constante hexadecimal \v Tabulação vertical Tabela 7 5.6 Chamada por Valor X por Referência A diferença entre chamada por valor e chamada por referência é que, usando a chamada por valor, as funções recebem uma cópia do valor de um parâmetro. Já na chamada por referência, as funções recebem o endereço de memória da variável, isto é, as funções podem alterar o valor armazenado na posição de memória específica. Em C, há apenas a chamada por valor. Já em C++, foi implementada a chamada de função por referência. 5.7 Bibliotecas de Execução 5.7.1 Bibliotecas de C A Linguagem C consiste de 24 (vinte e quatro) bibliotecas, cada uma contendo uma ou mais declarações de funções, tipos de dados e macros. Em comparação com linguagens como Java ®, esta biblioteca padrão é minúscula. Ela fornece um conjunto básico de operações matemáticas, manipulação de cadeias de caracteres, conversão de tipos de dados e entrada e saída de arquivo e da tela. Não contém um conjunto padrão de containers como a biblioteca padrão do C++ (parte chamada Standard Template Library), nem suporta interface gráfica do utilizador. Biblioteca Descrição <assert.h> Macro para ajudar na detecção de erros lógicos e outros tipos de erros em versões de depuração de um programa. <complex.h> Conjunto de funções para manipular números complexos. <ctype.h> Funções usadas para classificar caracteres pelo tipo ou para converter entre caixa alta e baixa independentemente da codificação. <errno.h> Teste de códigos de erro reportados pelas funções de bibliotecas. <fenv.h> Controle de ponto flutuante. <float.h> Constantes de propriedades específicas de implementação da biblioteca de ponto flutuante, como a menor diferença entre dois números de ponto flutuante distintos (_EPSILON), a quantidade máxima de dígitos de acurácia (_DIG) e a faixa de números que pode ser representada (_MIN, _MAX). <inttypes.h> Conversão precisa entre tipos inteiros. <iso646.h> Programação na codificação de caracteres ISO 646. <limits.h> Constantes de propriedades específicas de implementação da biblioteca de tipos inteiros, como a faixa de números que pode ser representada (_MIN, _MAX). <locale.h> Constantes para setlocale() e assuntos relacionados. <math.h> Funções matemáticas comuns em computação. <setjmp.h> Macros setjmp e longjmp, para saídas não locais. <signal.h> Tratamento de sinais. <stdarg.h> Acesso dos argumentos passados para funções com parâmetro variável. <stdbool.h> Definição do tipo de dado booleano. <stdint.h> Definição de tipos de dados inteiros. <stddef.h> Diversos tipos e macros úteis. <stdio.h> Manipulação de entrada/saída. <stdlib.h> Diversas operações, incluindo conversão, geração de números pseudo-aleatórios, alocação de memória, controle de processo, sinais, busca e ordenação. <string.h> Tratamento de cadeia de caracteres. <tgmath.h> Funções matemáticas. <time.h> Conversão de tipos de dado de data e horário. <wchar.h> Manipulação de caractere wide, usado para suportar diversas línguas. <wctype.h> Classificação de caracteres wide. Tabela 7 5.7.2 Bibliotecas de C++ A biblioteca padrão do C++ fornece vários containers genéricos, funções que utilizam e manipulam tais containers, funções-objeto, cadeias de caracteres e streams genéricos, suporte para algumas facilidades da linguagem e funções de uso geral, como funções matemáticas. Os containers genéricos são uma implementação de elementos conhecidos em estrutura de dados. Diferentes containers compartilham uma mesma interface, o acesso é o mesmo. Ela também incorpora a biblioteca padrão do C. No entanto, as biblioteca padrão do C sofreram uma adequação para pertencerem também ao espaço de nomes std: retirou-se o sufixo .h dos nomes dos arquivos de cabeçalho, e adicionou-se o prefixo c para indicar que pertence à linguagem C. A lista de Containers está relacionada na Tabela 9 abaixo. Cabeçalho Descrição <bitset> manipulação de arranjo de bits, algo parecido com vector<bool> <deque> manipulação de lista duplamente encadeada <list> manipulação de lista simplesmente encadeada <map> manipulação de conjunto associativo ordenado <queue> manipulação de lista FIFO <set> manipulação de conjunto <stack> manipulação de lista LIFO <vector> manipulação de arranjo Tabela 9 A lista de Uso Geral está relacionada na Tabela 10 abaixo. Cabeçalho Descrição <string> manipulação de cadeia de caracteres <algorithm> algoritmos genéricos <functional> funções-objeto <iterator> declaração de iterador <locale> manipulação de diversas convenções culturais do utilizador, como a representação de números, moeda e datas, para efeitos de internacionalização <memory> funções para o gerenciamento de memória <stdexcept> especialização de <exception>, fornece relatórios sobre exceções <utility> operações com pares de elementos (comparação e construção) Tabela 10 A lista de Streams e Input/Output estão relacionados na Tabela 11 abaixo. Cabeçalho Descrição <fstream> manipulação de fluxo de dados em arquivo <ios> declaração mais geral de fluxo de dados <iostream> manipulação de fluxo de dados padrão do sistema (entrada padrão, saída padrão e saída de erros padrão) <iosfwd> declaração dos fluxos de dados presentes na linguagem <iomanip> manipulação da apresentação e do processamento de fluxos de dados <istream> manipulação de entrada de dados <ostream> manipulação de saída de dados <sstream> manipulação de fluxo de dados em cadeias de caracteres <streambuf> manipulaçãode buffers de fluxo de dados Tabela 11 A lista de Funcionalidades numéricas está relacionada na Tabela 12 abaixo. Cabeçalho Descrição <complex> manipulação de número complexo <numeric> operações com conjuntos numéricos <valarray> arranjo de valores mutáveis Tabela 12 A lista de Suporte está relacionada na Tabela 13 abaixo. Cabeçalho Descrição <exception> manipulação de exceção <limits> manipulação de limites numéricos dos tipos embutidos na linguagem <new> manipulação de alocação e desalocação de memória <typeinfo> auxílio para o RTTI do C++ Tabela 13 5.8 Comandos especiais 5.8.1 Especificador de Formato Ao imprimir na tela ou capturar de um output, é necessário uma prévia especificação do tipo a qual está se manipulando. A Tabela 14 abaixo relaciona os comandos: Especificador Valor %d inteiro %o inteiro em formato octal %x inteiro em formato hexadecimal %X %u unsigned int %ld long int %f float %c char %e float em formato exponencial %E %g float. C escolhe melhor maneira de exibição entre normal e exponencial %G %s string %p endereço de um ponteiro %n quantos caracteres a função printf exibiu Tabela 14 5.8.2 Entrada e saída de dados em C A saída de dados é proporcionada pela função printf. Ela faz parte do arquivo de cabeçalho stdio.h, assim esta biblioteca deve ser incluída no programa para a utilização desta função. #include <stdio.h> int main() { int n=10; printf("O valor de n é %d\n",n); return 0; } A entrada de dados é feita com a função scanf. Sua sintaxe é: scanf("EF",&VARIÁVEL); onde EF é um especificador de formato e VARIÁVEL é variável onde o dado entrado será armazenado. #include <stdio.h> int main() { int n; scanf("%d",&n); printf("O número é: %d \n",n); return 0; } 5.8.3 Entrada e saída de dados em C++ A saída de dados é proporcionada pela função cout<<. Ela faz parte do arquivo de cabeçalho <iostream>, assim esta biblioteca deve ser incluída no programa para a utilização desta função. #include <iostream> using namespace std; int main() { cout << "Imprimindo o famoso HELLO WORLD!!!"<<endl; return 0; } A entrada de dados é proporcionada pela função cin>>. Ela faz parte do arquivo de cabeçalho <iostream>, assim esta biblioteca deve ser incluída no programa para a utilização desta função. #include <iostream> using namespace std; int main() { int Num1; cin >> Num1; cout << "o número é: "<<Num1<<endl; return 0; } Comandos IF e Else O IF é um desvio condicional, isto é, é uma estrutura de fluxo onde o programa analisa uma condição e caso esta condição seja verdadeira executa alguns comandos, caso esta condição seja falsa executa os comandos do ELSE. Tanto em C como em C++ é realizada da mesma forma. #include <stdio.h> int main () { int num; printf ("Digite um numero: "); scanf ("%d",&num); if (num==10) { printf ("\n Voce acertou!"); } else { printf ("\n Voce errou!"); } return 0; } 5.8.5 Switch e Case em C e C++ Tanto em C quanto em C++ o uso do switch case é equivalente. É uma forma de estrutura seletiva. Dentro dos switch há o case. Ou seja, é quase um if com várias possibilidades, mas com diferenças: 1ª diferença: Os cases não aceitam operadores lógicos. Portanto, não é possível fazer uma comparação. Isso limita o case a apenas valores definidos. 2ª diferença: O switch executa seu bloco em cascata. Ou seja, se a variável indicar para o primeiro case e dentro do switch tiver 5 cases, o switch executará todos os outros 4 cases a não ser que utilizemos o comando para sair do switch: BREAK. #include <iostream> #include <cstdlib> using namespace std; int main () { int a, b, c, operacao; cout <<"Digite o 1o valor: "; cin >> a; cout <<"Digite o 2o valor: "; cin >> b; cout <<"Que operacao deseja realizar?\n \t1. Adicao\t2.Subtracao\t3.Multiplicacao\t4.Divisao\n\n=>"; cin >> operacao; switch (operacao){ case 1: c=a+b; cout <<a<<" + "<<b<<" = "<<c<<"\n\n"; break; case 2: c=a-b; cout <<a<<" - "<<b<<" = "<<c<<"\n\n"; break; case 3: c=a*b; cout <<a<<" * "<<b<<" = "<<c<<"\n\n"; break; case 4: c=a/b; cout <<a<<" / "<<b<<" = "<<c<<"\n\n"; break; } return 0; } Estrutura de Repetição FOR em C e C++ Tanto em C e C++ o comando FOR é implementado da mesma maneira. O comando FOR precisa de uma variável para controlar os loops (voltas), essa variável deverá ser inicializada e forma de incremento ou decremento. Ou seja, for precisa de três condições: FOR (inicialização ; até quando irá ser executado ; incremento ou decremento). #include <iostream> #include <cstdlib> using namespace std; int main (void) { int x; for (x=1; x<=100; x++) cout << x <<"\t"; return 0; } Estrutura de Repetição WHILE em C e C++ Uma outra forma de iteração em C/C++ é o WHILE. O While executa uma comparação com a variável. Se a comparação for verdadeira, ele executa o bloco de instruções ou apenas a próxima linha de código logo abaixo. #include <iostream> #include <cstdlib> using namespace std; int main () { int par=0; cout <<"Os numeros pares de 0 a 100 sao:\n\n"; while (par<=100) { cout <<par<<"\t"; par+=2; //o mesmo que par=par+2 } system ("pause"); return 0; } 5.9 Criando Funções em C e C++ Funções são usadas para criar pequenos pedaços de códigos separados do programa principal. Funções são como variáveis, então, cria-se uma função indicando o tipo de retorno (saída) que será int, float, etc... nomeia-se a função em seguida os argumentos. Tipo de Retorno Nome da Função (Argumentos) { } #include <iostream> #include <cstdlib> using namespace std; void mensagem () { cout <<"Ola! Eu sou uma funcao.\n"; } int main () { mensagem (); return 0; } 5.10 Endereçamento de memória Tanto em C como em C++, o endereçamento de memória é realizado através de ponteiros. Quando declaramos uma variável e executamos o programa, o sistema operacional se encarrega de alocar o espaço necessário para o tipo de dado e "marca" aquele espaço de memória com um nome, que é o nome da variável. O papel do ponteiro é guardar este endereço. #include <iostream> #include <cstdlib> using namespace std; int main () { int var1 = 100; int *ptr1; ptr1 = &var1; cout << "O valor contido no endereco de memoria "; cout << ptr1 <<" e "<< *ptr1 << endl; return 0; } 5.11 Structs em C Um registro é uma coleção de várias variáveis, possivelmente de tipos diferentes. Na linguagem C, registros são conhecidos como structs . struct dma { int dia; int mes; int ano; }; struct dma x; //Cria uma struct dma chamada x struct dma y; //Cria uma struct dma chamada y 6 PROGRAMAÇÃO ORIENTADA A OBJETOS: C++ 6.1 Declarando uma classe Uma classe é um molde a partir do qual pode-se criar abstrações, isto é, objetos. Em C++ quando não se especifica o modificador de acesso, a variável é tomada como private por default. Dentro de uma classe pode-se definir diversos modos de visibilidade de variáveis e funções. São eles: private public protected class Bola { int x, y; BallColor color; int raio; } 6.2 Criando métodos e construtores Para uma maior segurança do interior da classe, utiliza-se o encapsulamento. Para modificar os atributos desta classe é necessário criar métodos e para inicializar uma instância desta mesma classe usa-se um construtor. Todos os métodos, os construtores e o destrutor devem ser públicos. Os construtores são métodos que devem possuir o mesmo nome da classe e são chamados sempre que um novo objeto da classe é criado. class Bola { int x, y; string color; int raio; public: Bola (int x1, int y1, string c, int r) { x = x1; y = y1; color = c; raio = r; } voidmove(int x_step, int y_step) { x += x_step; y += y_step; } int getX() { return x; } int getY() { return y; } string getColor() { return color; } int getRaio() { return raio; } void setColor(BallColor c) { color = c; } void setRaio(int r) { raio = r; } } 6.3 Instanciando uma classe e chamando métodos A criação de objetos é o processo de criar a estrutura lógica dos mesmos na memória. Neste momento todo o processo de construção dos objetos é efetivado. Assim, toda vez que declaramos um objeto estamos instanciando-o, ou seja, estamos criando uma instância da classe. Ao realizar uma chamada a um método precisa informar o nome do objeto a que está se fazendo referência e especificar os parâmetros exigidos pelo método. int main() { Bola Ball(2,2,"verde",1); cout << " raio: "<<Ball.getRaio()<<endl; return 0; } 6.4 Palavra reservada THIS Em todo método não static, a palavra reservada this é um ponteiro para o objeto sobre o qual o método está executando. Todos os métodos de uma classe são sempre chamados associados a um objeto. Durante a execução de um método, os campos do objeto são manipulados normalmente, sem necessidade de referência ao objeto. struct A { int i; A& inc(); }; A& A::inc() { i++; return *this; } int main() { int j; A obj1, obj2; obj1.i = 0; obj2.i = 100; for (j=0; j<10; j++) printf("%d\n", (obj1.inc().i)); system ("pause"); return 0; } 6.5 Herança Herança é o recurso que torna o conceito de classe mais poderoso. Em C++, o termo herança somente se aplica às classes. Uma herança permite que se construa e estenda continuamente classes desenvolvidas anteriormente, sem nenhum limite. Começando da classe mais simples, pode-se derivar classes cada vez mais complexas. class Caixa { public: int altura, largura; void Altura(int a) void Largura(int l) }; class CaixaColorida : public Caixa { public: int cor; void Cor(string c) }; 6.6 Polimorfismo O polimorfismo descreve a capacidade de um código C++ se comportar de diferentes formas dependendo do contexto em tempo de execução. Este recurso permite trabalhar em um nível de abstração bem alto ao mesmo tempo que facilita a incorporação de novos pedaços em um sistema já existente. Em C++ o polimorfismo se dá através da conversão de ponteiros (ou referências) para objetos. class A { public: void f(); }; class B : public A { public: void f(); }; void chamaf(A* a) { a->f(); } int main() { B b; chamaf(&b); return 0; } REFERÊNCIAS BIBLIOGRÁFICAS Departamento de Automação e Sistemas –DAS Sistemas Industriais Inteligentes, Curso de Linguaguem Computacional C/C++, Florianópolis, 2002 (Apostila) Faculdade de Ciências Aplicadas de Cascavel –FACIAP Curso de Ciência da Computação, Linguagem C/C++,Cascavel, 2004 (Apostila) FRIGERI, A.H., COPSTEIN, B. & PEREIRA, C.E. ,Curso de C++ , Porto Alegre, 1996 (Apostila) JAMSA, Kris & KLANDER, Lars, Programando em C/C++ “A Bíblia”, Makron Books, São Paulo, 1999 KERNIGHAN, B.W. & RITCHIE, D.M., The C Programming Language, Prentice Hall,London, 2009, 2ª Edição MARTHA, Luiz Fernando. Artigo publicado através do sítio http://www.tecgraf.puc-rio.br/ftp_pub/lfm/CIV2801ProgramC.pdf Prof. Heloísa. “Programação Estruturada Paradigmas de Linguagens de Programação”. Trabalho publicado através do sítio http://www2.dc.ufscar.br/~heloisa/PLP2009/ ProgEstr1.pdf, 1º. Sem. 2009 BORGES, Renato & CLÍNIO, André. Curso de Programação III – Introdução a POO. Material disponibilizado no sítio http://www.scribd.com/doc/2059942/Apostila-de-C Apostila do curso de Ciência da Computação da UNIPAN: Linguagem C/C++ , Cascavel PR 2004. Material consultado a partir do sítio http://www.scribd.com/doc/23407801/Apostila-Completa-sobre-C-C-em-Portugues NETO,Samuel Dias. Tutorial de Linguagem C – intermediário. Material consultado a partir do sítio http://homepages.dcc.ufmg.br/~joaoreis/Site%20de%20tutoriais/c_int/index.htm Tutorial de C/C++ disponibilizado no sítio http://www.tiexpert.net/programacao/c/ RICARTE, Ivan Luíz Marques. Apostila Programação Orientada a Objetos com C++ (http://www.dca.fee.unicamp.br/cursos/POOCPP/),1995, UNICAMP CESTA, Andre Augusto. Tutorial "C++ COMO UMA LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS.", 1996, UNICAMP BARROS, Tiago. Apostila “Do C ao C++ Uma abordagem da Engenharia de Software”,2002
Compartilhar