domingo, 25 de outubro de 2015

E aí, galera! Mais um programa aqui, desta vez um contador de palavras. Espero que se aproveitem. Obrigado.

Obs.: o código segue abaixo:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct node node;
typedef node *arvore;
typedef node *posicao;
struct node{
    char letra;
    int cont;
    node *filhos[26];
};

/***********************************
funcao que transforma letras maiusculas em minusculas 
***********************************/
char minuscula(char c){
    if(c >= 'A' && c <= 'Z')
        c = c - 'A' + 'a';
    return c;
}

/***********************************
funcao que retorna o numero associado a  uma dada letra
exemplo: a = 0, b = 1, c = 2, ... 
***********************************/
int numero(char c){
    return (c - 'a');

/***********************************
funcao que percorre a arvore em pre-ordem 
***********************************/
void ordem(arvore tree, char palavra[1000], arvore princ, FILE *saida){
    node *c;
    int tamanho;
    tamanho = strlen(palavra);
    if(tree->letra != 'D'){
            palavra[tamanho] = tree->letra;
            palavra[tamanho+1] = '\0';

    }
    if(tree->cont > 0 && palavra[0] != 'D')
        fprintf(saida, "%d %s\n", tree->cont, palavra);
    c = tree->filhos[0];
    for(int i = 1; i < 26; i++){
        if(c != NULL)
            ordem(c, palavra, princ, saida);
        c = tree->filhos[i];
        palavra[tamanho+1] = '\0';
        if(tree == princ)
            palavra[0] = '\0';
    }
}

/***********************************
funcao principal 
***********************************/
int main(){
    arvore principal, aux;
    FILE *entrada, *saida;
    char carac;
    int posic;

    entrada = fopen("entrada.txt", "r");
    saida = fopen("saida.txt", "w");

    principal = (arvore)malloc(sizeof(node));
    for(int i = 0; i < 26; i++)
        principal->filhos[i] = NULL;

    principal->letra = 'D';
    principal->cont = 0;
    aux = principal;

//vamos ler o arquivo ate chegar no final
    while((fscanf(entrada, "%c", &carac)) > 0){
        if((carac >= 'a' && carac <= 'z') || (carac >= 'A' && carac <= 'Z')){    //sabe se eh letra ou nao
            carac = minuscula(carac);
            posic = numero(carac);
            if(aux->filhos[posic] == NULL){
                aux->filhos[posic] = (arvore)malloc(sizeof(node));  //aloca espaco para "novas" letras
                aux->filhos[posic]->letra = carac;
                aux->filhos[posic]->cont = 0;
                for(int i = 0; i < 26; i++)
                    aux->filhos[posic]->filhos[i] = NULL;
            }
            aux = aux->filhos[posic];
        }
        else{
            if(aux != principal)
                aux->cont++;
            aux=principal;
        }
    }

    char palavra[1000];
    strcpy(palavra, "\0");
    ordem(principal, palavra, principal, saida);    //funcao q le e imprime a arvore

    fclose(entrada);
    fclose(saida);
    return 0;

}

Nenhum comentário:

Postar um comentário

CES-11

Bem-vindos ao meu blog que funcionará como um diário. Nele serão postados todos os trabalho de programação do segundo semestre do ITA feitos por mim!
Espero que conheçam um pouco mais sobre essa faculdade e também aprendam um pouco de programação em C.

Postagens mais visitadas