CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo X Metodologia Top-down com Subprogramação Capítulo X – Metodologia Topdown com Subprogramação 10.1 – Considerações iniciais 10.2 – Contagem da ocorrência de palavras em um texto 10.1 – Considerações Iniciais Recordando: a idéia básica da metodologia top-down é a decomposição de uma tarefa num conjunto de tarefas menores interligadas Aquelas que ainda apresentarem certo grau de complexidade também podem ser decompostas da mesma maneira Prossegue-se assim, até que se obtenha um conjunto de tarefas triviais interligadas Nessa idéia, cada tarefa suficientemente complexa pode ser realizada por um subprograma específico O comandos desse subprograma se constituem na decomposição da mesma em tarefas menores interligadas O tópico a seguir ilustra a utilização dessa metodologia auxiliada por subprogramação no desenvolvimento de um programa para: Contagem da ocorrência de palavras em um texto Capítulo X – Metodologia Topdown com Subprogramação 10.1 – Considerações iniciais 10.2 – Contagem da ocorrência de palavras em um texto 10.2 – Contagem da Ocorrência de Palavras em um Texto Desenvolvimento de um programa para: Ler o texto de um arquivo Contar o número de ocorrências de cada palavra desse texto Gerar uma tabela com essas palavras em ordem alfabética ao lado de seus respectivos números de ocorrências Exemplo: seja o seguinte texto no arquivo ctpalavras.dat voce pode enganar algumas pessoas em todo o tempo e todas as pessoas em algum tempo mas nao pode enganar todas as pessoas em todo o tempo Montar a seguinte tabela: 1ª Etapa: ContarPalavras { Abrir o arquivo ctpalavr.dat para leitura; Inicializar com zero palavras a tabela a ser montada; Ler a 1ª palavra do arquivo; Enquanto não se chegar ao final do arquivo { Procurar a palavra lida na tabela e sua posição; Se ela já estiver na tabela Acrescentar ‘1’ ao seu número de ocorrências; Senão Inserir a palavra na posição em que deveria estar; Ler a próxima palavra do arquivo; } Mostrar a tabela no vídeo; } 2ª Etapa: ContarPalavras { Abrir o arquivo ctpalavr.dat para leitura; Inicializar com zero palavras a tabela a ser montada; Ler a 1ª palavra do arquivo; Enquanto não se chegar ao final do arquivo { Procurar a palavra lida na tabela e sua posição; Se ela já estiver na tabela Acrescentar ‘1’ ao seu número de ocorrências; Senão Inserir a palavra na posição em que deveria estar; Ler a próxima palavra do arquivo; } Mostrar a tabela no vídeo; } 2ª Etapa: ContarPalavras { fl = open (“ctpalavras.dat”, “read”); Inicializar com zero palavras a tabela a ser montada; Ler a 1ª palavra do arquivo; Enquanto não se chegar ao final do arquivo { Procurar a palavra lida na tabela e sua posição; Se ela já estiver na tabela Acrescentar ‘1’ ao seu número de ocorrências; Senão Inserir a palavra na posição em que deveria estar; Ler a próxima palavra do arquivo; } file fl; Mostrar a tabela no vídeo; } 2ª Etapa: ContarPalavras { fl = open (“ctpalavras.dat”, “read”); Inicializar com zero palavras a tabela a ser montada; Ler a 1ª palavra do arquivo; Enquanto não se chegar ao final do arquivo { Procurar a palavra lida na tabela e sua posição; Se ela já estiver na tabela Acrescentar ‘1’ ao seu número de ocorrências; Senão Inserir a palavra na posição em que deveria estar; Ler a próxima palavra do arquivo; } file fl; Mostrar a tabela no vídeo; } typedef char cadeia[31]; struct entr_tab { ContarPalavras { cadeia nome; int n_ocorr; fl = open (“ctpalavras.dat”, “read”); } ntab = 0; Ler a 1ª palavra do arquivo; Enquanto não se chegar ao final do arquivo { Procurar a palavra lida na tabela e sua posição; Se ela já estiver na tabela Acrescentar ‘1’ ao seu número de ocorrências; Senão Inserir a palavra na posição em que deveria estar; Ler a próxima palavra do arquivo; } file fl; int ntab; Mostrar a tabela no vídeo; entr_tab tabela[100]; } 2ª Etapa: typedef char cadeia[31]; struct entr_tab { ContarPalavras { cadeia nome; int n_ocorr; fl = open (“ctpalavras.dat”, “read”); } ntab = 0; Juntar as 3 Ler a 1ª palavra do arquivo; linhas num Enquanto não se chegar ao final do arquivo { só cabeçalho Procurar a palavra lida na tabela e sua posição; de while Se ela já estiver na tabela Acrescentar ‘1’ ao seu número de ocorrências; Senão Inserir a palavra na posição em que deveria estar; Ler a próxima palavra do arquivo; } file fl; int ntab; Mostrar a tabela no vídeo; entr_tab tabela[100]; } 2ª Etapa: typedef char cadeia[31]; struct entr_tab { ContarPalavras { cadeia nome; int n_ocorr; fl = open (“ctpalavras.dat”, “read”); } ntab = 0; Juntar as 3 linhas num while (readfile (fl, palavra) == 1) { só cabeçalho Procurar a palavra lida na tabela e sua posição; de while Se ela já estiver na tabela Acrescentar ‘1’ ao seu número de ocorrências; Senão Inserir a palavra na posição em que deveria estar; 2ª Etapa: } Mostrar a tabela no vídeo; } file file fl; fl; int int ntab; ntab; entr_tab entr_tab tabela[100]; tabela[100]; cadeia palavra; typedef char cadeia[31]; struct entr_tab { ContarPalavras { cadeia nome; int n_ocorr; fl = open (“ctpalavras.dat”, “read”); } ntab = 0; 2ª Etapa: while (readfile (fl, palavra) == 1) { Procurar a palavra lida na tabela e sua posição; Se ela já estiver na tabela Acrescentar ‘1’ ao seu número de ocorrências; Senão Inserir a palavra na posição em que deveria estar; } Mostrar a tabela no vídeo; } file fl; int ntab; entr_tab tabela[100]; cadeia palavra; typedef char cadeia[31]; struct entr_tab { ContarPalavras { cadeia nome; int n_ocorr; fl = open (“ctpalavras.dat”, “read”); } ntab = 0; Posicao retorna o índice onde palavra está ou while (readfile (fl, palavra) == 1) { deveria estar na tabela posic = Posicao (palavra); >0 se estiver e <0 se não Se ela já estiver na tabela Acrescentar ‘1’ ao seu número de ocorrências; Senão Inserir a palavra na posição em que deveria estar; 2ª Etapa: } Mostrar a tabela no vídeo; } file fl; int ntab, ntab; posic; entr_tab tabela[100]; cadeia palavra; typedef char cadeia[31]; struct entr_tab { ContarPalavras { cadeia nome; int n_ocorr; fl = open (“ctpalavras.dat”, “read”); } ntab = 0; 2ª Etapa: while (readfile (fl, palavra) == 1) { posic = Posicao (palavra); Se ela já estiver na tabela Acrescentar ‘1’ ao seu número de ocorrências; Senão Inserir a palavra na posição em que deveria estar; } Mostrar a tabela no vídeo; } file fl; int ntab, posic; entr_tab tabela[100]; cadeia palavra; typedef char cadeia[31]; struct entr_tab { ContarPalavras { cadeia nome; int n_ocorr; fl = open (“ctpalavras.dat”, “read”); } ntab = 0; 2ª Etapa: while (readfile (fl, palavra) == 1) { posic = Posicao (palavra); if (posic > 0) tabela[posic].n_ocorr++; else Inserir (palavra, -posic); } Mostrar a tabela no vídeo; } Inserir coloca a palavra na tabela mantendo a ordem alfabética file fl; int ntab, posic; entr_tab tabela[100]; cadeia palavra; typedef char cadeia[31]; struct entr_tab { ContarPalavras { cadeia nome; int n_ocorr; fl = open (“ctpalavras.dat”, “read”); } ntab = 0; 2ª Etapa: while (readfile (fl, palavra) == 1) { posic = Posicao (palavra); if (posic > 0) tabela[posic].n_ocorr++; else Inserir (palavra, -posic); } Mostrar a tabela no vídeo; } file fl; int ntab, posic; entr_tab tabela[100]; cadeia palavra; typedef char cadeia[31]; struct entr_tab { ContarPalavras { cadeia nome; int n_ocorr; fl = open (“ctpalavras.dat”, “read”); } ntab = 0; 2ª Etapa: while (readfile (fl, palavra) == 1) { posic = Posicao (palavra); if (posic > 0) tabela[posic].n_ocorr++; else Inserir (palavra, -posic); } ExibirTabela (); } file fl; int ntab, posic; entr_tab tabela[100]; cadeia palavra; 3ª Etapa: Desenvolvimento das funções Posicao, Inserir e ExibirTabela Função Posicao: utiliza procura binária pois a tabela está ordenada Função Inserir: desloca as palavras para baixo e insere a nova palavra em sua posição, mantendo a ordem alfabética Função ExibirTabela: escreve no vídeo a tabela das palavras em formato de tabela As variáveis fl, tabela e ntab serão globais 3ª Etapa: int Posição (cadeia palavra) { int inf, sup, med, posic; logic achou; achou = FALSE; inf = 1; sup = ntab; Ver o programa while (! achou && sup >= inf) { med = (inf + sup) / 2; completo no if (palavra == tabela[med].nome) livro-texto achou = TRUE; else if (palavra < tabela[med].nome) sup = med – 1; else inf = med + 1; } Inserir (cadeia palavra, int posic) { if (achou) posic = med; int i; else posic = - inf; ntab++; return posic; for (i = ntab; i > posic; i--) } tabela[i] = tabela[i-1]; tabela[posic].nome = palavra; tabela[posic].n_ocorr = 1; } ExibirTabela () { int i; write (“Palavra”, “|”, “Num. de ocorr”); write (“\n”, “--------------------------------------------------”); for (i = 1; i <= ntab; i++) write (“\n”, tabela[i].nome, “|”, tabela[i].n_ocorr); }