Ir ao conteúdo

Posts recomendados

Postado

>>>Preciso resolver a opção 5 do switch case desse código. Tem que perguntar se deseja excluir os dados do vetor mas não estou conseguindo! Se alguém puder me dá uma dica, agradeço.<<<

 

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

 

 

void exibir_erro(int codigo);

float media(int tam, float* v);

float variancia(int tam, float* v, float media);

float desvio_padrao(float variancia);

float variancia_a(int tam, float* v, float media);

float desvio_padrao_a(float variancia_a);

 

int main(void){

int i, op, tam, op2;

float *v, med, var_a, dsv_a, var, dsv;

char rsp, s, n;

 

do{

printf("\n1 - Cadastrar conjunto de dados\n2 - Visualizar dados\n3 - Editar dados\n4 - Calcular variância e desvio padrão\n5 - Excluir dados\n(QUALQUER outra tecla para Finalizar)\nOpção Escolhida: "); scanf("%d", &op);

switch(op){

case 1:

printf("Vamos cadastrar uma lista de valores reais!\nQuantos itens há em sua lista (>1)?\n");

scanf("%d", &tam);

if(tam<1){

exibir_erro(1);scanf("%d", &tam);

}

v = (float *) malloc(tam * sizeof(float));

 

for(i=0; i<tam;i++){printf("Informe o valor %d: ", i); scanf("%f", &v[i]);}

printf("Os seus dados cadastrados são:\n");

for(i=0; i<tam; i++){

if(i == tam-1){

printf("%.1f\n", v[i]);

} else{

printf("%.1f - ", v[i]);

}

} break;

case 2:

printf("Os seus dados cadastrados são:\n");

for(i=0; i<tam; i++){

if(i == tam-1){

printf("%.1f\n", v[i]);

} else{

printf("%.1f - ", v[i]);

}

}break;

 

case 3:

printf("Seus dados:\n");

for(i=0; i<tam; i++){

if(i == tam-1){

printf("%.1f\n", v[i]);

} else{

printf("%.1f - ", v[i]);

}

}

printf("Informe o indice do valor a ser editado [0 - %d]\n", i-1); scanf("%d", &i);

printf("Informe um novo valor para [%d]\n", i);

scanf("%f", &v[i]); break;

 

case 4:

printf("Seus dados:\n");

for(i=0; i<tam; i++){

if(i == tam-1){

printf("%.1f\n", v[i]);

} else{

printf("%.1f - ", v[i]);

}

}

printf("\nMédia: %.2f\n\n", med = media(tam, v));

printf("=====AMOSTRA=====\n");

printf("Variância: %.2f\n", var_a = variancia_a(tam, v, med));

printf("Desvio Padrão: %.2f\n\n", dsv_a = desvio_padrao_a(var_a));

printf("=====POPULAÇÃO=====\n");

printf("Variância: %.2f\n", var = variancia(tam, v, med));

printf("Desvio padrão: %.2f\n", dsv = desvio_padrao(var));

break;

 

case 5: break;

 

default: printf("Obrigado por Utilizar!!");

}

} while(op >= 1);

return 0;

}

 

//Função para erro

void exibir_erro(int codigo){

switch(codigo){

case 1: printf("Informe um tamanho válido para a lista (>1):\n");

case 2: printf("Obrigado por Utilizar o Programa!!");

}

}

 

//Função da Média

float media(int tam, float* v){

int i;

float soma = 0.0;

for(i=0; i<tam; i++){

soma += v[i];

}

return soma/tam;

}

 

//Função da Variancia (População)

float variancia(int tam, float* v, float media){

int i;

float soma=0.0;

for(i=0; i<tam; i++){

soma+= (v[i]-media)*(v[i]-media);

}

return soma/tam;

}

 

//Função de Desvio Padrão (População)

float desvio_padrao(float variancia){

float var = variancia;

return sqrt(var);

}

 

//Função da Variância (Amostra)

float variancia_a(int tam, float* v, float media){

int i;

float soma=0.0;

for(i=0; i<tam; i++){

soma+= (v[i]-media)*(v[i]-media);

}

return soma/(tam-1);

}

 

