Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem...

245
1 Curso de Linguagem C Curso de Linguagem C Rodolfo Jardim de Azevedo Instituto de Computação UNICAMP

Transcript of Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem...

Page 1: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

1 Curso de Linguagem C

Curso de Linguagem C

Rodolfo Jardim de AzevedoInstituto de Computação

UNICAMP

Page 2: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

2 Curso de Linguagem C

Programação Estruturada

n A linguagem C é uma linguagem estruturadaem bloco simples. Uma característicadistintiva de uma linguagem estruturada embloco é a compartimentalização de seucódigo e de seus dados, que é a habilidadede uma linguagem tem de seccionar eesconder do resto do programa todas asinstruções necessárias para a realização deuma determinada tarefa.

Page 3: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

3 Curso de Linguagem C

Declaração de variáveis

n Variáveis devem ser declaradas antesde serem usadas, permitindo assim,que o compilador saiba de antemãoinformações como tipo e espaço gastoem memória podendo fazer checagemdurante o processo de compilação.

Page 4: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

4 Curso de Linguagem C

Funções - Blocos de código

n Utilizando funções, é possível esconderparte do código e variáveis, evitandoassim, que sejam gerados efeitoscolaterais em outras partes doprograma. Desta forma, é necessáriosaber apenas o que as rotinas fazem, enão como elas fazem.

Page 5: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

5 Curso de Linguagem C

Laços

n Os programas passam a maior parte dotempo repetindo tarefas até que umacondição seja satisfeita (ou um númerofixo de vezes). Desta forma, fica maisfácil a programação e eliminam-se osinconvenientes gerados por váriosgotos espalhados pelo programa.

Page 6: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

6 Curso de Linguagem C

Testes de condições

n Numa linguagem estruturada, os testesde condições são amplamenteutilizados, tanto como controle de laços,quanto para execuções condicionais deblocos de código.

Page 7: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

7 Curso de Linguagem C

A linguagem C

n Surgiu nos anos 70 de uma linguagem chamadaB. Criada por Dennis Ritchie. Emborahouvessem poucas divergências entre asprimeiras implementações em nível de código-fonte, foi desenvolvido o padrão ANSI sendoassim, qualquer programa C ANSI pode sercompilado em qualquer compilador C ANSI nãoimportando a máquina na qual o programa vá serexecutado. Por isso, quando se querportabilidade, a escolha acaba recaindo sobre alinguagem C.

Page 8: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

8 Curso de Linguagem CLinguagem feita paraprogramadores

n Ao contrário do que possa parecer, nemtodas as linguagens foram feitas paraprogramadores. C é virtualmente única,porque ela foi criada, influenciada e testadaem campo por programadores. Ela ofereceao programador exatamente o que ele quer:poucas restrições e queixas, código rápido eeficiência. Por isso ela é a linguagem maispopular entre os programadores profissionaisaltamente qualificados.

Page 9: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

9 Curso de Linguagem C

Sensível ao caso

n A linguagem C é sensível ao caso, istoquer significa que letras maiúsculas eminúsculas são tratadas comocaracteres separados.

Page 10: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

10 Curso de Linguagem C

Programa exemplo

/* Este é o primeiro programa */ #include <stdio.h> main() { printf(“Alo mundo\n”); }n Este é um exemplo bem simples, mas que mostra

alguns componentes básicos que existem nosprogramas feitos em C. Nele vemos:

Page 11: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

11 Curso de Linguagem C

/* Este é o primeiro programa */

n Esta linha é um comentário.

Page 12: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

12 Curso de Linguagem C

#include <stdio.h>

n Indica a inclusão de arquivos dentro doprograma atual (neste caso, o arquivostdio.h). Normalmente são arquivoscabeçalhos contendo declarações detipos e protótipos de funções. Serãovistos mais tarde.

Page 13: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

13 Curso de Linguagem C

main()

n Todo programa em C tem que ter afunção main, é na primeira linha destafunção que o programa começa a serexecutado e quando a última linha forexecutada, o programa será encerrado.

Page 14: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

14 Curso de Linguagem C

{

n Inicia um bloco de código.

Page 15: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

15 Curso de Linguagem C

printf(“Alo mundo\n”);

n Chamada a uma função em C. A funçãoprintf é utilizada para imprimir umamensagem na tela, neste caso, amensagem Alo mundo que é chamadode parâmetro passado à função.

Page 16: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

16 Curso de Linguagem C

}

n Encerra um bloco de código.

Page 17: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

17 Curso de Linguagem C

Blocos de código

n Por ser uma linguagem estruturada, alinguagem C permite a criação de blocos decódigo. Um bloco de código é um grupo decomandos de programa conectadoslogicamente que o computador trata comouma unidade. Para criar um bloco de código,coloque uma seqüência de comandos entrechaves, como pode ser visto no programaexemplo, as linhas 5, 6 e 7 representam umbloco de código.

Page 18: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

18 Curso de Linguagem C

Ponto e vírgula

n O ponto e vírgula é um terminador decomandos, por isso, todos oscomandos devem ser terminados porum. Desta forma, podemos ter várioscomandos numa mesma linha sendocada um terminado com um ponto evírgula.

Page 19: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

19 Curso de Linguagem C

Chaves

n Todo bloco de código escrito em Cdeve vir entre chaves. Não é necessáriocolocar um ponto e vírgula depois defechar chaves pois cada comandodentro do bloco já possui o seuterminador.

Page 20: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

20 Curso de Linguagem C

Comentários

n Na linguagem C, os comentários sãodelimitados por /* e */ como pode servisto na primeira linha do programaanterior. Não é permitido colocarcomentários aninhados. Oscomentários podem vir em qualquerposição do programa e não apenas emlinhas separadas. Eles também podemcomeçar em uma linha e terminar emoutra.

Page 21: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

21 Curso de Linguagem C

Palavras reservadas

n Como todas as outras linguagens deprogramação, C consiste em palavrasreservadas e em regras de sintaxe que seaplicam a cada palavra reservada. Umapalavra reservada é essencialmente umcomando, e na maioria das vezes, aspalavras reservadas de uma linguagemdefinem o que pode ser feito e como seráfeito. O padrão ANSI C especifica asseguintes palavras reservadas:

Page 22: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

22 Curso de Linguagem C

Palavras reservadas

auto double int structbreak else long switchcase enum register typedefchar extern return unionconst float short unsignedcontinue for signed voiddefault goto sizeof volatiledo if static while

Page 23: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

23 Curso de Linguagem CVariáveis, constantes,operadores e expressões

n Por ser uma linguagem estruturada, emC, as variáveis devem ser declaradasantes de serem usadas, permitindoassim, que o compilador façachecagens em tempo de compilação.

Page 24: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

24 Curso de Linguagem C

Identificadores

n Identificadores são nomes usados parase fazer referência a variáveis, funções,rótulos e vários outros objetos definidospelo usuário. Um identificador pode terde um a vários caracteres. O primeirodeve ser uma letra ou um sublinhado, eos caracteres subseqüentes deve sermletras, números ou um sublinhado.

Page 25: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

25 Curso de Linguagem C

Tipos de dados

n Em C, existem 5 tipos de dadosbásicos: caracter, inteiro, pontoflutuante, ponto flutuante de duplaprecisão e sem valor. As palavrasreservadas para declarar variáveisdestes tipos são char, int, float, doublee void respectivamente. Veja na tabelaa seguir o espaço gasto por cada umdestes tipos assim como seus limitesem máquinas IBM PC compatíveis.

Page 26: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

26 Curso de Linguagem C

Tipos de dados

Tipo Extensãoem bits

Escala

char 8 -128 a 127int 16 -31768 a 32767float 32 3.4E-38 a 3.4E+38double 64 1.7E-308 a 1.7E308void 0 sem valor

Page 27: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

27 Curso de Linguagem C

Modificadores de tipo

n Com exceção de void, os tipos de dados básicostêm vários modificadores que os precedem. Omodificador é usado para alterar o significado dotipo-base para que ele se adapte da maneiramais precisa às necessidades das váriassituações. Eis aqui uma lista dos modificadores:signed, unsigned, long, short. Os dois primeirosmodificadores indicam a existência ou não desinal enquanto os outros dois são relativos aotamanho de memória necessário para armazenaro valor de um elemento deste tipo.

Page 28: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

28 Curso de Linguagem C

Modificadores de tipo

Tipo Extensão em bitschar 8int 16

short int 16long int 32

float 32short float 32long float 64double 64

short double 64long double 80

Page 29: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

29 Curso de Linguagem C

Declarando variáveis

n Uma declaração de variável deve seguira seguinte regra:

tipo lista_variáveis;

n onde tipo deve ser um tipo válido em Ce lista_variáveis pode consistir em umou mais identificadores separados porvírgula.

Page 30: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

30 Curso de Linguagem CExemplos de declaração devariável

n int i, j, l;n short int si;n unsigned int ui;n long inteiro_grande;n double balanco, lucro, prejuizo;

Page 31: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

31 Curso de Linguagem C

Onde declarar?

n Existem 3 lugares em um programa Conde as variáveis podem serdeclaradas.

Page 32: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

32 Curso de Linguagem C

Variável global

n O primeiro lugar é fora de todas asfunções, incluindo a função main(). Avariável decalrada dessa maneira échamada variável global e pode serusada em qualquer parte do programa.

Page 33: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

