Buscar

Aula 07 Linguagem C

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

Lógica de Programação
Prof. Márcio Soussa
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”
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”.
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”
Tipos Básicos de dados 
Estrutura básica de um programa em “C”
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
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
Estrutura básica de um programa em “C”
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)
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;
				unsigened 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; 
Estrutura básica de um programa em “C”
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> 
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: 
Bibliotecas de funções .h
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
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;
Bibliotecas de funções .h
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 
Estrutura básica de um programa em “C”
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
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();
}
Utilização das funções C.
27
Comandos em C
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=1;
 b=c=0;
}
if((x == 2) && (x!=1)){
 a=10;
 b=20;
 c=30;
}
else
 a=b=c=0;
28
Comando de Seleção Múltipla 
Comandos em C
char ch;
switch (ch){
 case ‘1’ : 
 printf(“Inclusão”);
 break;
 case ‘2’ :
 printf(“Consulta”);
 break;
 default : 
 printf(“Fim”);
}
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;
} 
29
Comandos de Repetição – while - do
Comandos em C
while (ch!=’A’){
 c=a+b;
 printf(“%d”,c);
 scanf(“%c”,&ch);
}
while ((a>0) || (b>0)){
 c+=b;
 --a;
 --b;
}
do{
 a++
 printf(“%d”,a);
} while (a<100);
do{
 scanf(“%f”,&a);
 scanf(“%d”,&b);
} while ((a<=0) || (b<=0));
30
Comandos de Repetição - for
Comandos em C
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;
}
31
Estrutura de Dados – Matriz ou Vetor
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)
5
3
4
87
9
notas[4] ou notas[1..4]
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
32
Diagrama de blocos de uma matriz / vetor
SOMA = SOMA + MD[i]
Início
Média
Fim
MD[i]
i = 1, 8, 1
Estrutura de Dados – Matriz ou Vetor
Somará um vetor chamado MD[1..8]
MD[1] = 4.5
MD[2] = 6.5
MD[3] = 8.0
MD[4] = 3.5
MD[5] = 6.0
MD[6] = 7.0
MD[7] = 6.5
MD[8] = 6.0
SOMA = 0
Média =SOMA/8
33
Português estruturado
programa Média
var
 MD : conjunto[1..8] de real
 SOMA, Média : real
 i : inteiro
início
 SOMA = 0
 para i de 1 até 8 passo 1
 leia MD[i]
 SOMA = SOMA + MD[i]
 fim_para
 Média = SOMA/8
 escreva Média
fim
Estrutura de Dados – Matriz ou Vetor
34
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
35
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.
Estrutura de Dados – Matriz ou Vetor
arquivo de cabeçalho para funções de string <string.h>
arquivo de cabeçalho para funções caracter <ctype.h>
36
Algumas Funções de Manipulação de Strings usando a biblioteca <string.h> 
Estrutura de Dados – Matriz ou Vetor
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 strings.
strcat(s1,s2); // s1 irá conter o resultado da junção das 2 strings.
strlen()
fornece o tamanho de uma string.
x=strlen(s1); // x vai conter o número de caracteres ocupados na string .
strchr()
verifica se um caracter pertence a string.
x=strschr(s1,ch); // x !=0 se existir o caracter ou x==0 se não existir.
strstr()
verifica se uma string existe dentro da outra string.
x=strstr(s1,s2); // x !=0 se s2 existir em s1 ou x==0 se não existir.
37
Algumas Funções de Manipulação de caracter usando a biblioteca <ctype.h>
Estrutura de Dados – Matriz ou Vetor
Função
Descrição
Forma Geral
isdigit() 
verifica se o caracter é um número de 0-9.
 
isdigit(a); // !=0 é número; =0 não é número.
isalpha()
verifica se o caracter é uma letra
isalpha(a); // !=0 é letra; =0 não é letra.
isupper()
verifica se um caracter está em maiúscula
isupper(a); // !=0 é maiúscula =0 não é.
ispunct()
verifica se um caracter é pontuação.
ispunct(a); // !=0 é pontuação; =0 não é.
isspace()
verifica se um caracter é espaço.
isspace(a); // !=0 é espaço; =0 não é.
toupper()
transforma um caracter em letra maiúscula.
a=toupper(a); // o conteúdo de a em maiúscula.
tolower()
transforma um caracter em letra minúscula.
a=tolower(a); // o conteúdo de a em minúscula.
38
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
39
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);
}
Estrutura de Dados – Matriz ou Vetor
40
#include <stdio.h>
#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
41
#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();
}
Exemplos – usando Matriz ou Vetor
Matriz multidimensional:
j / i 
0
1
2
3
0
1
2
3
4
1
5
6
7
8
2
9
10
11
12
3
13
14
15
16
Resultado:
Agora efetue a soma da Diagonal principal da Matriz e apresente na tela.
42
Função
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. 
43
Função
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
44
Função
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. 
45
Função Pasagem por Valor e Referência
#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;
}
Observe os resultados.
Por referência
Por Valor
46
Arquivos
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
47
Acesso a disco 
“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”
48
É possível classificar os arquivos conforme a forma como eles são abertos: 
Modo texto 
Modo binário
Um arquivo aberto em modo texto é interpretado em “C” como sendo uma seqüência de caracteres agrupados em linhas que devem ser separadas por um caracter de nova linha, as informações numéricas também são armazenadas em cadeias de caracteres, enquanto que, no modo binário tudo é muito mais simples. 
Não há necessidade de nenhuma conversão de tipos. Para os tipos numéricos na forma binária eles são armazenados como estão na memória, nem mesmo a indicação de final de arquivo é necessária pois acaba sendo interpretada automaticamente. Sendo assim estaremos utilizando leitura e gravação em alto nível com modo de acesso binário 
Acesso a disco 
49
OPERAÇÕES BÁSICAS COM ARQUIVO
Abrir
Fechar
Apagar
Copiar 
Renomear 
50
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.
OPERAÇÕES BÁSICAS COM ARQUIVO
51
OPERAÇÕES BÁSICAS COM ARQUIVO
Programa em “C”
S.O.
Disco
Nome do arquivo e tipo de abertura
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 exitir 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.
52
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);
}
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
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. 
53
OPERAÇÕES BÁSICAS COM ARQUIVO
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 
54
OPERAÇÕES BÁSICAS COM ARQUIVO
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.
55
OPERAÇÕES BÁSICAS COM ARQUIVO
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. 
56
ORGANIZAÇÃO DE ARQUIVOS 
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.” 
57
ORGANIZAÇÃO DE ARQUIVOS
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. 
58
ORGANIZAÇÃO DE ARQUIVOS
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.
59
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
60
COMANDOS E FUNÇÕES PARA MANIPULAÇÃO DE REGISTROS
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);
61
COMANDOS E FUNÇÕES PARA MANIPULAÇÃO DE REGISTROS
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. 
62
Exemplo prático
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
struct veiculo {
 char modelo[20];
 char marca[20];
 float preco;
}reg;
FILE *parq;
void menu();
void abre_arquivo1();
void abre_arquivo2();
void inclusao();
void consulta_s();
void consulta_d();
void alteracao();
void exclusao();
void reorganizar();
void tela1();
void tela2();
char resposta();
void main(){
 abre_arquivo1();
 menu();
 fclose(parq);
}
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);
 }
}
63
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
64
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
65
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
66
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
67
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
68
// 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
69
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
70
// 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
71
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 ... Continuação
72
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);
}
Exemplo prático ... final

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais