2010 1 tads 2 Laboratório de Programação Estruturada

10

Click here to load reader

Transcript of 2010 1 tads 2 Laboratório de Programação Estruturada

Page 1: 2010 1 tads 2 Laboratório de Programação Estruturada

ATIVIDADES PRÁTICAS

SUPERVISIONADAS

Tecnologia em Análise e Desenvolvimento de Sistemas2ª SérieLaboratório de Programação Estruturada

A atividade prática supervisionada (ATPS) é um método de ensino-

aprendizagem desenvolvido por meio de um conjunto de atividades

programadas e supervisionadas e que tem por objetivos:

Favorecer a aprendizagem.

Estimular a co-responsabilidade do aluno pelo aprendizado eficiente e

eficaz.

Promover o estudo, a convivência e o trabalho em grupo.

Desenvolver os estudos independentes, sistemáticos e o autoaprendizado.

Oferecer diferenciados ambientes de aprendizagem.

Auxiliar no desenvolvimento das competências requeridas pelas Diretrizes

Curriculares Nacionais dos Cursos de Graduação.

Promover a aplicação da teoria e conceitos para a solução de problemas

relativos à profissão.

Direcionar o estudante para a emancipação intelectual.

Para atingir estes objetivos as atividades foram organizadas na forma de

um desafio, que será solucionado por etapas ao longo do semestre letivo.

Participar ativamente deste desafio é essencial para o desenvolvimento das

competências e habilidades requeridas na sua atuação no mercado de trabalho.

Aproveite esta oportunidade de estudar e aprender com desafios da vida

profissional.

AUTOR(ES):Marcelo Augusto Cicogna – FAV

Jeanne Dobgenski – AESAJaqueline Brigladori Pugliesi – FAV/FAC2

Page 2: 2010 1 tads 2 Laboratório de Programação Estruturada

Tecnologia em Análise e Desenvolvimento de Sistemas – 2ª Série – Laboratório de Programação Estruturada

Marcelo Augusto Cicogna, Jeanne Dobgenski, Jaqueline Brigladori Pugliesi2

COMPETÊNCIAS E HABILIDADES

Ao concluir as etapas propostas neste desafio você terá desenvolvido as competênciase habilidades descritas a seguir.

Compreender tecnologias relacionadas à comunicação e processamento de dados einformações.

DESAFIO

Muitos programas de computador do tipo “Console” são utilizados todos os dias. Para aplataforma Linux, esta é uma afirmação quase que incorporada à estrutura do próprioSistema Operacional (SO). No SO Windows, os aplicativos de console, que são simples eminterface, mas que desempenham tarefas muitas vezes sofisticadas, não são tão comuns àexperiência típica de uso do sistema. Por exemplo, pode-se citar desde programas de linha decomando como “ipconfig” que auxilia na visualização das configurações de rede de um PC,até programas como o “taskkill” que auxiliam o usuário a eliminar processos ativos namemória do computador.

O objetivo desta atividade é motivar o aluno a adquirir experiência com o ciclo completo dedesenvolvimento de um pequeno aplicativo de linha de comando (Console). Este cicloutilizará os conceitos apresentados na disciplina de algoritmos; apresentará um exemplo deorganização e de documentação de código fonte; exigirá uma organização funcional docódigo baseado em estruturas modulares; por fim, o aluno implementará um software delinha de comando com opções de parâmetros na chamada do programa.

Esta tarefa deverá ser implementada utilizando-se a Linguagem C. Sugere-se comocompilador e interface de desenvolvimento o Code::Blocks (disponível no seguinte endereço:<www.codeblocks.org>).

O ProblemaEsta atividade concentra esforços no desenvolvimento de um programa que permita contarlinhas de código fonte desenvolvido em Linguagem C ou C++. A estrutura sugeridapermitirá a sua adequação para outras linguagens. Escolheu-se este tema por se tratar de umproblema de simples entendimento, deixando espaço para que o aluno concentre odesenvolvimento de suas habilidades no entendimento e prática do ciclo de criação eimplementação do aplicativo.

A contagem de linhas de um arquivo texto pode ser facilmente desenvolvida em poucaslinhas de código, conforme apresentado no exemplo da Listagem 1.

Page 3: 2010 1 tads 2 Laboratório de Programação Estruturada