33 Curso de Linguagem C

Variável local

n O segundo lugar é dentro de umafunção. Estas variáveis são chamadasvariáveis locais e podem ser usadassomente pelos comandos queestiverem na mesma função.

Page 34: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

34 Curso de Linguagem C

Parâmetro (argumento)

n O último lugar onde as variáveis podemser declaradas é na declaração dosparâmetros formais de uma função,embora as variáveis aqui declaradassejam utilizadas para receber osargumentos quando a função échamada, eles podem ser utilizadoscomo outra variávei qualquer.

Page 35: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

35 Curso de Linguagem C

Programa exemplo:

/* soma os números de 0 a 9 */ int soma; /* Variável global */ main() { int cont; /* Variável local */ soma = 0; /* inicializa variável soma */ for (cont = 0; cont < 10; cont ++) { total(cont); display(); } }

Page 36: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

36 Curso de Linguagem C

Função total()

/* acumula no total parcial */

total(x) int x; /* Parâmetro formal */

{ soma = x + soma;

}

Page 37: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

37 Curso de Linguagem C

Função display()

display()

{ int cont; /* Variável local */

/* esta variável cont é diferente daquela declarada em main() */

for(cont = 0; cont < 10; cont ++) printf(“-”);

printf(“A soma atual é %d”, soma); }

Page 38: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

38 Curso de Linguagem C

Comentários

n Neste exemplo, qualquer função do programapode acessar a variável global soma. Porémtotal() não pode acessar diretamente a variávellocal cont em main(), que deve passar cont comoum argumento. Isto é necessário porque umavariável local só pode ser usada pelo código queestá na mesma função na qual ela é declarada.Observe que cont em display() é completamenteseparada de cont em main(), novamente porqueuma variável local é conhecida apenas pelafunção na qual ela é declarada.

Page 39: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

39 Curso de Linguagem C

Inicialização de variáveis

n Nós vimos que em main() existe uma linhasomente para inicializar a variável soma, estalinha poderia ser suprimida se a variávelfosse declarada

int soma = 0;

n Desta forma, podemos inicializar variáveis nomomento de sua declaração, o que facilitamuito a escrita do programa além de reduziro seu tamanho.

Page 40: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

40 Curso de Linguagem C

Constantes

n Constantes são valores fixos que oprograma não pode alterar.

Page 41: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

41 Curso de Linguagem C

Exemplos de Constantes

Tipo de dado Exemplo

char ‘a’ ‘n’ ‘9’int 1 123 2100 -234

long int 35000 -34short int 10 -12 90

unsigned int 10000 987 40000float 123.23 4.34E-3

double 123.23 12312333 -0.9876

Page 42: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

42 Curso de Linguagem C

Constantes hexadecimais e octais

n Podem ser declaradas constantes emhexadecimal ou octal conforme oexemplo a seguir:int hex = 0xFF; /* 255 em decimal *//* as constantes em hexadecimal devem

ser precedidas por 0x */int oct = 011; /* 9 em decimal */

/* as constantes em octal devem ser precedidas por 0 */

Page 43: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

43 Curso de Linguagem C

Constantes strings

n Uma string é um conjunto de caracteresentre aspas. Por exemplo, “esta é umastring” é uma string. Não confundirstrings com caracteres, ‘a’ é umcaracter enquanto “a” é uma string.

Page 44: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

44 Curso de Linguagem C

Constantes com barras invertidas

n Existem alguns caracteres que nãopodem ser representados no textocomum, as constantes com barrainvertida servem para representar estescaracteres.

Page 45: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

45 Curso de Linguagem C

Constantes com barras invertidas

Código Significado\b retrocesso\f avanço de página\n mudança de linha\r retorno de carro\t tab horizontal\” aspas duplas\’ aspas simples\0 ASCII 0\\ barra invertida\v tab vertical\a alerte (beep)\x constante hexadecimal

Page 46: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

46 Curso de Linguagem C

Operadores

n A linguagem C é muito rica emoperadores. Os operadores sãodivididos em 3 categorias gerais:aritméticos, de relação e lógicos e bit abit. Além desses, C tem operadoresespeciais para tarefas particulares.

Page 47: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

47 Curso de Linguagem C

Operadores aritméticos

Operador Ação- subtração, também menos unário+ adição* multiplicação/ divisão

% resto da divisão-- decremento++ incremento

Page 48: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

48 Curso de Linguagem C

Exemplo:

main(){

int x = 10, y = 3;printf(“%d\n”, x / y); /* exibirá 3 */printf(“%d\n”, x % y); /* exibirá 1, o resto da divisão de inteiros */x = 1;y = 2;printf(“%d %d\n”, x / y, x % y);/* exibirá 0 e 1 */

Page 49: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

49 Curso de Linguagem C

Exemplo (continuação)

x ++;printf(“%d\n”, x); /* exibirá 2*/printf(“%d %d\n”, x++, ++y);/* exibirá 2 e 3 *//* neste caso, x só é incrementado depois que ocomando é executado enquando y é incrementado antes */

}

Page 50: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

50 Curso de Linguagem C

Operadores de relação

Operador Ação

> maior que

>= maior ou igual a

< menor que

<= menor ou igual a

== igual a

!= não igual a

Page 51: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

51 Curso de Linguagem C

Operadores lógicos

Operador Ação&& AND

|| OR! NOT

Page 52: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

52 Curso de Linguagem C

Observação

n Em C, o número 0 representa falso equalquer número não-zero éverdadeiro, assim, os operadoresanteriores retornam 1 para verdadeiro e0 para falso.

Page 53: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

53 Curso de Linguagem C

Operador de atribuição

n O operador = é o operador deatribuição. Ao contrário de outraslinguagens, C permite que o operadorde atribuição seja usado emexpressões com outros operadores.int a, b, c;a = b = c = 1; /* atribui 1 às 3 variáveis */((a = 2 * b) > c) /* a = 2 e a comparação

resulta em 1 */

Page 54: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

54 Curso de Linguagem C

Expressões

n Os operadores, as constantes e asvariáveis são os componentes dasexpressões. Uma expressão em C équalquer combinação válida dessescomponentes.

Page 55: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

55 Curso de Linguagem C

Conversões de tipos

n Quando você mistura constantes evariáveis de tipos diferentes em umaexpressão, C as converte para omesmo tipo. O compilador C converterátodos os operandos para o tipo domaior operando, uma operação de cadavez, conforme descrito nestas regras deconversão de tipo:

Page 56: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

56 Curso de Linguagem C

Regra 1

n Todo char e short int é convertido paraint. Todo float é convertido para double.

Page 57: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

57 Curso de Linguagem C

Regra 2

n Para todos os pares de operandos,ocorre o seguinte, em seqüência: se umdos operandos for um long double, ooutro será convertido para long double.Se um dos operandos for double, ooutro será convertido para double. Seum dos operandos for long, o outro seráconvertido para long. Se um dosoperandos for unsigned, o outro seráconvertido para unsigned.

Page 58: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

58 Curso de Linguagem C

Type cast

n Pode-se forçar o compilador a efetuardeterminada conversão utilizando-seum type cast que tem a seguinte forma:(tipo) expressão

Page 59: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

59 Curso de Linguagem C

Exemplo:

main(){

int x = 3;printf(“%f %f\n”, (float) x / 2, (float) (x / 2));

/* serão impressos na tela 1.5 e 1.0 pois no primeirocaso, x é convertido para float e depois é dividido, jáno segundo, somente o resultado é convertido parafloat */

}

Page 60: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

60 Curso de Linguagem C

Modificadores de acesso

n Os modificadores de acesso informamsobre como será feito o acesso àvariável.

Page 61: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

61 Curso de Linguagem C

Register

n Sempre que uma variável for declaradado tipo register, o compilador fará omáximo possível para mante-la numdos registradores do microprocessador,acelerando assim o acesso a seu valor.É pratica comum, declarar as variáveisde controle de loop como sendoregister.

Page 62: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

62 Curso de Linguagem C

Static

n Variáveis static são variáveis existemdurante toda a execução do programa,mas só podem ser acessadas de dentrodo bloco que a declarou.

Page 63: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

63 Curso de Linguagem C

Exemplo:

/* Exemplo de variável static */main(){

printf(“%d\n”, numero()); /* imprimirá 0 */printf(“%d\n”, numero()); /* imprimirá 1 */

}numero(){

static valor = 0; /* atribuição só executada 1 vez */return valor ++;

}

Page 64: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

64 Curso de Linguagem C

printf()

n Rotina de finalidade geral para saídapelo console

n A função printf() serve para mostrarmensagens na tela. Sua forma geral é

printf(“string de controle”, lista argumentos);

Page 65: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

65 Curso de Linguagem C

“string de controle”

n A string de controle consiste em doistipos de itens:Caracteres que a função imprimirá na tela

Comandos de formatação

Page 66: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

66 Curso de Linguagem C

Comandos de formatação

n Todos os comandos de formataçãocomeçam por % que é seguido pelocódigo de formatação

n Deve haver exatamente o mesmonúmero de argumentos quanto forem oscomandos de formatação e eles devemcoincidir em ordem

Page 67: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

67 Curso de Linguagem C

Comandos de formatação

Código Formato%c um único caracter%d decimal%i decimal%e notação científica%f ponto decimal flutuante%g usa %e ou %f - aquele que for menor%o octal%s string de caracteres%u decimal sem sinal%x hexadecimal%% sinal %%p exibe um ponteiro%n o argumento associado será um ponteiro inteiro no

