Вы находитесь на странице: 1из 70

Lógica de Programação

Prof. Márcio Soussa


2

Lógica de Programação

• Márcio Soussa
▫ marcio.soussa10@gmail.com

• Doutor em Modelagem Computacional e Tecnologias


Industriais (2015)
▫ SENAI-CIMATEC
Referências Bibliográficas
• FORBELLONE, André L.V., EBERSPACHER, H.F. Lógica de Programação
– A construção de Algoritmos e Estruturas de Dados. Pearson Brasil.

• MANZANO, José Augusto N.G., OLIVEIRA, Jair Figuereido de.


Algoritmos – Lógica para Desenvolvimento de Programação de
Computadores. Érica. São 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 pelas contribuições


Introdução a C
• A linguagem “C” foi criada na década 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
características de “alto nível” quanto de “baixo nível” sendo considerada
uma linguagem de programação de “nível médio “. Outra característica
muito importante é ser portável, isto é, poder ser usada em várias
máquinas de portes e sistemas operacionais diferentes.

• Alto nível : comandos com sintaxe próxima a linguagem humana e tipos de


dados inteiro, real, caracter e string. Exemplo de linguagens de alto nível:
Pacal, Delphi, Basic, Visual Basic, Clipper, etc.
• Baixo nível: manipulação de bits, bytes e endereços. Exemplo: Assembler.
• Nível médio: combina elementos das linguagens de alto nível com a
funcionalidade das de baixo nível. Exemplo: Linguagem “C”.
Estrutura básica de um programa em “C”

• Um programa em “C” consiste em uma ou mais


funções, sendo que a única função que
necessariamente precisa estar presente é a
denominada main() (principal), que é a primeira
função a ser executada quando o programa se
inicia. As outras funções podem proceder ou
suceder a função main().
Estrutura básica de um programa em “C”

main(){
// corpo da função – bloco de comandos
}
• Os parênteses após a palavra “main()”, indica
que é uma função. O nome das demais funções
desenvolvidas em C, pode ser qualquer um,
menos “main”.
Estrutura básica de um programa em “C”

• A linguagem “C” é “Case Sensitive”, isto é,


maiúsculas e minúsculas fazem diferença. Se
for declarada uma variável com o nome soma
ela será diferente de Soma, SOMA, SoMa ou
sOmA. Da mesma forma que os comandos em
“C” devem ser sempre escritos com letras
minúsculas.
Estrutura básica de um programa em “C”

• Os comentários e as observações do programa


podem aparecer em qualquer lugar desde que
colocados entre os delimitadores /* comentário
*/ ou // comentário.

• Em “C” as instruções são sempre encerradas por


“; “.
Estrutura básica de um programa em “C”
• Tipos Básicos de dados

Tipo Bit Byte Escala


char 8 1 -128 a 127
int 16 2 -32768 a 32767
float 32 4 3.4E-38 a 3.4E+38
double 64 8 1.7E-308 a 1.7E+308
void 0 0 sem valor
Estrutura básica de um programa em “C”
• Modificadores de tipo
▫ Exceto o void, os tipos de dados básicos podem ter
vários modificadores precedendo-os. Um modificador
é usado para alterar o significado de um tipo básico
para adaptá-lo mais precisamente às necessidades de
diversas situações:

signed (com sinal)


unsigned (sem sinal)
long (máxima precisão)
short (menor precisão)
Estrutura básica de um programa em “C”
• Modificadores de tipo
TIPO TAM.(bytes) ESCALA
Char 1 -127 a 127
Unsigned char 1 0 a 255
Signed char 1 -127 a 127
Int 2 -32767 a 32767
Unsigned int 2 0 a 65535
Signed int 2 -32767 a 32767
Short int 2 -32767 a 32767
Unsigned short int 1 0 a 65535
Signed short int 1 -32767 a 32767
Long int 4 -2147483647 a 2147483647
Signed long int 4 -4294967295 a 4294967295
Unsigned long int 4 0 a 4294967295
Float 4 3.4 *(10-38) a 3.4 * (10+38)
Double 8 1.7*(10-308) a 1.7*(10+308)
Long double 16 3.4*(10-4983) a 3.4*(10+4983)
Estrutura básica de um programa em “C”

