Home

Curso de Linguagem C / UFMG

image

Contents

1. 7 9 Os Argumentos argc e argv A fun o main pode ter par metros formais Mas o programador n o pode escolher quais ser o eles A declara o mais completa que se pode ter para a fun o main int main int argo char argvl Os par metros argc e argv d o ao programador acesso linha de comando com a qual o programa foi chamado O argc argument count um inteiro e possui o n mero de argumentos com os quais a fun o main foi chamada na linha de comando Ele no m nimo 1 pois o nome do programa contado como sendo o primeiro argumento O argv argument values um ponteiro para uma matriz de strings Cada string desta matriz um dos par metros da linha de comando O argv 0 sempre aponta para o nome do programa que como j foi dito considerado o primeiro argumento E para saber quantos elementos temos em argv que temos argc Exemplo Escreva um programa que fa a uso dos par amentros argv e argc O programa dever receber da linha de comando o dia mes e ano correntes e imprimir a data em formato apropriado Veja o exemplo supondo que o execut vel se chame data data 26 04 98 O programa dever imprimir 26 de abril de 1998 tinclude lt stdio h gt tinclude lt stdlib h gt void main int argc char argvl int mes char nomemes Janeiro Fevereiro Mar o Abril Maio Junno Julho Agosto Setembro Outubro Novembro Dezenbro if argc 4 T
2. Pe E Seo seu dLSco estiver muito CREIO RA if ferror p printf nNem tudo sao EFlor s Cosas fclose p strcat frase str abre novamente para a leitura e fecha p fopen str r fgets resposta strlen frase 1 p printe AningsAn resposta fclose p remove str 9 8 Fluxos Padr o Os fluxos padr o em arquivos permitem ao programador ler e escrever em arquivos da maneira padr o com a qual o programador j lia e escrevia na tela 9 8 1 fprintf A fun o fprintf funciona como a fun o printf A diferen a que a sa da de fprintf um arquivo e n o a tela do computador Prot tipo int tprinet ELLE LD pChaLr SCE sd Como j poder amos esperar a nica diferen a do prot tipo de fprintf para o de printf a especifica o do arquivo destino atrav s do ponteiro de arquivo 9 8 2 fscanf A fun o fscanf funciona como a fun o scanf A diferen a que fscanf l de um arquivo e n o da tela do computador Prot tipo int fscant FILE fpy char stipes Como j poder amos esperar a nica diferen a do prot tipo de fscanf para o de scanf a especifica o do arquivo destino atrav s do ponteiro de arquivo Talvez a forma mais simples de escrever o programa do segmento 9 6 seja usando fprintf e fscanf Fica assim tinclude lt stdio h tinclude lt stdlib h void main FEGE p3 P g 67 char str 80 c Le um nome para o ar
3. Diz ao compilador que a fun o em quest o ser usada como um manipulador de interrup es Isto faz com que o compilador preserve os registradores da CPU antes e depois da chamada fun o Mais uma vez este t pico est fora do escopo do curso 10 5 Ponteiros para Fun es O C permite que acessemos vari veis e fun es atrav s de ponteiros Esta mais uma caracter stica que mostra a for a da linguagem de programa o C Podemos ent o fazer coisas como por exemplo passar uma fun o como argumento para outra fun o Um ponteiro para uma fun o tem a seguinte declara o tipo de retorno nome do ponteiro ou tipo de retorno nome do ponteiro declara o de par metros Veja que n o obrigat rio se declarar os par metros da fun o Veja um exemplo do uso de ponteiros para fun es tinclude lt stdio h gt tinclude lt string h gt void Printotring char str 2nt Lune s main void Char oting Z0 Curso de Cams Int Hp T p puts PreneScrinao SLriad pN return O P g 71 yord Printocrino char Strine Iune 9 func str No programa acima a fun o PrintString usa uma fun o qualquer func para imprimir a string na tela O programador pode ent o fornecer n o s a string mas tamb m a fun o que ser usada para imprimf la No main vemos como podemos atribuir ao ponteiro para fun es p o endere o da fun o puts do C
4. o valor armazenado em i passa a ser igual a 16 3 7 Express es Express es s o combina es de vari veis constantes e operadores Quando montamos express es temos que levar em considera o a ordem com que os operadores s o executados conforme a tabela de preced ncias da linguagem C Exemplos de express es Anos Dias 365 25 1 1 3 c a b d e c a b d e 3 7 1 Convers o de tipos em express es Quando o C avalia express es onde temos vari veis de tipos diferentes o compilador verifica se as convers es s o poss veis Se n o s o ele n o compilar o programa dando uma mensagem de erro Se as convers es forem poss veis ele as faz seguindo as regras abaixo 1 Todos os chars e short ints s o convertidos para ints Todos os floats s o convertidos para double s 2 Para pares de operandos de tipos diferentes se um deles long double o outro convertido para long double se um deles double o outro convertido para double se um long o outro convertido para long se um unsignedo outro convertido para unsigned 3 7 2 Express es que Podem ser A breviadas O C admite as seguintes equival ncias que podem ser usadas para simplificar express es ou para facilitar o entendimento de um programa Express o Original Express o Equivalente P g 20 3 7 3 Encadeando express es o operador O operador determina uma lista de express es que devem ser executadas sequencialment
5. Um ERES Est Tor Tomar XL cem 107 49 67 29 67 Ene poss vel tamb m indicar o tamanho do campo justifica o e o n mero de casas decimais Para isto usa se c digos colocados entre o e a letra que indica o tipo de formato Um inteiro indica o tamanho m nimo em caracteres que deve ser reservado para a sa da Se colocarmos ent o 5d estamos indicando que o campo ter cinco caracteres de comprimento no m nimo Se o Inteiro precisar de mais de cinco caracteres para ser exibido ent o o campo ter o comprimento necess rio para exibr lo Se o comprimento do Inteiro for menor que cinco ent o o campo ter cinco de comprimento e ser preenchido com espa os em branco Se se quiser um preenchimento com zeros pode se colocar um zero antes do n mero Temos ent o que 05d reservar cinco casas para o n mero e se este for menor ent o se far o preenchimento com zeros O alinhamento padr o direita Para se alinhar um n mero esquerda usa se um sinal antes do n mero de casas Ent o 5d ser o nosso inteiro com o n mero m nimo de cinco casas s que justificado a esquerda Pode se indicar o n mero de casas decimais de um n mero de ponto flutuante Por exemplo a nota o 10 4f indica um ponto flutuante de comprimento total dez e com 4 casas decimais Entretanto esta mesma nota o quando aplicada a tipos como inteiros e strings indica o n mero m nimo e m ximo de casas Ent o 5 8d um inteiro com comprimento m
6. es Para maiores informa es aconselhamos ao aluno procurar o manual espec fico do compilador que est sendo utilizado 8 2 A Diretiva include A diretiva finclude j foi usada durante o nosso curso diversas vezes Ela diz ao compilador para incluir na hora da compila o um arquivo especificado Sua forma geral include nome do arquivo ou include lt nome do arquivo gt A diferen a entre se usar e lt gt somente a ordem de procura nos diret rios pelo arquivo especificado Se voc quiser informar o nome do arquivo com o caminho completo ou se o arquivo estiver no diret rio de trabalho use Se o arquivo estiver nos caminhos de procura pr especificados do compilador como o caso de arquivos como stdio h use lt gt 8 3 As Diretivas define e undef A diretiva define tem a seguinte forma geral define nome da macro sequ ncia de caracteres Quando voc usa esta diretiva voc est dizendo ao compilador para que toda vez que ele encontrar o nome da macro no programa a ser compilado ele deve substituflo pela sequ ncia de caracteres fornecida Isto muito til para deixar o programa mais geral Veja um exemplo tinclude lt stdio h gt tdefine PI 3 1416 tdetine VERS O 2 02 main printf Programa versao s VERSAO printf O numero pi vale f PI 3 Se quisermos mudar o nosso valor de PI ou da VERSAO no programa acima basta mexer no in cio do programa Isto torna o pr
7. strcpy ficha endereco cidade Belo Horizonte strcpy ficha endereco sigla_estado MG ficha endereco CEP 31340230 return O O programa declara uma vari vel ficha do tipo ficha_pessoal e preenche os seus dados O exemplo mostra como podemos acessar um elemento de uma estrutura basta usar o ponto P g 76 11 1 3 Matrizes de estruturas Um estrutura como qualquer outro tipo de dado no C Podemos portanto fazer matrizes de estruturas Vamos ver como ficaria a declara o de uma matriz de 100 fichas pessoais struct ficha pessoal fichas 100 Poder amos ent o acessar a segunda letra da sigla de estado da d cima terceira ficha fazendo fichas 12 endereco sigla estado 1 Atribuindo Podemos atribuir duas estruturas que sejam do mesmo tipo O C ir neste caso copiar uma estrutura na outra Esta opera o n o apresenta problemas pois quando declaramos struct ficha pessoal ficha ficha n o um ponteiro mas uma estrutrura Veja as linhas abaixo void main struct ficha_pessoal primeira segunda Le dados amp primeira segunda primeira Imprime dados segunda S o declaradas duas estruturas do tipo ficha_pessoal uma chamada primeira e outra chamada segunda Supondo que haja declarada uma fun o Le_dados que fa a a leitura de uma estrutura admitimos que ap s a execu o da segunda linha de main a estrutura primeira estar preenchida com dados v lidos Os valores
8. strings isto copia os caracteres de uma string para o vetor da outra tinclude lt stdio h gt main int count char str1 100 str2 100 SPOe Aqui o programa le strl que sera copiada para str2 for count 0 str1li count count str2 count str1 count str2 count 0 1t sa Aqui o programa continua A condi o no loop for acima baseada no fato de que a string que est sendo copiada termina em 0 Este tipo de racioc nio a base do C e voc deve fazer um esfor o para entender como que o programa acima funciona Quando o elemento encontrado em strl count o 0 o valor retornado para o teste condicional falso nulo Desta forma a express o que vinha sendo verdadeira n o zero continuamente torna se falsa Vamos ver agora algumas fun es b sicas para manipula o de strings 5 2 1 gets A fun o gets l uma string do teclado Sua forma geral gets nome da string O programa abaixo demonstra o funcionamento da fun o gets include lt stdio h gt main char string 100 printf Digite o seu nome 3 P g 36 gets string printf na Ola Se ecrino Repare que v lido passar para a fun o printf o nome da string Voc ver mais adiante porque isto v lido Como o primeiro argumento da fun o printf uma string tamb m v lido fazer princi String isto simplismente imprimir a string 5 2 2 strc
9. 10 6 Aloca o Din mica A aloca o din mica permite ao programador criar vari veis em tempo de execu o ou seja alocar mem ria para novas vari veis quando o programa est sendo executado Esta outra ferramenta que nos mostra o poder do C O padr o C ANSI define apenas 4 fun es para o sistema de aloca o din mica dispon veis na biblioteca stdlib h No entanto existem diversas outras fun es que s o amplamente utilizadas mas dependentes do ambiente e compilador Neste curso ser o abordadas somente estas fun es b sicas Consulte o manual de seu compilador para saber mais sobre as fun es dispon veis para aloca o din mica 10 6 1 malloc A fun o malloc serve para alocar mem ria e tem o seguinte prot tipo void malloc unsigned int num A fun ao toma o n mero de bytes que queremos alocar num aloca na mem ria e retorna um ponteiro void para o primeiro byte alocado O ponteiro void pode ser atribu do a qualquer tipo de ponteiro Se n o houver mem ria suficiente para alocar a mem ria requisitada a fun o malloc retorna um ponteiro nulo Veja um exemplo de aloca o din mica com malloc tinclude lt stdio h gt ftinclude lt stdlib h gt main void ne Sp int a Determina o valor de a em algum lugar p 1ht jmalloc a sizeof int 1f ip Printi 4 4 Erro Memoria Insgiiciente my3 exit return Os No exemplo acima alocada mem ria suficiente par
10. 6 3 4 Endere os de elementos de vetores Nesta se o vamos apenas ressaltar que a nota o amp nome da vari vell ndice v lida e retorna o endere o do ponto do vetor indexado por ndice Isto seria equivalente a nome da vari vel indice interessante notar que como consequ ncia o ponteiro nome da vari vel tem o endere o amp nome da vari vel 0 que indica onde na mem ria est guardado o valor do primeiro elemento do vetor 6 3 5 Vetores de ponteiros Podemos construir vetores de ponteiros como declaramos vetores de qualquer outro tipo Uma declara o de um vetor de ponteiros Inteiros poderia ser int pmacea 10 No caso acima pmatrx um vetor que armazena 10 ponteiros para Inteiros 6 4 Inicializando Ponteiros Podemos inicializar ponteiros Vamos ver um caso Interessante dessa inicializa o de ponteiros com strings Precisamos para isto entender como o C trata as strings constantes Toda string que o programador insere no programa colocada num banco de strings que o compilador cria No local onde est uma string no programa o compilador coloca o endere o do in cio daquela string que est no banco de strings por isto que podemos usar strepy do seguinte modo stropy string String constante strepy pede dois par metros do tipo char Como o compilador substitui a string String constante pelo seu endere o no banco de strings tudo est bem para a fun o strepy O que i
11. Podemos ver ent o que o for executa a inicializa o incondicionalmente e testa a condi o Se a condi o for falsa ele n o faz mais nada Se a condi o for verdadeira ele executa a declara o o incremento e volta a testar a condi o Ele fica repetindo estas opera es at que a condi o seja falsa Abaixo vemos um programa que coloca os primeiros 100 n meros na tela tinclude lt stdio h gt main int count tor count L Count lt 100 count count l printf sd countL 2 6 Coment rios Como j foi dito o uso de coment rios torna o c digo do programa mais f cil de se entender Os coment rios do C devem come ar com e terminar com O C padr o n o permite coment rios aninhados um dentro do outro mas alguns compiladores os aceitam 2 7 Palavras Reservadas do Todas as linguagens de programa o t m palavras reservadas As palavras reservadas n o podem ser usadas a n o ser nos seus prop sitos originais Isto n o podemos declarar fun es ou vari veis com os mesmos nomes Como o C case sensitive podemos declarar uma vari vel For apesar de haver uma palavra reservada for mas isto n o uma coisa recomend vel de se fazer pois pode gerar confus o Apresentamos a seguir as palavras reservadas do ANSI C auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void defa
12. Sua forma geral struct nome do tipo da estrutura tipo_l nome_l tipo 2 nome 2 P g 75 tipo n nome n vari veis estrutura O nome do tipo da estrutura o nome para a estrutura As vari veis estrutura s o opcionais e seriam nomes de vari veis que o usu rio j estaria declarando e que seriam do tipo nome do tipo da estrutura Vamos criar uma estrutura de endere o struct tipo endereco char rua 50 int numero char bairro 20 char cidade 30 char sigla estado 3 Long Int CER Hi Vamos agora criar uma estrutura chamada ficha com os dados pessoais de uma pessoa struct ficha pessoal char nome 50 long int telefone struct tipo_endereco endereco J Vemos pelos exemplos acima como declarar uma estrutura e que uma estrutura pode fazer parte de outra 11 1 2 Usando Vamos agora utilizar as estruturas declaradas na se o anterior para escrever um programa que preencha uma ficha finclude lt stdio h gt tinclude lt string h gt struct tipo endereco char rua 50 int numero char bairro 20 char cidade 30 char sigla estado 3 Long int CEP H5 struct ficha pessoal char nome 50 long int telefone struct tipo_endereco endereco main void struct ficha_pessoal ficha stropy ficha nome Luiz Osvaldo Silva s ficha telefone 4921234 strcpy ficha endereco rua Rua das Flores ficha endereco numero 10 strcpy ficha endereco bairro Cidade Velha
13. alho no caso das fun es do pr prio C j est o compiladas e normalmente s o inclu das no programa no instante da linkagem Este o instante em que todas as refer ncias a fun es cujos c digos n o est o nos nossos arquivos fontes s o resolvidas buscando este c digo nos arquivos de bibliotecas Se voc criar algumas fun es que queira aproveitar em v rios programas futuros ou m dulos de programas voc pode escrever arquivos cabe alhos e incluf los tamb m Suponha que a fun o nt EPar int a do segundo exemplo da p gina c 20 html seja importante em v rios programas e desejemos declar la num m dulo separado No arquivo de cabe alho chamado por exemplo de funcao h teremos a seguinte declara o int EPar int a O c digo da fun o ser escrito num arquivo a parte Vamos cham lo de funcao c Neste arquivo teremos a defini o da fun o int EPar int a if a52 Verifica se a e divisivel por dois recurn O else return 1 Por fim no arquivo do programa principal teremos o programa principal Vamos chamar este arquivo aqui de princip c include lt stdio h gt tinclude Euncaoco hnh main P g 50 int num printf Entre com numero scanf Zd amp num if EPar num prinet nino numero e par n else printf n no n mero e impar in Este programa poderia ser compilado usando a seguinte linha de comando para o gcc GeCe princip c Iunc
14. apontado pelo nome do vetor Seja int vetor 10 int ponteiro ponteiro amp 1 as operacoes a seguir sao invalidas vetor vetor 2 ERRADO vetor nao e variavel vetor ERRADO vetor nao e variavel vetor ponteiro ERRADO vetor nao e variavel Teste as opera es acima no seu compilador Ele dar uma mensagem de erro Alguns compiladores dir o que vetor n o um Lvalue Lvalue significa Left value um s mbolo que pode ser colocado do lado esquerdo de uma express o de atribui o isto uma vari vel Outros compiladores dir o que tem se incompatible types in assignment tipos incompat veis em uma atribui o as operacoes abaixo sao validas ponteiro vetor CERTO ponteiro e variavel ponteiro vetor 2 CERTO ponteiro e variavel O que voc aprendeu nesta se o de suma Import ncia N o siga adiante antes de entend la bem 6 3 2 Ponteiros como vetores Sabemos agora que na verdade o nome de um vetor um ponteiro constante Sabemos tamb m que podemos indexar o nome de um vetor Como consequ ncia podemos tamb m indexar um ponteiro qualquer O programa mostrado a seguir funciona perfeitamente include lt stdio h gt main lot matrx L0 dd 2 Sp l bp Or ly Op De 10 J3 ine FO p matrx printf O terceiro elemento do vetor e Sd p 2 Podemos ver que p 2 equivale a p 2 6 3 3 Strings Seguind
15. elas trabalham corretamente para qualquer tipo de dado enquanto os argumentos passados forem coerentes Mas isto pode trazer tamb m algumas armadilhas Veja que a linha 2 maxiorr Fr ser substitu da pelo c digo x p gt r p r e em consequ ncia incrementar o maior valor duas vezes A diretiva undeftem a seguinte forma geral undef nome da macro Ela faz com que a macro que a segue seja apagada da tabela interna do compilador que guarda as macros como se o compilador n o conhecesse mais esta macro 8 4 As Diretivas ifdef e endif Nesta se o e at mais a frente veremos as diretivas de compila o condicional Elas s o muito parecidas com os comandos de execu o condicional do C As duas primeiras diretivas que veremos s o as ifdefe endif Suas formas gerais s o ifdefnome_da_macro sequ ncia de declara es Hendif A sequ ncia de declara es ser compilada apenas se o nome da macro estiver definido A diretiva de compila o HFendif util para definir o fim de uma sequ ncia de declara es para todas as diretivas de compila o condicional As linhas tdefine PORTO 0x378 Linhas de codigo qualquer tifdef PORTO define PORTA PORT 0 tinclude sys port h tendif demonstram como estas diretivas podem ser utilizadas Caso PORT O tenha sido previamente definido a macro PORTA definida e o header file port h inclu do 8 5 A Diretiva ifndef A diretiva
16. mero de argumentos que o de caracteres de controle na string de controle Outra coisa importante lembrarmos de colocar o amp antes das vari veis da lista de argumentos imposs vel justificar isto agora mas veremos depois a raz o para este procedimento Maiores detalhes sobre a fun o scanf ser o vistos posteriormente mas podem ser consultados de antem o pelos interessados 2 5 Introdu o a Alguns Comandos de Controle de Fluxo Os comandos de controle de fluxo s o aqueles que permitem ao programador alterar a sequ ncia de execu o do programa Vamos dar uma breve introdu o a dois comandos de controle de fluxo 2 5 1 if O comando if representa uma tomada de decis o do tipo SE isto ENT O aquilo A sua forma geral if condi o declara o A condi o do comando if uma express o que ser avaliada Se o resultado for zero a declara o n o ser executada Se o resultado for qualquer coisa diferente de zero a declara o ser executada A declara o pode ser um bloco de c digo ou apenas um comando interessante notar que no caso da declara o ser um bloco de c digo n o necess rio e nem permitido o uso do no final do bloco Isto uma regra geral para blocos de c digo Abaixo apresentamos um exemplo tinclude lt stdio h gt main int num printf Digite um numero scanf Zd amp num if num gt 10 printf ininO numero e maior que 10 if num 1
17. nimo de cinco e m ximo de oito Vamos ver alguns exemplos P g 62 pPEinct 55 20 456 671 456 67 PEIRCE CGA 2 E O printi Co LOS COLA Nos exemplos o pipe indica o in cio e o fim do campo mas n o s o escritos na tela 9 4 2 scanf Prot tipo int scanf char str 3 A string de controle str determina assim como com a fun o printf quantos par metros a fun o vai necessitar Devemos sempre nos lembrar que a fun o scanf deve receber ponteiros como par metros Isto significa que as vari veis que n o sejam por natureza ponteiros devem ser passadas precedidas do operador amp Os especificadores de formato de entrada s o muito parecidos com os de printf 7i pe Om pono fumane a h inteiro curto Inteiro curto curto po Nino ooo Os caracteres de convers o d 1 u e x podem ser precedidos por h para indicarem que um apontador para short ao inv s de int aparece na lista de argumento ou pela letra letra ele para indicar que que um apontador para long aparece na lista de argumento Semelhantemente os caracteres de convers o e fe g podem ser precedidos por para indicarem que um apontador para double ao inv s de float est na lista de argumento e 9 5 Abrindo e Fechando um Arquivo No sistema de entrada e sa da ANSI definido o tipo ponteiro de arquivo Este n o um tipo propriamente dito mas uma defini o usando o comando typedef Esta defini o e
18. o valores que s o mantidos fixos pelo compilador J usamos constantes neste curso S o consideradas constantes por exemplo os n meros e caracteres como 45 65 ou n etc 3 4 1 Constantes dos tipos b sicos Abaixo vemos as constantes relativas aos tipos b sicos do C Exemplos de Constantes o de Dado o nt NO a 2 32000 130 long int 100000 467 short int O unsigned int JOU 33078 Float 0 0 23 7 12 3e 10 double 12546354334 0 0 0000034236556 3 4 2 Constantes hexadecimais e octais Muitas vezes precisamos inserir constantes hexadecimais base dezesseis ou octais base oito no nosso programa O C permite que se fa a isto As constantes hexadecimais come am com 0x As constantes octais come am em Q Alguns exemplos Tipo Constante Char Hexadecimal 8 OxEF bits Ox12A4 Int Hexadecimal 16 03212 bits 034215432 Char Octal 8 bits Int Octal 16 bits Nunca escreva portanto 013 achando que o C vai compilar isto como se fosse 13 Na linguagem C 013 diferente de 13 P g 17 3 4 3 Constantes strings J mostramos como o C trata strings Vamos agora alertar para o fato de que uma string Joao na realidade uma constante string Isto implica por exemplo no fato de que t diferente de t pois t um char enquanto que t um vetor de dois chars onde o primeiro t e o segundo NO 3 4 4 Constantes de barra invertida O C utiliza para nos facilitar a tarefa de programar v rios
19. C simples Sua forma geral tipo da vari vel nome da vari vel taml tam2 tamN Uma matriz N dimensional funciona basicamente como outros tipos de matrizes Basta lembrar que o ndice que varia mais rapidamente o ndice mais direita 5 3 4 Inicializa o Podemos inicializar matrizes assim como podemos inicializar vari veis A forma geral de uma matriz como inicializa o tipo da vari vel nome da vari vel tam tam2 tamN flista de valores A lista de valores composta por valores do mesmo tipo da vari vel separados por v rgula Os valores devem ser dados na ordem em que ser o colocados na matriz Abaixo vemos alguns exemplos de imicializa es de matrizes Lloar vecr IOl E L3 dub Zu la Hely O0 A001 F3 inte matra 34 fl 2 d Ar gt Op Ty Br Sp dO lly la dk char ser 10 9 Pot at Ton RO Jy char str 10 Joao char str_vect 3 10 Joao Maria Jose O primeiro demonstra inicializa o de vetores O segundo exemplo demonstra a inicializa o de matrizes multidimensionais onde matrx est sendo inicializada com 1 2 3 e 4 em sua primeira linha 5 6 7 e 8 na segunda linha e 9 10 11 e 12 na ltima linha No terceiro exemplo vemos como inicializar uma string e no quarto exemplo um modo mais compacto de inicializar uma string O quinto exemplo combina as duas t cnicas para inicializar um vetor de strings Repare que devemos incluir o n
20. Jd t printi O dia O mesmos else t printf S o dias diferentes return O Voc deve estar se perguntando como que a enumera o funciona Simples O compilador pega a lista que voc fez de valores e associa a cada um um n mero inteiro Ent o ao primeiro da lista associado o n mero zero o segundo ao n mero 1 e assim por diante As vari veis declaradas s o ent o vari veis int 11 4 O Comando sizeof O operador sizeof usado para se saber o tamanho de vari veis ou de tipos Ele retorna o tamanho do tipo ou vari vel em bytes Mas porque us lo se sabemos por exemplo que um inteiro ocupa 2 bytes Devemos us lo para garantir portabilidade O tamanho de um inteiro pode depender do sistema para o qual se est compilando O sizeof chamado um operador porque ele substitu do pelo tamanho do tipo ou vari vel no momento da compila o Ele n o uma fun o O sizeof admite duas formas sizeofnome da vari vel sizeof nome do tipo Se quisermos ent o saber o tamanho de um float fazemos sizeof float Se declararmos a vari vel fcomo float e quisermos saber o seu tamanho faremos sizeof f O operador sizeoftamb m funciona com estruturas campos bit uni es e enumera es Outra aplica o importante do operador sizeof para se saber o tamanho de tipos definidos pelo usu rio Seria por exemplo uma tarefa um tanto complicada a de alocar a mem ria para um ponteiro para a estruturaf
21. Lendo e Escrevendo Strings e gets e puts Entrada e Sa da Formatada e printf e scanf Abrindo e Fechando um Arquivo e fopen e exit e fclose Lendo e Escrevendo Caracteres em Arquivos e pute e getc e feof Outros Comandos de Acesso a Arquivos e ferror e rewind e getw e putw e fgets e fputs e fread e fwrite e fseek e remove Fluxos Padr o e fprintf e fscanf P g 4 e TIPOS DE DADOS AVAN ADOS Aula 10 Modificadores de Acesso e const e volatile Especificadores de Classe de Armazenamento e auto e extern e static e register Convers o de Tipos Modificadores de Fun es e pascal e cdecl e interrupt Ponteiros para Fun es Aloca o Din mica e malloc e calloc e realloc e free Aloca o Din mica de Vetores e Matrizes e Aloca o Din mica de Vetores e Aloca o Din mica de Matrizes e TIPOS DE DADOS DEFINIDOS PELO USU RIO Aula 11 Estruturas e Criando e Usando e Matrizes de estruturas e Atribuindo e Passando para fun es e Ponteiros Uni es Enumera es O Comando sizeof O Comando typedef A e CONSIDERA ES FINAIS e AVALIA O DO CURSO e BIBLIOGRAFIA P g 5 Aula 1 1 INTRODU O Vamos neste curso aprender os conceitos b sicos da linguagem de programa o C a qual tem se tornado cada dia mais popular devido sua versatilidade e ao seu poder Uma das grandes vantagens do C que ele possu tanto caracter sticas de alto n vel quanto de baixo n ve
22. Pula para a pr xima linha e imprime O valor de i 2 O que uma fun o em C a Parte de um programa b Um bloco de c digo que pode ser utilizado diversas vezes na execu o de um programa c Uma estrutura da linguagem C que pode ser utilizada para que um programa fique mais organizado d Um bloco de c digo que pode receber par metros process los e retornar alguma coisa e Todas op es acima O comando printf s d Juros de 10 imprime a Juros de 10 b sodYo Juros de 10 C Juros de 10 d 10 Juros de e Nenhuma das anteriores O la o for de uma nica instrucao termina com P g 14 Er a Virgula Er b Chave de abertura E C Chave de fechamento E d Ponto e virgula 12 A express o de inicializa o de um laco for a Nunca executada b executada uma nica vez a cada itera o E executada enquanto o la o n o termina d E executada uma vez antes do la o ser iniciado A A A E Resposta dos testes Aula 1 e 2 l a 2 b 3 a 4 a 5b 6 a 7 b 8 d 9 e 10 a 11 d 12 d Aula 3 3 Vari veis constantes operadores e express es 3 1 Nomes de Vari veis As vari veis no C podem ter qualquer nome se duas condi es forem satisfeitas o nome deve come ar com uma letra ou sublinhado _ e os caracteres subsequentes devem ser letras n meros ou sublinhado _ H apenas mais duas restri es o nome de uma vari vel n o pode ser igual a uma palavra reservada nem igual ao nome de um
23. caractere na tela Muitas vezes queremos ler um caractere fornecido pelo usu rio Para isto as fun es mais usadas quando se est trabalhando em ambiente DOS ou Windows s o getch e getche Ambas retornam o caractere pressionado getche imprime o caractere na tela antes de retorn lo e getch apenas retorna o caractere pressionado sem imprimf lo na tela Ambas as fun es podem ser encontradas na biblioteca conio h Esta biblioteca n o est dispon vel em ambiente Unix compiladores cc e gce e podem nestes ambientes ser substitu das pela fun o scanf por m sem as mesmas funcionalidades Fis um exemplo que usa a fun o getch e seu correspondente em ambiente Unix tinclude lt stdio h gt tinclude lt conio h gt main char Ch Ch getch printf Voce pressionou a tecla c Ch Equivalente para os compiladores cc e gcc do programa acima sem usar getch include lt stdio h gt main char Ch scanf c amp Ch printf Voce pressionou a tecla c Ch A principal diferen a da vers o que utiliza getch para a vers o que n o utiliza getch que no primeiro caso o usu rio simplesmente aperta a tecla e o sistema l diretamente a tecla pressionada No segundo caso necess rio apertar tamb m a tecla lt ENTER gt 2 4 2 Strings O Pascal ao contr rio do C possui um tipo espec fico para tratar de strings sequ ncia de caracteres No C uma string um vetor
24. de caracteres terminado com um caractere nulo O caracter nulo um caractere com valor igual a zero O terminador nulo pode ser escrito usando a conven o de barra invertida do C como sendo NO Para declarar uma string podemos usar o seguinte formato geral char nome da stringltamanho da string Note que como temos que reservar um caractere para ser o terminador nulo temos que declarar o comprimento da string como sendo no m nimo um caractere maior que a maior string que pretendemos armazenar Vamos supor que declaremos uma string de 7 posi es e coloquemos a palavra Jo o nela Teremos No caso acima as duas c lulas n o usadas t m valores indeterminados Isto acontece porque o C n o imcializa vari veis cabendo ao programador esta tarefa Se quisermos ler uma string fornecida pelo usu rio podemos usar a fun o gets Um exemplo do uso desta fun o apresentado abaixo A fun o gets coloca o terminador nulo na string quando voc aperta a tecla Enter tinclude lt stdio h gt main char string 100 printi Digite uma string Di gets string P g 10 printf navaVoce digitou 5s string Como as strings s o vetores de caracteres para se acessar um determinado caracter de uma string basta indexarmos ou seja usarmos um ndice para acessarmos o caracter desejado dentro da string Suponha uma string chamada str Podemos acessar a segunda letra de str da seguinte forma str 1 a Par
25. de primeira s o copiados em segunda apenas com a express o de atribui o segunda primeira Todos os campos de primeira ser o copiados na ficha chamada segunda Deve mos tomar cuidado com a seguinte declara o struct ficha pessoal fichas 100 pois neste caso fichas um ponteiro para a primeira ficha Se quisermos a estrutura completa da n sima ficha devemos usar fichas n 1 11 1 4 Passando para fun es No exemplo apresentado no tem usando vimos o seguinte comando strcpy Eicha nome Luiz Osvaldo Salva Neste comando um elemento de uma estrutura passado para uma fun o Este tipo de opera o pode ser feita sem maiores considera es Podemos tamb m passar para uma fun o uma estrutura inteira Veja a seguinte fun o void PreencheFicha struct ficha_pessoal ficha Como vemos acima f cil passar a estrutura como um todo para a fun o Devemos observar que como em qualquer outra fun o no C a passagem da estrutura feita por valor Isto significa que altera es na estrutura dentro da fun o n o ter o efeito na vari vel fora da fun o Mais uma vez podemos contornar este pormenor usando ponteiros e passando para a fun o um ponteiro para a estrutura 11 1 5 Ponteiros Podemos ter um ponteiro para uma estrutura Vamos ver como poderia ser declarado um ponteiro para as estruturas de ficha que estamos usando nestas se es struct ficha_pessoal p Os ponteiros p
26. do O Comando while O Comando do O Comando break O Comando continue O Comando goto Auto avalia o or line e MATRIZES E STRINGS Aula 5 e Vetores e Strings e gets e strcpy e strcat e strlen e stremp e Matrizes e Matrizes bidimensionais e Matrizes de strings e Matrizes multidimensionais e Inicializa o e Inicializa o sem especifica o de tamanho e PONTEIROS Aula 6 e Como Funcionam os Ponteiros e Declarando e Utilizando Ponteiros e Ponteiros e Vetores e Vetores como ponteiros e Ponteiros como vetores Strings Endere os de elementos de vetores e Vetores de ponteiros Inicializando Ponteiros Ponteiros para Ponteiros Cuidados a Serem Tomados ao se Usar Ponteiros e Auto avalia o or line e FUN ES Aula 7 e Fun o O Comando return Prot tipos de Fun es O Tipo void Arquivos Cabe alhos Escopo de Vari veis e Vari veis locais e Par metros formais e Vari veis globais P g 3 Chamada por Valor e Chamada por Refer ncia Matrizes como Argumentos de Fun es Os Argumentos argc e argv Recursividade Outras Quest es Auto avalia o or line e DIRETIVAS DE COMPILA O Aula 8 As Diretivas de Compila o A Diretiva include As Diretivas define e undef As Diretivas ifdef e endif A Diretiva ifndef A Diretiva 1f A Diretiva else A Diretiva elif e ENTRADAS E SA DAS PADRONIZADAS Aula 9 Introdu o Lendo e Escrevendo Caracteres e getche e getch e putchar
27. escrever nesta ordem Muitas vezes teremos o nosso programa espalhado por v rios arquivos Ou seja estaremos chamando fun es em um arquivo que ser o compiladas em outro arquivo Como manter a coer ncia A solu o s o os prot tipos de fun es Prot tipos s o nada mais nada menos que declara es de fun es Isto voc declara uma fun o que ir usar O compilador toma ent o conhecimento do formato daquela fun o antes de compil la O c digo correto ser ent o gerado Um prot tipo tem o seguinte formato tipo de retorno nome da fun o declara o de par metros onde o tipo de retorno o nome da fun o e a declara o de par metros s o os mesmos que voc pretende usar quando realmente escrever a fun o Repare que os prot tipos t m uma n tida semelhan a com as declara es de vari veis Vamos implementar agora um dos exemplos da se o anterior com algumas altera es e com prot tipos tinclude lt stdio h gt float Square float a main float num printi Entre com um n mero scanf f amp num num Square num printf n nO seu quadrado vale f n num float Square float a return a a Observe que a fun o Square est colocada depois de main mas o seu prot tipo est antes Sem isto este programa n o funcionaria corretamente Usando prot tipos voc pode construir fun es que retornam quaisquer tipos de vari veis bom ress
28. exemplo para incrementar o conte do da vari vel apontada pelo ponteiro p faz se p Outras opera es aritm ticas teis s o a soma e subtra o de inteiros com ponteiros Vamos supor que voc queira incrementar um ponteiro de 15 Basta fazer pps ou pr 155 E se voc quiser usar o conte do do ponteiro 15 posi es adiante p lo A subtra o funciona da mesma maneira Uma outra opera o s vezes til a compara o entre dois ponteiros Mas que informa o recebemos quando comparamos dois ponteiros Bem em primeiro lugar podemos saber se dois ponteiros s o iguais ou diferentes e No caso de opera es do tipo gt lt gt e lt estamos comparando qual ponteiro aponta para uma posi o mais alta na mem ria Ent o uma compara o entre ponteiros pode nos dizer qual dos dois est mais adiante na mem ria A compara o entre dois ponteiros se escreve como a compara o entre outras duas vari veis quaisquer Dl gt p2 H entretanto opera es que voc n o pode efetuar num ponteiro Voc n o pode dividir ou multiplicar ponteiros adicionar dois ponteiros adicionar ou subtrar floats ou double s de ponteiros P g 41 6 3 Ponteiros e Vetores Veremos nestas se es que ponteiros e vetores t m uma liga o muito forte 6 3 1 Vetores como ponteiros Vamos dar agora uma id ia de como o C trata vetores Quando voc declara uma matriz da seguinte forma tipo da vari vel n
29. fat chama a si mesma cada vez com um valor menor n 0 crit rio de parada para esta fun o H certos algoritmos que s o mais eficientes quando feitos de maneira recursiva mas a recursividade algo a ser evitado sempre que poss vel pois se usada incorretamente tende a consumir muita mem ria e ser lenta Lembre se que mem ria consumida cada vez que o computador faz uma chamada a uma fun o Com fun es recursivas a mem ria do computador pode se esgotar rapidamente 7 11 Outras Quest es Uma fun o como foi dito anteriormente um bloco de constru o muito til No C as fun es s o flex veis A flexibilidade d poder mas exige cuidado Fun es devem ser implementadas quando poss vel da maneira mais geral poss vel Isto as torna mais f ceis de serem reutilizadas e entendidas Evite sempre que poss vel fun es que usem vari veis globais Se houver uma rotina que deve ser o mais veloz poss vel seria bom implement la sem nenhuma ou com o m nimo de chamadas a fun es porque uma chamada a uma fun o consome tempo e mem ria Um outro ponto importante que como j sabemos um bocado a respeito de fun es quando formos ensinar uma das fun es das bibliotecas do C vamos mostrar em primeiro lugar o seu prot tipo Quem entendeu tudo que foi ensinado nesta parte sobre fun es pode retirar in meras informa es de um prot tipo tipo de retorno nome da fun o tipo dos argumentos
30. for i 0 te Bloco do for Eloat Tz P g 16 funci i A vari vel contador e uma vari vel global e acess vel de qualquer parte do programa As vari veis condi o e i s existem dentro de main isto s o vari veis locais de main A vari vel float f2 um exemplo de uma vari vel de bloco isto ela somente conhecida dentro do bloco do for pertencente fun o main A vari vel inteira j um exemplo de declara o na lista de par metros de uma fun o a fun o funcl As regras que regem onde uma vari vel v lida chamam se regras de escopo da vari vel H mais dois detalhes que devem ser ressaltados Duas vari veis globais n o podem ter o mesmo nome O mesmo vale para duas vari veis locais de uma mesma fun o J duas vari veis locais de fun es diferentes podem ter o mesmo nome sem perigo algum de conflito Podemos inicializar vari veis no momento de sua declara o Para fazer isto podemos usar a forma geral tipo_da_vari vel nome_da_vari vel constante Isto importante pois quando o C cria uma vari vel ele n o a inicializa Isto significa que at que um primeiro valor seja atribu do nova vari vel ela tem um valor indefinido e que n o pode ser utilizado para nada Nunca presuma que uma vari vel declarada vale zero ou qualquer outro valor Exemplos de inicializa o s o dados abaixo char ch D int count 0 froat pi ssI4I 3 4 Constantes Constantes s
31. int graus float radianos Hi void main union angulo ang char op printf inNumeros em graus ou radianos Scanio aconpIs 1f op GRAUS ang graus 180 printi Angulo Ga n angugr us else 1f op RAD ang radianos 3 1415 printf inAngulo fin ang radianos else printf nEntrada invalida n Temos que tomar o maior cuidado pois poder amos fazer include lt stdio h gt union numero char CH IAE do float F J P g 78 main void t union numero N N gr us 123 printi SM NsP G return 0 O programa acima muito perigoso pois voc est lendo uma regi o da mem ria que foi gravada como um inteiro como se fosse um ponto flutuante Tome cuidado O resultado pode n o fazer sentido 11 3 Enumera es Numa enumera o podemos dizer ao compilador quais os valores que uma determinada vari vel pode assumir Sua forma geral enum nome do tipo da enumera o lista_de_valores lista de vari veis Vamos considerar o seguinte exemplo enum dias da semana segunda terca quarta quinta sexta sabado domingo O programador diz ao compilador que qualquer vari vel do tipo dias da semana s pode ter os valores enumerados Isto quer dizer que poder amos fazer o seguinte programa rinclude lt stdio h gt enum dias da semana segunda terca quarta quinta sexta sabado domingo main void t enum dias da semana d1 d2 di segunda d2 sexta Lt
32. na linguagem C 6 Sendo num uma vari vel inteira o que imprime o trecho de c digo a seguir num 1 switch num t case 1 peint o n mero e 1 case 2 printi O numero e 2 sy default printf O numero e diferente de 1 e 2 E a O numeroe 1 E b O numero e 2 E c O numero e diferente de 1 e 2 E d O numero e 1 O numero e 2 Er e O numero e 1 O numero e 2 O numero e diferente de 1 e 2 7 Os dois blocos de c digo a seguir produzem o mesmo resultado fer reed Ss ad for 3J 0 7 J lt 37 JTF princi Ra An 159 e for i U gt JU 7 IKI rar for LETS o T princi Tit od an 19 E a Verdadeiro Er b Falso 8 Qual a sa da produzida pelo extrato de c digo a seguir P g 33 In Ko for 13 35 2 x2 gt 04 k s piinti d T p j E a 351131 E b 1131 E c 11310 E d 35113 E e Nenhuma das op es anteriores 9 Os extratos de c digo a seguir s o equivalentes entre si int x 10 while x gt 9 PEeLnti Ted XJ e int x 10 do pranc too x while x gt 9 E a Verdadeiro Er b Falso 10 Sendo 1 declarado e inicializado como int i O os seguintes extratos de c digo while i 5 printer sd Sd Ga Ane iy I2 PS 1 0 e it do 5 printf Ra dd bd mf 242 145 E a S o id nticos sob o ponto de vista do que imprimem na tela E b N o imprimem nada na tela E c T m sintaxe errada Er d Um
33. ncia de declara es 1 Helif express o constante 2 sequ ncia de declara es 2 Helif express o constante 3 sequ ncia de declara es 3 Helif express o constante n sequ ncia de declara es n Hendif O funcionamento desta estrutura id ntico ao funcionamento apresentado anteriormente Aula 9 P g 60 9 Entradas e sa das padronizadas 9 1 Introdu o As entradas e sa das padronizadas do C fornecem ao programador uma interface consistente Esta Interface se presta a entradas e sa das na tela texto e a entradas e sa das em arquivos J vimos algumas das fun es apresentadas aqui N o vamos entrar em detalhes nestas se es pois estas fun es podem ser encontradas no manual do seu compilador N o objetivo deste curso explicar em detalhes fun es A sintaxe completa das fun es do C podem ser encontradas no manual do seu compilador Alguns compiladores trazem um descri o das fun es na ajuda do compilador que pode ser acessada on line Um ponto importante que agora quando apresentarmos uma fun o vamos em primeiro lugar apresentar o seu prot tipo O leitor j deve ser capaz de interpretar as informa es que um prot tipo nos passa 9 2 Lendo e Escrevendo Caracteres Uma das fun es mais b sicas que um programador quer a entrada e sa da em dispositivos Estes podem ser um monitor uma impressora ou um arquivo em disco Vamos ver os principais comandos que a padroniza
34. nos preocupar em estar mexendo nos valores dos par metros que foram passados para a fun o Mas isto tamb m pode ser ruim s vezes porque podemos querer mudar os valores dos par metros fora da fun o tamb m O C tem um recurso que permite ao programador fazer chamadas por refer ncia H entretanto no C um recurso de programa o que podemos usar para simular uma chamada por refer ncia Quando queremos alterar as vari veis que s o passadas para uma fun o n s podemos declarar seus par metros formais como sendo ponteiros Os ponteiros s o a refer ncia que precisamos para poder alterar a vari vel fora da fun o O nico inconveniente que quando usarmos a fun o teremos de lembrar de colocar um amp na frente das vari veis que estivermos passando para a fun o Veja um exemplo tinclude lt stdio h gt void Swap int a int b void main void int num1l num2 numl 100 num2 200 Swap amp numl amp num2 printf n nEles agora valem d d n numi num2 void Swap int a int b int temp temp a as b b temp N o muito dif cil O que est acontecendo que passamos para a fun o Swap o endere o das vari veis numl e num2 Estes endere os s o copiados nos ponteiros a e b Atrav s do operador estamos acessando o conte do apontado pelos ponteiros e modificando o Mas quem este conte do Nada mass que os valores armazenados em num e num2
35. o e esta retorna o seu pr prio valor Isto quer dizer que teremos as seguintes equival ncias equivale a int num if num 0 if num 0 int num if num if num Isto quer dizer que podemos simplificar algumas express es simples P g 25 4 1 4 ifs aninhados O if aninhado simplesmente um if dentro da declara o de um outro ifexterno O nico cuidado que devemos ter o de saber exatamente a qual if um determinado else est ligado Vejamos um exemplo tinclude lt stdio h gt main int numi printf Digite um numero scanf Zd amp num if num 10 t printf ini nVoce acertou An printf O numero e igual a 10 n j else l if num gt 10 printf O numero e maior que 10 else printf O numero e menor que 10 4 1 5 O Operador Uma express o como if a gt 0 b 150 else b 150 pode ser simplificada usando se o operador da seguinte maneira b a gt 0 150 150 De uma mane ira geral express es do tipo if condi o express o 1 else express o 2 podem ser substitu das por condi o express o lI express o 2 O operador limitado n o atende a uma gama muito grande de casos mas pode ser usado para simplificar express es complicadas Uma aplica o interessante a do contador circular Veja o exemplo tinclude lt stdio h gt main int index 0 contador char letras 5 Joao for contador 0 contador lt
36. o realizadas Primeiro o arquivo aberto para a escrita e imprime se algo nele Em seguida o arquivo fechado e novamente aberto para a leitura Verifique o exemplo ftinclude lt stdio h tinclude lt stdlib h ftinclude lt string h void main FILE p char c str 30 frase 80 Este e um arquivo chamado int 1 Le um nome para o arquivo a ser aberto printf nin Entre com um nome para o arquivo n gets str if p fopen str w Caso ocorra algum erro na abertura do arquivo o programa aborta automaticamente printf Errol Impossivel abrir o arguivo n exit 1 Se nao houve erro imprime no arquivo fecha strcat frase str for 1 0 frasel lil i putc frase 1 p fclose p abre novamente para a leitura e fecha p fopen str r while feof p O GetOP PEEING aC fclose p l 9 7 Outros Comandos de Acesso a Arquivos 9 7 1 ferror Prot tipo int terror FILE Lp A fun o ferror se torna muito til quando queremos verificar se cada acesso a um arquivo teve sucesso Cada vez que uma fun o de arquivo executada a pr pria fun o registra numa vari vel especial se houve sucesso na P g 65 opera o ou n o Com ferror podemos ter acesso ao conte do desta vari vel ela retorna n o zero se houve algum erro na ltima fun o de acesso ao arquivo 9 7 2 rewind A fun o rewind
37. partes A linha finclude lt stdio h gt diz ao compilador que ele deve incluir o arquivo cabe alho stdio h Neste arquivo existem defini es de fun es teis para entrada e sa da de dados std standard padr o em ingl s 10 Input Output entrada e sa da gt stdio Entrada e sa da padronizadas Toda vez que voc quiser usar uma destas fun es deve se incluir este comando O C possui diversos arquivos cabe alhos Quando fazemos um programa uma boa id ia usar coment rios que ajudem a elucidar o funcionamento do mesmo No caso acima temos um coment rio Um Primeiro Programa O compilador C desconsidera qualquer coisa que esteja come ando com e terminando com Um coment rio pode inclusive ter mais de uma linha A linha main define uma fun o de nome main Todos os programas em C t m que ter uma fun o main pois esta fun o que ser chamada quando o programa for executado O conte do da fun o delimitado por chaves O c digo que estiver dentro das chaves ser executado sequencialmente quando a fun o for chamada A nica coisa que o programa realmente faz chamar a fun o printf passando a string uma string uma seq ncia de caracteres como veremos brevemente Ola Eu estou vivon como argumento por causa da fun o printf que devemos incluir o arquivo cabe alho stdio h A fun o printf neste caso ir apenas colocar a string na tela do computador O
38. quais voc quer garantir que o valor digitado pelo usu rio seja v lido Um caso est exemplificado abaixo include lt stdio h gt main char Ch do printt ininEscolha tm Anya s printi PVE Mamao ln printf T E 2 Abacaxi n printi A 3 sLaranja aan fflush NULL scanf c amp Ch while Ch 1 amp amp Ch 2 amp amp Ch 3 switch Ch case 11 printf t tVoce escolheu Mamao n break cage 2 i printf t tVoce escolheu Abacaxi in break case 3 printf A tA tVoce escolheu Laranja n break 4 6 O Comando break N s j vimos dois usos para o comando break interrompendo os comandos switch e for Na verdade estes s o os dois usos do comando break ele pode quebrar a execu o de um comando como no caso do switch ou interromper a execu o de qualquer loop como no caso do for do while ou do do while O break faz com que a execu o do programa continue na primeira linha seguinte ao loop ou bloco que est sendo interrompido 4 7 O Comando continue O comando continue pode ser visto como sendo o oposto do break Ele s funciona dentro de um loop Quando o comando continue encontrado o loop pula para a pr xima itera o sem o abandono do loop ao contr rio do que acontecia no comando break O programa abaixo exemplifica o uso do continue tinclude lt stdio h gt main ine opcao while opcao 5
39. que aponta para o in cio da mem ria alocada Mas voc pode se perguntar como que o programa vai saber quantos bytes devem ser liberados Ele sabe pois quando voc alocou a mem ria ele guardou o n mero de bytes alocados numa tabela de aloca o interna Vamos reescrever o exemplo usado para a fun o malloc usando o free tamb m agora tinclude lt stdio h gt tinclude lt alloc h gt main void Int So int a p 1nt malloo a sizeol 1nt Te ip printf Erro Memoria Insuficiente exit free p return 0 10 7 Aloca o Din mica de Vetores e Matrizes 10 7 1 Aloca o Din mica de Vetores A aloca o din mica de vetores utiliza os conceitos aprendidos na aula sobre ponteiros e as fun es de aloca o din mica apresentados Um exemplo de implementa o para vetor real fornecido a seguir P g 73 tincl de lt stdio h gt include lt stadlib h gt float Alocar vetor real int n Eloa yi ponteiro para vetor if n lt 1 verifica parametros recebidos printf Erro Parametro invalido n J return NULL aloca o vetor vw gt roat gallos ml Bazeor loacv i y NUBL printf Erro Memoria Insuliciente return NULL return v retorna o ponteiro para o vetor float Liberar_vetor_real int n float v if v NULL return NULL if n lt 1 verifica parametros receb
40. uma string gets str size strlen str printf ininA string que voce digitou tem tamanho Sd size P g 37 5 2 5 stremp Sua forma geral stremp stringl string2 A fun o stremp compara a string 1 com a string 2 Se as duas forem id nticas a fun o retorna zero Se elas forem diferentes a fun o retorna n o zero Um exemplo da sua utiliza o tinclude lt stdio h gt tinclude lt string h gt main char str1 100 str2 100 pranti Entre com uma string Jj gets strl printf fninEntr com outra string Tj gets str2 if strcmp strl str2 printf ininAs duas strings s o diferentes else printf AninAs duas strings s o iguais 5 3 Matrizes 5 3 1 Matrizes bidimensionais J vimos como declarar matrizes unidimensionais vetores Vamos tratar agora de matrizes bidimensionais A forma geral da declara o de uma matriz bidimensional muito parecida com a declara o de um vetor tipo_da_vari vel nome_da_vari vel altura largura muito importante ressaltar que nesta estrutura o ndice da esquerda indexa as linhas e o da direita indexa as colunas Quando vamos preencher ou ler uma matriz no C o ndice mais direita varia mais rapidamente que o ndice esquerda Mais uma vez bom lembrar que na linguagem C os ndices variam de zero ao valor declarado menos um mas o C n o vai verificar isto para o usu rio Manter os ndices na faixa
41. vari vel Ent o em X 253 VERET teremos no final y 23 e x 24 Em X 25 V X teremos no final y 24 e x 24 Uma curiosidade a linguagem de programa o C tem este nome pois ela seria um incremento da linguagem C padr o A linguagem C igual a linguagem C s que com extens es que permitem a programa o orientada a objeto o que um recurso extra O operador de atribui o do C o O que ele faz pegar o valor direita e atribuir vari vel da esquerda Al m disto ele retorna o valor que ele atribuiu Isto faz com que as seguintes express es sejam v lidas x y z 1 5 Expressao 1 CE REV pas Expressao 2 A express o 1 v lida pois quando fazemos z 1 5 ela retorna 1 5 que passado adiante A express o dois ser verdadeira se w for diferente de zero pois este ser o valor retornado por k w Pense bem antes de usar a express o dois pois ela pode gerar erros de interpreta o Voc n o est comparando k e w Voc est atribuindo o valor de w a k e usando este valor para tomar a decis o 3 6 Operadores Relacionais e L gicos Os operadores relacionais do C realizam compara es entre vari veis S o eles Menor ou igual a Igual a Os operadores relacionais retornam verdadeiro 1 ou falso 0 Para fazer opera es com valores l gicos verdadeiro e falso temos os operadores l gicos Usando os operadores relacionais e l gicos podemos realizar uma grande gam
42. vel que se passa como argumento ou seja a vari vel num ao ser passada como argumento para square copiada para a vari vel x Dentro de square trabalha se apenas com x Se mudarmos o valor de x dentro de square o valor de num na fun o main permanece inalterado Vamos dar um exemplo de fun o de mais de uma vari vel Repare que neste caso os argumentos s o separados por v rgula e que deve se explicitar o tipo de cada um dos argumentos um a um Note tamb m que os argumentos passados para a fun o n o necessitam ser todos vari veis porque mesmo sendo constantes ser o copiados para a vari vel de entrada da fun o ftinclude lt stdio h gt mult float a float b float c P g 8 p IACE lt 1 ra De main float X y x 23 5 yv 12 9 male zyr 2 3 2 Retornando valores Muitas vezes necess rio fazer com que uma fun o retorne um valor As fun es que vimos at aqui retornam um valor inteiro pois na linguagem C a n o ser que seja especificado as fun es retornam um inteiro Mas para dizer ao C o que vamos retornar precisamos da palavra reservada return Sabendo disto fica f cil fazer uma fun o para multiplicar dois inteiros Veja finclude lt stdio h gt prod int x int y return x y main t int saida saida prod 12 7 printf A saida e din saida Veremos mais adiante como proceder a fim de que uma fun o retorne outros v
43. 0 printf n nVoce acertou An primer O numero igual a 10 if n m lt 10 printf MninO n mero e menor que 10 No programa acima a express o num gt 10 avaliada e retorna um valor diferente de zero se verdadeira e zero se falsa Repare que quando queremos testar igualdades usamos o operador e n o Isto porque o operador representa apenas uma atribui o Isto pode parecer estranho primeira vista mas se escrev ssemos 1 f num 10 css Isto esta errado o compilador iria atribuir o valor 10 vari vel num e a express o num 10 iria retornar 10 fazendo com que o nosso valor de num fosse adulterado e fazendo com que a declara o fosse executada sempre Este problema gera erros frequentes entre iniciantes e portanto muita aten o deve ser tomada Os operadores de compara o s o gt lt gt lt 2 5 2 for O loop la o for usado para repetir um comando ou bloco de comandos diversas vezes de maneira que se possa ter um bom controle sobre o loop Sua forma geral for inicializa o condi o incremento declara o A declara o no comando for tamb m pode ser um bloco e neste caso o omitido O melhor modo de se entender o loop for ver de que maneira ele funciona por dentro O loop for equivalente a se fazer o seguinte inicializa o if condi o P g 12 declara o incremento Volte para o comando if j
44. 1000 contador printf nsc Letras ind x index index 4 index 0 index O nome Joao escrito na tela verticalmente at a vari vel contador determinar o t rmino do programa Enquanto isto a vari vel index assume os valores 0 1 2 3 4 0 1 progressivamente P g 26 4 2 O Comando switch O comando if else e o comando switch s o os dois comandos de tomada de decis o Sem d vida alguma o mais importante dos dois o if mas o comando switch tem aplica es valiosas Mais uma vez vale lembrar que devemos usar o comando certo no local certo Isto assegura um c digo limpo e de f cil entendimento O comando switch pr prio para se testar uma vari vel em rela o a diversos valores pr estabelecidos Sua forma geral switch vari vel case constante l declara o 1 break case constante 2 declara o 2 break case constante n decalra o n break default declara o default Podemos fazer uma analogia entre o switch e a estrutura if else if apresentada anteriormente A diferen a fundamental que a estrutura switch n o aceita express es Aceita apenas constantes O switch testa a vari vel e executa a declara o cujo case corresponda ao valor atual da vari vel A declara o default opcional e ser executada apenas se a vari vel que est sendo testada n o for igual a nenhuma das constantes O comando break faz com que o switch seja interrompido assi
45. 11 z 11 E b x 11 y 11 z 10 E c x 10 y 11 z 10 po d x 10 y 10 z 10 E e Nenhuma das op es anteriores 9 Diga o resultado das vari veis x y e z depois da seguinte sequ ncia de opera es int v int a 14 b 3 float z x a b y asb zZz y X ET a x 4 66666 y 2 z 0 4286 E b Xx 5 y 2 7 04 E c X 3 7 2 4 0 E d x 4 y 2 72 05 E e x 4 y 2 72 0 E f Nenhuma das op es anteriores 10 A opera o l gica 5 0 s amp 3 gt 2 amp amp 1 0 3 lt 0 ET a Verdadeira E b Falsa Er c Inv lida pois sua sintaxe est errada E d Nem Verdadeira nem Falsa ET e Nenhuma das op es anteriores 11 Quais os valores de a b e c ap s a execu o do c digo abaixo int a 10 b 20 c att t b a a 11 b 20 c 30 b a 10 b 21 31 Cc a 11 b 20 c 31 d a 10 b 21 c 30 A A EI A e Nenhuma das op es anteriores 12 Qual o valor das vari veis v x y e z ap s a execu o do seguinte trecho de c digo Int a T a A v RTV P g 23 X ea yaar t I 2 6 vy y y y x y 2 E a v 11 x 8 y 6 2 3 E b v 0 x 1 y 2 2 3 ET c v 10 x 7 y 6 2 3 E d v 13 x 10 y 6 z Er e Nenhuma das op es anteriores Resposta dos testes Aula 3 l a 2 b 3 d 4 c 5b 6 d 7 b 8 b 9 e 10 a 1l a 12 d Aula 4 4 Estruturas de controle de fluxo 4 1 O Comando if J introduzimos o comando if Sua forma geral if condi o dec
46. 3 E E E E E a b C d e S o valores inteiros passados para a fun o Servem para armazenar os endere os da fun o e das fun es que chamaram S o os endere os das vari veis da fun o que chamou Nestes endere os iremos armazenar os valores a serem modificados pela fun o Armazenam os endere os das fun es de biblioteca usados na fun o Nenhuma das op es anteriores 10 O que imprime o programa a seguir include lt stdio h gt func int a int b int temp temp xa b D temp a void main int a 10 b 20 func amp a GJ printf a d b d a b amaaan a b a p a 10 b 20 a 20 b 10 a 10 b 10 a 20 b 20 Nenhuma das op es anteriores Resposta dos testes Aulas 5 e 6 l c 2 b 3d 4 b 5 a 6 e 7 b 8 C 9 c 10 d Aula 8 P g 57 8 Diretivas de compila o 8 1 As Diretivas de Compila o Diretivas de compila o s o comandos que n o s o compilados Eles s o dirigidos ao compilador J vimos e usamos muito a diretiva Finclude Sabemos que ela n o gera c digo mas diz ao compilador que ele deve incluir um arquivo externo na hora da compila o As diretivas do C s o identificadas por come arem por As diretivas que estudaremos s o definidas pelo padr o ANSI if ifdef ifndef else eli endif include define undef Procuraremos ser breves em suas descri
47. An uma constante chamada de constante barra invertida O n de new line e ele interpretado como um comando de mudan a de linha isto ap s imprimir Ola Eu estou vivo o cursor passar para a pr xima linha importante observar tamb m que os comandos do C terminam com Alguns compiladores C podem dar uma mensagem de aviso warning ao compilar os programas iniciais apresentados aqui Isto porque por default toda fun o em C inclusive a main retorna um inteiro Quando n o fornecemos este inteiro de retorno o compilador pode mandar uma mensagem do tipo Function should return a value Por enquanto voc ter que aceitar estas mensagens Mais tarde ensinaremos como devemos fazer para que o programa fique correto Podemos agora tentar um programa mais complicado tanel ude lt stdio h gt main iG Dias Declaracao de Variaveis float Anos printf Entre com o n mero de dias Entrada de Dados scanf d amp Dias Anos Dias 365 25s Conversao Dias gt Anos printf in ingd dias equivalem a f anos m Dias Anos Vamos entender como o programa acima funciona S o declaradas duas vari veis chamadas Dias e Anos A primeira um int inteiro e a segunda um float ponto flutuante E feita ent o uma chamada fun o printf que coloca uma mensagem na tela Queremos agora ler um dado que ser fornecido pelo usu rio e coloc lo na vari vel Dias Para
48. Curso de Linguagem ry Universidade Federal de Minas Gerais Apostila Curso de Linguagem C UFMG Curso dirigido pelo Pr Renato Cardoso Mesquita Outubro de 1998 P g 1 Curso de Linguagem C CPDEE UFMG Sum rio e INTRODU O Aulal e PRIMEIROS PASSOS Aula 2 e OC Case Sensitive e Dois Primeiros Programas e Introdu o s Fun es e Argumentos e Retornando valores e Forma geral e Introdu o B sica s Entradas e Sa das e Caracteres e Strings e printf e scanf e Introdu o a Alguns Comandos de Controle de Fluxo e if e for e Coment rios Palavras Reservadas do C e Auto avalia o Aulas 1 e2 o VARI VEIS CONSTANTES OPERADORES E EXPRESS ES Aula 3 e Nomes de Vari veis e Os Tipos do C e Declara o e Inicializa o de Vari veis e Constantes e Constantes dos tipos b sicos Constantes hexadecimais e octais J e Constantes strings e Constantes de barra invertida e Operadores Aritm ticos e de Atribui o e Operadores Relacionais e L gicos Express es e Convers o de tipos em express es e Express es que Podem ser Abreviadas e Encadeando express es o Operador e Tabela de Preced ncias do C e Modeladores Casts e Auto avalia o or line e ESTRUTURAS DE CONTROLE DE FLUXO Aula 4 e O Comando 1f O else O 1felse i1f express o condicional ifs aninhados P g 2 e O Operador e O Comando switch e O Comando for e O loop infinito e O loop sem conte
49. Hifndef funciona ao contr rio da diretiva ifdef Sua forma geral Hijndef nome da macro sequ ncia de declara es Hendif A sequ ncia de declara es ser compilada se o nome da macro n o tiver sido definido 8 6 A Diretiva if A diretiva Hif tem a seguinte forma geral if express o constante sequ ncia de declara es P g 59 Hendif A sequ ncia de declara es ser compilada se a express o constante for verdadeira E muito importande ressaltar que a express o fornecida deve ser constante ou seja n o deve ter nenhuma vari vel 8 7 A Diretiva else A diretiva felse tem a seguinte forma geral Hif express o constante sequ ncia de declara es else sequ ncia de declara es Hendif Ela funciona como seu correspondente o comando else Imagine que voc esteja trabalhando em um sistema e deseje que todo o c digo possa ser compilado em duas diferentes plataformas 1 e Unix e Dos Para obter isto voc encapsula toda a parte de entrada e sa da em arquivos separados que ser o carregados de acordo com o header file carregado Isto pode ser facilmente implementado da seguinte forma define SISTEMA DOS linhas de codigo 1i SISTEMA DOS ftdefine CABECALHO dos io h else define CABECALHO unx io h endif include CABECALHO 8 8 A Diretiva elif A diretiva elif serve para implementar a estrutura if else if Sua forma geral if express o constante 1 sequ
50. a d c 0 saida onde saida seria o arquivo execut vel gerado Para gerar o execut vel deste programa no Rhide voc deve criar um projeto com a op o Project gt Open Digitar um nome para o seu projeto por exemplo saida Ao apertar OK o Rhide criar uma janela de projeto onde voc dever adicionar os arquivos que ser o usados para compor o seu execut vel Para isto voc deve apertar a tecla lt Insert gt e em seguida escolher os arquivos princip c e funcao c Da s mandar compilar o projeto com a op o Compile gt Make Se n o der erro pode executar 7 6 Escopo de Vari veis J foi dada uma introdu o ao escopo de vari veis O escopo o conjunto de regras que determinam o uso e a validade de vari veis nas diversas partes do programa 7 6 1 Vari veis locais O primeiro tipo de vari veis que veremos s o as vari veis locais Estas s o aquelas que s t m validade dentro do bloco no qual s o declaradas Sim Podemos declarar vari veis dentro de qualquer bloco S para lembrar um bloco come a quando abrimos uma chave e termina quando fechamos a chave At agora s t nhamos visto vari veis locais para fun es completas Mas um comando for pode ter vari veis locais e que n o ser o conhecidas fora dali A declara o de vari veis locais a primeira coisa que devemos colocar num bloco A caracter stica que torna as vari veis locais t o importantes justamente a de serem exclusivas do
51. a de testes A tabela verdade destes operadores dada a seguir verdadeiro P g 19 Operadores L gicos Bit a Bit O C permite que se fa a opera es l gicas bit a bit em n meros Ou seja neste caso o n mero representado por sua forma bin ria e as opera es s o feitas em cada bit dele Imagine um n mero inteiro de 16 bits a vari vel 1 armazenando o valor 2 A representa o bin ria de 1 ser 0000000000000010 quinze zeros e um nico 1 na segunda posi o da direita para a esquerda Poderemos fazer opera es em cada um dos bits deste n mero Por exemplo se fizermos a nega o do n mero opera o bin ria NOT ou operador bin rio em C isto 1 o n mero se transformar em 1111111111111101 As opera es bin rias ajudam programadores que queram trabalhar com o computador em baixo n vel As opera es l gicas s podem ser usadas nos tipos char int e long int Os operadores s o XOR OR exclusivo NOT P gt Des ocamento de bits a direita de bits a esquerda Os operadores T e s o as opera es l gicas bit a bit A forma geral dos operadores de deslocamento valor gt gt n mero de deslocamentos valor lt lt n mero de deslocamentos O n mero de deslocamentos indica o quanto cada bit ir ser deslocado Por exemplo para a vari vel 1 anterior armazenando o n mero 2 1 lt lt 3 far com que 1 agora tenha a representa o bin ria 0000000000010000 isto
52. a fun o declarada pelo programador ou pelas bibliotecas do C Vari veis de at 32 caracteres s o aceitas Mais uma coisa bom sempre lembrar que o C case sensitive e portanto deve se prestar aten o s mai sculas e min sculas 3 1 2 Quanto aos nomes de vari veis e uma pr tica tradicional do C usar letras min sculas para nomes de vari veis e mai sculas para nomes de constantes Isto facilita na hora da leitura do c digo e Quando se escreve c digo usando nomes de vari veis em portugu s evita se poss veis conflitos com nomes de rotinas encontrados nas diversas bibliotecas que s o em sua maioria absoluta palavras em ingl s 3 2 Os Tipos do C O C tem 5 tipos b sicos char int float double void Destes n o vimos ainda os dois ltimos O double o ponto flutuante duplo e pode ser visto como um ponto flutuante com muito mais precis o O void vazio em ingl s um tipo especial e deixaremos o seu estudo para mais adiante Para cada um dos tipos de vari veis existem os modificadores de tipo Os modificadores de tipo do C s o quatro signed unsigned long e short Ao float n o se pode aplicar nenhum e ao double pode se aplicar apenas o long Os quatro podem ser aplicados a inteiros A inten o que short e long devam prover tamanhos diferentes de inteiros onde isto for pr tico int normalmente ter o tamanho natural para uma determinada m quina Assim numa m quina de 16 bits int provavelme
53. a isto basta voc lembrar se que o ndice sempre come a em zero Assim a primeira letra da string sempre estar na posi o O A segunda letra sempre estar na posi o 1 e assim sucessivamente Segue um exemplo que imprimir a segunda letra da string Joao apresentada acima Em seguida ele mudar esta letra e apresentar a string no final include lt stdio h gt main char str 10 Joao printf nA n tring s SET printf nSegunda letra co ser li str 1 VU printf inAgora a segunda letra eh c str 1 princi CanScrino resultante 8 str Nesta string o terminador nulo est na posi o 4 Das posi es O a 4 sabemos que temos caracteres v lidos e portanto podemos escrev los Note a forma como inicializamos a string str com os caracteres J o a o e NO simplesmente declarando char str 10 Joao Veremos posteriormente que Joao uma cadeia de caracteres entre aspas o que chamamos de string constante isto uma cadeia de caracteres que est pr carregada com valores que n o podem ser modificados J a string str uma string vari vel pois podemos modificar o que nela est armazenado como de fato fizemos No programa acima s indica que printf deve colocar uma string na tela Vamos agora fazer uma abordagem inicial s duas fun es que j temos usado para fazer a entrada e sa da 2 4 3 printf A fun o printf tem a seguinte forma geral p
54. a se colocar a n meros inteiros O operador sizeof retorna o n mero de bytes de um inteiro Ele util para se saber o tamanho de tipos O ponteiro void que malloc retorna convertido para um int pelo cast e atribu do a p A declara o seguinte testa se a opera o foi bem sucedida Se n o tiver sido p ter um valor nulo o que far com que p retorne verdadeiro Se a opera o tiver sido bem sucedida podemos usar o vetor de inteiros alocados normalmente por exemplo indexando o de p 0 a p a 1 10 6 2 calloc A fun o calloc tamb m serve para alocar mem ria mas possui um prot tipo um pouco diferente void calloc unsigned int num unsigned int size A fun ao aloca uma quantidade de mem ria igual a num size isto aloca mem ria suficiente para uma matriz de num objetos de tamanho size Retorna um ponteiro void para o primeiro byte alocado O ponteiro void pode ser atribu do a qualquer tipo de ponteiro Se n o houver mem ria suficiente para alocar a mem ria requisitada a fun o calloc retorna um ponteiro nulo Veja um exemplo de aloca o din mica com calloc tinclude lt stdio h gt include lt stdlib h gt main void ine Sos LiG a P g 72 p int calloc ia sizeol ant if lp printf Erro Memoria Insuficiente exit return 0 No exemplo acima alocada mem ria suficiente para se colocar a n meros inteiros O operador sizeof retorna o n me
55. alia o on line aula 3 Responda as perguntas abaixo escolhendo a alternativa adequada para cada quest o Voc pode atingir at a nota 100 Sendo que cada quest o certa vale 8 3 pontos l Escolha a op o que inclui somente nomes v lidos para vari veis na linguagem C a H a b 2 H789 ves b 1 J Int obs c 9xy a36 xX y j d 2 ou 1 fim h J AAMA e Nenhuma das op es anteriores 2 Qual das instru es abaixo est errada a inti E Er b long float x Er c long double y E d long ijk E e short int a Er f unsigned b 3 Em um compilador para um hardware de 16 bits uma vari vel double ocupa o mesmo espa o que vari veis do tipo char Er a Uma b Duas Cc Quatro E E d Oito Er e Dezesseis 4 Qual o trecho de programa que inicializa a vari vel z a float z z1 10 E Er b float z z 10 E Cc float z 10 Er d z 10 5 O trecho de programa a seguir main char condicao conqicao D int 1 E a V lido na linguagem C Er b N o v lido na linguagem C 6 0101 uma constante na linguagem C Er a Bin ria Er b Hexadecimal E c Inteira Er d Octal P g 22 E e Ponto Flutuante 7 Em C t e t representam a mesma constante Er a Verdadeiro E b Falso 8 Diga o resultado das vari veis x y e z depois da seguinte sequ ncia de opera es LHE XyVpZ x y 10 Z F Fx X X ytt a E a x 11 y
56. alores que n o sejam inteiros Quando aprendermos isto poderemos eliminar a mensagem de warning mencionada na se o anterior Note que se voc estava recebendo mensagens de warning para as fun es anteriores voc n o recebeu para a fun o prod do programa anterior Isto porque a fun o prod faz o que o compilador estava esperando retorna um valor finclude lt stdio h gt float prod float x Lloat y return x y main l float saida saida prod 45 2 0 0067 printf A saida e f n saida 2 3 3 Forma geral Apresentamos aqui a forma geral de uma fun o tipo_de_retorno nome_da_fun o lista_de_argumentos c digo da fun o 2 4 Introdu o B sica s Entradas e Sa das 2 4 1 Caracteres Os caracteres s o um tipo de dado o char O C trata os caracteres como sendo vari veis de um byte 8 bits J os inteiros ints t m tem um n mero maior de bytes Dependendo da implementa o do compilador eles podem ter 2 bytes 16 bits ou 4 bytes 32 bits Isto ser melhor explicado na aula 3 Assim sendo podemos usar um char para P g 9 armazenar tanto valores num ricos inteiros de O a 255 quanto um caractere de texto Para indicar um caractere de texto usamos ap strofes Veja um exemplo de programa que usa caracteres tinclude lt stdio h gt main char Ch Ch D princi 4 e Ch No programa acima c indica que printf deve colocar um
57. altar que fun es podem tamb m retornar ponteiros sem qualquer problema Eles n o s ajudam o compilador Eles ajudam a voc tamb m Usando prot tipos o compilador evita erros n o deixando que o programador use fun es com os par metros errados e com o tipo de retorno errado o que uma grande ajuda 7 4 O Tipo void Agora vamos ver o nico tipo da linguagem C que n o vimos ainda o void Em ingl s void quer dizer vazio e isto mesmo que o void Ele nos permite fazer fun es que n o retornam nada e fun es que n o t m par metros Podemos agora escrever o prot tipo de uma fun o que n o retorna nada void nome da fun o declara o de par metros Numa fun o como a acima n o temos valor de retorno na declara o return Ali s neste caso o comando return n o necess rio na fun o Podemos tamb m fazer fun es que n o t m par metros tipo de retorno nome da fun o void ou ainda que n o tem par metros e n o retornam nada void nome da fun o void Um exemplo de fun es que usam o tipo void tinclude lt stdio h gt void Mensagem void main I Mensagem printti TAtDiga de novo n P g 49 Mensagem void Mensagem void printf Ola Eu estou vivo in i Usando nossos conhecimentos de fun es podemos agora eliminar de vez aquela irritante mensagem de aviso que o compilador tem nos dado muitas vezes desde o in cio do no
58. amos duas vari veis globais um inteiro count e um float sum Estas vari veis s o declaradas normalmente em um dos m dulos do programa Por exemplo int count float sum main void return O Num outro m dulo do programa temos uma rotina que deve usar as vari veis globais acima Digamos que a rotina que queremos se chama RetornaCount e retorna o valor atual de count O problema que este m dulo ser compilado em separado e n o tomar conhecimento dos outros m dulos O que fazer Ser que funcionaria se fizermos assim Lat Count errado float sum int RetornaClount void return count N o O m dulo compilaria sem problema mas na hora que fizermos a linkagem uni o dos m dulos j compilados para gerar o execut vel vamos nos deparar com uma mensagem de erro dizendo que as vari veis globais count e sum foram declaradas mais de uma vez A maneira correta de se escrever o m dulo com a fun o RetornaCount extern int count TE Gerto wy extern float sum int RetornaCount void return count Assim o compilador ir saber que count e sum est o sendo usados no bloco mas que foram declarados em outro 10 2 3 static O funcionamento das vari veis declaradas como static depende se estas s o globais ou locais Vari veis globais static funcionam como vari veis globais dentro de um m dulo ou seja s o vari veis globais que n o s o e nem podem ser conhecidas em o
59. ara uma estrutura funcionam como os ponteiros para qualquer outro tipo de dados no C H entretanto um detalhe a ser considerado Se apontarmos o ponteiro p declarado acima para uma estrutura qualquer e quisermos acessar um elemento da estrutura poder amos fazer p nome Este formato raramente usado O que comum de se fazer acessar o elemento nome atrav s do operador seta gt Assim faremos p gt nome A declara o acima muito mais f cil e concisa Para acessarmos o elemento CEP dentro de endereco far amos P g 77 p gt endereco CEP F cil n o 11 2 Declara o Union Uma declara o union determina uma nica localiza o de mem ria onde podem estar armazenadas v rias vari veis diferentes A declara o de uma uni o semelhante declara o de uma estrutura union nome do tipo da union tipo I nome_l tipo 2 nome 2 tipo n nome n vari veis union Como exemplo vamos considerar a seguinte uni o union angulo float graus float radianos J Nela temos duas vari veis graus e radianos que apesar de terem nomes diferentes ocupam o mesmo local da mem ria Isto quer dizer que s gastamos o espa o equivalente a um nico float Uni es podem ser feitas tamb m com vari veis de diferentes tipos Neste caso a mem ria alocada corresponde ao tamanho da maior vari vel no union Veja o exemplo include lt stdio h gt define GRAUS G define RAD R union angulo
60. as com perda de precis o para um compilador com palavra de 16 bits OI fara OOOO informa o Perdida OOOO ET 2 SE 8 bits de mais alta ordem char Os 8 bits de mais alta ordem o int char Os 24 bits de mais alta ordem ci E long int short int Os 16 bits de mais alta ordem gm a Float fm Precis o resuliado arredondado Doe float Precis o resultado arredondado ong double double Precis o resultado arredondado 10 4 Modificadores de Fun es A forma geral de uma fun o como j foi visto tipo_de_retorno nome_da_fun o declara o_de_par metros corpo da fun o j Uma fun o pode aceitar um modificador de tipo Este vai modificar o modo como a fun o opera na passagem de par metros A forma geral da fun o ficaria ent o modificador_de_tipo tipo_de_retorno nome_da_fun o declara o_de_par metros corpo da fun o j O nosso curso n o aborda detalhes do funcionamento interno de fun es Para saber mais consulte o manual do seu compilador ou algum livro especializado 10 4 1 pascal Faz com que a fun o use a conven o de fun es da linguagem de programa o Pascal Isto faz com que as fun es sejam compat veis com programas em Pascal 10 4 2 cdecl O modificador de tipo cdecl faz com que a fun o use a conven o para fun es do C Raramente usado pois o default Pode se pensar no cdecl como sendo o inverso do pascal 10 4 3 interrupt
61. ase 3 printf in gt Terceira optan j4 break case 4 printf n gt Quarta opca break case 5 printt n gt Abandonando s break 4 9 Auto avalia o on line aula 4 Responda as perguntas abaixo escolhendo a alternativa adequada para cada quest o Voc pode atingir at a nota 100 Sendo que cada quest o certa vale 8 3 pontos l if num equivalente a if num 0 E a Verdadeiro Er b Falso 2 Qual o valor de x ap s a seguinte sequ ncia de comandos a 10 b 20 x O x b gt a b a E a E b E e 10 ET d 20 Er e 40 ET f Nenhuma das op es anteriores 3 Qual o valor de x ap s a sequ ncia de comandos a 1 b 2 Cc 3 x 0 x a lt b a lt c a c b lt c b e DICA antes de tentar resolver coloque par nteses na express o acima indicando a ordem de preced ncia dos operadores E a 0 Er b 1 Er c 2 P g 32 E d 3 E e Nenhuma das op es anteriores 4 Os trechos de programa a seguir s o equivalentes entre si sob o ponto de vista do que Impresso tor Ls 0 4 L lt 10 2 Printi od 2 e for 120444 40244 Printi Ted n ij E a Verdadeiro E b Falso 5 O trecho de programa a seguir switch num l case 1 printf O numero e 1 break case 2 printf O numero e 2 break default printf O numero e diferente de 1 e 2 break E a V lido na linguagem C Er b N o v lido
62. bloco Podemos ter quantos blocos quisermos com uma vari vel local chamada x por exemplo e elas n o apresentar o conflito entre elas A palavra reservada do C auto serve para dizer que uma vari vel local Mas n o precisaremos us la pois as vari veis declaradas dentro de um bloco j s o consideradas locais Abaixo vemos um exemplo de vari veis locais tungl s int abc x FUNG ass int abc main int a x y for float a b c No programa acima temos tr s fun es As vari veis locais de cada uma delas n o ir o interferir com as vari veis locais de outras fun es Assim a vari vel abc de func1 n o tem nada a ver e pode ser tratada independentemente com a vari vel abc de func2 A vari vel x de funcl tamb m completamente independente da vari vel x de main As vari veis a b e c s o locais ao bloco for Isto quer dizer que s s o conhecidas dentro deste bloco for e P g 51 s o desconhecidas no resto da fun o main Quando usarmos a vari vel a dentro do bloco for estaremos usando a vari vel a local ao for e n o a vari vel a da fun o main 7 6 2 Par metros formais O segundo tipo de vari vel que veremos s o os par metros formais Estes s o declarados como sendo as entradas de uma fun o N o h motivo para se preocupar com o escopo deles f cil o par metro formal como se fosse uma vari vel local da fun o Voc pod
63. c digos chamados c digos de barra invertida Estes s o caracteres que podem ser usados como qualquer outro A lista completa dos c digos de barra invertida dada a seguir C digo Significado b Retrocesso back f Alimenta o de formul rio form feed n Nova linha new line r Retorno de carro carriage return t Tabula o horizontal tab Aspas Ap strofo 0 Nulo 0 em decimal Barra invertida v Tabula o vertical a Sinal sonoro beep N Constante octal N o valor da constante xN Constante hexadecimal N o valor da constante 3 5 Operadores Aritm ticos e de Atribui o Os operadores aritm ticos s o usados para desenvolver opera es matem ticas A seguir apresentamos a lista dos operadores aritm ticos do C Operador A o Soma inteira e ponto flutuante Subtra o ou Troca de sinal inteira e ponto flutuante Multiplica o inteira e ponto flutuante Divis o inteira e ponto flutuante P Resto de divis o de inteiros Incremento inteiro e ponto flutuante Decremento inteiro e ponto flutuante O C possui operadores un rios e bin rios Os un rios agem sobre uma vari vel apenas modificando ou n o o seu valor e retornam o valor final da vari vel Os bin rios usam duas vari veis e retornam um terceiro valor sem alterar as vari veis originais A soma um operador bin rio pois pega duas vari veis soma seus valores sem alterar a
64. comandos Sugerimos que o aluno realmente use o m ximo poss vel dos exemplos problemas e exerc cios aqui apresentados gerando os programas execut veis com o seu compilador Quando utilizamos o compilador aprendemos a lidar com mensagens de aviso mensagens de erro bugs etc Apenas ler os exemplos n o basta O conhecimento de uma linguagem de programa o transcede o conhecimento de estruturas e fun es O C exige al m do dom nio da linguagem em si uma familiaridade com o compilador e experi ncia em achar bugs nos programas importante ent o que o leitor digite compile e execute os exemplos apresentados Aula 2 2 Primeiros Passos 2 1 O C Case Sensitive Vamos come ar o nosso curso ressaltando um ponto de suma import ncia o C Case Sensitive isto mai sculas e min sculas fazem diferen a Se se declarar uma vari vel com o nome soma ela ser diferente de Soma SOMA SoMaou sOmA Da mesma maneira os comandos do C if e for por exemplo s podem ser escritos em min sculas pois sen o o compilador n o ir interpret los como sendo comandos mas sim como vari veis 2 2 Dois Primeiros Programas Vejamos um primeiro programa em C Franclude lt stdio h gt main Um Primeiro Programa printf olLal Eu estou VivorrniTiy P g 6 Compilando e executando este programa voc ver que ele coloca a mensagem Ola Eu estou vivo na tela 2 2 1 Vamos analisar o programa por
65. consiste no fundo de v rias fun es colocadas juntas Abaixo o tipo mais simples de fun o tinclude lt stdio h gt mensagem princi 4POla Jj main mensagem Printi TEU estou vivol n s Este programa ter o mesmo resultado que o primeiro exemplo da se o anterior O que ele faz definir uma fun o me nsagem que coloca uma string na tela Depois esta fun o chamada a partir de main que tamb m uma fun o 2 3 1 Argumentos Argumentos s o as entradas que a fun o recebe atrav s dos argumentos que passamos par metros para a fun o J vimos fun es com argumentos As fun es printf e scanf s o fun es que t m argumentos Vamos ver um outro exemplo simples de fun o com argumentos include lt stdio h gt square int x printf O quadrado e Sd X x j main int num printf Entre com um numero scanf Sd amp num print Mn square num Na defini o de square dizemos que a fun o receber um argumento inteiro x Quando fazemos a chamada fun o o inteiro num passado como argumento H alguns pontos a observar Em primeiro lugar temos de satisfazer aos requesitos da fun o quanto ao tipo e quantidade de argumentos quando a chamamos Apesar de existirem algumas convers es de tipo que o C faz automaticamente importante ficar atento Em segundo lugar n o importante o nome da vari
66. de prot tipo void rewind FILE fp retorna a posi o corrente do arquivo para o In cio 9 7 3 getw setw l no arquivo um inteiro Seu prot tipo int getw FILE fp 9 7 4 putw putw escreve um inteiro num arquivo Prot tipo ne putyw int 2EILE FED 9 7 5 fgets Para se ler uma string num arquivo podemos usar fgets cujo prot tipo char tg ts char sStr int tamanho FILE SEP A string str lida deve ter seu tamanho determinado pelo programador 9 7 6 fputs Prot tipo Char Tons char P SLE ELLE ED Escreve uma string num arquivo 9 7 7 fread Podemos escrever e ler blocos de dados Para tanto temos as fun es fread e fwrite O prot tipo de fread unsigned fread void buffer int numero de bytes int count FILE fp O buffer a regi o de mem ria na qual ser o armazenados os dados lidos O n mero de bytes o tamanho da unidade a ser lida O contador indica quantas unidades devem ser lidas Isto significa que o n mero total de bytes lidos numero de bytes count A fun o retorna o n mero de unidades efetivamente lidas Este n mero pode ser menor que o valor requisitado quando o fim do arquivo for encontrado 9 7 8 fwrite A fun o fwrite funciona como a sua companheira fread Seu prot tipo unsigned fwrite void buffer int numero de bytes int count FILE fp 9 7 9 fseek Para se fazer procuras e acessos rand micos usa se a fun o f
67. de s o guardados endere os de v rios amigos poderia ser vista como sendo uma matriz de ponteiros no C Um ponteiro tamb m tem tipo Veja quando voc anota um endere o de um amigo voc o trata diferente de quando voc anota o endere o de uma firma Apesar de o endere o dos dois locais ter o mesmo formato rua n mero barro cidade etc eles indicam locais cujos conte dos s o diferentes Ent o os dois endere os s o ponteiros de tipos diferentes No C quando declaramos ponteiros n s informamos ao compilador para que tipo de vari vel vamos apont lo Um ponteiro int aponta para um inteiro isto guarda o endere o de um inteiro 6 2 Declarando e Utilizando Ponteiros Para declarar um ponteiro temos a seguinte forma geral tipo do ponteiro nome da vari vel o asterisco que faz o compilador saber que aquela vari vel n o vai guardar um valor mas sim um endere o para aquele tipo especificado Vamos ver exemplos de declara es INE DES char temp ptz O primeiro exemplo declara um ponteiro para um inteiro O segundo declara dois ponteiros para caracteres Eles ainda n o foram inicializados como toda vari vel do C que apenas declarada Isto significa que eles apontam para um lugar indefinido Este lugar pode estar por exemplo na por o da mem ria reservada ao sistema operacional do computador Usar o ponteiro nestas circunst nicias pode levar a um travamento do micro ou a algo pior O ponteiro dev
68. de_vari veis As vari veis da lista de vari veis ter o todas o mesmo tipo e dever o ser separadas por v rgula Como o tipo default do C o int quando vamos declarar vari veis int com algum dos modificadores de tipo basta colocar o nome do modificador de tipo Assim um long basta para declarar um long int Por exemplo as declara es char ch letra Tong count ELSA pas declaram duas vari veis do tipo char ch e letra uma variavel long int count e um float pi H tr s lugares nos quais podemos declarar vari veis O primeiro fora de todas as fun es do programa Estas vari veis s o chamadas vari veis globais e podem ser usadas a partir de qualquer lugar no programa Pode se dizer que como elas est o fora de todas as fun es todas as fun es as v em O segundo lugar no qual se pode declarar vari veis no in cio de um bloco de c digo Estas vari veis s o chamadas locais e s t m validade dentro do bloco no qual s o declaradas isto s a fun o qual ela pertence sabe da exist ncia desta vari vel dentro do bloco no qual foram declaradas O terceiro lugar onde se pode declarar vari veis na lista de par metros de uma fun o Mais uma vez apesar de estas vari veis receberem valores externos estas vari veis s o conhecidas apenas pela fun o onde s o declaradas Veja o programa abaixo include lt stdio h gt int contador ine Cuncllint q 4 main char condicao Loe Dj
69. deles imprime 5 7 e 9 uma nica vez e o outro entra em loop imprimindo estes valores indefinidamente Er e Nenhuma das op es anteriores 11 A estrutura do switch abaixo switch t t case t lt 10 printf Hoje ta fazendo muito frio break case t lt 25 printf A temperatura est agradavel break default printf Hoje ta quente pra chuchu Er a V lida na linguagem C Er b N o v lida na linguagem C 12 O la o for a seguir P g 34 ine 1 for i 0 i lt 5 i printf d i E a Imprime 012345 E b N o funciona pois tem sintaxe errada Er c Imprime 123456 E d Imprime 12345 E e Nenhuma das op es anteriores Resposta dos testes Aula 4 l a 2 d 3 b 4 a 5 b 6 e 7 b 8 a 9 b 10 d 11 b 12 c Aula 5 5 Matrizes e strings 5 1 Vetores Vetores nada mais s o que matrizes unidimensionais Vetores s o uma estrutura de dados muito utilizada importante notar que vetores matrizes bidimensionais e matrizes de qualquer dimens o s o caracterizadas por terem todos os elementos pertencentes ao mesmo tipo de dado Para se declarar um vetor podemos utilizar a seguinte forma geral tipo da vari vel nome da vari vel tamanho Quando o C v uma declara o como esta ele reserva um espa o na mem ria suficientemente grande para armazenar o n mero de c lulas especificadas em tamanho Par exemplo se declararmos float exemplo 20 o C ir reservar 4x20 80 bytes Este
70. e O valor retornado por uma express o com o operador sempre dado pela express o mais direita No exemplo abaixo x a 2 a 3 a vari vel x receber o valor 5 Pode se encadear quantos operadores forem necess rios 3 7 4 Tabela de Preced ncias do C Esta a tabela de preced ncia dos operadores em C Alguns poucos operadores ainda n o foram estudados e ser o apresentados em aulas posteriores Maior preced ncia O gt un rio cast un rio amp un rio sizeof lt lt gt gt lt lt gt gt amp A SS Il x J Menor preced ncia Uma dica aos iniciantes Voc n o precisa saber toda a tabela de preced ncias de cor E til que voc conhe a as principais rela es mas aconselh vel que ao escrever o seu c digo voc tente isolar as express es com par nteses para tornar o seu programa mais leg vel 3 8 Modeladores Casts Um modelador aplicado a uma express o Ele for a a mesma a ser de um tipo especificado Sua forma geral tipo express o Um exemplo tinclude lt stdio h gt main int num float fT num 10 fs Eroa num 7 PEIRCE USE Se n o tiv ssemos usado o modelador no exemplo acima o C faria uma divis o inteira entre 10 e 7 O resultado seria um e este seria depois convertido para float mas continuaria a ser 1 0 Com o modelador temos o resultado correto P g 21 3 9 Auto av
71. e n o sabe o tamanho do vetor Ele apenas aloca a mem ria ajusta o ponteiro do nome do vetor para o In cio do mesmo e quando voc usa os ndices encontra os elementos requisitados Vamos ver agora um dos usos mais Importantes dos ponteiros a varredura sequencial de uma matriz Quando temos que varrer todos os elementos de uma matriz de uma forma sequencial podemos usar um ponteiro o qual vamos incrementando Qual a vantagem Considere o seguinte programa para zerar uma matriz main float matrx 50 50 int i j for 42 0 12000155 for 9 0 95502954 matrx 1 9 0 0 Podemos reescrev lo de uma maneira muito mais eficiente como sendo main float matrx 50 50 5 float lt p int count p matrx 0 for count 0 count lt 2500 count l Pp 0 05 pr Voc consegue ver porque que o segundo programa mais eficiente Simplesmente porque cada vez que se faz matrx il j o programa tem que calcular o deslocamento para dar ao ponteiro Ou seja o programa tem que calcular 2500 deslocamentos No segundo programa o nico c lculo que deve ser feito o de um incremento de ponteiro Fazer 2500 incrementos em um ponteiro muito mais r pido que calcular 2500 deslocamentos completos P g 42 H uma diferen a entre o nome de um vetor e um ponteiro que deve ser frisada um ponteiro uma vari vel mas o nome de um vetor n o uma vari vel Isto significa que n o se consegue alterar o endere o que
72. e ser inicializado apontado para algum lugar conhecido antes de ser usado Isto de suma import ncia Para atribuir um valor a um ponteiro rec m criado poder amos igual lo a um valor de mem ria Mas como saber a posi o na mem ria de uma vari vel do nosso programa Seria muito dif cil saber o endere o de cada vari vel que usamos mesmo porque estes endere os s o determinados pelo compilador na hora da compila o e realocados na execu o Podemos ent o deixar que o compilador fa a este trabalho por n s Para saber o endere o de uma vari vel basta usar o operador amp Veja o exemplo int count 10 ine PC pPE SCOUAL Criamos um inteiro count com o valor 10 e um apontador para um inteiro pt A express o amp count nos d o endere o de count o qual armazenamos em pt Simples n o Repare que n o alteramos o valor de count que continua valendo 10 Como n s colocamos um endere o em pt ele est agora liberado para ser usado Podemos por exemplo alterar o valor de count usando pt Para tanto vamos usar o operador inverso do operador amp o operador No exemplo acima uma vez que fizemos pt amp count a express o pt equivalente ao pr prio count Isto significa que se quisermos mudar o valor de count para 12 basta fazer pt 12 Vamos fazer uma pausa e voltar nossa analogia para ver o que est acontecendo Digamos que exista uma firma Ela como uma vari vel que j foi declarada Voc tem
73. e tamb m alterar o valor de um par metro formal pois esta altera o n o ter efeito na vari vel que foi passada fun o Isto tem sentido pois quando o C passa par metros para uma fun o s o passadas apenas c pias das vari veis Isto os par metros formais existem independentemente das vari veis que foram passadas para a fun o Eles tomam apenas uma c pia dos valores passados para a fun o 7 6 3 Vari veis globais Vari veis globais s o declaradas como j sabemos fora de todas as fun es do programa Elas s o conhecidas e podem ser alteradas por todas as fun es do programa Quando uma fun o tem uma vari vel local com o mesmo nome de uma vari vel global a fun o dar prefer ncia vari vel local Vamos ver um exemplo E A EG A paie IOC Xy main int count No exemplo acima as vari veis z e k s o globais Veja que func2 tem uma vari vel local chamada z Quando temos ent o em func2 o comando z 10 quem recebe o valor de 10 a vari vel local n o afetando o valor da vari vel global z Evite ao m ximo o uso de vari veis globais Elas ocupam mem ria o tempo todo as locais s ocupam mem ria enquanto est o sendo usadas e tornam o programa mais dif cil de ser entendido e menos geral 7 7 Chamada por Valor e Chamada por Refer ncia J vimos que na linguagem C quando chamamos uma fun o os par metros formais da fun o copiam os valores dos par met
74. e um registrador da CPU ficaria o tempo todo ocupado por conta de uma vari vel Os tipos de dados onde mais aconselhado o uso do register s o os tipos char e int mas pode se us lo em qualquer tipo de dado Em terceiro lugar o register um pedido que o programador faz ao compilador Este n o precisa ser atendido necessariamente Um exemplo do uso do register dado main void register int count for count 0 count lt 10 count return O O loop for acima ser executado mais rapidamente do que seria se n o us ssemos o register Este o uso mais recomend vel para o register uma vari vel que ser usada muitas vezes em seguida 10 3 Convers o de Tipos Em atribui es no C temos o seguinte formato destino or gem Se o destino e a or gem s o de tipos diferentes o compilador faz uma convers o entre os tipos Nem todas as convers es s o poss veis O primeiro ponto a ser ressaltado que o valor de origem convertido para o valor de destino antes de ser atribu do e n o o contr rio importante lembrar que quando convertemos um tipo num rico para outro n s nunca ganhamos precis o N s podemos perder precis o ou no m ximo manter a precis o anterior Isto pode ser entendido de uma outra forma Quando convertemos um n mero n o estamos introduzindo no sistema nenhuma informa o adicional Isto implica que nunca vamos ganhar precis o Abaixo vemos uma tabela de convers es num ric
75. eiro do arquivo Perder neste caso seria se atribuir um valor de um outro ponteiro qualquer ao ponteiro de arquivo perdendo assim o valor original utilizando este ponteiro que vamos poder trabalhar com o arquivo Se perdermos o ponteiro de um determinado arquivo n o poderemos nem fech lo O ponteiro fp passado fun o felose determina o arquivo a ser fechado A fun o retorna zero no caso de sucesso 9 6 Lendo e Escrevendo Caracteres em Arquivos 9 6 1 putc Toda vez que estamos trabalhando com arquivos h uma esp cie de posi o atual no arquivo Esta posi o gerenciada pelo compilador a posi o de onde ser lido ou escrito o pr ximo caracter Normalmente num acesso P g 64 sequencial a um arquivo n o temos que mexer nesta posi o pois quando lemos um caractere a posi o no arquivo automaticamente atualizada Num acesso rand mico teremos que mexer nesta posi o ver fseek Prot tipo ine puto int ChrEILE Ip Escreve um caracter no arquivo 9 6 2 getc Retorna um caracter lido do arquivo Prot tipo int geto FILE p 9 6 3 feof EOF End of file indica o fim de um arquivo s vezes necess rio verificar se um arquivo chegou ao fim Para isto podemos usar a fun o feof Ela retorna n o zero se o arquivo chegou ao EOF caso contr rio retorna zero Seu prot tipo int feof FILE fp A seguir apresentado um programa onde v rias opera es com arquivos s
76. el tipo nome2 tipo nomeN Repare que o tipo deve ser especificado para cada uma das N vari veis de entrada na declara o de par metros que informamos ao compilador quais ser o as entradas da fun o assim como informamos a sa da no tipo de retorno O corpo da fun o a sua alma nele que as entradas s o processadas sa das s o geradas ou outras coisas s o feitas 7 2 O Comando return O comando return tem a seguinte forma geral return valor de retorno ou return Digamos que uma fun o est sendo executada Quando se chega a uma declara o return a fun o encerrada imediatamente e se o valor de retorno informado a fun o retorna este valor importante lembrar que o valor de retorno fornecido tem que ser pelo menos compat vel com o tipo de retorno declarado para a fun o Uma fun o pode ter mais de uma declara o return Isto se torna claro quando pensamos que a fun o terminada quando o programa chega primeira declara o return Abaixo est o dois exemplos de uso do return tinclude lt stdio h gt int Square int a return a a main Lot Aum printf Entre com um numero scanf Zd amp num num Square num printf n nO seu quadrado vale d n num include lt stdio h gt int EPar int a lf a 2 Pe verifica Se a e divisiveal por dors return O Retorna 0 se nao for divisivel else return 1 1 BRerorna t
77. emplos acima vemos um primeiro exemplo do funcionamento dos ponteiros No primeiro exemplo o c digo p usado na fun o printf indica fun o que ela deve exibir um endere o Podemos fazer algumas opera es aritm ticas com ponteiros A primeira e mais simples igualar dois ponteiros Se temos dois ponteiros pl e p2 podemos igual los fazendo pl p2 Repare que estamos fazendo com que pl aponte para o mesmo lugar que p2 Se quisermos que a vari vel apontada por pl tenha o mesmo conte do da vari vel apontada por p2 devemos fazer pl p2 Basicamente depois que se aprende a usar os dois operadores amp e fica f cil entender opera es com ponteiros As pr ximas opera es tamb m muito usadas s o o Incremento e o decremento Quando incrementamos um ponteiro ele passa a apontar para o pr ximo valor do mesmo tipo para o qual o ponteiro aponta Isto se temos um ponteiro para um inteiro e o Incrementamos ele passa a apontar para o pr ximo inteiro Esta mais uma raz o pela qual o compilador precisa saber o tipo de um ponteiro se voc incrementa um ponteiro char ele anda 1 byte na mem ria e se voc incrementa um ponteiro double ele anda 8 bytes na mem ria O decremento funciona semelhantemente Supondo que p um ponteiro as opera es s o escritas como prt pr Mais uma vez insisto Estamos falando de opera es com ponteiros e n o de opera es com o conte do das vari veis para as quais eles apontam Por
78. ent o que o for executa a inicializa o incondicionalmente e testa a condi o Se a condi o for falsa ele n o faz mais nada Se a condi o for verdadeira ele executa a declara o faz o incremento e volta a testar a condi o Ele fica repetindo estas opera es at que a condi o seja falsa Um ponto importante que podemos omitir qualquer um dos elementos do for isto se n o quisermos uma inicializa o poderemos omiti la Abaixo vemos um programa que coloca os primeiros 100 n meros inteiros na tela tinclude lt stdio h gt main int count tor count 1 count lt 1L00 couned prant Sd count Note que no exemplo acima h uma diferen a em rela o ao exemplo anterior O incremento da vari vel count feito usando o operador de incremento que n s agora j conhecemos Esta a forma usual de se fazer o incremento ou decremento em um loop for Todas as linguagens de programa o possuem algo parecido com o for do C Mas o for na linguagem C muito mais flex vel e poderoso Temos acesso inicializa o condi o e ao incremento Isto nos permite fazer o que quisermos Este o poder do C 4 3 1 O loop infinito O loop nfinito tem a forma for declara o Este loop chama se loop infinito porque ser executado para sempre a n o ser que ele seja interrompido Para interromper um loop como este usamos o comando break O comando break vai quebrar o loop infinito e o progra
79. ente de 10 An 4 1 2 O if else if A estrutura if else if apenas uma extens o da estrutura if else Sua forma geral pode ser escrita como sendo if condi o 1 declara o 1 else if condi o 2 declara o 2 else if condi o 3 declara o 3 else if condi o n declara o n else declara o default A estrutura acima funciona da seguinte maneira o programa come a a testar as condi es come ando pela 1 e continua a testar at que ele ache uma express o cujo resultado d diferente de zero Neste caso ele executa a declara o correspondente S uma declara o ser executada ou seja s ser executada a declara o equivalente primeira condi o que der diferente de zero A ltima declara o default a que ser executada no caso de todas as condi es darem zero e opcional Um exemplo da estrutura acima tinclude lt stdio h gt main int num princi Digite um numero y scanf gd anum if num gt 10 printf in nO numero e maior que 10 else if num 10 printf n nVoce acertou An printf O numero e igual a 10 else if num lt 10 printf T n no numero e menor que 10 4 1 3 A express o condicional Quando o compilador avalia uma condi o ele quer um valor de retorno para poder tomar a decis o Mas esta express o n o necessita ser uma express o no sentido convencional Uma vari vel sozinha pode ser uma express
80. esta se o numero de parametros fornecidos esta correto O primeiro parametro e o nome do programa o segundo o dia o terceiro o mes e o quarto os dois ultimos algarismos do ano mes atoi argv 2 argv contem strings A string referente ao mes deve ser transformada em um numero inteiro A funcao atoi esta sendo usada para isto recebe a string e transforma no inteiro equivalente if mes lt 1 mes gt i2 Testa se o mes e valido printf Errol inUso data dia m s ano todos inteiros else printf in s de s de 19 s argv 1 nomemes mes 1 argv 3 else printf Erro nUso data dia mes ano todos inteiros 7 10 Recursividade Na linguagem C assim como em muitas outras linguagens de programa o uma fun o pode chamar a si pr pria Uma fun o assim chamada fun o recursiva Todo cuidado pouco ao se fazer fun es recursivas A primeira coisa a se providenciar um crit rio de parada Este vai determinar quando a fun o dever parar de chamar a si mesma Isto impede que a fun o se chame infinitas vezes A fun o fatorial int n pode ser um bom exemplo de uma fun o recursiva include lt stdio h gt int fat int n if n P g 54 return n fat n 1 else return 1 void main int i3 printt innDigite um valor para n J3 scanf d amp n printf nO fatorial de bd e 4d n fat n Note que enquanto n n o for igual a 0 a fun o
81. etorna o pr prio s 9 3 2 puts Prot tipo iat puts char 5 puts coloca a string s na tela P g 61 9 4 Entrada e Sa da Formatada As fun es que resumem todas as fun es de entrada e sa da formatada no C s o as fun es printf e scanf Um dom nio destas fun es fundamental ao programador 9 4 1 printf Prot tipo Le PrIn E end Pers pad As retic ncias no prot tipo da fun o indicam que esta fun o tem um n mero de argumentos vari vel Este n mero est diretamente relacionado com a string decontrole str que deve ser fornecida como primeiro argumento A string de controle tem dois componentes O primeiro s o caracteres a serem Impressos na tela O segundo s o os comandos de formato Como j vimos os ltimos determinam uma exibi o de vari veis na sa da Os comandos de formato s o precedidos de A cada comando de formato deve corresponder um argumento na fun o printf Se isto n o ocorrer podem acontecer erros imprevis veis no programa Abaixo apresentamos a tabela de c digos de formato m caracter char m n mero inteiro decimal int O mesmo que d N mero em nota o cient fica com o e min sculo N mero em nota o cient fica com o e mai sculo Ponto flutuante decima Escolhe automaticamente o melhor entre f e e Escolhe automaticamente o melhor entre f e WE Hexadecimal com letras mai sculas Ponteiro Hexadecimal com letras min sculas C digo
82. etros recebidos por uma fun o armazenam c pias das vari veis usadas na chamada da fun o E b Vari veis globais s o conhecidas e podem ser alteradas por todas as fun es do programa Er c Quando queremos alterar as vari veis que s o passadas como par metros para uma fun o devemos declar las como ponteiros na fun o Er d A fun o scanf necessita receber como par metro o endere o da vari vel de entrada porque ela precisa alterar esta vari vel Er e Uma das op es anteriores falsa 7 O que imprime o programa abaixo finclude lt stdio h gt void tunc int i 10 void main int 1 20 func Printi i 30 1 j int i 30 tuno s pranci i Ga T ad void Lund Princi sd T 1l E a 1 20 i 20 1 30 i 30 P g 56 A td da i 10 i 20 i 10 i 30 1 20 1 10 1 10 1 30 i 10 1 101 10 1 10 Nenhuma das op es anteriores 8 Ao se utilizar um vetor como par metro para uma fun o que informa o est sendo passada fun o Ad dd ad b C d e Uma c pia de todos elementos do vetor Uma c pia do primeiro elemento do vetor O endere o do primeiro elemento do vetor O endere o de todos os elementos do vetor Nenhuma das op es anteriores 9 Sejam parl par2 e par3 vari veis inteiras Se chamarmos uma fun o pela instru o func amp parl amp par2 amp par3 Para que servem amp parl amp par2 e amp par
83. fun o Para tanto basta declarar o par metro como const Veja o exemplo tinclude lt stdio h gt int sgr Const Int num y main void int a 10 int b b sqr amp a i t Sar const int num return num num P g 68 No exemplo num est protegido contra altera es Isto quer dizer que se tent ssemos fazer num 10 dentro da fun o sgr o compilador daria uma mensagem de erro 10 1 2 volatile O modificador volatile diz ao compilador que a vari vel em quest o pode ser alterada sem que este seja avisado Isto evita bugs ser ssimos Digamos que por exemplo tenhamos uma vari vel que o BIOS do computador altera de minuto em minuto um rel gio por exemplo Seria muito bom que declar ssemos esta vari vel como sendo volatile 10 2 Especificadores de Classe de Armazenamento Estes modificadores de tipo atuam sobre a maneira com a qual o compilador vai armazenar a vari vel 10 2 1 auto O especificador de classe de armazenamento auto define vari veis locais Raramente usado pois todas as vari veis do C s o auto por defini o 10 2 2 extern O extern define vari veis que ser o usadas em um arquivo apesar de terem sido declaradas em outro Ao contr rio dos programas at aqui vistos podemos ter programas de v rios milhares de linhas Estes podem ser divididos em v rios arquivos m dulos que ser o compilados separadamente Digamos que para um programa grande tenh
84. icha pessoal criada na primeira p gina desta aula se n o fosse o uso de sizeof Veja o exemplo tinclude lt stdio h gt struct tipo endereco P g 79 char rua 504 int numero char bairro 20 char cidade 30 char sigla estado 3 long int CEP J struct ficha_pessoal char nome 50 long int telefone struct tipo endereco endereco J void main void struct ficha_pessoal ex ex struct ficha pessoal malloc sizeof struct ficha pessoal free ex 11 5 O Comando typedef O comando typedef permite ao programador definir um novo nome para um determinado tipo Sua forma geral typedef antigo_nome novo_nome Como exemplo vamos dar o nome de inteiro para o tipo int typedef int inteiro Agora podemos declarar o tipo inteiro O comando typedef tamb m pode ser utilizado para dar nome a tipos complexos como as estruturas As estruturas criadas no exemplo da p gina anterior poderiam ser definidas como tipos atrav s do comando typedef O exemplo ficaria include lt stdio h gt typedef struct tipo endereco char rua 50 int numero char bairro 20 char cidade 30 char sigla estado 3 Long int CEB TEndereco typedef struct ficha_pessoal char nome 50 long int telefone TEndereco endereco TFicha void main void TFicha ex Considera es finais Chegamos ao final deste nosso Curso de Programa o de Computadores utilizand
85. idos printi Erro Parametro invalido in return NULL free v libera o vetor return NULL amp 4 S retorna o ponteiro void main void tloat p int a outros comandos inclusive a inicializacao de a p Alocar vetor real a outros comandos utilizando p normalmente p Liberar vetor real a Pp 10 7 2 Aloca o Din mica de Matrizes A aloca o din mica de mem ria para matrizes realizada da mesma forma que para vetores com a diferen a que teremos um ponteiro apontando para outro ponteiro que aponta para o valor final o que denominado indire o m ltipla A indire o m ltipla pode ser levada a qualquer dimens o desejada mas raramente necess rio mais de um ponteiro para um ponteiro Um exemplo de implementa o para matriz real bidimensional fornecido a seguir A estrutura de dados utilizada neste exemplo composta por um vetor de ponteiros correspondendo ao primeiro ndice da matriz sendo que cada ponteiro aponta para o in cio de uma linha da matriz Em cada linha existe um vetor alocado dinamicamente como descrito anteriormente compondo o segundo ndice da matriz Finclude lt stdio h gt include lt stcdlib h gt float Alocar matriz real int m int n float v ponteiro para a matriz int Li variavel auxiliar if m lt 1 n lt 1 verifica parametros recebidos printf Erro Parametro invalido
86. in return NULL aloca as linhas da matriz v float calloc m sizeoft float P g 74 TE ty Es NULO 4 printi gt Erro Memoria Insuficiente 77m return NULL aloca as colunas da matriz for 3 0r i lt my itt J 4 VLEI floaty cadloc ln Sizeof tTloat s iT fa NULES 4 printf Erro Mem ria Insuficiente 34 return NULL return v retorna o ponteiro para a matriz float Liberar_matriz_real int m int n float v int di J variavel ameliar Ty if v NULL return NULL if m lt 1 n lt 1 verifica parametros recebidos printf Erro Parametro invalido FIYI return v for 1 0 gt i lt m a free vli libera as linhas da matriz free v libera a matriz return NULA 4 retorna Um ponteiro n Lo Ty void main void float mat matriz a ser dlocada int Ly ES numero de linhas e colunas da matriz as Le outros Comandos inci sive anca aliza ao para Le C 7 mat Alocar matriz real l c SU outros comandos utilizando matl L normalmente mat Liberar matriz real ly c mat Aula 11 11 Matrizes e strings 11 1 Estruturas Uma estrutura agrupa v rias vari veis numa s Funciona como uma ficha pessoal que tenha nome telefone e endere o A ficha seria uma estrutura 11 1 1 Criando Para se criar uma estrutura usa se o comando struct
87. itura de f E b N o efetuamos a leitura de f E c Temos um erro de sintaxe E d Dever amos estar usando amp pf no scanf E e Nenhuma das op es anteriores 11 Seja a seguinte segii ncia de instru es int 1 L0 77 20 int pti Peq pti amp 1 ptj amp J Qual express o n o v lida p7 a J pti py b 1 ptrpt E c pti py Er d pti E e 1 pti ll ptj 12 Seja a declara o toC Macri al lAa O orraa Qual afirmativa falsa E a matr igual a 1 E b matr 1 2 igual a 7 E c matr 2 3 igual a 12 E d matr 2 2 igual a 11 ET e matr 1 igual a 5 Resposta dos testes Aulas 5 e 6 l c 2 b 3 d 4 b 5 d 6 e 7 e 8 b 9 d 10 a 11 12 e Aula 7 7 Fun es 7 1 A Fun o Fun es s o as estruturas que permitem ao usu rio separar seus programas em blocos Se n o as tiv ssemos os programas teriam que ser curtos e de pequena complexidade Para fazermos programas grandes e complexos temos de constru los bloco a bloco Uma fun o no C tem a seguinte forma geral tipo de retorno nome da fun o declara o de par metros i corpo_da_fun o j P g 47 O tipo de retorno o tipo de vari vel que a fun o vai retornar O default o tipo Int ou seja uma fun o para qual n o declaramos o tipo de retorno considerada como retornando um inteiro A declara o de par metros uma lista com a seguinte forma geral tipo nom
88. l Apesar de ser bom n o pr requesito do curso um conhecimento anterior de linguagens de programa o importante uma familiaridade com computadores O que importante que voc tenha vontade de aprender dedica o ao curso e caso esteja em uma das turmas do curso acompanhe atentamente as discuss es que ocorrem na lista de discuss es do curso O C nasceu na d cada de 70 Seu inventor Dennis Ritchie implementou o pela primeira vez us ando um DEC PDP 11 rodando o sistema operacional UNIX O C derivado de uma outra linguagem o B criado por Ken Thompson O B por sua vez veio da linguagem BCPL inventada por Martin Richards O C uma linguagem de programa o gen rica que utilizada para a cria o de programas diversos como processadores de texto planilhas eletr nicas sistemas operacionais programas de comunica o programas para a automa o Industrial gerenciadores de bancos de dados programas de projeto assistido por computa dor programas para a solu o de problemas da Engenharia F sica Qu mica e outras Ci ncias etc bem prov vel que o Navegador que voc est usando para ler este texto tenha sido escrito em C ou C Estudaremos a estrutura do ANSI C o C padronizado pela ANSI Veremos ainda algumas fun es comuns em compiladores para alguns sistemas operacionais Quando n o houver equivalentes para as fun es em outros sistemas apresentaremos formas alternativas de uso dos
89. lara o A express o na condi o ser avaliada Se ela for zero a declara o n o ser executada Se a condi o for diferente de zero a declara o ser executada Aqui reapresentamos o exemplo de um uso do comando if include lt stdio h gt main lnt numi printf Digite um numero scanf d amp num if num gt 10 printf n no numero e maior que 10 if num 10 t printf n nVoce acertou in printf O numero e igual a 10 if num lt 10 printf n nO numero e menor que 10 4 1 1 O else Podemos pensar no comando else como sendo um complemento do comando if O comando if completo tem a seguinte forma geral if condi o declara o 1 else declara o 2 A express o da condi o ser avaliada Se ela for diferente de zero a declara o 1 ser executada Se for zero a declara o 2 ser executada importante nunca esquecer que quando usamos a estrutura if else estamos garantindo que uma das duas declara es ser executada Nunca ser o executadas as duas ou nenhuma delas Abaixo est um exemplo do uso do if else que deve funcionar como o programa da se o anterior include lt stdio h gt main int num printi Digite um numero 5 P g 24 scanf Zd amp num if num 10 printi printf i else printi Princi ynny oce acertou ln jg O numero e igual a 10 4n ininVoce errou An O numero e difer
90. m que uma das declara es seja executada Mas ele n o essencial ao comando switch Se ap s a execu o da declara o n o houver um break o programa continuar executando Isto pode ser til em algumas situa es mas eu recomendo cuidado Veremos agora um exemplo do comando switch tinclude lt stdio h gt main t int num printf Digite um numero 3 scanf d num switch num case 9 printf nino numero igual a 9 n yi break case 10 printf n no n mero igual a 10 n break case 11 printf inin0O numero e igual a 11 An break default printf inin0O numero nao e nem 9 nem 10 nem 11 in P g 27 4 3 O Comando for for a primeira de uma s rie de tr s estruturas para se trabalhar com loops de repeti o As outras s o while e do As tr s comp em a segunda fam lia de comandos de controle de fluxo Podemos pensar nesta fam lia como sendo a das estruturas de repeti o controlada Como j foi dito o loop for usado para repetir um comando ou bloco de comandos diversas vezes de maneira que se possa ter um bom controle sobre o loop Sua forma geral for inicializa o condi o incremento declara o O melhor modo de se entender o loop for ver como ele funciona por dentro O loop for equivalente a se fazer o seguinte inicializa o if condi o declara o incremento Volte para o comando if j Podemos ver
91. ma continuar sua execu o normalmente Como exemplo vamos ver um programa que faz a leitura de uma tecla e sua impress o na tela at que o usuario aperte uma tecla especial denominada FLAG O nosso FLAG ser a letra X include lt stdio h gt main int Count char ch for Count 1 Count t fflush NULL scanf c amp ch if ch X break prinef MnLetra celn ch s P g 28 Aten o ao comando fflush NULL O papel deste comando limpar o buffer do teclado para que outros caracteres armazenados no buffer do computador sejam liberados Desta forma a leitura de caracter que acontece logo ap s a sua execu o n o ficar prejudicada 4 3 2 O loop sem conte do Loop sem conte do aquele no qual se omite a declara o Sua forma geral portanto aten o ao ponto e v rgula for inicializa o condi o incremento Uma das aplica es desta estrutura gerar tempos de espera O programa tinclude lt stdio h gt main long int 2 printf CNM Imprime o caracter de alerta um beep for i 0 1510000000 i Espera 10 000 000 de iteracoes printf T a i Imprime outro caracter de alerta demonstra o espa o de tempo gerado 4 4 O Comando while O comando while tem a seguinte forma geral while condi o declara o Assim como fizemos para o comando anterior vamos tentar mostrar como o while funciona fazendo uma analogia Ent o o while
92. ng for declarada como char str 20 o n mero m ximo de caracteres que poder o ser lidos e armazenados nela Er a 18 P g 45 E b 19 p c 20 E d 21 5 Qual fun o pode ser usada para determinar o comprimento de uma string Er a gets E b strcpy E c strcat E d strlen E e strcmp 6 Qual das instru es abaixo correta para declarar um ponteiro para inteiro TI O p p p E a Int pti p7 b pt E c amp i Er d mt pti pti Er e int pti 7 Seja a seguinte segii ncia de instru es em um programa C int PLi int 1 10 pti amp 1 Qual afirmativa falsa Er a pti armazena o endere o de 1 E b pti iguala 10 F7 c ao se executar pti 20 1 passar a ter o valor 20 E d ao se alterar o valor de 1 pti ser modificado E e pti igualal0 8 Se i e j s o vari veis inteiras e pi e pj s o ponteiros para inteiro qual atribui o ilegal E a pi amp i m bo p amp Er c pj amp amp j E d 1 amp amp Do e i pi q 9 Seja a seguinte segii ncia de instru es em um programa C Int APEL ane vetill 10 T 20ra pti veti Qual afirmativa falsa p a pti igual a 10 E b pti 2 igual a 2 E c pti 4 iguala 3 E d pti 1 igual a 10 ET e veti 3 igual a 6 10 Na sequ ncia de instru es abaixo P g 46 float f float pf pf amp f scanf f pf Er a Ffetuamos a le
93. nte ter 16 bits Numa m quina de 32 int dever ter 32 bits Na verdade cada compilador livre para escolher tamanhos adequados para o seu pr prio hardware com a nica restri o de que shorts e ints devem ocupar pelo menos 16 bits longs pelo menos 32 bits e short n o pode ser maior que int que n o pode ser maior que long A seguir est o listados os tipos de dados permitidos e seu valores m ximos e m nimos em um compilador t pico para um hardware de 16 bits Doo pisos P g 15 Tipo Inicio cnar Oa n unsigned char Po 7 Q q signed char t 68 unsigned int Do 5 535 Signed imi 2767 short int unsigned short int 8 signed short int WT LV A UU l N O O J 32 768 2 767 5 535 7657 2 147 483 648 2 147 483 647 2 147 483 648 2 147 483 647 Do A 34E 38 4E 38 4 1 7 E 3085 E 308 ong double 3 4E 4932 3 4E 4932 O tipo long double o tipo de ponto flutuante com maior precis o E importante observar que os intervalos de ponto flutuante na tabela acima est o indicados em faixa de expoente mas os n meros podem assumir valores tanto positivos quanto negativos ON O long int 2 2 signed long int unsigned long int oat double ON CO OO O a aj a a a NJ N N ON N NAO l 3 3 Declara o e Inicializa o de Vari veis As vari veis no C devem ser declaradas antes de serem usadas A forma geral da declara o de vari veis tipo_da_vari vel lista_
94. o a Linguagem C Esperamos que voc s tenham gostado e aprendido alguma coisa conosco Agradecemos pela paci ncia ao acompanhar este longo curso e gostar amos de contar com a sua colabora o respondendo avalia o que ir o receber por e mail caso estejam matriculados no curso ou ent o preenchendo o formul rio de avalia o P g 80 O aprendizado de uma linguagem como o C depende de se programar bastante e tentamos fazer isto no nosso curso Por m n o apresentamos todos os detalhes da linguagem isto n o seria poss vel em um curso com o tempo que propusemos e por isto sugerimos queles que quiserem saber mais que consultem nossa bibliografia buscando l as refer ncias para o seu estudo Boa sorte bons estudos e divirtam se com esta fant stica linguagem que agora esperamos voc s dominam Bibliografia Kernighan B amp Ritchie D C linguagem de programa o padr o ANSI Editora Campus 1990 Schildt H Turbo C guia do usu rio Editora McGraw Hill 1988 Schildt H C completo e total Editora McGraw Hill 1990 Carpenter V Learn C C today http www cyberdiem com vin learn html uma cole o de refer ncias e tutoriais sobre as linguagens C e C dispon veis na Internet Mizrahi V V Treinamento em linguagem C M dulos 1 e 2 Editora McGraw Hill 1990 D vidas e Sugest es cursocO cpdee ufmg br Curso de C do CPDEE UFMG 1996 1999 P g 81
95. o do C nos fornece para isto 9 2 1 getche e getch As fun es getch e getche n o s o definidas pelo padr o ANSI Por m elas geralmente s o inclu das em compiladores baseados no DOS e se encontram no header file conio h Vale a pena repetir s o fun es comuns apenas para compiladores baseados em DOS e se voc estiver no UNIX normalmente n o ter estas fun es dispon veis Prot tipos int getch void int getche void getch espera que o usu rio digite uma tecla e retorna este caractere Voc pode estar estranhando o fato de getch retornar um inteiro mas n o h problema pois este inteiro tal que quando igualado a um char a convers o feita corretamente A fun o getche funciona exatamente como getch A diferen a que getche gera um echo na tela antes de retornar a tecla Se a tecla pressionada for um caractere especial estas fun es retornam zero Neste caso voc deve usar as fun es novamente para pegar o c digo da tecla extendida pressionada 9 2 2 putchar Prot tipo int putcher inte putchar coloca o caractere c na tela Este caractere colocado na posi o atual do cursor Mais uma vez os tipos s o Inteiros mas voc n o precisa se preocupar com este fato O header file stdio h 9 3 Lendo e Escrevendo Strings 9 3 1 gets Prot tipo char facts Achar Ss Pede ao usu rio que entre uma string que ser armazenada na string s O ponteiro que a fun o r
96. o do uso do goto vamos reescrever o equivalente ao comando for apresentado na se o equivalente ao mesmo inicializa o in cio do loop if condi o i declara o incremento goto in cio_do_loop j O comando goto deve ser utlizado com parcim nia pois o abuso no seu uso tende a tornar o c digo confuso O goto n o um comando necess rio podendo sempre ser substitu do por outras estruturas de controle Puristas da programa o estruturada recomendam que o goto nunca seja usado Por m em algumas situa es muito espec ficas o comando goto pode tornar um c digo mais f cil de se entender se ele for bem empre gado Um caso em que ele pode ser til quando temos v rios loops e ifs aninhados e se queira por algum motivo sair destes loops e ifs todos de uma vez Neste caso um goto resolve o problema mais elegantemente que v rios break s sem contar que os break s exigiriam muito mais testes Ou seja neste caso o goto mais elegante e mais r pido Mas n o abuse O exemplo da p gina anterior pode ser reescrito usando se o goto include lt stdio h gt main int Opcao while opcao 5 REFAZ printi Ania Esc lha uma opcao entre 1 e Di Pi Scant sa sopcao P g 31 if fopcao gt 5 opcao lt L goto REFAZ Opcao invalida volta ao rotulo REFAZ switch opcao case 1 printf Cn gt Primeira opcao Ji break case 2 printf n gt Segunda optao break c
97. o final da inicializa o 5 3 5 Inicializa o sem especifica o de tamanho Podemos em alguns casos inicializar matrizes das quais n o sabemos o tamanho a priori O compilador C vai neste caso verificar o tamanho do que voc declarou e considerar como sendo o tamanho da matriz Isto ocorre na hora da compila o e n o poder mais ser mudado durante o programa sendo muito til por exemplo quando vamos Inicializar uma string e n o queremos contar quantos caracteres ser o necess rios Alguns exemplos char mess Linguagem C flexibilidade e poder iot Matra IIZ h 4 A 2 2 4 556 64 00 140 di No primeiro exemplo a string mess ter tamanho 36 Repare que o artif cio para realizar a inicializa o sem especifica o de tamanho n o especificar o tamanho No segundo exemplo o valor n o especificado ser 5 Aula 6 P g 39 6 Ponteiros 6 1 Como Funcionam os Ponteiros Os ints guardam inteiros Os floats guardam n meros de ponto flutuante Os chars guardam caracteres Ponteiros guardam endere os de mem ria Quando voc anota o endere o de um colega voc est criando um ponteiro O ponteiro este seu peda o de papel Ele tem anotado um endere o Qual o sentido disto Simples Quando voc anota o endere o de um colega depois voc vai usar este endere o para ach lo O C funciona assim Voce anota o endere o de algo numa vari vel ponteiro para depois usar Da mesma maneira uma agenda on
98. o o racioc nio acima nomes de strings s o do tipo char Isto nos permite escever a nossa fun o StrCpyd que funcionar como a fun o strepy da biblioteca tinclude lt stdio h gt tinclude lt string h gt StrCpy char destino char origem while origem xdestino origem origem destino destinos 0 main char str1i 100 str2 100 str3 100 printf Entre com uma string J gets Scrl P g 43 StrCoy strz2 stril SCrCEy Str3 Voce digitou a string J printf MnAncsos etrs 0ER2 H v rios pontos a destacar no programa acima Observe que podemos passar ponteiros como argumentos de fun es Na verdade assim que fun es como gets e strcpy funcionam Passando o ponteiro voc possibilita fun o alterar o conte do das strings Voc j estava passando os ponteiros e n o sabia No comando while origem estamos usando o fato de que a string termina com NO como crit rio de parada Quando fazemos origem e destino o leitor poderia argumentar que estamos alterando o valor do ponteiro base da string contradzendo o que recomendei que se deveria fazer no final de uma se o anterior O que o leitor talvez n o saiba ainda e que ser estudado em detalhe mais adiante que no C s o passados para as fun es c pias dos argumentos Desta maneira quando alteramos o ponteiro origem na fun o StrCpy o ponteiro str2 permanece inalterado na fun o main
99. ograma mais flex vel H quem diga que em um programa nunca se deve usar constantes como 10 3 1416 etc pois estes s o n meros que ningu m sabe o que significam Ao inv s disto deve se usar apenas ffdefines uma conven o na linguagem C que as macros declaradas em Hdefines devem ser todas em mai sculas Esta uma conven o que deve ser seguida pois torna o programa mais leg vel Um outro uso da diretiva define o de simplesmente definir uma macro Neste caso usa se a seguinte forma geral define nome da macro Neste caso o objetivo n o usar a macro no programa pois ela seria substitu da por nada mas sim definir uma macro para ser usada como uma esp cie de flag Isto quer dizer que estamos definindo um valor como sendo verdadeiro para depois podermos test lo Tamb m poss vel definir macros com argumentos Veja o exemplo a seguir fdefine max A B ADB A B fdefine min A B A lt B A B x max 1 35 P g 58 y mintr Embora pare a uma chamada de fun o o uso de max ou min simplesmente substitui em tempo de compila o o c digo especificado Cada ocorr ncia de um par metro formal A ou B na defini o ser substitu do pelo argumento real correspondente Assim a linha de c digo 2 maxibrg Eta ser substitu da pela linha IPFA AEF PRQ Ta Isto pode ser muito til Verifique que as macros max e min n o possuem especifica o de tipo Logo
100. ome da vari vel tam tam2 tamN o compilador C calcula o tamanho em bytes necess rio para armazenar esta matriz Este tamanho taml x tam2 x tam3 x xtamN x tamanho do tipo O compilador ent o aloca este n mero de bytes em um espa o livre de mem ria O nome da vari vel que voc declarou na verdade um ponteiro para o tipo da vari vel da matriz Este conceito fundamental Eis porque Tendo alocado na mem ria o espa o para a matriz ele toma o nome da vari vel que um ponteiro e aponta para o primeiro elemento da matriz Mas a surge a pergunta ent o como que podemos usar a seguinte nota o nome da vari vel ndice Isto pode ser facilmente explicado desde que voc entenda que a nota o acima absolutamente equivalente a se fazer nome da vari vel ndice Agora podemos entender como que funciona um vetor Vamos ver o que podemos tirar de informa o deste fato Fica claro por exemplo porque que no C a indexa o come a com zero porque ao pegarmos o valor do primeiro elemento de um vetor queremos de fato nome da vari vele ent o devemos ter um ndice igual a zero Ent o sabemos que nome da vari vel equivalente anome da vari vel 0 Outra coisa apesar de na maioria dos casos n o fazer muito sentido poder amos ter ndices negativos Estar amos pegando posi es de mem ria antes do vetor Isto explica tamb m porque o C n o verifica a validade dos ndices El
101. passagem por valor ou passagem por refer ncia Sugiro que neste ponto o leitor leia um arquivo cabe alho como por exemplo o conio hou o string h E um bom treino Estes arquivo podem ser encontrados no diret rio apropriado do compilador que voc estiver utilizando geralmente o subdiret rio include do diret rio onde voc instalou o compilador Consulte o manual do compilador 712 Auto avalia o on line aula 7 Responda as perguntas abaixo escolhendo a alternativa adequada para cada quest o Voc pode atingir at a nota 100 Sendo que cada quest o certa vale 10 pontos l Qual a afirmativa verdadeira E a Voc pode retornar para um programa quantas vari veis de uma fun o desejar atrav s do comando return E b Uma fun o s pode ter um comando return Er c Os prot tipos de fun o servem para declarar as fun es isto indicar para o compilador qual o seu nome tipo de retorno e o n mero e tipos dos par metros E d Uma fun o n o pode retornar um ponteiro E e Nenhuma das op es anteriores 2 Qual das seguintes raz es n o uma raz o v lida para o uso de fun es em C Er a Fun es usam menos mem ria do que se repetirmos o mesmo c digo v rias vezes E b Fun es rodam mais r pido D Fun es fornecem um meio de esconder c lculos em uma caixa preta que pode ser usada sem a preocupa o de detalhes internos de implementa o E d Fun es mant m vari veis protegidas da
102. permitida tarefa do programador Abaixo damos um exemplo do uso de uma matriz incl de lt stdio h gt main int mtrx 20 10 int ipj count count 1 for i 0 i lt 20 i tor J07 LUFT FE mtrx il count count No exemplo acima a matriz mtrx preenchida sequencialmente por linhas com os n meros de 1 a 200 Voc deve entender o funcionamento do programa acima antes de prosseguir 5 3 2 Matrizes de strings Matrizes de strings s o matrizes bidimensionais Imagine uma string Ela um vetor Se fizermos um vetor de strings estaremos fazendo uma lista de vetores Esta estrutura uma matriz bidimensional de chars Podemos ver a forma geral de uma matriz de strings como sendo char nome da vari vel num_de_strings compr_das_strings A surge a pergunta como acessar uma string individual F cil E s usar apenas o primeiro ndice Ent o para acessar uma determinada string fa a nome da vari vel ndice P g 38 Aqui est um exemplo de um programa que l 5 strings e as exibe na tela include stdio h gt main char strings 5 100 int count for count 0 count lt 5 count printf n nDigite uma string gets strings count printf ninnAS strings que voce digito foram nn for count 0 count lt 5 count printi s n strings count 5 3 3 Matrizes multidimensionais O uso de matrizes multidimensionais na linguagem
103. printf n n Escolha uma opcao entre 1 e 5 scani lt d amp opcao it opcao gt 5 opcao lt I continues Opcao invalida volta ao inicio do loop switch opcao case 1 Printi n gt Primeira opcao P g 30 break case 2 printt n gt Segunda epcao JJ break case 3 printt Min gt Terceira cpcad sat break case 4 printi Pa gt Quarta opcao break case 5 printE n gt Abandonando a break O programa acima ilustra uma simples e til aplica o para o continue Ele recebe uma op o do usuario Se esta op o for inv lida o continue faz com que o fluxo seja desviado de volta ao in cio do loop Caso a op o escolhida seja v lida o programa segue normalmente 4 8 O Comando goto O goto o ltimo comando de controk de fluxo Ele pertence a uma classe parte a dos comandos de salto incondicional O goto realiza um salto para um local especificado Este local determinado por um r tulo Um r tulo na linguagem C uma marca no programa Voc d o nome que quiser a esta marca Podemos tentar escrever uma forma geral nome do r tulo goto nome do r tulo Devemos declarar o nome do r tulo na posi o para a qual vamos dar o salto seguido de O goto pode saltar para um r tulo que esteja mais frente ou para tr s no programa Uma observa o importante que o r tulo e o goto devem estar dentro da mesma fun o Como exempl
104. py Sua forma geral strcpy string destino string origem A fun o strepy copia a string origem para a string destino Seu funcionamento semelhante ao da rotina apresentada na se o anterior As fun es apresentadas nestas se es est o no arquivo cabe alho string h A seguir apresentamos um exemplo de uso da fun o strepy tinclude lt stdio h gt tinclude lt string h gt main t char str1i 100 str2 100 str3 100 printf Entre com uma string gets strl stropy SCIA Strl stropy Stro Voce digitou a string J3 printi nyns SCr3zStr2 5 2 3 strcat A fun o strcat tem a seguinte forma geral strcat string destino string origem A string de origem permanecer inalterada e ser anexada ao fim da string de destino Um exemplo tinclude lt stdio h gt tinclude lt string h gt main char str1 100 str2 100 priner Entre Com Uma SCring Ds gets strl strcpy strz Voc digitou a string streat str2 str1 Printi inina s Str 5 2 4 strlen Sua forma geral strlen string A fun o strlen retorna o comprimento da string fornecida O terminador nulo n o contado Isto quer dizer que de fato o comprimento do vetor da string deve ser um a mais que o inteiro retornado por strlen Um exemplo do seu uso tinclude lt stdio h gt tinclude lt string h gt main t int size char str 100 printi Entre com
105. que portanto est o sendo modificados Espere um momento ser que n s j n o vimos esta hist ria de chamar uma fun o com as vari veis precedidas de amp J assim que n s chamamos a fun o scanf Mas porqu Vamos pensar um pouco A fun o scanf usa chamada por refer ncia porque ela precisa alterar as vari veis que passamos para ela N o para isto mesmo que ela feita Ela l vari veis para n s e portanto precisa alterar seus valores Por isto passamos para a fun o o endere o da vari vel a ser modificada 7 8 Matrizes como Argumentos de Fun es Quando vamos passar uma matriz como argumento de uma fun o podemos declarar a fun o de tr s maneiras equivalentes Digamos que temos a seguinte matriz int matrx 50 e que queiramos pass la como argumento de uma fun o func Podemos declarar func das tr s maneiras seguintes r void func int matrx void func int matrx r void func int matrx 50 1 P g 53 Nos tr s casos teremos dentro de func um int chamado matrx Ao passarmos uma matriz para uma fun o na realidade estamos passando um ponteiro Neste ponteiro armazenado o endere o do primeiro elemento da matriz Isto significa que n o feita uma c pia elemento a elemento da matriz Isto faz com que possamos alterar o valor desta matriz dentro da fun o Todo cuidado pouco Um exemplo disto j foi visto quando implementamos a fun o StrCpy
106. quivo a ser aberto printf inin Entre com um nome para o arquivo n gets str if tifo fopen str w Y Caso ocorra algum erro na abertura do arquivo o programa aborta automaticamente printf Errol Impossivel abrir O Arquivo n exit 1 l Se nao houve erro imprime no arquivo fecha fprintf p Este e m arquivo chamado nssn Str fclose p abre novamente para a leitura e fecha p fopen str r s while feof p ESCan Pre CEG print ie acho fclose p Aula 10 10 Tipos de Dados Avan ados 10 1 Modificadores de Acesso Estes modificadores como o pr prio nome indica mudam a maneira com a qual a vari vel acessada e modificada 10 1 1 const O modificador const faz com que a vari vel n o possa ser modificada no programa Como o nome j sugere til para se declarar constantes Poder amos ter por exemplo const LioatPisSeit4l Podemos ver pelo exemplo que as vari veis com o modificador const podem ser inicializadas Mas PI n o poderia ser alterado em qualquer outra parte do programa Se o programador tentar modificar PI o compilador gerar um erro de compila o O uso mais importante de const n o declarar vari veis constantes no programa Seu uso mais comum evitar que um par metro de uma fun o seja alterado pela fun o Isto muito til no caso de um ponteiro pois o conte do de um ponteiro pode ser alterado por uma
107. rintf string de controle lista de argumentos Teremos na string de controle uma descri o de tudo que a fun o vai colocar na tela A string de controle mostra n o apenas os caracteres que devem ser colocados na tela mas tamb m quais as vari veis e suas respectivas posi es Isto feito usando se os caracteres de controle que usam a nota o Na string de controle indicamos quais de qual tipo e em que posi o est o as vari veis a serem apresentadas muito importante que para cada caractere de controle tenhamos um argumento na lista de argumentos Apresentamos agora alguns dos c digos C digo Significado pr foa Caractere ring po od na tela um Vamos ver alguns exemplos de printf e o que eles exibem printf Teste S amp S gt Teste 3 printf f 40 345 gt 40 345 printf Um caracter c e um inteiro amp d D 120 gt Um caracter D e um inteiro 120 printf s e um exemplo Este gt Este e um exemplo printf sSdZ Juros de 10 gt Juros de 10 Maiores detalhes sobre a fun o printf ser o vistos posteriormente mas podem ser consultados de antem o pelos Interessados P g 11 2 4 4 scanf O formato geral da fun o scanf scanf string de controle lista de argumentos Usando a fun o scanf podemos pedir dados ao usu rio Um exemplo de uso pode ser visto acima Mais uma vez devemos ficar atentos a fim de colocar o mesmo n
108. ro de bytes de um inteiro Ele util para se saber o tamanho de tipos O ponteiro void que calloc retorna convertido para um int pelo cast e atribu do a p A declara o seguinte testa se a opera o foi bem sucedida Se n o tiver sido p ter um valor nulo o que far com que p retorne verdadeiro Se a opera o tiver sido bem sucedida podemos usar o vetor de inteiros alocados normalmente por exemplo indexando o de p 0 a p a 1 10 6 3 realloc A fun o realloc serve para realocar mem ria e tem o seguinte prot tipo void realloc void ptr unsigned int num A fun ao modifica o tamanho da mem ria previamente alocada apontada por ptr para aquele especificado por num O valor de num pode ser maior ou menor que o original Um ponteiro para o bloco devolvido porque realloc pode precisar mover o bloco para aumentar seu tamanho Se isso ocorrer o conte do do bloco antigo copiado no novo bloco e nenhuma informa o perdida Se ptr for nulo aloca size bytes e devolve um ponteiro se size zero a mem ria apontada por ptr liberada Se n o houver mem ria suficiente para a aloca o um ponteiro nulo devolvido e o bloco original deixado inalterado 10 6 4 free Quando alocamos mem ria dinamicamente necess rio que n s a liberemos quando ela n o for mais necess ria Para isto existe a fun o free cujo prot tipo void free void p Basta ent o passar para free o ponteiro
109. ro que n o foi inicializado Um pequeno programa que demonstra como n o usar um ponteiro main Errado Nao Execute inb Xp pD x 13 p x Este programa compilar e rodar O que acontecer Ningu m sabe O ponteiro p pode estar apontando para qualquer lugar Voc estar gravando o n mero 13 em um lugar desconhecido Com um n mero apenas voc provavelmente n o vai ver nenhum defeito Agora se voc come ar a gravar n meros em posi es aleat rias no seu computador n o vai demorar muito para travar o micro se n o acontecer coisa pior 2 8 Auto avalia o on line aulas 5 e 6 Responda as perguntas abaixo escolhendo a alternativa adequada para cada quest o Voc pode atingir at a nota 100 Sendo que cada quest o certa vale 8 3 pontos l Seja um vetor declarado por int vet 10 Qual elemento deste vetor acessado quando se escreve vet 2 Er a Primeiro elemento E b Segundo elemento ET c Terceiro elemento ET d Quarto elemento E e Nenhuma das op es anteriores 2 Se declararmos um vetor como int vet 30 a Instru o abaixo acessa corretamente os elementos deste vetor for 3 0 j lt 30 j veek gt JJ E a Sim E b N o 3 Seja a matriz matrx declarada e inicializada por 1n matri 4 lro or ror Oor ros Or tDpll LA ds O que conter o elemento matrx 1 2 ET a 2 E b 5 E Cc 6 ET d 7 Er e Nenhuma das op es anteriores 4 Se uma stri
110. ros que s o passados para a fun o Isto quer dizer que n o s o alterados os valores que os par metros t m fora da fun o Este tipo de chamada de fun o denominado chamada por valor Isto ocorre porque s o passados para a fun o apenas os valores dos par metros e n o os pr prios par metros Veja o exemplo abaixo include lt staroh gt float sqr float num void main void tipat num sag printf Entre com um numero scanf SE amp num sq sqr num printf Mano numero original er Sinn pnu printf O seu quadrado vale f n sq float sgr float num P g 52 num num num return num No exemplo acima o par metro formal num da fun o sgr sofre altera es dentro da fun o mas a vari vel num da fun o main permanece inalterada uma chamada por valor Outro tipo de passagem de par metros para uma fun o ocorre quando altera es nos par metros formais dentro da fun o alteram os valores dos par metros que foram passados para a fun o Este tipo de chamada de fun o tem o nome de chamada por refer ncia Este nome vem do fato de que neste tipo de chamada n o se passa para a fun o os valores das vari veis mas sim suas refer ncias a fun o usa as refer ncias para alterar os valores das vari veis fora da fun o O C s faz chamadas por valor Isto bom quando queremos usar os par metros formais vontade dentro da fun o sem termos que
111. s vari veis e retorna esta soma Outros operadores bin rios s o os operadores subtra o e O operador como troca de sinal um operador un rio que n o altera a vari vel sobre a qual aplicado pois ele retorna o valor da vari vel multiplicado por 1 O operador divis o quando aplicado a vari veis inteiras nos fornece o resultado da divis o inteira quando aplicado a vari veis em ponto flutuante nos fornece o resultado da divis o real Assim seja o seguinte trecho de c digo ant a Lt D float z 17 zl z2 x a b y aa 4 D al Zz 4 b Z S av P g 18 ao final da execu o destas linhas os valores calculados seriam x 5 y 2 z1 5 666666 e z2 5 0 Note que na linha correspondente a z2 primeiramente feita uma divis o inteira pois os dois operandos s o inteiros Somente ap s efetuada a divis o que o resultado atribu do a uma vari vel float Os operadores de incremento e decremento s o un rios que alteram a vari vel sobre a qual est o aplicados O que eles fazem incrementar ou decrementar a vari vel sobre a qual est o aplicados de 1 Ent o gt ada R s o equivalentes a x x 1 x x 1 Estes operadores podem ser pr fixados ou p s fixados A diferen a que quando s o pr fixados eles incrementam e retornam o valor da vari vel j incrementada Quando s o p s fixados eles retornam o valor da vari vel sem o incremento e depois incrementam a
112. s bytes s o reservados de maneira cont gua Na linguagem C a numera o come a sempre em zero Isto significa que no exemplo acima os dados ser o indexados de O a 19 Para acess los vamos escrever exemplo 0 exemplo 1 exemplo 19 Mas ningu m o impede de escrever exemplo 30 exemplo 103 Por qu Porque o n o verifica se o ndice que voc usou est dentro dos limites v lidos Este um cuidado que voc deve tomar Se o programador n o tiver aten o com os limites de validade para os ndices ele corre o risco de ter vari veis sobreescritas ou de ver o computador travar Bugs terr veis podem surgir Vamos ver agora um exemplo de utiliza o de vetores tinclude lt stdio h gt main t int num 100 Declara um vetor de inteiros de 100 posicoes int count 0 int totalnums do t printf inEntre com um numero 999 p terminar scanf d amp num count counter while num count 1 999 P g 35 totalnums count l printf inininit Os n meros que voc digitou foram inin for count 0 count lt totalnums count t princi 4d num connc i No exemplo acima o inteiro count inicializado em 0 O programa pede pela entrada de n meros at que o usu rio entre com o Flag 999 Os n meros s o armazenados no vetor num A cada n mero armazenado o contador do vetor incrementado para na pr xima itera o escrever na pr xima posi o do vetor Quando o us
113. s outras partes do programa 3 Qual a afirmativa falsa P g 55 a Se uma fun o n o retorna nada ela deve ser declarada como void b O retorno da fun o main feito para o sistema operacional c stdio h e string h cont m o prot tipo de algumas fun es da biblioteca do C d Fun es podem ser definidas dentro de outras fun es e Uma das op es anteriores falsa Qual a afirmativa verdadeira a stdio h e string h cont m o corpo de algumas fun es da biblioteca do C b Fun es podem ser chamadas por outras fun es c Em um programa C todas as fun es de um programa devem estar em um nico arquivo c d Vari veis declaradas em uma fun o s o acess veis por todas as outras fun es amnanatanaas e Nenhuma das op es anteriores 5 Qual a afirmativa verdadeira ET a palavra reservada auto utilizada para dizer que uma vari vel local autom tica Por m ela pode ser omitida dentro de uma fun o pois todas as vari veis s o locais por default Er b N o se pode utilizar vari veis com o mesmo nome em fun es diferentes Os par metros recebidos por uma fun o t m o mesmo endere o das vari veis usadas na chamada fun o Quando uma vari vel local tem o mesmo nome de uma vari vel global a vari vel local se torna inacess vel e a vari vel global acess vel E c E E e Nenhuma das op es anteriores 6 Qual a afirmativa falsa E a Os par m
114. seek Esta move o cursor no arquivo de um valor especificado a partir de um ponto especificado Seu prot tipo int fseek FILE fp long numbytes int origem O par metro de origem determina a partir de onde que os bytes de movimenta o ser o contados Os valores poss veis s o definidos por macros no arquivo cabe alho e s o Significado SEEK SET p ooa OOOO o SEEK CUR SEER END Tendo se definido a partir de onde 1r se contar numbytes determina quantos bytes de deslocamento ser dado na posi o atual 9 7 10 remove Prot tipo int remove char nome do arquivo Desmancha um arquivo especificado P g 66 O exerc cio da p gina anterior poderia ser reescrito usando se por exemplo fgets e fputs ou fwrite e fread A seguir apresentamos uma segunda vers o que se usa das fun es fgets e fputs e que acrescenta algumas inova es include lt stdio h include lt stdlib h include lt string h void main FILE p char str 30 frase 80 Este e um arquivo chamado respostalgtul LE T3 Le um nome para o arquivo a ser aberto printf nin Entre com um none pata o arquivo Na gets str if p fopen str w Caso ocorra algum erro na abertura do arquivo et o programa aborta automaticamente Printi Errol Impossivel abrir O Arquivo Na j exit 1 Se nao houve erro imprime no arquivo fecha fputs frase p tpurts strypo
115. seria if condi o declara o Volte para o comando if j Podemos ver que a estrutura while testa uma condi o Se esta for verdadeira a declara o executada e faz se o teste novamente e assim por diante Assim como no caso do for podemos fazer um loop infinito Para tanto basta colocar uma express o eternamente verdadeira na condi o Pode se tamb m omitir a declara o e fazer um loop sem conte do Vamos ver um exemplo do uso do while O programa abaixo espera que usu rio digitar a tecla q e s depois finaliza tinclude lt stdio h gt main char Ch Ch 0 while Ch q fflush NULL scanf c amp Ch 4 5 O Comando do while A terceira estrutura de repeti o que veremos o do while de forma geral do declara o while condi o Mesmo que a declara o seja apenas um comando uma boa pr tica deixar as chaves O ponto e v rgula final obrigat rio Vamos como anteriormente ver o funcionamento da estrutura do while por dentro declara o if condi o Volta para a declara o P g 29 Vemos pela an lise do bloco acima que a estrutura do while executa a declara o testa a condi o e se esta for verdadeira volta para a declara o A grande novidade no comando do while que ele ao contr rio do for e do while garante que a declara o ser executada pelo menos uma vez Um dos principais usos da extrutura do while em menus nos
116. setor divisivel main LPC num printi Entre com n mero Ty scanf Zd amp num if EPar num printer ANAT numero e Par ano else Princi Anno n mero e inpar i importante notar que como as fun es retornam valores podemos aproveit los para fazer atribui es Mas n o podemos fazer fune az D X Errado y No segundo exemplo ve mos o uso de mais de um return em uma fun o Fato importante se uma fun o retorna um valor voc n o precisa aproveitareste valor Se voc n o fizer nada com o valor de retorno de uma fun o ele ser descartado Por exemplo a fun o printf retorna um inteiro que n s nunca usamos para nada Ele descartado P g 48 7 3 Prot tipos de Fun es At agora nos exemplos apresentados escrevemos as fun es antes de escrevermos a fun o main Isto as fun es est o fisicamente antes da fun o main Isto foi feito por uma raz o Imagine se na pele do compilador Se voc fosse compilar a fun o main onde s o chamadas as fun es voc teria que saber com anteced ncia quais s o os tipos de retorno e quais s o os par metros das fun es para que voc pudesse gerar o c digo corretamente Foi por isto as fun es foram colocadas antes da fun o main quando o compilador chegasse fun o main ele j teria compilado as fun es e j saberia seus formatos Mas muitas vezes n o poderemos nos dar ao luxo de
117. sso curso Se quisermos que a fun o retorne algo devemos usar a declara o return Se n o quisermos basta declarar a fun o como tendo tipo de retorno void Devemos lembrar agora que a fun o main uma fun o e como tal devemos trat la O compilador acha que a fun o main deve retornar um inteiro Isto pode ser interessante se quisermos que o sistema operacional receba um valor de retorno da fun o main Se assim o quisermos devemos nos lembrar da seguinte conven o se o programa retornar zero significa que ele terminou normalmente e se o programa retornar um valor diferente de zero significa que o programa teve um termino anormal Se n o estivermos interessados neste tipo de coisa basta declarar a fun o main como retornando void As duas fun es main abaixo s o v lidas e n o geram mensagens de aviso main void t return 0 void main void Pronto Estamos livres daquelas mensagens de aviso 7 5 Arquivos Cabe alhos Arquivos cabe alhos s o aqueles que temos mandado o compilador incluir no in cio de nossos exemplos e que sempre terminam em h J vimos exemplos como stdio h conio h string h Eles na verdade n o possuem os c digos completos das fun es Eles s cont m prot tipos de fun es o que basta O compilador l estes prot tipos e baseado nas Informa es l contidas gera o c digo correto O corpo das fun es cujos prot tipos est o no arquivo cabe
118. st no arquivo cabe alho stdio h ou stdlib h dependendo do seu compilador Podemos declarar um ponteiro de arquivo da seguinte maneira FILE p p ser ent o um ponteiro para um arquivo usando este tipo de ponteiro que vamos poder manipular arquivos no C 9 5 1 fopen Esta a fun o de abertura de arquivos Seu prot tipo FILE fopen char nome do arquivo char modo O nome do arquivo determina qual arquivo dever ser aberto Este nome deve ser v lido no sistema operacional que estiver sendo utilizado O modo de abertura diz fun o fopen que tipo de uso voc vai fazer do arquivo A tabela abaixo mostra os valores de modo v lidos a fecais no fm do ago lapa O O oooO rb Abre um arquivo bin rio para leitura wb Cria um arquivo bin rio para escrita ab Acrescenta dados bin rios no fim do arquivo Abre um arquivo para leitura e escrita Cria um arquivo para leitura e escrita P g 63 Acrescenta dados ou cria uma arquivo para leitura e escrita Abre um arquivo bin rio para leitura e escrita Cria um arquivo bin rio para leitura e escrita 2 Acrescenta dados ou cria uma arquivo bin rio para leitura e escrita Abre um arquivo texto para leitura Acrescenta dados no fim do arquivo texto Abre um arquivo texto para leitura e escrita Cria um arquivo texto para leitura e escrita Acrescenta dados ou cria uma arquivo texto para leitura e escrita Poder amos ent o para abrir um arq
119. sto tem a ver com a inicializa o de ponteiros que para uma string que vamos usar v rias vezes podemos fazer char stri String constante A poder amos em todo lugar que precisarmos da string usar a vari vel strl Devemos apenas tomar cuidado ao usar este ponteiro Se o alterarmos vamos perder a string Se o usarmos para alterar a string podemos facilmente corromper o banco de strings que o compilador criou Mais uma vez fica o aviso ponteiros s o poderosos mas se usados com descuido podem ser uma tima fonte de dores de cabe a 6 5 Ponteiros para Ponteiros Um ponteiro para um ponteiro como se voc anotasse o endere o de um papel que tem o endere o da casa do seu amigo Podemos declarar um ponteiro para um ponteiro com a seguinte nota o tipo da vari vel nome da vari vel Algumas considera es nome da vari vel o conte do final da vari vel apontada nome da vari vel o conte do do ponteiro intermedi rio P g 44 No podemos declarar ponteiros para ponteiros para ponteiros ou ent o ponteiros para ponteiros para ponteiros para ponteiros UFA e assim por diante Para fazer isto n o me pergunte a utilidade disto basta aumentar o n mero de asteriscos na declarac o A l gica a mesma 6 6 Cuidados a Serem Tomados ao se Usar Ponteiros O principal cuidado ao se usar um ponteiro deve ser saiba sempre para onde o ponteiro est apontando Isto inclui nunca use um pontei
120. tanto usamos a fun o scanf A string d diz fun o que iremos ler um inteiro O segundo par metro passado fun o diz que o dado lido dever ser armazenado na vari vel Dias importante ressaltar a necessidade de se colocar um amp antes do nome da vari vel a ser lida quando se usa a fun o scanf O motivo disto s ficar claro mais tarde Observe que no C quando temos mais de um par metro para uma fun o eles ser o separados por v rgula Temos ent o uma express o matem tica simples que atribui a Anos o valor de Dias dividido por 365 25 Como Anos uma vari vel float o compilador far uma convers o autom tica entre os tipos das vari veis veremos isto com detalhes mais tarde P g 7 A segunda chamada fun o printf tem tr s argumentos A string nin d dias equivalem a f anos n diz fun o para dar dois retornos de carro passar para a pr xima linha e depois para a subsequente colocar um Inteiro na tela colocar a mensagem dias equivalem a colocar um ponto flutuante na tela colocar a mensagem anos e dar mais um retorno de carro Os outros par metros s o as vari veis das quais devem ser lidos os valores do inteiro e do float respectivamente 2 3 Introdu o s fun es Uma fun o um bloco de c digo de programa que pode ser usado diversas vezes em sua execu o O uso de fun es permite que o programa fique mais leg vel mais bem estruturado Um programa em C
121. u rio digita o flag o programa abandona o primeiro loop e armazena o total de n meros gravados Por fim todos os n meros s o impressos bom lembrar aqui que nenhuma restri o feita quanto a quantidade de n meros digitados Se o usu rio digitar mais de 100 n meros o programa tentar ler normalmente mas o programa os escrever em uma parte n o alocada de mem ria pois o espa o alocado foi para somente 100 inteiros Isto pode resultar nos mais variados erros no instante da execu o do programa 5 2 Strings Strings s o vetores de chars Nada mais e nada menos As strings s o o uso mais comum para os vetores Devemos apenas ficar atentos para o fato de que as strings t m o seu ltimo elemento como um 0 A declara o geral para uma string char nome da string tamanho Devemos lembrar que o tamanho da string deve incluir o 0 final A biblioteca padr o do C possui diversas fun es que manipulam strings Estas fun es s o teis pois n o se pode por exemplo igualar duas strings stringi strino2 NAO faca isto Fazer isto um desastre Quando voc terminar de ler a se o que trata de ponteiros voc entender porqu As strings devem ser igualadas elemento a elemento Quando vamos fazer programas que tratam de string muitas vezes podemos fazer bom proveito do fato de que uma string termina com NO isto o n mero inteiro 0 Veja por exemplo o programa abaixo que serve para igualar duas
122. uivo bin rio escrever FILE fp fp fopen exemplo bin wb if fp printf Erro na abertura do arquivos A condi o Hp testa se o arquivo foi aberto com sucesso porque no caso de um erro a fun o fopen retorna um ponteiro nullo NULL 9 5 2 exit Aqui abrimos um par nteses para explicar a fun o exit cujo prot tipo void exit int codigo de retorno Esta fun o aborta a execu o do programa Pode ser chamada de qualquer ponto no programa e faz com que o programa termine e retorne para o sistema operacional o c digo de retorno A conven o mais usada que um programa retorne zero no caso de um t rmino normal e retorne um n mero n o nulo no caso de ter ocorrido um problema A fun o exit se torna importante em casos como aloca o din mica e abertura de arquivos pois pode ser essencial que uma determinada mem ria seja alocada ou que um arquivo seja aberto Poder amos reescrever o exemplo da se o anterior usando agora o exit para garantir que o programa n o deixar de abrir o arquivo include lt stadaro h main void FILE fp fp fopen exemplo bin wb if fp printi Erro na abertura do arquivo Fim de programa jj exit 1 return 0 9 5 3 fclose Quando abrimos um arquivo devemos fech lo Para tanto devemos usar a fun o felose int fEeclose FILE Wp importante que se perceba que se deve tomar o maior cuidado para n o se perder o pont
123. ult goto sizeof volatile do 1f static while 2 8 Auto avalia o on line aulas 1 e 2 Responda as perguntas abaixo escolhendo a alternativa adequada para cada quest o Voc pode atingir at a nota 100 Sendo que cada quest o certa vale 8 3 pontos 1 A linguagem C tem este nome porque foi a sucessora da linguagem B E a Verdadeiro E b Falso 2 EmcC vari veis com nomes abc e Abc representam a mesma vari vel Er a Verdadeiro Ec b Falso 3 O programa finclude lt stdio h gt main P g 13 A A A A A A na na AA anan E A o dd EI A 10 11 InG X scantf Zd amp x princi ad s L uma vari vel pelo teclado e a imprime na tela a Verdadeiro b Falso A instru o include lt stdio h gt no programa anterior colocada para que possamos utilizar as fun es scanf e printf a Verdadeiro b Falso Os coment rios na linguagem C s podem ter uma linha de comprimento a Verdadeiro b Falso Uma string uma seq ncia de caracteres terminada com um AO Uma string pode ser armazenada em um vetor de caracteres a Verdadeiro b Falso Sendo 1 uma vari vel inteira a seguinte chamada a scanf v lida scanf da i a Verdadeiro b Falso O que faz o seguinte programa em C include lt stdio h gt main t int i 25 printf n O valor de i d Nada a b Imprime O valor de i 2 c Imprime O valor de i d d
124. um papel em branco onde vai anotar o endere o da firma O papel um ponteiro do tipo firma Voc ent o liga para a firma e pede o seu endere o o qual voc vai anotar no papel Isto equivalente no C a associar o papel firma com o operador amp Ou seja o operador amp aplicado firma equivalente a voc ligar para a mesma e pedir o endere o Uma vez de posse do endere o no papel voc poderia por exemplo fazer uma visita firma No C voc faz uma visita firma aplicando o operador ao papel Uma vez dentro da firma voc pode copiar seu conte do ou modific lo Uma observa o importante apesar do s mbolo ser o mesmo o operador multiplica o n o o mesmo operador que o refer ncia de ponteiros Para come ar o primeiro bin rio e o segundo un rio pr fixado P g 40 Aqui v o dois exemplos de usos simples de ponteiros tinclude lt stdio h gt main t int num valor int Pp num 55 p amp num Pega o endereco de num valor p Valor e igualado a num de uma maneira indireta printf aimed on valor printf Endereco para onde o ponteiro aponta pin p printf Valor da variavel apontada Sdin p tinclude lt stdio h gt main inct num p num 55 p amp num Pega o endereco de num printf inValor inicial Sadia num p 100 Muda o valor de num de uma maneira indireta printf Mnvalor final d n num Nos ex
125. utros modulos Isto util se quisermos isolar peda os de um programa para evitar mudan as acidentais em vari veis globais Vari veis locais static s o vari veis cujo valor mantido de uma chamada da fun o para a outra Veja o exemplo P g 69 int count void static int num 0 numt return num A fun o count retorna o n mero de vezes que ela j foi chamada Veja que a vari vel local int inicalizada Esta inicializa o s vale para a primeira vez que a fun o chamada pois num deve manter o seu valor de uma chamada para a outra O que a fun o faz incrementar num a cada chamada e retornar o seu valor A melhor maneira de se entender esta vari vel local static implementando Veja por si mesmo executando seu pr prio programa que use este conceito 10 2 4 register O computador tem a mem ria principal e os registradores da CPU As vari veis assim como o programa como um todo s o armazena dos na mem ria O modificador register diz ao compilador que a vari vel em quest o deve ser se poss vel usada em um registrador da CPU Vamos agora ressaltar v rios pontos importantes Em primeiro lugar porque usar o register Vari veis nos registradores da CPU v o ser acessadas em um tempo muito menor pois os registradores s o muito mais r pidos que a mem ria Em segundo lugar em que tipo de vari vel usar o register O registern o pode ser usado em vari veis globais Isto implicaria qu

Download Pdf Manuals

image

Related Search

Related Contents

A1610E on DAHDI User Manual  Instruction Manual  Le compte rendu standardisé en pathologie  Black & Decker 1VPX Instruction Manual  Guia de Instalação de Debian GNU/Linux  Téléchargement  Fujitsu 280X1024@75Hz User's Manual  Ver ficha técnica    

Copyright © All rights reserved.
Failed to retrieve file