Curso de Linguagem C - Instituto de Computação€¦ · 8 Linguagem feita para Curso de Linguagem...

Preview:

Citation preview

1 Curso de Linguagem C

Curso de Linguagem C

Rodolfo Jardim de AzevedoInstituto de Computação

UNICAMP

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.

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.

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.

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.

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.

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.

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.

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.

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:

11 Curso de Linguagem C

/* Este é o primeiro programa */

n Esta linha é um comentário.

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.

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.

14 Curso de Linguagem C

{

n Inicia um bloco de código.

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.

16 Curso de Linguagem C

}

n Encerra um bloco de código.

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.

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.

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.

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.

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:

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

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.

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.

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.

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

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.

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

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.

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;

31 Curso de Linguagem C

Onde declarar?

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

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.

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.

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.

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(); } }

36 Curso de Linguagem C

Função total()

/* acumula no total parcial */

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

{ soma = x + soma;

}

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); }

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.

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.

40 Curso de Linguagem C

Constantes

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

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

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 */

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.

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.

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

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.

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

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 */

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 */

}

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

51 Curso de Linguagem C

Operadores lógicos

Operador Ação&& AND

|| OR! NOT

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.

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 */

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.

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:

56 Curso de Linguagem C

Regra 1

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

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.

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

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 */

}

60 Curso de Linguagem C

Modificadores de acesso

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

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.

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.

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 ++;

}

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);

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

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

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

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

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

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

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

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

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

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

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);

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

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

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

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

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

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

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

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);

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

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.

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

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

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 --”);}

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.

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.

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;

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.

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”);

}

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.

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

}

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.

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.

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.

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

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.

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.

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.

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.

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);

}

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);

}

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);}

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);

}}

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.

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);}

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”);

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.

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 ++);

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;

114 Curso de Linguagem C

Exemplo 1

pausa()

{char tecla = ‘\0’;

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

tecla = getche();}

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() != ‘ ’);}

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);

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);}

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.

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);

}}

}

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.

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.

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);

}}

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.

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á

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 */

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;

}

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;

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

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

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);}

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”);

}

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”);

}

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);

}

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

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));

}

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];

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];

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;}

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 ]);}

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};

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 =

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”;

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”.

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

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.

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.

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.

148 Curso de Linguagem C

Ilustração de poteiros

Endereçamentode memória

Variável namemória

1000 100310011002100310041005

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;

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.

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);}

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.

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.

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]

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.

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);

}

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.

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);

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);

}}

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);

}

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.

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.

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.

164 Curso de Linguagem C

Exemplo

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

int maior_que_dez(int x){

return (x > 10);}

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.

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.

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;}

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.

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.

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]);}

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.

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);

173 Curso de Linguagem C

Exemplo

float metade(float);

main(){

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

float metade(float numero){

return (numero / 2);}

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.

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

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

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);}

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.

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.

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>

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.

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.

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.

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.

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

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.

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

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);

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);

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.

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, ...);

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.

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);

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.

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

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.

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);

}

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);

}

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.

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;

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;

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;

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;

}

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];

205 Curso de Linguagem C

Ponteiros para estruturas

n Em C, podem ser declarados ponteirospara estruturas.

n Forma geral:struct pessoa *primeiro;

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.

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

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];}

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

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.

211 Curso de Linguagem C

Exemplo

struct dispositivo {

unsigned ativo : 1;unsigned pronto : 1;

unsignet erro : 1;unsigned : 2;

unsigned ultimo_erro : 3;}

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.

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]);

}

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.

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);}

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.

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));

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.

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;

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.

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.

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

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;

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;

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;

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.

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.

228 Curso de Linguagem C

Resumo de precedênciaMaior ( ) [ ] ->

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

Menor ,

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.

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);

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.

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;

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;

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.

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;}

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);

}

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.

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);}

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;

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;

}

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;

}

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);

}

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);

}

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.

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);

}

Recommended