qual será colocado o número de caracteres escritosaté o momento

Page 68: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

68 Curso de Linguagem C

Comprimento mínimo do campo

n Para especificar o comprimento mínimo queum campo poderá ter, basta colocar uminteiro entre o sinal % e o comando deformatação. Observe que este é ocomprimento mínimo e que o campo podeocupar um espaço maior.

Exemplo Função%3d inteiro com pelo menos 3 dígitos (preenchido

com espaços)%03d inteiro com pelo menos 3 dígitos (preenchido

com zeros)%5s string com pelo menos 5 caracteres

Page 69: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

69 Curso de Linguagem C

Número de casas decimais

n Para especificar o número de casasdecimais, coloque um ponto decimalapós o especificador de largura mínimado campo e depois dele, o número decasas decimais que deverão serexibidas.

Exemplo Função%7.2f Usar 2 casas decimais

Page 70: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

70 Curso de Linguagem C

Comprimento máximo

n Quando o formato de casas decimais écolocado em strings, o número decasas decimais passa a serconsiderado como comprimentomáximo do campo.

Exemplo Função%5.7s string com no mínimo 5 e no

máximo 7 caracteres

Page 71: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

71 Curso de Linguagem C

Número mínimo de dígitos

n Quando o formato de casas decimais éaplicado em inteiros, o especificador decasas decimais será utilizado comonúmero mínimo de dígitos

Exemplo Função%7.6d 7 caracteres no mínimo e 6

dígitos no mínimo

Page 72: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

72 Curso de Linguagem C

Alinhamento

n Por padrão, todo resultado é alinhado àdireita, para inverter este padrão, utilizeum sinal de menos (-) antes deespecificar o tamanho.

Exemplo Função%-5d 5 caracteres alinhados à

esquerda%-10s 10 caracteres alinhados à

esquerda

Page 73: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

73 Curso de Linguagem C

Modificadores de formatação

n Podemos usar modificadores parainformar sobre a leitura de shorts(modificador h) ou longs (modificador l)

Exemplo Função%hd Imprime um short int%ld Imprime um long int

Page 74: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

74 Curso de Linguagem C

Exemplos

Comando printf() Resultado(“%-5.2f”, 123.234) 123.23(“%5.2f”, 3.234) 3.23(“%10s”, “alo”) alo(“%-10s”, “alo”) alo(“%5.7s”, “123456789”) 1234567(“%5.4d”, 123) 0123

Page 75: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

75 Curso de Linguagem C

scanf()

n Rotina de finalidade geral para entradapelo console

n A função scanf() serve para lerinformações do teclado. Sua formageral é

scanf(“string de controle”, lista argumentos);

Page 76: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

76 Curso de Linguagem C

“string de controle”

n A string de controle consiste em trêsclassificações de caracteres:Especificadores de formato

Caracteres brancosCaracteres não-brancos

Page 77: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

77 Curso de Linguagem C

Especificadores de formato

n Todos os especificadores de formatocomeçam por % que é seguido por umcaracter que indica o tipo de de dadoque será lido

n Deve haver exatamente o mesmonúmero de argumentos quanto forem osespecificadores de formato e elesdevem coincidir em ordem

Page 78: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

78 Curso de Linguagem C

Especificadores de formato

Código Lê%c único caracter%d decimal%i decimal%e número com ponto flutuante%f numero com ponto decimal flutuante%o número octal%s string de caracteres%x hexadecimal%p ponteiro%n recebe um valor inteiro igual ao número de

caracteres lidos até o momento

Page 79: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

79 Curso de Linguagem C

Caracter branco

n Um caracter branco na string decontrole faz com que scanf() passe porcima de um ou mais caracteres brancosna string de entrada

n Um caracter branco é um espaço, umtab ou um \n

Page 80: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

80 Curso de Linguagem C

Caracter não branco

n Um caracter não branco na string decontrole faz com que scanf() leia edesconsidere um caracter coincidente.Se o computador não encontrar ocaracter especificado, scanf terminará

n O comando “%d,%d” fará com quescanf leia um inteiro, depois leia edesconsidere uma vírgula e finalmente,leia um outro inteiro

Page 81: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

81 Curso de Linguagem C

Como chamar scanf()

n Todas as variáveis usadas para recebervalores através de scanf() devem serpassadas por seus endereços. Sequiser ler a variável cont, utilizescanf(“%d”, &cont);

n Como strings são representadas porvetores, NÃO deve ser colocado o &antes do nome da variável

Page 82: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

82 Curso de Linguagem C

Ignorar entrada

n Colocar um * entre o % e o código deformatação fará com que scanf() leiadados do tipo especificado massuprimirá suas atribuições. Desta formascanf(“%d%*c%d”, &x, &y)

n dada a entrada 10/20, coloca 10 em x,desconsidera o sinal de divisão ecoloca 20 em y

Page 83: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

83 Curso de Linguagem C

Comprimento máximo do campo

n Para especificar o comprimento máximo queum campo poderá ter, basta colocar uminteiro entre o sinal % e o comando deformatação. Os caracteres que sobraremserão utilizados nas próximas chamadas ascanf(). Caso não queira ler mais do que 20caracteres na string nome, utilizescanf(“%20s”, nome);

Page 84: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

84 Curso de Linguagem C

Espaços, tabs e \n

n Servem como separadores quando nãoestiverem sendo lidos caracteres. Sãolidos e atribuídos quando for pedido umcaracter de entrada. Caso o comandoscanf(“%c%c%c”, &a, &b, &c);

n seja lido com a entradax y

n scanf retornará com x em a, espaço emb e y em c

Page 85: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

85 Curso de Linguagem C

Comandos de controle de fluxo

n Os comandos de controle de fluxo são abase de qualquer linguagem.

n A maneira como eles são implementadosafeta a personalidade e percepção dalinguagem.

n C tem um conjunto muito rico e poderoso decomandos de controle de fluxo.

n Eles se dividem em comandos de teste decondições e comandos de controle de loop.

Page 86: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

86 Curso de Linguagem C

Comandos de testes de condições

n Estes comandos avaliam uma condiçãoe executam um bloco de código deacordo com o resultado. São eles:• if• switch

Page 87: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

87 Curso de Linguagem C

if

n O comando if serve para executarcomandos de acordo com umadeterminada condição

n A forma geral do comando if éif (condição) comando;

else comando;

n onde a parte else é opcional

Page 88: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

88 Curso de Linguagem C

Exemplo/* programa do número mágico */#include <stdlib.h>main(){

int magico, adivinhacao;magico = rand() % 10; /* gerar um número */printf(“Adivinhe o número: ”);scanf(“%d”, &adivinhacao);if (adivinhacao == magico)

printf(“** número certo **”);else

printf(“-- número errado --”);}

Page 89: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

89 Curso de Linguagem C

if aninhados

n C permite que sejam colocadoscomandos if dentro de outros comandosif. A isto chamamos de if aninhados.

n Quando se trata de if aninhados, ocomando else se refere ao if maispróximo que não possui um comandoelse. Tanto o if quanto o else devemestar dentro do mesmo bloco de código.

Page 90: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

90 Curso de Linguagem C

Exemplos

if (x)if (y) printf(“1”);else printf(“2”);

n Neste caso, o elsepertence aosegundo if.

if (x) {if (y) printf(“1”);

}else printf(“2”);

n Neste caso, o elsepertence ao primeiroif.

Page 91: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

91 Curso de Linguagem C

if-else-if

n É muito comum encontrar programasque possuem uma “escada” if-else-if daseguinte forma:if (condição)

comando;

else if (condição)comando;

elsecomando;

Page 92: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

92 Curso de Linguagem C

Avaliação do if-else-if

n O computador avalia as expressõescondicionais de cima para baixo. Assimque encontra uma condição verdadeira,ele executa o comando associado a elae passa por cima do resto da “escada”.

n Se nenhuma condição for verdadeira, ocomputador executará o else final.

Page 93: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

93 Curso de Linguagem C

A expressão condicional

n Qualquer expressão válida em C podeservir como expressão condicional.Veja o exemplo:/* dividir o primeiro número pelo segundo */main(){

int a, b;printf(“Digite dois números: “);scanf(“%d %d”, &a, &b);if (b) printf(“%d\n”, a/b);else printf(“não posso diridir por zero\n”);

}

Page 94: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

94 Curso de Linguagem C

switch

n Embora o if-else-if possa executar váriostipos de testes, o código pode ficar muitodifícil de ser seguido.

n C possui um comando de vários desvioschamado switch.

n No switch, o computador testa uma variávelsucessivamente contra uma lista deconstantes inteiras ou de caracteres eexecuta um comando ou bloco de comandosquando encontrar uma coincidência.

Page 95: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

95 Curso de Linguagem C

Forma geral do switch

switch (variável) {case constante1:

seqüência de comandosbreak;

case constante2:seqüência de comandosbreak;

default:seqüência de comandos

}

Page 96: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

96 Curso de Linguagem CO comando default dentro doswitch

n O comando default será executado senão for encontrada nenhumacoincidência na lista de constantes.

n Caso não seja colocado um comandodefault e não haja coincidência,nenhum comando será executado.

Page 97: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

97 Curso de Linguagem C

O comando break

