linguagem c

165
Linguagem C 1 Linguagem C Linguagem C Treinamento em Desenvolvimento de Aplicativos para Sistemas Embarcados

Upload: berjon-brito

Post on 06-Jun-2015

30.491 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Linguagem c

Ling

uage

m C

1

Ling

uage

m C

Linguagem C

Treinamento em Desenvolvimento de

Aplicativos para Sistemas Embarcados

Page 2: Linguagem c

Ling

uage

m C

2

Bibliografia

• Shildt, Herbert , C Completo e Total, Editora Makron Books, 3ªedição, São Paulo, 1997.

• Manzano, José augusto, Estudo Dirigido de Linguagem C, Editora Érika, São Paulo, 1997.

Page 3: Linguagem c

Ling

uage

m C

3

Ementa

• Introdução• Operadores e Expressões• Funções de E/S• Estruturas de Controle• Vetores e Matrizes• Strings• Ponteiros• Funções• Estruturas• Alocação Dinâmica de Memória• Arquivos

Page 4: Linguagem c

Ling

uage

m C

4

Introdução

• Histórico• C é resultado de um processo iniciado com a

linguagem BCPL. BCPL influenciou a linguagem de nome B, que evoluiu posteriormente para C.

• Projetada em 1972, nos laboratórios da BELL (empresa de desenvolvimento de software básico), por Brian Kerninghan e Dennis Ritchie para o UNIX do PDP-11.

• A simplicidade de sua implementação permitiu a extensão da linguagem e a criação de compila-dores C para praticamente todas as plataformas de hardware e sistemas operacionais.

• Em 1983 estabeleceu-se o padrão ANSI.

Page 5: Linguagem c

Ling

uage

m C

5

Introdução

• Características • Portabilidade• Linguagem estruturada e modular• Geração de código eficiente• Simplicidade• Possui apenas 32 palavras chaves• Uso de biblioteca de funções que implementam

os recursos de alto nível para o programador• Linguagem de médio nível

• Combina facilidades de uma linguagem de alto nível com a versatilidade e potencialidade do Assembly.

• Não efetua verificações em tempo de execução.

Page 6: Linguagem c

Ling

uage

m C

6

Introdução

• Aplicação– Sistemas Operacionais– Compiladores– Planilhas Eletrônicas– Editores de Texto– Banco de Dados

Page 7: Linguagem c

Ling

uage

m C

7

Introdução• Linguagem de máquina: única linguagem que o

computador entende, ou seja, que pode ser diretamente executada pelo hardware. Ela é formada por códigos binários que representam as instruções e dados. Tem uso difícil e tedioso. Pode-se dizer que, para se programar em linguagem de máquina é necessário um amplo conhecimento do hardware utilizado.

• Linguagem de alto nível: conjunto de instruções mais compatíveis com a linguagem humana e com o modo do ser humano pensar. Estas linguagens, na sua maioria, são de uso genérico e não é necessário ter conhecimento do hardware utilizado.

Page 8: Linguagem c

Ling

uage

m C

8

Introdução• Todo programa escrito em linguagem de alto nível é chamado de programa-fonte ou código fonte.• O programa em linguagem de máquina, escrito ou resultante, é chamado de programa-objeto ou código objeto.• Todo o programa-fonte, para ser executado, deve obrigatoriamente, de alguma forma, ser traduzido para programa-objeto. Neste momento é que são utilizados os compiladores e/ou interpretadores.

Page 9: Linguagem c

Ling

uage

m C

9

Introdução

•Interpretador: lê o código-fonte linha-a-linha, faz uma consistência de sua sintaxe e se não houver erro, converte-a para linguagem de máquina para executá-la. Este processo é realizado até que a última linha seja executada ou a consistência apresente algum erro. O interpretador precisa estar presente todas as vezes que vamos executar o nosso programa e o trabalho de checagem da sintaxe deverá ser repetido.

Page 10: Linguagem c

Ling

uage

m C

10

Introdução

• Compilador: lê o programa inteiro, faz uma consistência de sua sintaxe e se não houver erro, gera o código-objeto em disco com a extensão .OBJ. Este programa não pode ser executado até que sejam agregadas a ele rotinas em linguagem de máquina (biblioteca da linguagem) que lhe permitirão a sua execução. Este trabalho é feito por um programa chamado linkeditor, que cria o código-executável final em disco com a extensão .EXE. Neste momento não é mais necessária a presença do compilador, pois todo o programa já esta traduzido para linguagem de máquina e armazenado em disco, basta rodá-lo.

Page 11: Linguagem c

Ling

uage

m C

11

Introdução

• C é uma linguagem compilada

Fontes C

Arquivos OBJ Bibliotecas

Compilação

+

Executável

Ligação

Page 12: Linguagem c

Ling

uage

m C

12

Estrutura de um programa em C