• IDENTIFICADORES
▫ São usados para dar nomes às variáveis,
constantes, tipos e ou funções. Para a criação
desses identificadores deverá ser
consideradas as informações a seguir:
•  Podem ser formados por letras, números ou sublinhado(_);
•  Tem que começar por letra ou sublinhado;
•  Letras maiúsculas e minúsculas são caracteres distintos;
•  Não podem ser palavras reservadas;
• Podem conter qualquer tamanho porém somente os
31primeiros caracteres são significativos.
Estrutura básica de um programa em “C”
• VARIÁVEL
▫ É uma posição de memória com um nome,
que é usada para armazenar uma informação
de um tipo específico que pode ser
modificada pelo programa.
Forma Geral :
tipo lista_de variáveis;
Exemplo: int a,b,d;
float x,y;
unsigned int w;
Estrutura básica de um programa em “C”
• Inicialização de variáveis:
▫ As variáveis podem ser inicializadas no
mesmo momento em que elas são
declaradas, colocando um sinal de igual e
a informação desejada.
Exemplo:
char op=‘S’; /* as informações do tipo caracter são envolvidas por aspas
simples */

int primeiro=0;
char mensagem[20]=”Bom Dia !!”; /* as strings são
envolvidas por aspas */
Estrutura básica de um programa em “C”

• MODIFICADORES DE TIPO DE ACESSO


Constantes : Não podem ser modificadas pelo
programa.
Forma Geral:
const tipo identificador;

Exemplo: const int max=10;


const float taxa1=0.7,taxa2=0.5;
Bibliotecas de funções .h

• Existem bibliotecas com funções que auxiliam a


manipulação dos comando de entrada e saia e
também de manipulação de telas.

• Elas são descritas no início do programa C:

#include <nome_da_biblioteca.h>
Bibliotecas de funções .h
• FUNÇÕES DE TELA
▫ Biblioteca <conio.h>
#include <conio.h>
• Nela encontramos as seguintes funções
mais usadas:
 clrscr() - limpar a tela; Linux : printf("\033[2J");
 clreol() - limpa a linha;
 gotoxy(coluna,linha) - posiciona o cursor;
 window(coluna incial,linha inicial,coluna final, linha final) -
cria uma janela na tela;
 textcolor(cor) - seleciona a cor dos caracteres de texto;
 textbackground(cor) – seleciona a cor do fundo da tela;
Bibliotecas de funções .h
• TABELA DE CORES:
0 PRETO
1 AZUL
2 VERDE
3 CIANO
4 VERMELHA
5 MAGENTA
6 MARROM
7 CINZA CLARO
8 CINZA ESCURO
9 AZUL CLARO
10 VERDE CLARO
11 CIANO CLARO
12 ALARANJADO
13 MAGENTA CLARO
14 AMARELO
15 BRANCO
Bibliotecas de funções .h
• FUNÇÕES DE ENTRADA E SAÍDA DE DADOS
▫ Biblioteca <stdio.h>
#include <stdio.h>
• getchar() - entrada de um caracter individual;
• getch() - entrada de um caracter. O caracter não é exibido na tela não é
necessário teclar <enter>;
• getche() - entrada de um caracter. O caracter é exibido na tela não é
necessário teclar <enter>;
• putchar - exibe um caracter na tela;
• gets() - entrada de string;
• puts() - saída de string;
• scanf() - entrada de dados formatada com string de controle de acordo com
o tipo da variável;
• printf() - saída de dados formatada com string de controle de acordo com
o tipo da variável;
• cprintf() - saída de dados formatada colorida com string de controle de
acordo com o tipo da variável;
Estrutura básica de um programa em “C”
• CONSTANTES BARRA INVERTIDA
São utilizadas para controlar a exibição de dados na
tela e na impressora.
CÓDIGO SIGNIFICADO
\n nova linha (line feed)
\b retrocesso (backspace)
\t tabulação horizontal
\v tabulação vertical
\a alerta(beep)
\” para exibir aspas
\\ para exibir barra invertida
\f salto de folha (form fee)
\r retorna ao início da linha (return)
\0 nulo
Estrutura básica de um programa em “C”
• COMANDOS DE FORMATO
▫ São constantes que definem o tipo e o formato
dos dados a serem exibidos.
Comando Formato
%c caracter
%d inteiros decimais com sinal
%i inteiros decimais com sinal
%f decimais com ponto flutuante
%s string
%e notação científica
%o octal
%x hexadecimal
%l inteiro longo
%lf double
%u decimal sem sinal
Utilização das funções C.

