Ir para conteúdo


Revista PROGRAMAR – Edição 46 (Setembro 2014): Download já disponível!

- - - - -

Programa para calcular frequência absoluta, relativa e representar graficamente


  • Por favor inicie sessão para responder
6 respostas a este tópico

#1 dsac23

dsac23

    null

  • Novo Membro
  • Pip
  • 11 mensagens

Publicado 21 de Março de 2010 - 05:55

Boas pessoal.

Eu sou estudante do ISEL, e após Bolonha vi-me forçado a fazer uma cadeira do 3º semestre chamada EDA.

O meu problema é que eu já tinha feito duas cadeiras de programação antes de Bolonha, mas eram de Turbo Pascal e a cadeira de iniciação ao C++ do pós Bolonha tive equivalência. Agora deparo-me com uma cadeira onde é suposto saber alguma coisa de C++ pois existe a tal cadeira onde tive equivalência e como tal não tive as bases de C++.

Commprei um livro da FCA, sobre o assunto, mas a leitura está lenta e os resultados para executar o programa pretendido não estão a surgir...

O que gostaria de executar é um programa com a seguinte descrição:

Citar

Implemente um programa que peça ao utilizador uma amostra de valores inteiros e os armazene
num array. O número máximo de valores é 50 e cada valor deve estar compreendido entre 0 e 9.
Após o preenchimento do array o programa deve apresentar numa tabela:

• Coluna com a frequência absoluta (número de ocorrências de cada valor distinto).

• Coluna com a frequência relativa (percentagem de ocorrências de cada valor distinto
relativamente ao total de amostras)

• Coluna com a representação gráfica da distribuição, usando asteriscos para
representar cada ocorrência de um valor.
Utilize funções na implementação do programa.
Exemplo:

• Amostra de dados:

2, 3, 5, 9, 8, 4, 6, 5, 5, 4, 5, 6, 7, 3, 2, 6, 4, 0, 6,5, 3, 7, 5, 7, 6, 4, 5, 5, 6, 4

• Tabela a apresentar:

Valor                           Freq.Absoluta                   Freq.Relativa                      Representação Gráfica
0                                    1                              3.33 %                                    *
1                                    0                              0.00 %
2                                    2                              6.67 %                                    **
3                                    3                              10.00 %                                   ***
4                                    5                              16.67 %                                   *****
5                                    8                              26.67 %                                   ********
6                                    6                              20.00 %                                   ******
7                                    3                              10.00 %                                   ***
8                                    1                              3.33 %                                    *
9                                    1                              3.33 %                                    *

O que eu pretendo não é que façam o programa por mim, mas que me deem umas luzes sobre o assunto.

Há a possibilidade de o utilizador escolher o número de dados que pretende introduzir, até um máximo de 50 valores.

Desde já gradeço a vossa atenção e ajuda.

Cumprimentos.

#2 OldCoder

OldCoder

    Boolean User

  • Membro
  • PipPipPip
  • 117 mensagens

Publicado 21 de Março de 2010 - 09:37

O melhor que posso fazer é partilhar contigo a ideia geral de como resolveria esse problema.

Utilizaria duas arrays: uma array de 10 inteiros para armazenar as frequências absolutas, e uma array de 10 floats para as frequências relativas.

A melhor maneira de obter os dados é pedir ao utilizador que introduza os valores um a um, incrementar os elementos correspondentes na array das frequências absolutas, e incrementar sucessivamente uma variável com o número total de valores, até que:
1) ele introduza um "símbolo terminador" (por exemplo, se pedires inteiros, pode ser -1, ou se usares caracteres, pode ser qualquer tecla que não seja um algarismo);
ou 2) o número total de valores introduzidos atinja 50.

Atenção que podes precisar de converter variáveis de caracteres para inteiros. Se for esse o caso, tens que ajustar o resultado da conversão com um offset (passar do código ASCII de '0' para o inteiro 0, por exemplo).

Com a array de frequências absolutas pronta, e o número total de valores introduzidos, pode então preencher a array das frequências relativas.

Imprimir a tabela deverá ser muito simples, podes por exemplo usar a função standard de C printf() num ciclo, separando as colunas com tabs ('\t'). A representação gráfica pode ser feita pegando em cada frequência relativa, e usar um ciclo de decremento para imprimir asteriscos.

Cumprimentos

#3 dsac23

dsac23

    null

  • Novo Membro
  • Pip
  • 11 mensagens

Publicado 27 de Março de 2010 - 00:53

Fiz do seguinte modo:

Código (C):
#include<stdio.h>      
#include<stdlib.h>     

#define MAX_TAMANHO 50

void limpar();  // limpar o ecran

