CI067 - Oficina de Computação
Exercícios # 05
2º semestre 2014

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.

 
  1. 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.

 
  1. (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.

 
  1. (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 $ \ast\ast$, usando alocação dinâmica de memória.

 

 
  1. 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

  

 
  1. (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.

 
  1. (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.

 
  1. (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.

 

 
  1. (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.

 

 
  1. (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.

 
  1. (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 1º conjunto de matrizes)
    1 2  (1ª matriz - 2x2)
    3 7
    7 8  (2ª matriz - 2x2)
    4 1
    3 2  (dimensão do 2º conjunto de matrizes)
    2 4  (1ª matriz - 3x2)
    9 2
    4 3
    0 2 7  (2ª 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.

 

 
  1. (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 1º conjunto de matrizes)
    1 2  (1ª matriz - 2x2)
    3 7
    7 8  (2ª matriz - 2x2)
    4 1
    3 2  (dimensão do 2º conjunto de matrizes)
    2 4  (1ª matriz - 3x2)
    9 2
    4 3
    0 2 7  (2ª matriz - 2x3)
    12 21 1
    3 2 2  (dimensão do 3º conjunto de matrizes)
    2 4  (1ª matriz - 3x2)
    9 2
    4 3
    5 3  (2ª matriz - 2x2)
    12 2

 

 
  1. (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.

 
  1. (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 2º arquivo no 1º arquivo, a partir da coordenada indicada no 1º par de inteiros, sobrescrevendo o conteúdo a partir desta posição. O bloco do 2º 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 3º arquivo, cujo nome é arbitrário, sendo que uma mensagem final do programa deve indicar este nome.

 



Armando Luiz Nicolini Delgado
2014-09-17