• A função printf( )
▫ A função printf serve para exibir uma informação
no vídeo ou na impressora e possui a seguinte
estrutura.
• Forma Geral:
• printf(“expressão de controle”, lista de argumentos);

• 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 número é inteiro: 4 e este é real: 5.5
Utilização das funções C.
• A Função scanf()
▫ A função scanf() é outra das funções de E/S
implementadas em todos os compiladores C. Ela
é o complemento de printf() e nos permite ler
dados formatados da entrada padrão (teclado).

Forma Geral:
scanf(“expressão de controle”, lista de argumentos)
Utilização das funções C.

• A lista de argumentos deve consistir nos


endereços das variáveis. C oferece um
operador para tipos básicos chamado operador
de endereço e referenciado pelo símbolo & que
retorna o endereço do operando. Na função
scanf() cada nome de variável deve ser
precedida por um ampersand(&) ou E-
comercial. Somente strings não devem conter &
na frente.
Utilização das funções C.

• Exemplo1: O programa a seguir exibe a idade em dias de uma pessoa.

#include <stdio.h>
#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
Utilização das funções C.
• Exercício:
• Calcula a média aritmética de duas notas de um aluno.
#include <stdio.h>
#include <conio.h>
void main()
{
float media,nota1,nota2;
clrscr();
printf(“\t Digite a 1ª nota: “);
scanf(“%f",&nota1);
printf("\t Digite a 2ª nota: ");
scanf("%f",&nota2);
media=(nota1 + nota2)/2;
printf(“\t A média é: %5.2f”, media);
getch();
}
Comandos em C 27

• Comandos de Seleção
if (x>9)
y=100;
else
y=200; if((x == 2) && (x!=1)){
a=10;
b=20;
c=30;
}
else
a=b=c=0; if ((x == 2) && (x!=1)) {
a=10;
b=20;
c=30;
} else {
a=1;
b=c=0;
}
Comandos em C 28

• Comando de Seleção Múltipla


char ch;
switch (ch){
case ‘1’ :
printf(“Inclusão”);
break;
case ‘2’ :
printf(“Consulta”); int num,a,b;
break; switch (num) {
default : case 1,2 :
printf(“Fim”); a=2*2;
} b=-1;
break;
case 3,4,5 :
a=2*3;
b=0;
break;
}
Comandos em C 29

• Comandos de Repetição – while - do


while (ch!=’A’){
c=a+b; while ((a>0) || (b>0)){
printf(“%d”,c); c+=b;
scanf(“%c”,&ch); --a;
} --b;
}
do{
a++
printf(“%d”,a);
} while (a<100);

do{
scanf(“%f”,&a);
scanf(“%d”,&b);
} while ((a<=0) || (b<=0));
Comandos em C 30

• Comandos de Repetição - for


for ( x=1;x<=100;x++ )
printf(“%d”,x);
for (x=0,y=0;x<10;x++,y--)
printf(“%d %d”,x,y);

for (x=100;x!=65;x-=5) {
z = x*x;
printf(“O quadrado de %d e %d”,x,z);
}

for(x=0; ;x++) {
printf(“%d”,x);
if (x==10) break;
}
Estrutura de Dados – Matriz ou Vetor
31

• Matrizes ou vetores (Tabelas em memória) são


do tipo de dados que podem ser “Construídos” à
medida que se fazem necessário.
Ilustração de uma matriz ou vetor (1x5)
notas[5] ou notas[0..4]
5 3 4 87 9
Significa dizer que a variável notas na posição 0 ou 1 (a depender qual
sintaxe utilize) valerá 5
notas[0] = 5 , notas[1] = 3 ......... notas[4] = 9
Estrutura de Dados – Matriz ou Vetor
32

• STRING
▫ Em linguagem “C” não existe o tipo string. A utilização
desse tipo de variável se dá através da utilização 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 1 2 3 4 5 6 7 8 9 10
P a u l o \0
Estrutura de Dados – Matriz ou Vetor
33

• Para manipular as informações armazenadas em uma


string podemos utilizar as funções string ou utilizamos as
funções caracter , já que uma string é um vetor de
caracteres.

arquivo de cabeçalho para funções de string <string.h>


arquivo de cabeçalho para funções caracter <ctype.h>
Estrutura de Dados – Matriz ou Vetor
34

• Algumas Funções de Manipulação de Strings usando a


biblioteca <string.h>
Função Descrição Forma Geral

strcpy() copia uma string em outra. strcpy (s1,s2); // copia o conteúdo de


s2 em s1 e termina com nulo.

strcmp() compara duas strings. x=strcmp(s1,s2); // x==0 se as


strings forem iguais ou x!=0 se forem
diferentes.
strcat() junta o conteúdo de duas strcat(s1,s2); // s1 irá conter o
strings. resultado da junção das 2 strings.

strlen() fornece o tamanho de uma x=strlen(s1); // x vai conter o número


string. de caracteres ocupados na string .

strchr() verifica se um caracter x=strschr(s1,ch); // x !=0 se existir o


pertence a string. caracter ou x==0 se não existir.

strstr() verifica se uma string existe x=strstr(s1,s2); // x !=0 se s2 existir


dentro da outra string. em s1 ou x==0 se não existir.
Estrutura de Dados – Matriz ou Vetor
35

• Algumas Funções de Manipulação de caracter usando a


biblioteca <ctype.h>
Função Descrição Forma Geral
isdigit() verifica se o caracter é um isdigit(a); // !=0 é número; =0 não é
número de 0-9. número.

isalpha() verifica se o caracter é uma isalpha(a); // !=0 é letra; =0 não é


letra letra.

isupper() verifica se um caracter está isupper(a); // !=0 é maiúscula =0 não


em maiúscula é.

ispunct() verifica se um caracter é ispunct(a); // !=0 é pontuação; =0 não


pontuação. é.

isspace() verifica se um caracter é isspace(a); // !=0 é espaço; =0 não é.


espaço.
toupper() transforma um caracter em a=toupper(a); // o conteúdo de a
letra maiúscula. em maiúscula.

tolower() transforma um caracter em a=tolower(a); // o conteúdo de a em


letra minúscula. minúscula.
Estrutura de Dados – Matriz ou Vetor
36

• Uma matriz é um tipo de dado usado para


representar uma certa quantidade de variáveis
de valores homogêneos. Imagine o seguinte
problema: ler a média final de 5 alunos e
calcular a media geral. Você poderia declarar:
Estrutura de Dados – Matriz ou Vetor
37

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”, &notas[i]);
media+=notas[i];
}
media=media/8;
printf(“A média Geral= %5.2f”,media);
}
Exemplos – usando Matriz ou Vetor
#include <stdio.h> 38
#include <conio.h>
#include <ctype.h>
void main(){
char nome[20],op='S';
float va,rl;
do {
clrscr();
printf("\t\tAPLICACOES\n");
printf("\t Nome.....: ");
gets(nome);
printf("\t Valor....: ");
scanf("%f",&va);
if (va<=10000.00)
rl=va*0.014-0.002*va;
else
rl=va*0.018-0.002*va;
printf("\t Rendimento .. : %8.2f\n\n",rl);
printf("Deseja Continuar %s <s/n > ? ",nome);
do {
gotoxy(50,6);
clreol();
scanf("%c",&op);
op=toupper(op);
} while ((op!='S') && (op!='N'));
getchar();
} while (op=='S');
}
Exemplos – usando Matriz ou Vetor
39

