A linguagem C foi criada em 1972 por Dennis Ritchie nos laboratrios da Bell. Desde ento e em muito pouco tempo, tornou-se uma das linguagens mais populares do mundo entre programadores profissionais.
A razo dessa popularidade que a linguagem C foi concebida por programadores para ser uma ferramenta til para programadores e proporcionar as convenincias de uma linguagem de alto nvel, mas, ao mesmo tempo, um controle muito prximo do hardware e perifricos.
A linguagem C foi concebida para ser a ferramenta de desenvolvimento do sistema operacional UNIX, este mesmo concebido para ser um sistema facilmente transportvel para qualquer plataforma de hardware. Deste modo, em todas as plataformas onde o UNIX possa ser encontrado se encontra uma verso do compilador C.
Esta caracterstica de portabilidade peculiar da linguagem C. A linguagem especificada de tal modo que requer um mnimo de ajustes para ser executada em qualquer mquina, seja um microcontrolador, microcomputador pessoal, mainframe ou supercomputador.
As implementaes atualmente existentes de compiladores de linguagem C produzem cdigo de tal eficincia em espao e velocidade que chegam a rivalizar programas codificados diretamente em linguagem assembly (linguagem de mquina nativa do computador).
Todas estas razes tornam a linguagem C to popular que a maioria dos programas comerciais atualmente desenvolvidos (incluindo sistemas operacionais, compiladores e interpretadores para outras linguagens) implementada em linguagem C. Assim, sua popularidade tornou-a a linguagem comum para divulgao e comunicaes em revistas especializadas.
Introduo linguagemC Rodolfo Riyoei Goya 2 de 62 1.2. Arquivos usados no desenvolvimento de um programa em C
A linguagem C uma linguagem compilada. Isto quer dizer que para executar um programa escrito em linguagem C (programa-fonte), deve-se primeiro traduzi-lo (essa tarefa executada pelo compilador) para a linguagem nativa do computador para que possa ser posteriormente executado. Uma vez obtido o programa compilado (programa executvel), este pode voltar a ser executado quantas vezes se desejar sem a necessidade de uma nova compilao. O programa executvel pode ser distribudo para execuo sem a necessidade de se distribuir o programa-fonte.
No processo de desenvolvimento de um programa escrito em linguagem C, normalmente so utilizados 3 arquivos:
Em UNIX: nome.C nome.o a.out (Executamos o programa teclando o nome do Arquivo "a.out").
Em MS-DOS e WINDOWS: nome.C nome.OBJ nome.EXE (Executamos o programa teclando "nome").
O primeiro dos arquivos denominado de programa-fonte e produzido pelo programador com o uso de um editor de texto. O arquivo intermedirio denominado de programa-objeto e produzido pelo compilador. O arquivo final denominado de programa executvel e produzido pelo linker. O programa-objeto um mdulo que o linker rene a outros mdulos (produzidos pela compilao de outros programas fontes produzidos pelo programador ou contendo rotinas de biblioteca que desempenham funes oferecidas com a linguagem) para produzir o programa final executvel.
Introduo linguagemC Rodolfo Riyoei Goya 3 de 62 1.3. Estrutura bsica de um programa em linguagem C
Um programa escrito em linguagem C tem uma estrutura geral da forma abaixo:
#i ncl ude <st di o. h> Cabeal ho ( header )
i nt mai n( ) / * Umpr ogr ama bemsi mpl es. */ { i nt num; Cor po do pr ogr ama ( body)
num= 1; pr i nt f ( "%d eh umbel o numer o. \ n", num) ; r et ur n 0; }
Este um programa que, ao ser executado, imprime a frase: 1 eh um belo nmero. um programa simples, que ilustra as caractersticas de um programa escrito em C.
Todo o programa escrito em linguagem C constitui-se de uma coleo de uma ou mais funes, onde uma delas deve se chamar mai n( ) . A funo mai n( ) particularmente importante pois a funo chamada primeiro quando o programa executado (no importando em que parte do programa ela esteja).
Todo programa consiste de um cabealho (header) e de um corpo (body). O cabealho contm todas as diretivas de pr-processamento (tal como o #i ncl ude do exemplo acima). O corpo do programa contm as funes, que podem ser reconhecidas como um nome seguido por um par de parnteses, podendo haver ou no parmetros dentro dos parnteses. (No caso do exemplo o nome da funo mai n( ) ).
No caso do exemplo, o arquivo de funes de biblioteca chamado st di o. h passa a fazer parte do programa pelo uso da diretiva #i ncl ude. Este arquivo fornecido como parte do compilador C. s vezes ele necessrio, s vezes no. No caso do exemplo ele necessrio por conter dados descrevendo a funo pr i nt f utilizada no programa (st di o abreviatura de standard input/output - entrada/sada padro). Outros arquivos, contendo descries de outros tipos de funes tambm fazem parte dos pacotes que compem um compilador C.
J o corpo da funo delimitado por chaves {} e constitui-se de uma srie de comandos (statements), cada comando terminado (separado um do outro) com um ponto e vrgula (; ).
Introduo linguagemC Rodolfo Riyoei Goya 4 de 62 No exemplo, o corpo do programa contm quatro comandos: o primeiro um comando de declarao de varivel, definindo os nome e tipos de variveis que esto sendo usadas. Variveis so locais onde dados so guardados em memria. O processamento de dados em um computador constitui-se normalmente na manipulao no valor de variveis. Todas as variveis utilizadas em um programa devem ser declaradas para especificar seu nome e seu tipo.
O segundo um comando de atribuio onde uma varivel tem seu valor definido e um terceiro comando que consiste na chamada da funo pr i nt f ( ) . Os parmetros da funo pr i nt f ( ) tais como o %d e o \n sero explicados mais adiante.
O quarto o comando r et ur n 0 que finaliza a funo.
No exemplo pode-se notar tambm que existe um trecho com o formato abaixo:
/ * Umpr ogr ama bemsi mpl es. */
Este trecho um comentrio. Os comentrios so iniciados com / * e terminados com */ e servem apenas para facilitar a leitura do programa, pois so ignorados pelo compilador. Comentrios so observaes inseridas pelo programador para tornar um programa mais claro.
O compilador C ignora a quantidade de linhas e espaos em branco colocados entre os comandos. Deste modo, o programa seguinte tem o mesmo efeito final que o do exemplo:
#i ncl ude <st di o. h> i nt mai n( )
/ * Umpr ogr ama bemsi mpl es. */
{ i nt num; num
=
1;
pr i nt f (
"%d umbel o nmer o. \ n" ,
num) ; }
Introduo linguagemC Rodolfo Riyoei Goya 5 de 62 Apesar de serem equivalentes, nota-se que o exemplo inicial apresenta-se de uma forma bem mais clara. De fato, o modo como o programa escrito pode torn-lo bem mais legvel. Assim, um bom hbito de programao segue algumas regras bastante simples como as relacionadas abaixo:
#i ncl ude <st di o. h>
i nt mai n( i nt ar gc, char *ar gv[ ] ) / * I mpr i me per nas e dedos. */ Use Coment r i os. { i nt per nas, dedos; Escol ha nomes conveni ent es. Use l i nhas embr anco. per nas = 4; Col oque umcomando por l i nha. dedos = 20; pr i nt f ( "Duas pessoas t m%d per nas e %d dedos. \ n" , per nas, dedos ) ; }
Outro aspecto importante que a linguagem C diferencia letras maisculas e minsculas na formao de nomes. Assim, uma varivel chamada per nas no ser a mesma que outra chamada PERNAS ou Per nas (esta caracterstica denominada de case-sensitive, diferentemente do que ocorre em muitas outras linguagens de programao).
Na escolha de nomes para funes e variveis o programador pode-se utilizar de letras minsculas e maisculas, dgitos numricos e o smbolo de underscore ("_"). Os nomes podem ser formados por qualquer combinao destes caracteres somente com a restrio de no poderem comear com dgito numrico. Os nomes podem ter qualquer comprimento embora alguns compiladores s utilizem os oito primeiros (assim uma varivel ou funo chamada NomeLongo1 pode ser tida como a mesma que uma outra chamada NomeLongo2 pois ambas tm os oito primeiros caracteres idnticos, em alguns compiladores).
Nomes vlidos: contagem vai_um _ehbom temp1
Nomes invlidos: %descont vai-um e'bom 1temp Os trs primeiros so invlidos por no usarem caracteres vlidos (%, - e ') e o ltimo por iniciar com caracter numrico.
Introduo linguagemC Rodolfo Riyoei Goya 6 de 62 2. Blocos construtivos da linguagem C
Funes so construdas encadeando-se comandos. Por sua vez, os comandos operam sobre dados. Fornece-se nmeros, letras e palavras ao computador e espera-se obter algo com estes dados. A linguagem C oferece ao programador diversos tipos de dados para que este possa construir seus programas.
Por outro lado, para que um programa se utilize de dados de uma maneira til necessrio que ele seja capaz de interagir com o meio exterior (frequentemente o usurio do programa) recebendo dados para serem processados e devolvendo-lhe os valores processados.
Porm no basta o computador devolver ao usurio os dados por ele enviados. A linguagem deve dispor de recursos que permitam ao programador efetuar manipulaes e transformaes nos dados recebidos.
Nesta seo, veremos como a linguagem C lida com estes conceitos.
2.1. Tipos de Dados
Os tipos bsicos de dados oferecidos pela linguagem C esto divididos em trs classes:
Nmeros Inteiros: shor t , i nt , l ong, l ong l ong, e unsi gned Caracteres: char Nmeros em Ponto Flutuante: f l oat , doubl e e l ong doubl e
Os cinco primeiros so usados para representar nmeros inteiros, ou seja, nmeros sem parte fracionria. Nmeros tais como 5, -33 e 2719 so inteiros enquanto nmeros como 3.14, 1/2 e 6,023x10 23 no o so.
O segundo tipo denominado de caracter e consiste em letras do alfabeto (maisculas e minsculas) e outros caracteres tais como #, $, % e & alm dos prprios dgitos numricos.
Os outros dois tipos so utilizados para representar nmeros que podem ter parte decimal. Estes dois ltimos so tambm denominados tipos em ponto flutuante.
Introduo linguagemC Rodolfo Riyoei Goya 7 de 62 2.1.1. Dado do tipo inteiro
Os diversos tipos possveis de inteiro relacionados se devem possibilidade de escolha que a linguagem oferece para as faixas de valores que um dado pode assumir. Ao contrrio do que ocorre na vida real, dentro de um computador os nmeros tm valores mnimos e mximos e podem ser representados com preciso limitada. Assim os tipos shor t , i nt , unsi gned, l ong e l ong l ong so tipos inteiros que permitem diferentes faixas de valores.
As faixas para cada tipo variam para cada computador onde a linguagem implementada. No caso dos processadores de 16 bits, por exemplo, variveis do tipo shor t ocupam um byte de memria (8 bits) e seus valores vo de -128 a +127 (entre -2 7
e 2 7 -1), variveis do tipo i nt ocupam dois bytes de memria (16 bits) e seus valores vo de -32768 a +32767 (entre -2 15 e 2 15 -1), variveis do tipo unsi gned ocupam dois bytes de memria (16 bits) e seus valores vo de 0 a +65535 (entre 0 e 2 16 -1) e variveis do tipo l ong ocupam quatro bytes de memria (32 bits) e seus valores vo de -2147483648 a +2147483647 (entre -2 31 e 2 31 -1).
No caso do compilador DevC++usado neste curso (produz programas para serem executados em Microsoft Windows): Variveis do tipo shor t so armazenadas em 16 bits de memria e seus valores vo de -32768 a +32767 (entre -2 15 e 2 15 -1). Variveis do tipo i nt e l ong so armazenadas em 32 bits de memria e seus valores vo de -2147483648 a +2147483647 (entre -2 31 e 2 31 -1). Variveis do tipo unsi gned e unsi gned i nt so armazenadas em 32 bits de memria e seus valores vo de 0 a +4294967295 (entre 0 e 2 32 -1). Variveis do tipo l ong l ong so armazenadas em 64 bits de memria e seus valores vo de - 9223372036854775808 a +9223372036854775807 (entre -2 63 e 2 63 -1).
Variveis de tipo inteiras em C so declaradas simplesmente especificando-se o tipo seguindo-se de uma lista com os nomes das variveis.
i nt pont os; shor t di a; l ong popul acao; l ong l ong di vi da; shor t hor a, mi nut o, segundo;
Uma lista de variveis feita com uma relao dos nomes das variveis separados por vrgulas e terminada com ponto e vrgula.
A faixa finita na qual os nmeros so representados se deve o fato de que cada tipo de dado reserva uma poro finita de memria para armazenamento de cada tipo. Por exemplo, nos processadores de 16 bits, dados de tipo shor t so guardados em dois bytes de memria, dados de tipo i nt so guardados em quatro bytes de memria, do tipo l ong em quatro bytes e do tipo l ong l ong em oito bytes (nos processadores pentium, dados de tipo shor t so guardados em dois bytes de memria e dados de tipo i nt e l ong em quatro bytes).
Introduo linguagemC Rodolfo Riyoei Goya 8 de 62 A palavra unsi gned utilizada para modificar a faixa de definio de um dado para valores apenas positivos. Assim, no caso dos processadores de 16 bits, um dado de tipo unsi gned shor t tem valores entre 0 e 255, unsi gned i nt tem valores entre 0 e 65535 e um dado do tipo unsi gned l ong pode assumir valores entre 0 e 4294967295 (nos processadores pentium, um dado de tipo unsi gned shor t tem valores entre 0 e 65535, e dados de tipo unsi gned i nt e unsi gned l ong podem assumir valores entre 0 e 4294967295).
unsi gned i nt ano; unsi gned shor t di a, mes; unsi gned l ong por cos, boi s, gansos;
Outro tipo de dado importante so as constantes inteiras. A linguagem C reconhece um nmero sem um ponto decimal como sendo um inteiro. Assim, nmeros como 2 ou -150 so constantes inteiras. As constantes inteiras podem ser usadas para iniciar o valor de variveis:
di a = 1; mes = 5; pont os = - 20;
A inicializao de variveis tambm pode ser feita no comando de declarao. Como no exemplo abaixo:
i nt cr edi t os, pont os = 0; shor t hor a = 12, mi nut os = segundos = 0;
No primeiro exemplo apenas a varivel pont os inicializada. Enquanto no receber nenhum valor durante a execuo do programa o valor da varivel cr edi t os deve ser tomado como indeterminado. No segundo exemplo, a varivel hor a iniciada com o valor 12 enquanto as variveis mi nut os e segundos so iniciadas com 0.
Constantes de tipo l ong so definidas com valores numricos finalizados com a letra l :
l ong popul acao = 100000000l ; / * apesar de par ecer com 1 ( um) uma l et r a l ( el e) no f i nal . */
Variveis de tipo l ong ocupam mais espao e tomam mais tempo de processamento que variveis de tipo i nt .
Constantes de tipo l ong l ong so definidas com valores numricos finalizados com a letra l :
l ong l ong popul acao = 100000000l l ; / * par ece com 11 ( umum) mas l l ( el e el e) no f i nal . */
Variveis de tipo l ong l ong ocupam mais espao e tomam mais tempo de processamento que variveis de tipo l ong. Introduo linguagemC Rodolfo Riyoei Goya 9 de 62 2.1.2. Dado do tipo caracter
Normalmente um dado do tipo char definido como um nmero inteiro na faixa entre -128 e 127 armazenado em 8 bits (1 byte), enquanto um dado de tipo unsi gned char definido como um nmero inteiro na faixa entre 0 e 255 armazenado em 8 bits (1 byte). Os computadores normalmente usam um cdigo para traduzir estes nmeros em caracteres (os mais conhecidos so o ASCII, EBCDIC e o UNICODE). A linguagem C usa o cdigo ASCII (American Standard Coding for Information Interchange) para traduzir caracteres em cdigos. No cdigo ASCII, por exemplo, a letra 'A' codificada em binrio como 01000001 (65 em decimal), a letra 'a' como 01100001 (97 em decimal) e o smbolo '?' como 00111111 (63 em decimal).
Caracteres numricos no tm necessariamente um cdigo correspondente a seu valor. Assim, por exemplo, o cdigo ASCII que corresponde ao caracter '0' 00110000, 48 em decimal.
As variveis de tipo caracter so declaradas utilizando-se a palavra chave char :
char l et r a, r espost a;
Um caracter constante definido como um smbolo entre apstrofos. Deste modo podemos usar tais constantes para atribuir um valor a uma varivel de tipo caracter.
l et r a = 97; / * col oca a na var i vel l et r a. */ r espost a = ' S' ; / * col oca S na var i vel r espost a. */
Se observarmos uma tabela ASCII veremos que certos caracteres so denominados de no-imprimveis. Tais caracteres so usados normalmente para o controle de impresso de sada. Para a representao destes caracteres, a linguagem C utiliza certas sequncias especiais de caracteres. Tais sequncias so denominadas de sequncias de escape com alguns exemplos relacionados abaixo:
\n newline \t tabulao \b backspace \r retorno de carro - carriage return \f form feed \nnn Nmero codificado em octal \xnnnn Nmero codificado em hexadecimal \\ barra invertida (\) - backslash \' Apstrofo (') \" Aspas (")
Tais sequncias tambm devem ser colocadas entre aspas para definir uma constante. Por exemplo:
char car act er = ' \ n' ;
Introduo linguagemC Rodolfo Riyoei Goya 10 de 62 Ao se imprimir a varivel car act er , a cabea de impresso da impressora ou o cursor na tela avanam para o comeo da prxima linha.
Na relao dada, o newline avana para o incio da prxima linha, um tab move o cursor ou a cabea de impresso de uma quantidade fixa de posies (normalmente mltipla de 5 ou 8). Um backspace move para trs de um caracter. Um retorno de carro move para o incio da mesma linha e um form feed faz com que a impressora avance o papel de uma pgina. Os trs ltimos permitem a definio de constantes de caracter para os caracteres \ ' e ".
Deste modo, as declaraes: char car act er = ' \ n' ; e char car act er = 10; tm o mesmo significado.
A codificao em binrio completa de todos os caracteres segundo a tabela ASCII apresentada na figura abaixo:
Uma tabela de codificao ASCII para binrio completa pode ser achada em: http://pt.wikipedia.org/wiki/ASCII Introduo linguagemC Rodolfo Riyoei Goya 11 de 62 2.1.3. Dados do tipo ponto flutuante
Os tipos de dados inteiros e caracteres servem muito bem para a maioria dos programas. Contudo, alguns programas orientados para aplicaes matemticas frequentemente fazem uso de nmeros em ponto flutuante. Para este tipo de dados, em C, definimos os tipos denominados de f l oat , doubl e e l ong doubl e.
A representao de nmeros em ponto flutuante anloga a notao cientfica e permite a representao de uma faixa bastante grande de nmeros, incluindo os nmeros fracionrios. Por exemplo:
Na primeira coluna vemos a notao usual. Na segunda coluna a notao cientfica e na terceira o modo como a notao cientfica representada em um computador. Note que, em linguagem C, de modo diferente que o usual em portugus, usa-se . ao invs de , para separar a parte inteira da decimal.
Do mesmo modo que ocorre com os inteiros, nmeros em ponto flutuante so armazenados em pores finitas de memria de modo que a sua preciso limitada.
O tipo f l oat tem preciso de 7 dgitos com o expoente indo de 10 -38 a 10 +38 . O tipo doubl e tem preciso de 14 dgitos com expoente indo de 10 -308 a 10 +308 . O tipo l ong doubl e tem preciso de 18 dgitos com expoente indo de 10 -4932 a 10 +4932 .
Isto quer dizer que um nmero como 4345345.8476583746123 ser armazenado como: 4.345345e+6 em uma varivel do tipo f l oat . 4.3453458476584e+6 em uma varivel do tipo doubl e. 4.34534584765837461e+6 em uma varivel do tipo l ong doubl e.
Introduo linguagemC Rodolfo Riyoei Goya 12 de 62 Constantes em ponto flutuante podem ser definidas de diversas formas. A mais geral uma srie de dgitos com sinal, incluindo um ponto decimal, depois um e ou E seguido de um expoente de uma potncia de dez com sinal. Por exemplo:
-1.609E-19 +6.03e+23.
Na definio de constantes, podem-se omitir sinais positivos, a parte de expoente e a parte inteira ou fracionria. Por exemplo:
3.14159 .2 4e16 .8e-5 100.
No se podem usar espaos dentro de um nmero em ponto flutuante: O nmero 3.34 E+12 est errado (tem um espao entre o 4 e o E).
Constantes de tipo l ong doubl e so criadas acrescentando-se L ou l no final: 4.34534584765837461e+6L ou 4.34534584765837461e+6l (ele).
Constantes de tipo f l oat so criadas acrescentando-se F ou f no final: 4. 345346e+6F ou 4.345346e+6f.
Variveis de tipo l ong doubl e ocupam mais espao e tomam mais tempo de processamento que variveis de tipo doubl e e variveis de tipo doubl e ocupam mais espao e tomam mais tempo de processamento que variveis de tipo f l oat . Introduo linguagemC Rodolfo Riyoei Goya 13 de 62 2.2. Funes de Entrada/Sada
Nesta seo vamos examinar algumas das funes existentes na biblioteca da linguagem C utilizadas para entrada e sada de dados: as funes pr i nt f ( ) , scanf ( ) , get che( ) , get char ( ) , get ch ( ) , put char ( ) e put ch( ) .
Estas funes so necessrias para que o usurio do programa possa introduzir dados no programa e que este possa devolver os resultados processados.
Estas funes pertencem s bibliotecas stdio.h e conio.h, oferecidas juntamente com todo pacote comercialmente disponvel de compilador de linguagem C. Para que estas funes possam ser includas em um programa em C torna necessria a incluso da diretiva no cabealho do programa:
A funo pr i nt f ( ) uma funo de impresso em tela bastante flexvel em seu uso.
A funo pr i nt f ( ) tem o formato geral conforme o descrito abaixo:
#i ncl ude <st di o. h> mai n( ) { i nt i dade = 30; f l oat al t ur a = 1. 75;
pr i nt f ( "Ri car do t em: \ n%f mde al t ur a e %d anos. ", al t ur a, i dade ) ; }
Nos parmetros de uma funo pr i nt f ( ) encontramos primeiro uma parte entre aspas que contm os caracteres que sero impressos pelo comando (o que pode incluir sequncias de escape como no exemplo acima).
Na segunda parte temos uma lista que pode ser formada por qualquer combinao de variveis, constantes e expresses.
Na primeira parte algumas sequncias iniciadas com o smbolo '%' (denominadas de especificadores de formato) no so impressas, mas sim substitudas por valores que so dados pelos elementos da segunda parte.
Deste modo, o exemplo resultar na sada abaixo:
Ri car do t em: 1. 750000 mde al t ur a e 30 anos
Existem outros especificadores de formato. Por exemplo, para caracteres %c:
pr i nt f ( "A l et r a %c eh a pr i mei r a de Ri car do. \ n" , ' R' ) ;
Relacionamos abaixo alguns especificadores de formato:
Sequncia Uso %d Inteiros em decimal. %ld Inteiros l ong em decimal. %lld Inteiros l ong l ong em decimal. %c Caracter traduzido segundo a tabela ASCII. %e Nmero em ponto flutuante - notao usando exponencial. %f Nmero em ponto flutuante - notao decimal. %g Nmero em ponto flutuante - notao usando exponencial ou decimal. %Le Nmero l ong doubl e - notao usando exponencial. %Lf Nmero l ong doubl e - notao decimal. %Lg Nmero l ong doubl e - notao usando exponencial ou decimal. %% O smbolo '%'.
Introduo linguagemC Rodolfo Riyoei Goya 15 de 62 Alm do modo descrito, os especificadores de formato para valores numricos podem ser alterados para ajustar o formato dos valores a serem impressos.
Modificao Significado digito Indica a largura mnima do nmero a ser impresso. Por exemplo: %4d quer dizer que o nmero ser impresso com quatro dgitos (maior se necessrio).
.digito Indica preciso. Para nmeros em ponto flutuante quantas casas depois da vrgula sero usadas. Por exemplo: %6.2f indica um nmero que ser impresso com um total de seis caracteres (incluindo o sinal e o ponto) com indicao de duas casas depois do ponto decimal.
- J ustificao. Indica que o nmero ser impresso encostado do lado esquerdo do campo. O normal o nmero ser impresso terminando no final do campo especificado pelo tamanho. Por exemplo: %-10d
l Especifica que o valor a ser impresso do tipo long. Por exemplo: %6ld ll Especifica que o valor a ser impresso do tipo long long. Por exemplo: %6lld L Especifica que o valor a ser impresso do tipo long double. Por exemplo: %6Lf
2.2.2. Funo getche()
A funo get che( ) (que uma abreviatura de get character with echo - l um caracter e ecoa na tela) faz a entrada de um caracter teclado. Por exemplo:
#i ncl ude <st di o. h> #i ncl ude <coni o. h>
mai n( ) { char ch;
pr i nt f ( "Pr essi one uma t ecl a: " ) ; ch = get che( ) ; pr i nt f ( "\ nA t ecl a pr essi onada f oi %c. ", ch ) ; }
Introduo linguagemC Rodolfo Riyoei Goya 16 de 62 2.2.3. Funes getch() e getchar()
A funo get ch( ) (que uma abreviatura de get character without echo - l um caracter sem ecoar na tela) faz a entrada de um caracter teclado. Por exemplo:
#i ncl ude <st di o. h> #i ncl ude <coni o. h>
mai n( ) { char ch;
pr i nt f ( "Pr essi one uma t ecl a: " ) ; ch = get ch( ) ; pr i nt f ( "\ nA t ecl a pr essi onada f oi %c. ", ch ) ; }
2.2.4. Funo scanf()
A funo get che( ) devolve apenas valores de tipo caracter. Para se fazer a entrada de dados de outros tipos (inclusive de caracter) pode-se utilizar a funo scanf ( ) .
A estrutura de uma chamada de funo scanf ( ) semelhante a da pr i nt f ( ) .
#i ncl ude <st di o. h>
mai n( ) { f l oat anos;
pr i nt f ( "Ent r e sua i dade emanos: " ) ; scanf ( " %f ", &anos ) ; pr i nt f ( "Voce t em%. 0f di as de i dade. \ n" , anos * 365 ) ; } Os especificadores de formato usados so os mesmos. A nica diferena significativa o smbolo & precedendo o nome da varivel (este smbolo, na realidade, representa um operador denominado de operador endereo, o que significa que passamos para a funo scanf ( ) o endereo das variveis a serem lidas pela funo e veremos mais a respeito deste operador na seo sobre ponteiros, por enquanto fixemos apenas que se deve colocar um & antes do nome da varivel ao se usar o scanf ( ) ). A funo scanf ( ) pode ser usada para a leitura de vrios nmeros:
#i ncl ude <st di o. h>
mai n( ) { f l oat x, y;
pr i nt f ( "Tecl e doi s numer os: " ) ; scanf ( " %f %f " , &x, &y ) ; pr i nt f ( "%f + %f = %f . \ n", x, y, x + y ) ; }
Introduo linguagemC Rodolfo Riyoei Goya 17 de 62 2.2.5. Funo putch() e putchar()
A funo put ch( ) (que uma abreviatura de print character - imprime um caracter) faz a saida de um caracter. Por exemplo:
#i ncl ude <st di o. h> #i ncl ude <coni o. h>
mai n( ) { char ch;
pr i nt f ( "Pr essi one uma t ecl a: " ) ; ch = get che( ) ; pr i nt f ( "\ nA t ecl a pr essi onada f oi " ) ; put ch( ch ) ; } Introduo linguagemC Rodolfo Riyoei Goya 18 de 62 2.3. Operadores
Um dos tipos de comando mais importantes para a construo de programas em linguagem C so as expresses. Expresses so construdas atravs do uso de variveis e constantes relacionadas atravs de operadores. Veremos nesta seo alguns operadores elementares: Atribuio, Adio, Subtrao, Diviso, Multiplicao, Resto, Sinal, Incremento e Decremento, Atribuio Aritmtica e Operadores Relacionais.
A importncia dos operadores vem do fato de que estes se constituem nas ferramentas para a manipulao de dados e variveis em um programa.
A combinao de diversos operadores, constantes e variveis em um mesmo comando forma uma expresso. Uma expresso com diversos operadores avaliada em uma ordem univocamente determinada. A ordem com a qual uma combinao de operadores agrupados em uma expresso avaliada denominada de precedncia.
2.3.1. Atribuio
Um operador de atribuio se apresenta na forma de uma varivel seguida de um caracter = e, em seguida de outra varivel, constante ou uma expresso que pode incluir outros operadores.
Em C, um operador de atribuio avalia o valor de uma expresso e faz com que uma varivel assuma este valor. Assim, em uma atribuio do tipo:
ano = 2009;
O smbolo = no significa "igual" no seu sentido matemtico. Em C o smbolo "=" denominado de operador de atribuio e quer dizer o seguinte: atribua o valor 2009 varivel ano. Tal distino faz muito sentido quando se interpreta o significado do comando abaixo:
i = i + 1;
Do ponto de vista matemtico, tal identidade no teria sentido. Em linguagem C um comando deste tipo significaria o seguinte: "Tome o valor atual da varivel i , some 1 a este valor e atribua o resultado varivel i ".
O operador de atribuio resulta, por si s em um valor. Assim, no exemplo abaixo:
a = b = 1;
O operador de atribuio b = 1 tem o valor 1 como resultado e este valor atribudo, ento, para a varivel a (a avaliao feita da direita para a esquerda).
Introduo linguagemC Rodolfo Riyoei Goya 19 de 62 2.3.2. Operador de Adio: +
O operador de adio faz com os dois valores a cada lado do operador sejam somados. Por exemplo, o comando:
pr i nt f ( "%d" , 5 + 5 ) ;
Imprimir o nmero 10 e no a expresso 5 +5.
O operador de adio pode ser utilizado tanto com variveis como com constantes. Assim, o comando:
pr eco = cust o + l ucr o;
Far com que o computador determine o valor atual de cada varivel, some tais valores e atribua o resultado varivel pr eco.
2.3.3. Operador de Subtrao: -
O operador de subtrao faz com o valor direita do operador seja subtrado do valor esquerda. Por exemplo, o comando:
i dade = 2009 ano_de_nasci ment o;
Far com que o computador determine o valor atual da varivel ano_de_nasci ment o, subtraia este valor de 2009 e atribua o resultado varivel i dade.
2.3.4. Operador de Multiplicao: *
O operador de multiplicao faz com os dois valores a cada lado do operador sejam multiplicados. Por exemplo, o comando:
i mpost o = r ecei t a * 0. 15;
Far com que o computador determine o valor atual da varivel r ecei t a, multiplique este valor por 0.15 e atribua o resultado varivel i mpost o.
Introduo linguagemC Rodolfo Riyoei Goya 20 de 62 2.3.5. Operador de Diviso: /
O operador de diviso faz com o valor esquerda do operador seja dividido pelo valor direita. Por exemplo, o comando:
pr emi o = r at ei o / ganhador es;
Far com que o computador determine o valor atual das variveis r at ei o e ganhador es divida o primeiro pelo segundo e atribua o resultado varivel pr emi o.
A operao de diviso funciona de modo diferente quando os valores usados so inteiros quando comparados diviso em ponto flutuante. A diviso de valores em ponto flutuante resulta em valores em ponto flutuante, mas a diviso de valores inteiros tambm resulta em valores inteiro. O fato de um nmero inteiro no possuir parte fracionria faz com que uma diviso do tipo 29 / 10 tenha sua parte fracionria descartada (o resultado dessa diviso 2). Este processo de se remover a parte fracionria do resultado denominado de truncamento.
2.3.6. Operador de Resto: %
O operador de resto resulta do resto da diviso inteira do valor esquerda do operador seja dividido pelo valor direita. Por exemplo, o comando:
r est o = 39 %10;
Far com que o computador atribua o valor 9 varivel r est o.
2.3.7. Operador de Sinal: -
O operador de sinal usado para indicar ou modificar o sinal de um valor. Por exemplo:
l ucr o = - 25; pr ej ui zo = - l ucr o;
Atribui o valor 25 varivel prejuzo. Este tipo de operador denominado de unrio porque manipula um nico operando, ao contrrio dos demais vistos at aqui.
Introduo linguagemC Rodolfo Riyoei Goya 21 de 62 2.3.8. Operador de incremento e decremento: ++ e --
O operador de incremento desempenha uma tarefa simples; ele incrementa (soma um) ao valor de seu operando ( um operador unrio). Este operador pode ser usado com o ++antes da varivel afetada ou com o ++depois da varivel afetada. A diferena entre ambos se refere ao momento em que o incremento efetuado. No primeiro caso, o incremento ocorre no incio do comando, antes de qualquer outra operao ser executada. No segundo caso, o incremento feito aps a execuo de todas as operaes no comando. Assim:
i = 5; j = 8; k = ++i * j ++;
Resultar nos valor 6, 9 e 48 para i , j e k. A varivel k ficou com o valor 48 como resultado da multiplicao de 6 e 8 pois i j sofreu o incremento antes do produto e j depois.
O operador de decremento opera de modo semelhante. Com a diferena de que a operao feita de decremento, ou seja, de se subtrair um da varivel.
Introduo linguagemC Rodolfo Riyoei Goya 22 de 62 2.3.9. Precedncia de operadores
A precedncia de operadores a regra que permite definir qual a ordem com que as operao so realizadas dentro de uma expresso que rena diversos operadores.
Por exemplo, a expresso abaixo:
x = 3 + y * 4;
Possui dois operadores: +e *. A precedncia permite que se resolva qual ser avaliado primeiro: se primeiro fazemos a soma e em seguida multiplicamos o resultado por 4 ou se fazemos primeiro o produto e depois somamos 3 ao resultado.
Na expresso em questo, a multiplicao ser feita primeiro e depois a soma. Caso se quisesse fazer primeiro a soma devem ser usados os parnteses:
x = ( 3 + y) * 4;
Deste modo, a ordem de precedncia dos operadores na linguagem C est tabelada abaixo:
Operador Associatividade
() Esquerda para direita. ++-- Esquerda para direita. - (unrio) Esquerda para direita. * / Esquerda para direita. +- (binrio) Esquerda para direita. = Direita para esquerda.
Um operador de atribuio aritmtica uma forma compacta de operao de soma, subtrao, multiplicao, diviso ou resto. Com o uso de atribuio aritmtica o comando:
i = i + j ;
Fica:
i += j ;
Do mesmo modo, os operadores relacionados acima podem ser usados na construo de operadores de atribuio aritmticos:
+= at r i bui o comsoma: i += j ; equi val e a i = i + j ; - = at r i bui o comsubt r ao: i - = j ; equi val e a i = i - j ; *= at r i bui o commul t i pl i cao: i *= j ; equi val e a i = i * j ; / = at r i bui o comdi vi so: i / = j ; equi val e a i = i / j ; %= at r i bui o comr est o: i %= j ; equi val e a i = i %j ;
A atribuio aritmtica tem a mesma precedncia que o operador de atribuio.
Os operadores relacionais efetuam comparaes entre dois valores (constantes, variveis ou expresses). Na linguagem C, se uma comparao resultar em verdadeiro, o operador relacional correspondente resulta em 1. Do contrrio, resulta em 0.
Na linguagem C existem 6 operadores relacionais conforma a tabela abaixo:
Operador Significado < Menor que > Maior que <= Menor ou igual a >= Maior ou igual a == Igual a != Diferente de
Os operadores relacionais so os de menor precedncia dentre todos os operadores. Assim, a expresso:
1 < 2 + 4;
Resulta no valor 1 (correspondente a verdadeiro) pois 1 menor que 6. Introduo linguagemC Rodolfo Riyoei Goya 25 de 62 2.3.12. Erros de arredondamento e overflow
Na execuo de operaes em ponto flutuante possvel que ocorram erros devido ao arredondamento que ocorre com a preciso finita com que os nmeros so representados em um computador. Deste modo, uma operao do tipo:
mai n( ) { f l oat a;
a = 1. 0 + 1. 0E30; a = a - 1. 0E30; pr i nt f ( "%f \ n" , a ) ; }
imprimir 0.000000 como resposta porque o primeiro comando de atribuio arredondar o resultado da operao para a preciso de 7 dgitos de uma varivel do tipo float (muito aqum dos 30 dgitos necessrios para a operao acima).
possvel que durante uma operao resulte em um valor fora da faixa para a qual o tipo do dado definido. Tal situao denominada de overflow.
mai n( ) { f l oat a;
a = 1. 0E30 * 1. 0E30; pr i nt f ( "%f \ n" , a ) ; }
O resultado decorrente desta operao depender da implementao de cada compilador. responsabilidade do programador prevenir-se contra a ocorrncia ou contra os efeitos de tais situaes.
Introduo linguagemC Rodolfo Riyoei Goya 26 de 62 3. Loops
Quase sempre, o que vale a pena ser feito, vale a pena ser feito mais que uma vez. Em programao, uma determinada ao deve ser executada repetidas vezes e, frequentemente, com alguma variao nos detalhes a cada vez. O mecanismo com o qual realizamos estas repeties denominado de "loop".
Existem, basicamente, trs tipos de implementaes de loops em C:
Loops do tipo "for". Loops do tipo "while". Loops do tipo "do while".
3.1. Loops do tipo "for"
Um loop do tipo "for" apresenta a estrutura abaixo:
f or ( exp1; exp2; exp3 ) comando;
A expresso exp1 uma inicializao. executada apenas uma vez, exatamente no momento em que se vai iniciar o processamento do loop. A segunda expresso (exp2) uma condio de teste. avaliada antes de cada possvel passagem do loop. Quando esta expresso resultar em valor falso o loop terminado. A terceira expresso (exp3) avaliada ao final de cada loop. A cada passagem do loop o comando executado uma vez.
O loop "for" prprio para quando se deseja executar o loop um nmero determinado de vezes. No exemplo abaixo, o comando no loop executado 256 vezes.
#i ncl ude <st di o. h>
mai n( ) { i nt n;
pr i nt f ( " Tabel a ASCI I : \ n" ) ; f or ( n = 0; n < 256; n++ ) pr i nt f ( " Car act er : %c Codi go: %d\ n", n, n ) ; }
Introduo linguagemC Rodolfo Riyoei Goya 27 de 62 Caso seja executado mais de um comando dentro do loop, estes ficam delimitados por chaves {}:
#i ncl ude <st di o. h>
mai n( ) { i nt i , ano; f l oat at ual , t axa;
pr i nt f ( "Est i ma a popul acao nos pr oxi mos anos. . \ n" ) ; pr i nt f ( "Ent r e coma popul acao at ual : " ) ; scanf ( " %f ", &at ual ) ; pr i nt f ( "Ent r e coma t axa de cr esci ment o: " ) ; scanf ( " %f ", &t axa ) ; pr i nt f ( "Ent r e coma ano at ual : " ) ; scanf ( " %d", &ano ) ;
f or ( i = 1; i <= 10; i ++ ) { ano++; popul acao *= t axa; pr i nt f ( "ano %d popul acao= %. 0f \ n" , ano, at ual ) ; } }
Os loops "for" podem ser aninhados (um loop colocado dentro do outro):
#i ncl ude <st di o. h>
mai n( ) { i nt i , j ;
pr i nt f ( "Tabuada do 1 ao 10: \ n" ) ; f or ( i = 1; i <= 10; i ++ ) { f or ( j = 1; j <= 10; j ++ ) pr i nt f ( " %2d*%2d= %3d", i , j , i * j ) ; pr i nt f ( "\ n" ) ; } }
Introduo linguagemC Rodolfo Riyoei Goya 28 de 62 O loop "for" bem flexvel. Podemos decrementar a contagem ao invs de incrementar:
pr i nt f ( " Cont agemr egr essi va. . . \ n" ) ; f or ( n = 10; n > 0; n- - ) pr i nt f ( "%d segundos\ n", n ) ;
Podemos ter a contagem em qualquer passo:
f or ( n = 10; n < 230; n = n + 15 ) pr i nt f ( "%d \ n", n ) ;
Podemos contar letras ao invs de nmeros:
pr i nt f ( " Al f abet o mi nuscul o: \ n" ) ; f or ( ch = ' a' ; ch <= ' z' ; ch++ ) pr i nt f ( " %c " , ch ) ;
Introduo linguagemC Rodolfo Riyoei Goya 29 de 62 3.2. Loops do tipo "while"
Os loops do tipo "while" apresentam a forma abaixo:
whi l e( expr eso ) comando;
No comando "while" a expresso avaliada ao incio do loop. Se esta resultar verdadeira, ento o comando efetuado e, ento, a expresso reavaliada reiterando o processo que s terminar quando a expresso for avaliada e se tornar falsa.
O loop "while" prprio para quando se deseja executar o loop um nmero indeterminado priori de vezes.
Por exemplo:
#i ncl ude <st di o. h>
mai n( ) { char ch;
pr i nt f ( "Ter mi ne pr essi onando Ent er . \ n" ) ; whi l e ( ch = get che( ) ! = \ n ) pr i nt f ( " Car act er t ecl ado: %c Codi go: %d\ n" , ch, ch ) ; }
Introduo linguagemC Rodolfo Riyoei Goya 30 de 62 3.3. Loops do tipo "do while"
Os loops do tipo "do while" apresentam a forma abaixo:
do comando; whi l e ( expr eso) ;
A principal diferena entre um loop "while" e um "do while" que, no segundo caso, o comando sempre executado pelo menos uma vez independentemente da possibilidade da expresso ser avaliada como falsa j ao incio do loop.
O loop do tipo "do while" prprio para quando se deseja executar o loop um nmero indeterminado de vezes, porm pelo menos uma vez.
Por exemplo:
#i ncl ude <st di o. h>
mai n( ) { char ch; i nt n = 1;
do pr i nt f ( "\ nVol t as no l oop: %d Cont i nua ? ( s/ n) " , n++ ) ; whi l e( ch = get che( ) ! = ' s' ) }
Introduo linguagemC Rodolfo Riyoei Goya 31 de 62 4. Decises
Um tipo de comando necessrio para a criao de programas teis, versteis e inteligentes so os de deciso e escolha de alternativas.
Na linguagem C so definidos comandos de controle que permitem desviar o fluxo de execuo de um programa de acordo com o resultado de testes ou resultados obtidos para operaes.
As palavras-chave para estes comandos esto relacionadas abaixo:
if if-else switch-case-break-default
4.1. Decises do tipo "if"
O comando de controle "if" tem a estrutura abaixo:
i f ( expr esso ) comando;
Durante a execuo do programa a expresso avaliada e, se o resultado for verdadeiro, somente ento o comando executado.
Embora qualquer tipo de expresso possa ser empregado (neste caso o resultado falso corresponde a um valor inteiro igual a zero e verdadeiro corresponde a um valor inteiro diferente de zero), normalmente so utilizadas expresses com operadores relacionais e lgicos.
No caso de se desejar condicionar a execuo de uma sequncia de comandos a uma expresso, nos definimos a relao de comandos a serem executados delimitando- os com chaves {}.
i f ( expr esso ) { comando1; comando2; comando3; }
Se, ao avaliar-se a expresso resultar em verdadeiro (um) os comandos comando1 comando2 e comando3 sero executados. Seno, nenhum deles ser executado.
Introduo linguagemC Rodolfo Riyoei Goya 32 de 62 4.2. Decises do tipo "if-else"
O comando de controle "if-else" tm a estrutura abaixo:
i f ( expr esso ) comando1; el se comando2;
Neste comando de controle, a expresso avaliada. Se o resultado for verdadeiro (um), o comando1 executado. Se o resultado for falso (zero) o comando2 executado. A execuo dos dois comandos mutuamente exclusiva. Apenas um dos dois comandos ser executado.
Caso seja necessrio o uso de mais comandos, tanto para o caso da expresso ser verdadeira como no caso da expresso ser falsa, as chaves {} tambm podem ser empregadas.
No caso de se encadear diversos comandos de controle "if" em sequncia, o comando else corresponder condio falsa do comando "if" anterior mais prximo que no tenha um "else" ainda associado:
i f ( exp1 ) i f ( exp2 ) comando_a; / * exp1 == ver dadei r o && exp2 == ver dadei r o */ el se / * cor r esponde negao do i f ( expr 2) aci ma. */ comando_b; / * exp1 == ver dadei r o && exp2 == f al so */ el se / * cor r esponde negao do i f ( expr 2) aci ma. */ comando_c; / * exp1 == f al so */
O comando_a ser executado se a expresso exp1 for verdadeira e a expresso exp2 tambm for verdadeira. O comando_b ser executado se a expresso exp1 for verdadeira e a expresso exp2 for falsa. Para que o comando_c seja executado basta que a expresso exp1 seja falsa (exp2 sequer avaliada).
Introduo linguagemC Rodolfo Riyoei Goya 33 de 62 4.3. Decises do tipo "switch"
Nos comandos de controle "if" e "if-else" a deciso tomada permitia a escolha dentre duas possveis alternativas. Com o comando de controle "switch" pode-se escolher um comando a ser executado dentre diversos possveis valores de uma expresso. A estrutura de um comando de controle "switch" descrito abaixo:
swi t ch( exp ) { case x1: comando_x1; br eak; case x2: comando_x2; br eak; case x3: comando_x3; br eak; case x4: comando_x4; br eak; def aul t : comando_x5; }
O comando switch mostrado equivalente ao comando abaixo:
i f ( exp == x1 ) comando_x1; el se i f ( exp == x2 ) comando_x2; el se i f ( exp == x3 ) comando_x3; el se i f ( exp == x4 ) comando_x4; el se comando_x5;
A expresso exp avaliada. Se o resultado for igual a x1, ento comando_x1 executado. Se o resultado for igual a x2, ento comando_x2 executado. Se o resultado for igual a x3, ento comando_x3 executado. Se o resultado for igual a x4, ento comando_x4 executado. Se o resultado for diferente de todos eles, ento comando_x5 executado.
No h limites para o nmero de "cases" que podem ser usados em um comando "switch". Os valores x1, x2, x3 e x4 usados no comando so constantes, normalmente inteiras ou caracteres. Caso haja valores iguais em dois ou mais diferentes "cases" ser executado o comando ligado ao primeiro "case".
Introduo linguagemC Rodolfo Riyoei Goya 34 de 62 Um "case" em particular recebe o nome de "default" e colocado no final do comando "switch". O comando associado ao "default" executado sempre que nenhum "case" corresponda ao valor associado expresso do "switch".
Um comando adicional associado ao comando de "switch" o comando "break" que determina o trmino da sequncia de comandos associados ao "case". Assim, na ausncia de um "break", a execuo de um "case" pode prosseguir no "case" seguinte.
Por exemplo:
swi t ch( get che( ) ) { case ' a' : case ' e' : case ' i ' : case ' o' : case ' u' : pr i nt f ( " Voc t ecl ou uma vogal . \ n") ; br eak; def aul t : pr i nt f ( "Voc t ecl ou uma consoant e. \ n" ) ; }
Introduo linguagemC Rodolfo Riyoei Goya 35 de 62 4.4. O operador condicional
O operador condicional um modo abreviado para um comando "if-else" com uso para comando de atribuio. A estrutura para o operador condicional descrita abaixo:
x = exp1 ? exp2 : exp3;
Se exp1 for verdadeiro, a varivel x recebe o valor de exp2. Se for falso de exp3.
A expresso acima equivalente ao comando abaixo:
i f ( exp1 ) x = exp2; el se x = exp3;
Por exemplo, o comando abaixo atribui varivel x o valor absoluto da varivel y:
x = ( y < 0) ? - y : y;
Introduo linguagemC Rodolfo Riyoei Goya 36 de 62 5. Funes
Um programa em linguagem C constitui-se em uma coleo de funes (onde pelo menos uma delas chamada de mai n( ) e a funo executada ao iniciar o programa). Algumas funes (como o pr i nt f ( ) e o scanf ( ) ) so oferecidas como parte da biblioteca da linguagem C. Descreveremos, nesta seo, como que o programador pode especificar e usar suas prprias funes.
O programador pode definir quantas funes desejar em seus programas e cham-las de dentro de qualquer funo que queira. No h qualquer restrio de ordem ou hierarquia na definio das funes para o programador.
O uso de uma funo passa por duas etapas. Na primeira ns definimos a funo. Nesta fase ns devemos declarar seu prottipo no cabealho do programa e definir a funo relacionando os comandos que fazer sua implementao.
O prottipo da funo corresponde a sua declarao. Deste modo, informa ao compilador o seu nome, o tipo de dado que retorna (caso retorne algum) e que tipo de parmetros ele recebe (caso receba algum).
Na segunda fase ns a executamos. Uma vez definida a funo, esta pode ser chamada de diferentes pontos do programa. Este um dos motivos para se utilizar funes, pois deste modo economiza-se espao de memria.
Contudo, mesmo que seja para se chamar uma funo apenas de um ponto do programa, vale a pena utilizar-se de funes para implementar trechos de programa pois isto torna o programa mais estruturado e modular.
Introduo linguagemC Rodolfo Riyoei Goya 37 de 62 Por exemplo, um programa que faa o seguinte:
leia uma lista de nmeros ordene os nmeros encontre sua mdia desenhe um histograma
Pode ser feito do seguinte modo:
mai n( ) { l ei aLi st a( ) ; or denaLi st a( ) ; f azMedi a( ) ; f azHi st ogr ama( ) ; }
Onde o programador decompe sua tarefa em tarefas mais simples.
A estrutura para definir uma funo simples est descrita abaixo:
voi d nome( ) ; / * Pr ot ot i po. */
mai n( ) { . . nome( ) ; / * Chamada da f uno. */ . nome( ) ; / * Chamada da f uno. */ . nome( ) ; / * Chamada da f uno. */ . . }
voi d nome( ) / * Def i ni o da f uno. */ { . . }
Na declarao da funo (prottipo) o nome "voi d" define que a funo no retorna dado de nenhum tipo. Especificamos o nome da funo (nome) e que no se utiliza de parmetros.
A cada chamada da funo ela executada. Na definio da funo, so relacionados os comando que a compe. Por exemplo:
#i ncl ude <st di o. h>
voi d separ ador ( ) ; / * Pr ot ot i po da f uncao. */
mai n( ) { separ ador ( ) ; / * Chamada da f uncao. */ pr i nt f ( "EU GOSTO DE LI NGUAGEM C\ n" ) ; pr i nt f ( "Depar t ament o de Engenhar i a\ n" ) ; separ ador ( ) ; / * Chamada da f uncao. */ }
voi d separ ador ( ) / * Def i ni cao da f uncao. */ { i nt i ;
f or ( i = 1; i <= 60; i ++ ) pr i nt f ( "%c" , ' *' ) ; pr i nt f ( "\ n" ) ; }
Introduo linguagemC Rodolfo Riyoei Goya 39 de 62 5.2. Funes que retornam um valor
Podem-se definir funes que retornam valores. Para tanto basta declarar a funo com o tipo de dado que se deseja retornar (diferente do tipo voi d, usado quando no se deseja retornar dados) e terminar a execuo da funo com o comando r et ur n, conforme a estrutura descrita abaixo:
t i po nome( ) ; / * Pr ot ot i po. */
mai n( ) { t i po a, b, c; . . a = nome( ) ; / * Chamada da f uno. */ . b = nome( ) ; / * Chamada da f uno. */ . c = nome( ) ; / * Chamada da f uno. */ . . }
t i po nome( ) / * Def i ni o da f uno. */ { . . . r et ur n x; }
Na estrutura acima, o tipo pode ser qualquer um dos existentes para a linguagem C (i nt , char , f l oat , etc) e o comando r et ur n que aparece na definio da funo faz com que seja o valor da expresso representada por x seja avaliado e este valor retornado para o ponto onde a funo foi chamada.
Introduo linguagemC Rodolfo Riyoei Goya 40 de 62 Por exemplo:
#i ncl ude <st di o. h>
char get _numer o( ) ; / * Pr ot ot i po da f uncao. */
mai n( ) { char a;
pr i nt f ( "Tecl e umdi gi t o numer i co: " ) ; a = get _numer o( ) ; / * Chamada da f uncao. */ pr i nt f ( "O codi go do di gi t o t ecl ado ( %c) eh: %d\ n" , a, a ) ; }
char get _numer o( ) / * Def i ni cao da f uncao. */ { / * Le o t ecl ado at e o usuar i o t ecl ar umcar act er numer i co. */ char a;
whi l e ( 1) swi t ch ( a = get ch( ) ) { case ' 0' : case ' 1' : case ' 2' : case ' 3' : case ' 4' : case ' 5' : case ' 6' : case ' 7' : case ' 8' : case ' 9' : r et ur n a; def aul t : } }
Introduo linguagemC Rodolfo Riyoei Goya 41 de 62 5.3. Uso de argumentos em funes
Podem ser definidas funes que recebem argumentos ao serem chamadas. Os argumentos so passados dentro dos parnteses colocados aps o nome da funo. No momento em que a funo chamada, os valores colocados nos parnteses substituem os declarados na definio da funo, de modo que a funo pode utiliz-los.
Por exemplo:
#i ncl ude <st di o. h>
voi d bar r a( i nt ) ; / * Pr ot ot i po da f uncao. Recebe umpar amet r o. */
mai n( ) { pr i nt f ( "Resul t ado f i nal do campeonat o: \ n" ) ; pr i nt f ( "Goya\ n" ) ; bar r a( 35 ) ; / * Chamada da f uncao. */ pr i nt f ( "Ul i sses\ n" ) ; bar r a( 31 ) ; / * Chamada da f uncao. */ pr i nt f ( "J ul i o\ n" ) ; bar r a( 22 ) ; / * Chamada da f uncao. */ }
voi d bar r a( i nt t amanho ) / * Def i ni cao da f uncao. */ { i nt i ;
f or ( i = 1; i <= t amanho; i ++ ) pr i nt f ( "%c" , ' =' ) ; pr i nt f ( "\ n\ n" ) ; }
No exemplo, a funo bar r a( ) foi definida com um parmetro denominado de tamanho. A cada vez que a funo foi chamada, o valor do tamanho foi substitudo (por 35, 31 e 22 para cada chamada no programa acima).
Introduo linguagemC Rodolfo Riyoei Goya 42 de 62 5.4. Funes e variveis globais
Os comandos de declarao executados no interior de funes definem variveis cuja validade se restringe ao interior da funo e por isso so invisveis para outras funes. Tais variveis so denominadas de locais e nos permitem definir variveis com o mesmo nome, mas com diferentes usos em diferentes funes.
Contudo, podem-se declarar variveis que sejam visveis e modificveis por todas as funes do programa sem que seja necessrio pass-las como parmetro para todas as funes. Tais variveis so ditas "globais" ou "externas".
O uso de variveis globais irrestrito. Contudo, o uso indiscriminado de variveis globais perigoso. Torna o programa difcil de modificar e corrigir. Como so visveis por todas as funes do programa, esto sujeitas a modificao por qualquer uma delas e, alm disso, usam a memria de modo menos eficiente que o usado com variveis locais.
Por exemplo:
#i ncl ude <st di o. h>
voi d i mpar ( ) ; / * Pr ot ot i po. Test a se Numer o eh I mpar */ voi d negat i vo( ) ; / * Pr ot ot i po. Test a se Numer o eh Posi t i vo */
i nt numer o; / * Var i avel gl obal . */
mai n( ) { pr i nt f ( "Tecl e umnumer o: " ) ; scanf ( " %d", &numer o ) ; i mpar ( ) ; negat i vo( ) ; }
voi d i mpar ( ) { i f ( numer o %2 ) / * Mani pul a uma var i avel gl obal . */ pr i nt f ( "O numer o eh i mpar . \ n" ) ; el se pr i nt f ( "O numer o eh par . \ n" ) ; }
voi d negat i vo( ) { i f ( numer o >= 0 ) / * Mani pul a uma var i avel gl obal . */ pr i nt f ( "O numer o eh posi t i vo. \ n") ; el se pr i nt f ( "O numer o eh negat i vo. \ n") ; }
Introduo linguagemC Rodolfo Riyoei Goya 43 de 62 6. Vetores e Strings
Vetores e strings so nomes dados a arranjos de variveis onde diversas variveis de um mesmo tipo e formando um conjunto so tratados coletivamente.
Os vetores so declarados conforme a estrutura abaixo:
t i po nome[ t amanho] ;
Onde o tipo e o nome seguem as regras j conhecidas para declarao de variveis e o tamanho nos d o nmero de elementos que compem o conjunto.
Exemplo:
#i ncl ude <st di o. h>
mai n( ) { f l oat soma; f l oat t emper at ur a[ 7] ; i nt i ;
f or ( i = 0; i < 7 ; i ++ ) { pr i nt f ( "Ent r e coma t emper at ur a do di a %d: " , i ) ; scanf ( " %f ", &t emper at ur a[ i ] ) ; }
f or ( soma = 0, i = 0; i < 7 ; i ++ ) soma += t emper at ur a[ i ] ;
pr i nt f ( "Temper at ur a medi a eh de %f : ", soma / 7 ) ; }
importante notar que, na linguagem C, todos os vetores tm sua numerao iniciando em 0 (ou seja, no exemplo acima, o vetor contm posies cuja enumerao vai de 0 a 6).
Introduo linguagemC Rodolfo Riyoei Goya 44 de 62 6.1. Iniciando os dados em um vetor
Os dados contidos em um vetor podem ser inicializados diretamente na sua declarao. Por exemplo:
i nt di as_por _mes[ 12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
Inicia um vetor de 12 posies com cada posio contendo o nmero de dias que o ms tem.
Ao iniciarem-se os dados de um vetor no necessrio definir o tamanho do vetor:
f l oat pr ecos[ ] = {20. 1, 12. 5, 8. 8, 6. 9, 13. 5};
O compilador esperto o suficiente para contar o nmero de elementos utilizados na definio e criar um vetor do tamanho apropriado.
Contudo, o uso de inicializao de vetores restrito a variveis globais, no podendo ser usado em variveis locais.
Introduo linguagemC Rodolfo Riyoei Goya 45 de 62 6.2. Vetores de duas ou mais dimenses
Em linguagem C podemos definir vetores de duas dimenses:
i nt t abul ei r o[ 8] [ 8] ;
Ou mais dimenses:
i nt cubo[ 3] [ 2] [ 4] ;
Todas as consideraes feitas para vetores valem para os vetores multi- dimensionais. Um aspecto importante o da iniciao de um vetor multidimensional. Neste caso, a lista de valores empregada para a inicializao deve ser construda de modo que o ndice da direita varia mais rapidamente que o ndice da esquerda.
Os valores 3, 2 e 4 so desnecessrios para especificar o tamanho do vetor. Foram colocados para maior clareza do que ocorre no exemplo. Por ele, notamos que a posio Cubo[2][1][0] foi inicializada com o valor 21. Introduo linguagemC Rodolfo Riyoei Goya 46 de 62 6.3. Passando vetores como parmetro de funes
Para passar um vetor como parmetro de uma funo, basta definir em seu prottipo e cabealho a especificao do tipo com o uso dos colchetes:
i nt maxi mo( i nt [ ] , i nt ) ; / * Pr ot ot i po de maxi mo. */
No prottipo do exemplo, a funo definida retorna um valor inteiro e tem dois parmetros. O primeiro parmetro um vetor e o segundo um inteiro.
Por exemplo, para o prottipo acima, podemos escrever a seguinte funo:
i nt maxi mo( i nt [ ] l i st a, i nt t amanho ) { i nt t est e; i nt i ;
t est e = l i st a[ 0] ;
f or ( i = 0; i < t amanho; i ++ ) i f ( l i st a[ i ] > t est e ) t est e = l i st a[ i ] ;
r et ur n t est e; }
Introduo linguagemC Rodolfo Riyoei Goya 47 de 62 6.4. Strings
Strings so um caso particular de vetor, so vetores de caracteres. Os strings so utilizados para a manipulao de textos tais como palavras, nomes e frases.
Constantes contendo strings normalmente so definidas na forma de textos entre aspas: "EU GOSTO DE C".
Variveis contendo strings so declaradas na formas de vetores de variveis de tipo char :
char nome[ 20] ;
Contudo, a inicializao de strings pode ser facilitada pelo compilador.
char cumpr i ment o[ 20] = " BomDi a" ;
Todo string acaba por representar um bloco de dados em memria onde, em cada posio, colocado o cdigo correspondente a um caracter do string. Aps o ltimo caracter do string, colocado um valor 0 sinalizando o trmino do string. (Este formato de string conhecido como ASCIIZ ASCII seguido de um zero).
De fato, a inicializao acima equivalente inicializao descrita abaixo:
char cumpr i ment o[ ] = {' B' , ' o' , ' m' , ' ' , ' D' , ' i ' , ' a' , ' \ 0' };
Onde o '\0' corresponde ao valor zero que indica o final do string.
Introduo linguagemC Rodolfo Riyoei Goya 48 de 62 6.5. Funes de manipulao de strings
Vamos ver, nesta seo, como so algumas funes para manipulao de strings:
Para manipular strings, as funes scanf ( ) e pr i nt f ( ) dispem de um especificador de formato apropriado: %s.
char nome[ 20] = "Pr ogr ama Test e. C"
pr i nt f ( "Nome at ual : %s\ n" , nome ) ; pr i nt f ( "Ent r e comnovo nome: " ) ; scanf ( " %s", nome ) ;
O uso do especificador de formato (%s) muito semelhante ao usado para outros tipos de dados. Com relao funo scanf ( ) uma diferena importante surge pois a varivel surge sem o smbolo & e isto se deve ao fato de que a linguagem C subentende que o uso do nome de um vetor ou string sem o ndice significa que o valor indicado o seu endereo.
De fato nome equivalente a &nome[ 0] .
Alm do scanf ( ) e pr i nt f ( ) existem mais duas outras funes apropriadas para manipulao de strings: get s( ) e put s( ) . Seu uso bastante simples:
put s( "Ent r e comseu nome: " ) ; get s( Nome ) ; put s( "Como vai " ) ; put s( Nome ) ;
Como pode ser visto, as funes get s( ) e put s( ) movimentam strings entre variveis e tela de modo bastante simples.
Introduo linguagemC Rodolfo Riyoei Goya 49 de 62 7. Ponteiros
Outro tipo de dado presente na linguagem C o ponteiro (pointer). Neste tipo de dado manipula-se no um valor, mas sim um endereo. Os valores so armazenados em memria. Deste modo, variveis distintas so armazenados em diferentes posies de memria. A cada posio corresponde um endereo diferente e nico.
Um ponteiro proporciona um meio de acesso a uma varivel sem referenciar esta varivel diretamente.
Ponteiros so empregados principalmente para retornar mais de um valor de uma funo e para passar vetores e strings de ou para uma funo.
O comando de declarao para uma varivel do tipo ponteiro tem a estrutura abaixo:
t i po *nome;
Onde o tipo e o nome seguem as regras para definio j conhecidas. O que especifica que a varivel de tipo ponteiro o asterisco colocado na frente do nome.
O uso de variveis de tipo ponteiro bastante simples:
i nt x, y; i nt *px, *py;
x = 1; / * at r i bui var i vel x o val or 1. */ y = 2; / * at r i bui var i vel y o val or 2. */ px= &x; / * at r i bui ao pont ei r o px o ender eco da var i avel x. */ py= &y; / * at r i bui ao pont ei r o py o ender eco da var i avel y. */
O significado das atribuies acima bastante simples. O operador & um operador unrio que retorna o endereo de seu operando. Assim, podemos manipular o endereo apontado por uma varivel de tipo ponteiro.
Introduo linguagemC Rodolfo Riyoei Goya 50 de 62 Outro operador importante o operador * que indica o valor contido em uma posio de memria apontada por uma varivel de tipo ponteiro.
Por exemplo:
i nt x, y; i nt *px, *py;
x = 1; / * at r i bui var i vel x o val or 1. */ y = 2; / * at r i bui var i vel y o val or 2. */
px = &x; / * at r i bui ao pont ei r o px o ender eco da var i avel x. */ py = &y; / * at r i bui ao pont ei r o py o ender eco da var i avel y. */
pr i nt f ( "O ender eco de x eh %d e o val or de x eh %d" , px, *px ) ;
onde o *px significa, literalmente, o valor da posio de memria apontado por px.
Introduo linguagemC Rodolfo Riyoei Goya 51 de 62 7.1. Ponteiros e funes
Um dos usos mais apropriados para variveis de tipo ponteiro o de passar mais de um parmetro de retorno para funes. O modo como este mecanismo implementado descrito abaixo:
voi d t r oca( i nt *px, i nt *py ) ; / * Pr ot ot i po. */
mai n( ) { i nt x = 4, y = 7;
/ * * Ao chamar a f uncao passamos o ender eco * das var i avei s x e y como par amet r o. */ pr i nt f ( "x val e %d e y val e %d\ n", x, y ) ; t r oca( &x, &y ) ; pr i nt f ( "x val e %d e y val e %d\ n", x, y ) ; }
voi d t r oca( i nt *px, i nt *py ) / * Tr oca os val or es das var i avei s apont adas por px e py. */ { i nt n;
n = *px; *py = *px; *px = n; }
Ao examinarmos a funo, verificamos que houve manipulao nos valores das posies cujos endereos foram passados como parmetro. Deste modo que conseguimos implementar funes cuja ao estendido a mais de uma varivel (ou seja, retorna mais de um valor).
Introduo linguagemC Rodolfo Riyoei Goya 52 de 62 7.2. Ponteiros e vetores
Ponteiros tambm oferecem meios bastante convenientes para manipulao de vetores. Por exemplo, o programa abaixo utiliza ponteiros para percorrer um vetor:
mai n( ) { i nt n[ 20] ; i nt *p; i nt i ; i nt soma;
f or ( i = 0, p = n, soma = 0; i < 20; i ++; p++ ) soma += *p; }
No exemplo, o programa percorre todo o vetor, acumulando a soma de seus elementos na varivel soma. Um detalhe importante do exemplo a operao p++ dentro do comando for. Dado que o a varivel p foi definida como um ponteiro para um inteiro, p++ significa que o endereo contido em p foi acrescido de uma quantidade que corresponde ao nmero de posies de memria ocupadas pela varivel do tipo especificado quando da declarao do ponteiro (o que equivale a dizer que, aps o incremento, p passa a apontar para a prxima posio dentro do vetor).
Outro aspecto importante o de como as variveis de tipo ponteiro so aplicveis para a passagem de vetores como parmetros para funes. Ao se passar um ponteiro para um vetor como parmetros para uma funo, trabalhamos sobre a mesma instncia dos dados do vetor, ou seja, no criamos uma cpia dos dados para uso dentro da funo.
Introduo linguagemC Rodolfo Riyoei Goya 53 de 62 7.3. Ponteiros e strings
Ponteiros tambm oferecem meios bastante convenientes para manipulao de strings. Por exemplo, o programa abaixo utiliza ponteiros para percorrer um string:
mai n( ) { char f r ase[ 20] ; i nt *p; i nt cont char ; i nt cont spaces;
p = f r ase; / * p apont a par a o i ni ci o da f r ase. */ cont char = cont spaces = 0; whi l e ( ! *p ) / * Umst r i ng t er mi na comumval or 0. */ { i f ( *p == ' ' ) cont spaces++; cont char ++; p++; } }
No exemplo, o programa percorre todo o string, contando o nmero de espaos em branco e caracteres presentes nele. No final de um string sempre encontramos o valor 0.
Introduo linguagemC Rodolfo Riyoei Goya 54 de 62 8. Arquivos
A linguagem C oferece em sua biblioteca uma srie de funes prprias para manipulao de dados guardados em disco (sejam os chamados discos removveis ou disquetes ou os chamados discos fixos ou rgidos). Nestes tipos de meio, os dados so guardados em blocos denominados de arquivos.
Como os dados guardados em arquivos tm caracterstica de persistncia (sua durao se estende alm da execuo do prprio programa e sobrevive ao desligamento e religamento da mquina), a manipulao de arquivos apropriada para manuseio e manuteno de bancos de dados entre outras aplicaes.
Existem, basicamente, dois tipos de entrada/sada para disco: o chamado modo texto (ou modo padro) e o modo binrio. Ambos os modos sero descritos nas sesses seguintes.
8.1. Fases na manipulao de arquivos
Ambos os modos de acesso a arquivos passam por trs etapas: abertura, manipulao (leitura ou escrita) e fechamento.
Na fase de abertura, o programa especifica o nome do arquivo que se deseja manipular, o tipo de entrada/sada a ser efetuado (se no tipo texto ou binrio) e se o acesso vai ser de leitura ou escrita.
Na fase de manipulao, o programa pode enviar dados para o disco (escrita em arquivo) ou receber dados vindos do disco (leitura de arquivo).
No fechamento, o programa informa ao sistema operacional que concluiu o uso do arquivo. Nesta fase qualquer dado que esteja em buffer na memria finalmente escrito no disco.
A linguagem C oferece uma srie de funes para manipulao de arquivos.
Para a manipulao de arquivos, usam-se as funes abaixo:
fopen Abre arquivo. fclose Fecha arquivo. fcloseall Fecha todos os arquivos abertos. ferror Sinaliza o status atual do arquivo. perror Imprime mensagem de erro.
As funes para manipulao de entrada e sada no modo padro so relacionadas abaixo:
putc Escreve caracter em arquivo. getc L caracter de arquivo. fputs Escreve string em arquivo. fgets L string de arquivo. fprintf Escreve formatado em arquivo. fscanf L formatado de arquivo. fwrite Escreve bloco em arquivo. fread L bloco de arquivo.
O controle de acesso ao arquivo pode ser realizado com as funes abaixo:
fgetpos Indica a posio do ponteiro de acesso ao arquivo. fseek Posiciona o ponteiro de acesso em local desejado. rewind Posiciona o ponteiro de acesso no incio do arquivo. fflush Descarrega o stream para o arquivo em disco. flushallf flush para todos os arquivos abertos. feof Indica se o ponteiro do arquivo atingiu o final.
Introduo linguagemC Rodolfo Riyoei Goya 56 de 62 8.2.1. Abertura de arquivo
A abertura de arquivo um procedimento de comunicao entre o programa e o sistema operacional. Ela necessria para que o sistema verifique o acesso ao arquivo, onde ele est localizado, qual o tipo de acesso desejado e definir as reas de buffers necessrias para a operao do arquivo.
Para abrirmos um arquivo, necessrio declarar-se uma varivel de tipo ponteiro para arquivo com o comando:
FI LE *ar qui vo;
Onde arquivo um nome de identificador para a varivel. De posse da varivel, a abertura pode ser efetuada com o seguinte procedimento:
ar qui vo = f open( " NOME. EXT", Codi goDeAcesso ) ;
O "NOME.EXT" o nome do arquivo a ser aberto. Est localizado no diretrio atual e no procurado no path. Se estiver em outro disco ou diretrio deve ser especificado por completo (pro exemplo: "C:\\QC25\\SOURCE\\EXEMPLO.TXT").
O cdigo de acesso um dentre seis possveis strings:
"r " Aberto para leitura. O arquivo j deve existir. Se no existir devolve NULL.
"w" Aberto para escrita. Se o arquivo j existe seu contedo perdido. Se no, um arquivo novo criado. "a" Append: Se o arquivo j existe, ele aberto para escrita aps o final. Se no, um arquivo para escrita novo criado. "r +" Aberto para leitura e escrita. O arquivo j deve existir. Se no existir devolve NULL. "w+" Aberto para leitura e escrita. Se o arquivo j existisse seu contedo original perdido. "a+" Abertura para leitura e escrita no final. Se o arquivo no existisse seria criado.
No caso de ocorrem um erro na operao de abertura de arquivo, a funo retorna com o valor NULL.
Introduo linguagemC Rodolfo Riyoei Goya 57 de 62 8.2.2. Fechamento de arquivo
O fechamento de um arquivo feito atravs da funo f cl ose( ) ou f cl oseal l ( ) na forma abaixo:
f cl ose( ar qui vo ) ; f cl oseal l ( ) ;
No primeiro caso fechado um arquivo especfico. No segundo todos os arquivos que estejam abertos.
8.2.3. Mensagem de erro
A ocorrncia de erro pode ser testada com o uso da funo f er r or ( ) . Caso ocorra algum erro ela retorna um valor no nulo. A funo per r or ( ) imprime uma mensagem de erro com um string dado pelo usurio e a mensagem correspondente ao erro ocorrido vinda do sistema:
i f ( f er r or ( ar qui vo ) ) per r or ( " O er r o ocor r i do f oi " ) ;
Introduo linguagemC Rodolfo Riyoei Goya 58 de 62 8.2.4. Entrada e sada de caracteres e strings para arquivos
As funes bsicas de entrada e sada de caracteres em arquivos so get c( ) e put c( ) e so usadas da seguinte forma:
put c( ch, ar qui vo ) ; ch = get c( ar qui vo ) ;
Com ch de tipo char ou i nt . (Como i nt pode-se usar o fato de que a funo retorna o valor EOF (-1) caso o arquivo tenha chegado ao final) e arquivo de tipo ponteiro para arquivo com endereo de arquivo j aberto.
As funes para entrada e sada de strings so usadas conforme descrito abaixo:
f get s( st r i ng, ar qui vo ) ; f put s( st r i ng, ar qui vo ) ;
Com string como ponteiro para caracter e arquivo como ponteiro para arquivo apontando para arquivo j aberto.
8.2.5. Entrada e sada formatada para arquivos
Para entrada e sada formatada para arquivos usamos as funes f pr i nt f ( ) e f scanf ( ) . O uso destas funes idntico ao empregado para console (pr i nt f ( ) e scanf ( ) ) com acrscimo para a identificao do arquivo em acesso:
f pr i nt f ( ar qui vo, especi f i cador de f or mat o, l i st a de var i vei s ) ; f scanf ( ar qui vo, especi f i cador de f or mat o, l i st a de var i vei s ) ;
Introduo linguagemC Rodolfo Riyoei Goya 59 de 62 8.2.6. Entrada e sada de blocos de dados com arquivos
As funes f r ead( ) e f wr i t e( ) podem ser usadas para leitura e escrita de blocos de dados para arquivos. Seu formato de uso est descrito abaixo:
f r ead( pont ei r o, numer o de i t ens, t amanho do i t em, ar qui vo ) ; f wr i t e( pont ei r o, numer o de i t ens, t amanho do i t em, ar qui vo ) ;
Onde o ponteiro o endereo inicial na memria onde vai ser colocado o dado lido ou de onde vem o dado a ser escrito, o nmero de itens especifica a quantidade de dados a serem movidos e o tamanho do item especifica o nmero de bytes para representar cada item (1 para char , 4 para i nt e assim por diante) e arquivo um ponteiro para arquivo apontando para um arquivo aberto.
Com o uso de f r ead( ) e f wr i t e( ) pode-se escrever estruturas complexas tais como vetores e vetores de strings em disco com um acesso bastante simplificado.
8.3. O controle de ponteiro de acesso a arquivos
A funo f get pos( ) devolve a posio do ponteiro de acesso ao arquivo. utilizada do seguinte modo:
posi cao = f get pos( ar qui vo ) ; / * Onde ar qui vo umpont ei r o par a um ar qui vo aber t o. */
A funo f seek( ) posiciona o ponteiro de acesso em local desejado. utilizada do seguinte modo:
f seek( ar qui vo, desl ocament o, posi cao ) ;
Onde o arquivo o ponteiro para o arquivo aberto, o deslocamento a distncia (em uma varivel tipo l ong) em relao posio especificada. Para especificar a posio so possveis trs valores: SEEK_SET para o incio do arquivo, SEEK_CUR para a posio atualmente apontada e SEEK_END para o final do arquivo. O deslocamento pode ser positivo ou negativo.
A funo r ewi nd( ) posiciona o ponteiro de acesso no incio do arquivo. Uso:
r ewi nd( ) ;
Introduo linguagemC Rodolfo Riyoei Goya 60 de 62 As funes f f l ush( ) (descarrega o stream para o arquivo em disco) e f f l ushal l ( ) (descarrega o contedo de todos os arquivos abertos para os seu respectivos arquivos em disco) controlam os buffers em memria permitindo assegurar a integridade dos dados gravados em arquivo para o caso do programa ser terminado por alguma razo exepcional. Uso:
f f l ush( ar qui vo ) ; f f l ushal l ( )
A funo f eof ( ar qui vo ) indica, com um valor retornado no nulo, que o ponteiro do arquivo atingiu o final.
f eof ( ar qui vo ) ;
Introduo linguagemC Rodolfo Riyoei Goya 61 de 62 9. Estruturas
Estruturas (struct) so ferramentas da linguagem C que permitem que o programador defina tipos de variveis que so o agrupamento de variveis (como nos vetores), mas com diferentes tipos.
Por exemplo, suponha que um determinado programa necessite em sua estrutura de dados de uma entidade para armazenar o nome (um vetor de caracteres), nmero do departamento (um inteiro) e o salrio (um nmero em ponto flutuante) de um funcionrio. So dados de tipos diferentes e poderia ser necessrio criar vetores com estas estruturas.
Para tal a linguagem C definiria uma estrutura como a abaixo:
st r uct f i chaTi po / * Def i ni cao da est r ut ur a. */ { char nome[ 40] ; i nt dept o; doubl e sal ar i o; }
st r uct f i chaTi po f i cha; / * Decl ar acao da var i avel . */
O uso da varivel bastante simples.
f i cha. dept o = 1; f i cha. sal ar i o = 12000. 0;
Estruturas podem formar vetores:
st r uct f i chaTi po f i char i o[ 1000] ;
Ponteiros para estruturas tambm podem ser definidos.
st r uct f i chaTi po *pf i cha;
Para identificar o elemento da estrutura apontado por um ponteiro deste tipo usamos outro operador: ->
Depar t ament o = pf i cha- >dept o;
Introduo linguagemC Rodolfo Riyoei Goya 62 de 62 Bibliografia
Barkakati, N. - The Waite Group's Microsoft C Bible Howard W. Sams & Co
uma referncia completa. Prpria para um guia de consulta para programadores que trabalhem com a linguagem C. Contm uma relao e descrio extensa das funes de biblioteca oferecidas pela linguagem incluindo um guia de compatibilidade com outras verses de compiladores, com a verso C do sistema UNIX e com o padro ANSI. Descreve, com exemplos, o uso das funes. No muito apropriado para iniciantes ou pessoas que desejam se um livro para o aprendizado da linguagem.
Waite, M. e Prata, S. - The New Waite Group's C Primer Plus Howard W. Sams & Co
um livro didtico da melhor qualidade. Apresenta conceitos e filosofias prprias da linguagem C de forma simples e repleta de exemplos.
Jansa, K. - Microsoft C. Dicas, Segredos e Truques. Makrom Books
um livro muito bom. Em portugus, constitui-se em um guia muito bom para iniciantes. Introduz o programador de uma forma didtica inclusive apresentando dicas e os erros mais frequentemente cometidos por programadores iniciantes. Sua falha mais importante concentrar-se principalmente na linguagem C da Microsoft sem comparar com outras implementaes e dedicar espao em excesso aos detalhes especficos ao IBM-PC.