Você está na página 1de 87

Lgica de programao Avanado

rodrigo.piovesana@gmail.com Antes tarde do que mais tarde Estou muito bem obrigadoe vocs?

Quem sou eu?


Rodrigo Csar Benaglia Piovesana Engenheiro de Computao - USF Especialista em Telecomunicaes - FGV Aluno Mestrado - Unicamp Especialidades: redes de computadores, segurana da informao, VoIP e PABX Hbridos. Desenvolvimento em C/C++ para controlar dispositivos (drivers), Programao Orientada objetos e UML. Diversas certificaes em Redes de dados, Voz, PABX, Contact Center e Segurana.

rodrigo.piovesana@gmail.com

Corinthiano ROXO!

rodrigo.piovesana@gmail.com

Rumo ao Bi-Mundial

rodrigo.piovesana@gmail.com

Bibliografia bsica
Algortmos Person Makron Books, 1998. Dirceu Douglas Salvetti e Lisbete Madsen Barbosa Linguagens de Programao Java, C, C++ e outras Campus, 2004. Flvio Varejo

rodrigo.piovesana@gmail.com

Bibliografia recomendada
Cincia dos Computadores Uma abordagem algortmica MacGraw-Hill, 1983. Jean Paul Tremblay e Richard B. Bunt C programao Campus, 1993. Steve Holzner e Peter Norton Treinamento em Linguagem C Curso completo 1 e 2 McGraw-hill, 1990. Victorine Viviane (j tem novas verso onde unificado os livros)
rodrigo.piovesana@gmail.com

Reviso bsica

Alguem aqui lembra a matria? Pelo menos o ttulo??? Quais foram os principais tpicos estudados? Eeeeee..eeeeeee..hummmm. No! Converso decimal <-> binrio <-> octal <-> hexadecimal Algortmos Descrio narrativa / Fluxograma Estruturas de deciso / Repetio Linguagem de programao C (comandos bsicos em laboratrio) Quais foram os exerccios executados? Quais foram os mais fceis e difceis? Porque? Qual a principal diferena entra executar um programa direto no computador e realizar um algortmo antes de ir para o pega-pracapar?
rodrigo.piovesana@gmail.com

O Que seria converso binriodcimal-octal-hexadecimal??


Bsicamente representar a mesma informao em formatos diferentes. Por exemplo: 10 em decimal possui uma representao diferente em binrio, 1010. J em octal seria 12 e em Hexadecimal A. http://calculadoraonline.com.br/view/conversa o-binario.php
rodrigo.piovesana@gmail.com

Descrio Narrativa

soluo estruturada do problema Se termo verdadeiro


Repete at termo ser falso Se no escrever

J era! Perdeu Playboy!

Fim

rodrigo.piovesana@gmail.com

Pseudo-cdigo

a escrita do famoso Portugol, onde voc ir escrever o cdigo com palavras muito, MAS MUITO parecidas, com as utilizadas em algumas linguagens de programao. Se a<100

Ento faa ate a = 100

A= a+1 Escrever nmero j maior p

Seno

fim

rodrigo.piovesana@gmail.com

Linguagem C

Aqui o bicho pega!!!!! Temos N tipos de linguagens compatveis com C ANSI. Algumas so proprietrias ou implatanes melhoradas de C. http://en.wikipedia.org/wiki/ANSI_C C++ (plus plus) um C com classes(orientaao a objetos, etc) C# ISO/IEC 23270
rodrigo.piovesana@gmail.com

Como funfa as provas e trabalho de concluso de curso?

Sim, teremos 1 prova com 5 questes E sim teremos um projeto de concluso de curso, onde o objetivo desenvolver um aplicativo comercial anos anteriores j foram produzidos: sistemas para farmcias, hotis, livrarias, fbricas de transformao, etc, etc, etc talvez esse ano o projeto ser para administrao escolar
rodrigo.piovesana@gmail.com

Ento Vamo manda bala! Vetores e Matrizes


So estruturas de dados indexados do mesmo tipo. Onde cada espao ser preenchido com um tipo nico de dados. Indexados???? O que isso? um ndice para a posio onde ser armazeda a informao. Tem como finalidade criar uma capacidade de armazenamento do mesmo tipo. Podemos ter vrios ndices. Por conveno o primeiro ndice 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 ndices requer mais capacidade de armazenamento limite1 X limite 2 x limite 3 = total de memria 1 caracter = 1 byte - > 10 x 10 = 100 bytes de memria para armazenar 100 caracteres diferentes. Caso fosse do tipo inteiro duplo seriam 200 bytes.
rodrigo.piovesana@gmail.com