n Quando o computador encontra algumacoincidência, ele executa os comandosassociados àquele case até encontrarbreak ou o fim do comando switch.

n É um erro comum programadoresesquecerem de colocar o break após oscomandos.

Page 98: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

98 Curso de Linguagem C

Importante

n O switch difere do if, já que o primeiro sópode testar igualdade e a expressãocondicional if pode ser de qualquer tipo.

n Não pode haver duas constantes case comvalores iguais no mesmo switch.

n Podem ser colocados comandos switchdentro de comandos switch.

n Pode ser deixado um case vazio quandomais de uma condição usa o mesmo código.

Page 99: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

99 Curso de Linguagem C

Comandos de controle de loops

n Os comandos de controle de loopspermitem que o computador repita umconjunto de instruções até que alcanceuma certa condição. Em C temos osseguintes comandos de controle deloop:• for

• while• do while

Page 100: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

100 Curso de Linguagem C

for

n O loop for em C é muito mais forte emais flexível que o da maioria dasoutras linguagens. Sua forma geral éfor (inicialização; condição; incremento)

comando;

n Observe que as três partes do loop forsão separadas por ponto e vírgula.

n Nenhuma destas partes precisa existir.

Page 101: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

101 Curso de Linguagem C

Inicialização

n Na forma mais simples, inicialização éum comando de atribuição que ocompilador usa para estabelecer avariável de controle de loop.

n A inicialização pode conter qualquercomando válido em C.

Page 102: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

102 Curso de Linguagem C

Condição

n A condição é uma expressão de relaçãoque testa se a condição final desejadapelo loop for ocorreu.

n Aqui também pode ser colocadoqualquer comando válido em C.

Page 103: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

103 Curso de Linguagem C

Incremento

n O incremento define a maneira como avariável de controle do loop seráalterada cada vez que o computadorrepetir o loop.

n Também aqui, podemos colocarqualquer comando válido em C.

Page 104: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

104 Curso de Linguagem C

Exemplo 1

/* imprimir os números de 1 a 100 */

main(){

int x;for (x = 1; x <= 100; x ++) printf(“%d ”, x);

}

Page 105: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

105 Curso de Linguagem C

Exemplo 2

/* imprimir os números de 100 a 1 */

main(){

int x;for (x = 100; x > 0; x --) printf(“%d ”, x);

}

Page 106: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

106 Curso de Linguagem C

Exemplo 3

/* imprimir os números de 0 a 100, 5 em 5 */

main(){

int x;for (x = 0; x <= 100; x = x + 5)

printf(“%d ”, x);}

Page 107: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

107 Curso de Linguagem C

Exemplo 4

/* executa um bloco de código 100 vezes */

main(){

int x;for (x = 0; x < 100; x ++) {

printf(“O valor de x é: %d ”, x);printf(“e o quadrado de x é: %d\n”, x * x);

}}

Page 108: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

108 Curso de Linguagem C

Variações do loop for

n Podem ser executados mais de umcomando nas partes de inicialização ede incremento. Veja quemain(){

int x, y;for (x = 0, y = 0; x + y < 100; ++x, y++)

printf(“%d ”, x + y);}

n Mostrará números de 0 a 98, 2 a 2.

Page 109: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

109 Curso de Linguagem C

Um uso diferente para formain()

{ int t;for (prompt(); t=readnum(); prompt()) sqrnum(t);

}

prompt(){ printf(“digite um inteiro:” );

}

readnum(){ int t;

scanf(“%d”, &t);

return t;}

sqrnum(int num)

{ printf(“%d\n”, num * num);}

Page 110: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

110 Curso de Linguagem C

Loop infinito

n Podemos fazer um comando forexecutar para sempre simplesmentenão especificando sua partecondicional. Vejafor (;;)

printf(“este loop rodará para sempre\n”);

Page 111: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

111 Curso de Linguagem C

Saindo de um loop

n Podemos usar o comando break paraencerrar um for a qualquer momento.Veja um exemplo:main(){

int a;for (a = 1; a < 100; a++)

if (a == 10) break;}

n O loop só será executado 10 vezes.

Page 112: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

112 Curso de Linguagem C

Loops for sem nenhum corpo

n Podem ser utilizados loops sem corpopara gerar retardo de tempo. Veja umexemplo:for (a = 0; a < 1000; a ++);

Page 113: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

113 Curso de Linguagem C

while

n O while executa um comando (ou blocode comandos) enquanto uma condiçãofor verdadeira.

n A forma geral do while é:while (condição)

comando;

Page 114: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

114 Curso de Linguagem C

Exemplo 1

pausa()

{char tecla = ‘\0’;

printf(“Tecle ESPAÇO para continuar...”);while (tecla != ‘ ’)

tecla = getche();}

Page 115: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

115 Curso de Linguagem C

Exemplo 2

n O exemplo anterior pode ser reescritosem utilizar variável. Veja:main()

{printf(“Tecle ESPAÇO para continuar...”);

while (getche() != ‘ ’);}

Page 116: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

116 Curso de Linguagem C

do while

n Ao contrário do loop for e do loop while,que testam a condição no começo doloop, o loop do while verifica a condiçãosomente no final. Desta forma, o loopserá executado pelo menos uma vez. Aforma geral do loop do while é:do {

comando;} while (condição);

Page 117: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

117 Curso de Linguagem C

Exemplo

/* Lê um número maior que 100 */

main(){

int num;do {

printf(“Digite um número maior que 100”);scanf(“%d”, &num);

} while (num <= 100);}

Page 118: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

118 Curso de Linguagem C

Loops aninhados

n Quando um loop está dentro do outro,dizemos que o loop interior estáaninhado.

n Loops aninhados permite que sejamsolucionados vários problemas deprogramação.

n Em C podemos aninhar qualquer tipode loop.

Page 119: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

119 Curso de Linguagem C

Exemplo/* exibir uma tabela de potências dos números de 1 a 9*/main(){ int i, j, k, temp;

printf(“\ti\ti^2\ti^3\ti^4\n”);for (i = 1; i < 10; i ++) { /* loop externo */

for (j = 1; j < 5; j ++) { /* primeiro nível de aninhamento */temp = 1;for (k = 0; k < j; k ++) /* loop mais interior */

temp = temp * i;printf(“%8d”, temp);

}}

}

Page 120: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

120 Curso de Linguagem C

Interrupção de loops

n Quando precisamos encerrar um loopsem que sua condição de encerramentoesteja satisfeita, podemos utilizar ocomando break.

n O comando break é especialmente útilquando algum evento externo controleum loop.

Page 121: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

121 Curso de Linguagem C

Comando continue

n O comando continue funciona demaneira parecida com o comandobreak. Porém, em vez de forçar oencerramento, continue força a próximaiteração do loop e pula o código queestiver no meio.

Page 122: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

122 Curso de Linguagem C

Exemplo

/* programa para imprimir os números paresentre 0 e 98 */

main(){

int x;for (x = 0; x < 100; x ++) {

if (x % 2) continue;printf(“%d ”, x);

}}

Page 123: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

123 Curso de Linguagem C

Vetores

n Vetores são uma coleção de variáveisdo mesmo tipo que são referenciadaspelo mesmo nome.

n Em C, um vetor consiste em locaçõescontíguas de memória.

n O elemento mais baixo corresponde aoprimeiro elemento e o mais alto aoúltimo.

n O vetor mais utilizado é o de caracteres.

Page 124: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

124 Curso de Linguagem C

Declarando vetores

n A forma geral da declaração de umvetor é:tipo nome_var[tamanho];

n Onde• tipo é o tipo base do vetor e• tamanho é a quantidade de elementos que

o vetor conterá

Page 125: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

125 Curso de Linguagem C

Acessando um vetor

n Os vetores são acessados através deíndices colocados entre colchetes.

n O índice do primeiro elemento do vetoré 0 (ZERO).int amostra[10]; /* vetor de 10 inteiros */

amostra[0] /* primeiro elemento */amostra[9] /* último elemento */

Page 126: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

126 Curso de Linguagem C

Exemplo

main()

{int x[10]; /* vetor com 10 elementos int */

int t;

for (t = 0; t < 10; t ++)x [ t ] = t;

}

Page 127: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

127 Curso de Linguagem C

Limites dos vetores

n C não faz checagem dos limites dosvetores, isto é responsabilidade doprogramador. Logo, o código a seguirnão causará nenhum erro.int elementos[10];elementos[12] = 0;

elementos[10] = 0;

Page 128: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

128 Curso de Linguagem C

Strings

n Uma string é por definição, um vetor decaracteres terminado em 0. Então, paradeclarar a string, devemos declararsempre um elemento a mais para oterminador. Veja quechar mensagem[10] = “Exemplo”

n Ficará armazenado na memória como:

E x e m p l o \0

Page 129: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

129 Curso de Linguagem C

Funções para manipular strings

Função Finalidadegets Lê uma string do tecladoputs Imprime uma string na tela

strcpy Copia uma string em outrasrtcat Concatena stringsstrcmp Compara stringsstrlen Retorna o tamanho da string

Page 130: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

130 Curso de Linguagem C

gets

n Lê uma string do teclado.n Forma geral:

gets(nome_string);

n Exemplo:main()

{ char str[80];gets(str);

printf(“%s”, str);}

Page 131: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

131 Curso de Linguagem C

puts