//Função de Desvio Padrão (Amostra)

float desvio_padrao_a(float variancia_a){

float var_a = variancia_a;

return sqrt(var_a);

}


 

Postado

@Mario3210 Basta identificar que valores devem ser removidos do vetor dinâmico e chamar realloc(). Algo como:

v = (float*)malloc(tam*sizeof(float));
//...
v = (float*)realloc(v, (tam-x)*sizeof(float));
// Sendo x a quantidade de valores removidos

Claro que após identificar os valores que devem ser removidos, você deve copiar os valores subsequentes para a posição que antecede os mesmos.

Só então chame realloc() :)

  • Obrigado 1
Postado

É muito difícil ler um programa assim, e copiar também dá erros.

 

Use o tal botão code como descrito no forum..

 

Veja a diferença usando o tal botão e com o seu código formatado de uma maneira comum:

 

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
void  exibir_erro(int codigo);
float media(int tam, float* v);
float variancia(int tam, float* v, float media);
float desvio_padrao(float variancia);
float variancia_a(int tam, float* v, float media);
float desvio_padrao_a(float variancia_a);
int   main(void)
{
    int    i, op, tam, op2;
    float *v, med, var_a, dsv_a, var, dsv;
    char   rsp, s, n;
    do {
        printf(
            "\n1 - Cadastrar conjunto de dados\n2 - Visualizar "
            "dados\n3 - Editar dados\n4 - Calcular variância e desvio "
            "padrão\n5 - Excluir dados\n(QUALQUER outra tecla para "
            "Finalizar)\nOpção Escolhida: ");
        scanf("%d", &op);
        switch (op)
        {
            case 1:
                printf(
                    "Vamos cadastrar uma lista de valores "
                    "reais!\nQuantos itens há em sua lista (>1)?\n");
                scanf("%d", &tam);
                if (tam < 1)
                {
                    exibir_erro(1);
                    scanf("%d", &tam);
                }
                v = (float*)malloc(tam * sizeof(float));
                for (i = 0; i < tam; i++)
                {
                    printf("Informe o valor %d: ", i);
                    scanf("%f", &v[i]);
                }
                printf("Os seus dados cadastrados são:\n");
                for (i = 0; i < tam; i++)
                {
                    if (i == tam - 1) { printf("%.1f\n", v[i]); }
                    else
                    {
                        printf("%.1f - ", v[i]);
                    }
                }
                break;
            case 2:
                printf("Os seus dados cadastrados são:\n");
                for (i = 0; i < tam; i++)
                {
                    if (i == tam - 1) { printf("%.1f\n", v[i]); }
                    else
                    {
                        printf("%.1f - ", v[i]);
                    }
                }
                break;
            case 3:
                printf("Seus dados:\n");
                for (i = 0; i < tam; i++)
                {
                    if (i == tam - 1) { printf("%.1f\n", v[i]); }
                    else
                    {
                        printf("%.1f - ", v[i]);
                    }
                }
                printf(
                    "Informe o indice do valor a ser editado [0 - "
                    "%d]\n",
                    i - 1);
                scanf("%d", &i);
                printf("Informe um novo valor para [%d]\n", i);
                scanf("%f", &v[i]);
                break;
            case 4:
                printf("Seus dados:\n");
                for (i = 0; i < tam; i++)
                {
                    if (i == tam - 1) { printf("%.1f\n", v[i]); }
                    else
                    {
                        printf("%.1f - ", v[i]);
                    }
                }
                printf("\nMédia: %.2f\n\n", med = media(tam, v));
                printf("=====AMOSTRA=====\n");
                printf("Variância: %.2f\n",
                       var_a = variancia_a(tam, v, med));
                printf("Desvio Padrão: %.2f\n\n",
                       dsv_a = desvio_padrao_a(var_a));
                printf("=====POPULAÇÃO=====\n");
                printf("Variância: %.2f\n",
                       var = variancia(tam, v, med));
                printf("Desvio padrão: %.2f\n",
                       dsv = desvio_padrao(var));
                break;
            case 5:
                break;
            default:
                printf("Obrigado por Utilizar!!");
        }
    } while (op >= 1);
    return 0;
}
// Função para erro
void exibir_erro(int codigo)
{
    switch (codigo)
    {
        case 1:
            printf("Informe um tamanho válido para a lista (>1):\n");
        case 2:
            printf("Obrigado por Utilizar o Programa!!");
    }
}
// Função da Média
float media(int tam, float* v)
{
    int   i;
    float soma = 0.0;
    for (i = 0; i < tam; i++) { soma += v[i]; }
    return soma / tam;
}
// Função da Variancia (População)
float variancia(int tam, float* v, float media)
{
    int   i;
    float soma = 0.0;
    for (i = 0; i < tam; i++)
    {
        soma += (v[i] - media) * (v[i] - media);
    }
    return soma / tam;
}
// Função de Desvio Padrão (População)
float desvio_padrao(float variancia)
{
    float var = variancia;
    return sqrt(var);
}
// Função da Variância (Amostra)
float variancia_a(int tam, float* v, float media)
{
    int   i;
    float soma = 0.0;
    for (i = 0; i < tam; i++)
    {
        soma += (v[i] - media) * (v[i] - media);
    }
    return soma / (tam - 1);
}
// Função de Desvio Padrão (Amostra)
float desvio_padrao_a(float variancia_a)
{
    float var_a = variancia_a;
    return sqrt(var_a);
}

 