• Matriz multidimensional:

#include <stdio.h>
Resultado:
#include <conio.h>
j/i 0 1 2 3
void main(){
0 1 2 3 4
int j,i,num[4][4];
1 5 6 7 8
clrscr();
for(j=0;j<4;++j){ 2 9 10 11 12

for(i=0;i<4;++i){ 3 13 14 15 16
num[j][i] = (j*4)+i+1;
printf("%2.0d ",num[j][i]);
} Agora efetue a soma da Diagonal
printf("\n"); principal da Matriz e apresente na
} tela.
getchar();
}
Função 40

• Função é um seguimento independente do


programa que executa uma tarefa específica.

• Todo o programa em “C” é formado por uma ou


mais funções.
Função
41

• Forma Geral:

tipo nomeDaFunção (lista de parâmetros){


corpo da função;
}

• Toda função deverá ter seu protótipo


declarado no início do programa, ou em um
arquivo de cabeçalho .h
Função 42

• Em “C” podemos ter dois tipos de parâmetros: passagem


de parâmetros por valor e passagem de parâmetros por
referência.
• Na passagem de parâmetros por valor as
informações dos parâmetros são copiadas para a função
receptora. As alterações nesses parâmetros não tem
nenhum efeito na função de origem da informação.
• Na passagem de parâmetros por referência, é
enviado o endereço do parâmetro para a função
receptora, dessa forma o endereço é usado para acessar
as informações originais. Isto significa que qualquer
alteração efetuada no parâmetro estará modificando o
conteúdo original da informação enviada.
Função Pasagem por Valor e Referência
43

