Escolar Documentos
Profissional Documentos
Cultura Documentos
Referncias Bibliogrficas
FORBELLONE, Andr L.V., EBERSPACHER, H.F. Lgica de Programao A construo de Algoritmos e Estruturas de Dados. Pearson Brasil. MANZANO, Jos Augusto N.G., OLIVEIRA, Jair Figuereido de. Algoritmos Lgica para Desenvolvimento de Programao de Computadores. rica. So Paulo. SCHILDT, Herbert, C Completo e Total, Ed. Makron Books DEITEL H.M. P.J., C++ Como Programar Bookman 2001 Porto Alegre Obs.: Agradecimento ao Prof. Arleys pelo material cedido
O que Lgica ?
Exemplo Dia-a-Dia
Joo mais velho que Maria Maria mais velha que Carlos
Exemplo Dia-a-Dia
Todo mamfero um animal Todo cachorro um mamfero
Exemplo Dia-a-Dia
Seria possvel trocar uma lmpada dessa forma?
1. 2. 3. 4. 5. 6.
Pegar uma escada Posicionar a escada embaixo da lmpada Buscar uma lmpada nova Colocar a lmpada nova Retirar a lmpada velha Subir na escada
Definies Bsicas
a arte de pensar corretamente Ensina a usar corretamente o Pensamento
Definies Bsicas
A cincia das leis ideais do pensamento e a arte de aplic-los demonstrao da verdade
Importncia
A lgica necessria para pessoas que desejam trabalhar com informtica (analistas, programadores, suporte) Ela permite definir a sequncia lgica para a soluo de um problema com eficincia e eficcia.
Importncia
Se aplica a qualquer linguagem de programao;
Definies Bsicas
Lgica de Programao
a contextualizao da lgica na programao de computadores, buscando a melhor sequncia de aes para solucionar determinado problema. Essa sequncia de aes chamada de algoritmo
Algoritmo
Exemplo de um Algoritmo para trocar uma lmpada
1. 2. 3. 4. 5. 6.
Pegar uma escada Posicionar a escada embaixo da lmpada Buscar uma lmpada nova Subir na escada Retirar a lmpada velha Colocar a lmpada nova
Algoritmo
Outros Exemplos do dia-a-dia:
1. 2. 3. 4.
Manual de um aparelho eletrnico Tutorial de utilizao de um software Forma de clculo de uma hora extra Uma receita para o preparo de uma moqueca
Qual a sua receita?
Algoritmo
uma sequncia de passos que visa atingir um objetivo definido Um conjunto finito de regras que prov uma sequncia de operaes para resolver um tipo de problema especfico Sequncia ordenada, e no ambgua, de passos que levam soluo de um dado problema Processo de clculo, ou de resoluo de um grupo de problemas semelhantes, em que se estipulam, com generalidade e sem restries, as regras formais para a obteno do resultado ou da soluo do problema [AURLIO]
Algoritmo
Propriedades de um algoritmo:
Algoritmo
Deve ser composto por quatro passos fundamentais:
Escrever as instrues em sequncia ligadas entre si por apenas estruturas sequenciais; Escrever instrues em grupos pequenos e combinalas; Distribuir os mdulos do programa entre os diferentes programadores; Revisar o trabalho executado.
Representao
Descrio Narrativa:
Representaes textuais que expressam uma ordem do fluxo dos pensamentos a serem executados
1-Ler Salrio 2-Ler Horas Mensais 3-Ler tipo da H Extra 4-Ler quantidade de H. extras realizadas 5-Calcular o valor da hora extra 6-Informar o valor da hora extra calculada
Representao
Grfica:
Representaes grficas que expressam uma ordem do fluxo dos pensamentos a serem executados
Representao Grfica
Fluxograma
Geralmente usada por profissionais de anlise de sistema, bem como profissionais de Organizao e Mtodos.
Diagrama de Blocos
Ferramenta usada basicamente por profissionais que esto envolvidos diretamente com a programao.
Diagrama de Bloco
S N
Simbologia Bsica
Formas de representao grfica:
Terminal Seta de Fluxo Conectores Deciso
Processamento
Display
Um programa de computador composto por dos tipos bsicos de informaes: dados e instrues
So representados pelas informaes a serem tratadas (processadas) pelo computador. Caracteriza-se por trs tipos de dados:
Dados numricos Dados caracteres Dados lgicos
Tipos Reais:
Abrangem inteiros, negativos, positivos e fracionrios:
35, 0, -35, 1.25, -45.1245547 ...... s
Tipos Lgicos:
Uso de constantes:
tudo aquilo que fixo ou estvel;
O valor do PI = 3,14156
REA = PI * RAIO^2
X = 43.
55 30+2
X = (43*(55/(30+2)))
Operao Atribuio Igualdade Diferena Maior Que Menor Que Maior e Igual Menor e Igual
Descrio narrativa:
1 Ler dois valores, no caso variveis A e B; 2 Efetuar a soma das variveis A e B, implicando o seu resultado na varivel SOMA; 3 Apresentar o valor da varivel SOMA aps a operao de soma dos dois valores fornecidos.
SOMA = A + B
SOMA
Fim
Pede-se:
Descrio Narrativa Diagrama de Bloco Portugus Estruturado
Condio
O S representa Sim conseqentemente a proposio Verdadeira e o N representa o No. Alm das linhas com setas indicando a direo do processamento.
Condio Verdadeira
Condio Falsa
X > 10
Fim
B : inteiro
incio leia A, B X = A + B
se ( X > 10 ) ento
escreva X fim_se fim
Pede-se:
Descrio Narrativa Diagrama de Bloco Portugus Estruturado
Condio
Condio Falsa
Condio Verdadeira
Pede-se:
Algoritmo Diagrama de Bloco Portugus Estruturado
53
Condio 1
Condio 2
54
seno
se ( <condio 2> ) ento
<instrues para a condio 1 falsa e condio 2 verdadeira>
seno
<instrues para a condio 1 falsa e condio 2 falsa>
fim_se fim_se
55
Descrio Narrativa
1 Definir uma varivel para o salrio reajustado como NOVO_SALARIO; 2 Ler um valor para a varivel SALARIO; 3 Verificar se o valor de SALARIO < 500, se sim reajustar em 15%; 4 Verificar se o valor de SALARIO <= 1000, se sim reajustar em 10% 5 Verificar se o valor de SALARIO > 1000, se sim reajustar em 5%; 6 Apresentar o valor reajustado implicando na varivel NOVO_SALARIO.
56
Incio SALARIO
S
NOVO_SALARIO
Fim
57
58
Verdade
Verdade
Verdade
59
60
fim_se
61
Falso Falso
Verdade Verdade
Falso Verdade
Verdade Verdade
62
63
fim_se
64
65
.no. Condio
66
67
Exerccio:
O ndice de Massa Corporal (IMC) uma frmula que indica se um adulto est acima do peso, se est obeso ou abaixo do peso ideal considerado saudvel. A frmula para calcular o ndice de Massa Corporal : IMC = peso / (altura)2. Desenvolva a descrio narrativa, Diagrama de blocos e codificao em portugus estruturado, para o seguinte problema:
Ler dois valores, peso e altura em seguida calcular o ndice de massa corporal (IMC) e apresentar em tela se a pessoa est abaixo do peso, no peso normal, acima do peso ou obeso obedecendo a tabela da Organizao Mundial de Sade.
Condio IMC em adultos Abaixo do peso
Tabela da Organizao Mundial de Sade
68
69
70
71
72
73
Cont <= 1
S
R=X*3
R Cont ++
Cont = Cont + 1
Incio
74
CONT = 1
enquanto ( CONT < = 5 ) faa leia X R = X * 3 escreva R CONT = CONT + 1 CONT ++ fim_enquanto /// ou
75
76
77
78
X R=X*3 R
Cont ++
Cont = Cont + 1
Cont > 5
S
Fim
79
repita
leia X R = X * 3 escreva R CONT = CONT + 1 CONT ++ at_que ( CONT > 5 ) /// ou
80
81
Instrues
82
<Instrues>
fim_para
83
84
85
R=X*3
Fim
86
leia X
R = X * 3 escreva R fim_para
87
Exerccio
Aps desenvolver um algoritmo ele dever sempre ser testado. Este teste chamado de TESTE DE MESA, que significa, seguir as instrues do algoritmo de maneira precisa para verificar se o procedimento utilizado est correto ou no.
88
Exerccio
programa LOOPING_2A var X, R, CONT : inteiro incio para CONT de 1 at 5 passo 1 leia X R = X * 3 escreva R fim_para fim
Passo CONT
X 3 2 1 9 4
R 3 * 3 = 9 2 * 3 = 6 1 * 3 = 3 9 * 3 = 27 4 * 3 = 12
1 2 3 4 5
1 2 3 4 5
Introduo a C
A linguagem C foi criada na dcada de 70 por Dennis M. Ritchie a partir de uma outra linguagem: o B, criada por Ken Thompson. O B, por sua vez, veio da linguagem BCPL, inventada por Martin Richards. A linguagem C tornou-se muito importante e popular por possuir tanto caractersticas de alto nvel quanto de baixo nvel sendo considerada uma linguagem de programao de nvel mdio . Outra caracterstica muito importante ser portvel, isto , poder ser usada em vrias mquinas de portes e sistemas operacionais diferentes. Alto nvel : comandos com sintaxe prxima a linguagem humana e tipos de dados inteiro, real, caracter e string. Exemplo de linguagens de alto nvel: Pacal, Delphi, Basic, Visual Basic, Clipper, etc. Baixo nvel: manipulao de bits, bytes e endereos. Exemplo: Assembler. Nvel mdio: combina elementos das linguagens de alto nvel com a funcionalidade das de baixo nvel. Exemplo: Linguagem C.
Bit 8 16 32 64 0
Byte 1 2 4 8 0
Escala -128 a 127 -32768 a 32767 3.4E-38 a 3.4E+38 1.7E-308 a 1.7E+308 sem valor
Inicializao de variveis:
As variveis podem ser inicializadas no mesmo momento em que elas so declaradas, colocando um sinal de igual e a informao desejada.
Exemplo: char op=S;
simples */ /* as informaes do tipo caracter so envolvidas por aspas
/* as
strings so
Bibliotecas de funes .h
Existem bibliotecas com funes que auxiliam a manipulao dos comando de entrada e saia e tambm de manipulao de telas.
Bibliotecas de funes .h
FUNES DE TELA
Biblioteca <conio.h>
Bibliotecas de funes .h
TABELA DE CORES:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 PRETO AZUL VERDE CIANO VERMELHA MAGENTA MARROM CINZA CLARO CINZA ESCURO AZUL CLARO VERDE CLARO CIANO CLARO ALARANJADO MAGENTA CLARO AMARELO BRANCO
Bibliotecas de funes .h
FUNES DE ENTRADA E SADA DE DADOS
Biblioteca <stdio.h>
#include <stdio.h>
getchar() - entrada de um caracter individual; getch() - entrada de um caracter. O caracter no exibido na tela no necessrio teclar <enter>; getche() - entrada de um caracter. O caracter exibido na tela no necessrio teclar <enter>; putchar - exibe um caracter na tela; gets() - entrada de string; puts() - sada de string; scanf() - entrada de dados formatada com string de controle de acordo com o tipo da varivel; printf() - sada de dados formatada com string de controle de acordo com o tipo da varivel; cprintf() - sada de dados formatada colorida com string de controle de acordo com o tipo da varivel;
Exemplo1: int i=4; float j=5.5; printf(%d\n, i); printf(Este numero e inteiro: %d e este e real: %f, i , j); Resultado: 4 Este nmero inteiro: 4 e este real: 5.5
#include <conio.h> void main() { int anos, dias; printf(Digite sua idade em anos: ); scanf(%d,&anos); dias = anos*365; printf(Sua idade em dias %.d\n,dias); getchar(); } Resultado:
Digite sua idade em anos: 4 Sua idade em dias 1460
Comandos em C
112
Comandos de Seleo
if (x>9) y=100; else y=200;
Comandos em C
113
int num,a,b; switch (num) { case 1,2 : a=2*2; b=-1; break; case 3,4,5 : a=2*3; b=0; break; }
Comandos em C
114
Comandos em C
115
%d,x,z);
Matrizes ou vetores (Tabelas em memria) so do tipo de dados que podem ser Construdos medida que se fazem necessrio. Ilustrao de uma matriz ou vetor (1x5)
notas[4]
5 3
ou
4
notas[1..4]
87 9
Significa dizer que a varivel notas na posio 0 ou 1 (a depender qual sintaxe utilize) valer 5 notas[0] = 5 , notas[1] = 3 ......... notas[4] = 9
i = 1, 8, 1
Mdia =SOMA/8
Fim
Portugus estruturado
programa Mdia var MD : conjunto[1..8] de real SOMA, Mdia : real i : inteiro incio SOMA = 0 para i de 1 at 8 passo 1 leia MD[i] SOMA = SOMA + MD[i] fim_para Mdia = SOMA/8 escreva Mdia fim
STRING
Em linguagem C no existe o tipo string. A utilizao desse tipo de varivel se d atravs da utilizao de um cadeia de caracteres, isto um vetor de caracteres terminados por um nulo (\0). Para implementar esse tipo de dado deve-se ter sempre um caracter a mais para armazenar o terminador nulo Para declarar um tipo string: char nome[11];
0 P
1 a
2 u
3 l
4 o
5 6 \0
10
Para manipular as informaes armazenadas em uma string podemos utilizar as funes string ou utilizamos as funes caracter , j que uma string um vetor de caracteres.
arquivo de cabealho para funes de string <string.h>
arquivo de cabealho para funes caracter <ctype.h>
strcpy()
strcmp() strcat() strlen() strchr() strstr()
strcpy (s1,s2);
// x==0 se as strings forem iguais ou x!=0 se forem diferentes. // s1 ir conter o resultado da juno das 2 strings. // x vai conter o nmero de caracteres ocupados na string .
x=strschr(s1,ch); x=strstr(s1,s2);
isalpha()
isupper() ispunct() isspace() toupper()
tolower()
verifica se o caracter uma letra verifica se um caracter est em maiscula verifica se um caracter pontuao. verifica se um caracter espao. transforma um caracter em letra maiscula. transforma um caracter em letra minscula.
isalpha(a);
letra.
// !=0 letra; =0 no
isupper(a);
.
// !=0 maiscula =0 no
ispunct(a);
.
// !=0 pontuao; =0 no
a=tolower(a);
minscula.
// o contedo de a em
Uma matriz um tipo de dado usado para representar uma certa quantidade de variveis de valores homogneos. Imagine o seguinte problema: ler a mdia final de 5 alunos e calcular a media geral. Voc poderia declarar:
void main() { float notas[7],media=0; int i; for (i=0; i<7; i++) { pritf(Digite a nota do aluno %d: ,i); scanf(%f, ¬as[i]); media+=notas[i]; } media=media/8; printf(A mdia Geral= %5.2f,media); }
Matriz multidimensional:
#include <stdio.h> #include <conio.h> void main(){ int j,i,num[4][4]; clrscr(); for(j=0;j<4;++j){ for(i=0;i<4;++i){ num[j][i] = (j*4)+i+1; printf("%2.0d ",num[j][i]); } printf("\n"); } getchar(); }
Resultado:
j/i
0
1 5 9 13
1
2 6 10 14
2
3 7 11 15
3
4 8 12 16
0 1 2 3
Funo
127
Funo um seguimento independente do programa que executa uma tarefa especfica. Todo o programa em C formado por uma ou mais funes.
Funo
128
Forma Geral:
tipo nomeDaFuno (lista de parmetros){ corpo da funo; }
Toda funo dever ter seu prottipo declarado no incio do programa, ou em um arquivo de cabealho .h
Funo
129
Em C podemos ter dois tipos de parmetros: passagem de parmetros por valor e passagem de parmetros por referncia. Na passagem de parmetros por valor as informaes dos parmetros so copiadas para a funo receptora. As alteraes nesses parmetros no tem nenhum efeito na funo de origem da informao. Na passagem de parmetros por referncia, enviado o endereo do parmetro para a funo receptora, dessa forma o endereo usado para acessar as informaes originais. Isto significa que qualquer alterao efetuada no parmetro estar modificando o contedo original da informao enviada.
#include <stdio.h> #include <conio.h> void calculo (int *a,int *b); float sqr (float num); void main(){ int num1=100,num2=200; float num,sq; calculo (&num1,&num2); printf("\n Os valore atuais de num1= %d e num2 = %d",num1,num2); printf ("\n\n\nEntre com um numero: "); scanf ("%f",&num); sq=sqr(num); printf ("\n\nO numero original e: %f\n",num); printf ("O seu quadrado vale: %f\n",sq); } void calculo (int *a, int *b){ *a = *a * 2; *b = *b - 50; } float sqr (float num){ num=num*num; return num; }
Por referncia
Por Valor
Observe os resultados.
Ponteiros
131
Um ponteiro proporciona um modo de acesso a variveis sem referenci-las diretamente. O mecanismo usado para isto o endereo da varivel. Um ponteiro uma varivel que contm um endereo de memria. Esse endereo normalmente a posio de uma outra varivel na memria. Se uma varivel contm o endereo de uma outra, ento diz-se que a 1 varivel aponta para a segunda.
Ponteiros
132
Ponteiro a
30
Varivel X
& - operador unrio que devolve o endereo da memria do seu operando; * - operador unrio que devolve o contedo da varivel localizada no endereo de memria do seu operando, que uma varivel ponteiro. Ponteiros tambm tem tipos. Quando declaramos um ponteiro ns informamos ao compilador para que tipo de varivel o ponteiro est apontando.
Ponteiros
133
Exemplo: int *px,*py; Para atribuir valores as variveis ponteiro e para acessar as informaes usamos: *px=3; *py=5; Na declarao, o smbolo * indica o tipo apontado (o ponteiro) em outras situaes indica o contedo da varivel apontada. O ponteiro deve ser inicializado (apontado para algum lugar conhecido) antes de ser usado. Ponteiros so sempre inicializados com o valor 0 ou NULL ento antes de us-los devemos atribuir algum endereo vlido a eles.
Ponteiros
134
#include <stdio.h> #include <conio.h> void main(){ int x=5,y=6; int *px,*py; px=&x; py=&y; printf(px=%p, printf(py=%p, } *px=%d, *py=%d, &px=%p\n, px,*px,&px); &py=%p\n, py,*py,&py);
O resultado ser: px=65488, *px=5, &px=65492 py=65490, *py=6, &py=65494 OBS: O formato %p no printf indica que vai ser exibido um endereo.
Ponteiros
135
Y 6 Onde: px => retorna o endereo para o qual o ponteiro aponta; &px => retorna o endereo do ponteiro; *px => retorna o contedo da varivel apontada.
65488
pX 65488
65490
pY 65490
65492
65494
Ponteiros
136
Podemos fazer algumas operaes aritmticas com ponteiros. A primeira, e mais simples, a de igualar dois ponteiros p1=p2, assim p1 aponta para o mesmo lugar que p2. Se quisermos que a varivel apontada por p1 tenha o mesmo contedo da varivel apontada por p2 devemos fazer *p1=*p2. Outras operaes com ponteiros tambm bastante usadas so o incremento e o decremento. Quando incrementamos um ponteiro ele passa a apontar para o prximo valor do mesmo tipo para o qual o ponteiro aponta (avana um nmero de bytes na memria) como por exemplo: int *p; p++; // avana dois bytes na memria p--; // decrementa dois bytes na memria Para incrementar o contedo da varivel apontada pelo ponteiro p temos: *p++; Outras operaes podem ser efetuadas com ponteiros como a adio e subtrao de inteiros com ponteiros, bem como os operadores de (== , !=, >, <, >=,<=). Exemplos: p=p+15; // desloca o ponteiro 15 posies; *(p+15); // utiliza o contedo do ponteiro 15 posies adiante; p1>p2; // compara qual dos dois ponteiros est mais adiante na memria. Existem operaes que no podem ser efetuadas com ponteiros, como por exemplo dividir ou multiplicar ponteiros
Ponteiros
137
#include <stdio.h> void main(){ int num,valor; int *p; num=70; p=# // recebe o endereo de num valor=*p; // valor recebe o mesmo contedo de num printf(\n\n %d \n,valor); printf(Endereo para onde o ponteiro aponta: %p \n,p); printf(Valor da varivel apontada: %d \n,*p); *p=100; // modifica o contedo da varivel num indiretamente printf(Valor da varivel modificada %d \n,*p); }
Ponteiros e Matrizes
138
Uma das aplicaes mais importantes com ponteiros e a varredura seqencial de uma matriz, isto , quando temos que percorrer todos os elementos de uma matriz de uma forma seqencial, podemos usar um ponteiro incrementando-o at o final da matriz.
Ponteiros e Matrizes
139
Em uma matriz o prprio nome da matriz o endereo do primeiro elemento da matriz. Se x uma matriz unidimensional, ento, o endereo do primeiro elemento da matriz pode ser expresso &x[0] ou simplesmente x. Alm disso o endereo do segundo elemento da matriz pode ser expresso por &x[1] ou (x + 1), e assim por diante at o ensimo elemento da matriz &x[ i ] ou (x + i) .
Podemos ento ter 2 modos diferentes de acessar os elementos de uma matriz
Ponteiros e Matrizes
140
Na expresso (x + i) x representa o endereo e i representa uma quantidade inteira que significa i elementos depois do primeiro (deslocamento). Como &x[ i ] e (x + i) representam o endereo do insimo elemento de x, x[ i ] e *(x + i) representam o contedo desse endereo.
Ponteiros e Matrizes
141
Exemplo:
#include <stdio.h> #include <conio.h> void main(){ int x[10], i; clrscr(); for (i=0;i<=9;i++){ scanf(%d,&x[i]); printf(\n i= %d x[i]= %d %p,i , x[i], *(x+i), &x[i], x+i); } getchar(); }
*(x+i) = %d &x[i] = %p
x+1 =
x[ i ]= 10 x[ i ]= 11 x[ i ]= 12 x[ i ]= 13 x[ i ]= 14
Ponteiros e Matrizes
142
Exerccio:
Desenvolver um programa que dado um vetor de 10 elementos numricos inteiros calcular um outro vetor que dever conter os elementos do 1 vetor elevados ao quadrado. Usar aritmtica de ponteiros.
#include <stdio.h> #include <conio.h> #include <math.h> void main() { int vet1[10],vet2[10],x; clrscr(); for(x=0;x<10;x++) { scanf("%d",(vet1+x));//no prec. & *(vet2+x)=pow(*(vet1+x),2); printf("%d\n",*(vet2+x)); } getchar(); }
void main() { int vet1[10],vet2[10],x,*pt; clrscr(); pt=vet1; // no precisa & porque o //Nome de uma matriz um ponteiro for(x=0;x<10;x++) { scanf("%d",(pt+x)); *(vet2+x) = pow (*(pt+x),2); printf("%d\n",*(vet2+x);} getchar(); }
A Linguagem C permite que se crie vrios tipos diferentes de dados que possam ser agrupados de formas definidas.
Essas formas so um tipo de dado definido pelo programador e so conhecidas como:
Estruturas e Unies.
ESTRUTURA Uma estrutura uma coleo de tipos diferentes referenciadas por um nome, isto , a estrutura uma forma de se ter informaes agrupadas.
Forma Geral: struct nome { tipo nome_da_varivel; tipo nome_da_varivel; elem. da estrutura .... } variveis da estrutura; OBS: A struct um tipo de dado, no existe um espao reservado na memria para ela at que seja declarada uma varivel para armazenar o tipo definido.
Exemplo:
struct veculo { char modelo[25]; char marca[15]; float custo; }; veculo carro; // onde vaculo e o tipo e carro a varivel
Para referenciar cada elemento da estrutura utiliza-se o operador ponto. Forma Geral:
nome_da_varivelnome_do_elemento;
Exemplo:a.x =10; b.x =5; a.y =2.5; b.y = 0.5; gets(carro.modelo); scanf(%f,&carro.custo);
possvel tambm ter-se uma matriz de estruturas. Exemplos: struct veculo { char modelo[20]; char marca[15]; float custo; } carro[100];
/* isto cria 100 conjuntos de variveis que esto organizadas com os elementos acima */.
Para referenciar cada elemento da estrutura utiliza-se: float aux; gets(carro[0].marca); gets(carro[0].modelo); scanf(%f, &aux);} carro[x].custo = aux; .... Para simplificar esta estrutura poderamos ter: float aux; for (x=0;x<100;x++){ gets(carro[x].marca); gets(carro[x].modelo); scanf(%f, &aux);} carro[x].custo = aux;
Exerccio
148
Elaborar um programa que contenha uma estrutura que armazena o nmero da conta e o saldo de 5 clientes. O programa calcula o saldo mdio dos 5 clientes e exibe na tela quais os clientes que possuem saldo acima ou igual a mdia
Soluo
149
#include <stdio.h> #include <conio.h> void main(){ struct cliente{ char conta[20]; float saldo; } cli[5]; float saldo_medio=0,aux; int x; for (x=0;x<5;x++){ clrscr(); printf("\t\t\t CONTROLE BANCARIO \n"); printf("\t Nr da Conta.........: ");gets(cli[x].conta); printf("\t Saldo ..............: ");scanf("%f",&aux); cli[x].saldo=aux; saldo_medio += cli[x].saldo; getchar(); } saldo_medio=saldo_medio/5; clrscr(); printf("\t\t CLIENTES COM SALDO ACIMA DA MEDIA \n\n\n"); printf("\t Nr da conta \t Saldo \n\n"); for (x=0;x<5;x++){ if (cli[x].saldo >=saldo_medio) printf("\t %s \t\t %8.2f \n", cli[x].conta,cli[x].saldo); } getchar();
Exerccio
150
Vamos supor que vrias pedras do jogo de xadrez esto no tabuleiro. Para facilitar a indicao das peas, vamos convencionar:
1 pees 2 cavalos 3 torres 4 bispos 5 reis 6 rainhas 0 ausncia de peas
O tabuleiro
1 3 0 0 0 1 0 1 0 0 0 5 0 0 1 4 4 0 1 1 0 0 1 0 0 0 2 0 6 0 1 1 0 0 1 0
a) Construa um programa que determine a soma total entre pees e bispos e a quantidade de posies com ausncia de peas; b) Escreva outro programa que determine qual a quantidade de cada tipo de pea no tabuleiro.
1 0 1 0
0
1 1
0
0 0
3
6 5
1
6 0
0
0 1
0
0 1
1
1 0
1
0 6
Soluo
151
#include <stdio.h> #include <conio.h> void main(){ int tabuleiro[8][8] = { {1,3,0,5,4,0,2,1}, {1,0,1,0,0,1,0,0}, {0,0,0,0,1,0,6,0}, {1,0,0,1,1,0,0,1}, {0,1,0,4,0,0,1,0}, {0,0,3,1,0,0,1,1}, {1,0,6,6,0,0,1,0}, {1,0,5,0,1,1,0,6} }; int i,j; int branco=0, peao=0, cavalo=0, torre=0, bispo=0, rei=0, rainha=0; printf("\tApresentao do tabuleiro\n"); for (i=0;i<8;i++){ for (j=0;j<8;j++){ printf("%2.0d",tabuleiro[i][j]); } printf("\n"); } // Continua ..
for (i=0;i<8;i++){ for (j=0;j<8;j++){ switch (tabuleiro[i][j]){ case 0: branco++; break; case 1: peao++; break; case 2: cavalo++; break; case 3: torre++; break; case 4: bispo++; break; case 5: rei++; break; case 6: rainha++; break; } } } printf("\n"); printf("Soma de Peoes ou bispos e brancos =%d\n",(peao + bispo + branco)); printf("Peoes =%d, cavalos=%d, torres=%d, bispos=%d, reis=%d, rainhas=%d, branco=%d",peao, cavalo, torre, bispo, rei, rainha, branco); }
Arquivos
153
ARQUIVO : um conjunto de registros logicamente organizados armazenados em um dispositivo de memria secundria (disco rgido, disquetes, fitas magnticas, cd, etc), onde cada registro compreende um conjunto de informaes denominadas campos. Em um arquivo possvel armazenar um volume grande de dados.
Arquivo Registro Campo
Arquivos
154
ARQUIVO : um conjunto de registros logicamente organizados armazenados em um dispositivo de memria secundria (disco rgido, disquetes, fitas magnticas, cd, etc), onde cada registro compreende um conjunto de informaes denominadas campos. Em um arquivo possvel armazenar um volume grande de dados.
Arquivo Registro Campo
Acesso a disco
155
Iremos estudar a categoria do grupo de alto nvel por possuir algumas vantagens sobre a de baixo nvel. facilidade para ler e gravar qualquer tipo de dado e a portabilidade
Acesso a disco
156
Um arquivo aberto em modo texto interpretado em C como sendo uma seqncia de caracteres agrupados em linhas que devem ser separadas por um caracter de nova linha, as informaes numricas tambm so armazenadas em cadeias de caracteres, enquanto que, no modo binrio tudo muito mais simples.
No h necessidade de nenhuma converso de tipos. Para os tipos numricos na forma binria eles so armazenados como esto na memria, nem mesmo a indicao de final de arquivo necessria pois acaba sendo interpretada automaticamente. Sendo assim estaremos utilizando leitura e gravao em alto nvel com modo de acesso binrio
ABRIR O ARQUIVO: Para podermos utilizar as informaes contidas no arquivo ou para guard-las nesse arquivo devemos primeiramente abrir o arquivo:
necessria a declarao de uma estrutura do tipo FILE que receber um ponteiro para o arquivo que est sendo aberto.
Para que o S.O. possa abrir o arquivo trs informaes devem ser fornecidas: o nome do arquivo, o tipo de abertura (se o arquivo est sendo lido ou gravado) e onde guardar as informaes sobre o arquivo.
Usando a funo fopen().
A estrutura FILE contm informaes sobre o arquivo tais como: seu tamanho atual, a localizao de seus buffers de dados, se o arquivo est sendo lido ou gravado, etc.
159
Programa em C
Ponteiro para estrutura FILE
MODO
S.O.
Disco
SIGNIFICADO Abre um arquivo texto para leitura. O arquivo deve existir. Cria um arquivo texto para escrita. Se o arquivo exitir ser recriado por cima caso no exista ser criado. Abre um arquivo texto para gravao.Se o arquivo existir os dados sero anexados no final do arquivo se no existir ser criado um novo. Abrir um arquivo texto para leitura e gravao. O arquivo tem que existir. Abre um arquivo texto para leitura e gravao. Se o arquivo existir ser recriado por cima. Se no existir ser criado. Abre um arquivo texto para atualizao e para adicionar dados no fim do arquivo se ele existir se no cria-se um novo arquivo Abre um arquivo binrio para leitura. O arquivo deve existir. Cria um arquivo binrio para escrita. Se o arquivo exitir ser recriado por cima caso no exista ser criado. Abre um arquivo binrio para gravao.Se o arquivo existir os dados sero anexados no final do arquivo se no existir ser criado um novo. Abre um arquivo binrio para leitura e gravao. O arquivo deve existir e pode ser atualizado.
r w a r+ w+ a+ rb wb ab rb+
wb+
ab+
Abrir um arquivo binrio para leitura e gravao. Se o arquivo existir ele ser destrudo e reinicializado. Se no existir ser criado.
Abrir um arquivo binrio para atualizao e para adicionar dados ao fim do arquivo existente ou um novo arquivo ser criado.
Exemplo.:
#include <stdio.h> #include <conio.h> void main(){ struct aluno { char ra[9]; char nome[20]; }teste; FILE *ARQ; int x; long N; gets(teste.ra); gets(teste.nome); ARQ=fopen ("curso.dat","ab+"); fseek(ARQ,sizeof(teste),SEEK_END); N=(ftell(ARQ)/sizeof(teste)-1); fseek(ARQ,N*sizeof(teste),SEEK_CUR); fwrite(&teste,sizeof(teste),1,ARQ); fclose(ARQ); }
A funo ftell() retorna um nmero inteiro longo que representa o nmero de bytes do comeo do arquivo at a posio atual.
FECHAR ARQUIVO: Todo arquivo aberto dever ser fechado para garantir a integridade dos dados armazenados, caso isso no ocorra poder haver perda de informaes.
fclose().
APAGAR ARQUIVO: Deleta um arquivo existente. Todo arquivo antes de ser apagado deve ser fechado. Forma Geral: remove(nome fsico do arquivo); RENOMEAR ARQUIVO: Permite mudar o nome do arquivo existente para um outro nome diferente. Antes de renomear o arquivo deve ser fechado.
Forma Geral: rename(nome fsico do arquivo,novo nome fsico do arquivo); onde: Nome dado ao arquivo de dados e o novo nome que ser dado
LER REGISTRO DO ARQUIVO: quando lemos um registro de um arquivo estamos transferindo os dados do registro do arquivo, armazenados em memria secundria, para a memria principal do computador (memria RAM). Para isto utilizamos a seguinte instruo: Forma Geral: fread(&estrutura,sizeof(estrutura),1,ponteiro); Onde: &estrutura - o endereo na memria onde os dados sero lidos; sizeof(estrutura) operador que retorna o tamanho da estrutura; 1: quantidade de estruturas a ser lida (normalmente 1); ponteiro: o nome do ponteiro da estrutura FILE.
ESCREVER UM REGISTRO NO ARQUIVO (GRAVAR) : quando escrevemos (gravamos) um registro num arquivo, estamos transferindo os dados do registro, armazenados em memria principal, para a memria secundria do computador (disquete, disco rgido, CD, etc). Utilizamos a seguinte instruo: Forma Geral: fwrite(&estrutura,sizeof(estrutura),1,ponteiro); Onde:&estrutura- o endereo na memria onde os dados sero armazenados; sizeof(estrutura) operador que retorna o tamanho da estrutura; 1: quantidade de estruturas a ser gravada (normalmente 1); ponteiro: o nome do ponteiro da estrutura FILE.
ORGANIZAO DE ARQUIVOS
164
Existem outras formas de acesso que so variaes destas que no sero tratadas.
ORGANIZAO DE ARQUIVOS
165
Acesso Seqencial:
Quando desejamos ter acesso aos dados de um determinado registro mas no sabemos a localizao desse registro no arquivo devemos vasculhar o arquivo desde o incio em busca do registro desejado at o final do arquivo se necessrio. Esta operao dever ser repetida seqencialmente, isto , avanando pelos registros armazenados at que se encontre o registro procurado. Isto significa que para acessar um registro especfico precisamos obedecer a ordem com que os registros foram armazenados no arquivo, o que implica em percorrer todos os registro que o antecedem.
ORGANIZAO DE ARQUIVOS
166
167
Para indicar o final do arquivo usamos a funo feof( ) que retorna um nmero inteiro enviado pelo S.O que indica final de arquivo. Forma Geral: feof(ponteiro); Onde: ponteiro o nome da varivel do tipo FILE;
No DOS a funo feof() retorna 1 caso seja final de arquivo e 0 caso contrrio.
Exemplo:
Para posicionar o ponteiro de arquivo no incio do arquivo, isto , no 1 registro temos: Forma Geral: rewind(ponteiro); Onde: Ponteiro o nome da varivel do tipo FILE. A funo ftell() retorna um nmero inteiro longo que representa o nmero de bytes do comeo do arquivo at a posio atual. Forma Geral: ftell(ponteiro); Onde: Ponteiro o nome da varivel do tipo FILE. Se o nmero que retornou dessa funo for dividido pelo tamanho da estrutura teremos o nmero da posio fsica do registro.
Exemplo prtico
170
struct veiculo { char modelo[20]; char marca[20]; float preco; }reg; FILE *parq; void void void void void void void void void void void char menu(); abre_arquivo1(); abre_arquivo2(); inclusao(); consulta_s(); consulta_d(); alteracao(); exclusao(); reorganizar(); tela1(); tela2(); resposta();
void abre_arquivo1(){ parq=fopen("t3.dad","ab+"); if (parq==NULL){ printf("Ocorreu um erro o arquivo nao pode ser aberto\n"); delay(1000); exit(1); } } void abre_arquivo2(){ parq=fopen("t3.dad","rb+"); if (parq==NULL){ printf("Ocorreu um erro o arquivo nao pode ser aberto\n"); delay(1000); exit(1); } }
Continuao
171
void menu(){ int op; do{ clrscr(); gotoxy(20,2);printf("<<< M E N U D E O P C O E S >>>"); gotoxy(30,6);printf("1 - INCLUSAO "); gotoxy(30,8);printf("2 - CONSULTA SEQUENCIAL"); gotoxy(30,10);printf("3 - CONSULTA DIRETA"); gotoxy(30,12);printf("4 - ALTERACAO"); gotoxy(30,14);printf("5 - EXCLUSAO"); gotoxy(30,16);printf("6 - FIM "); gotoxy(25,18);printf("Digite a opcao <1-6> ?"); do{ gotoxy(47,18);clreol();scanf("%d",&op); } while (op<1 || op>6); if (op!=6){ switch (op){ case 1:inclusao();break; case 2:consulta_s();break; case 3:consulta_d();break; case 4:alteracao();break; case 5:exclusao();break; } } }while (op!=6); }
Continuao
172
void inclusao(){ char op; int x; long N; fseek(parq,sizeof(reg),SEEK_END); N=(ftell(parq)/sizeof(reg)-1); do { tela1(); getchar(); gotoxy(10,6);printf("O NUMERO DO REGISTRO: %ld",N); gotoxy(40,8);gets(reg.modelo); gotoxy(40,10);gets(reg.marca); gotoxy(40,12);scanf("%f",®.preco); fseek(parq,N*sizeof(reg),SEEK_CUR); fwrite(®,sizeof(reg),1,parq); op=resposta(); N++; }while(op!='N'); }
Continuao
173
void consulta_s(){ int num,lin=8; tela2(); rewind(parq); fread(®,sizeof(reg),1,parq); while (!feof(parq)){ gotoxy(10,lin);printf("%s",reg.modelo); gotoxy(40,lin);printf("%s",reg.marca); gotoxy(60,lin);printf("%10.2f",reg.preco); fread(®,sizeof(reg),1,parq); lin++; } getch(); }
Continuao
174
char op; fseek(parq,sizeof(reg),SEEK_END); tam=(ftell(parq)/sizeof(reg))-2; do{ tela1(); gotoxy(10,6);printf("QUAL REGISTRO DESEJA CONSULTAR ?"); do{ gotoxy(45,6);clreol();scanf("%d",&num); }while (num<0 || num>tam); fseek(parq,num*sizeof(reg),SEEK_SET); fread(®,sizeof(reg),1,parq); gotoxy(40,8);printf("%s",reg.modelo); gotoxy(40,10);printf("%s",reg.marca); gotoxy(40,12);printf("%10.2f",reg.preco); op=resposta(); }while(op!='N'); }
Continuao
175
tela1(); gotoxy(10,6);printf("QUAL REGISTRO DESEJA ALTERAR ?"); do{ gotoxy(45,6);clreol();scanf("%d",&num); }while (num<0 || num>tam); fseek(parq,num*sizeof(reg),SEEK_SET); fread(®,sizeof(reg),1,parq); gotoxy(40,8);printf("%s",reg.modelo); gotoxy(40,10);printf("%s",reg.marca); gotoxy(40,12);printf("%10.2f",reg.preco); getchar(); gotoxy(40,8);gets(resp); if (strcmp(resp,"") !=0){ strcpy(reg.modelo,resp); gotoxy(40,8);clreol();printf("%s",reg.modelo); } // Continua
Continuao
176
// Continuao gotoxy(40,10);gets(resp); if (strcmp(resp,"") !=0){ strcpy(reg.marca,resp); gotoxy(40,10);clreol();printf("%s",reg.marca); } do{ gotoxy(40,12);gets(resp); if (strcmp(resp,"") !=0){ reg.preco=atof(resp); gotoxy(40,12);clreol();printf("%8.2f",reg.preco); } }while (reg.preco <=0); fseek(parq,num*sizeof(reg),SEEK_SET); fwrite(®,sizeof(reg),1,parq); op=resposta(); }while(op!='N'); fclose(parq); abre_arquivo1(); }
Continuao
177
fclose(parq); abre_arquivo2(); fseek(parq,sizeof(reg),SEEK_END); tam=(ftell(parq)/sizeof(reg))-2; do{ tela1(); gotoxy(10,6);printf("QUAL REGISTRO DESEJA CONSULTAR ?"); do{ gotoxy(45,6);clreol();scanf("%d",&num); }while (num<0 || num>tam); fseek(parq,num*sizeof(reg),SEEK_SET); fread(®,sizeof(reg),1,parq); if (strcmp(reg.modelo,"***") == 0){ gotoxy(20,22);printf("Registro ja excluido !!"); delay(1000); } else // Continuao
Continuao
178
// Continuao { gotoxy(40,8);printf("%s",reg.modelo); gotoxy(40,10);printf("%s",reg.marca); gotoxy(40,12);printf("%10.2f",reg.preco); gotoxy(40,19);printf("Confirma Exclusao ?"); op=resposta(); if (op=='S'){ strcpy(reg.modelo,"***"); fseek(parq,num*sizeof(reg),SEEK_SET); fwrite(®,sizeof(reg),1,parq); cont++; gotoxy(40,19);printf("Registro Excluido !!");delay(1000); } } gotoxy(40,19);clreol(); op=resposta(); }while(op!='N'); fclose(parq); abre_arquivo1(); if (cont > 0) reorganizar(); }
Continuao
179
final
180
PRECO R$\n");
void tela1(){ clrscr(); gotoxy(40,2);printf("CADASTRO DE VEICULOS"); gotoxy(10,8);printf(" MODELO............: "); gotoxy(10,10);printf(" MARCA.............: "); gotoxy(10,12);printf(" PRECO.............: R$"); }
char resposta(){ char op; gotoxy(40,20);printf("Deseja Continuar <S/N> ?"); do{ gotoxy(65,20);clreol();scanf("%c",&op); op=toupper(op); }while (op!='N' && op !='S'); return(op); }