Escreva em torno dos dados. É mais simples.

 

Todas suas funções operam em um conjunto de dados. Porque não tem uma estrutura com eles e o tamanho dentro? É muito mais simples.

 

typedef struct
{
    unsigned tam;
    double*  v;
    double   soma;
    double   media;
    double   varianca;
    double   desvio_padrao;

}   Dados;

 

Parece que quer tratar uma amostra dentro da população e calcular dados em um subconjunto, mas não vi isso no programa.

 

Se usar uma estrutura pode apenas passar o endereço de um conjunto para as funções e tudo fica MUITO mais fácil de usar e de mudar.

 

  • não existe switch case. O comando se chama switch. Só isso. case é o prefixo de cada label.
  • se tem um menu e tantas funções, porque não tem uma função para mostrar o menu e retornar a opção?
  • um printf() de várias  linhas é melhor para ler assim
        printf( "\
\n\
1 - Cadastrar conjunto de dados\n\
2 - Visualizar dados\n\
3 - Editar dados\n\
4 - Calcular variância e desvio padrão\n\
5 - Excluir dados\n\
\n\
    (QUALQUER outra tecla para Finalizar)\n\
\n\
\n\
    Opção Escolhida: ");

 

ou o  original

 

printf("\n1 - Cadastrar conjunto de dados\n2 - Visualizar dados\n3 - Editar dados\n4 - Calcular variância e desvio padrão\n5 - Excluir dados\n(QUALQUER outra tecla para Finalizar)\nOpção Escolhida: ");

 

Suas funções poderiam todas usar por exemplo

 

float media(Dados*);
float variancia(Dados*);
float desvio_padrao(Dados*);
float variancia_a(Dados*);
float desvio_padrao_a(Dados*);

 

E fica tudo mais simples.

 

Para criar e apagar um conjunto faça o clássico em C uma função que retorna um conjunto...

 

Dados* cria(unsigned tam);
Dados* apaga(Dados* d);

 

E assim pode criar e apagar do jeito comum

 

	Dados*    data_set_1 = cria(400); // retorna um conjunto de 400
	          data_set_1 = apaga(data_set_1); // apaga e zera o ponteiro

 

Como as variáveis são triviais pode somar a média enquanto lê. É mais esperto do que esperar e depois somar tudo que já leu.

 

  • não misture lógica com entrada e saída de dados.
  • tire as operações de dentro do case
  • evite comentários assim
    // Função para erro
    void exibir_erro(int codigo)


    Dá pra imaginar o que faz uma função com esse nome. E evite acentos nos comentários.

 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...