#include <stdio.h> Por referência


#include <conio.h>
void calculo (int *a,int *b);
float sqr (float num);
void main(){ Por Valor
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;
} Observe os resultados.
float sqr (float num){
num=num*num;
return num;
}
Arquivos 44

• ARQUIVO : É um conjunto de registros logicamente


organizados armazenados em um dispositivo de
memória secundária (disco rígido, disquetes, fitas
magnéticas, cd, etc), onde cada registro compreende
um conjunto de informações denominadas campos.
Em um arquivo é possível armazenar um volume
grande de dados.
Arquivo
Registro
Campo
Acesso a disco 45

• “Linguagem C” divide as categorias de acesso a


disco em dois grupos.
▫ Alto nível, ou leitura e gravação bufferizada
▫ Baixo nível, ou leitura e gravação não bufferizada.
• Iremos estudar a categoria do grupo de alto nível
por possuir algumas vantagens sobre a de baixo
nível.
“facilidade para ler e gravar qualquer tipo de
dado e a portabilidade”
Acesso a disco 46

• É possível classificar os arquivos:


▫ Modo texto
▫ Modo binário

• Um arquivo aberto em modo texto é interpretado em “C”


como sendo uma sequência de caracteres agrupados em
linhas que devem ser separadas por um caractere de nova
linha, as informações numéricas também são armazenadas
em cadeias de caracteres.
OPERAÇÕES BÁSICAS COM ARQUIVO
47

• Abrir
• Fechar
• Apagar
• Copiar
• Renomear
OPERAÇÕES BÁSICAS COM ARQUIVO
48

• ABRIR O ARQUIVO: Para podermos utilizar as


informações contidas no arquivo ou para guardá-las nesse
arquivo devemos primeiramente abrir o arquivo:
▫ É necessária a declaração 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 três informações


devem ser fornecidas: o nome do arquivo, o tipo de
abertura (se o arquivo está sendo lido ou gravado) e onde
guardar as informações sobre o arquivo.
▫ Usando a função fopen().

▫ A estrutura FILE contêm informações sobre o arquivo tais como:


seu tamanho atual, a localização de seus buffers de dados, se o
arquivo está sendo lido ou gravado, etc.
49

OPERAÇÕES BÁSICAS COM ARQUIVO


Nome do arquivo e
tipo de abertura
Programa em “C” S.O. Disco
Ponteiro para
estrutura FILE

MODO SIGNIFICADO

r Abre um arquivo texto para leitura. O arquivo deve existir.

w Cria um arquivo texto para escrita. Se o arquivo existir será recriado por cima caso não exista será criado.

a Abre um arquivo texto para gravação.Se o arquivo existir os dados serão anexados no final do arquivo se não existir será criado um
novo.

r+ Abrir um arquivo texto para leitura e gravação. O arquivo tem que existir.

w+ Abre um arquivo texto para leitura e gravação. Se o arquivo existir será recriado por cima. Se não existir será criado.

a+ Abre um arquivo texto para atualização e para adicionar dados no fim do arquivo se ele existir se não cria-se um novo arquivo

rb Abre um arquivo binário para leitura. O arquivo deve existir.

wb Cria um arquivo binário para escrita. Se o arquivo exitir será recriado por cima caso não exista será criado.

ab Abre um arquivo binário para gravação.Se o arquivo existir os dados serão anexados no final do arquivo se não existir será criado um
novo.

rb+ Abre um arquivo binário para leitura e gravação. O arquivo deve existir e pode ser atualizado.

wb+ Abrir um arquivo binário para leitura e gravação. Se o arquivo existir ele será destruído e reinicializado. Se não existir será criado.

ab+ Abrir um arquivo binário para atualização e para adicionar dados ao fim do arquivo existente ou um novo arquivo será criado.
OPERAÇÕES BÁSICAS COM ARQUIVO
50

