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

dsac23

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

7 posts in this topic

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.

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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?

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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;

...

0

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