• Declaração das bibliotecas de funções (#include) • Declarações de constantes e seus valores (#define) • Declaração das variáveis globais (públicas) • Declaração das funções• Única função obrigatória e primeira a ser executada

é a função main()• O corpo das funções fica entre { }

main() /* função obrigatória */{printf(“Hello World”);}

Page 13: Linguagem c

Ling

uage

m C

13

Estrutura de um programa em C/* declaração dos arquivos de cabeçalho e definições */#include <stdio.h>#define PI 3.1415

/* definição das variáveis globais */

/* função principal do programa */void main(){ /* definição das variáveis locais */ printf (“Hello World”);}

Page 14: Linguagem c

Ling

uage

m C

14

Mapa de Memória

Pilha

Heap

Variáveis Globais

Código do Programa

Page 15: Linguagem c

Ling

uage

m C

15

Tipos básicos de dadosTIPO BITs BYTEs DESCRIÇÃO DOMÍNIO

void 0 0 sem argumento e não retorna valor

Sem valor

char 8 1 caractere isolado -128 a 127

int 16 2 valor inteiro -32.768 a 32.767

float 32 4 número ponto-flutuante (no contendo um ponto decimal e/ou um expoente)

3.4E-38 a 3.4E+38

double 64 8 número ponto-flutuante de dupla precisão (mais algarismos significativos e um expoente que pode ter mais magnitude)

1.7E-308 a 1.7E+308

Page 16: Linguagem c

Ling

uage

m C

16

Modificadores de tipos básicos

signed char -128 a 127

signed int -32.768 a 32.767

short int = int -32.768 a 32.767

unsigned char 0 a 255

unsigned int 0 a 65.535

unsigned short int = unsigned int 0 a 65.535

long int -2.147.483.648 a 2.147.483.647 (quatro bytes)

unsigned long int 0 a 4.294.967.295

long float = double (padrão ANSI)

long double dez dígitos de precisão (≅ 80 bits)

Page 17: Linguagem c

Ling

uage

m C

17

Identificadores

Identificadores são os nomes das variáreis, funções, rótulos e outros objetos definidos pelo usuário.

• O primeiro caracter deve ser uma letra ou sublinhado• Apenas os 32 primeiros caracteres são significativos• É case sensitive, ou seja, maiúsculas se diferem das

minúsculas• int x; /* é diferente de int X; */• As instruções terminam com “;”• Comentários devem ficar entre /* e */• Palavras-chave são minúsculas

Page 18: Linguagem c

Ling

uage

m C

18

Declaraçãoint i;float f;unsigned int inteiro_sem_sinal; char ch;double balanco, lucro, prejuizo;int i, j, k;int _exemplo_de_um_nome_longo; long int A5k;

Page 19: Linguagem c

Ling

uage

m C

19

Primeiro Programa

1. Use o IDE Dev C++ para editar, compilar, linkar e executar o programa Hello.c

2. Qual o tamanho dos arquivos C, OBJ e EXE do programa Hello.c ?

3. Que conclusões você tira da resposta da questão 2?

Page 20: Linguagem c

Ling

uage

m C

20

Ementa

• Introdução• Operadores e Expressões• Funções de E/S• Estruturas de Controle• Vetores e Matrizes• Strings• Ponteiros• Funções• Estruturas• Alocação Dinâmica de Memória• Arquivos

Page 21: Linguagem c

Ling

uage

m C

21

Operadores

• Operador de Atribuição• Em C o operador de atribuição é o sinal de igual “=”. • É erro comum em programadores iniciantes confundir

o “=” com o operador relacional de igualdade “==”.• Exemplos:

a = 1;delta = b * b – 4 * a * c;i = j;

• O operando esquerdo deve ser um identificador de variável, isto é, não pode ser uma constante ou expressão. São atribuições inválidas:1 = a; // constante!b + 1 = a; // expressão!

Page 22: Linguagem c

Ling

uage

m C

22

Conversões de tipos• Se os dois operandos de uma atribuição não são do

mesmo tipo, o valor da expressão ou operador da direita será convertido para o tipo do identificador da esquerda.• Exemplo 1:

int i; float r;i = 5; // valor de i: 5r = i; // valor de r: 5.0

• Exemplo 2:int i;float r = 654.321;i = r; // i será truncado para 654

Page 23: Linguagem c

Ling

uage

m C

23

Conversões de tipos

• Pode-se dizer que as conversões potencialmente perigo-sas (onde há possibilidade de perda de informação) são:

char int float double• Observe que o compilador C ao encontrar esta operação

não gera nenhum aviso de atenção para o programador. Assim este detalhe pode gerar um erro de programação (bug) que passe desapercebido ao programador inexperiente. É possível dizer que a linguagem C possui tipos ”macios” (soft types) pois a operação com variáveis de tipos diferentes é perfeitamente possível. Esta característica do C se contrapõe a algumas linguagens em que isto não é possível. Estas linguagens possuem tipos “duros” (hard types).

Page 24: Linguagem c

Ling

uage

m C

24

Operadores

• Atribuição MúltiplaÉ possível atribuir um valor a muitas variáveis em uma única instrução.

int i, j, k;double max, min;i = j = k = 1;max = min = 0.0;

• Operadores AritméticosOperador Operação

+ adição - subtração * multiplicação / divisão % módulo (resto da divisão inteira)

Page 25: Linguagem c

Ling

uage

m C

25

Conversão de tipo (casting)• O operador cast permite forçar uma expressão a ser de determinado tipo:

int num;float valor = 13.0;num = valor % 2; // inválidonum =(int) valor % 2; // válido

A conversão de tipo é usada para que o dado armazenado em valor fosse transformado no tipo int assim a operação módulo pode ser efetuada.

• Regra geral de conversão de tipos:char int float double

Page 26: Linguagem c

Ling

uage

m C

26

Incremento/Decremento

Utilizados para incrementar e/ou decrementar em uma unidade o valor de uma variável. Eles podem ser utilizados antes (prefixo) ou após (posfixo) a variável, dando resultados ligeiramente diferentes. Ex.: Y = X ++; “Y recebe o valor de X e depois X é incrementado”Y = X --; “Y recebe o valor de X e depois X é decrementado”Y = ++ X; “X é incrementado e depois Y recebe o valor de X” Y = -- X; “X é decrementado e depois Y recebe o valor de X”

Page 27: Linguagem c

Ling

uage

m C

27

Operadores Relacionais

• As expressões compostas com operadores relacionais comparam dois valores e retornam 0 em caso de expressões falsas e 1 se forem verdadeiras.

Operador Operação < Menor que > Maior que < = Menor que ou igual a > = Maior que ou igual a = = Igual a ! = Diferente de

Page 28: Linguagem c

Ling

uage

m C

28

Operadores Lógicos

• Os operadores lógicos comparam duas expressões e retornam o valor 0 (falso) ou 1 (verdadeiro).

Operador Operação && AND (E) || OR (OU) ! NOT (NÃO)

• O operador unário ! tem maior precedência, seguido do operador E lógico. O operador OU lógico tem a menor precedência dentre os operadores lógicos.

Page 29: Linguagem c

Ling

uage

m C

29

Operadores Bit a Bit

• Os operadores de bit só podem ser utilizados com valores do tipo caracter ou inteiro.

Operador Operação << Deslocamento à esquerda >> Deslocamento à direita

& E bit a bit | OU bit a bit ^ XOU bit a bit ~ Não bit a bit (complemento de um)

Page 30: Linguagem c

Ling

uage

m C

30

Operadores Bit a Bit

Ex.: a = 15 0 0 0 0 1 1 1 1

a << 1 0 0 0 1 1 1 1 0

a >> 3 0 0 0 0 0 0 1 1

Ex.: a = 15 0 0 0 0 1 1 1 1

b = 56 0 0 1 1 1 0 0 0 a & b 0 0 0 0 1 0 0 0 a | b 0 0 1 1 1 1 1 1 a ^ b 0 0 1 1 0 1 1 1

Page 31: Linguagem c

Ling

uage

m C

31

Operador Condicional (Ternário)

• O operador condicional (ou ternário) consiste de um ponto de interrogação (?) e um dois pontos (:) usados juntos e requer três operandos.

resultado = modo > 0 ? 1 : 0;

a variável resultado receberá valor 1 se modo for maior que 0, caso contrário receberá 0.

V

F

Page 32: Linguagem c

Ling

uage

m C

32

Expressões Reduzidas

Expressão normal Expressão reduzida

soma = soma + cont; soma += cont;

d = d – 3; d-= 3;

y = y * (z+1); y*= z+1;

i = i / j; i/= j;

a = a & b; a &= b;

a = a << 3; a <<= 3;

Page 33: Linguagem c

Ling

uage

m C

33

Precedência dos OperadoresMaior ( ) [ ] ->

! ~ ++ -- - (tipo) * & sizeof

* / %

+ -

<< >>

< <= > >=

== !=

&

^

|

&&

||

?:

= += -= *= /= etc.

Menor ,

Page 34: Linguagem c

Ling

uage

m C

Instituto CERTI Amazônia. Treinamento para Sistemas Embarcados 34

Problemas1. Escreva quatro instruções diferentes em C, cada uma subtraindo

1 da variável n.2. Escreva um bloco de código C que tem o mesmo efeito da

instruçãon = 100 + m++;

sem utilizar o operador de pós-incremento 3. Escreva um bloco de código C que tem o mesmo efeito da

instruçãon = 100 + ++m;

sem utilizar o operador de pré-incremento 4. Escreva uma instrução única em C que subtraia de z a soma de

x e y e depois incremente y.5. Se m=5 e n=2, quais serão os valores de m e n após cada uma

das expressões: a. m *= n++;b. m += --n;

Page 35: Linguagem c

Ling

uage

m C

35

Ementa

• Introdução• Operadores e Expressões• Funções de E/S• Estruturas de Controle• Vetores e Matrizes• Strings• Ponteiros• Funções• Estruturas• Alocação Dinâmica de Memória• Arquivos

Page 36: Linguagem c

Ling

uage

m C

36

E/S pelo console

FUNÇÃO printf():A função printf() é utilizada para escrever na tela. O protótipo desta função está descrito no arquivo de cabeçalho <stdio.h>. printf("string de controle", lista de argumentos);A string de controle contém caracteres que serão exibidos na tela, comandos de formatação que dizem a printf() como exibir os argumentos restantes ou ambos. Quando encontra um comando de formatação, a função liga os comandos aos argumentos.

Page 37: Linguagem c

Ling

uage

m C

37

E/S pelo consoleCódigo Significado%d Exibe um inteiro no formato decimal com

sinal%uExibe um inteiro no formato decimal sem sinal%f Exibe um tipo float no formato decimal%c Exibe um caractere%s Exibe uma string %oExibe um número octal sem sinal%xExibe um número hexadecimal sem sinal (letras

minúsculas)%X Exibe um número hexadecimal sem sinal (letras

maiúsculas)

Page 38: Linguagem c

Ling

uage

m C

38

E/S pelo consoleExemplos:printf("%s %d", "Esta é uma string ", 100);

exibe:Esta é uma string 100

printf("esta é uma string %d", 100);exibe:esta é uma string 100

printf("o número %d é decimal, %f é ponto flutuante.",10, 110.79);exibe:o número 10 é decimal, 110.79 é ponto flutuante.

printf("%s", "Alô\n");exibe:Alôe avança uma linha

printf(“%c, %d”,65,”C”);exibe:A, 67

Page 39: Linguagem c

Ling

uage

m C

39

E/S pelo console

FUNÇÃO scanf():A função scanf() é utilizada para leitura de dados pelo teclado. O protótipo desta função está descrito no arquivo de cabeçalho <stdio.h>. scanf("string de controle", lista de argumentos);A string de controle determina como os valores são lidos para as variáveis apontadas na lista de argumentos. Todas as leituras devem ser finalizadas por <ENTER>. A lista de argumento deve conter os endereços das variáveis a que devem ser atribuídos os valores.

Page 40: Linguagem c

Ling

uage

m C

40

E/S pelo consoleExemplos:

#include <stdio.h>main(){int idade;printf(“Digite um número: ”);scanf(“%d”, &idade);printf ("\nA minha idade é %d", idade) ;}#include <stdio.h>main(){int pes;float metros;printf("Informe o número de pes: ");scanf("%d", &pes); metros = pes * 0.3048; printf("\n%d pés é %f metros", pes, metros);}

Page 41: Linguagem c

Ling

uage

m C

41

E/S pelo console

Instruções Descriçãogetchar() lê um caracter do teclado aguardando

<Enter>

getche() lê um caracter do teclado e prosseguegetch() lê um caracter sem eco na tela e

prossegue

putchar() escreve um caracter na telagets() lê uma string do teclado

puts() escreve uma string na tela

Page 42: Linguagem c

Ling

uage

m C

42

E/S pelo consoleExemplos:

#include <stdio.h>main(){char ch;ch=getchar();putchar(ch);}

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(“%04d”, 21) 0021

Page 43: Linguagem c

Ling

uage

m C

43

Exercícios

1. Utilize o operador sizeof para exibir quanto espaço em bytes ocupa cada um dos tipos básicos de C (char, int, float e double).

2. Leia uma temperatura em graus Centígrados e apresentá-la convertida em graus Fahrenheit. A fórmula de conversão é: F = (9 * C + 160) / 5. Exiba o resultado com 3 casas decimais.

3. Faça um programa que leia um caractere e exiba seu código ASCII equivalente.

4. Leia e exiba uma string com seu nome completo usando a função scanf(). Qual o resultado obtido? Justifique.

Page 44: Linguagem c

Ling

uage

m C

44

Ementa

• Introdução• Operadores e Expressões• Funções de E/S• Estruturas de Controle• Vetores e Matrizes• Strings• Ponteiros• Funções• Estruturas• Alocação Dinâmica de Memória• Arquivos

Page 45: Linguagem c

Ling

uage

m C

45

Estruturas de Controle

• Governam o fluxo de execução do programa. Se dividem em três categorias:

– Desvios Condicionais: if, operador ternário (?:) e switch.

– Loop: while(), do-while(), for() e os comandos continue e break.

– Desvio Incondicional: goto.

Page 46: Linguagem c

Ling

uage

m C

46

if

Sintaxe: if (expressão) comando;else comando;

onde, comando poder ser um único, um bloco de comandos e, neste caso, usa-se os delimitadores de bloco de comandos ( { } ) ou nenhum comando. A cláusula else é opcional.

F

if (expressão) comando;

else comando; próximo comando;

V

Page 47: Linguagem c

Ling

uage

m C

47

ifExemplo:

main(){int a, b;printf(“Digite dois números”);scanf(“%d,%d”,&a,&b);if (b) printf(“%f\n”,(float)a/b);else printf(“divisão por zero\n”);}

Page 48: Linguagem c

Ling

uage

m C

48

if aninhados

Ocorre quando um comando if é um objeto de um outro if ou else.

Sintaxe exemplo:if ( i ){ if ( k ) comando1; if ( j ) comando2; else comando3;}else comando4;

Page 49: Linguagem c

Ling

uage

m C

49

if – else - ifSintaxe exemplo:

if (expressão) comando; else if (expressão) comando;

else if (expressão) comando; else if (expressão) comando;

else comando;Neste caso, as expressões são avaliadas de cima para baixo. Assim que uma expressão for diferente de zero (verdadeira), o comando associado a ela é executado e a estrutura encerrada. Se nenhuma expressão for verdadeira, será executado o comando associado ao último else e, se ele não for declarado, nenhum comando será executado.

Page 50: Linguagem c

Ling

uage

m C

50

if – else - if

main(){int magico, adivinhacao;randomize();magico= random(10);printf(“ADIVINHE: ”);scanf(“%d”,&adivinhacao);if (adivinhacao == magico){ printf(“ACERTOU”); printf(“%d é o número mágico\n”, magico);} else if (adivinhacao > magico)

printf(“—errado– muito alto\n’); else (“—errado– muito baixo\n’);}

Page 51: Linguagem c

Ling

uage

m C

51

Operador Ternário

main(){int x = 3, y = 7, max;max = (x>y)?1:0;printf(“max = %d\n”,max);}

Page 52: Linguagem c

Ling

uage

m C

52

switchO comando de seleção switch é utilizado em caso de seleção múltipla. Ele testa o valor de uma expressão contra uma lista de constantes inteiras ou caracter. Quando o valor é igual, os comandos associados àquela constante são executados. Se nenhuma coincidência for encontrada os comandos de default são executados.

switch(expressão){case constante1:comandos;break;case constante2:comandos;break;.default:comandos;}

Page 53: Linguagem c

Ling

uage

m C

53

switchO comando break causa a saída imediata do switch. Se não existir um comando break seguindo os comandos de um case, o programa segue executando os comandos dos cases abaixo. Exemplo:void main() {

int dia;clrscr();printf(“Digite um dia da semana: “);scanf(“%d”,&dia);switch(dia) { case 1: printf(“\nDomingo\n”); break; case 2: printf(“\nSegunda\n”); break;. case 7: printf(“\nSábado\n”); break;default: printf(“\nNúmero inválido!!!\n”);}}

Page 54: Linguagem c

Ling

uage

m C

54

Comandos de repetição

O comando de repetição é utilizado nos casos em que queremos repetir determinados comandos.

Laço for Sintaxe: for(inicialização;condição;incremento) comando; ou for(inicialização;condição;incremento) { comandos; }

Page 55: Linguagem c

Ling

uage

m C

55

for

Inicialização: é geralmente uma atribuição que determina o valor inicial da variável de controle. Esta declaração pode ser feita antes do laço e, desta forma, não necessita ser declarada no escopo do comando.

Condição: é uma expressão que determina o final do laço ou o valor final da variável de controle.

Incremento: define como a variável de controle do laço varia cada vez que o laço é repetido.

Page 56: Linguagem c

Ling

uage

m C

56

forExemplo:

int x;for(x=1;x<=100;x++) printf(“%d”,x);for(x=100;x!=65;x-=5) {

z=x*x;printf(“o quadrado de %d é %f”,x,z);

}O laço infinito:

for( ; ; ) printf(“este laço é infinito\n”);ch=”\0”;for( ; ; ){

ch=getchar();if (ch==”A”) break; o comando break causa

o término imediato do laço}printf(“Você digitou A”);

Page 57: Linguagem c

Ling

uage

m C

57

while

Sintaxe: while(condição) comando;ou

while(condição) { comandos;}

A condição pode ser qualquer expressão, e verdadeiro é qualquer valor não-zero. Quando a condição é falsa, o controle do programa passa para o primeiro comando após o bloco de código do comando while.

Page 58: Linguagem c

Ling

uage

m C

58

whileExemplo:void main(){

int t=1, dia;while(t) {printf(“Digite um dia da semana, ou <99> para encerrar: “);scanf(“%d”,&dia);switch(dia) {case 1: printf(“\nDomingo\n”);break;.case 7: printf(“\nSábado\n”);break;case 99: printf(“\nEncerrando\n”);t=0;break;default: printf(“\nNúmero inválido!!!\n”);} /* fim switch*/

} /* fim while */} /* fim main() */

Page 59: Linguagem c

Ling

uage

m C

59

do-while

Ao contrário dos laços for e while, que testam as condições no início, o do-while testa a condição no final. Este laço sempre será executado pelo menos uma vez e repete até que a condição se torne falsa.Sintaxe: do

{comando} while (condição);

Exemplo:do{

scanf(“%d”,&num);}while(num!=99);

Page 60: Linguagem c

Ling

uage

m C

60

Comandos de desvio

São utilizados para realizar desvios dentro de um programa.

• break:O comando break tem duas finalidades. A primeira é de terminar um case num comando switch e a segunda é de forçar o término imediato de um laço de repetição.

Exemplo: for(t=0;t<100;t++){ print(“%d \n”,t); if(t==10) break; }

Page 61: Linguagem c

Ling

uage

m C

61

Comandos de desvio

• continue: Força a repetição (retorna ao início do laço

e testa a condição).

Exemplo: for(x=0;x<100;x++){ if (x%2) continue;

print(“%d \n”,x); }

Page 62: Linguagem c

Ling

uage

m C

62

Comandos de desvio

• goto: Apesar das linguagens possuírem estruturas de

controle eficientes, também é disponibilizado o comando de desvio. Deve-se ter um cuidado muito grande, pois a sua utilização em demasia ou de forma incorreta tende a tornar os programas ilegíveis. A sua utilização é simples, basta declarar um rótulo (identificador aceito pela linguagem C seguido de dois pontos) e, de algum ponto do programa estabelecer o desvio através da declaração goto rótulo;Sintaxe: goto rótulo;

rótulo:

Page 63: Linguagem c

Ling

uage

m C

63

Comandos de desvio

Exemplo:int x=1;retorno:

printf(“%d”,x); x++; if(x<=100) goto retorno;

Page 64: Linguagem c

Ling

uage

m C

64

Comandos de desvio

• exit():Assim como o comando break força o término de um laço, a função exit() força o término de execução de um programa, retornando ao sistema operacional.Sintaxe:void exit(código_de_erro);onde código_de_erro é utilizado para indicar o estado de retorno. Quando for zero, indica término normal de execução e outros valores são utilizados para indicar algum tipo de erro (retornado para a variável ERRORLEVEL em arquivos “batch” do DOS).

Page 65: Linguagem c

Ling

uage

m C

65

Lista de Exercícios

1. Anacleto tem 1,50 metro e cresce 2 centímetros por ano, enquanto Felisberto tem 1,10 metro e cresce 3 centímetros por ano. Calcule e exiba quantos anos serão necessários para que Felisberto seja maior que Anacleto.

2. Imprima os números perfeitos menores de 100.Nota: Número perfeito é aquele cuja soma de seus

divisores, exceto ele próprio, é igual ao número.Exemplo: 6 é perfeito porque 1 + 2 + 3 = 6.

3. Calcule e apresente o valor de S no seguinte somatório:S = 1/225 – 2/196 + 4/169 – 8/144 + ... + 16384/1

Page 66: Linguagem c

Ling

uage

m C

66

Ementa

• Introdução• Operadores e Expressões• Funções de E/S• Estruturas de Controle• Vetores e Matrizes• Strings• Ponteiros• Funções• Estruturas• Alocação Dinâmica de Memória• Arquivos

Page 67: Linguagem c

Ling

uage

m C

67

Vetor

• Um vetor é uma matriz de uma dimensão capaz de armazenar um conjunto de variáveis de mesmo tipo, referenciadas pelo seu nome e por um índice.• Sintaxe: tipo nome[tamanho];• As variáveis são alocadas seqüencialmente na memória.• tamanho representa o número de elementos suportado pelo vetor.• O índice do vetor varia de 0 a (tamanho-1).

Page 68: Linguagem c

Ling

uage

m C

68

Vetor

Exemplo:

Vetor notas 10 5 0 7 2índices 0 1 2 3 4

main(){int notas[5], i, soma=0;for (i=0; i<5 ; i++) { printf(“Digite a nota %d:”,i); scanf(“%d”,&notas[i]); }for (i=0; i<5 ; i++) soma = soma + notas[i];printf(“Media = %f”, (float) soma/5);}

Page 69: Linguagem c

Ling

uage

m C

69

Verificação de Limites• A linguagem C não faz verificação automática dos

limites dos vetores.• O teste dos limites deve ser realizado pelo programa

e é erro comum de programação:

main(){int a[10],i;for (i=1;i<=10;i++) scanf(“%d”,&a[i]);

}

Page 70: Linguagem c

Ling

uage

m C

70

Exercícios

1. Leia dois vetores A e B com 5 elementos inteiros cada, calcule e escreva:– O vetor S = A + B;– O vetor W com os elementos intercalados de A e

B;– O vetor Z obtido pela inversão da ordem de A;– O vetor Q com os elementos comuns de A e B;– O vetor Y correspondente à união de A e B;– Coloque A em ordem crescente de seus

elementos.

Page 71: Linguagem c

Ling

uage

m C

71

Matrizes

• Possuem duas dimensões fazendo menção a linhas e colunas.

• Sintaxe: tipo nome[dim_linha][dim_coluna];• Ex: int N[2][3];

Matriz N

05 6 7 Valores

1 6 7 8 Valores

Linha 0 1 2 Coluna

Page 72: Linguagem c

Ling

uage

m C

72

Matrizes

#include <stdio.h>main(){

int a[2][3], x, y;printf(“Digite 6 valores”);for(x=0; x<2; x++) for(y=0; y<3; y++)

scanf(“%d”, &a[x][y]);}

