Guião laboratorial n.º 3 – exercício 7

“Considere a seguinte definição:
struct cliente{
char nome[200];
char morada[200];
int conta;
int montante;
};

a) Um banco tem informação armazenada sobre os seus clientes num ficheiro binário contendo estruturas do tipo struct cliente. Desenvolva uma função que escreva no monitor os nomes e os números de conta de todos os clientes que fazem parte do ficheiro. O nome do ficheiro é passado como argumento da função.

b) Desenvolva uma função que escreva no monitor o nome e o número de conta do cliente com o saldo mais elevado. O nome do ficheiro binário onde estão guardados os clientes é passado como argumento da função.

c) Desenvolva uma função que elimine uma estrutura do ficheiro de clientes do banco. A função recebe como argumento o nome do ficheiro e o nome do cliente a eliminar. O ficheiro a processar está ordenado alfabeticamente pelo nome dos clientes.

d) Desenvolva uma função que adicione um novo cliente ao ficheiro de clientes do banco. A função recebe como argumento o nome do ficheiro e a estrutura com a informação sobre o novo cliente (os campos da estrutura já estão preenchidos). O ficheiro original está ordenado alfabeticamente pelo nome dos clientes. A função deve garantir que a estrutura com informação do novo cliente é inserida no ficheiro na posição correta, de modo a que este continue ordenado.

e) Considere que o banco dividiu por dois ficheiros a informação sobre os seus clientes. Em cada um dos dois ficheiros as estruturas estão armazenadas por ordem alfabética do nome do cliente (não existem clientes com nomes iguais). O banco pretende agora reunir as estruturas num só ficheiro. Desenvolva uma função que permita realizar esta tarefa. Os nomes dos dois ficheiros originais e do novo ficheiro são passados como argumentos da função. No novo ficheiro, as estruturas devem continuar por ordem alfabética. Podem existir duplicações da informação de um
cliente (ou seja, o mesmo cliente tem uma estrutura em cada um dos ficheiros). Neste caso só uma delas deve ser passada para o novo ficheiro e o valor do montante deve ser a soma dos dois montantes existentes em cada uma das cópias.

f) Desenvolva uma função que escreva no monitor o número de bytes do ficheiro e o número de clientes que estão armazenados. O nome do ficheiro é passado como argumento da função.

g) Desenvolva uma função que crie um novo ficheiro em que a ordem das estruturas dos clientes apareça invertida (o primeiro passa a ser o último, o segundo o penúltimo e assim sucessivamente). Os nomes dos dois ficheiros são passados como argumento.”

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 100

typedef struct dados cliente;

struct dados{
  char nome[20];
  char morada[200];
  int conta;
  int montante;
};

void inserir(char *f, cliente *b, int *t){
//EXTRA: inserir registos no ficheiro caso nao exista o ficheiro!!
FILE *f1;
f1=fopen(f, "wb");
char r;
int i;
cliente *inicio = b;

if(f1==NULL){
  printf("\nerro ao abrir o ficheiro");
  return;
}

do{
printf("\nDeseja inserir um cliente novo?");
scanf(" %c", &r);
  if(r=='s'){
    printf("\nQual o nome?");
    scanf(" %[^\n]", &(b->nome));
    printf("\nQual a morada?");
    scanf(" %[^\n]", &(b->morada));
    printf("\nQual o numero da conta?");
    scanf(" %d", &(b->conta));
    printf("\nQual o montante?");
    scanf(" %d", &(b->montante));
    (*t)++;
    b++;
  }
}while(r!='n');

for(i=0; i<*t; i++){
  fwrite((inicio+i), sizeof(cliente), 1, f1);
}

fclose(f1);
}

void ler(char *f){
//EXTRA: ler registos no ficheiro !!
FILE *f1;
f1=fopen(f, "rb");
struct dados c;

if(f1==NULL){
  printf("\nerro ao abrir o ficheiro");
  return;
}
while(fread(&c, sizeof(struct dados), 1, f1) == 1){
     printf("\nnome:%s\tmorada:%s\tconta:%d\tmontante:%d", c.nome, c.morada, c.conta, c.montante);

    }
  fclose(f1);
}

void alienaA(char *f, cliente *b, int *t){
FILE *f1;
f1=fopen(f, "rb");
int total=0;

if(f1==NULL){
  printf("\nerro ao abrir o ficheiro");
  return;
}

fread(&total, sizeof(total),MAX*4,f1);
fread(b, sizeof(cliente), total, f1);

*t=total;

fclose(f1);
}

int main()
{
    cliente banco[MAX];
    int total=0;

   // inserir("banco.dat", banco, &total);
   ler("banco.dat");
   // alienaA("banco.dat", banco, &total);
    //printf("\ntotal registos: %d", total);
    return 0;
}

+ajuda: ORDENAÇÃO

Tags : , , , ,