Ir ao conteúdo

Posts recomendados

Postado

Utilizando registro, elabore um programa que preencha uma estrutura de dados conforme exemplo abaixo. Essa estrutura contém os dados de 5 clientes de empresas de telefonia celular e também o valor da conta dos últimos 6 meses. Após preenchimento, exiba para cada cliente, a média e o maior consumo semestral, e também a quantidade de meses em que o consumo foi inferior à média.

 

image.png.6303eedd1a79972820413aca9cf52238.png

Comecei fazer pelo menos as médias para ver se estava fazendo certo, contudo, na saída do meu programa não aparece nada. O que estou fazendo de errado? 

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

// Declarando o registro.

struct TConta

{
    int Codigo;

    char Nome[51];

    char Telefone[12];

    char Operadora[51];

    float Consumo[6];

    float Media;

    float MaiorConsumo6;

    int QtdMesesConsumoInferiorMedia;
};


// Função para descobrir o maior consumo.

float Maior_Consumo_Semestral(float Maior)

{

    float Num=0;

    float ResultMaiorNumero;

    for (int i=0; i < 6; i ++)

    {
        float Num=0;

        if (Num < Maior)

        {
            Num = Maior;

            ResultMaiorNumero = Num;
        }
    }

    return ResultMaiorNumero;
}

// Programa principal.

int main()
{

    // Declarando as variaveis.

    int i, j;

    struct TConta Conta[5];

    // Primeiro laço de repetição informando os 5 clientes.

    for (int i=0; i < 5; i ++)

    {
        printf("Informe os dados da %da. Conta: ", i + 1);

        printf("\nCodigo da conta: ");
        scanf("%d", &Conta[i].Codigo);
        setbuf(stdin, NULL);

        printf("\nNome do cliente: ");
        fgets(Conta[i].Nome, 51, stdin);
        setbuf(stdin, NULL);

        printf("\nTelefone: ");
        fgets(Conta[i].Telefone, 12, stdin);
        setbuf(stdin, NULL);

        printf("\nOperadora: ");
        fgets(Conta[i].Operadora, 51, stdin);
        setbuf(stdin, NULL);

        system("cls");

        // Segundo laço de repetição para informar o consumo de 6 meses consecutivos de cada cliente.

        for (j=0; j < 6; j ++)

        {
            printf("\n\nConsumo (em reais) do %do mes: ", j + 1);
            scanf("%f", &Conta[i].Consumo[j]);

            system("cls");

        }

        // Calculando a media de consumo dos últimos 6 meses da Conta[i].

         Conta[i].Media = (Conta[i].Consumo[0] + Conta[i].Consumo[1] + Conta[i].Consumo[2] + Conta[i].Consumo[3] + Conta[i].Consumo[4] + Conta[i].Consumo[5])/6;
    }


    // Imprimindo os dados das contas.

    for (int i=0; i < 5; i ++)

    {
       printf("\nA media de consumo do %d.o cliente e: %.2f", i + 1, Conta[i].Media);
    }



    return 0;
}

 

Postado

image.png.a18c5920bdfabfdfb3d4e58ebb35d6a7.png

 

O enunciado "sugere" que existe uma estrutura de clientes e que cada cliente aponta para uma estrutura conta. Escreva em torno dos dados e tudo fica mais fácil.

 

E o enunciado fala em operadoras de telefonia e o título do post em contas de luz 🤔

 

Sobre seu programa:
 

	printf("\nCodigo da conta: ");
	scanf("%d", &Conta[i].Codigo);
	setbuf(stdin, NULL);

 

É ingênuo não testar o retorno de scanf(). Qual o propósito de seguir com o programa se não conseguir ler um valor desses? Viu no manual? Viu na tela do IDE? É para isso que scanf() retorna um inteiro.

 

setbuf() não foi escrita para isso e não vai funcionar do modo como espera. Sempre há buffer na entrada padrão a menos que mude o modo de entrada.

 

 

  • Obrigado 2
Postado
40 minutos atrás, Megalodon_P disse:

@devair1010 Obrigado, consegui aqui. Vou agora tentar o restante da questão. 

 

EXEMPLO

 

A saída

 

 

Veja como pode ser, digitando a partir do enunciado, e usando recortar e colar:

Um arquivo que você digita no editor do IDE a partir do enunciado e usa pra alinhar as colunas:

 

     Codigo:  
       Nome:
  Operadora:
   Telefone: 
Consumo(R$): 

|--------------|-------------------------------------------------------------|
|      Codigo: |                                                             |
|--------------|-------------------------------------------------------------|
|        Nome: |                                                             |
|--------------|-------------------------------------------------------------|
|   Operadora: |                                                             |
|--------------|-------------------------------------------------------------|
|    Telefone: |                                                             |
|--------------|-------------------------------------------------------------|
| Consumo(R$): | | 4321.33 | 5432.22 | 3423.32 | 3423.33 | 3423.23 | 3423.32 |  

 

O primeiro bloco sem as linhas. No segundo você vai completando até alinhar direitinho como nos anos 80 usando - e - e asterisco ou sei lá :D . Aí você copia direto para os printf()

 

Os dados:

 


typedef struct
{
    int     id;
    char    nome[30];
    char    operadora[30];
    char    telefone[22];

}   Cliente;

typedef struct
{
    int     id;
    double  consumo_recente[6];

}   Consumo;

 

Uma tabela tem os dados dos clientes e uma outra os dados de consumo de todo mundo

 

 

Uns valores constantes, incluídos claro os do enunciado

 

Clientes:

 

 

    Cliente     cliente[] =
    {
        [0] = 
        { 
            .id = 1, .nome = "Jhonny Cash",
            .operadora = "Oi",
            .telefone = "+55 (11) 855-555-555"
        },
        [1] = 
        { 
            .id = 128, .nome = "Willie Nelson",
            .operadora = "Vivo",
            .telefone = "+55 (31) 9-1234-4567"
        },
        [2] = 
        { 
            .id = 2556, .nome = "Kriss Kristopherson",
            .operadora = "TIM",
            .telefone = "(81) 9 4444 5555"
        },
        [3] = 
        { 
            .id = 124785, .nome = "Maria da Silva",
            .operadora = "Oi",
            .telefone = "(31) 9999-8888"
        }
    };

 

E uma tabela de consumo por ordem de id do cliente

 

    Consumo     consumo[] =
    {
        [0] = { 1,      { 1.,  2., 3., 4., 5., 6. } },
        [1] = { 2,      {      11., 2., 3., 4., 5., 6. } },
        [2] = { 128,    {     1., 2., 3., 4., 5., 6.} },
        [3] = { 2556,   {  1., 2., 3., 4., 5., 6. }},
        [4] = { 124785, { 68.8, 100.5, 75.2, 49.15, 52.1, 80.74} },
        [5] = { 124786, { 68.58, 100.5, 75.2, 49.15, 52.1, 80.74} }
    };

 

 

E a lógica é a de sempre: pega o id do cliente, acha ele na tabela de consumo e imprime a conta

 

        if (consumo[c].id == cliente[cli].id)
        {
            printf( "%12s %-7d\n", "Codigo:", cliente[cli].id);
            printf( "%12s %s\n", "Nome:", cliente[cli].nome);
            printf( "%12s %s\n", "Operadora:", cliente[cli].operadora);
            printf( "%12s %s\n", "Telefone:", cliente[cli].telefone);
            printf( "%12s ", "Consumo:");
            for( int m = 0; m < 6; m+= 1) printf( "%7.2f ", consumo[c].consumo_recente[m]);
            printf("\n\n);");
            break;
        };

 

Que para o exemplo mostra
 

     Codigo: 124785
       Nome: Maria da Silva
  Operadora: Oi
   Telefone: (31) 9999-8888
    Consumo:   68.80  100.50   75.20   49.15   52.10   80.74

 

Se construir assim em geral vai dar certo da primeira vez, porque assim são os dados.

 

Eis o programa "todo"

 

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

typedef struct
{
    int     id;
    char    nome[30];
    char    operadora[30];
    char    telefone[22];

}   Cliente;

