Ir para conteúdo
Fórum Script Brasil
  • 0

Porque não funciona?


Sir John Doe

Pergunta

Nunca programei em nada na vida, sou estudante de pscologia e cansado de fazer tabela de distribuicao, fiz esse programa que so funcionou com um rol.

Creio que seja por desconhecer como faz calculo com os categorias de variareis float, double, string.

Alguém pode me ajudar?

 

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

#define TAM_MAX 10


void  imprimirRol( double vetor[TAM_MAX]){
    int i;
    printf("Rol:");
    for(i=0; i!=TAM_MAX; i++){
        printf("%5.2f,", vetor[i] );
    }
    printf("\n");
}

float menor(double tam, double vetor[TAM_MAX]){
    int i;
    double menor = 9999999;
    for(i=0; i!=tam; i++){
        if(vetor[i] < menor){
            menor=vetor[i];
        }
    }
    return menor;
}

float  maior(double tam, double vetor[TAM_MAX]){
    int i;
    double maior;
    for(i=0; i!=tam; i++){
        if(vetor[i] > maior){
            maior=vetor[i];
        }
    }
    return maior;
}

double pontoMedio(double a, double b){
    return (a+b)/2;
}

double percentualFrequencia(int contador){
    return 100*contador/TAM_MAX;
}


int main(){ 
    int i,j,cont=0,acum, tam; 
    
    double soma, somaPercentual=0, percentualClasse;
    double nro_menor, nro_maior, AT, h, K,lim1, lim2;
    double vet[TAM_MAX] = {1,4,24,25,30,33,39,46,57,60};

    soma=0;
    nro_menor = menor(TAM_MAX, vet);
    nro_maior = maior(TAM_MAX, vet);
    
    AT = nro_maior - nro_menor;
    K  = ceil(1+3.3*log10(TAM_MAX));

    h  = round(AT/K);

    printf("Resultados\n\n");
    imprimirRol(vet);
    printf("limite inferior li: %.2f  \n", nro_menor);
    printf("limite superior Li: %.2f  \n", nro_maior);
    printf("Amplitude total AT: %.2f  \n", AT);
    printf("Número total de Classes  K: %.2f \n", K);
    printf("Incremento de classe  h: %.2f \n\n", h);

    lim1=vet[0];
    lim2=h+lim1;
    
    printf("Tabela de Distribuição\n");    
    printf("Idade da familia Oliveira\n");        
    printf("-----------------+-----------+-----------+-----------+------------\n");        
    printf("     idade       |     fi    |     xi    |    fac    |    fpi     \n");    
    printf("-----------------+-----------+-----------+-----------+------------\n");    
    
    acum=0;
    for(i=0; i != K; i++){
        cont=0;
        for (j=0; j != 10; j++){
            if( vet[j] >= lim1 && vet[j] < lim2){
                cont++;
            }
        }
        acum = acum + cont;
        soma = soma + cont;
        
        percentualClasse = percentualFrequencia(cont);
        somaPercentual = somaPercentual + percentualClasse;

        printf("%3.0f  |=  %3.0f     |    %3d    |   %5.2f   |    %3d    |   %5.2f%%  \n", lim1, lim2, cont, pontoMedio(lim1,lim2), acum, percentualClasse) ;        
        lim1=lim2;
        lim2=lim2+h;
        percentualFrequencia(cont);

    }
    printf("-----------------+-----------+-----------+-----------+------------\n");    
    printf("                 |    %3.0f    |           |           |  %5.2f%%    \n", soma, somaPercentual);    
    printf("-----------------+-----------+-----------+-----------+------------\n");    
    printf("Fonte: aula prof. Geraldo Magela 24/03/2022\n");    

tente com esse rol:    

double vet[TAM_MAX] = {1,3,18,26,28,31,33,39,46,57,60};

altere a constante #define TAM_MAX 11

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

também vamos ter de adivinhar o que faz o programa...? se você comentar ele ou talvez explicar o que você achar que ele deveria fazer nas partes mais criticas do seu programa.

Assim de entrada vejo coisas que podem causar erros como a linha "double maior;" dentro da função maior.

quando declarar uma variável tenha em mente que você esta reservando um espaço da memoria, e que esse espaço pode vir com dados de outros programas incluídos("lixo"), se outro programa tiver usado esse espaço anteriormente é bem provável que lá tenha algum valor previo.

Dai se você fizer...

	int i;
	double maior;
	for(i=0; i!=tam; i++){
		if(vetor[i] > maior){
			maior=vetor[i];

pensando que maior vale 0 você pode topar com erros pois na realidade se a função tiver lixo poderia ser algo como isso
 

	int i;
	double maior = (aqui poderia ter qualquer valor);
	for(i=0; i!=tam; i++){
		if(vetor[i] > maior){
			maior=vetor[i];

isso pode causar erros imprevisíveis, porque poderia funcionar seu programa, ou funcionar as vezes, ou até mesmo sair dragão na tela.

Quando você precisar fazer cálculos com uma variável o melhor é dar um valor inicial

	int i;
	double maior = 0; // aqui temos controle porque sabemos que valor inicial vai ter
	for(i=0; i!=tam; i++){
		if(vetor[i] > maior){
			maior=vetor[i];

Fora isso você deveria comentar as formulas e cada parte critica etc. Somos todos pessoas ocupadas e realmente eu não sou estudante de pscologia XDDD. E ainda sou bem ruim em matematicas kkk. Se você me facilitar o que você espera que o programa faça, talvez, ou certamente seja possivel lhe ajudar. A linguagem C faz muitas coisas implícitas, que muitas vezes o programador desconhece, por isso você pode estar tendo problemas.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...