n Mostra uma string na tela.n Forma geral:

puts(nome_string);

n Exemplo:main()

{puts(“Esta é uma mensagem”);

}

Page 132: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

132 Curso de Linguagem C

strcpy

n Copia uma string em outra.n Forma geral:

strcpy(para, de);

n Lembre-se que a string para deve sergrande o suficiente para conter de.main()

{ char str[80];strcpy(str, “alo”);

}

Page 133: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

133 Curso de Linguagem C

strcat

n Adiciona uma string em outra.n Forma geral:

strcat(s1, s2);

n s2 será anexada ao final de s1.main(){ char primeiro[20], segundo[10];

strcpy(primeiro, “bom”);strcpy(segundo, “ dia”);strcat(primeiro, segundo);printf(“%s\n”, primeiro);

}

Page 134: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

134 Curso de Linguagem C

strcmp

n Compara 2 strings.n Forma geral:

strcmp(s1, s2)

n A função retorna:

0 se s1 igual a s2> 0 se s1 > s2< 0 se s2 > s1

Page 135: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

135 Curso de Linguagem C

strlen

n Retorna o tamanho da stringn Forma geral:

strlen(str);

n Exemplo:main(){ char str[80];

printf(“Digite uma string: ”);gets(str);printf(“Tamanho: %d\n”, strlen(str));

}

Page 136: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

136 Curso de Linguagem C

Matrizes bidimensionais

n C permite que sejam declaradasmatrizes bidimensionais.

n Forma da declaração:tipo nome_var[dimensão1][dimensão2];

n Exemplo:char tabela[5][5];

Page 137: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

137 Curso de Linguagem C

Matrizes multidimensionais

n De forma semelhante as matrizesbidimensionais, declaramos asmultidimensionais. Veja por exemplouma matriz de 4 dimensões:int matriz[5][7][3][8];

Page 138: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

138 Curso de Linguagem CAcessando os elementos dasmatrizes multidimensionais

main()

{int numeros[4][3], i, j;

for (i = 0; i < 4; i ++)for (j = 0; j < 3; j++)

numeros[ i ][ j ] = i * j;}

Page 139: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

139 Curso de Linguagem C

Matrizes de strings

n Uma matriz bidimensional de caracterespode ser interpretada como uma matrizde strings.main(){ char strings[5][20]; /* 5 strings */

int i;for (i = 0; i < 5; i ++)

gets(strings[ i ]);}

Page 140: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

140 Curso de Linguagem C

Inicialização de matrizes

n C permite que as matrizes globaissejam inicializadas.

n A forma geral é:tipo nome_matriz[tam1]...[tamN] = {lista de

valores}

n Exemplo:int i[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Page 141: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

141 Curso de Linguagem C

Exemplo

int quadrados[5][2] = {

1, 1,2, 4,

3, 9,4, 16,

5, 25};1 12 43 94 165 25

quadrados =

Page 142: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

142 Curso de Linguagem C

Declarando vetores sem tamanho

n Podem ser declarados vetores semespecificar explicitamente seustamanhos. Os vetores devem serinicializados na declaração. O tamanhoserá definido na inicialização.

n Exemplo:char mensagem[ ] = “Esta é uma string”;

Page 143: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

143 Curso de Linguagem C

Exercícios

n Faça um programa que leia 3 nomescom suas respectivas idades e mostre omaior e o menor.

n Faça um programa que leia 5 númerose imprima “Números altos” se mais doque 3 deles forem maiores que 5, casocontrário, imprima “Números baixos”.

Page 144: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

144 Curso de Linguagem C

Modelos de memória

n A definição de modelos de memória foia forma utilizada para contornar aslimitações de segmentos emcomputadores IBM PC.

Modelo Código DadosTiny 1

Small 1 1Medium mais de 1 1Compact 1 mais de 1

Large mais de 1 mais de 1Huge mais de 1 mais de 1

Page 145: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

145 Curso de Linguagem C

Ponteiros

n Entender e usar corretamente osponteiros são pontos cruciais paracriação de programas bem-sucedidosem C.

n Além dos ponteiros serem uma dascaracterísticas mais fortes em C,também é a mais perigosa.

n É muito fácil usar ponteirosincorretamente causando erros difíceisde serem encontrados.

Page 146: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

146 Curso de Linguagem C

Motivos para usar ponteiros

n Os ponteiros fornecem maneiras pelasquais as funções podem modificar osargumentos recebidos.

n Dão apoio às rotinas de alocaçãodinâmica.

n Podem substituir o uso vetores emmuitas situações para aumentar aeficiência.

Page 147: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

147 Curso de Linguagem C

Ponteiros são endereços

n Um ponteiro é uma variável que contémum endereço de memória. Isto é, elespossuem armazenam a localização deoutra variável dentro da memória docomputador.

n Então dizemos que um ponteiro apontapara esta variável.

Page 148: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

148 Curso de Linguagem C

Ilustração de poteiros

Endereçamentode memória

Variável namemória

1000 100310011002100310041005

Page 149: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

149 Curso de Linguagem C

Variáveis ponteiros - declaração

n A declaração de variáveis ponteiros,segue a seguinte regra geral:tipo *nome_var;

n onde tipo é o tipo do elemento para oqual o ponteiro apontará.

n Exemplo:char *p;

int *temp, *valor;

Page 150: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

150 Curso de Linguagem C

Os operadores de ponteiros

n Existem 2 operadores especiais deponteiros: & e *.

n O operador & devolve o endereço davariável. É utilizado para fazer umponteiro apontar para ela.

n O operador * devolve o valorarmazenado no endereço apontadopelo ponteiro.

Page 151: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

151 Curso de Linguagem C

Exemplo

main()

{ int numero = 5, *p;p = &numero;

printf(“%d %d\n”, numero, *p);*p = 3;

printf(“%d %d\n”, numero, *p);numero = 7;

printf(“%d %d\n”, numero, *p);}

Page 152: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

152 Curso de Linguagem C

Expressões com ponteiros

n C permite que sejam feitas expressõescom ponteiros e elas seguem asmesmas regras das outras expressõesem C.

n Quando se compara um ponteiro comoutro, estamos comparando seusendereços. Isto é útil quando ambos osponteiros apontam para elementos deum vetor.

Page 153: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

153 Curso de Linguagem C

Ponteiros e vetores

n Existe um relacionamento muitopróximo entre os ponteiros e os vetores.Veja o código:char str[80], *p;p = str;

n Este código faz com que p aponte parao primero elemento do vetor, pois umvetor sem o índice se comporta comoum ponteiro para seu primeiroelemento.

Page 154: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

154 Curso de Linguagem C

Exemplo

n Após a definição:char str[80], *p;

p = str;

n são equivalentes os acessos ao quintoelemento de str:str[4]

*(p + 4)p[4]

Page 155: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

155 Curso de Linguagem C

Problemas com ponteiros

n É muito fácil errar quando se trabalhacom ponteiros em C.

n Algumas vezes, os erros com ponteirossó aparecem quando o programacresce.

n Ponteiros que não foram inicializados,apontam para um lugar desconhecidona memória, que pode ser inclusive ocódigo do programa.

Page 156: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

156 Curso de Linguagem C

Dois erros comuns

/* este programa estáerrado */

main(){

int x, *p;x = 10;*p = x;

}

/* este programa estáerrado */

main(){

int x, *p;x = 10;p = x;printf(“%d”, *p);

}

Page 157: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

157 Curso de Linguagem C

Alocação dinâmica de memória

n A linguagem C permite que seja feitaalocação dinâmica de memória, isto é,solicitar memória a medida que ela forsendo necessária.

n Programas que utilizam listas, pilhas, eoutros tipos de dados complexos cujaquantidade máxima não é definidadurante a compilação, trabalham comalocação dinâmica de memória.

Page 158: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

158 Curso de Linguagem C

Funções de alocação dinâmica

n Alocar um bloco de memóriavoid *malloc(int número_de_bytes);

void *calloc(unsigned num, unsigned tam);

n Liberar um bloco de memóriavoid free(void *p);

n Alterar o tamanho de um bloco dememóriavoid *realloc(void *p, unsigned tam);

Page 159: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

159 Curso de Linguagem C

Exemplo 1

#include <stdio.h>#include <stdlib.h>main(){ char *str;

str = (char *) malloc(101 * sizeof(char));if (str) {

strcpy(str, “Isto é um teste”);printf(“%s”, str);free(str);

}}

Page 160: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

160 Curso de Linguagem C

Exemplo 2

#include <stdio.h>#include <stdlib.h>main(){ float *p;

p = (float *) calloc(100, sizeof(float));if (!p) {

printf(“alocação fracassada - abortado”);exit(1);

}free(p);

}

Page 161: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

161 Curso de Linguagem C

Funções

n Funções são os blocos de contruçãoem que ocorrem todas as atividades doprogramas.

n Programar utilizando funções é reduzira complexidade do código e simplificarsua escrita.

Page 162: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

162 Curso de Linguagem C

Forma geral

n A forma geral da declaração de umafunção é:tipo nome_função(lista_parâmetros)

declaração de parâmetros{

corpo da função}

n Caso não seja especificado o tipo dafunção, ela será do tipo int.

Page 163: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

163 Curso de Linguagem C

Comando return

n O comando return possui duasutilidades básicas:• Causar a saída imediata da função na qual

ele se encontra, retornando para o códigode chamada.

