Tag: escrita
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