Tecnologia em Análise e Desenvolvimento de Sistemas – 2ª Série – Laboratório de Programação Estruturada

Marcelo Augusto Cicogna, Jeanne Dobgenski, Jaqueline Brigladori Pugliesi3

Listagem 1. Exemplo de programa em Linguagem C para contagem de linhas de um arquivo.

#include <stdio.h>

int main (){ FILE * pFile;int c;int n = 0;

pFile = fopen ("ArquivoTexto.txt", "r");if (pFile !=NULL)

{do { //DO

c = fgetc(pFile);if (c == '\n') n++;

} //DOwhile (c != EOF);

fclose(pFile); printf("Número de linhas = %d.\n", n); }return 0;

}

O DesafioPartido do exemplo anterior de contagem simples de linhas de um arquivo texto, o desafiodesta tarefa tem início ao se querer determinar o número de linhas do código que sãocomentários formatados segundo a sintaxe da Linguagem C/C++. A sintaxe prevê dois tiposde comentários: linha única começando com os caracteres “//” (barra, barra); e comentáriosmulti-linhas começando com “/*” (barra, asterisco) e com término determinado por “*/”(asterisco, barra).

Para uma visão de um problema real, considere o exemplo de código fonte escrito em Capresentado na Listagem 2. Observe os vários trechos com comentários para ajudar adocumentação do código-fonte.

Listagem 2. Exemplo real de código fonte com vários comentários.//------------------------------------------------------------------------------// Exemplo de Cabeçalho//// Neste tipo de comentário, faz-se uma breve apresentação do conteúdo do// módulo em linguagem C. O código apresentado a seguir é um extrato de// desenvolvimento criado para a disciplina de Classificação e Pesquisa.// Pede-se ao leitor identificar os tipos de linhas com comentários, em// especial a diferenciação de comentários de uma ou de várias linhas.//// Autor: Marcelo Augusto Cicogna.// Revisões:// 22/11/2005: Criação do módulo.// 01/11/2006: Expansão do módulo em função da lista de exercícios.//------------------------------------------------------------------------------#include "TBinTree.h"

#include <stdio.h>//------------------------------------------------------------------------------// Funcões de manipulação do tipo TBinTree.//------------------------------------------------------------------------------TBinTree*binTreeCreate(TData* pData)/** Função para criação de uma nova árvore binária. É necessário fornecer um valor para o primeiro nó. @param pData variável do tipo TData para compor o nó raíz (root).

Page 4: 2010 1 tads 2 Laboratório de Programação Estruturada

Tecnologia em Análise e Desenvolvimento de Sistemas – 2ª Série – Laboratório de Programação Estruturada

Marcelo Augusto Cicogna, Jeanne Dobgenski, Jaqueline Brigladori Pugliesi4

@return ponteiro para uma árvore binária. @see BinTree.#dataCopy dataCopy() @version 1.01 @author Marcelo Augusto Cicogna*/{ TBinTree* binTree = malloc(sizeof(TBinTree));

if (binTree != NULL) { //Alocação do node raíz. TNodeBin* pNode = nodeCreate();

//Copia no novo nó o valor data passado como parâmetro. dataCopy(pNode->pData, pData);

//Associa o novo nó ao root da árvore binária. binTree->root = pNode; }

return (binTree);}//------------------------------------------------------------------------------voidbinTreeInsertNode(TNodeBin* pNode, TData* pData)/** Função para inserção de um novo nó em uma árvore binária. Função recursiva por meio do parâmetro pNode. @param pNode ponteiro para um nó da árvore binária. @param pData ponteiro para uma variável do tipo TData a ser inserida. @return Não há retorno @see BinTree.#dataCopy dataCopy() @version 1.01 @author Marcelo Augusto Cicogna*/{ TNodeBin* pNodeAux;

if (pNode != NULL) { //Se for para inserir do lado esquerdo.

if ( dataComp(pData, pNode->pData, 0) < 0 ) { //Inserir se o arco esquerdo for nulo.

if (pNode->esq == NULL) { pNodeAux = nodeCreate(); //Este é um exemplo de comentário dataCopy(pNodeAux->pData, pData); //que ocorre junto com código. pNode->esq = pNodeAux; //Será necessário um tratamento. }

//Caso contrário, tentar inserir na sub-árvore a esquerda (recursivo).else

binTreeInsertNode(pNode->esq, pData); }

//Se for para inserir do lado direito.else

{ //Inserir se o arco direito for nulo.if (pNode->dir == NULL)

{ pNodeAux = nodeCreate(); dataCopy(pNodeAux->pData, pData); pNode->dir = pNodeAux; }

//Caso contrário, tentar inserir na sub-árvore a direita (recursivo).else

binTreeInsertNode(pNode->dir, pData); } }}//------------------------------------------------------------------------------