Vetor ou Matriz unidimensional com 7 posies AHH..isso um


indice!

Caracter letras[7];
0
A

1
B

2
C

3
D

4
E

5
F

6
G

E esse o valor armazenado!


rodrigo.piovesana@gmail.com

Como ficaria a declarao usando a linguagem dos algortmos??!?!?!!?!?

Caracter Letras[7]; Letras[0]=A; Letras[1]=B; Letras[2]=C; ou eu posso usar um lao para fazer o preenchimento desse vetor afffcredo!

rodrigo.piovesana@gmail.com

Vetor/Matriz unidimencional
Exemplo #define LIMITE 20 Inicio (){ Inteiro m, m1[LIMITE],i; LER(%d,&m); Se (m < LIMITE) Para(i=0;i<m;i++){ m1[i]=i; escrever(%d,m1[i]); } Seno Escreva(Fora do limite); Fim

Definindo o tamanho do vetor Iniciando o programa Declarando variaveis Atrinbuindo um valor para a variavel m Realizando um teste para validao do vetor Lao para preenchimento do vetor Escrevendo o contedo do vetor Se estiver fora do valor limite exibe mensagem fim

rodrigo.piovesana@gmail.com

Como ficaria em C?
Exemplo #define LIMITE 25 main(){ 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 exemplo main(){ char str [7]; int i; for(i=0; i<7; i++){ str[i]= 'A'+i; printf("%c",str[i]); } system("PAUSE"); }

OUUUU main(){ char str [7]; gets(str); printf("%s",str); system("PAUSE"); }

rodrigo.piovesana@gmail.com

Exerccio 1. Mas que diabos este programa esta fazendo?


#include<stdio.h> main(){ int exemplo [10], i, media; printf("\nInforme os nmeros 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 exerccio !


1. Dada uma seqncia de nmeros, imprimir a ordem inversa da leitura. 2. Escrever um algortmo que declare um vetor de reais e leia as notas de 20 alunos. 3. Altere o algoritmo para calcular a mdia. 4. Escrever um algortmo que calcule e escreva o somatrio dos valores armazenados numa varivel composta unidimensional A de 100 elementos numricos 5. Escrever um algortmo que leia um vetor de 30 elementos numricos e verifique se existem valores iguais a 24, se existirem escrever quantas vezes aparecem e quais as posies em que esto armazenados.

Obs: Desenvolver somente o algortmo! NO PAPEL MANO! Obs2: Nada de C por enquanto!
rodrigo.piovesana@gmail.com

Correo Exerccio 1
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 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

Exerccio 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

Exerccio 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

Exerccio 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

Exerccio 5 Primeira soluo


INICIO ( ) { 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; } SENO ESCREVER ("Nada no indice A[%d]\n",i); } ESCREVER ( % d % d ", aux , posicao); PAUSA; } QUAIS SO AS LIMITAES DESSA SOLUO? 1 Somente uma variavel pode ser encontrada 2 No possui memria para armazenar mais de uma posio 3 No escreve todas as posies caso encontre mais de um nmero 24

rodrigo.piovesana@gmail.com

6 -Alterar o exerccio anterior para armazenar quantos nmeros forem necessrios para dar uma soluo 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

Ordenao de um vetor
0 4 1 3 2 2 3 5 4 1 5 6

No mgica e sim lgica!


0
1

1
2

2
3

3
4

4
5

5
6

rodrigo.piovesana@gmail.com

Como eu j disse em aula e repito mais fcil do que ganhar do Palmeiras e Santos esses times sem estruturas! SPFC=caf com leite

Um algortmo de ordenao consiste na comparao de cada elemento com todos os elementos subseqentes. 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 ORDENAO DE VETORES


Incio tipo 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]) ento { 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 Binria. PESQUISAR!

rodrigo.piovesana@gmail.com

Matriz Bidimensional
0 0 1 2 3 4 M q s E e 1 a u a X s 2 S E c X s 3 X X O X E 4 X X X X X 5 X X X X X

o
rodrigo.piovesana@gmail.com

Caracter festas[6][6]; Temos duas maneiras de inserir informaes em matrizes com mais de um indice:

Na mo: festas[5][3] = ; ou podemos utilizar dois laos: 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 exerccio 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

Faa um programa que leia a idade de 50 pessoas e apresente a mdia de todas, alm de identificar a mais velha e a posio 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 , tambm lida, e escreva a matriz resultante.

rodrigo.piovesana@gmail.com

Podemos ter ainda mais uma dimenso

Caracter Matrix [5][9][3]; Claro que teremos 3 laos para controlar 1 2 3 4 5 6 7 8 9 esse tipo 1
1 2 3 4 5 o h a 2 3

rodrigo.piovesana@gmail.com

Strings No bicho de 7 cabeas

String nada mais do que um conjunto de caracteres (ou um vetor, s isso). C/C++ possui comando prprios para manipulao 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]; No necessario adicionar manualmente o nulo (\0) no final das constantes string - o compilador faz isso automaticamente.

