Post on 02-Jul-2015
description
Lógica de programação Avançado
rodrigo.piovesana@gmail.com
Antes tarde do que mais tarde…Estou muito bem obrigado…e vocês?
rodrigo.piovesana@gmail.com
Bibliografia básica
Algorítimos – Person Makron Books, 1998.Dirceu Douglas Salvetti e Lisbete Madsen
Barbosa
Linguagens de Programação – Java, C, C++ e outras – Campus, 2004. Flávio Varejão
rodrigo.piovesana@gmail.com
Bibliografia recomendada
Ciência dos Computadores – Uma abordagem algorítmica – MacGraw-Hill, 1983. Jean Paul Tremblay e Richard B. Bunt
C programação – Campus, 1993. Steve Holzner e Peter Norton
Treinamento em Linguagem C – Curso completo 1 e 2 – McGraw-hill, 1990. Victorine Viviane
rodrigo.piovesana@gmail.com
Revisão básica
Alguem lembra a matéria? Pelo menos o título??? Quais foram os principais tópicos estudados?
Eee…eee..eee…eeee..hummmm…. Não! Conversão decimal <-> binário <-> octal <-> hexadecimal Algorítmos Descrição narrativa / Fluxograma Estruturas de decisão / Repetição Linguagem de programação C
Quais foram os exercícios executados? Quais foram os mais faceis e dificeis? Porque? Qual a principal diferença entra executar um programa direto no
computador e realizar um algoritmo antes de ir para o “pega-pra-capar”?
rodrigo.piovesana@gmail.com
Então “Vamo manda bala!”Vetores e Matrizes São estruturas de dados indexados do mesmo tipo. Onde cada
espaço será preenchido com um tipo único de dados. Indexados???? O que é isso? É um indice para a posição onde
será armazeda a informação. Tem como finalidade criar uma capacidade de armazenamento
do mesmo tipo. Podemos ter vários indices.
Por convenção o primeiro indice identifica a linha e o segundo identifica a coluna. Podemos ainda ter um terceiro indice que indicaria o plano.
Teste [limite1][limite2][limite3] O incremento de indices requer mais capacidade de
armazenamento limite1 X limite 2 x limite 3 = total de memória 1 caracter = 1 byte - > 10 x 10 = 100 bytes de memória para
armazenar 100 caracteres diferentes. Caso fosse do tipo inteiro duplo seriam 200 bytes.
rodrigo.piovesana@gmail.com
Vetor ou Matriz unidimensional com 7 posições
Caracter letras[7];
GFEDCBA
6543210
AHH..isso é um indice!
E esse é o valor armazenado!
rodrigo.piovesana@gmail.com
Caracter Letras[7]; Letras[0]=‘A’; Letras[1]=‘B’; Letras[2]=‘C’; … ou eu posso usar um laço para fazer o
preenchimento desse vetor… afff…
rodrigo.piovesana@gmail.com
Vetor/Matriz unidimencional
Exemplo#define LIMITE 20Inicio (){Inteiro m, m1[LIMITE],i;LER(“%d”,&m);Se (m < LIMITE)
Para(i=0;i<m;i++){m1[i]=i;escrever(“%d”,m1[i]);
}Senão
Escreva(“Fora do limite”);Fim
Definindo o tamanho do vetorIniciando o programaDeclarando variaveisAtrinbuindo um valor para a
variavel mRealizando um teste para
validação do vetorLaço para preenchimento do
vetorEscrevendo o conteúdo do vetorSe estiver fora do valor limite
exibe mensagemfim
rodrigo.piovesana@gmail.com
Como ficaria em C?
Exemplo#define LIMITE 25main(){int m,m1[LIMITE],i;scanf("%d",&m); if(m<LIMITE){
for(i=0; i<m; i++){ m1[i]=i; printf("%d",m1[i]); } }else printf(“Fora do limite"); system("PAUSE");}
rodrigo.piovesana@gmail.com
Vetor
Mais um exemplomain(){char str [7]; int i; for(i=0; i<7; i++){
str[i]= 'A'+i;printf("%c",str[i]);
}system("PAUSE");}
OUUUUmain(){char str [7];gets(str); printf("%s",str);system("PAUSE");}
rodrigo.piovesana@gmail.com
Exercício1. Mas que diabos este programa esta fazendo?#include<stdio.h>main(){ int exemplo [10], i, media; printf("\nInforme os números X[i] a medida que forem solicitados:\n\n"); for(i=0; i<10; i++){ printf("X[%d]? ",i); scanf("%d", &exemplo[i]) ; } media=0; for (i=0; i<10; i++) { media = media+exemplo[i]; }printf("A media é %f\n",(float)media/10);}
rodrigo.piovesana@gmail.com
“Perdeu Playboy! Tem mais exercício !”
1. Dada uma seqüência de números, imprimir a ordem inversa da leitura.
2. Escrever um algorítmo que declare um vetor de reais e leia as notas de 20 alunos.
3. Altere o algoritmo para calcular a média. 4. Escrever um algorítmo que calcule e escreva o somatório dos
valores armazenados numa variável composta unidimensional A de 100 elementos numéricos
5. Escrever um algorítmo que leia um vetor de 30 elementos numéricos e verifique se existem valores iguais a 24, se existirem escrever quantas vezes aparecem e quais as posições em que estão armazenados.
Obs: Desenvolver somente o algorítmo! NO PAPEL MANO!
Obs2: Nada de C por enquanto!
rodrigo.piovesana@gmail.com
Correção – Exercício 1inicio (){ inteiro m[3] [2], I , j ; m[0][0]=1; m[0][1]=2; m[1][0]=3; m[1][1]=4; m[2][0]=5; m[2][1]=6; PARA (I igual a 0 ; I menor que 3 ; I = I + 1){ PARA (j igual a 0 ; j menor que 2 ; j = j + 1) ESCREVA ( “ %2d “ , m [ I ] [ j ]); }
ESCREVER ("\n\n\n\n"); PARA ( I igual a 2; I maior e igual a 0 ; I = I -1 ){ PARA (j igual a 1; j maior e igual a 0; j = j -1) ESCREVER (“ %2d ", m [ I ] [ j ] ); } ESCREVER ("\n\n\n\n"); PAUSA }
rodrigo.piovesana@gmail.com
Exercício 2
inicio(){Real str [20];Inteiro i; PARA (I igual a 0; I menor que 20; i=i+1){ LER( “ %f ", &str[i] );} PAUSA;}
rodrigo.piovesana@gmail.com
Exercício 3
INICIO () {REAL str [20], media;INTEIRO I; PARA (I igual a 0; I menor que 20; I = I + 1){ LER( “ %f ", &str[i] );} media=0; PARA (I igual a 0; I menor que 20; I = I + 1){ media = media + str[i]; } media = media/20; PAUSA}
rodrigo.piovesana@gmail.com
Exercício 4
INICIO ( ) {inteiro A[100] , soma , i;
PARA ( I igual a ; I menor que 100; i++){ A[i] = 1+A[i]; } soma=0; PARA ( I igual a ; I menor que 100; i++){ soma = soma + A[i]; }
ESCREVER ( “ %d “ , soma);PAUSA}
rodrigo.piovesana@gmail.com
Exercício 5 – Primeira soluçãoINICIO ( ) {inteiro A [ 30 ] , aux = 0 , I , posicao;
PARA ( I igual a 0 ; I menor que 30 ; I = I + 1 ) { LER ( “ %d “ , & A [ I ] ) ; } PARA ( I igual a 0 ; I menor que 30 ; I = I + 1 ) { SE ( A [ I ] == 24) { aux = aux+1; posicao=i; } SENÃO ESCREVER ("Nada no indice A[%d]\n",i); } ESCREVER ( “ % d % d ", aux , posicao);PAUSA;}
QUAIS SÃO AS LIMITÇÕES DESSA SOLUÇÃO? 1 – Somente uma variavel pode ser encontrada2 – Não possui memória para armazenar mais de uma posição3 – Não escreve todas as posições caso encontre mais de um número 24
rodrigo.piovesana@gmail.com
6 -Alterar o exercício anterior para armazenar quantos números forem necessários para dar uma solução completa!
rodrigo.piovesana@gmail.com
Só um detalhe
INICIO ( ) { inteiro a,I; LER (“ % d “ , &a); inteiro matriz[a]; Para ( I igual a 0; I menor que a ; i++) Ler ( “ % d “ , &matriz[I]) ; Para ( I igual a 0; I menor que a ; i++) Ler ( “ %d “ , matriz[i]); PAUSA;}
rodrigo.piovesana@gmail.com
615234
543210
Ordenação de um vetor
Não é mágica e sim lógica!
654321
543210
rodrigo.piovesana@gmail.com
Como eu já disse em aula e repito…é mais do que ganhar do Palmeiras e São Paulo…esses times sem estruturas!
Um algoritmo de ordenação consiste na comparação de cada elemento com todos os elementos subsequentes. O elemento será trocado com o outro a depender dele ser menor ou maior.
Esse é um dos tipos mais simples!!!
rodrigo.piovesana@gmail.com
REALIZAR NO PAPEL “BRODI” A ORDENAÇÃO DE VETORES
Iníciotipo vetor[LIMITE], I,J, AUX;
para (I=0; I < LIMITE; I++){ ler (vetor[I]);
para (I=0; i<LIMITE;I++){ para (J=i; J<LIMITE; J++){
se (vetor [I] > vetor [J]) então { AUX = vetor[I]; vetor[I] = vetor[J]; vetor [J] =AUX;
} } // fim para
} //fim para
rodrigo.piovesana@gmail.com
E como fica a pesquisa em vetores?
Para encontrar um valor em vetor você deve realizar uma “Pesquisa Sequencial” e testar esse valor.
Qual é o problema desta pesquisa?
Temos um outro modelo que se chama Pesquisa Binária. PESQUISAR!
rodrigo.piovesana@gmail.com
Matriz Bidimensional
Xoçort5
XXEsse4
XXXXXE3
XXOcas2
XXXEuq1
XXXSaM0
543210
rodrigo.piovesana@gmail.com
Caracter festas[6][6]; Temos duas maneiras de inserir informações
em matrizes com mais de um indice: Na mão: festas[5][3] = ‘ç’; ou podemos utilizar dois laços: um para controlar
as colunas e um para controlar as linhas.
rodrigo.piovesana@gmail.com
Exemplo
Inicio inteiro M[3][2], i,j;
M [0,0] =1;M [0,1] = 2;M [1,0] = 3;M [1,1] = 4;M [2,0] = 5;M [2,1] = 6;para (i igual 0; i menor que 3; i = i + 1 ) //linha
para(j igual 0; j menor que 2; j = j + 1) //coluna escreva ( “ %d ”, M[ j, i ]); // ANALISAR ESTA LINHA!!!
Fim
rodrigo.piovesana@gmail.com
Matrizes bidimensionais
Define limite 5
Inteiro I,j,mat[limite][limite];
Para (i = 0; i < m; i = i + 1) Para (j = 0; j < n; j = j + 1) ler("%d", &mat[i][j]);
rodrigo.piovesana@gmail.com
EXEMPLO#include <stdio.h>#include <stdlib.h>
main(){int i,j,matriz[3][2]; for(i=0; i<3;i++){ for(j=0;j<2;j++){ scanf("%d",&matriz[i][j]); } } for(i=0; i<3;i++){ printf("\n"); for(j=0;j<2;j++){ printf("[%d]",matriz[i][j]); } } system("pause"); }
rodrigo.piovesana@gmail.com
O que esta faltando?????
7. Analisar as linhas de comando do programa matriz2d.cpp 8. Dada duas matrizes de inteiros com m linhas e n colunas
calcular soma dos elementos. Dica: Você tem que ler as duas matrizes e somar em uma terceira.
9. Realizar o mesmo exercício acima só que deve realizar o produto entre as matrizes!
10. Dada uma matriz real A m x n, verificar se existem elementos repetidos em A.
rodrigo.piovesana@gmail.com
Extra Classe
Faça um programa que leia a idade de 50 pessoas e apresente a média de todas, além de identificar a mais velha e a posição que em que ela se encontra na matriz.
Escrever um programa que solicite e leia letra por letra o nome completo de uma pessoa. O caractere sustenido “#” indica o fim do nome. Depois apresentar o nome limpo (sem o “#”, no centro da tela).
Escrever um programa que leia uma matriz 4x4, multiplique os elementos da sua diagonal principal por uma constante K , também lida, e escreva a matriz resultante.
rodrigo.piovesana@gmail.com
Podemos ter ainda mais uma dimensão
Caracter Matrix [5][9][3]; Claro que teremos 3 laços para controlar
esse tipo
‘o’
‘h’
1
2
3
4
5
1 2 3 4 5 6 7 8 9
‘a’
12
3
rodrigo.piovesana@gmail.com
Strings – Não é bicho de 7 cabeças
String nada mais é do que um conjunto de caracteres (ou um vetor, só isso).
C/C++ possui comando próprios para manipulação desse conjunto.
Uma "string" é definida como sendo constituida de um vetor 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 um vetor "str" que possa armazenar uma string de 10 caracteres, escrevemos:
caracter str [11]; Não é necessario adicionar manualmente o nulo (“\0”) no final
das constantes string - o compilador faz isso automaticamente.
rodrigo.piovesana@gmail.com
Funções especificas para manipulação de strings getstr() – Recebe uma string - dev-cpp gets() strcpy() – Copia uma string strcat() – Concatena duas strings strlen() – Retonar o comprimento de uma
string strcmp() – Compara a ordenação alfabética
de uma string Biblioteca <string.h>
rodrigo.piovesana@gmail.com
Exemplo
int main(){char produto[ ]={'a','b','a','c','a','x','i','\0'}; printf("%s",produto); system("PAUSE");}
Ou – Há autores que consideram esta forma ilegal!
int main(){char produto[ ]=“abacaxi”; printf("%s",produto); system("PAUSE");}
Inicio (){Caracter produto[ ]={a,b,a,c,a,x,i};
Escrever (“%s”,produto);
}
rodrigo.piovesana@gmail.com
Copiar uma string…
Basta ler e copiar para uma variavel que recebe este valor.
strcpy(string_que_recebe,string_lida);Inicio(){Caracter string_que_recebe[80],string_lida[80];Ler(string_lida);strcpy(string_que_recebe,string_lida);Escrever(“%s”,string_que_recebe);}
rodrigo.piovesana@gmail.com
Analisar as linhas do código abaixo
#include <string.h>
main(){char string_que_recebe[80],string_lida[80],base[10]="teste\0";char concatena[80];int r;gets(string_lida);strcpy(string_que_recebe,string_lida);r=strlen(string_que_recebe);if(strcmp(string_que_recebe,base)==0){
strcat(string_lida,string_que_recebe);printf("%s\n",string_que_recebe);printf("%s\n",string_lida);printf("%d\n",r);
}else printf ("\nString diferente!");system("PAUSE");}
rodrigo.piovesana@gmail.com
EXERCÍCIO – NO LAB
12. Verificar o funcionamento das seguintes funções escrevendo um programa para testar as funções. Verifique o exemplo string1.cpp strcpy() strcat() strlen() strcmp()
rodrigo.piovesana@gmail.com
Funções
São expressões para auxiliar na programação, onde são executados repetidamente uma série de passos, podemos ter funções para qualquer tipo de objetivo.
Portanto podemos “economizar” na digitação ou melhor ainda, deixar o algorítmo mais limpo, sendo este mais simples e fácil de entender.
rodrigo.piovesana@gmail.com
Onde que entra e como fica?
#BibliotecasFuncao teste( );Funcao teste2( );INICIO ( ) { Programa… teste( ); teste2( ); Programa…}Funcao teste( ){ Programa… }Funcao teste2( ){ Programa… }
rodrigo.piovesana@gmail.com
Exemplo
#BIBLIOTECAS
funcao limpa_tela();
INICIO ( ) { limpa_tela( ); ESCREVER ("Vai ser impresso depois"); limpa_tela( ); }INICIO limpa_tela(){ Sistema ("cls"); ESCREVER ("Teste"); Sistema ("cls"); }
rodrigo.piovesana@gmail.com
#include <stdio.h>#include <conio.h>#include <stdlib.h>
void limpa_tela();
main(){ limpa_tela(); printf("Vai ser impresso depois"); getch( ); limpa_tela( ); system("PAUSE"); }void limpa_tela(){ system("cls"); printf("Teste"); getch( ); system("cls"); }
rodrigo.piovesana@gmail.com
E Quando quero realizar uma conta?
Imagine que você terá que realizar N vezes um cálculo numérico para uma determinada atividade. Como realizar isto com uma função?
Quando realizarmos a “chamada da função” nos passamos as variaveis que serão utilizadas nesta parte do cálculo.
Ex: funcao(a); funcao2(b); … “a” e “b” são letras ou números que foram recebidos pelo computador.
E como fica a função??? Do mesmo jeito? Não! No inicio do programa você tem que dizer quantas variaveis
serão utilizadas e na função em si e qual o seu nome. funcao (inteiro); funcao2 (caracter); Inicio funcao (inteiro a) ou Inicio funcao2 (caracter b)
rodrigo.piovesana@gmail.com
Exemplo#biblioteca <math.h>
real operador ( real x, real y);
INICIO ( ) { real x,y,r; ESCREVER ("\nDigite um numero a ser elevado"); LER ("%f,",&x); ESCREVER ("\nDigite o expoente"); LER("%f,",&y); r= operador(x,y); ESCREVER ("\nResultado %f",r); "PAUSA";}real operador( real x, real y){ real resultado; resultado=expoente ( log ( x ) * y ); returna resultado;}
rodrigo.piovesana@gmail.com
13. Lembra da ordenação? ANALISAR LINHA A LINHA
rodrigo.piovesana@gmail.com
void limpa_tela();void ordena(char[]);main(){ char s[30]; char opcao='s'; limpa_tela(); while (opcao=='s'){ printf("Digite uma string"); gets(s); ordena(s); printf("Caracteres ordenados"); printf("%s",s); printf("Outra vez?"); opcao=getch(); } system("PAUSE");}void limpa_tela(){ system("cls"); printf("Programa de ordenação de um vetor"); getch(); system("cls"); }void ordena(char v[]){ int i,j,aux; for(i=0;i<strlen(v)-1;i++) for (j=i+1;j<strlen(v);j++){ if(v[i]>v[j]){ aux=v[i]; v[i]=v[j]; v[j]=aux; } }}
rodrigo.piovesana@gmail.com
AHHHH… Realizar os algorítmos abaixo
14. Realizar uma função para troca de valores entre duas variaveis.
15. Realizar uma função para tirar a média de um vetor.
16. Realizar um função para verificar se a matriz é simétrica.
rodrigo.piovesana@gmail.com
Ponteiros
Um ponteiro proporciona um modo de acesso a variáveis sem referenciá-las diretamente
O mecanismo usado para isto é o endereço da variável, que age como intermediário entre a variável e o programa que a acessa.
Ponteiro = representação simbólica de um endereço
rodrigo.piovesana@gmail.com
Por que usamos ponteiros?
São usados situações em que a passagem de valores é dificil ou indesejável.
Razões: Fornecem maneiras com as quais funções podem realmente
modificar os argumentos que recebem Para passar matrizes e strings mais convenientemente de uma
função para outra Manipular matrizes mais facilmente através da movimentação de
ponteiros para elas, em vez da própria matriz Criar estruturas de dados complexas, como listas encadeadas e
árvores binárias, onde uma estrutura referencia uma outra Para comunicar informações sobre a memória (malloc) O mais importante, códigos mais rápidos e eficientes.
rodrigo.piovesana@gmail.com
Mas e o algorítmo?
Tem uma particularidade o “*” e o “&” * indica ao compilador que a variável não irá
armazenar um valor e sim um endereço & indica o endereço da variavel.
Inteiro contador=10; //inteiro com valor 10Inteiro *ponteiro; //ponteiro para um inteiroponteiro=&contador; //nos dá o endereço do contador
que esta armazenando em ponteiro*ponteiro=12; //o valor do contador agora é 12!
rodrigo.piovesana@gmail.com
Algorítmo de exemplo
Inicio()inteiro numero,valor;inteito *p;numero=55;p=# valor=*p; escrever (valor);escrever (p);escrever (*p);Pausa;
}
rodrigo.piovesana@gmail.com
Em C
#include <stdio.h>#include <stdlib.h>int main (){
int num,valor;int *p;num=55;p=# valor=*p; printf ("\n\n%d\n",valor);printf ("Endereco para onde o ponteiro aponta: %p\n",p);printf ("Valor da variavel apontada: %d\n",*p);system("pause");
}
rodrigo.piovesana@gmail.com
Mais um exemplo
Inicio (){inteiro numero,*p;numero=55;p=#escrever(numero);*p=100; escrever(numero);
Pausa;}
rodrigo.piovesana@gmail.com
Em C
#include <stdio.h>#include <stdlib.h>int main (){
int num,*p;num=55;p=#printf ("\nValor inicial: %d\n",num);*p=100; printf ("\nValor final: %d\n",num);
system("pause");}
rodrigo.piovesana@gmail.com
Acabou?
Pesquisar: incremento e decremento de ponteiros.
rodrigo.piovesana@gmail.com
E o que esta fazendo este código?
#include <stdio.h>#include <stdlib.h>
int main() { int y, *p, x; y = 0; p = &y; x = *p; x = 4; (*p)++; x--; (*p) += x; printf ("y = %d\n", y); system("pause");}
rodrigo.piovesana@gmail.com
Estruturas
Qual é o problema das matrizes quando queremos adicionar vários tipos diferentes?
Quando usamos dados desiguais usamos estruturas. “É uma coleção de uma ou mais variáveis,
possivelmente de tipos diferentes, colocadas juntas sob um único nome. (estruturas são chamadas de registro em algumas linguagens)”.
Pode-se usar várias matrizes para armazenar diversos tipos de dados, não é a maneira mais recomendado pela dificuldade de manipulação.
rodrigo.piovesana@gmail.com
Declarando uma estrutura Primeiro você deve definir o tipo de estrutura que você quer criar. Uma estrutura pode conter qualquer número de membros de
diferentes tipos.
Struct facil {int numero;char caracter;
} Especificação do tipo de dado
Struct Nome da estrutura
Facil Membros da estrutura
Int numero; Char caracter;
rodrigo.piovesana@gmail.com
Acabamos que criar um novo tipo de dados chamado “Facil”
Composto por dois elementos: uma variavel chamada numero e outra caracter.
Tenha isso na cabeça: “uma estrutura é um tipo de dado cujo formato é definido pelo programador”.
rodrigo.piovesana@gmail.com
Declarando variaveis
Agora devemos declarar as variaveis. Struct facil x;
Struct – é uma estrutura Facil – é o tipo de estrutura X – é o nome da variavel.
Acessando os membros da estrutura. x.numero =2; x.caracter = ‘R’;
O Ponto conecta o nome da variavel estrutura a um membro da estrutura.
rodrigo.piovesana@gmail.com
Exemplo
Inicio () {estrutura tipo {
inteiro numero;caracter letra;
};estrutura tipo x1;estrutura tipo x2;x1.numero =2;x1.letra=‘R’;x2.numero =3;x2.letra=‘o’;Escrever (“%d %d“, x1.numero, x2.numero);Escrever (“%c %c“, x1.letra, x2.letra);}
#include <stdio.h>#include <stdlib.h>
main () {struct tipo {
int numero;char letra;
};struct tipo x1;struct tipo x2;x1.numero =2;x1.letra='R';x2.numero =3;x2.letra='o';printf ("%d %d", x1.numero, x2.numero);printf ("%c %c", x1.letra, x2.letra);system ("pause");}
rodrigo.piovesana@gmail.com
OU…
Inicio () {estrutura tipo {
inteiro numero;caracter letra;
} x1,x2;
x1.numero =2;x1.letra=‘R’;x2.numero =3;x2.letra=‘o’;Escrever (“%d %d“, x1.numero, x2.numero);Escrever (“%c %c“, x1.letra, x2.letra);}
rodrigo.piovesana@gmail.com
Exercício
Elaborar uma estrutura para armazenar uma lista de livros. Antes de realizar a estrutura você deve perguntar: “Quais são as caracteristicas de um livro?”
Título, autor, editora, número de páginas, registro, preço, etc…
rodrigo.piovesana@gmail.com
#include <stdio.h>#include <stdlib.h>#include <conio.h>
main () {struct tipo {
int registro;char titulo[30];
};struct tipo l1;struct tipo l2;fflush(stdin);printf ("Digite o número do livro:");scanf("%d",&l1.registro);printf ("\nDigite o nome do livro:");fflush(stdin);gets(l1.titulo);
printf ("%d", l1.registro);printf ("\n%s", l1.titulo);system ("pause");}
rodrigo.piovesana@gmail.com
main () {struct tipo {
int registro;char titulo[30];
};struct tipo l1[5];int i;
for(i=0;i<5;i++){ fflush(stdin); printf ("\nDigite o número do livro:"); scanf("%d",&l1[i].registro); printf ("\nDigite o nome do livro:"); fflush(stdin); gets(l1[i].titulo);}for(i=0;i<5;i++){printf ("\n%d", l1[i].registro);printf ("\n%s", l1[i].titulo);}system ("pause");}
rodrigo.piovesana@gmail.com
Para casa
Pesquisar os seguintes temas: Estruturas aninhadas
Estruturas para funções
Matrizes de estruturas
Ponteiros em estruturas
rodrigo.piovesana@gmail.com
Não acabou ainda…
Criar uma estrutura para descrever restaurantes. Os membros devem armazenar o nome, endereço, preço médio e tipo de comida. Criar uma matriz de estruturas e escrever uma função que imprima todos os restaurantes de um certo tipo de comida.
rodrigo.piovesana@gmail.com
Arquivos
É a capacidade de produzir informações que estão sendo executadas em determinados momentos e transformar em informações permanentes. Mesmo após que nos desligamos o computador. Chamamos isso de arquivos.
Podemos ter dois tipos de arquivos em C – os Binários e os arquivos ASCII.
rodrigo.piovesana@gmail.com
A estrutura FILE
FILE é uma estrutura pré definida para compor o ponteiro para as ações com os arquivos.
Inicio () { FILE *ponteiro; ….}
rodrigo.piovesana@gmail.com
Como inserir dados nos arquivos???
Caracter – insere um a um no arquivo. Utiliza técnicas de Buffers para não ficar escrevendo toda a hora no HD.
Binário – Ideal quando estamos trabalhando com String, matrizes e estruturas.
rodrigo.piovesana@gmail.com
Diferenças entre ASCII e Binários
Um arquivo aberto em modo texto é interpretado em C como sequências de caracteres agrupadas em linhas. As linhas são separadas por um único caractere chamado caractere de nova linha ou LF (linefeed). ASCII 10.
O mesmo ocorre quando o SO abre este arquivo e procura dois caracteres CR (13) e LF (10).
O compilador converter o par CR/LF em um único caractere de nova linha um arquivo aberto de texto é lido.
Há ainda um indicador de final de arquivo chamado EOF (end of file).
Binário é mais simples, não há conversão. Não é reconhecida a indicação de fim de linha. Um outra diferença é como os binários interpretam os números. No arquivo texto os números são gravados como caractere e em binário são gravados como estão na memória.
rodrigo.piovesana@gmail.com
Tipos de acessos e operações com arquivos
Podemos ter de baixo-nível, onde todas as informações são passadas de uma forma unitária.
Alto-nivel, executamos um comando para abrir/fechar/ler/gravar
rodrigo.piovesana@gmail.com
fopen
Função para abertura de um arquivo. Fopen(“nome do arquivo”,”opção”); Exemplo:Inicio () {FILE *ponteiro;Se ((ponteiro = abrir (“teste.txt”,”w”)!=NULL)){ escrever(“Escreve ai!\n”); fechar(ponteiro);}Senão escrever (“Não foi possivel”);}
rodrigo.piovesana@gmail.com
Opções de Abertura de arquivos
PROCURAR OUTROS CÓDIGOS!!!!
Abrir arquivo binário para acrescimoab
Abrir arquivo binário para escritawb
Abrir arquivo binário para leiturarb
Abrir arquivo para leitura e acrescimo (cria se necessário)
a+
Criar e abrir arquivo para leitura e escritaw+
Abrir arquivo para leitura e escrita (existente)r+
Abrir arquivo para acrescimo (idem)a
Abrir arquivo para escrita (cria se necessário)w
Abrir arquivo para leitura (existente)r
rodrigo.piovesana@gmail.com
Detalhes importantes
Quanto tentamos abrir um arquivo nos devemos testar para verificar se o programa conseguiu realizar a operação, pois se podemos ter um programa travado por causa de uma falha de programação.
Quando abrimos um arquivo e NÃO foi bem sucessida a operação um NULL é retornado como valor.
NULL – constante pré-definida com valor 0.
rodrigo.piovesana@gmail.com
Ponteiros entram na história??? SIM
Quando criamos um arquivo teste.txt, por exemplo, o ponteiro para este arquivo estará apontando para a posição inicial do arquivo. SEMPRE!!!!
Ponteiro do arquivoteste.txt
rodrigo.piovesana@gmail.com
Funções
Fopen fopen ("teste.dat","ab+")
Fclose fclose(ponteiro);
Fwrite fwrite(&l1,sizeof(l1),1,ponteiro);
Fread fread(&l1,sizeof(l1),1,ponteiro);
Fseek Fseek(ponteiro,offset,0); // 0 inicio, 1 corrente, 2 fim do arq.
rodrigo.piovesana@gmail.com
Exemplo Fopen
if ((ponteiro = fopen ("teste.dat","ab+"))) if (!ponteiro){ printf ("Não consegui abrir"); } else { fclose(ponteiro); }
rodrigo.piovesana@gmail.com
Exemplo Fread
if ((ponteiro = fopen ("teste.dat","ab+"))) if (!ponteiro){ printf ("Não consegui abrir"); } else { fread(&l1,sizeof(l1),1,ponteiro); printf("%d",l1.registro); printf("%s",l1.titulo); fclose(ponteiro); }
rodrigo.piovesana@gmail.com
Exemplo Fwrite
if ((ponteiro = fopen ("teste.dat","ab+"))) if (!ponteiro){ printf ("Não consegui abrir"); } else { fwrite(&l1,sizeof(l1),1,ponteiro); fclose(ponteiro); }