Como resultado a ser conquistado, espera-se poder utilizar um aplicativo auxiliar para contaras linhas do arquivo “Exemplo.c” (ou de outro que o aluno achar conveniente durante a fasede testes). Veja um exemplo do provável funcionamento de tal programa.

Page 5: 2010 1 tads 2 Laboratório de Programação Estruturada

Tecnologia em Análise e Desenvolvimento de Sistemas – 2ª Série – Laboratório de Programação Estruturada

Marcelo Augusto Cicogna, Jeanne Dobgenski, Jaqueline Brigladori Pugliesi5

Figura 1. Exemplo de uso e funcionamento do contador de linhas de código fonte.

Note-se que o programa “CodeCount” possui um parâmetro “–c” ou “-comment” quepermite ao usuário decidir a contagem, ou não, das linhas com comentários. Vale lembrarque no arquivo Exemplo.c, existe uma linha vazia entre os dois “#include”. Além disso, aslinhas que terminam um comentário multi-linhas com “*/” não são contadas como linhas embranco, mas também não são contadas como linhas de comentário.

Permite-se aos alunos e professores encontrarem outras regras de contagem. Esta atividadeadotou algumas regras, mas elas não precisam ser as únicas durante a fase dedesenvolvimento.

EquipeAs etapas descritas à seguir devem ser realizadas em grupos de até quatro alunos.

ETAPA 1

Aula tema: Modularização: uso de funções. Passagem de parâmetros: por valor.Exercícios. Modularização: uso de funções. Passagem de parâmetros: por referência.Exercícios.

Esta atividade é importante para que você compreenda os requisitos do problema edetermine uma organização inicial do código fonte que permita o desenvolvimento de uma solução.

Para realizá-la é importante seguir os passos descritos.

PASSO 1

Leia atentamente o desafio e os conceitos de contagem de linhas. Identifique os doistipos principais de comentários possíveis em linguagem C: comentário de uma linha apenas,que começa com “//”; e comentários multi-linhas determinado por “/*” e “*/”.

PASSO 2

Analise o problema e faça sugestões de como organizar o código em uma funçãoprincipal (main) e uma outra função que fará a contagem das linhas dado como parâmetro onome do arquivo a ser pesquisado. Pode-se chamar esta função de ccRun.

Page 6: 2010 1 tads 2 Laboratório de Programação Estruturada

Tecnologia em Análise e Desenvolvimento de Sistemas – 2ª Série – Laboratório de Programação Estruturada

Marcelo Augusto Cicogna, Jeanne Dobgenski, Jaqueline Brigladori Pugliesi6

Observação: ao utilizar o prefixo “cc” (de Code Count), ou qualquer outro que o alunoachar conveniente, facilita-se a integração do código desenvolvido nesta tarefa com outrasque o programador venha a achar necessário no futuro.

Como guia para alunos e professores, os autores deste desafio determinaram doismódulos para a solução do problema.

O módulo principal foi denominado MainCodeCount e um módulo auxiliar comfunções de auxílio ao principal chamado LibCodeCount. Ao mesmo tempo, foram projetadasduas funções, conforme a orientação anterior. Os cabeçalhos e os nomes dos arquivos osquais conterão o código fonte são apresentados na Figura 2.

Arquivo MainCodeCount.cint main(int argc, char *argv[]){...}

Arquivo LibCodeCount.hvoid ccRun(char* file, int* nLines, int* nLinesComment, int* nLinesEmpty,

int noComment, int silent);

Arquivo LibCodeCount.cvoidccRun(char* file, int* nLines, int* nLinesComment, int* nLinesEmpty,

int noComment, int silent);{...}

Figura 2. Exemplo de uso e funcionamento do contador de linhas de código fonte.