rodrigo.piovesana@gmail.com

Funes especificas para manipulao 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 ordenao alfabtica de uma string Biblioteca <string.h>
rodrigo.piovesana@gmail.com

Exemplo
Inicio (){ Caracter produto[ ]={a,b,a,c,a,x,i}; Escrever (%s,produto);
} 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"); }
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 cdigo 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

EXERCCIO NO LAB

12. Verificar o funcionamento das seguintes funes escrevendo um programa para testar as funes. Verifique o exemplo string1.cpp

strcpy() strcat() strlen() strcmp()

rodrigo.piovesana@gmail.com

Funes

So expresses para auxiliar na programao, onde so executados repetidamente uma srie de passos, podemos ter funes para qualquer tipo de objetivo. Portanto podemos economizar na digitao ou melhor ainda, deixar o algortmo mais limpo, sendo este mais simples e fcil de entender.
rodrigo.piovesana@gmail.com

Onde que entra e como fica?


#Bibliotecas Funcao 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 clculo numrico para uma determinada atividade. Como realizar isto com uma funo? Quando realizarmos a chamada da funo nos passamos as variaveis que sero utilizadas nesta parte do clculo. Ex: funcao(a); funcao2(b); a e b so letras ou nmeros que foram recebidos pelo computador. E como fica a funo??? Do mesmo jeito? No! No inicio do programa voc tem que dizer quantas variaveis sero utilizadas e na funo 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 ordenao? 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 ordenao 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 algortmos abaixo

14. Realizar uma funo para troca de valores entre duas variaveis. 15. Realizar uma funo para tirar a mdia de um vetor. 16. Realizar um funo para verificar se a matriz simtrica.

rodrigo.piovesana@gmail.com

Ponteiros

Um ponteiro proporciona um modo de acesso a variveis sem referenci-las diretamente O mecanismo usado para isto o endereo da varivel, que age como intermedirio entre a varivel e o programa que a acessa. Ponteiro = representao simblica de um endereo

rodrigo.piovesana@gmail.com

Por que usamos ponteiros?

So usados situaes em que a passagem de valores dificil ou indesejvel. Razes: Fornecem maneiras com as quais funes podem realmente modificar os argumentos que recebem Para passar matrizes e strings mais convenientemente de uma funo para outra Manipular matrizes mais facilmente atravs da movimentao de ponteiros para elas, em vez da prpria matriz Criar estruturas de dados complexas, como listas encadeadas e rvores binrias, onde uma estrutura referencia uma outra Para comunicar informaes sobre a memria (malloc) O mais importante, cdigos mais rpidos e eficientes.

rodrigo.piovesana@gmail.com

Mas e o algortmo?

Tem uma particularidade o * e o &

* indica ao compilador que a varivel no ir armazenar um valor e sim um endereo & indica o endereo da variavel.

Inteiro contador=10; //inteiro com valor 10 Inteiro *ponteiro; //ponteiro para um inteiro ponteiro=&contador; //nos d o endereo do contador que esta armazenando em ponteiro *ponteiro=12; //o valor do contador agora 12!
rodrigo.piovesana@gmail.com

Algortmo de exemplo
Inicio() inteiro numero,valor; inteito *p; numero=55; p=&num; 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=&num; 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=&num; 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=&num; 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 cdigo?


#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 vrios tipos diferentes? Quando usamos dados desiguais usamos estruturas. uma coleo de uma ou mais variveis, possivelmente de tipos diferentes, colocadas juntas sob um nico nome. (estruturas so chamadas de registro em algumas linguagens). Pode-se usar vrias matrizes para armazenar diversos tipos de dados, no a maneira mais recomendado pela dificuldade de manipulao.
rodrigo.piovesana@gmail.com

Declarando uma estrutura


Primeiro voc deve definir o tipo de estrutura que voc quer criar. Uma estrutura pode conter qualquer nmero de membros de diferentes tipos.

Struct facil { int numero; char caracter; } Especificao do tipo de dado

Struct
Facil Int numero; Char caracter;

Nome da estrutura

Membros da estrutura

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 cabea: 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. x.numero =2; x.caracter = R;

Acessando os membros da estrutura.


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

Exerccio