• Devolver um valor para a funçãochamadora.

Page 164: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

164 Curso de Linguagem C

Exemplo

/* retorna 1 se o parâmetro > 10 */

int maior_que_dez(int x){

return (x > 10);}

Page 165: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

165 Curso de Linguagem C

Argumentos

n Quando é necessário passar algumainformação extra para uma função, estainformação será passada através deargumentos.

n Para chamar uma função com argumentos,eles devem ser colocados entre parêntesesapós o identificador da função. Veja:puts(“Atenção”);

n a string “Atenção” é o argumentopassado para a função puts.

Page 166: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

166 Curso de Linguagem CChamadas por valor e porreferência

n Existem duas formas de se passar umparâmetro para uma função, utilizandochamadas por valor ou por referência.

n Quando um parâmetro é passado por valor,as alterações efetuadas na função nãoafetarão a variável da função chamadora.

n Quando um parâmetro é passado porreferência, qualquer alteração efetuada pelafunção afetará a variável da funçãochamadora.

Page 167: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

167 Curso de Linguagem C

Exemplo

main(){ int x = 3, y = 4;

printf(“%d %d\n”, x, y);processa(x, &y);printf(“%d %d\n”, x, y);

}

int processa(int a, int *b){ a = 6;

b = 7;}

Page 168: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

168 Curso de Linguagem C

Observações

n Vetores são passados por referência.n Quando uma função é feita para

receber um parâmetro por referência, oparâmetro deve ser declarado como umponteiro na lista de argumentos dafunção.

n Para conjuntos grandes de dados, apassagem de parâmetros por referênciaé mais rápida.

Page 169: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

169 Curso de Linguagem CArgumentos argc e argv paramain()

n A função main também recebeargumentos. Eles são os parâmetros dalinha de comando passados aoprograma. Os dois parâmetros são argce argv. Veja como eles devem serdeclarados:main(int argc, char *argv[ ])

n Argc conterá o número de parâmetrospassados e argv conterá osparâmetros.

Page 170: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

170 Curso de Linguagem C

Exemplo

/* Função para imprimir os parâmetros */

main(int argc, char *argv[ ]){

int i;for (i = 0; i < argc; i ++)

printf(“argv[%d]: %s\n”, i, argv[i]);}

Page 171: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

171 Curso de Linguagem CFunções que devolvem nãointeiros

n Quando o tipo de uma função não édeclarado, por default, ele será int.

n Se for necessário definir uma função queretorna valores de outros tipos, o tipo deveser especificado.

n Quando a função não é do tipo int, ela deveser identificada antes de ser chamada daprimeira vez. Assim, o compilador poderágerar um código correto para a chamada àfunção.

Page 172: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

172 Curso de Linguagem C

Protótipos

n Como vimos, as funções que nãoretornam int, devem ser identificadasantes de serem referenciadas, paraisto, deve ser definido um protótipo paraa função.

n Forma geraltipo nome_função(tipo_parâmetros);

Page 173: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

173 Curso de Linguagem C

Exemplo

float metade(float);

main(){

printf(“%f\n”, metade(3));}

float metade(float numero){

return (numero / 2);}

Page 174: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

174 Curso de Linguagem C

Recursividade

n A linguagem C permite que as própriasfunções se chamem. A estacaracterística damos o nome derecursividade.

n Existem muitos problemas que setornariam extremamente difíceis deserem implementados sem arecursividade.

Page 175: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

175 Curso de Linguagem C

Preprocessador

n Antes do programa ser compilado, ele ésubmetido ao preprocessador. Estacaracterística é muito útil.

n Todos os comandos do preprocessadorsão iniciados por um sinal #, sendo osdois mais usados:• #define• #include

Page 176: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

176 Curso de Linguagem C

#define

n O comando define serve para definir umidentificador e uma string. O compiladorsubstituirá o identificador pela stringtoda vez que for encontrado no arquivo-fonte. O identificador é chamado denome de macro, e o processo desubstituição é chamado de substituiçãode macro.#define indentificador string

Page 177: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

177 Curso de Linguagem C

Exemplo

#define mensagem “Isto é um teste.\n”

#define verdadeiro 1#define falso !verdadeiro

main()

{if (verdadeiro) printf(mensagem);

if (falso) printf(mensagem);}

Page 178: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

178 Curso de Linguagem C

#include

n Instrui o compilador a incluir um outro arquivofonte com aquele que contém o comando#include. O nome do arquivo a ser incluído deveestar entre aspas ou entre o sinal de maior emenor.

n Se o nome do arquivo for colocado entre aspas,o compilador procurará pelo arquivo na seguinteseqüência: diretório atual, diretórios configuradosno compilador e diretórios padrões. Caso o nomedo arquivo esteja entre < >, não será procuradono diretório atual.

Page 179: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

179 Curso de Linguagem C

Entrada e saída

n A entrada e saída em C é feitautilizando-se funções da biblioteca docompilador, não existe nenhumapalavra reservada para esta finalidade.

n Existem dois sistemas de entrada esaída em C:• Bufferizado• Não bufferizado

n O padrão ANSI só define o primeiro.

Page 180: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

180 Curso de Linguagem C

Arquivo cabeçalho stdio.h

n Muitas bibliotecas em C exigem quecertos tipos de dados ou outrasinformações sejam partes dosprogramas que as usam. Para isto, énecessário utilizar o comando #includee incluir arquivos cabeçalho com estasdefinições nos programas.#include <stdio.h>

Page 181: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

181 Curso de Linguagem C

Filas de bytes

n O sistema de arquivo bufferizadodestina-se a trabalhar com umavariedade de dispositivos, que incluiterminais, acionadores de disco eacionadores de fita.

n Embora cada dispositivo seja diferente,o sistema de arquivo bufferizadotransforma cada um em um dispositivológico chamado fila de bytes.

Page 182: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

182 Curso de Linguagem C

Arquivos

n Em C, um arquivo é um conceito lógicoque o sistema pode aplicar a qualquercoisa, desde arquivos em disco atéterminais.

n Para associar uma fila de bytes a umdeterminado arquivo, basta realizaruma operação de abertura.

n Todas as filas de bytes são iguais.n Nem todos os arquivos são iguais.

Page 183: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

183 Curso de Linguagem CSistema de entrada e saídabuferizado

n O sistema de entrada e saídabufferizado é composto de váriasfunções relacionadas.

n Para utiliza-las, é necessário incluir oarquivo-cabeçalho stdio.h no programa.

Page 184: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

184 Curso de Linguagem C

O ponteiro do arquivo

n É o que mantém unido o sistema deentrada e saída bufferizado.

n É um ponteiro para a informação quedefine vários aspectos do arquivo,incluindo nome, status e posiçãocorrente.

n Um ponteiro de arquivo é uma variávelde ponteiro do tipo FILE, que é definidaem stdio.h.

Page 185: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

185 Curso de Linguagem C

Algumas funções

Nome Funçãofopen() abre uma filafclose() fecha uma filaputc() grava um caracter na filagetc() lê um caracter na filafseek() ajusta a posição atual no arquivofprintf() printf para a filafscanf() scanf para a filafeof() indica se a marca EOF foi encontradaferror() indica se ocorreu um errorewind() reposiciona no início do arquivoremove apaga um arquivo

Page 186: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

186 Curso de Linguagem C

fopen()

n Abre uma fila de bytes para ser usada e ligaum arquivo a esta fila.

n Protótipo:FILE *fopen(char *nome_arq, char *modo);

n onde modo é uma string que contém o statusde abertura desejado.

n nome_arq é uma string com um nome dearquivo válido para o sistema operacional,podendo incluir drive e diretório.

n Retorna NULL ( = 0 ) se a função falhar.

Page 187: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

187 Curso de Linguagem C

Valores legais de modoModo Significado

r abre um arquivo-texto para leituraw cria um arquivo-texto para gravaçãoa anexa a um arquivo-textorb abre um arquivo binário para leiturawb cria um arquivo binário para gravaçãoab anexa a um arquivo binárior+ abre um arquivo-texto para leitura/gravaçãow+ cria um arquivo-texto para leitura/gravaçãoa+ abre ou cria um arquivo-texto para leitura/gravaçãor+b abre um arquivo binário para leitura/gravaçãow+b cria um arquivo binário para leitura/gravaçãoa+b abre um arquivo binário para leitura/gravaçãort abre um arquivo-texto para leiturawt cria um arquivo-texto para gravaçãoat anexa a um arquivo-textor+t abre um arquivo-texto para leitura/gravaçãow+t cria um arquivo-texto para leitura/gravaçãoa+t abre ou cria um arquivo-texto para leitura/gravação

Page 188: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

188 Curso de Linguagem C

fclose()

n Fecha uma fila que foi aberta comfopen().

n Todas as filas devem ser fechadasantes que o programa termine.

n Protótipo:int fclose(FILE *arquivo);

Page 189: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

189 Curso de Linguagem C

ferror() e rewind()

n ferror() determina se a última operaçãocom arquivos produziu um erro(devolvendo 1 caso tenha ocorrido).

n rewind() reposiciona no início doarquivo.

n Protótipos:int ferror(FILE *arquivo);

void rewind(FILE *arquivo);

Page 190: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

190 Curso de Linguagem C

getc() e putc()

n São utilizados para ler e gravar caracteresnuma fila previamente aberta.

