You are on page 1of 346
C: DESCOMPLICADA Prof. André R. Backes 1. Introdugéo 1 1.2 13 14 AlinguagemG 0... 2.0.0... eee ee 1.1.1 Influéncia da linguagemC.. 2.2... Utilizando 0 Code::Blocks para programar em C 1.2.1 Criando um novo projeto no Cade::Blocks 1.2.2 Utilizando 0 debugger do Code::Blocks . . Esqueleto de um programa em linguagemC . . 1.3.1 Indentagao do cédigo ...... 1.3.2 Comentarios ............-.0-- Bibliotecas e fungées Uteis da linguagemC .. . . 1.4.1 O comando #include 1.4.2. Fungdes de entrada e saida: stdioh .. . . 1.4.3 FungGes de utilidade padrao: stdlib.h 1.4.4 Fungdes matematicas: math.h . . . . 1.4.5. Testes de tipos de caracteres: clype.h 1.4.6 Operagées em String: stringh ...... . 1.4.7 Fungées de data e hora: time... . . 2 Manipulando dados, variéveis e expressées em C 24 22 Variéveis 0... eee eee 2.1.1 Nomeando uma varidvel........-- 2.1.2. Definindo o tipo de uma variével .. . . . Lendo e escrevendodados ............- 224 Prinf 2.6.2.2... eee eee ee "4 "1 15 19 24 . 22 . 23 23 24 . 26 28 . 29 . 29 30 32 32 33 35 - 39 39 23 24 25 222 Putchar............ 223 Scant... .... ec eee e ee eee 224 Getchar............. 0.2008 Escopo: tempo de vida da variavel . Constantes . 2.4.1 Comandoidefine .............. 2.4.2 Comandoconst......... 6.00005 2.4.3 seqiénciasdeescape........... Operadores .... 2... 2.5.1 Operador de atribuigao: 2.5.2 Operadores aritméticos .......-.- 2.5.3 Operadores relacionais .......... 25.4 Operadoreslégicos .........---- 25.5 Operadores bit-abit .... . 2.5.6 Operadores de atribuigo simplificada 2.5.7 Operadores de Pré e Pés-Incremento 2.5.8 Modeladores de Tipos (casts)... . . . . 25.9 Operadorvirguia? ...........5 2.5.10 Precedéncia de operadores... ... . 3. Comandos de Controle Condicional 3.4 3.2 3.3 34 Definindo uma condigfo... 0... eee ee Comandoif 6.6... eee eee eee eee 3.2.1 Usodaschaves{}.........-.-.. Comando else Aninhamentodeif .......-.....-0055 42 43 - 46 47 52 - 58 . 53 54 - 85 . 55 58 60 . 62 63 66 . 67 69 70 n 73 73 . 75 . 78 79 - 88 35 3.6 Operador? ........ Comando switch 3.6.1 Uso do comando break no switch... . . . 3.6.2 Uso das chaves {Jno case . .- Comandos de Repetigao 44 42 43 44 45 46 47 48 Repeti¢ao por condigao . 4.1.1 Lagoinfinito. .. . Comando while . nae Comandofor....... 4.3.1. Omitindo uma clausula do comando for . . . 4.3.2 Usando 0 operador de virgula (,) no comando for . . . Comando do-while . . . . Aninhamento de repetigdes .. 22.0.2. eee Comando break Comando continue . . . . Gotoelabel........ Vetores e matrizes - Arrays 5A 52 53 5A 55 5.6 Exemplo de uso Array com uma dimensao - Array com duas dimensées-matriz ........ Arrays multidimensionais Inicializagao de arrays . . 5.5.1 Inicializagéo semtamanho ......... Exemplo de uso de arrays vetor.. 2... eee 86 88 1 94 96 96 97 101 = 104 107 109 112 = 113 115 = 116 119 119 - 120 - 124 125 - 127 - 129 130 6 Arrays de caracteres - Strings 61 62 63 Definigo e deciaragao de uma string 6.1.1. Inicializando umastring ........... 6.1.2 Acessando um elemento da string . . . . Trabalhando com strings... 22... 22.0. 6.2.1 Lendo uma string doteclado .. . . 6.2.2 Escrevendo uma stringnatela....... Fungées para manipulagao de strings... . . . 6.3.1 Tamanhodeumastring........... 6.3.2. Copiando uma string . . 6.3.3 Concatenando strings .......-.-- 6.3.4 Comparando duas strings ......... 7 Tipos definidos pelo programador 77 72 73 74 Estruturas: struct 7.1.1 Inicializagao de estruturas..... 2... 7.1.2 Array de estruturas.. 2.2.2... eee 7.1.3 Atribuigdo entre estruturas ........ 7.4.4 Estruturas aninhadas ........... Unides: union... 2... eee eee Enumaragbes: enum. .........-.02-- Comando typedef... 2.0.0... ee eee 8 Fungées 8.4 Definigao e estruturabésica...........-. 8.1.1 Declarando uma fungao . . . ae 8.1.2. Parametros de uma fungao 133 133 - 134 134 135 - 136 - 139 140 - 140 . 144 142 142 144 144 149 150 152 153 - 155 158 163 167 . 167 168 171 8.1.3 Corpodafungdo .............-0. e000 173 8.1.4 Retorno da funcdo . . . - 176 8.2. Tipos de passagem de parémetros.......... cee 181 82.1 Passagemporvalor .... 2.0.2... 0. 00005 182 82.2 Passagemporreferéncia ................ 183 82.3 Passagem de arrays como parémetros ....... . 186 8.2.4 Passagem de estruturas como parametros .... . « 190 825 OperadorSeta.............-. 193 83 Recurséo ... 2.0... cece eee ee eee - 194 9 Ponteiros 200 91 Declaragio 6.2... eee eee 201 9.2 Manipulando ponteiros.... 0... 2... 202 9.2.1 Inicializagdo e atribuiggo...... 2... +. « 202 9.2.2 Aritmética com ponteiros . 208 9.2.3 Operagées relacionais com ponteiros . . ait 9.3 Ponteiros genéricos ............. 005 213 94 Ponteirose arrays... . 66... eee 215 9.4.1 Ponteiros @ arrays multidimensionais . . . 219 9.4.2 Array deponteios ... 2.2... 2... + 220 9.5 Ponteiro paraponteiro...........-..- 221 10 Alocacao Dinamica 225 10.1 Fungées para alocagéo de memoria... ... . . < «227 10.14 siz00f) .. 0 eee eee = 227 10.1.2 malloc)... 0.6... ee wee 228 10.1.3 calloc() 231 10.1.4 realloc() ... 2... 10.1.5 free() 10.2 Alocagao de arrays multidimensionais . . . 10.2.1 Solugao 10.2.2 Solugao 10.2.3 Solugéo 3: 11 Arquivos 11.1 Tipos de Arquivos ..... jonteiro para ponteiro para array isando array unidimensional... .. . . . : usando ponteiro para ponteiro..... . . 11.2 Sobre esorita e leituraem arquivos.....-........5 11.3 Ponteiro para arquivo 11.4 Abrindo e fechando um arquivo ...... 2-22-6200 55 11.4.1 Abrindo um arquivo. 11.4.2 Fechando um arquivo 11.5 Escrita e leitura em arquivos 11.5.1 Escritae leitura de caractere .............5 11.5.2 Fim do arquivo... . 11.5.3 Arquivos pré-definidos 11.5.4 Forgando a escrita dos 11.5.5 Sabendo a posigao atual dentro do arquivo dados do “buffer” 11.5.6 Escritae leitura de strings... 2.222 ee 11.5.7 Escrita e leitura de blocos de bytes........... 11.5.8 Escritae leitura de dados formatados ........ . 11.6 Movendo-se dentro do arquivo 11.7 Excluindo um arquivo 11.8 Erro ao acessar um arquivo . . - 238 238 240 = 244 248 248 250 - 251 251 251 256 - 257 257 . 261 262 - 263 - 264 265 269 277 282 284 12 Avangado 12.1 Diretivas de compilagéo ..... 2.0.0... 12.1.1 Ocomando #incude... 2.2... 12.1.2 Definindo macros: #define e #undef 12.1.3 Diretivas de Inclusdo Condicional . . . 12.1.4 Controle de linha: #line ©... 2... 12.1.5 Diretiva de erro: #error. . 6... 2... 12.1.6 Diretiva#pragma... 22... 12.1.7 Diretivas pré-definidas.......... 12.2 Trabalhando com Ponteiros ....... 2... 12.2.1 Array de Ponteiros e Ponteiro para array 12.2.2 Ponteiro parafungéo........... 12.3 Argumentos nalinha de comando ....... 12.4 Recursos avangados da fungao printi() : 12.4.1 Os tipos de saida 12.4.2 As ‘flags’ para os tipos de saida . . . 12.4.3 O campo “largura” dos tipos de saida 12.4.4 0 campo “preciséo” dos tipos de saida . . 12.4.5 O campo “comprimento” dos tipos de saida 12.4.6 Usando mais de uma linha na fungao printf() .. . . . 12.5 Recursos avangados da fungao scanf() . . . . 12.5.1 Ostipos de entrada ........... 12.5.2 Ocampo asterisco” .......... 12.5.3 O campo “largura” dos tipos de entrada 12.5.4 Os “modificadores" dos tipos de entrada 12.5.5 Lendo e descartando caracteres . . . 287 287 - 287 287 294 - 297 - 298 12.5.6 Lendo apenas caracteres pré-deter 12.6 Classes de Armazenamento de Variéveis . 12.6.1 AClasse auto... 2.0.2.2... 0.20 12.6.2 AClasseexterm .. 2.0.2... 0-22 e ee eee 12.6.3 AClasse static... 2.0... 2 eee eee 12.6.4 AClasse register... . . 12.7 Trabalhando com campos debits... .... 2.2.06. 0 12.8 O Modificador de tipo “volatile” .......... 12.9 Fungées com numero de parémetros variavel . . . . 334 334 335 . 337 338 340 . 342 INTRODUGAO 1.1 ALINGUAGEM C A linguagem C 6 uma das mais bem sucedidas linguagens de alto nivel ja criadas e considerada uma das linguagens de programagao mais utiliza- das de todos os tempos. Define-se como linguagem de alto nivel aquela que possui um nivel de abstragao relativamente elevado, que esta mais préximo da linguagem humana do que do cédigo de maquina. Ela foi cri- ada em 1972 nos laboratérios Bell por Dennis Ritchie, sendo revisada e pa- dronizada pela ANSI (Instituto Nacional Americano de Padrées, do inglés ‘American National Standards Institute) em 1989. Trata-se de uma linguagem estruturalmente simples e de grande portabi- lidade. Poucas so as arquiteturas de computadores para que um compi- lador C néo exista. Além disso, 0 compilador da linguagem gera cédigos mais enxutos e velozes do que muitas outras linguagens. A linguagem C 6 uma linguagem procedural, ou seja, ela permite que um problema complexo seja facilmente decomposto em médulos, onde cada médulo representa um problema mais simples. Além disso, ela fornece acesso de baixo nivel memoria, o que permite 0 acesso e a programacao direta do microprocessador. Ela também permite a implementagao de pro- gramas utilizando instrugdes em Assembly, 0 que permite programar pro- blemas onde a dependéncia do tempo é critica. Por fim, a linguagem C foi criada para incentivar a programagéo multi- plataforma, ou seja, programas escritos em C podem ser compilado para uma grande variedade de plataformas e sistemas operacionais com ape- nas pequenas alteragées no seu cédigo fonte. 1.1.1 INFLUENCIA DA LINGUAGEM C Alinguagem C tem influenciado, direta ou indiretamente, muitas linguagem desenvolvidas posteriormente, tais como C++, Java, C# e PHP. Na figura abaixo 6 possivel ver uma bre histéria da evolugao da linguagem C e de sua influéncia no desenvolvimentos de outras linguagens de programagao: nr Eo Gora Provavelmente, ainfluéncia mais marcante da linguagem foi a sua sintatica: todas as linguagem mencionadas combinam a sintaxe de declaracao e a sintaxe da expressao da linguagem C com sistemas de tipo, modelos de dados, etc. A figura abaixo mostra como um comando de impressao de nimeros variando de 1 até 10 pode ser implementado em diferentes lin- guagens: {CC seseeeeeeaseeceseaeesasestHe Java forli= 1; i <= 10;i++) for(int i=1;i<=10;i++) { { printf("%d\n",i); System.out.printin(i); } } $i <= 10; Sit+) echo $i; print $i; } } 10 1.2 UTILIZANDO O CODE::BLOCKS PARA PROGRAMAR EM C Existem diversos ambientes de desenvolvimento integrado ou IDE’s (do inglés, Integrated Development Environment) que podem ser utilizados para a programacdo em linguagem C. Um deles é 0 Code::Blocks, uma IDE de cédigo aberto e multiplataforma que suporta matiplos compiladores. O Code::Blocks pode ser baixado diretamente de seu site www. codeblocks. org ou pelo link prdownload.berlios.de/codeblocks/codeblocks-10.0Smingw-setup.exe esse Ultimo inclui tanto a IDE do Code::Blocks como o compilador GCC e © debugger GDB da MinGW. CRIANDO UM NOVO PROJETO NO CODE::BLOCKS Para criar um novo projeto de um programa no software Code::Blocks, basta seguir os passos abaixo: 1. Primeiramente, inicie 0 software Gode::Blocks (que ja deve estar instalado no seu computador). A tela abaixo devera aparecer; 2. Em seguida clique em “File”, e escolha “New” e depois “Project. " | ere reer Seth Too! Pages serige oe Bop ato eer projects Il sweat c= | ee | rere a 3. Uma lista de modelos (templates) de projetos iré aparecer. Escolha “Console aplication”; = FS a Ss aparecer. Se marcarmos a op¢ao “Skip this pat tela de bias vindas nao sera mais exibida da préxima vez que criar- mos um projeto. Em seguinda, ue em “Next”; 12 LCE Wscsiaigk tc ecto epaten anyon aan psa as Nae ses aeaec aoe 5. Escolha a opgao “C” e clique em “Next”; Corsi episton = AY oo ectcteaen nett 6. No campo “Project title”, coloque um nome para o seu projeto. No campo “Folder to create project in” é possivel selecionar onde 0 projeto sera salvo no computador. Clique em “Next” para continuar; | PARTE sss 7. Na tela a seguir, algumas configuragées do compilador podem ser modificados. No entanto, isso nao sera necessério. Basta clicar em “Finish”; | (RIE TOR isccsacisets geste torsion ise eS et ee in a Sica Rakes Ss becoanpars eRe 8. Ao fim desses pasos, o esqueleto de um novo programa C tera sido criado, como mostra a figura abaixo: 14 He tat Vw Sch Proec fuld Oamug enim ode Magee Setage up +6ma eg OF GO aeembes = BED NEO. 9. Por fim, podemos utilizar as seguintes opgées do menu “Build” para compilar e executar nosso programa: ‘© Compile current file (Ctrl+Shift+F9): essa opgao ira ransfor- mar seu arquivo de cédigo fonte em instruges de maquina e gerar um arquivo do tipo objeto; * Build (Ctrl+F9): seréo compilados todos os arquivos do seu projeto e fazer 0 processo de linkagem com tudo que 6 ne- cessario para gerar 0 executavel do seu programa; * Build and run (F9): além de gerar 0 executdvel, essa opcdo também executa 0 programa gerado. UTILIZANDO 0 DEBUGGER DO CODE::BLOCKS Com 0 passar do tempo, nosso conhecimento sobre programacao cresce, assim como a complexidade de nossos programas. Surge entéo a ne- cessidade de examinar 0 nosso programa a procura de erros ou defeitos no cédigo fonte. para realizar essa tarefa, contamos com a ajuda de um depurador ou debugger. O debugger nada mais é do que um programa de computador usado para testar e depurar (limpar, purificar) outros programas. Dentre as principais funcionalidades de um debugger estao: ‘* a possibilidade de executar um programa passo-a-passo; ‘* pausar 0 programa em pontos pré-definidos, chamados pontos de parada ou breakpoints, para examinar o estado atual de suas va 15 Para utilizar o debugger do Code::Blocks, imagine o seguinte cédigo abaixo: Exemplo: cédigo para o debugger 1 #include 2 #include int 3 int fatorial (int n){ t int i for (i= 1; 1 < fats iy return; las) main () { int xy printi(‘*Digite um valor inteiro: seant("%d'",8x); if (x > 0¢ printt("°X eh positivo\n’’); y = fatorial (x); printt(**Fatorial de X eh %i\n''.y); pelse{ if (x < 0) printf (“’X eh negative\n''); else printf(‘°X eh Zero\n’"); printf (‘Fim do programa!\n’*); system (pause) ; return 0; Todas as funcionalidades do debugger podem ser encontradas no menu Debug. Um progama pode ser facilmente depurado seguindo os pasos abaixo: 1. Primeiramente, vamos colocar dois pontos de parada ou breakpt ts no programa, nas linhas 13 e 23. Isso pode ser feito de duas manei- ras: clicando do lado direito do ntimero da linha, ou colocando-se 0 cursor do mouse na linha que se deseja adicionar o breakpoint e selecionar a op¢ao Toggle breakpoint (F5). Um breakpoint é iden- tificado por uma bolinha vermelha na linha; 16 I 2. Iniciamos 0 debugger com a op¢ao Start (FB). Isso fara com que 0 programa seja executado normalmente até encontrar um breakpoint. No nosso exemplo, o usuario devera digitar, no console, o valor lido pelo comando scant() e depois retornar para a tela do Code::Blocks onde o programa se encontra pausado. Note que existe um triangulo amarelo dentro do primeiro breakpoint. Esse triangulo indica em que parte do programa a pausa esta; 3. Dentro da op¢éo Debugging windows, podemos habilitar a opcao Watches. Essa opeao ira abrir uma pequena janela que permite ver © valor atual das variéveis de um programa, assim como 0 valor pas- 7 sado para fungées. Outra maneira de acessar a janela Watches & mudar a perspectiva do software para a op¢éo Debugging, no menu View, Perspectives; san vetor sneetse: =>» |) Function Aguments 4. A partir de um determinado ponto de pausa do programa, podemos nos mover para a préxima linha do programa com a op¢ao Next line (F7). Essa opgao faz com que o programa seja executado passo-a- passo, sempre avangando para a linha seguinte do escopo onde nos encontramos; 5. Frequentemente, pode haver uma chamada a uma fungao construida pelo programador em nosso cédigo, como é 0 caso da fungao fato- rial(). A opgao Next line (F7) chama a fungao, mas nao permite que a estudemos passo-a-passo. Para entrar dentro do cédigo de uma fungao utilizamos a opcao Step into (Shift+F7) na linha da chamada da fungao. Nesse caso, o triangulo amarelo que marca onde estamos no cédigo vai para a primeira linha do cédigo da fungao (linha 4); 18 6. Uma vez dentro de uma fungao, podemos percorré-la passo-a-passo com a opgao Next line (F7). Terminada a fungao, o debugger vai para a linha seguinte ao ponto do cédigo que chamou a fungao (linha 16). Caso queiramos ignorar o resto da fungao e voltar para onde estavamos no cédigo que chamou a fungao, basta clicar na pedo Step out (Shift+Ctrl+F7); 7. Para avangar todo 0 cédigo e ir direto para o préximo breakpoint, podemos usar a op¢ao Continue (Ctrl+F7); 8. Por fim, para parar o debugger, basta clicar na op¢éo Stop debug- ger. 1.3. ESQUELETO DE UM PROGRAMA EM LINGUAGEM C. Todo programa escrito em linguagem C que vier a ser desenvolvido deve possuir 0 seguinte esqueleto Primeiro programa em linguagem C 4 include 2 #include 3 int main(){ 4 printf(**Hello World \n’"); 5 system(*‘pause’’); 6 return 0; 7) 19 A primeira vista este parece ser um programa futil, jA que sua tinica fina- lidade @ mostrar na tela uma mensagem dizendo Hello World, fazer uma pausa, e terminar o programa. Porém, ele permite aprender alguns dos conceitos basicos da lingaugem C, como mostra a figura abaixo: Deciaragées globais: bidbotecas usadas elo programa include include , Escrave uma mensagem Inicio do pas na tela de salda Faz uma pavsa antes de Fimdo LY \ terminar 0 programa programa Retoma o aédigo de erro ZERO para o Sistema Operacional informando que esta tudo OK. Abaixo, é apresentada uma descrigao mais detalhada do esqueleto do pro- arama’ ‘* Temos, no inicio do programa, a regido onde sao feitas as declaragées globais do programa, ou seja, aquelas que sao validas para todo 0 programa. No exemplo, 0 comando #include 6 utilizado para declarar as bibliotecas que serao utilizadas pelo pro- grama. Uma biblioteca é um conjunto de fungées (pedagos de cédigo) jd implementados e que podem ser utilizados pelo programador. No exemplo anterior, duas bibliotecas foram adicionadas ao programa: stdio.h (que contém as fungées de leitura do teclado e eserita em tela) e stdlib.h; ‘* Todo o programa em linguagem C deve conter a fungo main(). Esta fungao é responsdvel pelo inicio da execugao do programa, e é den- tro dela que iremos colocar os comandos que queremos que o pro- grama execute. ‘+ As chaves definem o inicio “{" e 0 fim *}" de um bloco de coman- dos / instrugées. No exemplo, as chaves definem 0 inicio e o fim do programa; ‘* A fungao main foi definida como uma fungdo int (ou seja, inteira), e por isso precisa devolver um valor inteiro. Temos entao a necessi- 20 dade do comando return 0, apenas para informar que o programa chegou ao seu final e que esta tudo OK; * A fungao printf() esta definida na biblioteca stdio.h. Ela serve para imprimir uma mensagem de texto na tela do computador (ou melhor, em uma janela MSDOS ou shell no Linux). O texto a ser escrito deve estar entre “aspas duplas’, e dentro dele podemos também colocar caracteres especiais, como o “\n’, que indica que é para mudar de linha antes de continuar a escrever na tela; ‘+ Ocomando system(“pause”) serve para interromper a execugao do programa (fazer uma pausa) para que vocé possa analisar a tela de saida, apés o término da execucao do programa. Ela esta definida dentro da biblioteca stdlib.h; * Adeclaracao de um comando quase sempre termina com um ponto e virgula *". Nas préximas segdes, nbs veremos quais os comandos que ndo terminam com um ponto e virgula ":"; ‘+ Os parénteses definem o inicio “(" e o fim *)" da lista de argumentos de uma fungao. Um argumento é a informagao que sera passada pata a funcao agir. No exemplo, podemos ver que os comandos main, printf e system, sao funcées; 1.3.1 INDENTACAO DO CODIGO Outra coisa importante que devemos ter em mente quando escrevemos um programa 6 a indentagao do cédigo. Trata-se de uma convensao de escrita de cédigos fonte que visa modificar a estética do programa para auxiliar a sua leitura e interpretacao. A indentagao torna a leitura do cédigo fonte muito mais facil facilita a sua modificacao. A indentagao é 0 espagamento (ou tabulagao) colocado antes de comegar a escrever 0 cédigo na linha. Ele tem como objetico indicar a hierarquia do elementos. No nosso exemplo, os comandos printf, system e return possuem a mesma hierarquia (portanto o mesmo espagamento) e estao todos contides dentro do comando main() (dai o porqué do espagamento).. ideal é sempre criar um novo nivel de indentacao para um novo bloco de comandos. 24 A indentagao é importante pois 0 nosso exemplo anterior poderia ser es- crito em apenas trés linhas, sem afetar o seu desempenho, mas com um alto grau de dificuldade de leitura para 0 programador: Programa sem indentagao 1 #include 2 #include 3 int main(){printf(‘‘Hello World \n’') ;system(‘ ‘pause’ ') sreturn 0;} 1.3.2. COMENT/ 10S Um comentario, como seu préprio nome diz, é um trecho de texto incluido dentro do programa para descrever alguma coisa, por exemplo, o que aquele pedago do programa faz. Os comentarios nao modificam o fun- cionamento do programa pois sao ignorados pelo compilador e servem, portanto, apenas para ajudar o programador a organizar 0 seu cédigo. Um comentario pode ser adicionado em qualquer parte do cédigo. Para tanto, a linguagem C permite fazer comentarios de duas maneiras diferen- tes: por linha ou por bloco. ‘* Seo programador quiser comentar uma tinica linha do cédigo, basta adicionar // na frente da linha. Tudo o que vier na linha depois do / serd considerado como comentario e sera ignorado pelo compilador. ‘+ Se 0 programador quiser comentar mais de uma linha do cédigo, isto 6, um bloco de linhas, basta adicionar /x no comego da primeira linha de comentério e +/ no final da titima linha de comentario. Tudo o que vier depois do simbolo de /+ e antes do +/ sera considerado como comentario e serd ignorado pelo compilador. Abaixo, tem-se alguns exemplos de comentarios em um programa: 22 jos no programa 1 #inelude 2 Finclude 3 int main(){ 4c 5 Escreve & na 7 tela a7 9 printf(**Hello World \n*'): 10 //faz uma pausa no programa 11 system(*'pause'’) 12 return 0; 13} Outro aspecto importante do uso dos comentarios & que eles permitem fa- zer a documentagao interna de um programa, ou seja, permitem descrever © que cada bloco de comandos daquele programa faz. A documentagao 6 uma tarefa extremamente importante no desenvolvimento e manutengao de um programa, mas muitas vezes ignoradas. Os comentarios dentro de um cédigo permitem que um programador en- tenda muito mais rapidamente um cédigo que nunca tenha visto ou que ele relembre 0 que faz um trecho de cédigo a muito tempo implementado por ele. Além disso, saber o que um determinado trecho de cédigo realmente faze aumenta as possibilidades de reutlizé-lo em outras aplicagées. 1.4 BIBLIOTECAS E FUNGOES UTEIS DA LINGUAGEM C 1.4.1 © COMANDO #INCLUDE © comando #include é utiizado para deciarar as bibliotecas que serao utiizadas pelo programa. Uma biblioteca 6 um arquivo contendo um conjunto de 6 fungées (pedagos de cédigo) ja implementados e que po- dem ser utilizados pelo programador em seu programa. Esse comando diz ao pré-processador para tratar 0 contetido de um ar- quivo especificado como se o seu contetido houvesse sido digitado no programa no ponto em que 0 comando #include aparece. 23 O comand #include permite duas sintaxes: * #tinclude : o pré-processador procurara pela biblioteca nos caminhos de procura pré-especificados do compilador. Usa-se essa sintaxe quando estamos incluindo uma biblioteca que 6 propria do sistema, como as biblotecas stdio.h e stdlib.h; * #include “nome.da biblioteca’: 0 pré-processador procuraré pela biblioteca no mesmo diretério onde se encontra 0 nosso programa. Podemos ainda optar por informar o nome do arquivo com 0 caminho completo, ou seja, em qual diretério ele se encontra e como chegar até 1a. De modo geral, os arquivos de bibliotecas na linguagem C so terminados com a extensao .h. ‘Abaixo temos dois exemplos do uso do comando #include: #include #include “D:\Programas\soma.h” Na primeira linha, 0 comando #include é utiizado para adicionar uma bibli- oteca do sistema: stdio.h (que contém as fungées de leitura do teclado escrita em tela). Jé na segunda linha, 0 comand é utilizado para adicionar uma biblioteca de nome soma.h, localizada no diretério “D:\Programas\” 1 FUNGOES DE ENTRADA E SAIDA: STDIO. Operagées em arquivos + remove: apaga o arquivo * rename: renomeia o arquivo Acesso a arquivos * fclose: fecha o arquivo « fflush: limpa o buffer. Quaisquer dados nao escritos no buffer de safda é gravada no arquivo 24 * fopen: abre o arquivo * setbuf: controla o fluxo de armazenamento em buffer Entrada/saida formatadas fprintf: grava uma saida formatada em arquivo fscanf: 18 dados formatados a partir de arquivo printf: imprime dados formatados na saida padrao (monitor) scant: [8 dados formatados da entrada padrao (teclado) sprintf: grava dados formatados em uma string sscanf: 16 dados formatados a partir de uma string Entrada/saida de caracteres * fgete: [6 um caractere do arquivo ‘ fgets: 18 uma string do arquivo ‘© fpute: escreve um caractere em arquivo ‘* fputs: escreve uma string em arquivo © gete: [6 um caractere do arquivo © getchar: [6 um caractere da entrada padrao (teclado) * gets: 16 uma string da entrada padrao (teclado) * pute: escreve um caractere na saida padrao (monitor) » putchar: escreve um caractere na saida padrao (monitor) ‘© puts: escreve uma string na saida padrao (monitor) ‘* ungete: retorna um caractere lide para o arquivo dele Entrada/saida direta «fread: 16 um bloco de dados do arquivo + fwrite: escreve um bloco de dados no arquivo 25 Posicionamento no arquivo « fgetpos: retorna a posigao atual no arquivo fseek: reposiciona o indicador de posigao do arquivo fsetpos: configura 0 indicador de posi¢ao do arquivo ftell: retorna a posigao atual no arquivo rewind: reposiciona o indicador de posigo do arquivo para 0 inicio do arquivo Tratamento de erros « clearerr: limpa os indicadores de erro «feof: indicador de fim-de-arquivo « ferror: indicador de checagem de erro perror: impressao de mensagem de erro Tipos e macros ‘+ FILE: tipo que contém as informagées para controlar um arquivo + EOF: constante que indica o fim-de-arquivo «NULL: ponteiro nulo Conversao de strings « atof: converte string para double « atoi: converte string para inteiro + atol: converte string para inteiro longo ‘* strtod: converte string para double e devolve um ponteiro para 0 préximo double contido na string * strtol: converte string para inteiro longo e devolve um ponteiro para © préximo inteiro longo contido na string 26 * strtoul: converte string para inteiro longo sem sinal e devolve um ponteiro para o préximo inteiro longo sem sinal contido na string Geracao de seqiléncias pseudo-aleatorias rand: gera ntimero aleatério © srand: inicializa o gerador de numeros aleatorios Gerenciamento de meméria dinamica ‘* malloc: aloca espago para um array na memoria * calloc: aloca espaco para um array na meméria e inicializa com ze- ros « free: libora o espago alocado na meméria ‘+ realloc: modifica 0 tamanho do espago alocado na meméria Ambiente do programa ‘* abort: abortar o processo atual * atexit: define uma fungao a ser executada no término normal do programa exit: finaliza o programa ‘© getenv: retorna uma varidvel de ambiente ‘« system: executa um comando do sistema Pesquisa e ordenagao * bsearch: pesquisa binaria em um array * qsort: ordena os elementos do array Aritmética de inteiro * abs: valor absoluto © div: divisao inteira * labs: valor absoluto de um inteiro longo Idiv: divisao inteira de um inteiro longo 27 1.4.4 FUNCOES MATEMATICAS: MATH.H Fungées trigonométricas ‘+ cos: calcula o cosseno de um angulo em radianos «sin: calcula o seno de um angulo em radianos * tan: calcula a tangente de um Angulo em radianos * acos: calcula 0 arco cosseno * asin: calcula o arco seno ‘* atan: calcula o arco tangente atan2: calcula o arco tangente com dois parémetros. Fungées hiperbélicas ‘+ cosh: calcula 0 cosseno hiperbélico de um angulo em radianos inh: calcula o seno hiperbélico de um Angulo em radianos « tanh: calcula a tangente hiperbélica de um angulo em radianos Fungées exponenciais e logaritmicas + exp: fungao exponencial ‘* log: logaritmo natural + 10910: logaritmo comum (base 10) ‘+ modf: quebra um nimero em partes fracionarias e inteira Fungées de poténcia * pow: retorna a base elevada ao expoente # sqrt: raiz quadrada de um nimero Fungées de arredondamento, valor absoluto e outras ceil: arredonda para cima um nimero 28 fabs: calcula 0 valor absoluto de um niimero « floor: arredonda para baixo um ntimero ‘* fmod: calcula o resto da divisao 1 TESTES DE TIPOS DE CARACTERES: CTYPE.H + isalnum: verifica se 0 caractere 6 alfanumérico « isalpha: verifica se o caractere é alfabético iscntrl: verifica se o caractere é um caractere de controle * isdigit: verifica se o caractere & um digito decimal + islower: verifica se 0 caractere é letra mintiscula « isprint: verifica se caractere é imprimivel * ispunet: verifica se é um caractere de pontuagéo * isspace: verifica se caractere é um espago em branco + isupper: verifica se 0 caractere é letra maitiscula © isxdi veritica se 0 caractere é digito hexadecimal * tolower: converte letra maiuscula para minuscula * toupper: converte letra mintiscula para maitiscula 1 OPERAGOES EM STRING: STRING.H Cépia ‘+ memepy: cépia de bloco de meméria memmove: move bloco de memoria « strepy: cépia de string + strnepy: cépia de caracteres da string Concatenagao 29 « streat: concatenacao de strings * strncat: adiciona “ caracteres de uma string no final de outra string Comparagao ‘© mememp: compara dois blocos de mem6r « stremp: compara duas strings ‘* strnemp: compara os “n” caracteres de duas strings Busca ‘* memchr: localiza caractere em bloco de meméri ‘« strchr: localiza primeira ocorréncia de caractere em uma string « strespn: retorna o nimero de caracteres lidos de uma string antes da primeira ocorréncia de uma segunda string ‘* strpbrk: retorna um ponteiro para a primeira ocorréncia na string de qualquer um dos caracteres de uma segunda string strrchr: retorna um ponteiro para a tiltima ocorréncia do caratere na string ‘« strspn: retorna 0 comprimento da string que consiste s6 de caracte- res que fazem parte de uma outra string * strtok: divide uma string em sub-strings com base em um caractere Outras ‘+ memset: preenche bloco de meméria com valor especificado ‘* strerror: retorna o ponteiro para uma string de mensagem de erro «strlen: comprimento da string 1.4.7 FUNCOES DE DATA E HORA: TIME.H Manipulacao do tempo 30 clock: retorna o niimero de pulsos de clock decorrido desde que o programa foi lancado itftime: retorna a diferenca entre dois tempos mktime: converte uma estrutura tm para o tipo time.t time: retorna o tempo atual do calendario como um time t Conversao ‘* asctime: converte uma estrutura tm para string ctime: converte um valor time.t para string gmtime: converte um valor time t para estrutura tm como tempo UTC. * localtime: converte um valor time.t para estrutura tm como hora local strftime: formata tempo para string Tipos e macros * clock.t: tipo capaz de representar as contagens clock e suportar operagées aritméticas « size_t: tipo inteiro sem sinal ‘* time.t: tipo capaz de representar os tempos e suportar operacées aritméticas * struct tm: estrutura contendo uma data e hora dividida em seus com- ponentes + CLOCKS PER SEC: niimero de pulsos de clock em um segundo 31 LQ ey oe Gece oad 24 VARIAVEIS Na matematica, uma variavel 6 uma entidade capaz de representar um valor ou expressao. Ela pode representar um numero ou um conjunto de néimeros, como na equacéo 2 +2r+1=0 ou na fungao f(@) Na computagao, uma variavel é uma posigao de meméria onde poderemos guardar um determinado dado ou valor e modifica-lo ao longo da execugao do programa. Em linguagem C, a declaragao de uma variavel pelo progra- mador segue a seguinte forma geral: tipo da variavel nome da variavel; tipo.da_variavel determina o conjunto de valores e de operagdes que uma varidvel aceita, ou seja, que ela pode executar. J4 o nome da variavel 6 como o programador identifica essa variével dentro do programa. Ao nome que da variavel 0 computador associa 0 enderego do espaco que ele reservou na meméria para guardar essa variavel. Depois declaragao de uma varidvel 6 necessario colocar um ponto e rgula (;). Isso é necessario uma vez que 0 ponto e virgula é utiizado para separar as instruges que compéem um programa de computador. DECLARANDO VARIAVEIS Uma varidvel do tipo inteiro pode ser declarada como apresentado a se- guir: int x; 32 ‘Além disso, mais de uma variavel pode ser declarada para um mesmo tipo. Para tanto, basta separar cada nome de variavel por uma virgula (,) int xyz: Uma varidvel deve ser declarada antes de ser usada no programa. Lembre-se, apenas quando declaramos uma variavel 6 que o computador reserva um espaco de meméria para guardarmos nossos dadbos. Antes de usar 0 contetido de uma variavel, tenha certeza de que 0 mesmo foi atribuido antes. 1 include 2 #include 3 int main(){ 4 int x; 5 printh(**x = %d\n’ x); 6 x= 5; 7 printl(**x = %d\n" x); 8 system(*“pause'’); 9 return 0; 10} Saida x = qualquer valor 5 Quando falamos de meméria do computador néo existe o conceito de posi¢ao de meméria “vazia’. A posigao pode apenas nao estar sendo utlli- zada. Cada posigao de meméria do computador esta preenchida com um conjunto de 0's e 1's. Portanto, ao criarmos uma variavel, ela automatica- mente estar preenchida com um valor chamado de “lixo 1 NOMEANDO UMA VARIAVEL Quando criamos uma variével, 0 computador reserva um espaco de meméria onde poderemos guardar o valor associado a essa variavel. Ao nome que damos a essa variével 0 computador associa o enderego do espago que 33 ele reservou na meméria para guardar essa variével. De modo geral, inte- ressa ao programador saber o nome das variaveis. Porém, existe algu- mas regras para a escolha dos nomes das variaveis na linguagem C. ‘* Onome de uma variavel 6 um conjunto de caracteres que podem ser letras, ndmeros ou underscores "_ * O nome de uma varidvel deve sempre iniciar com uma letra ou 0 underscore "_". A Na linguagem C, letras maidsculas e mindsculas s4o con- sideradas diferentes. A linguagem C 6 case-sensitive, ou seja, uma palavra escrita utilzando caracteres maitisculos ¢ diferente da mesma palavra escrita com carac- teres minusculos. Sendo assim, as palavas Soma, soma e SOMA sao consideradas diferentes para a linguagem C e representam TRES variaveis distintas. b Palavras chaves nao podem ser usadas como nomes de varidveis. As palavras chaves sao um conjunto de 38 palavras reservadas dentro da linguagem C. Sao elas que formam a sintaxe da linguagem de programagao C. Essas palavras jd possuem fungées especificas dentro da linguagem de programacao e, por esse motivo, elas nao podem ser utiizadas para outro fim como, por exemplo, nomes de varidveis. Abaixo, tem-se uma lista com as 38 palavras reservadas da linguagem C. ta de palavras chaves da linguagem C auto double int struct break else long _switch case enum if typeof continue float return while union const for short unsigned char extern signed void default. do sizeof volatile goto register static © exemplo abaixo apresenta alguns nomes possiveis de variéveis e outros que fogem as regras estabelecidas: 34 Exemplo: nomeando variaveis comp! var int = var tcont «-x = Va-123 @ cont Cont Va123 teste 1 contt — x& 2.1.2 DEFININDO 0 TIPO DE UMA VARIAVEL Vimos anteriormente que o tipo de uma variavel determina 0 conjunto de valores e de operacées que uma variével aceita, ou seja, que ela pode executar. A linguagem C possui um total de cinco tipos de dados bsicos. Sao eles: Tipo Bits Intervalo de valores char 8 -128 A127 int 32—-2.147.483.648 A 2.147.483.647 float 32 1,175494E-038 A 3,402823E+038, double 64 —2,225074E-308 A 1,797693E+308 void 8 sem valor O TIPO CHAR Comecemos pelo tipo char. Esse tipo de dados permite armazenar em um nico byte (8 bits) um ntimero inteiro muito pequeno ou 0 cédigo de um caractere do conjunto de caracteres da tabela ASCII: char c= charn 10; [ a Caracteres sempre ficam entre ‘aspas simples’! Lembre-se: uma tinica letra pode ser o nome de uma varidvel. As ‘aspas simples’ permitem que o compilador saiba que estamos inicializando nossa variével com uma letra e nao com o contetido de outra variavel. OTIPO INT 35 segundo tipo de dado é 0 tipo inteiro: int. Esse tipo de dados permite armazenar um nimero inteiro (sem parte fracionaria). Seu tamanho de- pende do processador em que 0 programa esta rodando, e é tipicamente 16 ou 32 bits: intn = 1459; Cuidado com a forma com que vocé inicializa as varidveis dos tipos char e int. Na linguagem C, os tipos char e int podem ser especificados nas ba- ses decimal (padrao), octal ou hexadecimal. A base decimal é a base padrao. Porém, se o valor inteiro for precedido por: + 0", ele sera interpretado como octal. Nesse caso, o valor deve ser definido utilizando os digitos de 0, 1, 2, 3, 4, 5, 6 @ 7. Ex: Nesse caso, 044 equivale a 36 (4 +8! +4+8°); ‘* "0x" ou "OX", ele sera interpretado como hexadecimal. Nesse caso, 0 valor deve ser definido utiizando os digitos de 0, 1, 2, 3, 4, 5, 6, 7,8 9, eas letras A (10), B (11), C (12), D (13), E (14) e F (15). Ex: int y = 0x44; Nesse caso, 0x44 equivale a 68 (4 « 16! +4 16°); OS TIPOS FLOAT E DOUBLE Oterceiro e quarto tipos de dados sao 0s tipos reais: float e double. Esses tipos de dados permitem armazenar um valor real (com parte fracionétia), também conhecido como ponto flutuante. A diferenca entre eles é de precisao: * tipo float: precisao simples; * tipo double: dupla precisao. Sao titeis quando queremos trabalhar com intervalos de numeros reais realmente grandes. a Em ndimeros reais, a parte decimal usa ponto e nao virgula! A linguagem C usa o padrao numérico americano, ou seja, a parte decimal a depois de um ponto. Veja os exemplos: 36 float f = 5.25; double d = 15.673; Pode-se escrever ntimeros dos tipos float e double usando notacao cientifica. A notagao cientitica é uma forma de escrever ntimeros extremamente gran- des ou extremamente pequenos. Nesse caso, o valor real 6 seguido por uma letra “e” ou “E” e um niimero inteiro (positivo ou negativo) que indica © expoente da base 10 (representado pela letra “e” ou "E” que multiplica 0 niimero) double x = 5.0210; equivale a double x = 50000000000; OTIPO VOID Por fim, temos 0 tipo void. Esse tipo de dados permite declarar uma fungao que nao retorna valor ou um ponteiro genérico, como sera visto nas proximas segées. A linguagem C nao permite que se declare uma varidvel 3 do tipo void. Esse tipo de dados s6 deve ser usado para declarar fungées que nao retornam valor ou ponteiros genérico. OS MODIFICADORES DE TIPOS ‘Além desses cinco tipos basicos, a linguagem C possui quatro modifica- dores de tipos. Eles sao aplicados precedendo os tipos basicos (com a excegao do tipo void), e eles permitem alterar o significado do tipo, de modo a adequa-lo &s necessidades do nosso programa. Sao eles: * signed: determina que a variavel deciarada dos tipos char ou int tera valores positives ou negativos. Esse é 0 padrao da linguagem. Exemplo: signed char x; signed int y; 37 * unsigned: determina que a variavel declarada dos tipos char ou int sé tera valores positives. Nesse caso, a variavel perde 0 seu 0 bit de sinal, o que aumenta a sua capacidade de armazenamento. Exemplo: unsigned char x; unsigned int y; ‘* short: determina que a variavel do tipo int tera 16 bits (inteiro pe- queno), independente do processador. Exemplo: short int i; « long: determina que a variavel do tipo int tera 32 bits (inteiro grande), independente do processador. Também determina que o tipo double possua maior preciso. Exemplo: Jong int n; long double d; 6 A linguagem C permite que se utilize mais de um modifica- dor de tipo sobre um mesmo tipo. Desse modo, podemos declarar um inteiro grande (long) e sem sinal (unsigned), © que aumenta em muito o seu intervalo de valores posiveis: unsigned long int m; Atabela a seguir mostra todas as combinagées permitidas dos tipos basicos e dos modificadores de tipo, o seu tamanhos em bits e seu intervalo de va- lores: 38 Tipo Intervalo de valores char 8 “128 A 127 unsigned char 8 OA 255 signed char 8 -128 A127 int 32 -2.147.483.648 A 2.147.483.647 unsigned int 32 0A 4.294.967.295 signed int 32 -32.768 A 32.767 short int 16 -32.768 A 32.767 unsigned short int 16 0A 65.535 signed short int 16 -82.768 A 32.767 long int 32 -2.147.483.648 A 2.147.483.647 unsigned long int 32 0A 4,294.967.295 signed ong int 32 -2.147.483.648 A 2.147.483.647 float 32 1,175494E-038 A 3,402823E+038 double 64 2,225074E-308 A 1,797693E+308 long double 96 3,4E-4932 A 3,4E+4932 2.2 LENDO E ESCREVENDO DADOS 1 PRINTF ‘A fungao printf() 6 uma das fungées de saida/escrita de dados da lingua- gem C. Seu nome vem da expressao em inglés print formatted, ou seja, escrita formatada. Basicamente, a funcdo printf() escreve na saida de vi- deo (tela) um conjunto de valores, caracteres e/ou sequéncia de caracteres de acordo com 0 formato especificado. A forma geral da fungao printt() é: printf("tipos de saida’, lista de variaveis) A fungao printf() recebe 2 parametros de entrada * “tipos de saida”: conjunto de caracteres que especifica 0 formato dos dados a serem escritos e/ou 0 texto a ser escrito; « lista de variéveis: conjunto de nomes de variaveis, separados por virgula, que serao escritos. ESCREVENDO UMA MENSAGEM DE TEXTO A forma geral da fungao printf() especifica que ela sempre receberd uma lista de vatiaveis para formatar e escrever na tela. Isso nem sempre 6 39 verdade. A fungao printf() pode ser usada quando queremos escrever apenas um texto simples na tela: printf(“texto”); ESCREVENDO VALORES FORMATADOS, Quando queremos escrever dados formatados na tela usamos a forma ge- ral da fungao, a qual possui os tipos de saida. Eles especificam o formato de saida dos dados que serao escritos pela fungao printf(). Cada tipo de saida é precedido por um sinal de % e um tipo de sada deve ser especi- ficado para cada variavel a ser escrita. Assim, se quissessemos escrever uma tinica expresso com 0 camando printf(), fariamos printf(‘%etipo de “saida’}expressao} Se fossem duas as expressées a serem escritas, fariamos e assim por diante. Note que os formatos e as expressdes a serem escri- tas com aquele formato devem ser especificados na mesma ordem, como mostram as setas. 6 © comando printf() nao exige o simbolo & na frente do nome de cada varavel. Diferente do comando scanf(), 0 comando printf() nao exige o simbolo & na frente do nome de uma variével que sera esorita na tela. Se usado, ele possui outro significado (como sera visto mais adiante) e nao exibe o contetido da variavel. A fungao printf() pode ser usada para escrever virtualmente qualquer tipo de dado. A tabela abaixo mostra alguns dos tipos de saida suportados pela linguagem: 40 ‘Alguns “tipos de saida” escrita de um caractere escrita de ntimeros inteiros escrita de ntimeros inteiros sem escrita de niimero reais escrita de varios caracteres escrita de um enderego de meméria %e ou%E _escrita em notacdo cientifica Abaixo, tem-se alguns exemplos de escrita de dados utiizando o comando printf(). Nesse momento nao se preocupe com o “\n’ que aparece dentro do comando printf(), pois ele serve apenas para ir para uma nova linha ao final do comando: Exemplo: escrita de dados na linguagem C 1 finclude 2 #include 3 Int main(){ 4 int x = 10; 5 //Escrita de um valor inteiro 6 printt(‘%d\n"" x); 7 float y = 5.0; 8 9 print (%d@At\n''x.y)3 10 //Adicionando espago entre os valores 11 print (%d %t\n'"ox.y)s 12 system(*‘pause'"); 13 return 0; Saida 10 105.000000 10 5.000000 No exemplo acima, os comandos printt(“%ed%f\n", x,y) e printt(“%ed %f\ xy) “/Escrita de um valor inteiro e outro real imprimem os mesmos dados, mas 0 segundo os separa com um espago. Isso ocorre por que 0 comando printt() aceita textos junto aos tipos de saida. Pode-se adicionar texto antes, depois ou entre dois ou mais tipos de saida’ a printf(“texto | Junto ao tipo de saida, pode-se adicionar texto e nao ape- nas espacos 1 fin 2 #include 3 int main(){ 4 int x = 10 5 printf (‘Total = %d\n" x) 5 6 printt(‘"%d eaixas\n’ x); 7 printf(‘“Total de 2d caixas\n’’ x); 8 system(‘‘pause'’); 9 return 0 10} Saida Total = 10 10 caixas Total de 10 caixas Isso permite que o comando printf() seja usado para escrever nao apenas dados, mas sentencas que fagam sentido para o usuario do programa 2.2.2. PUTCHAR ‘A fungao putchar() (put character) permite escrever um Unico caractere na tela. Sua forma geral é: int putchar(int caractere) ‘A fungao putchar() recebe como parametro de entrada um tinico valor inteiro. Esse valor ser convertido para caractere e mostrado na tela. A fungao retorna * Se NAO ocorrer um erro: o proprio caractere que foi escrito; ‘* Se ocorrer um erro: a constante EOF (definida na biblioteca stdio.h) 6 retornada. 42 Exemplo: putchar() 1 #include 2 include 3 int main (){ char c= ‘a’ int x = 65: putchar(c); putchar(‘\n’); putchar(x) ; putchar("\n") 10 system('“paus return 0 Perceba, no exemplo acima, que a conversao na linguagem C é direta no momento da impressao, ou seja, 0 valor 65 6 convertido para o caractere ASCII correspondente, no caso, 0 caractere “A”. Além disso, 0 comando putchar() também aceita 0 uso de seqiiéncias de escape como o caractere ‘\n’ (nova linha). 2.2.3 SCANF A fungao seant{) é uma das fungdes de entradalleitura de dados da lingua- gem C. Seu nome vem da expressao em inglés scan formatted, ou seja, leitura formatada. Basicamente, a funcdo scanf() [6 do teclado um con- junto de valores, caracteres e/ou sequéncia de caracteres de acordo com © formato especificado. A forma geral da fungao scant() 6: scan{(‘tipos de entrada’, lista de variéveis) A fungao scanf() recebe 2 parametros de entrada * “tipos de entrada”: conjunto de caracteres que especifica 0 formato dos dados a serem lidos; ista de varidveis: conjunto de nomes de variaveis que sero lidos separados por virgula, onde cada nome de variavel precedido pelo operador &. 43 Os tipo de entrada especificam o formato de entrada dos dados que serao lidos pela fungao seanf(). Cada tipo de entrada é precedido por um sinal de % @ um tipo de entrada deve ser especificado para cada varidvel a ser lida. Assim, se quissessemos ler uma tinica variével com o camando scanf(), fariamos scanf({%tipo_de_ entrada’ ,8variavel); Se fossem duas as varidveis a serem lidas, fariamos e assim por diante. Note que os formatos e as variaveis que armazenarao © dado com aquele formato devem ser especificados na mesma ordem, ‘como mostram as setas. Na linguagem C, é necessério colocar o simbolo de & antes do nome de cada variavel a ser lida pelo comando seant() Trata-se de uma exigéncia da linguagem C. Todas as variaveis que rece- berdo valores do teclado por meio da scant() deverdo ser passadas pelos seus enderecos. Isso se faz colocando o operador de endereco “&” antes do nome da variavel. A fungao sean{() pode ser usada para ler virtualmente qualquer tipo de dado. No entando, ela 6 usada com mais freqiiencia para a leitura de nimeros inteiros e/ou de ponto flutuante (nuimeros reais). A tabela abaixo mostra alguns dos tipos de entrada suportados pela linguagem: Alguns “tipos de entrada” %c — leitura de um caractere %d ou %i leitura de ntimeros inteiros %f _leitura de ntimero reais %s __leitura de varios caracteres Abaixo, tem-se alguns exemplos de leitura de dados utilizando o comando ‘scanf(): 44 3 int main(){ 4 int x,2; 5 float y: 6 //Leitura de um valor inteiro 7 a scant (''%d"",&x); WLeitura de um valor real 9 scant('"%t"" By); 10 //Leitura de um valor inteiro @ outro real 11 scanf("‘%edbot ''.&x,&y) ; 12 //Leitura de dois valores inteiros 18 scanf("‘%edl’* ,&x,8z) ; 14 //Leitura de dois valores inteiros com espaco 15 scanf(‘‘%ed %d''.8x,82); 16 system('‘pause’*); 17 return 0. No exemplo acima, os comandos scant ("%d%d", &x,82); e scant ("%ed %d", 8x, 82); so equivalentes. Isso ocorre por que o comando scant() ignora os espagos em branco entre os tipos de entrada. Além disso, quando 0 comando scanf() é usado para ler dois ou mais valores, podemos optar por duas formas de digitar os dados no teclado: ‘+ Digitar um valor e, em seguida, pressionar a tecla ENTER para cada valor digitado; ‘+ Digitar todos os valores separados por espago e, por tiltimo, pressio- nara tecla ENTER, 45 (© comando seanf() ignora apenas os espacos em branco entre os tipos de entrada. Qualquer outro caractere in- serido entre os tipos de dados devera ser digitado pelo usuario, mas sera descartado pelo programa. 1 #inelude 2 #include 3 int main(){ 4 int dia, mes, ano; 5 //Leitura de trés valores inteiros 6 //com barras entre eles 7 scant ('"%d/%di"d&dia Ames, &ano) ; 8 system("“pause''); 9 return 0 10} Isso permite que o comando scant() seja usado para receber dados for- matados como, por exemplo, uma data: dia/més/ano. No exemplo acima, © comando scanf() é usado para a entrada de trés valores inteiros sepa- rados por uma barra“ cada. Quando o usuario for digitar os trés valores, ele sera obrigado a digitar os trés valores separados por barra (as barras sero descartadas e nao interferem nos dados). Do contrario, o comando scanf() nao ird ler corretamente os dados digitados. 2.24 GETCHAR A fungao getchar() (get character) permite ler um nico caractere do te- clado. Sua forma geral é int putchar(void) ‘A fungao getchar() nao recebe parametros de entrada. A fungao retorna ‘* Se NAO ocorrer um erro: 0 eédigo ASCII do caractere lido; Se ocorrer um erro: a constante EOF (definida na biblioteca stdio.h) 6 retornada. 46 Exemplo: getchar() 1 #inelude 2 #include 3 int main (){ 4 char ¢; 5 getchar() ; & printf(' "Caractere: Ye\n’’, ¢); 7 printf(**Codigo ASCII: %d\n"", e); 8 system(*‘pause'”) 9 return 0; 10} Perceba, no exemplo acima, que a conversao na linguagem C é direta no momento da leitura, ou seja, embora a fungao retorne um valor do tipo int, pode-se atribuir para uma varidvel do tipo char devido a conversao automatica da linguagem C. 2.3 ESCOPO: TEMPO DE VIDA DA VARIAVEL Quando declararamos uma variével, vimos que é preciso sempre definir 0 seu tipo (conjunto de valores e de operagées que uma varidvel aceita) ¢ nome (como o programador identifica essa varidvel dentro do programa) Porém, além disso, é preciso definir 0 seu escopo. © escopo 6 0 conjunto de regras que determinam 0 uso e a validade das variéveis ao longo do programa. Em outras palavras, escopo de uma varidvel define onde e quando a variavel pode ser usada. Esse escopo esta intimamente ligado com o local de declaragao dessa varidvel e por esse motivo ele pode ser: global ou local ESCOPO GLOBAL Uma variavel global 6 declarada fora de todas as fungées do programa, ou seja, na area de declaragdes globais do programa (acima da cléusula main). Essas varidveis existem enquanto o programa estiver executando, ou seja, o tempo de vida de uma variavel global é o tempo de execugao do programa. Além disso, essas variéveis podem ser acessadas ¢ alteradas em qualquer parte do programa. 47 1 fin 2 #include 3 int x 4 void incr (){ x44; //acesso d Int _main(){ print ("x = global iner(); d\n 10 printt (“x = ‘global 11 system (‘‘pause'') 12 return 0 1B) d\n Na figura abaixo, termina cada escopo do cédigo anterior: include include int = 5yfvariével global oid incr [x++/lacesso a varidvel global int maing( prin ino) Print = %édin".x):Nacesso a variével global system("pause"); return 0; = Ged wylacesso a variavel global y Variéveis globais podem ser acessadas e alteradas em qualquer parte do programa. 5; //variavel global a variavel global .x);//acesso a variavel .x);//acesso a varidvel possivel ter uma boa representacao de onde comega e [lescopo giobat [Blscopo toca Note, no exemplo acima, que a variavel x é declarada junto com as bi- bliotecas do programa, portanto, trata-se de uma variavel global (escopo global) Por esse motivo, ela pode ser acessada e ter seu valor alterado ‘em qualquer parte do programa (ou seja, no escopo global e em qualquer escopo local). 48

You might also like