Estude a modularização proposta. É importante que seu código siga a organizaçãosugerida nesta atividade, ou seja, que possua pelo menos dois módulos: um principal e outroauxiliar. Não será aceito na avaliação desta etapa a apresentação de apenas um arquivo decódigo fonte (arquivo.c).

PASSO 3

O grupo deverá entregar o código fonte formado por dois módulos que contenham afunção principal e uma função auxiliar para o cálculo do número de linhas, considerando asopções fornecidas nesta etapa.

ETAPA 2

Aula tema: Ponteiros e sua aplicação. Arquivos. Uso avançado de vetores e matrizes.Exercícios.

Esta atividade é importante para que você entenda a passagem de parâmetros para umprograma escrito em linguagem C.

Para realizá-la é importante seguir os passos descritos.

Page 7: 2010 1 tads 2 Laboratório de Programação Estruturada

Tecnologia em Análise e Desenvolvimento de Sistemas – 2ª Série – Laboratório de Programação Estruturada

Marcelo Augusto Cicogna, Jeanne Dobgenski, Jaqueline Brigladori Pugliesi7

PASSO 1

Pesquise a utilização dos argumentos “argc” e “argv” passados como parâmetros dafunção principal “main()” de um programa escrito em linguagem C.

PASSO 2

Elabore uma função principal que aceite os seguintes parâmetros:Parâmetro obrigatório.“Nome do arquivo”. O primeiro parâmetro será o nome de um arquivo a serpesquisado o número de linhas.

Parâmetros opcionais.-h (-help) opção para apresentar uma explicação do uso do programa CodeCount.-c (-comment) opção para contar o número de linhas de comentários.-s (-silent) opção para não apresentar resultados na tela de comando (prompt).

Para auxílio dos alunos, apresenta-se um exemplo na Listagem 3 de como criar oparâmetro “–s”. Neste exemplo será possível notar o uso dos argumentos “argc” e “argv”.Vale lembrar que a posição zero do vetor “argv” possui sempre o nome do programa, nestecaso “CodeCount”.

Como se trata de criar uma forma de implementar os parâmetros opcionais, o loop peloarquivo “argv” começa na posição 2, uma vez que a posição 1 foi reservada para conter onome do arquivo a ser pesquisado. Assim, a chamada do programa (o símbolo “>”representa a linha de comando, ou prompt do sistema operacional):

> CodeCount Exemplo.c –c

Teria os seguintes argumentos passados para a função principal:argc = 3argv[0] = “CodeCount”argv[1] = “Exemplo.c”argv[2] = “-c”

Listagem 3. Exemplo de função principal com gerenciamento de parâmetros.