n Protótipo:int putc(int caracter, FILE *arquivo);int getc(FILE *arquivo);

n putc devolve o caracter gravado em caso desucesso, em caso de erro EOF(definido emstdio.h) será devolvido.

n getc devolve um inteiro mas com o bytesuperior zero. Ele devolve EOF quandoalcançar o fim do arquivo.

Page 191: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

191 Curso de Linguagem C

fprintf() e fscanf()

n São os correspondentes a printf e scanfdo sistema de entrada e saída doconsole. A diferença é que o primeiroparâmetro é um ponteiro de arquivo.

n Protótipos:int fprintf(FILE *arq, const char *controle, ...);

int fscanf(FILE *arq, const char *controle, ...);

Page 192: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

192 Curso de Linguagem C

fgets() e fputs()

n São as correspondentes a gets e putspara arquivos.

n Protótipos:char *fputs(char *str, FILE *arquivo);

char *fgets(char *str, int comprimento, FILE*arquivo);

n Observe que em fgets pode serespecificado o comprimento máximo dastring e, ao contrário do gets, o \n final écolocado na string.

Page 193: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

193 Curso de Linguagem C

getw() e putw()

n São utilizadas para ler e gravar inteiros.n Elas trabalham exatamente como getc

e putc com exceção de gravareminteiros.

n Protótipos:int getw(FILE *arquivo);int putw(int numero, FILE *arquivo);

Page 194: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

194 Curso de Linguagem C

fread() e fwrite()

n São funções utilizadas para ler e gravar blocos dedados nos arquivos.

n Protótipos:int fread(void *buffer, int tamanho, int quantidade, FILE

*arquivo);int fwrite(void *buffer, int tamanho, int quantidade, FILE

*arquivo);

n buffer é um ponteiro para a região da memória quepossui os dados, tamanho é o tamanho em bytes decada unidade, quantidade determina quantos itens(cada um contendo tamanho bytes) serão lidos ougravados e arquivo é um ponteiro de arquivo parauma fila previamente aberta.

Page 195: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

195 Curso de Linguagem C

fseek()

n É utilizado para efetuar operações de leitura egravação aleatórias sob o sistema de entrada esaída bufferizado.

n Protótipo:int fseek(FILE *arquivo, long int num_bytes, int origem);

n fseek retorna zero em caso de sucesso.n Arquivo é o ponteiro de arquivo, num_bytes é o

número de bytes desde origem até chegar a novaposição e origem é um dos seguintes macros:

Origem Nomeinício do arquivo SEEK_SETposição corrente SEEK_CURfim do arquivo SEEK_END

Page 196: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

196 Curso de Linguagem CAs filas de bytes stdin, stdout estderr

n Existem 3 filas de bytes especiais quesão abertas automaticamente quando oprograma é inicializado:• stdin entrada padrão• sdtout saída padrão

• stderr erro padrão

n Elas podem ser usadas para efetuaroperações de entrada e saída noconsole.

Page 197: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

197 Curso de Linguagem C

Exemplo

#include <stdio.h>main(int argc, char *argv[ ]){ FILE *entrada, *saida;