• 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); A função ftell() retorna um número
ARQ=fopen ("curso.dat","ab+");
fseek(ARQ,sizeof(teste),SEEK_END); inteiro longo que representa o número de
N=(ftell(ARQ)/sizeof(teste)-1); bytes do começo do arquivo até a posição
fseek(ARQ,N*sizeof(teste),SEEK_CUR); atual.
fwrite(&teste,sizeof(teste),1,ARQ);
fclose(ARQ);
}

FECHAR ARQUIVO: Todo arquivo aberto deverá ser fechado para garantir a
integridade dos dados armazenados, caso isso não ocorra poderá haver
perda de informações.
▫ fclose().
OPERAÇÕES BÁSICAS COM ARQUIVO
51

• APAGAR ARQUIVO: Deleta um arquivo existente. Todo


arquivo antes de ser apagado deve ser fechado.
Forma Geral:
remove(nome físico 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 físico do arquivo,novo nome físico do arquivo);
onde: Nome dado ao arquivo de dados e o novo nome que será
dado
OPERAÇÕES BÁSICAS COM ARQUIVO
52

• LER REGISTRO DO ARQUIVO: quando lemos um registro de um


arquivo estamos transferindo os dados do registro do arquivo,
armazenados em memória secundária, para a memória principal do
computador (memória RAM). Para isto utilizamos a seguinte
instrução:
Forma Geral:
fread(&estrutura,sizeof(estrutura),1,ponteiro);
Onde: &estrutura - é o endereço na memória onde os dados serão
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.
OPERAÇÕES BÁSICAS COM ARQUIVO
53

• ESCREVER UM REGISTRO NO ARQUIVO (GRAVAR) : quando


escrevemos (gravamos) um registro num arquivo, estamos
transferindo os dados do registro, armazenados em memória
principal, para a memória secundária do computador (disquete,
disco rígido, CD, etc). Utilizamos a seguinte instrução:
Forma Geral:
fwrite(&estrutura,sizeof(estrutura),1,ponteiro);

Onde:&estrutura-é o endereço na memória onde os dados serão


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.
ORGANIZAÇÃO DE ARQUIVOS 54

• Existem duas formas diferentes de acesso aos


registros de um arquivo:
▫ O acesso seqüencial,
▫ O acesso direto (também conhecido como
randômico)

“Existem outras formas de acesso que são


variações destas que não serão tratadas.”
ORGANIZAÇÃO DE ARQUIVOS 55

• Acesso Seqüencial:
▫ Quando desejamos ter acesso aos dados de um
determinado registro mas não sabemos a localização
desse registro no arquivo devemos vasculhar o arquivo
desde o início em busca do registro desejado até o
final do arquivo se necessário. Esta operação deverá
ser repetida seqüencialmente, isto é, avançando pelos
registros armazenados até que se encontre o registro
procurado. Isto significa que para acessar um registro
específico precisamos obedecer a ordem com que os
registros foram armazenados no arquivo, o que
implica em percorrer todos os registro que o
antecedem.
ORGANIZAÇÃO DE ARQUIVOS 56

• Acesso Direto ou Randômico:


▫ Neste caso para acessarmos o registro desejado é
necessário que saibamos a sua posição física (posição
do registro no arquivo no instante da gravação). Dessa
forma é possível se posicionar instantaneamente no
registro desejado sem ter que percorrer todos os
registros que o antecedem. Para isto, é necessário
conhecer o número da posição física do registro
dentro do arquivo. A posição física de um registro é
um número único, pois nunca dois registros diferentes
poderão ter a mesma localização.
57
COMANDOS E FUNÇÕES PARA MANIPULAÇÃO DE REGISTROS

• Para posicionar o ponteiro de arquivo para o registro:


fseek(ponteiro,sizeof(estrutura),deslocamento);
Onde: ponteiro: é o nome do ponteiro da estrutura FILE.
sizeof(estrutura) – operador que retorna o tamanho da estrutura;
Deslocamento também chamado de modo : posição especificada para o
ponteiro do arquivo;

DESCRIÇÃO Pode ser uma macro MODO


Pode ser um número
Começo do arquivo SEEK_SET 0

Posição corrente do ponteiro SEEK_CUR 1

Final do arquivo SEEK_END 2


COMANDOS E FUNÇÕES PARA MANIPULAÇÃO DE REGISTROS
58

• Para indicar o final do arquivo usamos a função feof( )


que retorna um número inteiro enviado pelo S.O que
indica final de arquivo.