typedef struct
{
    int     id;
    double  consumo_recente[6];

}   Consumo;

int main(void)
{
    Cliente     cliente[] =
    {
        [0] = 
        { 
            .id = 1, .nome = "Jhonny Cash",
            .operadora = "Oi",
            .telefone = "+55 (11) 855-555-555"
        },
        [1] = 
        { 
            .id = 128, .nome = "Willie Nelson",
            .operadora = "Vivo",
            .telefone = "+55 (31) 9-1234-4567"
        },
        [2] = 
        { 
            .id = 2556, .nome = "Kriss Kristopherson",
            .operadora = "TIM",
            .telefone = "(81) 9 4444 5555"
        },
        [3] = 
        { 
            .id = 124785, .nome = "Maria da Silva",
            .operadora = "Oi",
            .telefone = "(31) 9999-8888"
        }
    };

    Consumo     consumo[] =
    {
        [0] = { 1,      { 1.,  2., 3., 4., 5., 6. } },
        [1] = { 2,      {      11., 2., 3., 4., 5., 6. } },
        [2] = { 128,    {     1., 2., 3., 4., 5., 6.} },
        [3] = { 2556,   {  1., 2., 3., 4., 5., 6. }},
        [4] = { 124785, { 68.8, 100.5, 75.2, 49.15, 52.1, 80.74} },
        [5] = { 124786, { 68.58, 100.5, 75.2, 49.15, 52.1, 80.74} }
    };

    int t_clientes = sizeof(cliente)/sizeof(Cliente);
    printf( "%d Clientes ativos\n", t_clientes);

    int t_consumos = sizeof(consumo)/ sizeof(Consumo);
    printf( "Lidos dados de consumo para %d clientes\n", t_consumos );

    // exemplo para o cliente id = 124785
    int cli = 3;
    // acha o consumo a partir do cliente
    for ( int c = 0; c < t_consumos; c+= 1 )
    {
        if (consumo[c].id == cliente[cli].id)
        {
            printf( "%12s %-7d\n", "Codigo:", cliente[cli].id);
            printf( "%12s %s\n", "Nome:", cliente[cli].nome);
            printf( "%12s %s\n", "Operadora:", cliente[cli].operadora);
            printf( "%12s %s\n", "Telefone:", cliente[cli].telefone);
            printf( "%12s ", "Consumo:");
            for( int m = 0; m < 6; m+= 1) printf( "%7.2f ", consumo[c].consumo_recente[m]);
            printf("\n\n");
            break;
        };
    };
    return 0;
};

 

Se ajustar os loops vai imprimir todas as contas...

 

 

 

  • Obrigado 1
Postado

@devair1010 Consegui a média certinho, mas sobre o restante da questão, como saber o maior consumo semestral do cliente e a quantidade de meses em que o consumo foi superior à média?

 

Fiz da seguinte maneira o código para saber o maior consumo semestral, contudo, não deu certo: 

 

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

// Declarando o registro.

struct TConta

{
    int Codigo;

    char Nome[51];

    char Telefone[12];

    char Operadora[51];

    float Consumo[30];

    float Media;

    float MaiorConsumo6;

    int QtdMesesConsumoInferiorMedia;
};

// Segundo laço de repetição para informar o consumo de 6 meses consecutivos de cada cliente.

        for (j=0; j < 6; j ++)

        {
            printf("\n\nConsumo (em reais) do %do mes: ", j + 1);
            scanf("%f", &Conta[i].Consumo[j]);

            system("cls");

            // Verificando o maior consumo semestral.

            if (Conta[i].Consumo[j] > Maior)

            {

                PosMaiorConsumo6 = j; // Posição do maior consumo semestral

                Maior = Conta[i].Consumo[j]; // Mair passa a ser Conta[i].Consumo[j].

                Conta[i].MaiorConsumo6 = Conta[i].Consumo[j];

            }

        }
  
   // Imprimindo os dados das contas.

    for (int i=0; i < 5; i ++)

    {
       printf("\nA media de consumo do %d.o cliente e: %.2f", i + 1, Conta[i].Media);
       printf("\nO maior consumo semestral do %d.o cliente e: %.2f", i + 1, Conta[i].MaiorConsumo6);
    }

 

  @devair1010 Obrigado, consegui aqui. Vou agora tentar o restante da questão. 