intmain(int argc, char *argv[]){

int i, silent;int nLines, nLinesComment, nLinesEmpty, count;

silent = 0; nLines = 0;

for (i=2; i<argc; i++) { silent = silent || (strstr(argv[i], "-silent" ) != NULL); silent = silent || (strstr(argv[i], "-s" ) != NULL); } printf("Code Count - Programmer's Tool\n"); printf(" Version 1.1 - 2009\n\n");

if (!silent) { printf(" counting for \"%s\"...\n", argv[1]); }

Page 8: 2010 1 tads 2 Laboratório de Programação Estruturada

Tecnologia em Análise e Desenvolvimento de Sistemas – 2ª Série – Laboratório de Programação Estruturada

Marcelo Augusto Cicogna, Jeanne Dobgenski, Jaqueline Brigladori Pugliesi8

ccRun(argv[1], &nLines, &nLinesComment, &nLinesEmpty, noCom, silent);

Note que o exemplo testa se o usuário passou a versão curta do parâmetro “-s” ou aversão normal “-silent”.

PASSO 3

O grupo deverá entregar o código fonte, em complemento ao que foi entregue naetapa anterior, que apresente uma função principal capaz de processar os parâmetros eopções estabelecidos nesta etapa.

ETAPA 3

Aula tema: Ponteiros e sua aplicação. Uso avançado das estruturas. Exercícios.Arquivos. Uso avançado de vetores e matrizes.

Esta atividade é importante para que você determine a versão final do programa capaz decontar linhas e comentários, bem como utilizar a passagem de parâmetros projetada na etapa anterior.

Para realizá-la é importante seguir os passos descritos.

PASSO 1

Nesta etapa, será necessário entender o conteúdo de um arquivo texto e elaborar umaestratégia para a contagem de linhas, principalmente focando o problema de contagem delinhas com comentários.

Por exemplo, a leitura de um arquivo texto pode ser interpretada como o percurso porum vetor de caracteres. Como ilustração desta idéia, veja o arquivo abaixo:

ArquivoSegunda linhafim

A leitura deste arquivo no disco pode ter uma representação da seguinte forma:

A r q u i v o \n S e g u n d a l i n h a \n f i m EOF

Note que as linhas têm o caractere especial ‘\n’ para delimitar o seu fim, bem como ofinal do arquivo é encontrado quando se processa a informação EOF (End Of File).

A idéia para a contagem de linhas, conforme visto na Etapa 1, baseia-se na contagemdos caracteres ‘\n’ de um arquivo texto.

Ao mesmo tempo, a contagem de linhas com comentários pode fazer uso da mesmaestratégia.

Por exemplo, o uso de variáveis auxiliares, pode-se determinar a ocorrência doscaracteres “\\”, indicando que esta linha é um comentário e que, portanto, ao encontrar umcaractere ‘\n’ esta linha deva ser contada como comentário.

Page 9: 2010 1 tads 2 Laboratório de Programação Estruturada

Tecnologia em Análise e Desenvolvimento de Sistemas – 2ª Série – Laboratório de Programação Estruturada

Marcelo Augusto Cicogna, Jeanne Dobgenski, Jaqueline Brigladori Pugliesi9

O mesmo vale para comentários multi-linhas. Ao se identificar os caracteres “/*”todos os caracteres ‘\n’ encontrados antes da ocorrência de “*/” deverão ser contabilizadoscomo linhas de comentário.

PASSO 2

Desenvolva um algoritmo que baseado na leitura caractere a caractere de um arquivotexto, contabilize o número de linhas total, o número de linhas de comentário simples e onúmero de linhas de comentário multi-linhas.

Por exemplo, considere o arquivo:

// Este é um comentário de uma linha só.for (i = 0; i < 10; i++){ /* Este é um comentário de duas linhas. O término é ocorre na próxima linha. */ printf(“Valor de i %d”, i); //Um comentário aqui não deve ser computado.}

Este arquivo possui 8 linhas. Uma linha é do tipo comentário simples, iniciado com“//”. Duas linhas possuem comentário multi-linhas. Neste caso, não foi contabilizada a linhacom o “*/”, mas os alunos podem encontrar outra regra. É importante notar que ocomentário apresentado após o comando “printf” não deve ser contabilizado, uma vez que amesma linha possui código.

PASSO 3

O grupo deverá entregar o código fonte, em complemento ao que foi entregue naetapa anterior, que apresente uma função principal capaz de contabilizar o número de linhastotal de um arquivo de código fonte em linguagem C. Em complemento, o programa devetambém contabilizar o número de linhas com comentários simples, multi-linhas e o númerode linhas “em branco” (sem comentários e/ou instruções de código).

ETAPA 4

Aula tema: Arquivos. Uso avançado de vetores e matrizes.

Esta atividade é importante para que você valide o programa desenvolvido.Para realizá-la é importante seguir os passos descritos.

PASSO 1

Crie três tipos de arquivos de código fonte escritos em Linguagem C. Por exemplo,crie um arquivo com poucos comentários, fáceis de serem identificados. Os outros doisarquivos podem possuir um numero maior de combinações e linhas de comentários. Veja,por exemplo, o código apresentado na Listagem 2.

Page 10: 2010 1 tads 2 Laboratório de Programação Estruturada

Tecnologia em Análise e Desenvolvimento de Sistemas – 2ª Série – Laboratório de Programação Estruturada

Marcelo Augusto Cicogna, Jeanne Dobgenski, Jaqueline Brigladori Pugliesi10

Demonstre o uso do programa desenvolvido, bem como os resultados obtidos. Tenhacomo objetivo apresentar ao usuário um documento simples que demonstre que seuprograma funciona bem e que determina os resultados esperados.

PASSO 2

O grupo deverá entregar um relatório simples que apresente o funcionamento doprograma e que demonstre os resultados apontados neste desafio. É importante que osalunos explorem vários tipos de arquivos de código fonte, validando a contagem decomentários inseridos no código fonte destes arquivos.