Baixe o app para aproveitar ainda mais
Prévia do material em texto
Chapter 1 Prefacio Esta apostila e´ apenas um material auxiliar para uso em sala de aula, como guia pra´tico. O conteu´do e´ baseado em um material utilizado durante a disciplina de Laborato´rio de Programac¸a˜o em C, ministrada pelo professor Ricardo An- drade Cava, na Universidade Cato´lica de Pelotas. O material original tem como refereˆncias bibliogra´ficas: • FORBELLONE, Andre´, EBERSPACHER, Henri, Lo´gica de Programac¸a˜o - A construc¸a˜o de algoritmos e estruturas de dados. 2005. • KERNIGHAN, Brian, RITCHIE, Dennis, C a linguagem de programac¸a˜o. 1986. • MIZRAHI, Victorine V., Treinamento em Linguagem C - Mo´dulo 1. 1990. • MIZRAHI, Victorine V., Treinamento em Linguagem C - Mo´dulo 2. 1990. O conteu´do ainda esta´ em desenvolvimento.... 1 Chapter 2 Introduc¸a˜o Esse material e´ baseado em va´rios materiais dentre os quais encontram-se o livro de 2.1 Computador Um computador e´ composto basicamente por duas partes essenciais, a parte f´ısica e a parte lo´gica. A parte f´ısica, chamada de hardware, corresponde a parte material, aos com- ponentes f´ısicos e eletroˆnicos do computador. Na Figura 2.1, e´ poss´ıvel observar a interac¸a˜o entre os principais componentes de hardware de um computador. Figure 2.1: Interac¸a˜o entre componentes de hardware. 2 CHAPTER 2. INTRODUC¸A˜O 3 A parte lo´gica, chamada de software, corresponde aos programas que esta˜o instalados no equipamento. Todo computador possui um software gerenciador conhecido como sistema operacional, atrave´s do qual os equipamentos sa˜o con- trolados e o usua´rio pode interagir com os mesmos, como exemplo, podemos citar o Windows ou o Linux. Ale´m do sistema operacional, existem outros pro- gramas que permitem a execuc¸a˜o de tarefas comuns, como escrever textos e editar imagens, a esses programas damos o nome de aplicativos, por exemplo, Word, Excel e OpenOffice. 2.2 Programa Um programa de computador, consiste de um conjunto de instruc¸o˜es, escritas em alguma linguagem de programac¸a˜o. Todo programa possui um objetivo claro, nesse sentido busca resolver um determinado problema. Podemos criar um pro- grama para informar a temperatura na CPU, informar as horas para o usua´rio, ou simplesmente apresentar alguma mensagem na tela do computador. Por ex- emplo, o programa abaixo ao ser executado apresenta uma mensagem de boas vindas. Listing 2.1: Linguagem Pascal program exemplo ; beg in w r i t e (” Ola´ , s e j a BEM VINDO ! ! ! ” ) ; end . Listing 2.2: Linguagem C #i n c l u d e <s t d i o . h> main ( ){ p r i n t f ( ”Ola´ , s e j a BEM VINDO ! ! ! ” ) ; } Listing 2.3: Linguagem Java p u b l i c c l a s s Exemplo{ p u b l i c v o i d s t a t i c main ( S t r i n g a r g s [ ] ) { System . out . p r i n t l n ( ”Ola´ , s e j a BEM VINDO ! ! ! ” ) ; } } 2.2.1 A construc¸a˜o de um programa A construc¸a˜o de um programa passa por algumas etapas ba´sicas. Apo´s a elab- orac¸a˜o do algoritmo, o passo-a-passo para a soluc¸a˜o, o desenvolvedor podera´ utilizar um editor de texto qualquer ou um editor espec´ıfico para a linguagem a qual esta´ trabalhando. Em ambos os casos, o programador ira´ escrever um CHAPTER 2. INTRODUC¸A˜O 4 arquivo de texto contendo o chamado co´digo-fonte, escrito em uma linguagem de programac¸a˜o (C, Java, C++,etc.). Esse arquivo e´ enta˜o compilado pelo com- pilador da linguagem gerando um novo arquivo, esse u´ltimo contendo o chamado co´digo executa´vel, escrito em uma linguagem de ma´quina (Assembly). Na Figura 2.2 e´ poss´ıvel observar esse processo ilustrado em alto n´ıvel. Figure 2.2: Etapas no desenvolvimento de um programa. O compilador nada mais e´ do que um programa espec´ıfico que traduz o arquivo que conteˆm o co´digo-fonte para uma linguagem de ma´quina, espec´ıfica para a arquitetura do computador. Um algoritmo, como visto e´ a descric¸a˜o de um conjunto de ac¸o˜es que, obe- decidos, resultam em uma sucessa˜o finita de passos, com o intuito de atingir a soluc¸a˜o de um determinado problema [?]. 2.3 Exerc´ıcio Questa˜o 1 Escreva uma algoritmo para resolver o quebra-cabec¸as chamado Torres de Hano´i. Figure 2.3: Diagrama das Torres de Hano´i. Objetivo: Mover todos os discos do pino A para o pino B. Regras: • Mover 1 disco por vez; CHAPTER 2. INTRODUC¸A˜O 5 • Um disco com diaˆmetro maior na˜o pode ficar sobre um disco com diaˆmetro menor. 2.4 Noc¸o˜es importantes Antes de comec¸armos a escrever nossos primeiros programas vamos entender alguns detalhes sobre a linguagem C. 2.4.1 Diferenciando maiu´sculas de minu´sculas A linguagem e´ sens´ıvel com relac¸a˜o a letras maiu´sculas e minu´sculas, normal- mente sempre iniciamos identificadores de varia´veis e func¸o˜es com letras minu´sculas como forma padra˜o, assim em qualquer parte do mundo outro programador podera´ entender o que estamos fazendo. Portanto, uma varia´vel com o identifi- cador nomeAluno e´ diferente de nomealuno. 2.4.2 Formatac¸a˜o e bibliotecas O formato do texto e´ livre, no entanto, para garantir que o compilador identifique cada passo do programa, os comandos sa˜o finalizados por “;”, indicando que o que vem a seguir trata-se de um novo comando. Abaixo segue um exemplo: Listing 2.4: Exemplo de co´digo C. 1 #include<s t d i o . h> 2 main ( ){ 3 p r i n t f ( ” Ma t e r i a l para e s t udo s ! ! ” ) ; 4 } Na linha 1, e´ utilizado o comando “#include < stdio.h >”, esse comando permite a utilizac¸a˜o de uma biblioteca de func¸o˜es pre´-definidas para a linguagem. Nesse caso, esta´ sendo inclu´ıda ao programa a biblioteca “stdio.h”, biblioteca essencial para a maioria dos programas que vamos desenvolver. Dentro dessa biblioteca esta˜o func¸o˜es ba´sicas para a entrada e sa´ıda de dados (I/O), como as func¸o˜es “printf” (linha 3), que envia uma mensagem para o dispositivo padra˜o de sa´ıda (terminal), e a func¸a˜o “scanf”, que permite a leitura de dados a partir do dispositivo padra˜o de entrada (teclado). CHAPTER 2. INTRODUC¸A˜O 6 2.4.3 Arquivos gerados - sem pane!! Ao utilizar algum editor, como por exemplo, o Code::Blocks1 ou Dev C++2, e´ poss´ıvel que alguns arquivos sejam gerados durante o processo de compilac¸a˜o: • prog.c - programa fonte, escrito pelo programador • prog.bak - uma co´pia de seguranc¸a • prog.obj - programa objeto gerado no processo de compilac¸a˜o • prog.exe - programa executa´vel, escrito em uma linguagem de ma´quina. Toda estrutura ou func¸a˜o possui um bloco de operac¸o˜es ou comandos associ- ado. O bloco e´ delimitado por chaves, ou seja, inicia-se um bloco atrave´s de uma chave de abertura { e encerra-se o bloco atrave´s de uma chave de fechamento }. Quando um bloco possui apenas um comando as chaves podem ser omiti- das, mas deve-se tomar muito cuidado, sa˜o esses pequenos detalhes que acabam levando a tempo desperdic¸ado procurando por erros lo´gicos. Abaixo segue um exemplo de bloco de operac¸o˜es associado a uma estrutura de selec¸a˜o. Listing 2.5: Exemplo de co´digo C. Blocos de co´digo. 1 i f { // i n i c i o do b l o c o de o p e r a c¸ o˜ e s caso v e r d a d e i r o 2 <comando 1>; 3 . . . 4 <comando n>; 5 } // f im do b l o c o de o p e r a c¸ o˜ e s caso v e r d a d e i r o 6 e l s e { // i n i c i o do b l o c o caso f a l s o 7 <comando> 8 } // f im do b l o c o caso f a l s o 1http://www.codeblocks.org/ 2http://www.bloodshed.net/devcpp.html Chapter 3 Primeiros Passos Vamos comec¸ar a escrever nossos primeiros programas, lembre-se esse material segue o conteu´do visto no decorrer do curso. 3.1 Programas Sequenciais Um programa puramente sequencial nada mais e´ do que um conjunto de in- struc¸o˜es que sera˜o executadas sequencialmente durante a execuc¸a˜o do programa, sem qualquer uso de estruturas com desvio condicional ou repetic¸a˜o de blocos de co´digo. Seguem exemplos de programas sequeˆncias com sa´ıda de dadossimples. Listing 3.1: Exemplo de co´digo C. 1 #include<s t d i o . h> 2 i n t main ( ){ 3 p r i n t f ( ” Ma t e r i a l ” ) ; 4 p r i n t f ( ” para ” ) ; 5 p r i n t f ( ” e s t udo s ! ! ” ) ; 6 7 return 0 ; 8 } Listing 3.2: Exemplo de co´digo C. 1 #include<s t d i o . h> 2 i n t main ( ){ 3 p r i n t f ( ” Ma t e r i a l \n” ) ; 4 p r i n t f ( ” para \n” ) ; 5 p r i n t f ( ” e s t udo s ! ! ” ) ; 6 7 return 0 ; 8 } 7 CHAPTER 3. PRIMEIROS PASSOS 8 Listing 3.3: Exemplo de co´digo C. 1 #include<s t d i o . h> 2 i n t main ( ){ 3 p r i n t f ( ” Ma t e r i a l \ npara 4 \ ne s tudos ! ! ” ) ; 5 6 return 0 ; 7 } Observe que a estrutura ba´sica de um programa em C e´ dada pela inclusa˜o de bibliotecas, atrave´s do comando #include < nome biblioteca.h >, seguida das func¸o˜es do programa. Obrigatoriamente a func¸a˜o main() deve ser implementada, sendo que essa sera´ executada assim que o programa entra em execuc¸a˜o. Atividade 2 Escreva programas para imprimir cada tela abaixo. CHAPTER 3. PRIMEIROS PASSOS 9 3.1.1 Varia´veis, Constantes e Expresso˜es Ainda sobre programas sequenciais observe o exemplo abaixo, um programa para realizar a soma de dois valores 15 e 100. Listing 3.4: Exemplo de co´digo C. 1 #include<s t d i o . h> 2 i n t main ( ){ 3 i n t va , vb , soma ; 4 5 va = 15 ; 6 vb = 100 ; 7 soma = va + vb ; 8 p r i n t f ( ”A soma de %d e %d e %d” , va , vb , soma ) ; 9 10 return 0 ; 11 } Observe na linha 3, sa˜o declaradas 3 varia´veis “va, vb e soma” todas do tipo inteiro. Em C a sintaxe para declarac¸a˜o de varia´veis segue: < tipo >< identificador > Por exemplo: int va; int vb, vc; E´ poss´ıvel na pro´pria declarac¸a˜o realizar uma inicializac¸a˜o direta, atribuindo um valor a varia´vel rece´m criada atrave´s do operador “=”: int va = 15; int vb = 100, vc; Uma varia´vel na verdade e´ um espac¸o de memo´ria que pode conter, a cada instante de tempo, valores diferentes. Seu conteu´do e´ referenciado atrave´s de um identificador, o qual deve passar algum tipo de informac¸a˜o relevante, que aponte para que dados esta˜o sendo armazenados naquele espac¸o de memo´ria, por exemplo, idade, nome, sexo, etc. Uma varia´vel ocupa um determinado espac¸o de memo´ria, de acordo com o tipo dos dados que sera˜o armazenados. A definic¸a˜o de um identificador para as varia´veis de um programa deve seguir algumas regras ba´sicas: 1. Deve comec¸ar com uma letra ou sublinhado (underline); 2. O restante pode ser uma combinac¸a˜o de letras, nu´meros ou sublinhado; 3. Na˜o e´ permitida a utilizac¸a˜o de acentos; CHAPTER 3. PRIMEIROS PASSOS 10 4. Palavras reservadas da linguagem na˜o podem ser utilizadas. Alguns exemplos va´lidos: • ftotal, area, n1, num alunos, teste, numAlunos Alguns exemplos inva´lidos: • 1nome, $a, num-alunos, num alunos, int, main Olhando para o exemplo da listagem 3.4, observe que nas linhas 5, 6 e 7, sa˜o realizadas atribuic¸o˜es. Uma atribuic¸a˜o permite armazenar um valor em posic¸a˜o de memo´ria, associada a` uma varia´vel do programa, nesse caso, “va, vb e soma”, respectivamente. Figure 3.1: Representac¸a˜o simbo´lica do espac¸o de memo´ria ocupado pelas varia´veis do programa Na Figura 3.1, e´ poss´ıvel observar uma ilustrac¸a˜o simbo´lica sobre o que ocorre quando o programa entra em execuc¸a˜o. As varia´veis sa˜o alocadas na memo´ria do computador, e podem ser utilizadas enquanto o programa mante´m-se em execuc¸a˜o. Ao final da execuc¸a˜o as posic¸o˜es de memo´ria sa˜o liberadas. Assim como as varia´veis, podemos nos referir a certas posic¸o˜es de memo´ria como constantes. Nesse caso, o valor armazenado nessas posic¸o˜es na˜o sofre alterac¸o˜es durante toda a execuc¸a˜o do programa, e´ tambe´m chamado de fixo ou invariante. Para definir uma constante e´ necessa´rio logo apo´s a inclusa˜o das bibliotecas utilizar o comando #define com o identificador da constantes que se esta´ alocando. Listing 3.5: Exemplo de co´digo C. 1 #inc lude <s t d i o . h> 2 3 // d e c l a r a c¸ a˜ o da c o n s t a n t e 4 #def ine ICMS 0 . 1 8 ; CHAPTER 3. PRIMEIROS PASSOS 11 5 6 i n t main ( ){ 7 f l o a t p reco p rodu to , v a l o r i cm s ; 8 9 p r i n t f ( ” In fo rme o v a l o r do produto : ” ) ; 10 s c an f ( ”%f ” , &p r e co p r odu to ) ; 11 12 v a l o r i cm s = p r e co p r odu to ∗ ICMS ; 13 14 p r i n t f ( ” Va lo r de imposto a s e r pago : R$ %.2 f ” , v a l o r i cm s ) ; 15 16 getch ( ) ; 17 return 0 ; 18 } Figure 3.2: Co´digo C definindo uma constante. Observe na linha 4, esta´ sendo definida uma constante chamada ICMS com o valor 0.18, ou seja, esse valor na˜o pode ser alterado em todo execuc¸a˜o do programa. Na linha 12 e´ poss´ıvel observar uma expressa˜o, nesse caso uma operac¸a˜o matema´tica. Expresso˜es sa˜o representac¸o˜es simbo´licas de operac¸o˜es a serem feitas sobre determinados operandos (varia´veis e constantes), visando a obtenc¸a˜o de um resultado. Com relac¸a˜o as atribuic¸o˜es sa˜o poss´ıveis em C: • < variavel >=< constante >. Exemplo: va = 15; • < variavel >=< variavel >. Exemplo: va = vb; • < variavel >=< expressao >. Exemplo: soma = va + 100; Com relac¸a˜o as expresso˜es esta˜o dispon´ıveis como operadores aritme´ticos: Lembrando que os parenteses alteram a ordem de precedeˆncia, ou seja, primeiro aplica-se as operac¸o˜es internas e depois operac¸o˜es mais externas. Alguns exemplos de expresso˜es escritas na linguagem C: a = 5 + 2 ∗ 3; b = (5 + 2) ∗ 3; CHAPTER 3. PRIMEIROS PASSOS 12 Table 3.1: Tabela de operadores matema´ticos Operador Func¸a˜o Precedeˆncia ∗ Multiplicac¸a˜o 1a / Divisa˜o 1a % Resto da Divisa˜o 1a + Soma 2a − Subtrac¸a˜o 2a c = 11%3; d = ((a+ b) ∗ c+ 2)/2; Ale´m das operac¸o˜es ba´sicas existem outras operac¸o˜es implementadas atrave´s de func¸o˜es pre´-definidas, inclusas na biblioteca “math.h”: Table 3.2: Tabela de operac¸o˜es pre´-definidas, #include < math.h > Operac¸a˜o Matema´tica Linguagem C Raiz Quadrada y = √ x y = sqrt(x); Poteˆncia y = xn y = pow(x, n); Seno y = sen(x) y = sin(x); Cosseno y = cos(x) y = cos(x); Atividade 3 Escreva um programa que calcule a expressa˜o: x = −b+ √ b2−4ac 2a Atividade 4 Qual o resultado para a expressa˜o: x = 100%10 + 15/5; Atividade 5 Refac¸a a expressa˜o y = (((15 ∗ 2)− 5)/3) + (100/2), utilizando o m´ınimo poss´ıvel de parenteses. 3.2 Entrada e Sa´ıda de dados Como vimos a sa´ıda de dados e´ realizada atrave´s da func¸a˜o prinf . Essa func¸a˜o recebe uma mensagem na forma de uma string (vetor de caracteres), e a envia para a sa´ıda padra˜o. A sa´ıda de dados e´ realizada atrave´s da func¸a˜o scanf , a qual executa um leitura do teclado e armazena o valor informado na varia´vel passada como refereˆncia. Observe o programa abaixo: Listing 3.6: Exemplo de co´digo C. 1 #include<s t d i o . h> CHAPTER 3. PRIMEIROS PASSOS 13 2 i n t main ( ){ 3 i n t va , vb , soma ; 4 5 s c an f ( ”%d” , &va ) ; 6 s c an f ( ”%d” , &vb ) ; 7 soma = va + vb ; 8 p r i n t f ( ”A soma de %d e %d e %d” , va , vb , soma ) ; 9 10 return 0 ; 11 } Trata-se de uma versa˜o do programa apresentado na listagem 3.4. Observe nas linhas 5 e 6, o programa espera a interac¸a˜o do usua´rio que devera´ fornecer dois valores, um para “va” e o outro para “vb”, para isso esta´ sendo utilizada a func¸a˜o scanf . A func¸a˜o scanf permite que o programa capture a leitura de dados do dis- positivo de entrada, nesse caso, o teclado. Esta˜o sendo passados dois paraˆmetros para ela, o primeiro indica o tipo dos dados de entrada (%d) e o segundo cor- responde ao enderec¸o da varia´vel (&va) que recebera´ os dados. O enderec¸o de uma varia´vel, na linguagem C, e´ obtido atrave´s do operador una´rio & juntamente a varia´vel em questa˜o. Para deixar o programa da listagem 3.7 um pouco mais “amiga´vel”, podemos inserir mensagens intercaladasa` entrada de dados, informando ao usua´rio o que e´ esperado pelo programa. Listing 3.7: Exemplo de co´digo C. 1 #include<s t d i o . h> 2 i n t main ( ){ 3 i n t va , vb , soma ; 4 5 p r i n t f ( ” In fo rme o p r im e i r o operando : ” ) ; 6 s c an f ( ”%d” , &va ) ; 7 p r i n t f ( ” In fo rme o segundo operando : ” ) ; 8 s c an f ( ”%d” , &vb ) ; 9 soma = va + vb ; 10 p r i n t f ( ”A soma de %d e %d e %d” , va , vb , soma ) ; 11 12 return 0 ; 13 } 3.2.1 Formatac¸a˜o Na Tabela 3.3, e´ poss´ıvel observar alguns co´digos para formatac¸a˜o de acordo com o tipo de dado. CHAPTER 3. PRIMEIROS PASSOS 14 Table 3.3: Tabela formatac¸a˜o Co´digo Leitura e Impressa˜o %c caracter %d inteiro %u inteiro sem sinal %ld long %lu long sem sinal %x hexadecimal %o octal %f float %lf double %s string Somente Impressa˜o %% para imprimir % \n nova linha \t tabulac¸a˜o \\ barra invertida \” aspas \0 terminador de strings Um dos tipos nume´ricos mais utilizados e´ o tipo float. Esse tipo permite armazenar dados que possuem casas decimais, como temperaturas (36.5 C), a´rea (7.2356 m2). Como visto na tabela de co´digos a` formatac¸a˜o para esse tipo e´ dada atrave´s do co´digo %f . No entanto, essa formatac¸a˜o pode manter a impressa˜o de va´rias casas decimais, o que em alguns casos torna-se um inconveniente. Para melhorar a apresentac¸a˜o e´ poss´ıvel indicar a quantidade de d´ıgitos que sera˜o apresentados, incluindo o “.” que separa a parte inteira da decimal. Para isso utiliza-se o padra˜o “%05.2f , onde o 05.2 indica que devera˜o ser impressos 5 d´ıgitos contando com as casas decimais e o ponto, sendo no ma´ximo 2 casas decimais. No caso do valor possuir menos que 5 d´ıgitos sera˜o acrescidos 0 a frente para chegar na formatac¸a˜o desejada. Figure 3.3: Formatac¸a˜o de valores nume´ricos do tipo float, tamanho total e casas decimais. No entanto, se a parte inteira possui um tamanho maior a` formatac¸a˜o do CHAPTER 3. PRIMEIROS PASSOS 15 tamanho sera´ desconsidera, sendo levado em considerac¸a˜o apenas as casas dec- imais. Observe o exemplo abaixo: Listing 3.8: Exemplo de co´digo C. 1 #include<s t d i o . h> 2 i n t main ( ){ 3 f l o a t x=999.333; 4 5 // formatando as c a s a s d e c i m a i s 6 p r i n t f ( ”%f %.1 f %.2 f \n” , x , x , x ) ; 7 // formatando a p a r t e i n t e i r a e c a s a s d e c i m a i s 8 p r i n t f ( ”%05 f %02.1 f %08.2 f \n” , x , x , x ) ; 9 10 return 0 ; 11 } Figure 3.4: Formatac¸a˜o de valores nume´ricos do tipo float. Essa mesma regra de formatac¸a˜o pode ser aplicada aos valores do tipo inteiro, denotados pelo co´digo “%d′′. A diferenc¸a que na˜o existem casas decimais, logo, e´ poss´ıvel apenas formatar o nu´mero de d´ıgitos que sera˜o impressos, no caso do valor ser menor que o tamanho solicitado sera˜o adicionados 0’s a frente. Listing 3.9: Exemplo de co´digo C. 1 #include<s t d i o . h> 2 i n t main ( ){ 3 i n t x=1234; 4 5 p r i n t f ( ”%d %05 f %08 f \n” , x , x , x ) ; 6 7 return 0 ; 8 } Atividade 6 Para evitar excessos de velocidade em toda cidade o departa- mento de traˆnsito contratou uma empresa para construir um sistema eletroˆnico de controle de velocidade. A parte que envolve o hardware esta´ pronta, e voceˆ recebeu o convite para construc¸a˜o do software do equipamento. CHAPTER 3. PRIMEIROS PASSOS 16 Figure 3.5: Formatac¸a˜o de valores nume´ricos do tipo int. O equipamento baseia-se em dois sensores colocados na pista, a uma certa distancia “d”(em metros) um do outro, essa distaˆncia pode variar de acordo com o local onde o equipamento foi instalado. O equipamento captura o tempo “t” (em segundos) que o ve´ıculo levou para passar entre os dois sensores. Seu programa devera´ receber a distaˆncia entre os sensores e o tempo que o ve´ıculo levou para percorrer essa distaˆncia e calcular a velocidade em Km/h (Quiloˆmetros por hora). Figure 3.6: Fo´rmulas u´teis para o problema: V = dkm th , dkm = dm 1000 , th = ts 3600 3.3 Programas com Repetic¸a˜o Os lac¸os na linguagem C seguem os mesmos princ´ıpios vistos na construc¸a˜o de algoritmos. A linguagem fornece o lac¸o com teste no in´ıcio, atrave´s da estrutura: while(< condicional >){< blocodecomandos >} CHAPTER 3. PRIMEIROS PASSOS 17 . Nesse caso, a condic¸a˜o e´ testada antes do bloco de comandos que sera´ repetido, logo, o bloco pode na˜o ser executado nenhuma vez, dependendo do resultado do teste. Exemplo: Escreva um programa para ler va´rios valores. Para cada valor lido calcular e escrever sua raiz quadrada. O programa termina apo´s a entrada de um valor negativo. Listing 3.10: Exemplo de co´digo C.Lac¸o com teste no in´ıcio 1 #include<s t d i o . h> 2 #include<math . h> 3 i n t main ( ){ 4 i n t x ; 5 6 p r i n t f ( ” In fo rme um v a l o r : ” ) ; 7 s c an f ( ”%d” ,&x ) ; 8 whi le ( x>=0){ 9 p r i n t f ( ”A r a i z quadrada e i g u a l a %f \n” , s q r t ( x ) ) ; 10 p r i n t f ( ” In fo rme um v a l o r : ” ) ; 11 s c an f ( ”%d” ,&x ) ; 12 } 13 14 return 0 ; 15 } Figure 3.7: A linguagem C tambe´m permite a repetic¸a˜o controlada por um teste no final atrave´s da estrutura: do{< blocodecomandos >}while(< condicional >) Observe que nesse caso o bloco de comandos executa pelo menos uma vez. Reescrevendo o co´digo anterior agora com uma estrutura de repetic¸a˜o com teste no final. CHAPTER 3. PRIMEIROS PASSOS 18 Listing 3.11: Exemplo de co´digo C. Lac¸o com teste no final 1 #include<s t d i o . h> 2 #include<math . h> 3 i n t main ( ){ 4 i n t x ; 5 6 do{ 7 p r i n t f ( ” In fo rme um v a l o r : ” ) ; 8 s c an f ( ”%d” ,&x ) ; 9 p r i n t f ( ”A r a i z quadrada e i g u a l a %f \n” , s q r t ( x ) ) ; 10 }whi le ( x<0); 11 12 return 0 ; 13 } Os operadores relacionais dispon´ıveis na linguagem C podem ser analisados na Tabela 3.4. Lembrando que todos sa˜o operadores bina´rios, ou seja, relacionam duas varia´veis, como por exemplo x < y onde estamos verificando se x e´ menor que y. Table 3.4: Tabela operadores relacionais Operador Func¸a˜o < menor que > maior que == igual a <= menor ou igual >= maior ou igual ! = diferente de Por u´ltimo a estrutura de repetic¸a˜o com lac¸o controlado por um contador, utilizada quando sabe-se a priori o nu´mero exato de vezes que o lac¸o ira´ executar. Um contador e´ uma varia´vel utilizada especificamente para controlar o nu´mero de vezes que algo ocorre. E´ uma varia´vel qualquer que recebe um valor inicial, normalmente 0, e que e´ incrementada em algum ponto do co´digo com um valor constante. variavel = variavel + constante; //cont = cont+ 1; Quando essa constante e´ o valor 1 e´ poss´ıvel utilizar o operador de incremento ++, por exemplo cont + +. O operador de incremento pode ser utilizado pre´- fixado, escrito antes da varia´vel(++ cont), nesse caso o incremento e´ realizado antes de ler o valor da varia´vel, ou enta˜o pode ser po´s-fixado, escrito apo´s a varia´vel (cont++), nesse caso a varia´vel e´ lida e depois incrementada. CHAPTER 3. PRIMEIROS PASSOS 19 Listing 3.12: Exemplo de co´digo C. Incremento po´s-fixado 1 #include<s t d i o . h> 2 i n t main ( ){ 3 i n t i ; 4 5 i =10; 6 p r i n t f ( ”%d\n” , i ++); 7 8 return 0 ; 9 } Listing 3.13: Exemplo de co´digo C. Incremento pre´-fixado 1 #include<s t d i o . h> 2 i n t main ( ){ 3 i n t i ; 4 5 i =10; 6 p r i n t f ( ”%d\n” , ++i ) ; 7 8 return 0 ; 9 } O lac¸o controlado por um contador e´ constru´ıdo a partir da estrutura for(< inicio >;< condicional >;< passo >), onde < inicio > corresponde a inicial- izac¸a˜o do contador, < condicional > corresponde ao teste condicional que limita o nu´mero de iterac¸a˜o e < passo > representa o incremento sobre o contador. Listing 3.14: Exemplo de co´digo C. Lac¸o controlado 1 #include<s t d i o . h> 2 #include<math . h> 3 i n t main ( ){4 i n t i , x ; 5 6 f o r ( i =0; i <10; i ++){ 7 p r i n t f ( ” %d − I n fo rme um v a l o r : ” , i ) ; 8 s c a n f ( ”%d” ,&x ) ; 9 p r i n t f ( ”A r a i z quadrada e i g u a l a %f \n” , s q r t ( x ) ) ; 10 } 11 12 return 0 ; 13 } Nesse exemplo, a estrutura ira´ repetir 10 vezes o bloco de operac¸o˜es associ- ado. Observe que a varia´vel i e´ inicializada com zero, e enquanto i < 10 o lac¸o repete, a cada iterac¸a˜o i e´ incrementado de 1 (i++). 3.4 Estruturas unidimensionais e multidimension- ais Em C e´ poss´ıvel a manipulac¸a˜o de um conjunto de varia´veis do mesmo tipo que compartilham um mesmo identificador, as estruturas homogeˆneas de dados. As varia´veis sa˜o indexadas a esse identificador com a finalidade de permitir um acesso unificado a estrutura, pore´m, com a individualizac¸a˜o dos elementos do conjunto. CHAPTER 3. PRIMEIROS PASSOS 20 Uma matriz unidimensional, chamada de vetor, permite a indexac¸a˜o de varia´veis em apenas uma dimensa˜o. Logo, e´ preciso apenas a manipulac¸a˜o de um ı´ndice para acessar as varia´veis dentro do conjunto. Na linguagem C um vetor de tamanho esta´tico e´ declaro atrave´s da sintaxe: < tipo > < identificador > [< tamanho >]; Exemplo: int v [5]; Figure 3.8: As estruturas indexadas como, os vetores e matrizes, sa˜o manipuladas interna- mente por ponteiros. Um ponteiro e´ um mecanismos que manipula diretamente enderec¸os de memo´ria. A primeira posic¸a˜o da estrutura e´ o enderec¸o onde foi declarado o vetor. Por exemplo, o enderec¸o inicial do vetor v e´ o pro´prio referen- ciado pelo seu identificador, suponha que seja o enderec¸o 100 na memo´ria, toda a estrutura ocupa 5 posic¸o˜es, assumi-se enta˜o que sejam 100, 101, 102, 103 e 104. Para acessar uma posic¸a˜o basta somar um ı´ndice ao enderec¸o inicial, logo, para acessar a primeira posic¸a˜o utiliza-se o ı´ndice 0. Veja o exemplo a seguir. Listing 3.15: Exemplo de co´digo C. Lac¸o controlado 1 #include<s t d i o . h> 2 #include<math . h> 3 i n t main ( ){ 4 i n t v [ 5 ] , i ; 5 6 v [ 0 ] = 1 ; 7 v [ 1 ] = 4 8 v [ 2 ] = −5; 9 v [ 3 ] = 10 ; 10 v [ 4 ] = 6 ; 11 12 p r i n t f ( ”%d” , v [ 2 ] ) ; 13 14 i =4; 15 CHAPTER 3. PRIMEIROS PASSOS 21 16 p r i n t f ( ”%d” , v [ i ] ) ; 17 18 return 0 ; 19 } Observe nas linhas 6-10, esta˜o sendo atribu´ıdos valores a cada posic¸a˜o do vetor, ou seja, a cada varia´vel indexada nesse conjunto. Na linha 12, esta´ sendo impresso o valor armazenado na terceira posic¸a˜o desse vetor, dado que o primeiro ind´ıce e´ 0 a posic¸a˜o 2 corresponde ao terceiro elemento. Na linha 14, esta´ sendo utilizado uma varia´vel i para acessar uma posic¸a˜o, nesse caso como i foi inicializado com 4 a quinta posic¸a˜o sera´ acessada e seu conteu´do impresso. Com isso, e´ percept´ıvel o uso de estruturas de repetic¸a˜o para manipulac¸a˜o de vetores e matrizes. Um lac¸o controlado por contador pode utilizado, dado que sabe-se o tamanho do vetor e consequentemente o nu´mero de iterac¸o˜es. Observe o pro´ximo exemplo, nele um vetor de 5 posic¸o˜es e´ inicializado com dados fornecidos pelo usua´rio, atrave´s da func¸a˜o scanf na linha 7. Apo´s, e´ impresso o valor de cada elemento do vetor multiplicado por 2, linha 10. Listing 3.16: Exemplo de co´digo C. Lac¸o controlado 1 #include<s t d i o . h> 2 #include<math . h> 3 i n t main ( ){ 4 i n t v [ 5 ] , i ; 5 6 f o r ( i =0; i <5; i ++){ 7 s c an f ( ”%d” , &v [ i ] ) 8 } 9 f o r ( i =0; i <5; i ++){ 10 p r i n t f ( ”%d” , v [ i ] ∗ 2 ) ; 11 } 12 13 return 0 ; 14 } Cuidados devem ser tomados quando se esta´ manipulando ı´ndices de vetores e matrizes: • os ı´ndices sa˜o devem ser inteiros (constante, varia´vel ou expressa˜o) • o primeiro elemento possui ı´ndice 0 • ao acessar os elementos na˜o deve-se ultrapassar os limites, ou seja, um vetor de 5 elementos e´ acessado por ı´ndices entre 0 e 4. Atividade 7 Ler um vetor de 10 elementos e copiar os valores maiores que 25 para um vetor auxiliar. Apo´s copiar os elementos seu programa devera´ imprimir o vetor auxiliar. CHAPTER 3. PRIMEIROS PASSOS 22 As estruturas multidimensionais sa˜o conhecidas como matrizes. Nesse caso, cada dimensa˜o da matriz e´ indexada por um ı´ndice, por exemplo, para acessar uma posic¸a˜o dentro de uma matriz bidimensional sa˜o necessa´rios 2 ı´ndices, uma para as linhas e outro para as colunas da matriz. A declarac¸a˜o de uma matriz segue a sintaxe: < tipo > < identificador > [< dim1 >]...[< dimn >]; Por exemplo, para uma matriz de inteiros com 2 dimenso˜es de tamanho esta´tico: int matriz[3][5]; Figure 3.9: Uma matriz e´ considerada um vetor de vetores, onde cada posic¸a˜o do vetor possui outro vetor denotando outra dimensa˜o. Logo, a manipulac¸a˜o de uma ma- triz segue os mesmos princ´ıpios das estruturas unidimensionais mas considerando agora um ı´ndice para cada dimensa˜o. Nesse caso, para percorrer toda a estrutura sa˜o necessa´rios um lac¸o para cada dimensa˜o. Os lac¸os devem estar aninhados, permitindo a fixac¸a˜o de uma dimensa˜o enquanto percorre outra completamente. Considere o exemplo da Figura 3.9, nele e´ apresentada uma matriz de duas dimenso˜es, podemos dizer que uma dimensa˜o e´ representada pelas linhas e a outra pelas colunas da matriz. Para indexar cada dimensa˜o suponha que foram criadas as varia´veis linha e coluna. Para percorrer todos os elementos podemos fixar uma dimensa˜o por exemplo as linhas e percorrer as colunas, acessando cada elemento da linha, a estrutura e´ apresentada na Figura 3.10. Pode-se tambe´m percorrer fixando uma coluna e percorrendo as linhas acessando cada elemento da coluna, apresentada na Figura 3.11. Atividade CHAPTER 3. PRIMEIROS PASSOS 23 Figure 3.10: Percorrendo uma matriz bidimensional linha-coluna. Figure 3.11: Percorrendo uma matriz bidimensional coluna-linha. CHAPTER 3. PRIMEIROS PASSOS 24 EM EDIC¸A˜O Prefacio Introdução Computador Programa A construção de um programa Exercício Noções importantes Diferenciando maiúsculas de minúsculas Formatação e bibliotecas Arquivos gerados - sem pane!! Primeiros Passos Programas Sequenciais Variáveis, Constantes e Expressões Entrada e Saída de dados Formatação Programas com Repetição Estruturas unidimensionais e multidimensionais
Compartilhar