Postado
Em 12/03/2021 às 18:39, Megalodon_P disse:

Após preenchimento, exiba para cada cliente, a média e o maior consumo semestral, e também a quantidade de meses em que o consumo foi inferior à média

 

Para preencher a conta é preciso claro navegar pelos 6 meses de consumo e calcular a média então é trivial. E também calcular o maior consumo semestral é trivial porque o programa acabou de ler os dados dos 6 meses. 

 

Mas para saber os meses em que o consumo superou a média é preciso saber a média e então tem que varrer de novo os dados de consumo...

 

A redação do enunciado é ruim: provavelmente se queria escrever "o mes de maior consumo nos últimos 6 meses" e não "o maior consumo semestral" ...

 

 

De todo modo se esse código mostra a conta
 

        if (consumo[c].id == cliente[cli].id)
        {
            printf("%12s %-7d\n", "Codigo:", cliente[cli].id);
            printf("%12s %s\n", "Nome:", cliente[cli].nome);
            printf("%12s %s\n", "Operadora:", cliente[cli].operadora);
            printf("%12s %s\n", "Telefone:", cliente[cli].telefone);
            printf("%12s ", "Consumo:");
            for (int m = 0; m < 6; m += 1) printf("%7.2f ", consumo[c].consumo_recente[m]);
            printf("\n\n");
            break;
        };

 

Algo assim com 3 linhas a mais mostraria a media:

 

        if (consumo[c].id == cliente[cli].id)
        {
            printf("%12s %-7d\n", "Codigo:", cliente[cli].id);
            printf("%12s %s\n", "Nome:", cliente[cli].nome);
            printf("%12s %s\n", "Operadora:", cliente[cli].operadora);
            printf("%12s %s\n", "Telefone:", cliente[cli].telefone);
            printf("%12s ", "Consumo:");
            double soma = 0.;
            double media = 0;
            for (int m = 0; m < 6; m += 1)
            {
                soma += consumo[c].consumo_recente[m];
                printf("%7.2f ", consumo[c].consumo_recente[m]);
            };  // for()
            printf("\n\n");
            media = soma / 6.;
            printf("Media de consumo = %7.2f\n", media);
            break;
        };

 

E isso acrescenta ao final da conta o esperado:

 

4 Clientes ativos
Lidos dados de consumo para 6 clientes


     Codigo: 124785
       Nome: Maria da Silva
  Operadora: Oi
   Telefone: (31) 9999-8888
    Consumo:   68.80  100.50   75.20   49.15   52.10   80.74

Media de consumo =   71.08

 

Com a média conhecida se pode então rever os resultados e ver quantos meses tiveram consumo inferior à média, um dado de pouco ou nenhum valor... E ao calcular a média fica fácil salvar o maior consumo no período...

 

Algo assim

 

        if (consumo[c].id == cliente[cli].id)
        {
            printf("%12s %-7d\n", "Codigo:", cliente[cli].id);
            printf("%12s %s\n", "Nome:", cliente[cli].nome);
            printf("%12s %s\n", "Operadora:", cliente[cli].operadora);
            printf("%12s %s\n", "Telefone:", cliente[cli].telefone);
            printf("%12s ", "Consumo:");

            double soma = 0.;
            double media = 0;
            double maior_consumo = -1.;
            int    meses_acima = 0;
            for (int m = 0; m < 6; m += 1)
            {
                soma += consumo[c].consumo_recente[m];
                if (maior_consumo < consumo[c].consumo_recente[m])
                    maior_consumo = consumo[c].consumo_recente[m];
                printf("%7.2f ", consumo[c].consumo_recente[m]);
            };  // for()
            printf("\n\n");
            media = soma / 6.;
            printf("Media de consumo = %7.2f\n", media);
            printf("Maior consumo em um mes = %7.2f\n", maior_consumo);
            for (int m = 0; m < 6; m += 1)
                if (consumo[c].consumo_recente[m] > media)
                    meses_acima += 1;
            printf("%d meses tiveram consumo acima da media.\n", meses_acima);
            break; // para o proximo cliente
        };

 

 

