domingo, 4 de outubro de 2015

EXERCÍCIOS 1 E 4 - P1 DE CES11

Segue o código do Exercício 1 da P1:
O exercício tinha por objetivo o cálculo de expressões algébricas na forma simples, utilizando a estrutura de dados de árvores encadeadas diretas. A estrutura utilizada foi a de uma árvore binária, afinal, é uma árvore encadeada direta.

Código - fonte exercício 1:

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

struct node
{
    float info1, info2;
    char operacao;///citar a operação : multiplicação, soma, etc.
    node *filho_esq, *filho_dir;
};
typedef node* raiz;
typedef node* arvore;

void Iniciar_Arvore(arvore a, char *exp, int *i);
raiz Formando_Arvore(char *exp);
float Calculo_Expr(raiz A);
void free_raiz(raiz A);
float CalcExpr(char *str);


raiz Formando_Arvore(char *exp)/// Recebe a expressão, contruíndo a árvore binária. Retorna um ponteiro para a sua raíz
{
    int j = 1;
    raiz A = (node*)malloc(sizeof(node));
    Iniciar_Arvore(A, exp, &j);
    return A;
}
void Iniciar_Arvore(arvore a, char *exp, int *i)
{

    if(isdigit(exp[*i]))
    {
        a->info1 = exp[*i] - '0';
        (*i)++;
        a->filho_esq = NULL;
    }
    else
    {
        a->filho_esq = (node*)malloc(sizeof(node));
        (*i)++;
        Iniciar_Arvore(a->filho_esq, exp, i);
    }
    a->operacao = exp[*i];
    (*i)++;
    if(isdigit(exp[*i]))
    {
        a->info2 = exp[*i] - '0';
        (*i)++;
        a->filho_dir = NULL;
    }
    else
    {
        a->filho_dir = (node*)malloc(sizeof(node));
        (*i)++;
        Iniciar_Arvore(a->filho_dir, exp, i);
    }
    (*i)++;
}
/// libera a arvore em pós-ordem
void free_raiz(raiz A)
{
    if(A != NULL)
    {
        free_raiz(A->filho_esq);
        free_raiz(A->filho_dir);
        free(A);
    }
}
float Calculo(char *str)
{
    raiz A = Formando_Arvore(str);
    float expr = Calculo_Expr(A);
    free_raiz(A);
    return expr;
}
float Calculo_Expr(raiz A)///Valor calculado
{
    float raiz1, raiz2;

    if(A->filho_esq != NULL)
        raiz1 =  Calculo_Expr(A->filho_esq);
    else
        raiz1 = A->info1;

    if(A->filho_dir != NULL)
        raiz2 =  Calculo_Expr(A->filho_dir);
    else
    {


        raiz2 = A->info2;

    if(A->operacao == '+')
        return raiz1 + raiz2;
    else if(A->operacao == '-')
        return raiz1 - raiz2;
    else if(A->operacao == '*')
        return raiz1 * raiz2;
    else if(A->operacao == '/')
        return raiz1 / raiz2;
    }
}
int main()
{

    char expressao[200];

    while(1)
    {
        printf("DIGITE A EXPRESSAO A SER CALCULADA (DIGITE 'OK' PARA ENCERRAR O PROGRAMA) :\n");
        scanf("%s", expressao);
        if(strcmp(expressao,"OK") == 0)
            break;
        printf("VALOR TOTAL: %f\n\n", Calculo(expressao));
    }

    return 0;
}


Código do Exercício 4 da P1:
O exercício tinha por objetivo, percorrer uma árvore binária e imprimir os nós que tem "avôs" múltiplos de 5.
Foi utilizada a estrutura de nós encadeados para árvores binárias, o que demandou o uso de recursão.

Código fonte exercício 4:

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

typedef struct cell cell;
struct cell
{
    int info;
    cell *arvore_a, *filho_esq, *filho_dir;
};
typedef cell* arvore;
///Recebe um ponteiro para a raíz e printa os nós que tem avôs múltiplos de 5
void Avo_MultCinco(arvore raiz)
{
    if(raiz != NULL)
    {
        Avo_MultCinco(raiz->filho_esq);
        if((raiz->arvore_a != NULL) && (raiz->arvore_a->arvore_a != NULL) && (raiz->arvore_a->arvore_a->info)%5 == 0)
            printf("%d ", raiz->info);
        Avo_MultCinco(raiz->filho_dir);
    }
}
int main ()
{
    ///lê uma árvore
    return 0;
}



 

Nenhum comentário:

Postar um comentário