Baixe o app para aproveitar ainda mais
Prévia do material em texto
ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 1 O QUE É O C++ (Apostila retirada do site: http://www.linhadecodigo.com.br/artigos.asp?id_ac=331) INTRODUÇÃO A linguagem de programação C++ é, na verdade um superconjunto da linguagem de programação C (seu primeiro nome foi "C com Classes"). A razão da linguagem C ter sido chamada de C é simplesmente porque ela foi sucessora de uma linguagem chamada B, desenvolvida por Ken Thompson em 1970 e que rodava em um DEC PDP-7, um computador muito menos potente do que um PC moderno. O sistema operacional UNIX original rodava naquela máquina, e foi ali também onde o B nasceu (o B em si foi o sucessor de uma linguagem chamada BCPL, escrita por Martin Richards). No entanto, o B era um tanto quanto restrito. Em 1972 Dennis Ritchie e Ken Thompson criaram a Linguagem C para aumentar o poder do B. O C não se tornou popular imediatamente após sua criação. Na verdade, ele permaneceu como um assunto quase esotérico pelos seis anos seguintes. Em 1978, Brian Kernighan e Dennis Ritchie escreveram o famoso "The C Programming Language", o qual tenho um exemplar original em Inglês da 1ª. Edição, obrigado. Este livro simplesmente mudou tudo. Com a divulgação do C houve uma explosão de interesse, e a linguagem foi implementada em computadores de 8 bits que rodavam o sistema operacional CP/M. Mas foi o lançamento do IBM PC, em 1981, que realmente deu impulso ao C. Quando a revolução do PC começou, o C estava em uma posição privilegiada para aproveitá-la. À medida que o número de PC's explodia, também explodia o número de usuários do C. O C libertou-se de seu ambiente UNIX original e tornou-se uma linguagem "popular" para microcomputadores. Vale a pena salientar que ele se tornou popular por uma razão muito boa: os programadores gostaram de usá-lo. Ao contrário de outras linguagens, o C dava ao programador grande controle sobre o computador, tal controle, no entanto, traz também a responsabilidade: há muitas coisas que você pode fazer em C que arruinarão seu programa ou travarão seu computador. Ou seja, você pode fazer em C coisas que outras linguagens jamais permitiriam. Os programadores gostaram disso, imagine quem não gostaria poder fazer praticamente tudo com um computador! O C tornou-se uma ferramenta e não um obstáculo. O C tornou-se a combinação perfeita entre o controle e poder de programação. À medida que a popularidade do C crescia, crescia também o número de aplicativos escritos em C. Depois de certo tempo, os programas em C ficavam cada vez maiores e algumas pessoas começaram a achar que as construções de programação padrão simplesmente não estavam à altura da tarefa. Uma solução seria tornar os programas mais modulares, através do uso de funções. No entanto algumas funções acabavam precisando compartilhar dados, outras precisavam coordenar seu trabalho com outras e, de novo, era possível acabar precisando ter de guardar na cabeça dúzias de coisas ao mesmo tempo. Aí então apareceu o Dr. Bjarne Stroustrup e desenvolveu o C++, inspirado em parte por outras linguagens, como o Simula67, Smalltalk, até hoje considerada uma das mais puras linguagens OO. O trecho de uma entrevista com o Dr. Bjarne Stroustrup: ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 2 "Inventei C++, escrevi suas definições preliminares e produzi sua primeira implementação. Escolhi e formulei os critérios de projeto para C++, projetei seus principais recursos e era responsável pelo processamento de propostas de extensão no comitê de padrões C++". Acho que ninguém melhor como referência na linguagem que o Dr. Bjarne. Mais detalhes sobre ele, acesse http://www.research.att.com/~bs/homepage.html O nome C++ foi criado por Rick Mascitti em 1983, o nome representa um incremento (operador ++ de incremento no C) na linguagem C. A linguagem não foi chamada de D porque é uma extensão da linguagem C. No início não havia documentação de projeto do C++, nem comitê para aprovação dos padrões C++. Em 1987 (ano que comecei a me dedicar em programação de computadores) com a explosão do C++ foi-se necessário que a padronização formal do C++ acontecesse. Após vários anos e várias propostas de padronizações, em 1995 foi divulgado um projeto de padrão inicial para revisão pública e em 1998 um padrão internacional formalmente aprovado para C++. Bem pessoal, acho que agora todos conhecem um pouco da história do C++, vamos dar prosseguimento ao nosso estudo. Vamos agora abordar uma visão geral do C++, sem entrar em detalhes minuciosos de definição da linguagem. O objetivo é fornecer uma visão geral de C++ e as principais técnicas para usá-la. Logo nos próximos artigos da série "Iniciando em C++" vamos fornecer informações detalhadas sobre o que está descrito abaixo neste artigo. O que estamos passando daqui pra frente é uma visão geral do C++, ou seja, da linguagem de programação C++, e não de um pacote de desenvolvimento, seja ele, Visual C++, C++ Builder, C++.NET VS.NET, GCC (Unix). Estes próximos artigos descreverão o C++ ISO/ANSI. Depois após você estiver familiarizado com o C++, vamos tomar um outro rumo, que é o pacote da Microsoft VS.NET C++ e MS Visual C++ 6.0. No próximo tópico, iniciaremos nossa série propriamente dita, e é imprescindível que você que deseja aprender C++, tenha alguns conhecimentos de Orientação a Objeto, abstração de dados, etc. O que é o C++ O C++ é uma linguagem de uso geral, com uma tendência para a programação de sistemas e que: • É uma linguagem C melhorada; • Suporta abstração de dados; • Suporta programação orientada a objetos; • Suporta programação genérica; Como mencionei acima, não vamos tentar adivinhar qual é o sistema operacional que você está utilizando, vamos aprender o C++ ISO/ANSI padrão, que a partir de agora será chamado de C++. Nesta etapa não vamos fazer referências a janelas, listbox, textbox, gráficos, etc., ou seja, tudo o que depender de sistema operacional. Vamos utilizar nesta fase a 'saída padrão', ou seja, a console. Compilador e Editor ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 3 Como um grande fã da Microsoft, não poderia deixar de utilizar as ferramentas MS, então para a parte prática, vamos utilizar o VS.NET para isso. Quem não tiver o VS.NET, poderá também utilizar o Visual C++ 6.0 ou C++ Builder da Borland, ou quem sabe ainda, algum outro compilador Unix/Linux de sua preferência. Todos os projetos que vamos desenvolver agora serão baseados em uma console DOS, ou seja, uma Win32 Console Application. Começando um novo Projeto Acho que já está na hora de começar, vamos lá. Como estamos usando o VS.NET 2003, vamos iniciar um novo projeto. Selecione o menu File->New->Project e em seguida será apresentada a seguinte tela: Você deverá selecionar sempre Visual C++ Projects->Win32 Console Project ATENÇÃO: Se estiver utilizando o VS.NET 2003, atenção para a seleção de aplicações Win32 e não aplicações .NET. Você deverá estar perguntando agora, porque aplicações Win32 e não aplicações .NET??? Simples, porque as aplicações .NET utilizam as Managed Extensions, ou seja, extensões gerenciadas, que de uma certa forma encapsulam as funcionalidades do C++ padrão. E o nosso objetivo agora é o aprendizado do C++ padrão. Logo mais adiante no nosso curso, estarei explicando outros tipos de aplicações, mas por enquanto vamos utilizar Win32 Console Project ou para o Visual C++ 6.0 Win32 Console Application. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 4 Após selecionar o tipo de projeto, você deverá selecionar Project Empty. Obs.: No VC++.NET você deverá selecionar Project Settings para alterar esta opção. Caso não venha a selecionar Project Empty o VC++ criaráuma classe com uma aplicação Hello World já definida, que por enquanto não utilizaremos. Ciclo de Desenvolvimento Se todos os programas funcionassem logo na primeira vez que fosse testado, o ciclo de desenvolvimento completo seria o seguinte: escrever o programa, compilar o código fonte, vincular o programa e executá-lo. Infelizmente, quase todos os programas, independentemente do grau de complexidade que apresente, podem e conterão erros (Lei de Murphy), mais conhecidos como bugs. Alguns erros farão com que a compilação falhe, outros farão com que a vinculação ou linkedição não funcione e haverá aqueles que só darão problema quando o programa for executado. Independentemente do tipo de erro com o qual você se depare, corrija-o; sua correção envolve a edição do código-fonte, uma nova compilação, uma nova vinculação e por fim uma nova execução do programa. Atualmente com as novas versões do VC++ (.NET e VS 6.0) é perfeitamente possível editar o código enquanto se depura a aplicação, e uma compilação incremental é feita. Não recomendo esta prática, exceto casos particulares, pois algumas referências de ponteiros poderão ser perdidas e seu sistema ficará instável. Nosso primeiro Programa em C++ Não poderia deixar de ser, afinal todos os autores citam o exemplo seja em qualquer linguagem, o nosso tradicional "Alo Mundo" ou podemos utilizar "Hello World". Não vamos fugir à regra. Após criar o projeto vazio, selecione o menu File->New e selecione C++ Source File. (para VC++ 6.0) e selecione File->Add New Item e selecione C++ Source File (VC++.NET) Agora digite o código abaixo: #include <iostream> using namespace std; int main() { cout << "Olá Mundo!\n"; return 0; } Quando tiver digitado o texto acima, selecione a opção Salvar. Na C++ todos os caracteres, incluindo os sinais de pontuação, são de fundamental importância e devem ser digitados com absoluta precisão. Além disso, a C++ faz distinção entre letras maiúsculas e minúsculas; portanto, há diferença entre Return e return. Para compilar e executar o programa acima, tecle F5 ou CTRL-F5 (Visual Studio 6.0 ou .NET) para executar e esperar que o usuário tecle algo para continuar, permitindo ver a saída da console. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 5 Quanto às funcionalidades de cada ambiente de desenvolvimento, sugerimos você de dar uma breve leitura no manual do ambiente utilizado para verificar como se compila um programa, como se depura um programa, etc. DICA: No Visual Studio, a tecla F5 executa o programa, compilando-o se necessário e fazendo a linkedição do mesmo. Para Compilar um programa somente, selecione a opção Compile do menu Build. Erros de Compilação Os erros em tempo de compilação podem ocorrer por uma série de razões. Geralmente, eles são decorrentes de uma pequena inversão de letras em uma palavra ou outro pequeno erro cometido acidentalmente. Os bons compiladores não apenas lhe dirão o que aconteceu de errado, como também identificarão o local exato em que houve um erro de código. Os melhores compiladores do mercado chegarão até a sugerir uma solução para o problema! ATENÇÃO: Embora os compiladores modernos tentem localizar a linha em que está o erro, a ausência de um ponto-e-vírgula ou de uma chave de fechamento pode confundir o compilador e você pode achar que ele está apontando para uma linha que não apresenta problema. Tome muito cuidado com os erros de pontuação, cuja detecção pode ser mais difícil. Você pode testar este programa colocando intencionalmente um erro em seu programa. Se o Exemplo01.cpp for executado sem problema, edite-o agora e remova a chave de fechamento existente no final do código. Seu programa terá a seguinte aparência: #include <iostream> using namespace std; int main() { cout << "Hello World!\n"; return 0; } Recompile o seu programa a fim de ver um erro semelhante: Exemplo01.cpp(11): fatal error C1075: end of file found before the left brace '{' at Exemplo01.cpp(7)' was matched Esta mensagem de erro é do VC++.NET, no VC++ 6.0 é diferente, mas tem o mesmo significado. Algumas vezes, os erros apenas o aproximavam do problema. Se o compilador pudesse identificar todos os erros com exatidão, ele mesmo corrigiria o código. Neste artigo, você aprendeu a preparar o programa em C++, lembrando que este procedimento se aplica ao VC++ 6.0 e VC++.NET. Caso você tenha alguma dúvida sobre a utilização de outros ambientes de desenvolvimento, verifique na documentação do C++ do ambiente para saber como faze-lo, caso necessário entre em contato, que terei imenso prazer em ajudá-lo. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 6 INSTRUÇÕES INTRODUÇÃO Neste artigo da série Iniciando em C++ você aprenderá o que são instruções e expressões e como se trabalha com operadores. INSTRUÇÕES Na verdade, um programa nada mais é do que um conjunto de comandos executados em seqüência. Uma instrução controla a seqüência de execução, avalia uma expressão ou não faz nada (a instrução null). Todas as instruções em C++ terminam com um ponto-e-vírgula. Uma instrução simples e comum é uma atribuição: x = a + b; Ao contrário da álgebra, essa instrução não significa que x é igual a a+b. Na verdade, ela é lida da seguinte maneira: "Atribua o valor da soma de a e b a x." ou "atribua a x, a + b". Muito embora essa instrução faça duas coisas, ela é uma instrução e, portanto, tem um ponto-e- vírgula. O operador de atribuição atribui qualquer coisa que esteja à direita de qualquer coisa que esteja à esquerda. ESPAÇO EM BRANCO Os espaços, juntamente com as tabulações e as novas linhas, são chamados de espaços em branco. Em geral, o espaço em branco extra é ignorado pelo compilador; qualquer lugar no qual você veja um espaço pode colocar uma tabulação ou uma nova linha sem maiores problemas. A única finalidade de se incluir um espaço em branco é tornar o programa mais legível para os humanos; o compilador não perceberá a sua existência. A instrução de atribuição poderia ter sido digitada como x=a+b; ou como x = a+ b; DICA: Use espaços em branco para tornar o código mais legível. Embora essa última variação seja aceita sem o menor problema, ela também é uma grande tolice. O espaço em branco deve ser usado para tornar os programas mais legíveis e fáceis de manter, mas também pode ser usado para criar um código indecifrável. Nesse caso, como em tudo o mais, a C++ fornece o poder; o julgamento é você quem faz. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 7 INSTRUÇÕES COMPOSTAS Qualquer que seja o lugar no qual você coloque uma instrução simples, coloca também uma instrução composta. Instrução composta é uma instrução que comece com uma chave de abertura ({) e termine com uma chave de fechamento (}). Embora todas as instruções em uma instrução composta devam terminar com um ponto e vírgula, a instrução composta em si não termina com um ponto-e-vírgula. Por exemplo: { temp = a; a = b; b = temp; } Essa instrução composta alterna os valores nas variáveis a e b. Expressões Qualquer coisa que retorne um valor é uma expressão em C++. Operadores Um operador é um símbolo que faz com que o compilador execute uma ação. Operador de atribuição O operador de atribuição (=) faz o operando à esquerda do operador de atribuição ter seu valor alterado para o valor à direita do operador de atribuição. A expressão x = a + b; atribui o valor que resulta da adição de a e b ao operando x. Um operando que pode estar legalmente à esquerda de um operador de atribuição é chamado de um valor e (esquerda). O que pode estar à direita é chamado(como pode imaginar) de valor d. As constantes são valores d; elas não podem ser valores e. Dessa maneira, você pode digitar x = 35; // OK mas não pode digitar 35 = x; // erro, isso não é um valor e! Valores E e valores D - Um valor E é um operando que pode estar à esquerda de uma expressão. Um valor D é um operando que pode estar à direita de uma expressão. Observe que todos os valores E são valores D, mas nem todos os valores D são valores E. Um exemplo de valor D que não é um valor E é uma literal. Desse modo, você pode digitar x = 5;, mas não pode digitar 5 = x; ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 8 Operadores matemáticos Existem cinco operadores matemáticos: adição (+), subtração (-), multiplicação (*), divisão (/) e módulo (%). Adição, subtração e multiplicação agem como você está acostumado. O mesmo não acontece com a divisão. A divisão de um inteiro apresenta algumas diferenças em relação à divisão cotidiana. Quando você divide 21 por 4, o resultado é um número real (um número com fração). Os inteiros não aceitam frações e, por essa razão, o 'resto' é descartado. O valor retornado por 21 / 4 é 5. O operador de módulo (%) retorna o valor do resto da divisão do inteiro. Portanto, 21 % 4 é 1, pois 21/4 é 5 com um resto de 1. Surpreendentemente, a descoberta do módulo tem lá sua utilidade. Por exemplo, pode ser que você deseje imprimir uma instrução a cada dez ações. Sabe-se, no entanto, que qualquer número % 10 retornará 0 se o número for um múltiplo de 10. Assim, 20 % 10 é zero. 30 % 10 é zero. Instruções Combinando os operadores de atribuição e matemáticos Não é raro querer adicionar um valor a uma variável e, em seguida, atribuir o resultado à variável. Em C++, você pode digitar minhaIdade += 2; Essa instrução aumenta o valor em minhaIdade por 2. Incremento e decremento O valor mais comum a ser adicionado (ou subtraído) e, em seguida, retribuído a uma variável é 1. Em C++, a adição de 1 a um valor é chamada de incrementação e a subtração de 1 é chamada de decrementação. Há operadores especiais para executar essas ações. O operador de incremento (++) acrescenta 1 ao valor da variável e o operador de decremento (--) subtrai 1. Dessa forma, se você tem uma variável C, e deseja incrementa-la, tem que usar esta instrução: C++; // começa com C e a incrementa em 1 Prefixo e sufixo Tanto o operador de incremento (++) como o operador de decremento (--) têm duas versões: prefixo e sufixo. Prefixo - O operador é digitado antes do nome da variável (++minhaIdade). Sufixo - O operador é digitado depois do nome da variável (minhaIdade++). Em uma instrução simples, faz pouca diferença usar um ou outro, mas, em uma instrução complexa, quando você incrementa (ou decrementa) uma variável e em seguida atribui o ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 9 resultado a outra variável, tal ordem é de grande importância. O operador de prefixo é avaliado antes da atribuição e o sufixo é avaliado depois. A semântica do prefixo é esta: incrementa o valor e, em seguida, o recupera. A semântica do sufixo é diferente: recupera o valor e, em seguida incrementa o original. Isso em princípio pode parecer confuso, mas se X for um inteiro cujo valor é 5 e você digitar int a = ++x; estará instruindo o compilador a incrementar X (tornando-o 6) e, em seguida, recuperar o valor e atribuí-lo a A. Sendo assim, A agora é 6 e X agora é 6. Se, depois disso, você digitar: int b = x++; estará instruindo o compilador a recuperar o valor de X (6) e atribuí-lo a B, e em seguida, retornar e incrementar X. Assim, B agora é 6, mas X agora é 7. O código abaixo demonstra o uso e as implicações de ambos os tipos. Nas linhas 8 e 9, duas variáveis de inteiro são declaradas e cada uma delas é inicializada com o valor 39. O valor delas é impresso nas linhas 11 e 12. Na linha 14, minhaIdade é incrementada usando o operador de incremento de sufixo, e na linha 15, suaIdade é incrementada usando o operador de incremento de prefixo. Os resultados são impressos nas linhas 18 e 19 e são idênticos (ambos são 40). ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 10 Na linha 21, minhaIdade é incrementada como parte da instrução de impressão, usando o operador de incremento de sufixo. Como é o sufixo, o incremento acontece depois da impressão e, portanto, o valor 40 é impresso novamente. Por outro lado, na linha 22, suaIdade é incrementada por meio do uso do operador de incremento de prefixo. Portanto, ele é incrementado antes de ser impresso e o valor é exibido como 41. Finalmente, nas linhs 24 e 25, os valores são impressos novamente. Como a instrução de incremento foi concluída, o valor em minhaIdade agora é 41, pois esse é o valor em suaIdade. E este valor não é a minha idade real. J Precedência Na instrução complexa, x = 5 + 3 * 8; o que é executado primeiro, a adição ou a multiplicação? Se a adição for executada primeiro, a resposta será 8 * 8, ou seja, 64. Se a multiplicação for executada primeiro, a resposta será 5 + 24, ou seja, 29. A multiplicação tem uma precedência maior do que a adição e, portanto, o valor da expressão acima é 29. Quando dois operadores matemáticos têm a mesma precedência, eles são executados da esquerda para a direita. Dessa forma, em: x = 5 + 3 + 8 * 9 + 6 * 4; a multiplicação é a primeira operação a ser avaliada, da esquerda para a direita. Assim, 8*9 = 72, e 6*4 = 24. Agora a expressão é esta: x = 5 + 3 + 72 + 24; Agora a adição, da esquerda para a direita, é 5 + 3 = 8; 8 + 72 = 80; 80 + 24 = 104. Tome cuidado com isso. Alguns operadores, como o de atribuição, são avaliados da direita para a esquerda! Em qualquer caso, e se a ordem de procedência não atender a suas necessidades? Considere a expressão TotalSegundos = NumMinutosEsperar + NumMinutosTipo * 60; Nessa expressão, você não deseja multiplicar a variável NumMinutosdoTipo por 60 e, em seguida adiciona-la a NumMinutosEsperar. Você deseja incluir as duas variáveis de modo a obter o número total de minutos e, em seguida, multiplicar esse número por 60 para obter o total de segundos. Nesse caso, você usa parênteses para alterar a ordem de precedência. Os itens entre parênteses são avaliados como tendo uma precedência maior do que qualquer outro operador matemático. Dessa forma, TotalSegundos = (NumMinutosEsperar + NumMinutosTipo) * 60; apresentará o resultado desejado. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 11 Aninhando parênteses Em operações complexas, você precisará aninhar parênteses um dentro do outro. Por exemplo, pode necessitar computar o total de segundos e, em seguida, computar o número total de pessoas que estão envolvidas antes de multiplicar os segundos pelas pessoas: TotalPessoasSegundos = (((NumMinutosEsperar + NumMinutosdoTipo) * 60) * (PessoasNoTrabalho + PessoasDeFerias)); Essa complicada expressão é lida de dentro para fora. Primeiro, NumMinutosEsperar é adicionado a NumMinutosdoTipo, pois esses são os parênteses mais internos. Em seguida, essa soma é multiplicada por 60; PessoasNoTrabalho é adicionado a PessoasDeFerias. Finalmente, o número total de pessoas encontrado é multiplicado pelo número total de segundos. Esse exemplo suscita uma questão importante. Essa expressão é fácil de o computador entender, mas muito difícil de uma pessoa ler, entender ou modificar. Veja a seguir a mesma expressão digitada de uma outra maneira, usando algumas variáveis de inteiro temporárias: TotalMinutos = NumMinutosEsperar + NumMinutosDoTipo; TotalSegundos = TotalMinutos * 60; TotalPessoas = PessoasNoTrabalho + PessoasDeFerias;TotalPessoasSegundos = TotalPessoa * TotalSegundos; Esse exemplo demanda mais tempo para ser digitado e usa mais variáveis temporárias do que o exemplo anterior, mas é bem mais fácil de entender. Preceda-o com um comentário para explicar o que o código faz e mude o 60 para uma constante simbólica. Assim terá um código que é fácil de entender e manter. A natureza da verdade Nas versões anteriores de C++, todas as verdades e falsidades eram representadas por inteiros, mas o novo padrão ISO/ANSI introduziu um novo tipo: bool. Esse novo tipo tem dois valores possíveis, false ou true. Todas as expressões podem ser avaliadas conforme sua verdade ou falsidade. As expressões que matematicamente são avaliadas como zero retornarão false e todas as outras retornarão true. Operadores relacionais Os operadores relacionais são usados para determinar se dois números são iguais ou se um é maior ou menor que o outro. Todas as expressões relacionais retornam true ou false. Existem seis operadores relacionais: igualdade (==), menor que (<), maior que (>), maior ou igual a (>=), menor ou igual a (<=) e diferente (!=). Nesta lição você aprendeu o que são instruções, expressões e como se trabalha com operadores. O código acima pode ser baixado clicando aqui. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 12 Variáveis Introdução Neste artigo da série Iniciando em C++ você aprenderá a declarar e definir variáveis e constantes, a atribuir e manipular valores às variáveis, e a remeter o valor de uma variável para a tela. O que é uma variável? Os programas precisam de uma maneira para armazenar os dados que usam. As variáveis e constantes oferecem uma variedade de formas para se trabalhar com números e outros valores. Do ponto de vista de um programador, uma variável é um local na memória do computador no qual você pode armazenar um valor e a partir do qual você posteriormente pode recuperá-lo. Para entender esse conceito, você necessita de uma noção básica da maneira como a memória do computador funciona. A memória do computador pode ser entendida como uma série de cubículos, todos eles alocados lado a lado em uma longa fileira. Cada cubículo - ou localização da memória - é numerado sequencialmente. Esses números são chamados de endereços de memória. As variáveis têm, além de endereços, nomes. Por exemplo, você pode criar uma variável chamada minhaIdade. Sua variável é um rótulo aplicado a um desses cubículos, cuja finalidade é permitir que sejam localizados facilmente, sem saber o seu real endereço de memória. Reservando memória Quando você define uma variável em C++, deve informar ao compilador não apenas o seu nome, mas também o tipo de informação que ela contém: inteiro, caractere, entre outros. Nós chamamos isso de tipo da variável. O tipo da variável informa ao compilador o espaço que a memória dispõe para armazenar o valor da variável. Cada cubículo tem 1 byte. Se o tipo de variável que você quer criar tiver 2 bytes, ela precisará de 2 bytes de memória, ou dois cubículos. O tipo da variável (por exemplo, INT) informa ao compilador o espaço em memória (quantos cubículos) reservado para a variável. Como os computadores usam bits e bytes para representar valores, e como a memória é medida em bytes, é importante que você entenda e se sinta familiarizado com esses conceitos. Tamanho dos inteiros Uma variável char (usada para armazenar caracteres) costuma ter 1 byte. Um short int tem 2 bytes na maioria dos computadores, um long int geralmente tem 4 bytes e um int (sem a palavra short ou long) pode ser de 2 ou 4 bytes. Se você estiver executando o Windows 95, Windows 98, NT, 2000 ou XP, pode levar em consideração que sua int tem 4 bytes desde que esteja usando um compilador moderno. Abaixo, o código o ajudará a determinar o tamanho exato desses tipos no seu computador usando seu próprio compilador. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 13 #include <iostream> int main() { cout << "O tamanho de um int e:\t\t" << sizeof(int) << "bytes.\n"; cout << "O tamanho de um um short int e:\t" << sizeof(short) <<"bytes.\n"; cout << "O tamanho de um long int e:\t" << sizeof(long) <<"bytes.\n"; cout << "O tamanho de um char e:\t\t" << sizeof(char) <<"bytes.\n"; cout << "O tamanho de um bool e:\t\t" << sizeof(bool) <<"bytes.\n"; cout << "O tamanho de um float e:\t\t" << sizeof(float) <<"bytes.\n"; cout << "O tamanho de um double e:\t" << sizeof(double) <<"bytes.\n"; return 0; } signed e unsigned Além disso, a maioria desses tipos vem em duas variedades: signed e unsigned. A idéia aqui é que algumas vezes você precisa de números negativos e algumas vezes não. Os inteiros (short e long) sem a palavra unsigned são tidos como signed. Os inteiros signed são negativos ou positivos. Os inteiros unsigned são sempre positivos. DICA: Use int em variáveis numéricas. Na maioria dos programas, na maioria das vezes, basta que você afirme que as variáveis numéricas são int - que são inteiros signed. Tipos de variávies fundamentais Diversos outros tipos de variáveis são construídos na C++. Eles podem ser divididos em variáveis de inteiro (o tipo discutido até agora), variáveis de ponto flutuante e variáveis de caractere. Variávies de ponto flutuante e de caractere - As variáveis de ponto flutuante têm valores que podem ser expressos como frações, ou seja, que são números reais. As variáveis de caractere armazenam um byte e são usadas para armazenar 256 caracteres e símbolos dos conjuntos de caracteres ASCII e ASCII estendidos. O conjunto de caracteres ASCII - O conjunto de caracteres padrão usado em computadores. ASCII é o acrônimo de American Standard Code for Information Interchange. Quase todos os sistemas operacionais suportam ASCII, embora muitos também sejam compatíveis com outros conjuntos de caracteres como, por exemplo, o EBCDIC. Os tipos de variáveis usadas em programas C++, são descritos na Tabela abaixo, Essa tabela mostra o tipo de variável, o espaço que ele ocupa na memória e os tipos de valores que podem ser armazenados nessas variáveis. Os valores que podem ser armazenados são determinados pelo tamanho dos tipos de variáveis, e consequentemente pelo tipo de computador que está sendo utilizada a aplicação. Lembrando que estes são alguns dos tipos padrões do C++ ANSI. Tipo Tamanho Valores unsigned short int 2 bytes 0 a 65.535 short int 2 bytes - 32.768 a 32.767 unsigned short int 4 bytes 0 a 4.294.967.295 long int 4 bytes -2.147.483.648 a 2.147.483.647 ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 14 char 1 byte 256 valores de caractere bool 1 byte Verdadeiro ou falso float 4 bytes 1,2e-38 a 3,4e38 double 8 bytes 2,2e-308 a 1,8e308 DICA: Use apenas int . Se você estiver criando um int , não se preocupe com short versus long; use apenas int. Com um compilador moderno, isso criará um long int que será satisfatório em 99% das situações. Definindo uma variável Você cria, ou define, uma variável instruindo o seu tipo, seguido por um ou mais espaços, pelo nome da variável e um ponto-e-vírgula. O nome da variável pode ser virtualmente qualquer combinação de letras, mas não pode conter espaços. Bons nomes de variáveis mostram a você a finalidade delas; o uso de bons nomes facilita a compreensão do fluxo do seu programa. Distinção entre maiúsculas e minúsculas A C++ faz distinção entre letras maiúsculas e minúsculas. Em outras palavras, letras minúsculas e maiúsculas são consideradas diferentes. Uma variável cujo nome é idade é diferente de Idade que é diferente de IDADE. Palavras chave Algumas palavras são reservadas pela C++ e você não pode usá-las como nomes de variável.Essas são as palavras-chave usadas pelo compilador para controlar o seu programa. As palavras chaves incluem if, while, for e main. O manual do seu compilador deve fornecer uma lista completa, mas geralmente qualquer nome razoável para uma variável quase certamente não é uma palavra-chave. Criando mais de uma variável de cada vez Você pode criar mais de uma variável ao mesmo tempo em uma instrução digitando o tipo e, em seguida, os nomes de variável, separados por vírgulas. Por exemplo: unsigned int minhaIdade, meuPeso; // duas variáveis unsigned int long area, largura, tamanho; // três longs Atribuindo valores a suas variáveis Você atribui um valor a uma variável usando o operador de atribuição (=). Portanto, você atribuiria 5 como largura se digitasse: unsigned short largura; largura = 5; ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 15 Ou você poderia combinar essas etapas e inicializar largura quando defini-la por meio da seguinte instrução: unsigned short largura = 5 Constantes Como as variáveis, as constantes são locais de armazenamento de dados. Mas as variáveis mudam; as constantes, por outro lado, como você deve ter imaginado, não mudam. Você deve inicializar uma constante quando ela é criada e não pode atribuir-lhe um novo valor posteriormente; depois que uma constante é inicializada, seu valor é, em uma palavra, constante. Constantes literais A C++ tem dois tipos de constantes: literais e simbólicas. Uma constante literal é um valor digitado diretamente em seu programa sempre que ele se fizer necessário. Por exemplo: int minhaIdade = 39; minhaIdade é uma variável do tipo int; 39 é uma constante literal. Você não pode atribuir um valor a 39 e seu valor não pode ser alterado; Constantes simbólicas Uma constante simbólica é uma constante que é representada por um nome, assim como uma variável também é. Ao contrário de uma variável, no entanto, depois que uma constante é inicializada, seu valor não pode ser alterado. Se o seu programa tem uma variável inteira cujo nome é estudantes e outra cujo nome é classes, você pode computar o número de estudantes que possui com base em um número conhecido de classes; se você soubesse que há 15 estudantes por classe: estudantes = classes * 15; Nesse exemplo, 15 é somente uma constante literal. Seu código seria mais fácil de ler, e mais fácil de manter, se você substutuísse uma constante simbólica por este valor: estudantes = classes * estudantesPorClasses; Se você decidisse mudar o número de estudantes em cada classe, poderia fazê-lo onde a constante estudantesPorClasses é definida sem ter que fazer uma mudança em todos os locais em que usou este valor; Definindo constantes com #define Para definir uma constante à forma antiga, odiável e politicamente incorreta, você digitaria a seguinte instrução: #define estudantesPorClasses 15 ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 16 Observe que, como estudantesPorClasses não pertence a um tipo específico (int ou char por exemplo), #define faz uma simples substituição de texto. Todas as vezes que o processador localizar a palavra estudantesPorClasses, ele colocará 15 no texto. Como o pré-processador é executado antes do compilador, seu compilador jamais vê a constante, ele vê o número 15; Definindo constantes com const Embora #define funcione a contento, existe uma maneira nova, melhor, menos gordurosa e mais saborosa, para definir constantes no C++. const unsigned short int estudantesPorClasses = 15; Esse exemplo também declara uma constante simbólica cujo nome é estudantesPorClasses, mas desta vez estudantesPorClasses é digitado com um unsigned short int. Dessa forma, você digita mais texto, mas tem suas vantagens. A maior diferença é que essa constante tem um tipo, e o compilador pode garantir que ele seja usado de modo compatível com ele. Constantes enumeradas As constantes enumeradas criam um conjunto de constantes com uma faixa de valores. Por exemplo, você pode declarar COR como uma enumeração e pode definir que há cinco valores para COR: Vermelho, Azul, Verde, Branco e Preto. A sintaxe de constantes enumeradas é escrever a palavra-chave enum seguida pelo nome do tipo, uma chave de abertura, cada um dos valores aceitos separados por uma vírgula e finalmente uma chave de fechamento e um ponto-e-vírgula. Veja um exemplo: enum COR {Vermelho, Azul, Verde, Branco, Preto}; Essa instrução executa duas tarefas: 1. Torna COR o nome de uma enumeração, ou seja, um novo tipo. 2. Torna Vermelho uma constante simbólica com o valor 0, Azul com valor 1, e assim por diante. Todas as constantes enumeradas têm um valor inteiro. Se você não especificar de outra maneira, a primeira constante terá o valor de 0 e os demais itens serão contados na ordem crescente a partir daí. No entanto, qualquer uma das constantes por ser inicializada com um determinado valor, e as que ainda não tiverem sido inicializadas serão incrementadas com base no valor que o anteceder. Desse modo, se você digitar: enum COR {Vermelho=100, Azul, Verde=500, Branco, Preto=700}; então Vermelho terá o valor 100; Azul, o valor 101; Verde, o valor 500; Branco, o valor 501; e Preto, o valor 700. Neste artigo você aprendeu a declarar e a definir variáveis e constantes e a atribuir-lhes valores. Nos próximos artigos estaremos utilizando os conhecimentos adquiridos na construção de outros módulos interessantes. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 17 O que é um programa em C++ Introdução As partes de um programa simples Antes de nos aprofundarmos nos detalhes da C++, como classes e variáveis, vamos reservar um tempinho para termos uma noção do processo de montagem de um programa. O programa simples apresentado no primeiro artigo, Hello.cpp, tem muitas partes interessantes. Agora vamos ver o programa em detalhes. A listagem abaixo reproduz a versão original do Hello.cpp. 1: #include <iostream> 2: 3: using namespace std; 4: 5: int main() 6: { 7: cout << "Hello World!\n"; 8: return 0; 9: } Output: Hello World! Na linha 1, o arquivo iostream é incluído no arquivo. Para o compilador é como se você tivesse digitado todo o conteúdo do arquivo iostream na abertura do Hello.cpp. Examinando o #include caractere por caractere O primeiro caractere é o símbolo "#", que é um sinal para o pré-processador. O pré- processador tem como função ler o código-fonte à procura de linhas que comecem com o símbolo # e, quando o localiza, modifica o código de acordo com a instrução do pré- processador. Include é uma instrução do pré-processador que diz o seguinte: "O que vem a seguir é um nome de arquivo. Localize o arquivo e leia-o agora mesmo". Os sinais <> em torno do nome do arquivo dizem a seguinte informação para o pré-processador: "Procure este arquivo nos lugares de sempre". Se o seu compilador estiver devidamente configurado, os <> farão com que o pré-processador procure o arquivo iostream no diretório que armazena todos os arquivos de cabeçalho do seu compilador. O arquivo iostream (Input-Output-STREAM) é usado pelo cout, que remete o texto para a tela. Na prática, a linha 1 incluir o arquivo iostream no programa, como se você mesmo o tivesse digitado. DICA 1: Porque no código tem <iostream> e não <iostream>? Bem no C++ atual, o arquivo de cabeçalho não contêm a extensão .H. Eram utilizados na versão do C++ antigo. DICA 2: Porque utilizar "<>" e ""? Bem caso você utilize "" o compilador buscará somente no path onde está o seu código. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 18 Análise linha a linha A linha 3 indica queestamos utilizando o namespace STD. Um namespace permite dividir um programa em regiões que mantêm suas próprias tabelas de símbolos, estas regiões são chamadas de regiões declarativas. A idéia por trás dos namespaces é evitar que nomes declarados em um programa entrem em conflito com outros nomes definidos no mesmo programa, uma vez que os nomes de um namespace são independentes daqueles de outros. O que estamos realmente fazendo na linha 3 é importar os símbolos do namespace STD para o espaço de nomes global. Quando importamos um símbolo para o espaço de nomes global ele fica disponível a todo o código do programa. Se não importarmos um símbolo e outro namespace, para referenciá-lo precisaremos qualifica-lo com seu namespace da seguinte maneira: namespace::nome. Por exemplo: std::cout. A linha 5 inicia o programa propriamente dito com uma função cujo nome é main(). Todos os programas em C++ têm uma função main(). Em geral, uma função é um bloco de código que executa uma ou mais ações. As funções são invocadas (alguns programadores preferem dizer que são chamadas) por outras funções, mas main() é especial. Quando o seu programa é iniciado, main() é chamada automaticamente. main(), como todas as outras funções deve afirmar o tipo de valor que retornará. Mais uma vez, main() é especial, pois retornará sempre int . Todas as funções começam com uma chave de abertura ({) e terminam com uma chave de fechamento (}). As chaves da função main() encontram-se nas linhas 6 e 9. Tudo o que estiver entre as chaves de abertura e de fechamento será considerado como parte integrante da função. cout é utilizado para imprimir uma mensagem na tela. Os dois caracteres finais, "\n", fazem com que cout coloque uma nova linha depois das palavras "Hello World!". Na linha 8 chamamos o return 0. Ela retorna o controle para o sistema operacional. A função main() termina na linha 9, com a chave de fechamento. Comentários Um comentário é um texto adicionado para explicar (para você ou outros programadores) o que está acontecendo com seu código. O comentário não tem efeito; serve apenas como documentação. Há dois tipos de comentários em C++. O comentário de barra dupla (//), que chamaremos de comentário no estilo C++, manda o compilador ignorar tudo que vem depois das barras até o final da linha. O comentário de barra-asterisco (/*), no estilo C, manda o compilador ignorar tudo o que vem depois até que uma marca de comentário de asterisco-barra (*/) seja detectada. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 19 Funções Embora main() seja uma função incomum, pois é chamada automaticamente quando seu programa é inicializado. Todas as outras funções são chamadas pelo seu próprio código à medida que o programa é executado. Um programa é executado linha a linha na ordem em que aparece no código-fonte, até uma função ser chamada. Em seguida, o programa desvia para executar a função. Quando termina a função, ele retorna o controle para a linha posterior à função chamadora. Quando um programa precisa executar um serviço, ele chama uma função para executa-lo e, quando a função retorna, o programa volta para o ponto imediatamente anterior à função chamada. As funções retornam um valor ou retornam um void, o que significa que não retornam nada. Observe que main() sempre retorna um int. Uma função que inclui dois inteiros deve retornar a soma e, dessa forma, seria definida para retornar um valor inteiro. Uma função que se restringe a imprimir uma mensagem não tem nada a retornar e, portanto, seria declarada para retornar nula. As funções consistem em um cabeçalho e um corpo. O cabeçalho consiste, por sua vez, no tipo de retorno, no nome da função e nos parâmetros dessa função. O cabeçalho também é definido como protótipo da função. Os parâmetros de uma função permitem que os valores sejam passados para a função. Assim, se a função fosse adicionar dois números, os números seriam os parâmetros da função. Veja um exemplo abaixo: int Sum(int a, int b) Um parâmetro é uma declaração do tipo de valor que será passado; o verdadeiro valor passado pelo função chamadora é chamada de argumento. Muitos programadores usam esses dois termos, parâmetros e argumentos, com sinônimos. O nome da função e seus parâmetros (que é o cabeçalho sem valor de retorno) é chamado de assinatura da função. O corpo de uma função consiste em uma chave de abertura, nenhuma ou alguma(s) instrução(ões) e uma chave de fechamento. As instruções constituem o trabalho da função. Uma função pode retornar um valor usando uma instrução return. Essa instrução fará com que a função seja fechada. Se você não colocar uma instrução return na sua função, ela automaticamente retornará um void no final da função. O valor retornado deve ser do tipo declarado no cabeçalho da função. Abaixo segue um exemplo que demonstra uma função que utiliza dois parâmetros inteiros e retorna um valor inteiro. Por enquanto não vamos nos preocupar com a sintaxe ou o modo como os valores inteiros funcionam. //Listagem 2.2 Func.cpp demonstra uma função simples. #include <iostream> using namespace std; int Add (int x, int y) { cout << "Em Add(), recebeu " << x << " e " << y << "\n"; return (x+y); } ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 20 int main() { cout << "Estou em main()!\n"; int a, b, c; cout << "Digite dois números: "; cin >> a; cin >> b; cout << "\nChamando Add()\n"; c=Add(a,b); cout << "\nDe volta para main().\n"; cout << "c foi definido como "<< c; cout << "\nSaindo...\n\n"; return 0; } A função Add() é definida na linha 3. O programa em si começa na linha 12, na qual ele imprime uma mensagem. O programa solicita dois números para o usuário (linhas 14 e 15). O usuário digita cada número, separado por um espaço, e em seguida pressiona <Enter>. Main() passa os dois números digitados pelo usuário como argumentos para a função Add() na linha 18. O processamento desvia para a função Add(), que começa na linha 3. Os parâmetros a e b são impressos e, em seguida, adicionados. O resultado é retornado na linha 7 e a função retorna. Nas linhas 15 e 16, o objeto cin é usado para obter um número para as variáveis A e B, e cout é usado para remeter os valores para a tela. As variáveis e outros aspectos desse programa serão depurados nos próximos artigos. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 21 Estrutura de um programa em C++ Provavelmente a melhor maneira de começar a aprender uma linguagem de programação é com um programa. Então aqui está nosso primeiro programa: // meu primeiro programa em C++ #include <iostream> int main () { cout << "Ola Mundo!\n"; return 0; } Ola Mundo! O lado esquerdo mostra o código-fonte de nosso primeiro programa, no qual podemos nomeá- lo, por exemplo, como hiworld.cpp. O lado direito mostra o resultado do programa depois de compilado e executado. A maneira de editar e compilar um programa depende do compilador que você estiver usando. Dependendo se tem ou não uma interface de desenvolvimento e da versão. Consulte o manual ou a ajuda inclusa no seu compilador se tiver dúvidas em como compilar um programa de console em C++. O programa anterior é o primeiro programa que a maioria dos aprendizes codificam, e o resultado é a impressão da frase "Ola Mundo!" na tela. É um dos programas mais simples que pode ser codificado em C++, mas já inclui os componentes básicos que todos os programas em C++ possuem. Nós iremos analisá-los um por um: // meu primeiro programa em C++ Essa é uma linha de comentário. Todas as linhas que iniciarem com duasbarras (//) são consideradas comentários e não tem nenhum efeito no comportamento do programa. Elas podem ser usadas pelo programador para incluir explicações ou observações curtas dentro do próprio código. Nesse caso, essa linha é uma breve descrição do que o nosso programa faz. #include <iostream> Comandos que começam um sinal de numeração (#) são diretivas do pré-processador. Elas não são linhas de código executáveis, mas indicações para o compilador. Nesse caso, o comando #include <iostream> diz ao pré-processador do compilador para incluir o arquivo de cabeçalho padrão iostream. Esse arquivo específico inclui as declarações da biblioteca básica de entrada-saída do C++, e está sendo usado porque suas funcionalidades serão usadas mais tarde nesse programa. int main() Essa linha corresponde ao início da declaração da função main. A função main é o ponto pelo qual todos os programas em C++ iniciam a execução. Não faz diferença se estiver no início, no fim, ou no meio do código – seu conteúdo é sempre o primeiro a ser executado ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 22 quando um programa inicia. Além disso, pelo mesmo motivo, é obrigatório que todos os programas em C++ tenham uma função main. Depois de main há um par de parênteses () porque é uma função. Em C++ todas as funções são seguidas por um par de parênteses () que, opcionalmente, podem incluir argumento dentro deles. O conteúdo da função main segue imediatamente após sua declaração formal e é coberto entre chaves ({}), como em nosso exemplo. cout << "Ola Mundo!"; Essa instrução faz a coisa mais importante nesse programa. cout é o dispositivo de saída padrão no C++ (geralmente o monitor), e a frase completa insere uma sequência de caracteres ("Ola Mundo!" nesse caso) no dispositivo de saída (o monitor). cout é declarado no arquivo de cabeçalho iostream, então pra que seja possível utiliza-lo, esse arquivo precisa ser incluso. Note que a frase termina com um caractere ponto-e-vírgula (;). Esse caractere significa o fim da instrução e precisa ser incluído após toda instrução em qualquer programa em C++ (um dos erros mais comuns dos programadores de C++ é devido ao fato de esquecerem de incluir um ponto-e-vírgula ; no final de cada instrução). return 0; A instrução return faz com que a função main() termine e retorne o código que segue a instrução, nesse caso o 0. Essa é a maneira mais comum de terminar um programa que não encontrou nenhum erro durante sua execução. Como você verá em exemplos seguintes, todos os programas em C++ terminam com um comando parecido com esse. Sendo assim, você deve ter notado que nem todas as linhas desse programa realizaram uma ação. Havia linhas contendo apenas comentários (aquelas iniciadas por //), linhas com instruções para o pré-processador do compilador (aquelas iniciadas por #), também haviam linhas que iniciavam a declaração de uma função (nesse caso, a função main) e, finalmente linhas com instruções (como a chamada à cout <<), todas essas últimas foram incluídas dentro do bloco delimitado pelas chaves ({}) da função main. O programa foi estruturado em linhas diferentes para que seja mais fácil lê-lo, mas isso não é obrigatório. Por exemplo, ao invés de: int main () { cout << " Ola Mundo! "; return 0; } poderíamos ter escrito: int main () { cout << " Ola Mundo! "; return 0; } em apenas uma linha e isso teria exatamente o mesmo significado. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 23 Em C++, a separação entre instruções é especificada com um ponto-e-vírgula (;) no final de cada instrução. A divisão do código em linhas diferentes serve somente para torná-lo mais legível e esquemático para seres humanos. Aqui está um programa com mais instruções: // meu segundo programa em C++ #include <iostream> int main () { cout << "Ola Mundo! "; cout << "Eu sou um programa em C++"; return 0; } Ola Mundo! Eu sou um programa em C++ Nesse caso nós usamos o método cout << duas vezes em duas instruções diferentes. Mais uma vez, a separação do código em linhas diferentes só foi feita para dar maior legibilidade ao programa, já que main poderia ter sido definida perfeitamente assim: int main () { cout << " Ola Mundo! "; cout << " Eu sou um programa em C++ "; return 0; } Nós também poderíamos dividir o código em mais linhas se considerássemos conveniente: int main () { cout << "Ola Mundo!"; cout << "Eu sou um programa em C++"; return 0; } E o resultado teria sido exatamente o mesmo dos exemplos anteriores. As diretivas de pré-processador (aquelas que começam por #) estão fora dessa regra já que elas não são instruções verdadeiras. Elas são linhas lidas e descartadas pelo pré-processador e não produzem nenhum código. Essas precisam ser especificadas em suas próprias linhas e não requerem a inclusão de um ponto-e-vírgula (;) no final. Comentários. Comentários são pedaços de código-fonte descartados do código pelo compilador. Eles não fazem nada. O objetivo deles é somente permitir que o programador insira notas ou descrições dentro do código-fonte. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 24 O C++ suporta duas maneiras para inserir comentários: // comentário de linha /* comentário de bloco */ O primeiro deles, o comentário de linha, descarta tudo desde onde o par de barras (//) é achado até o final daquela mesma linha. O segundo deles, o comentário de bloco, descarta tudo entre os caracteres /* e a próxima aparição dos caracteres */, com a possibilidade de incluir diversas linhas. Nós iremos adicionar comentários ao nosso segundo programa: /* meu segundo programa em C++ com mais comentários */ #include <iostream> int main () { cout << "Ola Mundo! "; //diz Ola Mundo! cout << "Sou programa em C++"; //diz Sou programa em C++ return 0; } Ola Mundo! Sou programa em C++ Se você incluir comentários dentro do código-fonte de seus programas sem usar as combinações de caracteres //, ou /* e */, o compilador ira entendê-los como se fossem instruções C++ e, na maioria das vezes, irá causar um ou mais mensagens de erro. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 25 Operadores. Agora que você já conhece a existência de variáveis e constantes, podemos começar a utilizá- las. Para isso, C++ provê os operadores, no qual nessa linguagem é um conjunto de palavras- chave e símbolos que não fazem parte do alfabeto, mas estão disponíveis em todos os teclados. É importante conhecê-los já que eles formam a base da linguagem C++. Você não precisa memorizar todo o conteúdo dessa página, pois os detalhes são dados somente para servirem como uma futura referência caso você precise. Atribuição (=). O operador de atribuição serve para atribuir um valor a uma variável. a = 5; atribui o valor inteiro 5 para a variável a. A parte da esquerda do operador = é conhecida como lvalue (left value – valor da esquerda) e a da direita como rvalue (right value – valor da direita). lvalue precisa sempre ser uma variável, enquanto o lado direito pode ser uma constante, uma variável, o resultado de uma operação ou qualquer combinação entre eles. É preciso enfatizar que a operação de atribuição sempre funciona da direita para a esquerda e nunca o oposto. a = b; atribui para a variável a (lvalue) o valor contido na variável b (rvalue) independentemente do valor que estiver guardado em a nesse momento. Considere também que estamos apenas atribuindo o valor de b para a e que uma mudança futura em b não afetará o valor de a. Por exemplo,se usarmos esse código (com a evolução das variáveis em cor verde): int a, b; // a:? b:? a = 10; // a:10 b:? b = 4; // a:10 b:4 a = b; // a:4 b:4 b = 7; // a:4 b:7 isso nos dará o resultado que o valor contido em a é 4 e o valor contido em b é 7. A modificação final de b não afetou a, mesmo sabendo que havíamos declarado a = b; (regra da direita-para-esquerda). Uma propriedade que C++ tem sobre outras linguagens de programação é que a operação de atribuição pode ser usada como rvalue (ou parte de um rvalue) para outra atribuição. Por exemplo: a = 2 + (b = 5); ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 26 é equivalente a: b = 5; a = 2 + b; isso significa: primeiro atribui 5 para a variável b e então atribui para a o valor 2 mais o resultado a atribuição anterior de b (que é 5), deixando a com um valor final de 7. Assim, a seguinte expressão também é válida em C++: a = b = c = 5; atribui 5 às três variáveis: a, b e c. Operadores aritméticos ( +, -, *, /, % ) As cinco operações aritméticas suportadas pela linguagem são: + Adição - Subtração * Multiplicação / Divisão % Módulo Operações de adição, subtração, multiplicação, e divisão não é um desafio de entendimento para você, já que elas correspondem literalmente com seus respectivos operadores matemáticos. O único que pode não ser conhecido por você é o módulo, especificado com o sinal de porcentagem (%). Módulo é a operação que dá o resto de uma divisão de dois valores inteiros. Por exemplo, se escrevermos a = 11 % 3; a variável a irá conter 2 como resultado já que 2 é o resto da divisão de 11 por 3. Operadores de atribuição compostos (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=) Uma característica de atribuição em C++ que contribui para sua fama de boa escrita de linguagem são os operadores de atribuição compostos (+=, -=, *= e /= entre outros), que permitem modificar o valor de uma variável com um dos operadores básicos: value += increase; é equivalente a value = value + increase; a -= 5; é equivalente a a = a - 5; a /= b; é equivalente a a = a / b; price *= units + 1; é equivalente a price = price * (units + 1); e o mesmo para todas as outra operações. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 27 INCREMENTO E DECREMENTO. Outro exemplo de linguagem econômica ao digitar código são os operadores de incremento (++) e os operadores de decremento (--). Eles aumentam ou reduzem 1 ao valor guardado na variável. São equivalentes a +=1 e a -=1, respectivamente. Assim: a++; a+=1; a=a+1; são todos equivalentes e suas funcionalidades são incrementar 1 no valor de a. Sua existência é devido ao fato de que nos primeiros compiladores de C, os três exemplos anteriores produziam código executável diferente de acordo com qual deles fosse usado. Hoje em dia esse tipo de otimização de código é geralmente feito automaticamente pelo compilador. Uma característica desse operador é que pode ser usado tanto como prefixo ou como sufixo. Isso significa que pode ser escrito antes do identificador da variável (++a) ou depois (a++). Embora em expressões simples, como a++ ou ++a, eles tenham exatamente o mesmo significado, em outras operações no qual o resultado da operação de incremento ou decremento é avaliado como outra expressão eles podem ter uma diferença importante em seus significados: em caso do operador de incremento ser usado como prefixo (++a), o valor é incrementado antes de a expressão ser avaliada e, sendo assim, o valor incrementado é considerado na expressão; em caso de ser usado como sufixo (a++), o valor guardado em a é incrementado depois de ter sido avaliada e, sendo assim, o valor guardado antes da operação de incremento é avaliada na expressão. Note a diferença: Exemplo 1 Exemplo 2 B=3; A=++B; // A é 4, B é 4 B=3; A=B++; // A é 3, B é 4 No Exemplo 1, B é incrementado antes que seu valor seja copiado para A. Enquanto no Exemplo 2, o valor de B é copiado para A e B é incrementado depois. Operadores relacionais ( ==, !=, >, <, >=, <= ) Para que seja possível avaliar uma comparação entre duas expressões, podemos usar os operadores relacionais. Conforme especificado no padrão ANSI-C++, o resultado de uma operação relacional é um valor bool que pode ser somente true ou false, de acordo com o resultado da comparação. Nós podemos querer comparar duas expressões, por exemplo, para saber se elas são iguais ou se uma delas é maior que a outra. Aqui está uma lista com os operadores relacionais que podem ser utilizados no C++: ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 28 == Igual a != Diferente de > Maior que < Menor que >= Maior ou igual a <= Menor ou igual a Aqui você tem alguns exemplos: (7 == 5) Retornaria false. (5 > 4) Retornaria true. (3 != 2) Retornaria true. (6 >= 6) Retornaria true. (5 < 5) Retornaria false. é claro que, ao invés de usar somente constantes numéricas, podemos usar qualquer expressão válida, incluindo variáveis. Suponha que a=2, b=3 e c=6, (a == 5) Retornaria false. (a*b >= c) Retornaria true já que (2*3 >= 6) é verdadeiro. (b+4 > a*c) Retornaria false já que (3+4 > 2*6) é falso. ((b=2) == a) Retornaria true. Fique atento: o operador = (um sinal de igual) não é o mesmo que o operador == (dois sinais de igual), o primeiro é um operador de atribuição (atribui o lado direito da expressão à variável da esquerda) e o outro (==) é um operador relacional de igualdade que compara se as duas expressões nos dois lados do operador são iguais entre si. Assim, na última expressão ((b=2) == a), nós atribuímos primeiramente o valor 2 a b e então o comparamos com a, que também guarda o valor 2, então o resultado da operação é true. Em muitos compiladores feitos antes da publicação do padrão ANSI-C++, assim como na linguagem C, as operações relacionais não retornavam um valor bool true ou false, ao invés disso, retornavam um int como resultado com um valor 0 para representar "false" e um valor diferente de 0 (geralmente 1) para representar "true". Operadores lógicos ( !, &&, || ). O operador ! é equivalente à operação boleana NOT, possui somente um operando localizado à direita, e a única coisa que faz é inverter o valor desse operando, gerando false se o operando for true e true se o operando for false. É o mesmo que dizer que retorna o resultado oposto da avaliação do operando. Por exemplo: ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 29 !(5 == 5) Retorna false porque a expressão à direita (5 == 5) seria true. !(6 <= 4) Retorna true porque (6 <= 4) seria false. !true Retorna false. !false Retorna true. Os operadores lógicos && e || são usados ao avaliar duas expressões para obter um resultado único. Eles correspondem às operações lógicas boleanas AND e OR respectivamente. Seus resultados dependem da relação entre seus dois operandos: Primeiro Operando a Segundo Operando b resultado a && b resultado a || b true true true true true false false true false true false true false false false false Por exemplo: ( (5 == 5) && (3 > 6) ) retorna false ( true && false ). ( (5 == 5) || (3 > 6)) retorna true ( true || false ). Operador condicional ( ? ). O operador condicional avalia uma expressão e retorna um valor diferente de acordo com a expressão avaliada, dependendo se for true ou false. Seu formato é: condição ? result1 : result2 se condição for true a expressão retornará result1, caso contrário retornará result2. 7==5 ? 4 : 3 retorna 3 pois 7 não é igual a 5. 7==5+2 ? 4 : 3 retorna 4 pois 7 é igual a 5+2. 5>3 ? a : b retorna a, pois 5 é maior que 3. a>b? a : b retorna o maior deles, a ou b. Operadores de Bits ( &, |, ^, ~, <<, >> ). Operadores de Bits modificam as variáveis considerando os bits que representam os valores que elas guardam, ou seja, suas representações binárias. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 30 op asm Descrição & AND AND lógico | OR OR lógico ^ XOR eXclusive OR lógico ~ NOT Complemento de um (inversão de bit) << SHL Deslizar à esquerda >> SHR Deslizar à direita Operadores de conversão de tipos explícita Operadores de conversão de tipos nos permitem converter um dado de um determinado tipo para outro. Há diversas maneiras para se fazer isso em C++, e a mais popular e compatível com a linguagem C, é preceder a expressão a ser convertida pelo novo tipo colocado entre parênteses (): int i; float f = 3.14; i = (int) f; O código anterior converte um número real 3.14 para um valor inteiro (3). Aqui, o operador de conversão de tipos foi (int). Outra maneira de se fazer isso em C++ é usar a forma de construtor: precedendo a expressão a ser convertida pelo tipo e colocando a expressão entre parênteses: i = int ( f ); As duas maneiras de conversão de tipos são válidas em C++. Além disso, o ANSI-C++ adicionou novos operadores de conversão de tipos mais específicos para programação orientada a objetos. sizeof() Esse operador aceita um parâmetro, que pode ser tanto um tipo de variável como uma própria variável, e retorna o tamanho daquele tipo ou objeto em bytes: a = sizeof (char); Isso irá retornar 1 a a porque char é um tipo com tamanho de 1 byte. O valor retornado por sizeof é uma constante, então é sempre determinado antes da execução do programa. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 31 Outros operadores Mais a frente nesse tutorial iremos ver mais alguns operadores, como os que se referenciam a ponteiros ou os específicos para programação orientada a objetos. Cada um é tratado em sua seção respectiva. Prioridade de operadores Ao se fazer expressões complexas com diversos operandos, podemos ter algumas dúvidas sobre qual operando é avaliado antes e qual é avaliado depois. Por exemplo, nessa expressão: a = 5 + 7 % 2 podemos questionar se realmente significa: a = 5 + (7 % 2) com resultado 6, ou a = (5 + 7) % 2 com resultado 0 A resposta correta é a primeira das duas expressões, com resultado 6. Há uma ordem estabelecida com a prioridade de cada operador, e não somente os aritméticos (aqueles cuja preferência possamos já saber devido a matemática) mas para todos os operadores que possam aparecer em C++. Da prioridade maior para a menor, a ordem é a seguinte: Prioridade Operador Descrição Associatividade 1 :: Escopo Esquerda 2 () [ ] -> . sizeof Esquerda ++ -- Incremento/Decremento ~ Complemento de um (bit) ! NOT unário & * Referência e Apontamento (ponteiros) (type) Conversão de tipo 3 + - Sinal de menos unário Direita 4 * / % Operações aritméticas Esquerda 5 + - Operações aritméticas Esquerda 6 << >> Deslizamento de bits Esquerda 7 < <= > >= Operadores relacionais Esquerda 8 == != Operadores relacionais Esquerda 9 & ^ | Operadores de bits Esquerda 10 && || Operadores lógicos Esquerda 11 ?: Condicional Direita 12 = += -= *= /= %= >>= <<= &= ^= |= Atribuição Direita 13 , Vírgula, Separador Esquerda ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 32 Associativdade define –caso haja diversos operadores do mesmo nível de prioridade- qual será avaliado primeiro, o que está mais à direita ou o que está mais à esquerda. Todos esses níveis de precedência para operadores podem ser manipulados ou se tornarem mais legíveis com o uso de parênteses ( e ), como nesse exemplo: a = 5 + 7 % 2; pode ser escrito como: a = 5 + (7 % 2); ou a = (5 + 7) % 2; de acordo com a operação que queremos realizar. Então caso você queira escrever uma expressão complicada e não tem certeza dos níveis de precedência, sempre inclua parênteses. Provavelmente também será um código mais legível. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 33 Estruturas de controle. Um programa geralmente não é limitado a uma sequência linear de instruções. Durante o processo, pode bifurcar, repetir código, ou tomar decisões. Por esse motivo, C++ provê estruturas de controle que servem para especificar o que precisa ser feito para executar nosso programa. Com a introdução das sequências de controle, teremos que introduzir um novo conceito: o bloco de instruções. Um bloco de instruções é um grupo de instruções separado por pontos- e-vírgulas (;), mas agrupados em um bloco delimitado por sinais de chaves: { e }. A maioria das estruturas de controle que veremos nessa seção permite um conteúdo genérico como parâmetro, isso se refere a uma única instrução ou a um bloco de instruções, como quisermos. Se quisermos que o conteúdo seja uma única instrução, não precisamos colocá-la entre chaves ({}). Se quisermos que o conteúdo seja mais que uma única instrução, precisamos colocá-la entre chaves ({}) formando um bloco de instruções. Estrutura condicional: if e else É usada para executar uma instrução ou bloco de instruções somente se uma condição for satisfeita. Sua forma é: if (condição) conteúdo onde condição é a expressão que está sendo avaliada. Se a condição for true, o conteúdo é executado. Se for false, o conteúdo é ignorado (não é executado) e o programa continua na próxima instrução depois da estrutura condicional. Por exemplo, o seguinte fragmento de código imprime x e 100 somente se o valor guardado na variável x for igual a 100: if (x == 100) cout << "x e 100"; Se quisermos que mais de uma única instrução seja executada no caso da condição ser true, precisamos especificar um bloco de instruções usando chaves { }: if (x == 100) { cout << "x e "; cout << x; } ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 34 Podemos especificar também o que queremos que aconteça caso a condição não seja satisfeita usando a palavra-chave else. Sua forma usada em conjunto com if é: if (condição) conteúdo1 else conteúdo2 Por exemplo: if (x == 100) cout << "x e 100"; else cout << "x nao e 100"; imprime na tela x e 100 se x for igual a 100, mas se não for –e somente se não for- imprime x não e 100. As estruturas if + else podem ser concatenadas com a intenção de verificar um intervalo de valores. O seguinte exemplo mostra seu uso dizendo se o valor presente guardado em x é positivo, negativo ou nenhum dos anteriores, ou seja, igual a zero. if (x > 0) cout << "x e positivo"; else if (x < 0) cout << "x e negativo"; else cout << "x e 0"; Lembre-se que caso queiramos que mais de uma única instrução seja executada, precisamos agrupá- las em um bloco de instruções usando chaves { }. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 35 Estruturas repetitivas ou loops Loops tem como objetivo repetir um conteúdo um certo número de vezes ou enquanto uma condição seja satisfeita. O LOOP WHILE. Seu formato é: while (expressão) conteúdo e sua função é simplesmente repetir o conteúdo enquanto a expressão for verdadeira. Por exemplo, iremos fazer um programa que faz uma contagem regressiva usando um loop while: // contagem regressiva customizada usando while #include <iostream> int main () { int n; cout << "Entre com o numero inicial "; cin >> n; while (n>0) { cout << n << ", "; --n;} cout << "FOGO!"; return 0; } Entre com o numero inicial > 8 8, 7, 6, 5, 4, 3, 2, 1, FOGO! Quando o programa inicia, é pedido ao usuário que insira um número inicial para a contagem regressiva. Então quando o loop while inicia, se o valor entrado pelo usuário satisfizer a condição n>0 (de que n é maior que 0 ), o bloco de instruções seguinte será executado um número indefinido de vezes enquanto a condição (n>0) permanecer verdadeira. Todo o processo no programa acima pode ser interpretado de acordo com o seguinte script: iniciando em main: • 1. O usuário atribui um valor para n. • 2. A instrução while checa se (n>0). Nesse ponto há duas possibilidades: o true: executa o conteúdo (passo 3,) o false: pula o conteúdo. O programa segue para o passo 5.. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 36 • 3. Executa o conteúdo: cout << n << ", "; --n; (imprime n na tela e decrementa 1 de n). • 4. Fim do bloco. Retorna automaticamente ao passo 2. • 5. Continua o programa depois do bloco: imprime FOGO! e termina o programa. Precisamos considerar que o loop precisa terminar alguma hora, sendo assim, dentro do bloco de instruções (o conteúdo do loop) precisamos prover algum método que força a condição a se tornar falsa em algum momento, ou em caso contrário, o loop continuará se repetindo para sempre. Nesse caso nós incluímos --n; que faz com que a condição se torne false depois de algumas repetições de loop: quando n se torna 0, que é quando nossa contagem regressiva termina. É claro que essa é uma ação bastante simples para nosso computador que toda a contagem regressiva é feita de maneira instantânea sem um atraso prático entre os números. O LOOP DO-WHILE. Formato: do conteúdo while (condição); Sua funcionalidade é exatamente a mesma que a do loop while, com exceção que a condição do do-while é avaliada depois da execução da conteúdo ao invés de antes, garantindo pelo menos uma execução do conteúdo mesmo se a condição nunca for satisfeita. Por exemplo, o seguinte programa repete qualquer número que você entre, até que você entre 0. // repetidor de número #include <iostream> int main () { unsigned long n; do { cout << "Entre com um numero (0 para sair): "; cin >> n; cout << "Você entrou o numero: " << n << "\n"; } while (n != 0); return 0; } Entre com um numero (0 para sair): 12345 Você entrou o numero: 12345 Entre com um numero (0 para sair): 160277 Você entrou o numero: 160277 Entre com um numero (0 para sair): 0 Você entrou o numero: 0 ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 37 O loop do-while geralmente é usado quando a condição que determina se chegou ao fim está dentro do conteúdo do loop, como no caso anterior, no qual a entrada do usuário dentro do bloco de instruções é o que determinar o fim do loop. Se você nunca entrar com o valor 0 no exemplo anterior, o loop não terminará nunca. O LOOP FOR. Seu formato és: for (inicialização; condição; incremento) conteúdo; e sua principal função é repetir o conteúdo enquanto a condição permanecer verdadeira, como no loop while. Mas, além disso, o for provê lugares para especificar a instrução de inicialização e a instrução de incremento. Então esse loop é projetado especialmente para realizar uma ação repetitiva com um contador. Funciona da seguinte maneira: 1, a inicialização é executada. Geralmente é a configuração de um valor inicial para um contador. É executado somente uma vez. 2, a condição é checada, se for true o loop continua, caso contrário o loop termina e o conteúdo é pulado. 3, o conteúdo é executado. Como sempre, pode ser tanto uma única instrução ou um bloco de instruções colocadas entre chaves { }. 4, finalmente, o que quer que seja que estiver especificado no campo de incremento, é executado e o loop volta ao passo 2. Aqui está um exemplo de contagem regressiva usando o loop for. // ccontagem regressiva usando um loop for #include <iostream> int main () { for (int n=10; n>0; n--) { cout << n << ", "; } cout << "FOGO!"; return 0; } 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FOGO! Os campos de inicialização e de incremento são opcionais. Eles podem ser evitados, mas não os pontos-e-vírgulas dentre eles. Por exemplo, poderíamos escrever: for (;n<10;) se não quiséssemos especificar nenhuma inicialização nem incremento; ou for (;n<10;n++) se quiséssemos incluir um campo de incremento, mas não uma inicialização. ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 38 Opcionalmente, usando uma vírgula (,), podemos especificar mais de uma instrução em qualquer dos campos inclusos em um loop for, como na inicialização, por exemplo. A vírgula (,) é um separador de instrução, e serve para separar mais de uma instrução quando somente uma instrução é esperada. Por exemplo, suponha que queiramos inicializar mais de uma variável em nosso loop: for ( n=0, i=100 ; n!=i ; n++, i-- ) { // qualquer coisa aqui... } O loop irá executar 50 vezes caso nenhuma das variáveis n ou i sejam modificadas dentro do loop: n começa com 0 e i com 100, a condição é (n!=i) (que n não seja igual a i). Devido ao fato de n ser incrementado por um e i decrementado por um, a condição do loop se tornará false depois do 50° loop, quando ambas n e i forem iguais a 50. Bifurcação de controles e pulos. A INSTRUÇÃO BREAK. Usando break, podemos deixar um loop mesmo que a condição para o fim não seja satisfeita. Pode ser usado para terminar um loop infinito, ou forçá-lo a terminar antes de seu término natural. Por exemplo, iremos terminar a contagem regressiva antes que termine naturalmente (uma falha no mecanismo talvez): // exemplo de loop com break #include <iostream> int main () { int n; for (n=10; n>0; n--) { cout << n << ", "; if (n==3) { cout<<"contagem regressiva abortada!"; break; } } return 0; } 10, 9, 8, 7, 6, 5, 4, 3, contagem regressiva abortada! ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 39 A INSTRUÇÃO CONTINUE. A instrução continue faz com que o programa ignore o resto do loop na iteração presente como se o final do bloco de conteúdo tivesse sido alcançado, fazendo com que vá para a próxima iteração. Por exemplo, iremos ignorar o número 5 em nossa contagem regressiva: // exemplo de loop com continue #include <iostream> int main () { for (int n=10; n>0; n--) { if (n==5) continue; cout << n << ", "; } cout << "FOGO!"; return 0; } 10, 9, 8, 7, 6, 4, 3, 2, 1, FOGO! A INSTRUÇÃO GOTO. Permite fazer um pulo absoluto para outro ponto do programa. Você deve usar essa característica com cuidado há que sua execução ignora qualquer tipo de limitação de aninhamento. O ponto de destino é identificado por uma etiqueta, no qual é usado como argumento para a instrução goto. Uma etiqueta é feita de um identificador válido seguido por dois pontos (:). Essa instrução não tem uma utilidade concreta em programação estruturada ou orientada a objetos além das que o fãs de programação de baixo nível possam encontrar para ela. Por exemplo, aqui está nosso loop de contagem regressiva usando goto: // exemplo de loop com goto #include <iostream> int main () { int n=10; loop: cout << n << ", "; n--; if (n>0) goto loop; cout << "FOGO!"; return 0; } 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FOGO! ALGORITMOS E PROGRAMAÇÃO Professora: GELLARS TAVARES 40 A FUNÇÃO EXIT. exit é uma função definida
Compartilhar