void main ()
{
        int i,n,e,c,d,j; // variáveis
        int amostra[MAX_TAMANHO]={0}; //array de amostra
        float fr,k,h; // variáveis

        do      // pedir amostra dos valores entre 0-50
        {
                limpar();
                printf ("\t     Introduza a quantidade da sua amostra \n");
                printf ("\t     ate   ao  maximo   de  %d   elementos\n\n\n\t\t\t", MAX_TAMANHO);
                scanf_s ("%d",&n);
        }while (n<=0||n>MAX_TAMANHO);

        limpar();       // limpa ecra
        for(i=0;i<=n-1;i++)             //ciclo de contagem do intervalo de valores permitidos pela amostra
        {
                do      //ciclo de introdução de valores pelo utilizador
                {
                        printf ("\t          Introduza o elemento %d de %d \n",i+1,n);
                        printf ("\t          contidos no  intervalo [0,9]\n\n\n\t\t\t");
                        scanf_s("%d",&e);
                        //se valor fora do intervalo
                        if (e<0||e>9)printf ("\n\t          O  valor  introduzido  nao \n\t          pertece ao intervalo [0,9]\n\n\n");
                }while (e<0||e>9);
                limpar ();      //limpa ecran
                amostra[i]=e;   //dá valor introduzido para amostra
        }
        //imprime no ecran todos os dados da amostra introduzidos
        {
                printf("\tAmostra de dados :\n\n");
                for(i=0;i<=n-1;i++)
                {
                        printf("%d, ",amostra[i]);
                }
        }
        c=0;
        printf("\n\n\n\tValor\t\tFrq.Abs.\tFrq.Rel.\t\tRep.Gra.\n"); // representação grafica
        //ciclo de calculo de amostra
        for(i=0;i<=9;i++)
        {
                for(d=0;d<=n-1;d++)
                {
                        if(i==amostra[d])
                                ++c;
                        k=c;h=n;
                        fr=(k/h)*100;
                }

                printf("\n\t  %d\t\t   %d\t\t %3.2f %%\t\t",i,c,fr);
                for (j=0;j<c;j++)
                {
                        printf ("*");
                }
                c=0;
        }
        printf("\n\n\n");
}

void limpar() // limpa ecran, limpa memória
{
        system("command/c cls");
        fflush(stdin);
        printf("\n\t          AMOSTRA DE NUMEROS INTEIROS \n\n");
}

Qual a vossa opiniÃo?

#4 Localhost

Localhost

    Unsigned User

  • Membro
  • PipPipPipPipPipPip
  • 2722 mensagens

Publicado 27 de Março de 2010 - 01:01

Tu queres fazer o programa em C++ ou em C? É que isso é C e não C++ e estás na área de C++.

Quanto ao código em si, não deves usar a função fflush.

#5 dsac23

dsac23

    null

  • Novo Membro
  • Pip
  • 11 mensagens

Publicado 29 de Março de 2010 - 17:48

É suposto leccionarem C++, e o programa é para ser feito em C++. O professor da cadeira lecciona assim como sendo C++.

Há qualquer coisa que não bate certo... será que o engenheiro que lecciona a cadeira também não sabe a diferença?

Agradeço que me dês umas dicas pela razão da não utilização do fflush e porque é este programinha desenvolvido em C e não em C++. Eu sei que o C++ foi desenvolvido à posteriori do C (que foi desenvolvido na decada de 70), e que como tal + C é um "sub-conjunto" do C++...



Ver MensagemLocalhost, em 27 de Março de 2010 - 01:01, disse:

Tu queres fazer o programa em C++ ou em C? É que isso é C e não C++ e estás na área de C++.

Quanto ao código em si, não deves usar a função fflush.


#6 Localhost

Localhost

    Unsigned User

  • Membro
  • PipPipPipPipPipPip
  • 2722 mensagens

Publicado 01 de Abril de 2010 - 17:59

Lol, isso parece-me C e não C++ mas eu é que se calhar estou a ver mal :x

#7 DVD

DVD

    void

  • Membro
  • PipPip
  • 38 mensagens

Publicado 01 de Abril de 2010 - 18:57

Epa as diferenças entre C e C++ não são nada a nivel sintáctico, alias as principais diferenças é que C não é uma linguagem definida por objectos, não permite overload de operadores e a maneira de reservar memoria no C é malloc/free e em C++ usa-se o new/delete.

BTW fui aluno de fortes no ISEL e digo-te que as bases que falas de C++ dadas em FP são meramente de introdução a programação ou seja (ponteiros, ifs,whiles,switchs) algo que existe em todas as linguagens.

Já agora porque não usas apenas um array de 10 posições (0..9)  que seria o teu array de contadores e à medida que lês do stdinput aumentas o contador do valor lido ou seja:

Código (C):
int variavel;
int nDeAmostras; //nr de valor totais recolhidos no stdinput
(...)
scanf("%d",&variavel);
arraydecontadores[variavel]++;
 

E depois quando fazes a impressão de dados não precisas de andar a percorrer o array e basta fazer contas :P
Por ex: para o valor 1:
Código (C):
//freq absoluta
arraydecontadores[1];

//freq relativa
arraydecontadores[1]*100 / nDeAmostras;

...