Fazer download em pdf
Fazer download em pdf
Você está na página 1de 25
Linguagem C++ - Notas de Aula Prof. Armando Luiz N. Delgado bbaseado em revisio sobre material de Prof Carmem Hara e Prof. Wagner Zola Margo 2018 Parte I Programacio Basica em C++ Estas notas de aula apresentam os conceitos basicos da Linguagem C++ e se propde a abordar apenas 0 que é importante para a compreensio basica de programas de computadores. Assim, conceitos de C++ como obje- tos, classes, templates ¢ outros conceitos relacionados & programagao orientada a objetos nao sao abordados aq 1 Programas C++ Essencialmente, um programa C++ consiste de uma ou mais partes chamadas fungdes!. Além disso, um programa em C++ deve definir pelo menos uma fungao chamada main. Esta fungdo marca o ponto de inicio de execucio do programa Programas C+ tem a seguinte estrutura geral: #include using namespace std: definicdo de constantes fungées int main() { declaragao de variéveis sentengas 1.1 Sentencas: simples ¢ compostas Cada instrugdo em C++ € chamada de sentenga. Sentengas simples s4o terminadas com um ponto ¢ virgula, Usando chaves, podemos agrupar sentengas em blocos, chamados de sentengas compostas Exemplos de sentengas incluem: © Simples: ‘© Composta: © corpo da fungéo_main() é um exemplo de sentenga composta, 1.2. Variaveis em C++ Uma varidvel 6 uma informagio que vocé pode usar dentro de um programa C++. Esta informagio esté associada com um lugar especifico da meméria (isso € feito pelo compilador). O nome da variével ¢ 0 enderego da meméria onde a informagao esta armazenada estdo associados. O nome ¢ o enderego néo mudam. Mas, 0 valor da informagao pode mudar (0 valor do que est dentro da caixa pode mudar, embora 0 "Na verdade, um programa C+ € composto pela definigdo de fungées e de elementos estruturais denominados classes. Estes tema de estudo em cursos avangados de programagio orientada a objetos eS tipo seja sempre o mesmo). Cada variavel tem um tipo associado, Alguns tipos de variaveis que discutiremos incluem int, char e float Cada variavel usa uma determinada quantidade de armazenamento em meméria, A maneira como sabe- ‘mos quantos bytes sio utilizados & pelo tipo da varidvel. Variaveis do mesmo tipo utilizam 0 mesmo mémero de bytes, nao interessando qual 0 valor que a variével armazena. ‘Um dos tipos utilizados para armazanar mimeros 6 0 int, Ele é usado para ammazenar ntimeros inteiros. Outro tipo € 0 char, usado para armazenar caracteres. Um caracter € um simbolo (uma letra do alfabeto, um digito, um simbolo de pontuagao, ete). Um char é armazenado em 1 byte de meméria. Cada caracter € associado com um valor entre 0 € 255. O compilador C+ faz a tradugdo para vocé, portanto vocé nao precisa saber estes mimeros, Em C#++ , um caracter é representado entre apéstrofes (’). Por exemplo, °C’ a’, 5°, °8'. Note que 'S’ é um caracter, € ndo 0 inteiro 5. 2 a8 }-— valores ites (2 byes) 3 (anmazenacb nd endaroga 23 4 8 wt |= Yar earactr (1 byte) : lrmazerada no eeerece 6) ® A figura acima mostra como um inte um char séo atmazenados na meméria, Outro tipo existente é o float, usado para armazenar mimeros reais (ntimeros com o ponto decimal) Este mimeros séo armazenados em duas partes: a mantissa e 0 expoente. Eles sio armazenados de uma maneira que se assemelha a notagio exponencial. Por exemplo, o mimero 6.023 x 105 é escrito como 6,023e23. Neste caso, a mantissa é 6.023 ¢ 0 expoente 23 Estes mimeros so armazenados de uma forma padrio, tal que a mantissa tem apenas um digito para a esquerda do ponto decimal. Desta forma, 3634.1 € escrito como 3.6341e3, e 0.000341 € escrito 3.41e- 5, Note também que a preciso limitada pela mantissa, Somente os 6 digitos mais significativos sao armazenados. Em CodeBlocks um float ocupa 4 bytes de meméria. Hé muitos outros tipos ( short, long, double), que serio descritos no futuro. 1.3. Definigdo de Varidvel em C++ Se vocé usa varidveis no programa, vocé deve defini-las. Isto envolve especificar o tipo da varidvel ¢ o seu nome. As regras para formar nomes de varidveis em C+ sao: ‘© qualquer sequéncia de letras, digitos, e _', MAS DEVE COMEGAR com uma letra ou com’. Por exemplo, hora_inicio, tempo, vart sio nomes de varisveis vélidos, enquanto horas, total$ e azul-claro nao sao nomes vilidos; ‘© Maidsculas # Mimisculas; ‘* Nao sao permitidos nomes ou palavras reservadas da linguagem. E sempre uma boa idéia ter certas regras (para vocé mesmo) para nomear varidveis para tornar 0 pro- rama mais legivel: * Dé nomes significativos as varidveis (mas nfo muito longos) eS auto | break | case | char _| const | continue default | do [double | else enum | extern float_| for | goto | if int__| long main_| register | retum | shor | signed | sizeof static | struct_[ switch | typedef | union | unsigned void | volatile | while ‘Tabela 1: Palavras Reservadas da Linguagem C++ ‘* Use nomes de varisveis do tipo i,j, K somente para variéveis tipo contadores; «* Pode-se usar letras maiisculas ou *_’ para juntar palavras. Por exemplo, horalnicio ou hora_inicio. Use o que vocé preferit, mas SEIA CONSISTENTE em sua escolha. Os tipos bisicos de dados existentes em C++ sio Tipo de Dado | Bits | Faixa de Valores ] char 8 | -128a127 bool 8 | tue ou false int 32. | -2.147.483.647 a 2.147.483.647 float 32 | 7 digitos significativos double 64_| 15 digitos significativos Abaixo esta um exemplo de um programa com diversas definigdes de varidveis: int main() { int pera; char qualidad float peso; pera =3; qualidade = 'A’; peso = 0.653; ) Quando variveis sao definidas, elas ndo possuem valores ainda, Nés damos valores As varidveis usando © operador de atribuigdo (=). Varidveis também podem ser inicializadas para conter valores quando sio definidas. Usando esta forma, 0 program acima ficaria: int main() { int pera = 3; char qualidade = 'A’ float peso = 0.653; ) Para resumir: quando um programa ¢ executado, uma varidvel é associada com: ‘+ um tipo: diz quantos bytes a varidvel ocupa, ¢ como ela deve ser interpretada, ‘¢ um nome: um identificador. ‘* um enderego: o enderego do byte menos significativo do local da meméria associado a variavel, ‘+ um valor: 0 contetido real dos bytes associados com a varidvel; o valor da varidvel depende do tipo da varidvel; a definigao da varidvel nao dé valor a varidvel; 0 valor é dado pelo operador de atribuigao, ow usando a fungao cin, Nés veremos mais tarde que a fungdo cin atribui a uma varidvel um valor digitado no teclado. ‘* Em C++, nomes de varidveis devem ser declarados antes de serem usados. Se nao for declarado, ocorreré um etro de compilagao. ‘+ Devem ser dados valores as variéveis antes que sejam utilizadas. Se vocé tentar utilizar a varidvel antes de especificar o seu valor, vocé obters “lixo” (0 que quer que esteja armazenado no enderego da varidvel na meméria quando o programa comega sua execugio), culminando com falha na execugao do programa. 1.4 Constantes Em C++, além de varidveis, nés podemos usar também mimeros ou caracteres cujos valores no mudam, Eles so chamados de constantes. Constantes nao sfo associados a lugares na meméria. Assim como varidveis, constantes também tém tipos. Uma constante pode ser do tipo int, char, ete. Vocé nao tem que declarar constantes, ¢ pode utilizé-las diretamente (0 compilador reconhece 0 tipo pela maneira que sao escritos). Por exemplo, 2 é do tipo int, e 2.0 do tipo double. Por convengao, todas as constantes reais so do tipo double 1.5 Caracteres Constantes Um constante caracter € escrita entre apdstrofes, como em °A’, Todas as letras, nimeros ¢ simbolos que podem ser impreasos so escritos desta forma em C+ . As vezes precisamoa de caracteres que nfo podem ser impressos, por exemplo, o caracter de “nova linha”, que nao tem uma tecla especifica no teclado. Neste caso, usa-se caracteres de escape. Tais caracteres s20 escritos nao somente como um simbolo entre apés- trofes, mas como um sequéncia de caracteres entre apéstrofes. Por exemplo, ’\n’ é 0 caracter para nova linha (ama sequéncia que inicia com a barra invertida 6 chamada de sequéncia de escape). Se quisermos representar o caracter de barra invertida, temos que escrever ’\\\", Note que \n € 0 caracter de nova linha - embora use-se dois simbolos para representé-lo. A barra invertida & chamada de escape. Ele diz. a0 com- pilador que o n que segue nao é a letra n, mas que a sequéncia completa de caracteres deve ser interpretada comio 0 caracter de “nova linha” Cada caracter constante tem um valor inteito igual ao seu valor numérico do seu cédigo ASCII. Por exemplo, considere a constante “A’, que tem cédigo ASCII 65, e "B’ que tem cédigo 66. Nés podemos usar aexpressio ‘A’ + 1. O resultado & 0 valor 66. E se 0 tipo da expressdo resultante for chat, entio 0 resultado da expressio €°B’ 1.6 Entrada e Saida Se quisermos que um programa C++ mostre alguns resultados, ou se quisermos que programa pega 20 usuério que entre com alguma informagio, nés podemos usar os elementos cout e cin?. Se vocé quiser usar estes elementos em seu programa, voce deve incluir as seguintes linhas no inicio do seu e6digo fonte: ute cin sto na verdade objetos das classes ostream c istream. Mas este detalhe ni € abordado nestas notas de aula. Seré visto apenas 6 uso destes objetos como primitiva simples para Entrada e Saida de dados. eS #include using namespace std; Isto faz. com que 0 arquivo header chamado iostream seja incluido no seu arquivo fonte durante a compilagao, Este arquivo contém definigses de diversas funges ¢ classes (por exemplo, cout e cin) Ele declara ao compilador o nome das fungdes ¢ algumas informagdes adicionais necessarias para que as instrugdes sejam executadas corretamente. 1.6.1 Exibindo informagées na tela: cout ‘cout pode ser utiizado para imprimir mensagens e valores em uma variedade de formatos. Por enquanto, cout & melhor deserito através de exemplos. cout << "Al6 todo mundo" << endl; Imprimiré AI6 todo mundo em uma linha na tela do computador. O valor endl representa a mudanga de linha. Para o comando cout fazer 0 que deve, nés devemos especificar o que sera impresso. N6s devemos dar a0 comando o que chamamos de argumentos. No exemplo acima, Al6 todo mundo e endl sao argumentos para cout. Os argumentos de cout podem ser uma varisvel, uma express4o ou um string (uma série de caracteres entre aspas (")). [Nos também podemos colocar caracteres de escape no string para imprimir caracteres especiais. Por exemplo, colocando \n no string causa que o restante do string seja impresso na linha seguinte. Outros caracteres de escape sero apresentados no futuro. Considere o seguinte programa: #include using namespace std; #tdefine PRECO 1.99 int main() { int pera = 3; char qualidade = 'A’; float peso = 2.5; cout << “Existem" << pera << "peras de qualidade" << qualidade << "pesando” << peso << “quilos.” << endl; cout << "O preco por quilo eh R$" << PRECO << "Jo total eh R$" << peso *PRECO << endl; ) A saida do programa serd: Existem 3 peras de qualidade A pesando 2.5 quilos. O preco por quilo eh 1.99, o total eh 4.975 A linha #define PRECO 1.99 no inicio do programa define uma macro. Ou seja, definimos que PRECO ¢ um sindnimo para 1.99 e, portanto, toda ocorréncia de PRECO no programa é substitufdo por 1,99 antes que ele seja compilado, 16.2 Lendo informagio: cin cin pode ser usado para ler valores digitados no teclado. Considere o seguinte programa: include using namespace std; int main() { int idade; cout << "Entre sua idade: cin >> idade cout << "Voce tem" << idade << “anos.” << endl; ) Este programa mostraré no monitor: Entre sua idade: e aguardaré que um mimero seja digitado e a tecla ENTER. Depois disso, a varidvel idade conterd o valor digitado pelo usuétio. ‘Mais de um valor pode ser lido por um mesmo cin. Considere o seguinte exemplo: #include using namespace std; int main() ( int dia, mes, ano; cout << "Entre com a data do seu aniversario (dd mm aa): " cin >> dia >> mes >> ano; cout << "Voce nasceuem" << dia << ""<< mes << "<< ano << endl; ) ste exemplo funciona exatamente como o exemplo anterior, Um nico cin 1é os 3 nimeros quando estes mimeros sio separados por espagos (espagos em branco, tabulagao, novas linhas). Entio vocé pode teclar ENTER depois de cada niimero, ou colocar espagos ou tabulagdes entre os mimeros. Os espagos so ignorados pelo cin. 1.7 Algoritmo X Programa MO PERIMETRO_AREA /+ Calcula o perimetro e a area de uma circunferencia de raio R (fornecide pelo usuario) +/ /* Definir variaveis +/ int Raio; float Perim, Area, PI; PI 14159; /* Obter Raio da circunferencia +/ Escreva("Entre com o valor do raio:"); Leia (Rai); /* Calcular Perimetro do Cir Perim = 2» PT » Raio; /* Calcular Area da Circunferencia +/ Area = PI * Raio +* 2; /* Exibir Resultados +/ Escreva("0 perimetro da circunferencia de raio", Raio, Escreva("e a area eh ",Area); /+ Terminar Programa */ FIM_ALGORITMO PERIMETRO_AREA Programa em C++ /* programa que calcula o perimetro e a 4rea de uma circunferéncia de raio 8 (fornecido pelo usuario) */ #include /+ inclui diretivas de entrada-saida +/ include /+ inclui diretivas das fungdes matematicas +/ using namespace std; fidefine PI 3.14159 int main( ) ‘ /* Definir variaveis +/ int Raio; float Perim, Area; /* Obter Raio da circunferencia +/ cout << "Entre com o valor do raio: cin >> Raio; /* Calcular Perimetro do Cireulo +*/ Perim = 2 * PI * Raio; /* Calcular Area da Circunferencia +/ Area = PI * pow(Raio, 2); (+ Bxibir Resultados +/ cout << "0 perimetro da circunferencia de raio " << Raio <<" eh " << Perim << endl; cout << "e a area eh " << Area << endl; "eh", Perim); 2 Operagées Aritméticas e Expressies. Operacdes Relacionais. 2.1 Operagées Aritméticas Em C++, nés podemos executar operagdes aritméticas usando variaveis e constantes, Algumas operagdes mais comuns sao: + adigao = subtragao * multiplicagao 1 divisio % resto (médulo) Estas operagdes podem ser usadas como mostram os exemplos abaixo, assumindo que as varidveis ne- cessérias jd estao declaradas: celsius nrenheit - 32) * 5. forca = massa + aceleracao; i an 24.1 Precedéncia de Operadores Em C++ , assim como em algebra, hé uma ordem de precedéncia de operadores. Assim, em (2+ +)(32? + 1), expresses em paréntesis so avaliadas primeito, seguidos por exponenci- , multiplicacao, divisao, adigao ¢ subtragao. ‘Da mesma forma, em C++ , expressdes entre paréntesis so executadas primeiro, seguidas de +, / ¢ % aga (que tem todos a mesma precedéncia), seguido de + e — (ambos com a mesma precedéncia) Quando operagdes adjacentes tém a mesma precedéncia, elas so associadas da esquerda para a direita Assim,a sb / cs d % e€omesmoque ((((2 * b) /c) « d) * e) 2.1.2 A Operacio de Resto (%) Esta operagdo € usada quando queremos encontrar o resto da divisdo de dois inteiros. Por exemplo, 22 dividido por 5 € 4, com resto 2 (4 x 5 +2 = 22). Em C++, aexpressio 22 % 5 terd valor 2 Note que © s6 pode ser utilizados entre dois inteiros. Usando ele com um operando do tipo float causa um erro de compilagao (como em 22.3 * 5). 2.1.3 Expressies e Variaveis Expressoes aritméticas podem ser usadas na maior parte dos lugares em que uma varisvel pode ser usada O exemplo seguinte é vélido: =34541; 10 Exemplos de lugares onde uma expressio aritmética NAO pode ser usadaineluem: int yucky +2 = 5; cin >> oops * 5; Este exemplo ¢ ilegal e causara erro de compilagao. 2.2 Operadores Relacionais Em C++ , hé operadores que podem ser usados para comparar expressies: os operadores relacionais, HA seis operadores relacionais em C++ < menor que > maior que <= menor ou igual que (<) >= maior ou igual que (>) igual a t= nao igual a) Os resultados deste operadores é 0 (correspondendo a falso), ou 1 (correspondendo a verdadeiro). Va- lores como esses so chamados valores booleanos. Algumas linguagens de programagao como Pascal tem uum tipo de varidvel distinto para valores booleanos. Este nao é 0 caso do C+ , onde valores booleanos sio armazenados como variaveis numéricas tais como o int Considere o seguinte programa: nt main () int idade; idade = 17; cout << "Pode tirar idade = 35; eira de motorista? " << (idade > cout << "Pode tirar carteira de motorista? " << (idade >= 18) << end A safda deste programa sera: Pode tirar ¢ rteira de motorista? 0 rteira de Pode tir orista? 1 Na primeira linha, idade 6 17. Logo, 17 >= 18 é falso, que é 0 Depois disso, ‘cade € 35. Logo, 35 >= 18 é verdadeito, que é 1 Note também que 0 operador de igualdade ¢ escrito com “sinais de igual duplo”, ==, nio =. Tenha cuidado com esta diferenga, j4 que colocar = no lugar de == ndo é um erro sintético (nao gera erro de compilagao), e ndo significa o que vocé espera ul 18) << endl; 2.2.1 Precedéncia dos operadores relacionais Operadores aritméticos tem precedéncia maior que os operadores relacionais. Por exemplo, a expressio 3.45 < 6 * 2€omesmoque (3 + 5) < (6 + 2) Se por alguma razo vocé quer que o resultado do uma operagao relacional em uma expressio aritmética, € necessério usar paréntesis, Por exemplo, a exptessio score + (score == 0) serd sempre igual a0 valor de score, exceto quando o valor de score seja 0. Neste caso, o valor da expressdo € 1 (porque 0) € igual a1). Uma observagao sobre valores booleanos — embora vocé possa assumir que o valor de uma operagao relacional € 0 ou 1 em C++, qualquer valor diferente de zero é considerado verdadeiro. Falaremos sobre isso mais tarde durante 0 curso, (scor: 2.3. Revisio de Expressies: (O que é impresso pelos dois programas abaixo? finclude using namespace std; int main() { cout << 5 +10 * 5% 6 wy cout << 10 / 4; / 0 / 4.0; / cout << 10 cout a cout “a Or Hi using namespace std; clude int main) { cout << "Entre com um numero inteire: "j n2= nl / 5; n3=n2 25 << ag <<" " << nd <<" " << (n2 [= 03 + 21) << end ) Como é a seguinte expresso completamente parentizada ? aeb/ 30 >= 45 +d + 3 tHe == 10 2.4 Exemplo de programas Exemplo 1: escreva um programa que leia um mimeto inteito ¢ imprima 0 se o niimero for par € I se 0 ndmero for impar. 2 include using namespace std; int main() { cout << "Entre com um numero inteiro: "j cout << "\nPar? " << numero % 2 << endl; ) Exemplo 2: escreva um progra 1a que leia 3 mimeros inteiros e cule a soma, média, e produto. // necessaric para usar setw() e setf() em cout using namespace std; int main() { nl, a2, n3; cout << "Soma =" << soma << endl; cout.setf (ios::fixed | ios::showpoint); // reais em ponto fixo cout precision (2); // 2 casa decimais // setw(8) fixa tamanho da representagae em 8 digitos cout << "Media = " << setw(8) << soma / 3.0 << endl; cout << “Produto = " << (unsigned) nl * n2 * n3 << endl; 2.5 Precedéncia e associatividade de operadores ‘Operador “Associatividade esquerda para direita direita para esquerda cesquerda para dircita esquerda para direita esquerda para direita esquerda para direita 13 3. Expressdes como valores Em C++ , todas as expressdes so avaliadas. 0 resultado da avaliagdo € um valor e pode ser usado em quaisquer lugares, 3.1 Expressdes aritméticas, relacionais e légicas Como vocé jé sabe, expressdes usando operadores aritméticos, relacionais e I6gicos? sao avaliados. O valor resultante é um mimero. Para os operadores relacionais € légicos, este ntimero pode ser 0 (que significa falso) ou 1 (que significa verdadeiro). Por exemplo: 2+ 544% (248) tem valor 3; a<5 tem valor 1; xe tem valor igual ao valor da varidvel x mais um; (x > 4) tem valor 1 quando o va- lor da varidvel x é fora do intervalo [1,4], € 0 quando x est dentro do intervalo. 3.2. Expressdes envolvendo o operador de atribuicao (-) 0 formato do operador de atribuigdo é: Iwalue = expressao a Um lvalue (do inglés “left-hand-side value” - valor a esquerda) é um valor que se refere a um endereco na meméria do computador. Até agora, o tinico “Ivalue” valido visto no curso € o nome de uma variavel. A maneira que a atribuigao funciona é a seguinte: a expressao do lado direito € avaliada, ¢ o valor € copiado para o endereco da memiria associada ao “Ivalue”. O tipo do objeto do “Ivalue” determina como o valor da expressao é armazenada na meméria. Expresses de attibuigdo, assim como expressdes, tém valor. O valor de uma expressao de atribuigdo & dado pelo valor da expresso do lado direito do =. Por exemplo: x=3 tem valor 3; tem o valor da expressio Como consequéncia do fato que atribuigdes serem expresses que sfo associadas da direita para es- querda, podemos escrever sentent =j=k=0; Que, usando parénteses, & equivalente ai = (j = (k = 0)}. Ou seja, primeiro o valor 0 € atti- buido ak, ovalorde k ~ 0 (que é zero) é atribuido a j eo valorde 3 — (k — 0) (que também é zero) é atribuido a i Uma caracteristica muito peculiar de C++ € que exptessdes de atribuigdo podem ser usados em qualquer lugar que um valor pode ser usado. Porém vocé deve saber que usé-lo dentro de outros comandos produz um efcito colateral que ¢ alterar o valor da varidvel na meméria, Portanto, a execugio de: quadzado, n cout << "Quadrado de " << n << " eh menor que 50? " << ((quadrade operadores Iigicos «© || seo visor na préxins aula 4 causa no apenas que o valor 4 seja impresso, como a avaliagdo da expressio relacional dentro do cout faz. com que 0 nimero 4 seja copiado para o endereco de meméria associado com a varidvel quadrado Note que é necessério usar parénteses em quadraco = n * n jé que = tem menor precedéncia que 0 operador relacional < Agora compare 0 exemplo anterior com 0 préximo, no qual 0 valor 4 impresso, mas sem nenhum efeito colateral: quadzado, cout << "Quadrado de " << n <<" eh menor que 50? "<< (n * n < 50) << endl; Note que agora ndo h4 necessidade de parénteses para a expression * n porque * tem maior prece- déncia que o operador relacional < 4 Ordem sequencial de execucao de sentencas o comando condicional: if e if — else ‘A execugao de um programa C++ comega com a fungao main () . Em todos os exemplos que vimos até este momento, sentengas sao executadas sequencialmente, A ordem sequencial de execucao de sentecas pode ser alterada se certas condicGes forem satisfeitas durante a execugéo do programa. Isto é chamado desvio condicional. ‘Todas as linguagens de programagao oferecem comandos para o desvio condicional, © mais simples é a sentega i £, Em C+, ele tem o formato: £ (expressao) corpododesvio © compo do desvio, por sua vez, pode ser uma sentenca simples ou composta (veja Segdo 1.1). Quando uma sentenga { f é encontrada em um programa, 1, O teste na expressao em parénteses € avaliada, 2, Se o valor da expresso de teste for DIFERENTE de zeto, as sentengas que compdem o corpo do desvio que segue a expressio de teste so executadas. senienca Figura 1: © comando Considere o seguinte exemplo que converte uma fracio digitada pelo usuétio (numerador ¢ denomina- dor) em decimal e imprime o resultado: include using namesp: int main( ) int a, bj cout << ntre com uma fracao (numerador and denominado: cin >> a >> by cout << "A Er 16 No exemplo acima, escrevemos 1.0 + a / b,jAqueaeb stodotipo int, eportantoa / béuma divisdo de inteiros e a parte fracional do resultado seria truncado, o que certamente nao é o que desejamos. ‘Voce vé algo errado neste programa ? Uma coisa a ser notada é que se o usuario digitar um denominador igual a 0, nds teremos um erro de execugao, j4 que o programa tentaria executar uma divisio por zero, O que é necessério fazer € testar se 0 denominador é igual a zero e dividir s6 no caso dele for diferente de zero, Poderfamos reescrever 0 programa acima da seguinte forma: Exemplo 1: include using namespace std; int main( ){ int a, b; ut << "Entre com uma fracao (numer cin >> a >> b; if (b != 0) cout << "A fracao em decimal eh " << 1.0 + a / b << endl; Exemplo 2: Programa que Ié dois mimeros ¢ ordena o par caso o primeiro mimero digitado for maior que © segundo. include using namespace std; int main( )( int numl, aum2, aux; cout << "Entre com dois numeros iros: %j cin >> numl >> num2; if (uml > numa) ( aux = numl; numl = num2; num2 = aux; cout << "Procou \n"; ) cout << "Os numeros ordenados: " << numl <<" " << num2 << endl; programa do Exemplo I acima ficaria ainda melhor se ao invés de nio fazer nada no easo do denomi- nador ser zero, imprimirmos uma mensagem de erro ao usudrio, explicando o que hi de etrado. A sentenga em C++ que permite fazermos isso € 0 if ~ else. O formato do if-else é 0 Lf (expressao) sentenca: else sentencag eondieaa, senlencal senlenca2 Figura 2: O comando if-else Primeito, a expressao (que usualmente chamamos de condiga0) é avaliada, Caso a condigao seja ver- dadeira (0 que é equivalente a dizer que o valor é diferente de zero), entao a sentencay é executada. Caso contratio, a sentenca, é executada. Note que uma sentenca pode ser simples ou composta, Se vocé quiser agrupar diversas sentengas para serem executadas, vocé pode colocé-las entre chaves ({ € }) Por hora, vamos continuar com nosso exemplo simples ¢ tomé-lo mais explicativo: Exemplo 3: include using namespace std; int main( )( int a, b; cout << "Entre com uma fracao (numerador and denominador): "; cin >> a >> b; if (b != 0) cout << "A fracao a cout << "Erro: denominador zero!\n"; Exemplo4: Considere agora o exemplo jé visto que pede que um ususrio entre com um mimero e verifique se 0 niimero é par. Porém agora, queremos que o programa imprima “o numero ¢ par” ou “o numero € impar’ include 18 using namespace st: int main( )( int num; // obtem um numero do usuario cout << "Entre com um inteiro cin >> num; // imprime uma mensagem dizendo se o numero e par ou impar if (num $ 2 == 0) cout << "O numero eh par.\n"; else cout << "O numero eh impar.\n"; 4.1 Umerro comum £ muito frequente utilizar o operador relacional =~ em expressdes condicionais da sentenga if. Por exem- plo: int saldo = 2000; if (saldo == 1) cout << "Voce esta quebrado! " << endl; else cout << "Seu saldo eh " << saldo << endl; Como a sentenga salde = 2000 inicializa 0 valor da variével saldo com 2000, a expressio saldo == 1 tem valor 0, Portanto, a senteca que segue 0 ese sera executada, e a mensagem. seu saldo e 2000 seré impressa Agora, suponha que, devido a um erro, vocé tenha colocado = ao invés de ==: int saldo = 2000; if (saldo = 1) cout << "Voce esta quebrado! " << endl; else cout << "Seu saldo eh " << saldo << endl; Agora, a expresso saldo = 1 tem valor 1. Portanto, a sentenga que segue 0 if seré executada, ¢ a mensagem Voce esta quebrado! » seré impressa, Além disso, a atribuigao causaré um efeito colateral, ¢ alterard o valor de saldo para 1 Tal uso do operador de atribuicdo nao é ilegal, e ndo sera detectado pelo compilador como erro. Portanto, tome cuidado com o uso de atribuigdo no lugar de igualdade. Tal erro é muito comum, e nao é facil de achar. Como regra getal, NAO utilize atribuigdes dentto de outras sentengas. 5 Aninhando sentecas if e if-else Como era de se esper possivel colocar uma sentenga condicional dentro de outra. Por exemplo, se quisermos imprimir uma mensagem apropriada caso um ntimero seja positive ou negativo e par ou impar, nds poderfamos escrever o seguinte: #include using namespace std; int main( )( int num; // Obtem um numero do usuario cout << "Entre com um inteiro: ® n >> num; J/ Imprime un: mensagem dizendo se o numero e posil // positive ou negative if (num >= 0) ( if (num % 2 vo ou negative, 0 cout << "O numero e par e positive\n"; else cout << "O numero © impar e posit. o) cout << "0 numero e par e neg vo\n" cout << "0 numero ° impar @ negativo\n"; 5.1 A ambigiiidade do else © aninhamento de sentengas if-ese sem usar chaves ({ ¢ }) para delimitar 0 bloco de sentegas a ser executado pode trazer efeitos indesejados. Hé uma regra simples para determinar qual if esté associado a qual else. Regra de associagio: | Um else esté associado com a thtima ocorréncia do ££ sem else ( exemplo seguinte esti errado porque associa 0 ese ao i f “incorreto" include > num; // Imprime uma mensagem dizendo se o numero de peras e 0 ou 1 // (#es isto esta’ errado |! +4) if (num != 0) if (num == 1) cout << "Voce tem uma pera.\n"; else cout << "Voce nao tem nenhuma pera. \n"; Neste exemplo, o i f tem o seguinte significado, segundo a regra de associagao: include using namespace std; int main( )( int num; // Optem um numero do usuario cout << "Entre com o numero de peras: "; // Como a sentenca if e’ vista pelo compilador if (num != 0} if (num == 1) cout << "Voce tem uma pera.\n else cout << "Voce nao tem nenhuma pera. \n"; Para evitar este problema, chaves ({ ¢ }) devem ser usadas para tirar a ambiguidade. O exemplo abaixo ‘mostra como as chaves podem ser inseridas para corrigir o programa acima, include using namespace st int main( ){ int num; // Obtem um numero do usuario cout << "Entre com o numero de peras: cin >> num; a programa funciona) // Como corrigir o problema (e pum != 0) { £ (num == 1) cout << "Voce tem uma pera.\a"; Exereicio 1: Faga um programa que leia 3 niimeros e imprima 0 maior. 6 Operadores Légicos ‘Todos os programas até agora consideraram i £ com condigGes de teste simples. Alguns exemplos de testes simples: b != 0, contador <= 5. Estas expressdes testam uma condico, Portanto, quando mais de uma condigao precisa ser testada, precisamos usar sentengas if ¢ if-else aninhadas. A linguagem C+ , assim como a maiotia das linguagens de programacao de alto nivel suportam ope- radores ldgicos que podem ser usados para criar operagdes ldgicas mais complexas, combinando condigdes simples. O valor de uma expresso l6gica é ou VERDADEIRO ou FALSO. Lembre que nao hé constan- tes légicas VERDADEIRO ¢ FALSO em C++ ; em expressies I6gicas 0 € interpretado como FALSO, € qualquer valor diferente de zero é interpretado como VERDADEIRO. Os operadores légicos so 1 NAO ligico, operagao de negagao (operador unério) 46 E légico, conjungio (operador binétio) || OU lbgico, disjungao (operador binétio). Por exemplo, se quisermos testar se um miimero num é positivo e par, ¢ imprimir uma mensagem como no exemplo anterior, podemos escrever: if (num & 2 == 0) cout << "Numero par nao negative." << e Com os operadores logicos isso pode ser simplificado: Lf ((num>=0) && (num$2 == 0)) amero par nao negative." << endl; cout << A operagio de negagao, !, pode ser usado da seguinte forma: Lexpressao légica: O valor € a negagio Idgica da expressio dada. Por exemplo: 10 é1 n €0 Nés podemos usar o operador de negagio Iégica e escrever o exemplo acima como: LE (num>0 e& | (num$2)) cout << "Numere par nao negative." << endl; Os dois operadores binérios operam sobre duas expresses légicas ¢ tem o valor 1 (verdadeiro) or 0 (falso). Os exemplos abaixo mostram o seu uso: && b==0 (verdadeiro se ambos a == 0 €b == 0, portanto se ae b sio 0 | b==0 (verdadeito se pelo menos uma das varidveis a or b for 0) 2 Uma expresso usando &¢ 6 verdadeira somente se ambos os operadores forem verdadeiros (nao zero). ‘Uma expresso usando | | é falsa somente se ambos os operadores forem falsos (zero). ‘Verifique na Tabela 2 0 resultado do uso de operadores I6gicos: expr expr, [expri && expra [exp || expr verdadeiro | verdadeiro | verdadeiro verdadeiro verdadeiro| — falso falso verdadeiro falso rdadeiro falso verdadeiro also Salso falso falso ‘Tabela 2: Resultado de uso de Operadores Légicos A precedéncia do operador de negacio légica € a mais alta (no mesmo nivel que 0 “." unétio). A ptecedéncia dos operadores légicos binétios € menor que a dos operadores relacionais, ¢ mais alta que a operagao de attibuigdo. O && tem precedéncia mais alta que o | |, € ambos associam da esquerda para a direita (como os operadores aritméticos) Como a precedéncia dos operadores ldgicos & menor que a dos operadores relacionais, nao é necessario usar parénteses em expresses como: A Tabela 3 mostra o quadro completo de precedéncia de operadores aritméticos, relacionais ¢ légicos. Operador Associatividade 0 esquerda para direita 1 (unérios) | direita para esquerda a’ esquerda para direita +: esquerda para direita << > esquerda para direita ! esquerda para direita be esquerda para direita ul esquerda para direita ‘Tabela 3: Precedéncia e associatividade de operadores No préximo exemplo, o programa verifica se as trés varidveis 1aco1, lado2, ¢ lacio3, podem ser lados de um triangulo reto. Nés usamos 0 fato que os trés valores devem ser positivos, e que o quadrado de uum dos lados deve ser igual a soma dos quadrados dos outros lados (Teorema de Pitdégoras) para determinar se 0 tridngulo é reto. 23 include using namespace std; int main( ){ int ladol, ladoz, lado3; int sl, s2, 83; cout << "Entre com o tamanho des lados do triangulo: cin >> ladol >> lado2 >> lado3; // calcula ¢ quadrado dos lados sl = ladel+ladol; 82 = lado2*lado2; 83 = lado3«lado3; // testa a condicao para um triangulo rete if ( ladol>0 @& lado2>0 && lado3 > 0) ( Af (sl==s2ts3 || s2==slts2 [| s2==sl+s3) } ( cout << "Triangulo reto!\n"; ) else ( cout << "Nao pode ser um triangulo!\n"; ) Na utilizagdo de expresses légicas, as seguintes identidades sao titeis, Flas sio chamadas de Lei de DeMorgan: Ge e& y) equivalentea!x || ly e Le || y) €equivalentea!x e& ty 7 Exemplos 7.1 IF-ELSE Assuma as seguintes declaragSoes de varisveis int x= 4; int y = 8 © que ¢ impresso pelos seguintes programas ? ig (= 8) if (x = 5) cout << "a"; else cout << "b "; cout << Ye"; cout << "d" << endl; acd 2, mude = par bed 3. altere o programa acima para produzir a seguinte saida: © Assumax = Sey = § f@)a dad © Ascumax Sey 9 7 @bed 7.2 Operadores ligicos O que é impresso pelas seguintes sentencas? 1. Assumax = Sey = 8 if (x == 5 6a y == 8) cout << "a" << endl; else cout << "bY << endl; a 2, Assumax = 4ey = 8. if (x lly == 8) cout << "a" << endl; else cout << "b" << endl; a if (ees 5 lly == 8) // equiv. (x t= 5 && y I= 8) cout << "a" << endl; cout << "b" << endl; if (x==5 |) y== 8 &&@ 2 == 10) equiv. if (x

Você também pode gostar