Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

dsac23

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

Recommended Posts

dsac23

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:

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.

Share this post


Link to post
Share on other sites
OldCoder

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

Share this post


Link to post
Share on other sites
dsac23

Fiz do seguinte modo:

#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?

Share this post


Link to post
Share on other sites
Localhost

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.


here since 2009

Share this post


Link to post
Share on other sites
dsac23

É 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++...

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.

Share this post


Link to post
Share on other sites
Localhost

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


here since 2009

Share this post


Link to post
Share on other sites
DVD

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:

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:

//freq absoluta
arraydecontadores[1];

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

...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.