linguagem c
TRANSCRIPT
Ling
uage
m C
1
Ling
uage
m C
Linguagem C
Treinamento em Desenvolvimento de
Aplicativos para Sistemas Embarcados
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.
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
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.
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.
Ling
uage
m C
6
Introdução
• Aplicação– Sistemas Operacionais– Compiladores– Planilhas Eletrônicas– Editores de Texto– Banco de Dados
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.
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.
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.
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.
Ling
uage
m C
11
Introdução
• C é uma linguagem compilada
Fontes C
Arquivos OBJ Bibliotecas
Compilação
+
Executável
Ligação
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”);}
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”);}
Ling
uage
m C
14
Mapa de Memória
Pilha
Heap
Variáveis Globais
Código do Programa
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
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)
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
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;
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?
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
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!
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
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).
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)
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
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”
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
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.
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)
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
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
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;
Ling
uage
m C
33
Precedência dos OperadoresMaior ( ) [ ] ->
! ~ ++ -- - (tipo) * & sizeof
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= etc.
Menor ,
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;
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
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.
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)
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
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.
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);}
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
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
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.
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
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.
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
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”);}
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;
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.
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’);}
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);}
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;}
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”);}}
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; }
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.
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”);
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.
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() */
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);
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; }
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); }
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:
Ling
uage
m C
63
Comandos de desvio
Exemplo:int x=1;retorno:
printf(“%d”,x); x++; if(x<=100) goto retorno;
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).
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
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
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).
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”,¬as[i]); }for (i=0; i<5 ; i++) soma = soma + notas[i];printf(“Media = %f”, (float) soma/5);}
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]);
}
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.
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
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]);}
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};
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};
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.
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
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”);
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);}
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”;
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);}
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)); }
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"); }
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); }
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
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
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.
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) */
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 */
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++);
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.
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.
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);}
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++);}
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++));
}
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]);}
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.
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.
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
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.
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()
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().
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á.
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
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.
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.}
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.
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
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.
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}
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
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}
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.
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.
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
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.
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++;}}
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.
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.
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[];
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
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.
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
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.
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;
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);
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);
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.
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;
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;
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();}
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;
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;
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);
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
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.
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.
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.
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)
}}
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];
};
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
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.
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).
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
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.
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.
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.
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.
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);}
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().
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. */}
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; }
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.
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.
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.
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.
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; }
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.
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.
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);
}
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);
}
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.
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.
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.
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.
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.