Page 73: Linguagem c

Ling

uage

m C

73

Inicialização de Matrizes

• C permite a inicialização de matrizes no momento da declaração. Ex:

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

1, 1,2, 4, 3, 9,4, 16,5, 25};

Page 74: Linguagem c

Ling

uage

m C

74

Matrizes Não-Dimensionadas

• C pode calcular automaticamente as dimensões de uma matriz, usando matriz não-dimensionadas. Se, na inicialização de uma matriz, seu tamanho for omitido, o compilador C cria uma matriz grande o bastante para conter todos os dados inicializadores presentes.int i[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int sqrs [][2] = {

1, 1,2, 4, 3, 9,4, 16,5, 25};

Page 75: Linguagem c

Ling

uage

m C

75

Exercícios

1. Leia uma matriz 5x5, imprima a soma dos elementos da diagonal principal e a soma dos elementos da diagonal secundária.

2. Leia duas matrizes A e B, do tipo 3x3, calcule em uma matriz R sua multiplicação, ou seja, R = A * B.

3. Leia uma matriz 5x5, calcule a sua transposta. Imprima as duas matrizes.

4. Faça um programa que ordene uma matriz de 5x5 em ordem decrescente, de maneira que o maior valor se localize na posição [0][0] e o menor na [4][4]. O programa deve escrever a matriz original e a ordenada.

Page 76: Linguagem c

Ling

uage

m C

76

Ementa

• Introdução• Operadores e Expressões• Funções de E/S• Estruturas de Controle• Vetores e Matrizes• Strings• Ponteiros• Funções• Estruturas• Alocação Dinâmica de Memória• Arquivos

Page 77: Linguagem c

Ling

uage

m C

77

Matrizes de char (strings)

• Uma "string" é definida como sendo constituída de uma matriz de caracteres (tipo de dado char - 1 byte) que é terminada por um "nulo". Um nulo é especificado usando-se '\0' que é zero.• Por exemplo, se quisermos declarar uma matriz "str" que possa armazenar uma string de 10 caracteres, escrevemos:

char str [11]; • As funções de manipulação de string armazenam e manipulam automaticamente o ‘\0’.• Uma constante string fica entre “ “ (aspas), ex: printf(“%s”, “Curso C”);

Page 78: Linguagem c

Ling

uage

m C

78

Strings• Leitura de uma string do teclado: A maneira mais

fácil de inserir uma string pelo teclado é com a função de biblioteca gets(). A forma geral da função gets() é:

gets(nome_da_matriz);#include <stdio.h>main(){ char str [80]; printf("informe uma string:"); gets(str); /*le a string do teclado*/ printf("%s", str);}

Page 79: Linguagem c

Ling

uage

m C

79

Inicialização de Strings

• Inicialização de string dimensionada:char erro[17] = “erro de leitura\n”;

• Inicialização de string não-dimensionada. Deixa que o compilador crie uma matriz grande o suficiente para conter a string:char erro[] = “erro de leitura\n”;

Page 80: Linguagem c

Ling

uage

m C

80

Funções de Manipulação de String• As funções de manipulação de strings estão declaradas no arquivo de cabeçalho “string.h”.Função strcpy(): Copia o conteúdo da string "de" para a string "para". Forma geral:

strcpy(para,de);#include <stdio.h>#include<string.h>main(){ char str [80]; strcpy(str, "Alo"); printf("%s", str);}

Page 81: Linguagem c

Ling

uage

m C

81

Funções de Manipulação de String

Função strlen(): Retorna o tamanho de s.

strlen(s); onde s é uma string. /* imprime o tamanho da string digitada

*/ #include<stdio.h> #include<string.h> main() { char str [80]; printf("digite uma string:"); gets(str); printf("%d", strlen(str)); }

Page 82: Linguagem c

Ling

uage

m C

82

Funções de Manipulação de StringFunção strcmp(): Compara duas strings e retorna 0 se elas forem iguais. Se s1 é lexicograficamente maior (Exemplos: "BBBB">"AAAA") que s2, então um número positivo é retornado; se for menor que s2, um numero negativo é retornado. strcmp(s1,s2); #include<stdio.h> #include <string.h> main() { char s[80]; printf("informe a senha:"); gets(s); if(strcmp(s, "senha")) printf("senha invalida\n"); else printf("senha correta\n"); }

Page 83: Linguagem c

Ling

uage

m C

83

Funções de Manipulação de String

Função strcat(): Anexa (concatena) "s2" em " s1"; "s2" não é modificada. As duas strings devem ser terminadas com nulo e o resultado também será terminado com um nulo.

strcat(s1,s2); #include <stdio.h> #include <string.h> main(){ char s1[20], s2[15]; strcpy(s1, "Alo"); strcpy(s2," para todos"); strcat(s1,s2); printf("%s",s1); }

Page 84: Linguagem c

Ling

uage

m C

84

Exercícios

1. Escrever um programa que lê duas strings e informa o tamanho, a igualdade entre elas e no final escrever as strings concatenadas.

2. Escrever um programa que lê uma string e a escreve em ordem inversa.

3. Escrever um programa que lê uma string e escreve quantos caracteres iguais a ‘a’ existem na string.

4. Escrever um programa que lê uma string e a escreve em maiúsculo. Ver função toupper.

5. Escrever um programa que lê uma string s[30] e escreve cada palavra desta string numa nova linha

Page 85: Linguagem c

Ling

uage

m C

85

Ementa

• Introdução• Operadores e Expressões• Funções de E/S• Estruturas de Controle• Vetores e Matrizes• Strings• Ponteiros• Funções• Estruturas• Alocação Dinâmica de Memória• Arquivos

Page 86: Linguagem c

Ling

uage

m C

86

Ponteiros

• Um ponteiro é uma variável que contém um endereço de memória. Esse endereço é normalmente a posição de uma outra variável na memória.• Sintaxe: tipo *nome_ponteiro;• tipo do ponteiro define que tipo de variável o ponteiro pode apontar.• Operadores de Ponteiros:

& Operador unário que retorna o endereço na memória do seu operando.

* Operador unário que retorna o valor da variável localizada no endereço que o segue.

Page 87: Linguagem c

Ling

uage

m C

87

Exemplos• int y, x=0, *px, *py;

px=&x; “px aponta para x”y=*px; “y recebe conteúdo de x, ou seja, 0”py=px; “py também aponta para x”*py=3; “variável apontada por py, ou seja, x, recebe 3”

• float x=10.1, y;int *p;p=&x; /* erro */y=*p;printf(“%f”,y);

• int x, *p;x=10;*p=x; /* cuidado, ponteiro perdido */

/* (contém lixo) */

Page 88: Linguagem c

Ling

uage

m C

88

Expressões com Ponteiros• Os ponteiros podem aparecer normalmente no lugar das variáveis.• O operador * tem maior precedência que as operações matemáticas.Y = *px + 1; /* y recebe a soma de 1 ao

conteúdo de *px */y = *(px+1); /* y recebe o conteúdo do

endereço de px + 1 (próximo) */• Dois ponteiros, como outras variáveis, podem ser comparados.if (p1==p2).. /* verifica se p1 e p2 apontam

para a mesma variável */

Page 89: Linguagem c

Ling

uage

m C

89

Incremento e Decremento de Ponteiros

• Os ponteiros não são necessariamente incrementados e decrementados em uma unidade, mas pelo tamanho do tipo apontado pelo ponteiro.

• Os operadores ++ e -- possuem precedência sobre o * e operadores matemáticos.

• Qual a diferença entre

p++; (*p)++; *(p++);

Page 90: Linguagem c

Ling

uage

m C

90

Incremento e Decremento de Ponteiros

p++; incrementa o ponteiro, ou seja, o endereço(p passa a apontar para a posição de memória imediatamente superior).

(*p)++; incrementa o conteúdo apontado por p, ou seja, o valor armazenado na variável para a qual p está apontando.

*(p++); incrementa p, como em p++, e acessa o valor encontrado na nova posição.

Page 91: Linguagem c

Ling

uage

m C

91

Ponteiros e Matrizes

• Há um grande relacionamento entre ponteiros e matrizes.

• Versões com ponteiros são mais rápidas.

• Os ponteiros possuem mais facilidades de manipulação.

• Ao contrário das matrizes, os ponteiros podem ser incrementados e decrementados diretamente.

Page 92: Linguagem c

Ling

uage

m C

92

Exemplo

• Lendo um vetor com ponteiro:main() {int a[5]={0,1,2,3,4}, *p, x;p=&a[0]; /* mesmo que p=a */x=*(p+2); /* x recebe a[2] */printf(“%d”, x);}

Page 93: Linguagem c

Ling

uage

m C

93

Exemplo

• Construindo um vetor com ponteiro:main(){int vet[10], *p, i;p=vet; for (i=0,i<10;i++) { *p=i; p++;}p=vet;for (i=0,i<10;i++) printf(“%d”, *p++);}

Page 94: Linguagem c

Ling

uage

m C

94

Exemplo

• Ponteiro com string:main(){ char str[80], *p; printf (“Digite string em letras

maiúsculas: “); gets(str); printf (“Eis a string em letras

minúsculas: “);p=str; /* p aponta para o primeiro

elemento de str */while (*p) printf(“%c”, tolower(*p++));

}

Page 95: Linguagem c

Ling

uage

m C

95

Exemplo

• Matrizes de Ponteiros:

main(){char *erro[2]={“arquivo inexistente\n”,

“erro na leitura\n”};printf (“%s”, erro[0]);printf (“%s”, erro[1]);}

Page 96: Linguagem c

Ling

uage

m C

96

Exercícios

1. Usando ponteiros, faça um programa que imprima uma string invertida.

2. Usando ponteiros, faça um programa que preencha uma matriz 10x10 de inteiros com os números de 1 a 100.

3. Usando ponteiros, faça um programa que leia duas strings e as concatene numa terceira string.

Page 97: Linguagem c

Ling

uage

m C

97

Teste

1. Leia 10 strings para uma matriz de string. Ordene e imprima as strings em ordem alfabética.

2. Na teoria de sistemas define-se como elemento minimax de uma matriz o menor elemento da linha em que se encontra o maior elemento da matriz. Escreva um programa que leia uma matriz 4 x 4 e determine e imprima o seu elemento minimax.

3. Escreva um programa que converta um numero em notação romana para notação decimal. Considere números menores que 1000.

Page 98: Linguagem c

Ling

uage

m C

98

Ementa

• Introdução• Operadores e Expressões• Funções de E/S• Estruturas de Controle• Vetores e Matrizes• Strings• Ponteiros• Funções• Estruturas• Alocação Dinâmica de Memória• Arquivos

Page 99: Linguagem c

Ling

uage

m C

99

Funções

• É uma sub-rotina que realiza uma tarefa específica.• Um programa em C é uma coleção de funções.• Forma geral de uma função: tipo_retorno nome(lista_parâmetros) { // corpo da função }

tipo_retorno especifica o tipo de dado retornado pela função. Pode ser qualquer tipo válido exceto um array.

nome especifica o nome da função. lista_parâmetros é uma seqüência de pares de tipo e

identificador separados por vírgulas. São as variáveis que recebem o valor dos argumentos passados para a função quando chamada.

Page 100: Linguagem c

Ling

uage

m C

100

Função sem parâmetro// Este programa contém duas funções: main() e

minha_func()void minha_func(); // protótipo de minha_func()

// Não há parâmetros formaisint main(){printf(“Em main() \n”);minha_func(); // chame minha_func()printf(“De volta a main()”);}// Esta é a definição da função.void minha_func(){ printf(“De dentro de minha_func()\n”);} Em main()

De dentro de minha_func()De volta a main()

Page 101: Linguagem c

Ling

uage

m C

101

Função com parâmetrovoid box(int length, int width, int height); // protótipo de box() com 3 parâmetros formaisint main(){

box(7, 20, 4); // passa argumentos para boxbox(28, 30, 25);box(3, 5, 4);

}// Computa o volume da caixa.void box(int length, int width, int height){ printf(“Volume da caixa e %d”, length*width *height);} // Os parâmetros recebem os valores dos

argumentos passados para box().

Page 102: Linguagem c

Ling

uage

m C

102

O retorno de valores

• Uma função pode retornar um valor para seu chamador.

• Para retornar um valor usamos return valor.

• O tipo do valor retornado deve ser compatível com o tipo de retorno declarado na função. Se não for, um erro em tempo de compilação ocorrerá.

Page 103: Linguagem c

Ling

uage

m C

103

Função com retorno

int box(int length, int width, int height); // box() agora retorna um inteiro

int main(){ int volume; volume=box(7, 20, 4); // o valor de retorno

de box() é atribuído a volume. printf(“O Volume da caixa e %d”, volume);}// Computa o volume da caixa.int box(int length, int width, int height){

return length*width*hieght; } // box() retorna o volume da caixa para