Elaborar uma estrutura para armazenar uma lista de livros. Antes de realizar a estrutura voc deve perguntar: Quais so as caracteristicas de um livro? Ttulo, autor, editora, nmero de pginas, registro, preo, 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 nmero 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 nmero 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 funes Matrizes de estruturas

Ponteiros em estruturas

rodrigo.piovesana@gmail.com

No acabou ainda

Criar uma estrutura para descrever restaurantes. Os membros devem armazenar o nome, endereo, preo mdio e tipo de comida. Criar uma matriz de estruturas e escrever uma funo que imprima todos os restaurantes de um certo tipo de comida.

rodrigo.piovesana@gmail.com

Arquivos

a capacidade de produzir informaes que esto sendo executadas em determinados momentos e transformar em informaes permanentes. Mesmo aps que nos desligamos o computador. Chamamos isso de arquivos. Podemos ter dois tipos de arquivos em C os Binrios e os arquivos ASCII.

rodrigo.piovesana@gmail.com

A estrutura FILE

FILE uma estrutura pr definida para compor o ponteiro para as aes com os arquivos.

Inicio () { FILE *ponteiro; . }


rodrigo.piovesana@gmail.com

Como inserir dados nos arquivos???

Caracter insere um a um no arquivo. Utiliza tcnicas de Buffers para no ficar escrevendo toda a hora no HD. Binrio Ideal quando estamos trabalhando com String, matrizes e estruturas.

rodrigo.piovesana@gmail.com

Diferenas entre ASCII e Binrios

Um arquivo aberto em modo texto interpretado em C como sequncias de caracteres agrupadas em linhas. As linhas so 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). Binrio mais simples, no h converso. No reconhecida a indicao de fim de linha. Um outra diferena como os binrios interpretam os nmeros. No arquivo texto os nmeros so gravados como caractere e em binrio so gravados como esto na memria.

rodrigo.piovesana@gmail.com

Tipos de acessos e operaes com arquivos

Podemos ter de baixo-nvel, onde todas as informaes so passadas de uma forma unitria. Alto-nivel, executamos um comando para abrir/fechar/ler/gravar

rodrigo.piovesana@gmail.com

fopen
Funo para abertura de um arquivo. Fopen(nome do arquivo,opo); Exemplo: Inicio () { FILE *ponteiro; Se ((ponteiro = abrir (teste.txt,w)!=NULL)){ escrever(Escreve ai!\n); fechar(ponteiro);} Seno escrever (No foi possivel); }

rodrigo.piovesana@gmail.com

Opes de Abertura de arquivos


r w a r+ w+ a+ Abrir arquivo para leitura (existente) Abrir arquivo para escrita (cria se necessrio) Abrir arquivo para acrescimo (idem) Abrir arquivo para leitura e escrita (existente) Criar e abrir arquivo para leitura e escrita Abrir arquivo para leitura e acrescimo (cria se necessrio) Abrir arquivo binrio para leitura Abrir arquivo binrio para escrita Abrir arquivo binrio para acrescimo PROCURARrodrigo.piovesana@gmail.com OUTROS CDIGOS!!!!

rb wb ab

Detalhes importantes

Quanto tentamos abrir um arquivo nos devemos testar para verificar se o programa conseguiu realizar a operao, pois se podemos ter um programa travado por causa de uma falha de programao. Quando abrimos um arquivo e NO foi bem sucessida a operao um NULL retornado como valor. NULL constante pr-definida com valor 0.
rodrigo.piovesana@gmail.com

Ponteiros entram na histria??? SIM

Quando criamos um arquivo teste.txt, por exemplo, o ponteiro para este arquivo estar apontando para a posio inicial do arquivo. SEMPRE!!!! Ponteiro do arquivo
teste.txt

rodrigo.piovesana@gmail.com

Funes

Fopen

fopen ("teste.dat","ab+")
fclose(ponteiro); fwrite(&l1,sizeof(l1),1,ponteiro); fread(&l1,sizeof(l1),1,ponteiro); Fseek(ponteiro,offset,0); // 0 inicio, 1 corrente, 2 fim do arq.
rodrigo.piovesana@gmail.com

Fclose

Fwrite

Fread

Fseek

Exemplo Fopen
if ((ponteiro = fopen ("teste.dat","ab+"))) if (!ponteiro){ printf ("No consegui abrir"); } else { fclose(ponteiro); }

rodrigo.piovesana@gmail.com

Exemplo Fread
if ((ponteiro = fopen ("teste.dat","ab+"))) if (!ponteiro){ printf ("No 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 ("No consegui abrir"); } else { fwrite(&l1,sizeof(l1),1,ponteiro); fclose(ponteiro); }
rodrigo.piovesana@gmail.com

Você também pode gostar