Baixe o app para aproveitar ainda mais
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",¬a1); printf("\t Digite a 2ª nota: "); scanf("%f",¬a2); 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”, ¬as[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",®.preco); fseek(parq,N*sizeof(reg),SEEK_CUR); fwrite(®,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(®,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(); } 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(®,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(®,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(®,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(®,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(®,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(®,sizeof(reg),1,parq) >=1) if (strcmp(reg.modelo,"***") !=0) fwrite(®,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
Compartilhar