main() O Volume da caixa e 560

Page 104: Linguagem c

Ling

uage

m C

104

Regras de Escopo

• Existem três tipos de variáveis: variáveis locais, parâmetros formais e variáveis globais.

• As regras de escopo regem a visibilidade e o tempo de vida de cada um desses tipos.

Variáveis Locais

Declaradas dentro de uma função ou dentro de um bloco de código.

Conhecidas apenas dentro do bloco no qual estão declaradas.

São criadas na entrada do bloco e destruídas na saída.

Page 105: Linguagem c

Ling

uage

m C

105

Variáveis Locaisvoid func1() { int x; //x é local para func1() x=10; printf(“x = %d”,x);}

void func2(){ int x=9; //x é local para func2().

if (x==9){int y=20; //y é local ao bloco if

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

y=100; //erro! Y não é conhecido aqui.}

Page 106: Linguagem c

Ling

uage

m C

106

Parâmetros Formais

• Parâmetros Formais– São as variáveis que recebem os argumentos

de uma função. – Dentro de uma função, elas se comportam

como qualquer outra variável local.– Os parâmetros formais declarados devem ser

do mesmo tipo dos argumentos usados para chamar a função.

Page 107: Linguagem c

Ling

uage

m C

107

Parâmetros Formais

#include <stdio.h> /* declaração do arquivo de cabeçalho*/int mul_var(int, int); /* declaração do protótipo mul_var */int mul_var(int x, int y) /* declaração da função mul_var */{ int z; z = x * y; return(z);}void main(void) /* declaração da função main()

{ int a, b, mul; printf("Digite 2 valores:\n"); scanf("%d %d", &a, &b); mul = mul_var( a, b); /* chamada da função mul_var*/

printf("\n %d ", mul);}

Parâmetros formais da função

Argumentos da função, devem ser do mesmo tipo do parâmetro formal

Page 108: Linguagem c

Ling

uage

m C

108

Variáveis Globais

• Variáveis Globais– Estas variáveis são declaradas fora das funções, ou

seja, logo após as declarações #include.– São conhecidas por todo o programa e podem ser

usadas por qualquer parte do código.– Variáveis globais retêm seus valores durante toda a

execução do programa.

Page 109: Linguagem c

Ling

uage

m C

109

Variáveis Globais#include <stdio.h>void func1();int count; // count é globalint main() {

int i; // i é localfor (i=0;i<10;i++) {

count = i*2;func1();

}return 0;

}

void func1() { printf(“count: %d\n”, count); //acessa count global}

Page 110: Linguagem c

Ling

uage

m C

110

Exercícios

1. Escreva e teste a seguinte função média(), que retorna a média dos três números: float media(float x1, float x2, float x3)

1. Escreva e teste a seguinte função power(), que retorna x elevado a potência de n, onde n pode ser qualquer inteiro: double power(double x, int n)Utilize o algoritmo que calcularia x20 multiplicando 1 por x 20 vezes.

3. Escreva e teste a seguinte função isSquare(), que determina se o inteiro dado é um número quadrado: int isSquare(int n). Retorna 1 se for número quadrado e 0 caso contrário.Os primeiros 10 números quadrados são: 0, 1, 4, 9, 16, 25, 36, 49, 64 e 81

Page 111: Linguagem c

Ling

uage

m C

111

Passagem de ponteiros para funções

#include <stdio.h>void f(int *j); // f adota um ponteiro int* como parâmetro

int main() {int i=0, *p;p=&i;f(p); // passa o ponteiro// ou f(&i) passa o endereço de iprintf(“ i = %d”, i);return 0;

}// f recebe um ponteiro para um intvoid f(int *j) { *j=100; // var apontado por j recebe 100}

Page 112: Linguagem c

Ling

uage

m C

112

Passagem de um array

• Quando um array é um argumento para uma função, o endereço do array é passado, e não uma cópia de todo o array.

• Um nome de array sem qualquer índice é um ponteiro para o primeiro elemento no array.

Page 113: Linguagem c

Ling

uage

m C

113

Passagem de um array#include <stdio.h>void mostra(int num[10]);

int main() {int t[10], i;for (i=0; i<10 ;i++) t[i]=i;mostra (t); // passa o array t para uma funçãoreturn 0;

}// Parâmetro é um array dimensionadovoid mostra(int num[10]) { int i;

for (i=0; i<10 ;i++) printf(“%d “,num[i]);}OBS: O Compilador C automaticamente converterá o

parâmetro num para um ponteiro int, já que nenhum parâmetro pode receber um array inteiro. Apenas o endereço do array é passado.

Page 114: Linguagem c

Ling

uage

m C

114

Passagem de um array

Outras possibilidades de passar um ponteiro de array:• Parâmetro é um array não dimensionadovoid mostra(int num[ ]) { int i;

for (i=0; i<10 ;i++) printf(“%d “,num[i]);}

• Parâmetro declarado como ponteirovoid mostra(int *num) { int i;

for (i=0; i<10 ;i++) printf(“%d “,num[i]);}// um ponteiro pode ser indexado usando [], como se // fosse um array

Page 115: Linguagem c

Ling

uage

m C

115

Passagem de strings

• Como uma string é simplesmente um array de caracteres que é terminado por caractere nulo, quando passamos uma string para uma função, apenas um ponteiro para o início da string é na realidade passado.

Page 116: Linguagem c

Ling

uage

m C

116

Passagem de strings

void strInvertCase(char *str);

int main() {char str[80];strcpy(str, “Isto E Um Teste”);strInvertCase(str); //passa ponteiro para strputs(str);return 0;

}void strInvertCase(char *str){ while(*str) {

if (isupper(*str)) *str=tolower(*str); else if (islower(*str)) *str=toupper(*str); str++;}}

Page 117: Linguagem c

Ling

uage

m C

117

Exercícios1. Escreva e teste a função strlen() 2. Escreva e teste a seguinte função:

void add(float a[], int n, float b[]);A função adiciona os primeiros n elementos de b aos n primeiros elementos de a. Por exemplo, se a for {2.2,3.3,4.4,5.5,6.6,7.7,8.8,8.9} e b for {6.0,5.0,4.0,3.0,2.0,1.0}, a chamada add(a, 5, b) transformaria a em {8.2, 8.3, 8.4, 8.5, 8.6, 7.7, 8.8, 8.9}.

3. Escreva e teste a seguinte função, que remove um item de um array:void remove(float a[], int &n, int i);A função remove a[i] mudando para baixo todos os elementos acima dessa posição e decrementando n.

Page 118: Linguagem c

Ling

uage

m C

118

A função main()

• Podemos passar informações para um programa ao rodá-lo. Isto é possível passando argumentos de linha de comando para a função main().

• C define dois parâmetros embutidos, mas opcionais para main(). Eles são argc e argv.

• argc é um número inteiro que contém o número de argumentos na linha de comandos. Ele sempre será pelo menos 1, porque o nome do programa se qualifica como primeiro argumento.

• argv é um ponteiro para um array de ponteiros de caracteres. Cada ponteiro no array argv aponta para uma string contendo um argumento de linha de comando.

Page 119: Linguagem c

Ling

uage

m C

119

A função main()

• O nome do programa é apontado por argv[0]; argv[1] apontará para o primeiro argumento, argv[2] para o segundo argumento e assim por diante.

• argv é declarado da seguinte forma: char *argv[];

Page 120: Linguagem c

Ling

uage

m C

120

argc e argv• Esse programa exibe os argumentos da linha de

comando:

int main(int argc, char *argv[]) {for (int i=0; i<argc; i++) puts(argv[i]);return 0;

}Se o programa for chamado de ComLine, então executá-lo da forma: Comline um dois tres, teríamos a seguinte saída:

Comlineum doistres

Page 121: Linguagem c

Ling

uage

m C

121

Exercícios

1. Escreva e teste a seguinte função que retorna o índice do menor valor de um array dado: int minIndex(float a[ ])

1. Escreva e teste a seguinte função que retorna o valor mínimo entre os primeiros n elementos de um array dado:float min(float a[ ], int n)

1. Escreva a função strcpy().2. Escreva um programa que exiba a soma dos dois

argumentos numéricos de linha de comando.

Page 122: Linguagem c

Ling

uage

m C

122

Ementa

• Introdução• Operadores e Expressões• Funções de E/S• Estruturas de Controle• Vetores e Matrizes• Strings• Ponteiros• Funções• Estruturas• Alocação Dinâmica de Memória• Arquivos

Page 123: Linguagem c

Ling

uage

m C

123

Estruturas

• Uma estrutura é uma coleção de variáveis referenciadas pelo mesmo nome.

• As variáveis que formam a estrutura são chamadas de membros ou campos da estrutura.

• A palavra reservada struct informa ao compilador a definição de uma estrutura.

Page 124: Linguagem c

Ling

uage

m C

124

Estruturas

Exemplo de estrutura:

struct pessoal {char nome[30];char endereco[80];int idade;float salario;

};Para declarar uma variável com essa estrutura:

struct pessoal funcionario;

Page 125: Linguagem c

Ling

uage

m C

125

Estruturas

Referência aos elementos da estrutura: operador ponto (.)

gets(funcionario.nome);funcionario.idade=20;printf(“ %f”, funcionario.salario);puts(funcionario.endereco);

Page 126: Linguagem c

Ling

uage

m C

126

Matrizes de Estruturas

• Para declarar uma matriz de estruturas do tipo pessoal de 100 elementos:

struct pessoal funcionario[100];• Para acessar uma estrutura específica,

indexamos o nome da estrutura. Por exemplo, para imprimir o campo nome da estrutura 3:

gets(funcionario[3].nome);

Page 127: Linguagem c

Ling

uage

m C

127

Exercício

1. Escreva um programa simples que gerencie um cadastro com registros com os campos NOME, SEXO, COR_DE_OLHOS, IDADE, ALTURA e PESO. Escreva as funções Inserir, Exibir e Excluir um registro da matriz. Obtenha a seleção das funções através de um menu.

Sugestão: assuma que uma estrutura não está em uso se o campo NOME estiver vazio.

Page 128: Linguagem c

Ling

uage

m C

128

Uniões

• Uma união é uma localização de memória usada por muitas variáveis diferentes, que podem ser de tipos diferentes. A definição de uma união é parecida com aquela de uma estrutura:

union u_type {int i;char ch;

};• Para declarar uma variável do tipo u_type:

union u_type cvnt;

Page 129: Linguagem c

Ling

uage

m C

129

Uniões

• Em cntv, tanto o inteiro i como o caractere ch compartilham da mesma localização de memória. No entanto i ocupa dois bytes e ch apenas um.

• Para acessar um elemento de uma union:cvnt.i=1;

Page 130: Linguagem c

Ling

uage

m C

130

Exemplo de União

main(void){ union u_type {

int i; char ch[2];

};union u_type cvnt;cvnt.i=1000;printf ("uniao u como int: %d\n", cvnt.i);printf ("uniao u como char: %c %c\n",

cvnt.ch[0],cvnt.ch[1]);getch();}

Page 131: Linguagem c

Ling

uage

m C

131

typedef

• C permite a definição de novos nomes de tipos de dados com a palavra-chave typedef.

• A forma geral da instrução typedef é:typedef tipo nome;

• Por exemplo, podemos criar um novo nome para float usando:typedef float balance;

• Essa instrução diria ao compilador para reconhecer balance, como um novo nome pra float. Assim, poderíamos criar uma variável float usando:balance v_contabil;

Page 132: Linguagem c

Ling

uage

m C

132

Enumerações

• Enumeração é um conjunto de constantes inteiras com nome e especifica todos os valores legais que uma variável daquele tipo pode ter.

• Forma geral:enum nome_do_tipo_enum {lista de veriáveis}

lista variável;• Exemplo:

enum transporte {carro, aviao, trem, navio};

• Declaração de variável enum:enum transporte tr1;

Page 133: Linguagem c

Ling

uage

m C

133

Enumerações• Cada um dos símbolos da enumeração

representa um valor inteiro. Como tal, eles podem ser usados em qualquer expressão de números inteiros. A menos que inicializado de outra forma, o valor do primeiro símbolo da enumeração é 0, o valor do segundo é 1 e assim por diante.tr1=navio;if (tr1==carro) printf(“ vou de

carro”);printf(“%d”, aviao);

Page 134: Linguagem c

Ling

uage

m C

134

Ementa

• Introdução• Operadores e Expressões• Funções de E/S• Estruturas de Controle• Vetores e Matrizes• Strings• Ponteiros• Funções• Estruturas• Alocação Dinâmica de Memória• Arquivos

Page 135: Linguagem c

Ling

uage

m C

135

Alocação Dinâmica de Memória

• Um programa em C usa uma das duas maneiras principais de se armazenar informações na memória principal do computador.

• A primeira maneira usa variáveis globais e locais. Variáveis globais têm seu armazenamento fixo durante todo o tempo de execução do programa. Variáveis locais são armazenadas na pilha do programa. Entretanto essa maneira requer que o programador saiba, com antecedência, o montante de armazenamento necessário para cada situação.

• A segunda maneira é através de alocação dinâmica da área de memória livre (heap) do programa.

• As funções malloc() e free() formam o sistema de alocação dinâmica de C.

Page 136: Linguagem c

Ling

uage

m C

136

malloc()

• void *malloc(unsigned size)Retorna um ponteiro void para o primeiro byte de uma região da memória de tamanho size da área de alocação dinâmica. O ponteiro void deverá ser atribuído a um ponteiro do tipo desejado (usar cast explícito). Se não houver memória suficiente para satisfazer o pedido, malloc() retornará um ponteiro NULL.

Page 137: Linguagem c

Ling

uage

m C

137

free()

• free (void *p)O oposto de malloc(), free() devolve ao sistema a memória previamente alocada. free() nunca deve ser chamada com um argumento inválido, porque isto fará com que o computador destrua a lista livre.

Page 138: Linguagem c

Ling

uage

m C

138

Exemplo

main() { */ Aloca memória para 50 inteiros /*int *p, t;p=(int *)malloc(50*sizeof(int));if (!p) printf(“Memória Insuficiente!”);else {for (t=0; t<50; t++) *(p+t)=t;for (t=0; t<50; t++) printf(”%d”, *(p+t));free(p)

}}

Page 139: Linguagem c

Ling

uage

m C

139

Exercício

1. Escreva um programa que aloque espaço para cinco strings inseridas pelo usuário.

2. Escreva uma função getstruct() que aloque memória para uma estrutura addr e retorne o ponteiro para a memória alocada:

struct addr {char nome[40];char rua[40];char cidade[30];char esrado[3];char cep[10];

};

Page 140: Linguagem c

Ling

uage

m C

140

Ementa

• Introdução• Operadores e Expressões• Funções de E/S• Estruturas de Controle• Vetores e Matrizes• Strings• Ponteiros• Funções• Estruturas• Alocação Dinâmica de Memória• Arquivos

Page 141: Linguagem c

Ling

uage

m C

141

Arquivos

Ponteiro de Arquivo• Para ler ou escrever em um arquivo de disco, o

programa deve declarar uma variável ponteiro de arquivo.

• Um ponteiro de arquivo é um ponteiro para uma área na memória(buffer) onde estão contidos vários dados sobre o arquivo a ler ou escrever, tais como o nome do arquivo, estado e posição corrente

• Este buffer intermediário entre arquivo e programa é chamado 'fluxo‘ ou ‘stream’, e é uma entidade lógica genérica, que pode estar associada a uma unidade de fita magnética, um disco, uma porta serial, etc.

Page 142: Linguagem c

Ling

uage

m C

142

ArquivosPonteiro de Arquivo• Para obter uma variável ponteiro de arquivo :

FILE *fp;

onde fp é o ponteiro de arquivo. Abrindo um Arquivo:• A função fopen() abre um fluxo e liga um arquivo a esse fluxo.

Retorna o ponteiro de arquivo associado ao fluxoem questão. FILE *fopen(char *nome_de_arquivo, char *modo);• onde modo é uma string contendo o estado desejado para

abertura. • O nome do arquivo deve ser uma string de caracteres que

compreende um nome de arquivo válido incluindo uma especificação de caminho (PATH).

Page 143: Linguagem c

Ling

uage

m C

143

Modos de AberturaModo Significado

"r" Abre um arquivo-texto para leitura

"w" Cria um arquivo-texto para escrita

"a" Acrescenta dados para um arquivo-texto existente

"rb" Abre um arquivo binário para leitura

"wb" Cria um arquivo binário para escrita

"ab" Acrescenta dados a um arquivo binário existente

"r+" Abre um arquivo-texto para leitura/escrita

"w+" Cria um arquivo-texto para leitura/escrita

"a+" Acrescenta dados ou cria um arquivo-texto para leitura/escrita

"r+b" Abre um arquivo binário para leitura/escrita

"w+b" Cria um arquivo binário para leitura/escrita

"a+b" Acrescenta ou cria um arquivo binário para leitura/escrita

Page 144: Linguagem c

Ling

uage

m C

144

Abertura de Arquivo

• Um arquivo pode ser aberto ou em modo texto ou em modo binário.

• No modo texto, as seqüências de retorno de carro e alimentação de formulários são transformadas em seqüências de novas linhas na entrada. Na saída, ocorre o inverso: novas linhas são transformadas em retorno de carro e alimentação de formulário. Tais transformações não acontecem em um arquivo binário.

Page 145: Linguagem c

Ling

uage

m C

145

Abertura de Arquivo

• Se um erro ocorre quando se está abrindo um arquivo, fopen() retorna um nulo (NULL).

• Por exemplo: tentar abrir um arquivo inexistente para leitura, escrever em um arquivo protegido contra gravação, ou ainda criar um arquivo se o disco estiver cheio, um erro ocorrerá e fopen() retornará NULL.

Page 146: Linguagem c

Ling

uage

m C

146

Abertura de Arquivo

Exemplo: FILE *ofp; ofp = fopen ("test", "w");Entretanto, para checagem de erros escrevemos assim:

FILE *ofp;if((ofp=fopen("test","w"))==NULL){

puts("não posso abrir o arquivo\n"); exit(1); //Erro!! Termina programa

}Obs: Abrindo um arquivo no modo “w”, qualquer arquivo preexistente com o mesmo nome será apagado e o novo arquivo iniciado.

Page 147: Linguagem c

Ling

uage

m C

147

Escrita em Arquivo

Escrevendo um caractere:• A função putc() é usada para

escrever caracteres para um fluxo que foi previamente aberto para escrita pela função fopen(). A função é declarada como:int putc(int ch, FILE *fp);onde fp é o ponteiro de arquivo retornado pela função fopen() e, ch é o caractere a ser escrito.

Page 148: Linguagem c

Ling

uage

m C

148

Leitura em Arquivo

Lendo um caractere:• A função getc() é usada para ler caracteres do fluxo

aberto em modo de leitura pela função fopen(). A função é declarada como:

int getc(FILE *fp)onde fp é um ponteiro de arquivo do tipo FILE

retornado pela função fopen().• A função getc() retornará uma marca EOF quando o fim

do arquivo tiver sido encontrado ou um erro tiver ocorrido. • Exemplo:

ch=getc(fp);while(ch!=EOF){ ch=getc(fp);}

Page 149: Linguagem c

Ling

uage

m C

149

Fechamento de Arquivo

• A função fclose() fecha um fluxo que foi aberto por uma chamada à função fopen(). Ela escreve quaisquer dados restantes na área intermediária (fluxo) no arquivo e faz um fechamento formal em nível de sistema operacional do arquivo.

• A função fclose() é declarada como: int fclose(FILE*fp);• onde fp é o ponteiro do arquivo retornado

pela chamada à função fopen().

Page 150: Linguagem c

Ling

uage

m C

150

Exemplo escrita/* Grava em disco dados digitados no teclado até teclar $ */#include <stdio.h>#include <stdlib.h>main() { FILE *fp; char ch;if((fp=fopen("teste.txt","w"))==NULL) { puts("O arquivo não pode ser aberto!"); exit(1);}do { /* getche() não funcionaria aqui */ ch=getchar(); if(EOF==putc(ch, fp)) { puts("Erro ao escrever no arquivo!"); break; }} while (ch!='$');fclose(fp);return 0; /* código de retorno de final OK p/ o DOS. */}

Page 151: Linguagem c

Ling

uage

m C

151

Exemplo leitura/*Lê arquivos e exibe-os na tela.*/#include <stdio.h>#include <stdlib.h>main() { FILE *fp; char ch; if((fp=fopen("teste.txt","r"))==NULL) { puts("O arquivo não pode ser aberto!"); exit(1); } ch= getc(fp); /* lê um caractere */ while(ch!=EOF) { putchar(ch); /* imprime na tela */ ch=getc(fp); } return 0; }

Page 152: Linguagem c

Ling

uage

m C

152

ferror()

ferror():• A função ferror() é usada para determinar se uma

operação em um arquivo produziu um erro. Se um arquivo é aberto em modo texto e ocorre um erro na leitura ou na escrita, é retornado EOF. Você usa a função ferror() para determinar o que aconteceu. A função ferror() tem o seguinte protótipo:

int ferror(FILE*fp);• onde fp é um ponteiro válido para um arquivo. ferror()

retorna verdadeiro se um erro ocorreu durante a última operação com o arquivo, e falso, caso contrário. Uma vez que cada operação em arquivo determina uma condição de erro, a função ferror() deve ser chamada imediatamente após cada operação com o arquivo; caso contrário, um erro pode ser perdido.

Page 153: Linguagem c

Ling

uage

m C

153

rewind()

rewind():• A função rewind() recolocará o localizador

de posição do arquivo no início do arquivo especificado como seu argumento, ou seja, rewind() “rebobina” o arquivo. O seu protótipo é:

void rewind(FILE*fp);• onde fp é um ponteiro de arquivo.

Page 154: Linguagem c

Ling

uage

m C

154

getw() e putw()

getw() e putw():• Funcionam exatamente como putc() e getc()

só que em vez de ler ou escrever um único caractere, lêem ou escrevem um inteiro.

• Protótipos:int putw(int i, FILE *fp);int getw(FILE *fp);

• Header: stdio.h• Exemplo: putw(100,saida); //escreve o

inteiro 100 no arquivo apontado por saida.

Page 155: Linguagem c

Ling

uage

m C

155

fgets() e fputs()

fgets() e fputs():• Funcionam como gets() e puts() só que lêem e

escrevem em fluxos.• Protótipos:

char *fputs(char *str, FILE *fp);char *fgets(char *str, int tamanho, FILE

*fp);• Header: stdio.h• Observação: fgets() lê uma string de um fluxo

especificado até que um newline seja lido OU tamanho-1 caracteres tenham sido lidos. Se um newline é lido, ele fará parte da string (diferente de gets()). A string resultante termina com um nulo.

Page 156: Linguagem c

Ling

uage

m C

156

fgets() e fputs()

/* Grava strings em disco até digitar CR, rebobina e lê */#include <stdio.h>#include <stdlib.h>main() { FILE *arq; char str[80];if((arq=fopen("teste.txt","w+"))==NULL) { puts("O arquivo não pode ser aberto!"); exit(1); }do { printf(“Digite string (CR para terminar):”); gets(str); strcat(str,”\n”); /* acrescenta newline */ fputs(str,arq);} while(*str!=‘\n’);rewind(arq); /* rebobina arq */while(!feof(arq)){ fgets(str,79,arq); printf(str); } fclose(arq);return 0; }

Page 157: Linguagem c

Ling

uage

m C

157

fread() e fwrite():

• Lêem e escrevem blocos de dados em fluxos.• Protótipos:

unsigned fread(void *buffer, int num_bytes, int count, FILE *fp);

unsigned fwrite(void *buffer, int num_bytes, int count, FILE *fp);

• No caso de fread(), buffer é um ponteiro para uma área da memória que receberá os dados lidos do arquivo.

• No caso de fwrite(), buffer é um ponteiro para uma área da memória onde se encontram os dados a serem escritos no arquivo.

Page 158: Linguagem c

Ling

uage

m C

158

fread() e fwrite():

• O número de bytes a ser lido ou escrito é especificado por num_bytes.

• O argumento count determina quantos itens (cada um tendo num_bytes de tamanho) serão lidos ou escritos.

• O argumento fp é um ponteiro para um arquivo de um fluxo previamente aberto por fopen().

• A função fread() retorna o número de itens lidos, que pode ser menor que count caso o final de arquivo (EOF) seja encontrado ou ocorra um erro.

• A função fwrite() retorna o número de itens escritos, que será igual a count exceto na ocorrência de um erro de escrita.

Page 159: Linguagem c

Ling

uage

m C

159

Escrita de estrutura em arquivo main() {

struct {char titulo[30];int regnum;double preco;} livro;char numstr[81];FILE *fp;if((fp=fopen(“livro.dat”,”wb”))==NULL) {puts("Não posso abrir arquivo!");exit(1); }printf(“\n Digite o titulo: “);gets(livro.titulo);printf(“\n Digite o registro: “);gets(numstr);livro.regnum = atoi(numstr);printf(“\n Digite o preco: “);gets(numstr);livro.preco = atof(numstr);fwrite(&livro,sizeof(livro),1,fp);fclose(fp);

}

Page 160: Linguagem c

Ling

uage

m C

160

Leitura de estrutura em arquivo

main() {struct {char titulo[30];int regnum;double preco;} livro;FILE *fp;if((fp=fopen(“livro.dat”,”rb”))==NULL) {puts("Não posso abrir arquivo!");exit(1); }if(fread(&livro,sizeof(livro),1,fp)==1) {printf(“\n Titulo: %s \n“, livro.titulo);printf(“\n Registro: %03d \n“,livro.regnum);printf(“\n Preco: %.2f \n“,livro.preco);} fclose(fp);

}

Page 161: Linguagem c

Ling

uage

m C

161

Acesso randômico a arquivosfseek():• A função fseek() indica o localizador de posição do arquivo.• Protótipo:

int fseek(FILE *fp, long numbytes, int origem);

• fp é um ponteiro para o arquivo retornado por uma chamada à fopen().

• numbytes (long int) é o número de bytes a partir da origem até a posição corrente.

• origem é uma das seguintes macros definidas em stdio.h: Origem Nome da Macro Valor numérico

começo do arquivo SEEK_SET 0 posição corrente SEEK_CUR 1 fim do arquivo SEEK_END 2• Para procurar numbytes do começo do arquivo, origem deve ser SEEK_SET.

Para procurar da posição corrente em diante, origem é SEEK_CUR. Para procurar numbytes do final do arquivo de trás para diante, origem é SEEK_END.

Page 162: Linguagem c

Ling

uage

m C

162

Acesso randômico a arquivos

• O seguinte código lê o 235º byte do arquivo chamado test:FILE *fp;char ch;if((fp=fopen("teste","rb"))==NULL){puts("Não posso abrir arquivo!");exit(1); }fseek(fp,234,SEEK_SET);ch=getc(fp); /* lê um caractere na

posição 235º */• A função fseek() retorna zero se houve sucesso ou

um valor não-zero se houve falha no posicionamento do localizador de posição do arquivo.

Page 163: Linguagem c

Ling

uage

m C

163

Outras funções de arquivos

• Apagando arquivos: remove() int remove(char *nome_arquivo);

Retorna zero em caso de sucesso e não zero se falhar.

• Esvaziando um fluxo: fflush() int fflush(FILE *fp);

Escreve o conteúdo de qualquer dado existente no fluxo para o arquivo associado a fp.Retorna zero em caso de sucesso e EOF se falhar.

Page 164: Linguagem c

Ling

uage

m C

164

Exercícios

1. Faça um programa que receba dois arquivos pela linha de comandos e verifique se seus conteúdos são exatamente iguais.

2. Escreva um programa que una dois arquivos de texto. Leia os arquivos na linha de comandos assim como o arquivo de saída.

3. Escreva um programa que insira, consulte, liste e exclua itens (estruturas) mantendo as informações em arquivo.

Page 165: Linguagem c

Ling

uage

m C

165

Teste

1. Gerar o arquivo clientes contendo registros com os campos conta, nome e saldo de clientes de um banco.

2. Gerar o arquivo entradas contendo os campos conta, operação e valor, referentes às movimentações do dia dos clientes. Operação pode ser depósito ou retirada.

3. Atualizar no fim do dia o arquivo clientes.