char ch;if (argc != 3) {

printf(“Não foi digitado o nome da origem.\n”);exit(1);

}if (!(entrada = fopen(argv[1], “rb”)) {

printf(“arquivo de origem não achado.\n”);exit(1);

}

Page 198: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

198 Curso de Linguagem C

Exemplo (continuação)

if (!(saida = fopen(argv[2], “wb”)) {printf(“Arquivo destino não pode ser aberto.\n”);exit(1);

}/* esta é a linha que copia o arquivo */

while (!feof(entrada)) putc(getc(entrada), saida);fclose(entrada);fclose(saida);

}

Page 199: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

199 Curso de Linguagem CTipos de dados definidos pelosusuários

n Em C podem ser criados 5 tiposdiferentes de dados personalizados:• estrutura

• campo de bit• união

• enumeração• typedef

n O uso de tipos definido pelo usuáriofacilita a programação e dá maior poderao programador.

Page 200: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

200 Curso de Linguagem C

Estruturas

n Em C, uma estrutura é uma coleção devariáveis que são referenciadas pelo mesmonome.

n É uma forma conveniente de manter juntasinformações relacionadas.

n Forma geral:struct nome_estrutura {

tipo1 var1;tipo2 var2;

} var_estrutura;

Page 201: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

201 Curso de Linguagem CDeclarando variáveis do tipoestrutura

n Além de poder declarar variáveis dotipo da estrutura durante a definição daestrutura, elas podem ser declaradasda seguinte forma:struct nome_estrutura nome_variável;

Page 202: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

202 Curso de Linguagem CAcessando variáveis do tipoestrutura

n Para acessar variáveis do tipoestrutura, utiliza-se o operador . (ponto).

n Forma geral:nome_variavel.nome_elemento;

Page 203: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

203 Curso de Linguagem C

Exemplo

struct pessoa {

char nome[21];int idade;

} primeiro;main() {

struct pessoa segundo;strcpy(primeiro.nome, “José”);

primeiro.idade = 20;segundo = primeiro;

}

Page 204: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

204 Curso de Linguagem C

Vetores e matrizes de estruturas

n Podem ser declarados vetores ematrizes de estruturas, para isto,usamos a forma geral:struct nome_estrutura nome_var[t1][t2]...[tn];

n Exemplo:struct pessoa pessoas[5];

Page 205: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

205 Curso de Linguagem C

Ponteiros para estruturas

n Em C, podem ser declarados ponteirospara estruturas.

n Forma geral:struct pessoa *primeiro;

Page 206: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

206 Curso de Linguagem CVantagens de se usar ponteirospara estruturas

n Fazer chamada por referência parauma função;

n Criar listas ligadas com estruturasdinâmicas de dados usando o sistemade alocação.

n É mais rápido passar estruturasgrandes por referência (usandoponteiros) do que por valor, poisestamos passando apenas umendereço.

Page 207: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

207 Curso de Linguagem CAcessando os elementos usandoponteiros para estruturas

n Veja a declaração:struct pessoa *primeiro, segundo;

strcpy(segundo.nome, “José”);segundo.idade = 10;

primeiro = &segundo;

n Para acessar o campo idade deprimeiro:(*primeiro).idade

primeiro -> idade

Page 208: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

208 Curso de Linguagem CVetores, matrizes e estruturasdentro de estruturas

n Os elementos das estruturas podem sersimples ou complexos, assim, podemoscolocar vetores, matrizes e atéestruturas dentro das estruturas. Veja:struct complexa {

char setor[21];

struct pessoa funcionarios[50];}

Page 209: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

209 Curso de Linguagem C

Campos de bit

n C possui metodos para acessarsomente um bit dentro de um byte. Istoé útil para:• Economizar memória declarando várias

variáveis booleanas num só byte

• Comunicar com dispositivos quetransmitem informações diversascodificadas em bytes

• Rotinas de codificação que precisamacessar bits dos bytes

Page 210: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

210 Curso de Linguagem C

Como declarar campos de bit

n Os campos de bit só podem serdeclarados dentro de estruturas.

n Forma geral:struct nome_estrutura {

tipo1 var1 : comprimento;tipo2 var2 : comprimento;

} nome_var ;

n Os tipos podem ser: int, signed eunsigned. Quando o tamanho é 1, eledeve ser obrigatoriamente unsigned.

Page 211: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

211 Curso de Linguagem C

Exemplo

struct dispositivo {

unsigned ativo : 1;unsigned pronto : 1;

unsignet erro : 1;unsigned : 2;

unsigned ultimo_erro : 3;}

Page 212: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

212 Curso de Linguagem C

Uniões

n Em C, uma união é uma localização dememória que é usada por muitasvariáveis diferentes, que podem ser detipos diferentes.

n A declaração e o acesso a uma união éfeita de forma semelhante asestruturas, só que usando a palavrareservada union no lugar de struct.

Page 213: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

213 Curso de Linguagem C

Exemplo

union dois_bytes {

int inteiro;char caracter[2];

} valor;main()

{valor.inteiro = ‘A’ * 256 + ‘B’;

printf(“%c %c”, valor.caracter[0],valor.caracter[1]);

}

Page 214: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

214 Curso de Linguagem C

Enumerações

n Enumeração é um conjunto deconstantes inteiras com nome e eespecifica todos os valores legais queuma variável daquele tipo pode ter.

n Para declarar:enum nome_tipo { lista de constantes }

nome_var;

n Todas as constantes receberão valoresinteiros a começar por zero, a não serque seja especificado o contrário.

Page 215: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

215 Curso de Linguagem C

Exemplo

enum tamanhos {pequeno, medio, grande =5} tamanho;

main(){

tamanho = pequeno; printf(“%d”, tamanho);tamanho = medio; printf(“%d”, tamanho);

tamanho = grande; printf(“%d”, tamanho);}

Page 216: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

216 Curso de Linguagem C

sizeof

n Como estamos trabalhando só comcomputadores IBM PC, até agora, não nospreocupamos com os tamanhos dasvariáveis pois já sabemos seus valores.

n C possui o operador sizeof com a finalidadede garantir a portabilidade dos programasentre ambientes cujos tamanhos dasvariáveis sejam diferentes.

n sizeof retorna a quantidade de bytes queuma variável ocupa na memória.

Page 217: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

217 Curso de Linguagem C

Exemplos

n Alocar memória para 10 floats:float *numeros;

numeros = (float *) calloc(10, sizeof(float));

n Imprimir o tamanho gasto por umavariável inteira:printf(“%d”, sizeof(int));

Page 218: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

218 Curso de Linguagem C

typedef

n C permite que sejam definidosexplicitamente novos tipos de dadosusando a palavra reservada typedef.

n typedef não cria realmente uma novaclasse de dados, mas sim define umnovo nome para uma tipo já existente.

n O uso do typedef torna os programasem C mais legíveis e mais portáteispois bastará alterar a definição dotypedef quando trocar de ambiente.

Page 219: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

219 Curso de Linguagem C

Exemplo

n Após as definições:typedef float balanco;

typedef char string[21];typedef struct pessoa tipo_pessoa;

n As seguintes declarações serãoequivalentes:

balanco valor; float valor;string frase; char frase[21];tipo_pessoa aluno; struct pessoa aluno;

Page 220: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

220 Curso de Linguagem C

Operadores avançados

n C possui vários operadores especiaisque aumentam em muito sua força eflexibilidade - especialmente naprogramação a nível de sistema.

Page 221: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

221 Curso de Linguagem C

Operadores bit a bit

n Como C foi projetada para substituir alinguagem assembly na maioria dastarefas de programação, ela possui umcompleto arsenal de operadores bit abit.

n Os operadores bit a bit só podem serusados nos tipos char e int.

Page 222: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

222 Curso de Linguagem C

Tabela dos operadores bit a bit

Operador Ação& E| OU^ OU exclusivo (XOR)~ Complemento de um (NOT)

>> Deslocar para direita<< Deslocar para esquerda

Page 223: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

223 Curso de Linguagem C

Operador ?

n O operador ? pode ser usado parasubstituir comandos if / else quetenham a forma geral:if (condição)

expressão1;

elseexpressão2;

n Forma geral:condição ? expressão1 : expressão 2;

Page 224: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

224 Curso de Linguagem C

Exemplo

n A seqüência de comandos:x = 10;

if (x > 9) y = 100;else y = 200;

n pode ser substituída por:x = 10;

y = x > 9 ? 100 : 200;

Page 225: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

225 Curso de Linguagem C

Formas abreviadas

n C permite que sejam escritas formasabreviadas dos comandos deatribuição. Os comandos:x = x + 10;y = y * 20;

z = z - 5;

n podem ser reescritos da forma:x += 10;y *= 20;

z -= 5;

Page 226: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

226 Curso de Linguagem C

Operador vírgula

n O operador vírgula é usado para juntarvárias expressões. O compiladorsempre avalia o lado esquerdo davírgula como void. Assim, a expressãodo lado direito ficará sendo o valor detoda expressão separada por vírgula.

n Por exemplo:x = (y = 3, y + 1);

n Atribuirá 3 a y e 4 a x.

Page 227: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

227 Curso de Linguagem C

Parênteses e colchetes

n C considera os parênteses e oscolchetes como operadores.

n Os parênteses executam a tarefaesperada de aumentar a precedênciados operadores que estão dentro deles.

n Os colchetes executam a indexação devetores e matrizes.

Page 228: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

228 Curso de Linguagem C

Resumo de precedênciaMaior ( ) [ ] ->

! ~ ++ -- - (type cast) * & sizeof* / %+ -<< >>< <= >=== !=&^|&&||?= += -= *= /=

Menor ,

Page 229: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

229 Curso de Linguagem C

Funções comuns

n A biblioteca padrão de funções dalinguagem C é muito ampla.

n Os programas em C fazem uso intensodas funções da biblioteca.

n Os programadores iniciantes tendem areescrever funções já existentes nasbibliotecas.

Page 230: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

230 Curso de Linguagem C

Funções matemáticas

n Os protótipos das funções matemáticas ficamno arquivo math.h. Veja alguns protótipos:double sin(double arg);double cos(double arg);double tan(double arg)double exp(double arg);double log(double num);double log10(double num);double pow(double base, double exp);double sqrt(double num);

Page 231: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

231 Curso de Linguagem CAlguns erros comuns deprogramação

n Por ser uma linguagem que dá muitopoder ao programador, também é muitofácil de errar em C.

n Como o compilador aceita praticamentetudo o que se escreve, o programadordeve ter atenção redobrada na hora deprogramar.

Page 232: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

232 Curso de Linguagem CErros de ordem deprocessamento

n Os operadores de incremento edecremento são usados na maioria dosprogramas em C, e a ordem deocorrência da operação é afetada pelofato de esses operadores precederemou sucederem a variável. Logo, se y=10x = y++;

n será diferente dex = ++y;

Page 233: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

233 Curso de Linguagem C

Problemas com ponteiros

n O mau-uso de ponteiros em C podecausar muitos problemas. Veja os doisexemplos ERRADOS abaixo:int *x;char *p;

*p = malloc(100);*x = 10;

Page 234: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

234 Curso de Linguagem C

Redefinindo funções

n É possível, mas não recomendado, que sejacriada uma função com o mesmo nome deuma existente na biblioteca de C. Isto farácom que qualquer chamada a esta funçãoseja direcionada para a nova.

n A pior parte é que, mesmo o nosso programanão referenciando uma função da biblioteca,as próprias funções da biblioteca podemestar se referenciando, o que causaráproblemas da mesma forma. Por exemplo, oprogramador reescreveu a função getc masesqueceu-se que a função scanf a chama.

Page 235: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

235 Curso de Linguagem C

Erros por um

n Todos os índices dos vetores ematrizes em C começam em 0. Logo, oprograma abaixo está errado.main(){

int x, num[100];for (x = 1; x <= 100; x ++)

num[x] = x;}

Page 236: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

236 Curso de Linguagem C

Erros de limite

n Muitas funções em C (inclusive as dasbibliotecas) não possuem (ou possuempouca) verificação de limites. Assim, achamada a gets abaixo pode gerar umproblema caso o usuário digite maisque 20 caracteres.main()

{ char texto[21];gets(texto);

}

Page 237: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

237 Curso de Linguagem COmissões de declaração defunção

n Esquecer de definir o protótipo de umafunção pode causar erro pois ocompilador estará esperando sempreque as funções não declaradasretornem um inteiro. O mesmoproblema ocorre também com osparâmetros.

Page 238: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

238 Curso de Linguagem C

Erros de argumentos de chamada

n Os argumentos passados a uma funçãodevem ser do mesmo tipo do esperadopor elas. O programa abaixo estáerrado:main(){

int x;char string[10];

scanf(“%d%s”, x, string);}

Page 239: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

239 Curso de Linguagem C

Exercício (parte 1)

n Faça um programa que leia 5 nomescom suas respectivas idades e mostre omaior e o menor.

n Vamos dividir o problema em partes,primeiro vamos definir uma estruturacontendo um campo nome e um campoidade:typedef struct {

char nome[21];

int idade; } pessoa;

Page 240: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

240 Curso de Linguagem C

Exercício (parte 2)

n Vamos definir a função mais_velho querecebe 2 ponteiros do tipo pessoa eretorna um ponteiro para a pessoa maisvelha:pessoa *mais_velho(pessoa *p1, pessoa

*p2);{

if (p1 -> idade < p2 -> idade) return p2;else return p1;

}

Page 241: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

241 Curso de Linguagem C

Exercício (parte 3)

n Vamos definir a função mais_novo querecebe 2 ponteiros do tipo pessoa eretorna um ponteiro para a pessoa maisnova:pessoa *mais_novo(pessoa *p1, pessoa

*p2);{

if (p1 -> idade > p2 -> idade) return p2;else return p1;

}

Page 242: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

242 Curso de Linguagem C

Exercício (parte 4)

n Vamos definir a função le_pessoa querecebe um ponteiro do tipo pessoa e faza leitura do teclado:void le_pessoa(pessoa *p){

printf(“Nome: ”);gets(p -> nome);

printf(“Idade: ”);scanf(“%d”, p -> idade);

}

Page 243: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

243 Curso de Linguagem C

Exercício (parte 5)

n Vamos definir a função mostra_pessoaque recebe um ponteiro para umapessoa e mostra seus dados na tela.void mostra_pessoa(pessoa *p){

printf(“Nome: %s\nIdade: %d\n”, p->nome,p->idade);

}

Page 244: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

244 Curso de Linguagem C

Exercício (parte 6)

n Agora só falta declarar as variáveis edefinir o programa principal, que serácomposto por um loop de entrada, umloop de pesquisa e a apresentação dosresultados.

n Dividindo o código do programa, ficamais fácil resolver os problemas everificar os erros que possam ocorrer.

Page 245: Curso de Linguagem C - ic.unicamp.brrlachi/Curso_c.pdf · 8 Linguagem feita para Curso de Linguagem C programadores n Ao contrário do que possa parecer, nem todas as linguagens foram

245 Curso de Linguagem C

Exercício (parte 7)

main(){ pessoa pessoas[5], *velho, *novo;

int i;for(i = 0; i < 5; i++) le_pessoa(&pessoas[i]);velho = novo = pessoas;for(i = 1; i < 5; i++) {

velho = mais_velho(velho, &pessoas[i]);novo = mais_novo(novo, &pessoas[i]);

}puts(“O mais novo é\n”); mostra_pessoa(novo);puts(“O mais velho é\n”); mostra_pessoa(velho);

}