A maior rede de estudos do Brasil

Grátis
59 pág.
livro Programacao C - Respostas+dos+exercícios+propostos+C

Pré-visualização | Página 7 de 8

mesma estrutura*/
#include <stdio.h>
#include <string.h>
struct TRegistro
{
char Cpf[12];
char Nome[40];
};
/*Funcao que verifica se um registro com matricula dada pertence ao arquivo*/
int ConsultaRegistro(char s[12], char s1[12])
{
FILE *p;
int Achou = 0;
struct TRegistro r;
fpos_t Byte;
p = fopen(s1, "rb");
fgetpos(p, &Byte);
fread(&r, sizeof(r), 1, p);
while (!feof(p) && !Achou)
if (strcmp(s, r.Cpf) == 0)
Achou = 1;
else
{
fgetpos(p, &Byte);
fread(&r, sizeof(r), 1, p);
}
if (Achou == 0)
return (­1);
else
return(Byte);
}
void CruzaArquivos(char s1[12], char s2[12], char s[12])
{
long Tam;
struct TRegistro r;
FILE *p, *p1, *p2;
Tam = sizeof(r);
p1 = fopen(s1, "rb");
p2 = fopen(s2, "rb");
p = fopen(s, "wb");
fread(&r,Tam, 1, p1);
while (!feof(p1))
{
if (ConsultaRegistro(r.Cpf, s2) != ­1)
fwrite(&r,Tam, 1, p);
fread(&r,Tam, 1, p1);
}
fclose(p1);
fclose(p2);
fclose(p);
}
main()
{ 
char NomeArq1[12], NomeArq2[12];
printf("Digite o nome do arquivo \n");
scanf("%s", NomeArq1);
printf("Digite o nome do segundo arquivo");
scanf("%s", NomeArq2);
CruzaArquivos(NomeArq1, NomeArq2, "RegCom");
}
7. /*Funcao que permuta as posições de dois registros de um arquivo*/
int ConsultaRegistro(char s[12], char s1[12])
{
FILE *p;
int Achou = 0;
struct TRegistro r;
fpos_t Byte;
p = fopen(s1, "rb");
fgetpos(p, &Byte);
fread(&r, sizeof(r), 1, p);
while (!feof(p) && !Achou)
if (strcmp(s, r.Mat) == 0)
Achou = 1;
else
{
fgetpos(p, &Byte);
fread(&r, sizeof(r), 1, p);
}
if (Achou == 0)
return (­1);
else
return(Byte);
}
void TrocaRegistros(char s1[12], char s2[12], char s[12])
{
int Tam;
FILE *p;
struct TRegistro r1, r2;
fpos_t Byte1, Byte2;
p = fopen(s, "rb+");
Tam = sizeof(r1);
Byte1 = ConsultaRegistro(s1, s);
if (Byte1 != ­1)
{
Byte2 = ConsultaRegistro(s2, s);
if (Byte2 != ­1)
{
fsetpos(p, &Byte1);
fread(&r1, Tam, 1, p);
fsetpos(p, &Byte2);
fread(&r2, Tam, 1, p);
fsetpos(p, &Byte1);
fwrite(&r2, Tam, 1, p);
fsetpos(p, &Byte2);
fwrite(&r1, Tam, 1, p);
}
else
printf("Registro nao encontrado");
}
else
printf("Registro nao encontrado");
fclose(p);
}
8. /*Função para ordenar um arquivo*/ 
/*Funcao que copia o ultimo registro no final do arquivo*/
void CopiaUltimoRegistro(char s[12])
{
struct TRegistro r;
FILE *p;
long Byte, Tam;
p = fopen(s, "rb");
Tam = sizeof(r);
fseek(p, ­Tam, SEEK_END);
fgetpos(p, &Byte);
fsetpos(p, &Byte);
fread(&r, Tam, 1, p);
fclose(p);
p = fopen(s, "ab");
fwrite(&r, Tam, 1, p);
fclose(p);
}
/*Funcao que determina a posicao de inclusao de um novo registro*/
long PosicaoDeInclusao(struct TRegistro Reg, char s[12])
{
struct TRegistro r;
long Tam, Byte, Pos;
FILE *p;
p = fopen(s, "rb");
Byte = 0;
Tam = sizeof(r);
fread(&r, Tam, 1, p);
while ((!feof(p)) && (strcmp(Reg.Mat, r.Mat) > 0))
{
Byte = Byte + Tam;
fread(&r, Tam, 1, p);
}
fclose(p);
return (Byte);
}
/*Funcao  que  inclui  um registro  num arquivo  ordenado de modo que ele  se  mantenha 
ordenado*/
void IncluiRegistroOrdenado(struct TRegistro Reg, char s[12])
{
struct TRegistro r;
long Tam, Byte, Pos;
FILE *p;
Tam = sizeof(r);
Byte = PosicaoDeInclusao(Reg, s);
CopiaUltimoRegistro(s);
p = fopen(s, "rb+");
fseek(p, ­3*Tam, SEEK_END);
fgetpos(p, &Pos);
while (Pos >= Byte)
{
fsetpos(p, &Pos);
fread(&r, Tam, 1, p);
fgetpos(p, &Pos);
fsetpos(p, &Pos);
fwrite(&r, Tam, 1, p);
fgetpos(p, &Pos);
Pos = Pos ­ 3*Tam;
}
fsetpos(p, &Byte);
fwrite(&Reg, Tam, 1, p);
fclose(p);
}
void OrdenaArquivo(char s[12])
{
int Tam;
FILE *p, *Aux;
struct TRegistro r;
Tam = sizeof(r);
p = fopen(s, "rb");
Aux = fopen("Temp.tmp", "wb");
fread(&r, Tam, 1, p);
while (!feof(p))
{
IncluiRegistroOrdenado(r, "Temp.tmp");
fread(&r, Tam, 1, p);
}
fclose(p);
fclose(Aux);
remove(s);
rename("Temp.tmp", s);
}
9. /*Função que remove comentarios, linha a linha, de um programa em C*/
void DeletaComentarios(char *s)
{
int Pos1, Pos2;
FILE *p, *Aux;
char Linha[80];
int i, Tamanho;
p = fopen(s, "rt");
Aux = fopen("Temp.tmp", "wt");
Tamanho = TamanhoArquivo(s);
i = 0;
while (i < Tamanho)
{
fgets(Linha, 80, p);
i = i + strlen(Linha);
Pos1 = Pos(Linha, "/*");
if (Pos1 != ­1)
{
Pos2 = Pos(Linha, "*/");
if (Pos2 != ­1)
DeletaCaracteres(Linha, Pos2 ­ Pos1 + 3, Pos1);
}
fwrite(Linha, strlen(Linha), 1, Aux);
}
fclose(p);
fclose(Aux);
remove(s);
rename("Temp.tmp", s);
}
Capítulo 10
1. /*Função que calcula a média aritmética de uma relação de números armazenada num 
lista*/
float Media()
{
float Md = 0;
int i = 0;
Prox = Inicio;
while (Prox != NULL)
{
i = i + 1;
Md = Md + (*Prox).Valor;
Prox = (struct TElemento *) (*Prox).p;
}
return(Md/i);
}
2. /*Função que insere um elemento numa lista ordenada*/
/*Função que determina a posição de inserção de um elemento numa lista ordenada*/
struct TElemento *Posicao(int n)
{
struct TElemento *Aux, *Ant;
int i = 0;
Prox = Inicio;
Ant = Inicio;
while ((Prox != NULL) && ((*Prox).Valor > n))
{
Ant = Prox;
i = i + 1;
Prox =  (*Prox).p;
}
return(Prox);
}
void Insere(int n)
{
struct TElemento *Aux, *Ant;
Aux = Posicao(n);
if (Aux == NULL)
{
Prox = (struct TElemento *)malloc(5);
(*Prox).Valor = n;
(*Ant).p = Prox;
(*Prox).p = NULL;
}
else
if (Ant != Prox)
{
Prox = (struct TElemento *)malloc(5);
(*Prox).Valor = n;
(*Prox).p = (*Ant).p;
(*Ant).p = Prox;
}
else
      {
Prox = (struct TElemento *)malloc(5);
(*Prox).Valor = n;
(*Prox).p = Inicio;
Inicio = Prox;
}
}
	Capítulo 1
	Capítulo 2
	Capítulo 3
	Capítulo 4
	Capítulo 5
	Capítulo 6
	Capítulo 7
	Capítulo 8
	Capítulo 9
	Capítulo 10