Ficheiros binários 1 Ficheiros binários 1. Considere que dispõe de ficheiros binários cujo conteúdo é constituído por uma ou mais estruturas como a indicada a seguir struct registo { int ref; float var; int tm; }; A informação constante dos ficheiros representa medições de uma dada experiência de laboratório. O campo ref representa o número de referência da medição e var e tm os valores medidos em duas variáveis da experiência. Pretende-se fazer um programa que: a) aceite um parâmetro na linha de comando que representa o nome do ficheiro de entrada com o formato descrito; b) determine a média dos valores de cada uma das variáveis da experiência; c) determine a medição com o melhor (menor) coeficiente de aproximação, sendo este dado pela expressão: 1 var −mvar tm−mtm mvar mtm ∣ ∣∣ ∣ em que mvar e mtm representam as médias calculadas anteriormente e que se assume serem diferentes de zero; d) imprima as médias calculadas e os dados da medição com o melhor coeficiente de aproximação. 2. Implementar: a) Uma função que permita copiar um ficheiro para um outro. b) Uma função que anexe um ficheiro ao final de outro. 3. Suponha que as linhas de um ficheiro contêm a designação de uma tarefa realizada durante um mês, seguida de quantos trabalhadores estiveram envolvidos nessa tarefa em cada um dos dias úteis do mês. Um valor negativo significa que a tarefa foi terminada. Exemplo: Polimento 0 1 2 2 1 3 2 -1 significa que a tarefa Polimento envolveu 0 trabalhadores no 1º dia útil do mês, 1 no 2ª dia útil, etc., e terminou no 8º dia útil. Escrever e testar um programa que leia o ficheiro e calcule: qual o dia em que se trabalharam mais tarefas; qual o dia em que se terminaram mais tarefas; qual a tarefa que ocupou mais trabalhadores. Programação e Algoritmos / Programação II Ficheiros binários 2 4. Uma revista musical organiza, semanalmente, uma pesquisa de opinião sobre a popularidade de discos. Os resultados da pesquisa são guardados num ficheiro “discos.dat”, com a seguinte informação por linha: nome do disco, nome do autor, discos vendidos. Escrever um programa que leia esta informação para um vetor de registos e escreva os discos que têm vendas superiores a um certo valor. 5. Uma empresa possui representantes em várias cidades e pretende implantar a sua sede numa delas, de acordo com o critério: o custo anual das deslocações dos representantes das várias cidades à cidade sede deverá ser o menor possível. a) Escrever um programa que crie um ficheiro contendo a seguinte informação: nome da cidade; coordenadas da cidade (x, y); número de deslocações por ano dos representantes da cidade. b) Completar o programa por forma a ler o ficheiro e determinar a cidade a ser escolhida como sede. 6. Implementar um programa que: a) Se se chamar ordem devolve a maior palavra (usando a ordem alfabética “rato” é maior que “elefante”) dos argumentos fornecidos. Tome esta opção como sendo a opção por omissão; b) Se se chamar conta devolve o número de argumentos com que foi invocado; c) Se se chamar lista manda para a saída standard os seus argumentos. 7. Escreva um programa que permita construir uma lista de todas as palavras contidas num ficheiro, assim como o número de ocorrências de cada uma delas. 8. Escreva um programa que solicite um valor inteiro ao utilizador e apresente os múltiplos desse valor que estiverem presentes no ficheiro “dados1.dat”. 9. Implementar um programa que simule o funcionamento do comando wc do sistema Unix com a restrição que as opções aceites são -l, -w e -c para respetivamente “linhas”, “palavras” e “caracteres”. Assume-se que a entrada é a entrada standard se nenhum ficheiro for indicado na linha de comando. 10. Considere um programa de gestão de stocks em que cada componente do stock é identificado pelo nome, número de ordem e preço. a) Defina um tipo de registo, tstock, adequado à representação de um componente do stock e implemente uma rotina que leia um elemento deste tipo (passado por parâmetro). b) Implemente um procedimento que escreva componentes do stock num ficheiro “stock.dat” até o utilizador especificar um número de ordem igual a zero. 11. Considere o ficheiro binário dados2.dat (uma sua cópia pode ser encontrada na página Web da disciplina). Os dados guardados neste ficheiro sãao estruturas do seguinte tipo: Programação e Algoritmos / Programação II Ficheiros binários 3 struct { int BI; char nome[100]; float peso, altura; }; Utilizando funções implemente um programa que: a) Liste o conteúdo do ficheiro. b) Solicite ao utilizador uma letra e copie todos os registos cujo campo nome comece por essa letra para o ficheiro $_inicial.dat (onde $ representa a letra escolhida pelo utilizador). c) Apresente o campo nome para o registo com o valor de peso mais elevado. d) Acrescente um novo registo (campos introduzidos pelo utilizador) ao ficheiro dados2.dat. 12. Altere o programa anterior de forma a que o programa permaneça em ciclo e, através dum menu, o utilizador possa escolher qual a tarefa a realizar. 13. Implementar um programa que use uma estrutura que permita guardar o nome, a morada e o número de telefone duma pessoa. Deve permitir, através de um menu, ler dados para uma estrutura desse tipo que sejam automaticamente guardados num ficheiro. O programa deve permitir mostrar o conteúdo do ficheiro da seguinte forma: ********** Registo 1 Nome : Morada : Telefone : ********** Registo 2 Nome : Morada : Telefone : ... Assim, o menu deve ter as seguintes opções: inserir dados, mostrar dados, terminar. O menu, a inserção de dados e a exibição dos dados devem ser implementados usando funções. 14. Altere o programa anterior de forma a que seja possível: a) Alterar dados dum registo, indicando o número do registo a alterar; b) Apagar um registo, indicando o número do registo a apagar (tem de acrescentar um campo à estrutura original que lhe indique se o registo é válido ou foi apagado); Programação e Algoritmos / Programação II Ficheiros binários 4 c) Ver apenas um registo do ficheiro, indicando o seu número. Implemente estas funcionalidades sob a forma de funções. Devem estar disponíveis através do menu do programa. 15. Para se representar as medições de uma dada experiência de laboratório, usa-se a estrutura “registo” definida da seguinte forma: struct registo { int ref; double var; int tm; }; em que o campo ref representa o número de referência da medição e, var e tm os valores medidos em duas variáveis da experiência. Considere que dispõe de ficheiros binários cujo conteúdo é constituído por uma ou mais estruturas “registo”. A informação existente nos ficheiros representa medições de uma dada experiência de laboratório. Implementar um programa que: ➔ aceite um parâmetro na linha de comando que representa o nome do ficheiro de entrada com o formato descrito; ➔ determine a média dos valores de cada uma das variáveis da experiência; ➔ determine a medição com o melhor (menor) coeficiente de aproximação, sendo este dado pela expressão: var −mvar tm−mtm , mvar mtm ∣ 1 ∣∣ ∣ em que mvar e mtm representam as médias calculadas anteriormente e que se assume serem diferentes de zero; ➔ imprima as médias calculadas e os dados da medição com o melhor coeficiente de aproximação. 16. Considere que o ficheiro “estrut.dat” possui informação representada por uma ou mais estruturas do tipo “registo” (exercício 13.). Implementar um programa que: ➔ aceite um parâmetro na linha de comando que represente o nome de um ficheiro de entrada com o formato acima descrito; ➔ imprima no ecrã os registos constantes nesse ficheiro, em modo textual, na forma de uma tabela e de acordo com o formato apresentado no ficheiro fbin.txt. 17. Considere que o ficheiro “estrut.dat” possui informação representada por uma ou mais estruturas do tipo “registo” (exercício 13.). Implementar um programa que: ➔ dois ou mais parâmetros na linha de comando, sendo que o primeiro representa o nome do ficheiro de entrada, com o formato acima descrito, e o segundo e restantes números de ordem de registos (o primeiro registo tem o número de ordem 1); ➔ imprima no ecrã os registos pretendidos. Programação e Algoritmos / Programação II Ficheiros binários 5 Nota: o programa não deve ler a totalidade dos registos, mas limitar-se a ler os registos pretendidos. Para isso use a função fseek. 18. Considere que o ficheiro “estrut.dat” possui informação representada por uma ou mais estruturas do tipo “registo” (exercício 13.). Implementar um programa que: ➔ aceite dois parâmetros na linha de comando, representando o primeiro o nome de um ficheiro de entrada com o formato acima descrito e o segundo o nome de um ficheiro de saída; ➔ realize as tarefas especificadas no ficheiro “filt.txt”, que são as seguintes: a) determinar a média dos valores da variável var b) selecionar os registos constantes no ficheiro de entrada que satisfaçam a condição de estarem na vizinhança de 1% da média e i) imprimi-los no ecrã; ii) escrevê-los no ficheiro de saída, em modo binário e num formato igual ao do ficheiro de entrada. 19. Escreva um programa que lê a seguinte informação sobre alunos de Programação e Algoritmos: nome, código, classificação à disciplina e idade. A informação relativa a cada aluno é guardada numa estrutura apropriada e a informação de todos os alunos é mantida num vetor de estruturas. No início do programa a informação existente sobre alunos é lida de um ficheiro binário para o vetor de estruturas (caso o ficheiro não exista, o programa deve criar o ficheiro vazio, ficando o vetor por preencher) e o ficheiro é atualizado quando o programa termina. Deve disponibilizar as operações de inserir novos alunos, listar os alunos existentes, remover alunos e alterar informação sobre os alunos existentes. Programação e Algoritmos / Programação II