segunda-feira, 22 de setembro de 2008

Código C do Programa de Estatística

 

O programa aqui apresentado foi escrito com base nos diagramas de blocos comentados em sala de aula. Este código foi testado nas plataformas Borland C Builder e Linux GCC.

//---------------------------------------------------------------------------
//    Estatistica.c
//    Josimar Nunes de Oliveira
//    20/Set/2008
//---------------------------------------------------------------------------

#pragma hdrstop

// bibliotecas referenciadas

#include <stdio.h>   // printf, scanf, getchar
#include <math.h>    // pow, sqrt
#include <string.h>  // strcmp

// constantes figurativas

#define MAX     5000        // capacidade máxima de dados
                            // para o array de termos da amostra

#define BATCH   "--batch"   // parâmetro de execução do programa:
                            // lote ou interativo

// criando macro definições

#define RaizQuadrada(x) sqrt(x)
#define Potencia(x,y) pow(x,y)

#pragma argsused

int main(int argc, char* argv[])
{
    // declaração de variáveis locais da função "main"

    int proc_interativo;

    int a[MAX], vmin, vmax, s, i, n, q;

    float vmed, ss, dp;

    // verificar argumentos de execução do programa

    proc_interativo = 1;
    if ( argc > 1 )
    {
        if ( strcmp(argv[1], BATCH) == 0 && argc == 2)
        {
            proc_interativo = 0;
        }
        else
        {
            printf("\n\nSintaxe:\n\n");
            printf("\t./progteste [--batch] [< arqentrada] [> arqsaida]\n\n");
            // término prematuro -- erro de sintaxe
            return 1;
        }
    }

    // entrada do parâmetro "n"

    if ( proc_interativo )
    {
        printf("\n\nInforme qual o n-ésimo termo: ");
    }
    scanf("%d", &n);

    // validar o parâmetro "n" fornecido pelo usuário

    if (n >= MAX)
    {
        if ( proc_interativo )   
        {
            printf("\n\nErro: excedeu capacidade do programa!!!\n\n");
        }
        // término prematuro do programa -- erro de capacidade
        return 2;
    }

    // quantidade de termos na amostra
    q = n + 1;

    // entrada dos termos { a0, a1, a2, ..., aN }
    // e armazenagem em array

    for (i=0; i<=n; i++)
    {
        if ( proc_interativo )
        {
            printf("\nDigite o valor[ %d ] : ", i);
        }
        scanf("%d", &a[i]);
    }

    // obtenção dos termos de valores mínimo e máximo
    // usando o primeiro elemento "a[0]" como referência

    vmin = a[0];
    vmax = a[0];

    for (i=1; i<=n; i++)
    {
        if ( a[i] < vmin )
        {
            vmin = a[i];
        }
        if ( a[i] > vmax )
        {
            vmax = a[i];
        }
    }

    // obter somatório dos termos

    s = 0;

    for (i=0; i<=n; i++)
    {
        s = s + a[i];
    }

    // cálculo da média aritmética

    vmed = (float)s / (float)q;

    // obter somatorio dos quadrados da diferença entre termos e média

    ss = 0;

    for (i=0; i<=n; i++)
    {
//      ss = ss + pow( (double)((float)a[i] - vmed), 2);
        ss = ss + Potencia( (double)((float)a[i] - vmed), 2);
    }

    // medida estatística denominada "variância"

    ss = ss / (float)q;


    // cálculo da medida estatística "desvio padrão"

//  dp = sqrt(  ss );
    dp = RaizQuadrada( ss );

    // saída dos cálculos

    printf("\n\nResumo Estatistico\n");

    printf("\nQuantidade de termos: %d", q    );
    printf("\nSomatorio dos termos: %d", s    );
    printf("\nValor minimo........: %d", vmin );
    printf("\nValor medio.........: %f", vmed );
    printf("\nValor maximo........: %d", vmax );
    printf("\nVariancia...........: %f", ss   );
    printf("\nDesvio padrao.......: %f", dp   );

    printf("\n\n\nListagem da Amostra\n");

    for ( i=0; i<=n; i++ ) 
    { 
        printf("\nTermo[ %04d ] = \t%d", i, a[i]); 
    }

    printf("\n\n");

    // aguardar usuário teclar ENTER em modo interativo

    getchar();
    getchar();

    // término normal do programa

    return 0;

}

No caso do Linux GCC, a linha de comando usada para compilação é:

gcc progteste.c -o progteste -lm

Nos próximos posts irei estender comentários de partes deste programa. Por enquanto apenas publiquei o código desenvolvido em sala de aula para servir de referência para construção de novos programas.

A seguir temos uma cópia de tela da execução no modo "batch":

proc

Até mais.