CI067 – Oficina de Computação
Exercícios # 05
1o semestre 2011
Alocação de memória. Arquivos.


PARTE I - Atividades em Laboratório

  

1.

Tome familiaridade com as funções da linguagem C para alocação de memória. Para isto execute comado UNIX man  malloc. Leia atentamente o texto para ter uma noção clara das funções existentes e como usá-las em um programa.

2.

Analise e explique o que cada programa abaixo deve fazer. Depois disto, compile e execute cada um deles. Sua análise está de acordo com o comportamento observado? Troque idéias com os colegas ao seu lado e com o professor.

3.

(lerdados)  Faça um programa que obtenha do usuário 3 conjuntos de dados: um conjunto de inteiros, um conjunto de valores reais e uma frase. A quantidade de elementos a ser obtida em cada conjunto deve ser previamente fornecida pelo usuário. Antes de terminar, o programa deve apresentar na tela o que foi fornecido pelo usuário.

4.

(matsoma)  O programa mat_soma.c calcula a soma de duas matrizes 5x5 de números reais (double). Mude a implementação deste programa de forma que a dimensão da matriz seja fornecida pelo usuário na linha de comando e que a matriz seja representada no programa através de variáveis do tipo double ∗∗, usando alocação dinâmica de memória.

  

5.

Analise e explique o que cada programa abaixo deve fazer. Depois disto, compile e execute cada um deles. Sua análise está de acordo com o comportamento observado? Troque idéias com os colegas ao seu lado e com o professor.

Parte II - Exercícios

  

6.

(concat)  Implemente uma função concat() que concatena 2 (dois) strings recebidos como argumentos. A função deve retornar um ponteiro para o string resultante da concatenação. O espaço para o resultado deve ser alocado dinamicamente pela função. Use ponteiros o máximo possível.

7.

(contapalavras)  Dado um conjunto de strings e uma palavra, determinar o número de vezes que a palavra ocorre em cada string. Se for indicada a palavra FIM, o programa deve terminar. Use apontadores e alocação dinâmica de memória em sua solução.

8.

(gravatexto)  Faça um programa que obtenha frases do usuário e as grave em um arquivo. Cada frase pode ter qualquer tamanho e a gravação em arquivo deve ocorrer APENAS depois que o usuário fornecer uma frase vazia.

  

9.

(prntexto)  Faça um programa que copie para a memória as frases lidas do arquivo produzido no exercício 8 e as exiba convenientemente na tela.

  

10.

(ordfrases)  Faça um programa que receba um conjunto de frases do usuário. Após a entrada de todas as frases, o programa deve ordená-las lexicograficamente (em ordem crescente) e apresentar o resultado na tela.
O programa também deve tratar a opção   -r   quando passada como argumento do programa. Com esta opção, o programa deve fazer a ordenação reversa. Use ponteiros e alocação dinâmica de memória.

11.

(mult_matrizes)  Faça um programa que leia pares de matrizes de um arquivo e calcule o produto entre elas. O resultado deve ser gravado em outro arquivo. O nome do arquivo de entrada de dados pode opcionalmente ser fornecido pela linha de comando. Caso não seja fornecido, o nome default deste arquivo é matriz.dat. O nome do arquivo de saída deve ser formado pela string res- seguida do nome do arquivo de entrada (por exemplo, res-matriz.dat).
O arquivo de entrada (tipo ASCII) consiste de uma linha contendo a dimensão das matrizes a serem multiplicadas, seguida das duas matrizes. Exemplo:
2 2  (dimensão do 1o conjunto de matrizes)
1 2  (1a matriz - 2x2)
3 7
7 8  (2a matriz - 2x2)
4 1
3 2  (dimensão do 2o conjunto de matrizes)
2 4  (1a matriz - 3x2)
9 2
4 3
0 2 7  (2a matriz - 2x3)
12 21 1
O arquivo de saída (também do tipo ASCII) deve conter a linha com a ordem da matriz, seguida do resultado da multiplicação. O programa deve validar a entrada de dados antes de proceder aos cálculos. Use ponteiros e alocação dinâmica de memória onde for necessário e eficiente.

  

12.

(mult_matrizes_02)  Refaça o Exercício 11 de forma que os arquivos de entrada e saída sejam binários, isto é, o que está gravado são as representações dos valores em memória usadas pela linguagem C. Caso o arquivo de entrada seja do tipo ASCII, a opção   -f   deve ser fornecida na linha de comando. Os conjuntos de matrizes (ordem e as duas matrizes) devem ser todos lidos em memória antes de proceder aos cálculos. Da mesma forma, a gravação dos resultados deve ser feita somente após terem sido concluídos todos os cálculos. Quando o arquivo de entrada for do tipo ASCII, deve ser gerado o arquivo de entrada do tipo binário correspondente. O formato do arquivo de entrada tipo ASCII tambem muda, conforme abaixo:
2 2  (dimensão do 1o conjunto de matrizes)
1 2  (1a matriz - 2x2)
3 7
7 8  (2a matriz - 2x2)
4 1
3 2  (dimensão do 2o conjunto de matrizes)
2 4  (1a matriz - 3x2)
9 2
4 3
0 2 7  (2a matriz - 2x3)
12 21 1
3 2 2  (dimensão do 3o conjunto de matrizes)
2 4  (1a matriz - 3x2)
9 2
4 3
5 3  (2a matriz - 2x2)
12 2

  

13.

(agenda)  Integre as soluções dos programas grava_agenda e ler_agenda da lista #4 (exercícios 8 e 9) em um único programa, de forma que ao usuário seja possível inserir ítens na agenda, consultar endereços dado um NOME e salvar os dados em qualquer momento. O programa só termina se for digitada a letra Q para sair do programa. Além disso, não deve mais existir quaisquer limites na quantidade de ítens na agenda.

14.

(mescla)   Um programa recebe pela linha de comando nome de 2 arquivos de texto, e 3 pares de inteiros representando coordenadas (linha,caracter) em um arquivo de texto (ASCII). Exemplo:
mescla texto-01 texto-02 19 21 3 12 8 46
O programa deve copiar um bloco de texto do 2o arquivo no 1o arquivo, a partir da coordenada indicada no 1o par de inteiros, sobrescrevendo o conteúdo a partir desta posição. O bloco do 2o arquivo é definido pelos dois pares de coordenadas restantes. Após copiar o bloco, espaços em branco devem ser preenchidos ao redor. Finalmente, o resultado deve ser salvo em um 3o arquivo, cujo nome é arbitrário, sendo que uma mensagem final do programa deve indicar este nome.