E a saída seria

 

4 Clientes ativos
Lidos dados de consumo para 6 clientes


     Codigo: 124785
       Nome: Maria da Silva
  Operadora: Oi
   Telefone: (31) 9999-8888
    Consumo:   68.80  100.50   75.20   49.15   52.10   80.74

Media de consumo =   71.08
Maior consumo em um mes =  100.50
3 meses tiveram consumo acima da media.

 

Apenas declarando as variáveis onde existem de fato e fazendo as contas.

 

O programa " todo " , via recortar e colar :) 

 

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

typedef struct
{
    int     id;
    char    nome[30];
    char    operadora[30];
    char    telefone[22];

}   Cliente;

typedef struct
{
    int     id;
    double  consumo_recente[6];

}   Consumo;

int main(void)
{
    Cliente     cliente[] =
    {
        [0] =
        {
            .id = 1, .nome = "Jhonny Cash",
            .operadora = "Oi",
            .telefone = "+55 (11) 855-555-555"
        },
        [1] =
        {
            .id = 128, .nome = "Willie Nelson",
            .operadora = "Vivo",
            .telefone = "+55 (31) 9-1234-4567"
        },
        [2] =
        {
            .id = 2556, .nome = "Kriss Kristopherson",
            .operadora = "TIM",
            .telefone = "(81) 9 4444 5555"
        },
        [3] =
        {
            .id = 124785, .nome = "Maria da Silva",
            .operadora = "Oi",
            .telefone = "(31) 9999-8888"
        }
    };

    Consumo     consumo[] =
    {
        [0] = { 1,      { 1.,  2., 3., 4., 5., 6. } },
        [1] = { 2,      {      11., 2., 3., 4., 5., 6. } },
        [2] = { 128,    {     1., 2., 3., 4., 5., 6.} },
        [3] = { 2556,   {  1., 2., 3., 4., 5., 6. }},
        [4] = { 124785, { 68.8, 100.5, 75.2, 49.15, 52.1, 80.74} },
        [5] = { 124786, { 68.58, 100.5, 75.2, 49.15, 52.1, 80.74} }
    };

    int t_clientes = sizeof(cliente) / sizeof(Cliente);
    printf("%d Clientes ativos\n", t_clientes);

    int t_consumos = sizeof(consumo) / sizeof(Consumo);
    printf("Lidos dados de consumo para %d clientes\n\n\n", t_consumos);

    // exemplo para o cliente id = 124785
    int cli = 3;
    // acha o consumo a partir do cliente
    for (int c = 0; c < t_consumos; c += 1)
    {
        if (consumo[c].id == cliente[cli].id)
        {
            printf("%12s %-7d\n", "Codigo:", cliente[cli].id);
            printf("%12s %s\n", "Nome:", cliente[cli].nome);
            printf("%12s %s\n", "Operadora:", cliente[cli].operadora);
            printf("%12s %s\n", "Telefone:", cliente[cli].telefone);
            printf("%12s ", "Consumo:");

            double soma = 0.;
            double media = 0;
            double maior_consumo = -1.;
            int    meses_acima = 0;
            for (int m = 0; m < 6; m += 1)
            {
                soma += consumo[c].consumo_recente[m];
                if (maior_consumo < consumo[c].consumo_recente[m])
                    maior_consumo = consumo[c].consumo_recente[m];
                printf("%7.2f ", consumo[c].consumo_recente[m]);
            };  // for()
            printf("\n\n");
            media = soma / 6.;
            printf("Media de consumo = %7.2f\n", media);
            printf("Maior consumo em um mes = %7.2f\n", maior_consumo);
            for (int m = 0; m < 6; m += 1)
                if (consumo[c].consumo_recente[m] > media)
                    meses_acima += 1;
            printf("%d meses tiveram consumo acima da media.\n", meses_acima);
            break; // para o proximo cliente
        };
    };
    return 0;
};

 

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!