Forma Geral:
feof(ponteiro);
Onde: ponteiro é o nome da variável do tipo FILE;
No DOS a função feof() retorna –1 caso seja final de arquivo e 0 caso
contrário.
Exemplo:

while ( !feof(ponteiro))
fread(&estrutura,sizeof(estrutura),1,ponteiro);
COMANDOS E FUNÇÕES PARA MANIPULAÇÃO DE REGISTROS
59

• Para posicionar o ponteiro de arquivo no início do arquivo, isto é, no


1º registro temos:
Forma Geral:
rewind(ponteiro);
Onde: Ponteiro é o nome da variável do tipo FILE.

• A função ftell() retorna um número inteiro longo que representa o


número de bytes do começo do arquivo até a posição atual.
Forma Geral:
ftell(ponteiro);
Onde: Ponteiro é o nome da variável do tipo FILE.

Se o número que retornou dessa função for dividido pelo tamanho da


estrutura teremos o número da posição física do registro.
Exemplo prático 60

#include <stdio.h> void main(){


#include <conio.h> abre_arquivo1();
#include <dos.h> menu();
#include <ctype.h> fclose(parq);
#include <stdlib.h> }
#include <string.h>

struct veiculo { void abre_arquivo1(){


char modelo[20]; parq=fopen("t3.dad","ab+");
char marca[20]; if (parq==NULL){
float preco; printf("Ocorreu um erro o arquivo nao pode ser aberto\n");
}reg; delay(1000);
exit(1);
FILE *parq; }
}
void menu(); void abre_arquivo2(){
void abre_arquivo1(); parq=fopen("t3.dad","rb+");
void abre_arquivo2(); if (parq==NULL){
void inclusao(); printf("Ocorreu um erro o arquivo nao pode ser aberto\n");
void consulta_s(); delay(1000);
void consulta_d(); exit(1);
void alteracao(); }
void exclusao(); }
void reorganizar();
void tela1();
void tela2();
char resposta();
Exemplo prático ... Continuação
61

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);
}
Exemplo prático ... Continuação
62

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",&reg.preco);
fseek(parq,N*sizeof(reg),SEEK_CUR);
fwrite(&reg,sizeof(reg),1,parq);
op=resposta();
N++;
}while(op!='N');
}
Exemplo prático ... Continuação
63

void consulta_s(){
int num,lin=8;
tela2();
rewind(parq);
fread(&reg,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(&reg,sizeof(reg),1,parq);
lin++;
}
getch();
}
Exemplo prático ... Continuação
64

void consulta_d(){
int num;
long tam;

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(&reg,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');
}
Exemplo prático ... Continuação
65

void alteracao(){
int num;
long tam;
char op, resp[20]="";

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 ALTERAR ?");
do{
gotoxy(45,6);clreol();scanf("%d",&num);
}while (num<0 || num>tam);
fseek(parq,num*sizeof(reg),SEEK_SET);
fread(&reg,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………………………………………………………………………………
Exemplo prático ... Continuação
66

// Continuação…………………………………………………
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(&reg,sizeof(reg),1,parq);
op=resposta();
}while(op!='N');
fclose(parq);
abre_arquivo1();
}
Exemplo prático ... Continuação
67

void exclusao(){
int num,cont=0;
long tam;
char op;

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(&reg,sizeof(reg),1,parq);
if (strcmp(reg.modelo,"***") == 0){
gotoxy(20,22);printf("Registro ja excluido !!");
delay(1000);
} else
// Continuação ……………………………………………………
Exemplo prático ... Continuação
68

// Continuação ……………………………………………………
{
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(&reg,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();
}
Exemplo prático ... Continuação
69

void reorganizar(){
FILE *parq2;
parq2=fopen("t3.bak","wb+");
fclose(parq);
abre_arquivo2();
rewind(parq);
while (! feof(parq)){
if (fread(&reg,sizeof(reg),1,parq) >=1)
if (strcmp(reg.modelo,"***") !=0)
fwrite(&reg,sizeof(reg),1,parq2);
}
fclose(parq);
fclose(parq2);
remove("t3.dad");
rename("t3.bak","t3.dad");
abre_arquivo1();
}
Exemplo prático ... final
70

void tela2(){
clrscr();
gotoxy(30,3); printf("CADASTRO DE VEICULOS ");
gotoxy(10,5);printf("MODELO \t\t\t MARCA \t\t\t 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);
}

Вам также может понравиться