from while to number other than 0 in C

2

I need the program to stop when the consumer number is 0. So I put one of the while saying that while the consumer number is different from 0 it continues the program and when the consumer number is 0, it finish the program. It turns out that even by typing 0, the program continues.

#include <stdio.h>
int main()
{
    struct pessoas
    {

        int codTC; //codigo do consumidor para falar se é 1-Residencial 2-Comercial 3-Industrial
        int num; //numero do consumidor (vou colocar o numero referente ao cod para nao confundir)
        float kwh; //Quilowatt-hora

    };

    struct pessoas consumidor[16];

    float total, totalT, consumo1, consumo2, media;
    int i;

    printf("\nExercício desenvolvido considerando a tarifa do CIP - Contribuição Municipal\n");

    do
    {

        printf("\nTipo de consumidor, digite:\n1 - Residencial\n2 - Comercial\n3 - Industrial: ");
        scanf("%i", &consumidor[i].codTC);
        fflush(stdin);

        if (consumidor[i].codTC == 1)
        {

            printf("\nResidencial");

            printf("\n\nDigite o numero do consumidor: ");
            scanf("%i", &consumidor[i].num);

            printf("\nDigite a quantidade de kWh consumidos durante o mes: ");
            scanf("%f", &consumidor[i].kwh);

            //O total do valor sem tarifa, ou seja o custo total para cada consumidor;
            total = consumidor[i].kwh * 0.3;

            //O total do valor com tarifa, ou seja o total + tarifas
            totalT = total + 5.17;

            consumo1 = consumidor[i].kwh;


        }
        else if (consumidor[i].codTC == 2)
        {

            printf("\nComercial");

            printf("\n\nDigite o numero do consumidor: ");
            scanf("%i", &consumidor[i].num);

            printf("\nDigite a quantidade de kWh consumidos durante o mes: ");
            scanf("%f", &consumidor[i].kwh);

            total = consumidor[i].kwh * 0.5;

            //O total do valor com tarifa, ou seja o total + tarifas
            totalT = total + 5.17;

            consumo2 = consumidor[i].kwh;



        }
        else if (consumidor[i].codTC == 3)
        {

            printf("\nIndustrial");

            printf("\n\nDigite o numero do consumidor: ");
            scanf("%i", &consumidor[i].num);

            printf("\nDigite a quantidade de kWh consumidos durante o mes: ");
            scanf("%f", &consumidor[i].kwh);

            total = consumidor[i].kwh * 0.7;

            //O total do valor com tarifa, ou seja o total + tarifas
            totalT = total + 5.17;

        }

        media = consumo1 + consumo2 / 2;


        printf("\nO total de consumo e %.2f\n", total);
        printf("\nO custo total e %.2f\n", totalT);
        printf("\nA media de consumo dos consumidores 1 e 2 e %.2f\n", media);

    } while(consumidor[i].num != 0);


    return(0);
}
    
asked by anonymous 19.09.2015 / 17:40

3 answers

2

You are reading for consumidor[i].codTC but checking consumidor[i].num .

scanf("%i", &consumidor[i].codTC);

// ...

while(consumidor[i].num != 0)

You only read consumidor[i].num when the first reading is 1 , 2 , or 3 . If the first read is 0 , the consumidor[i].num gets an invalid value.

    
19.09.2015 / 17:48
3

The code even compiles. The i variable does not change. There are several situations where an error can occur there and there are things in the code that I would do very differently, but I will only solve the problem presented:

#include <stdio.h>
int main() {
    struct pessoas {
        int codTC; //codigo do consumidor para falar se é 1-Residencial 2-Comercial 3-Industrial
        int num; //numero do consumidor (vou colocar o numero referente ao cod para nao confundir)
        float kwh; //Quilowatt-hora
    };

    struct pessoas consumidor[16];

    float total, totalT, consumo1, consumo2, media;
    int i = 0; //inicializei a variável

    printf("\nExercício desenvolvido considerando a tarifa do CIP - Contribuição Municipal\n");
    do {
        printf("\nTipo de consumidor, digite:\n1 - Residencial\n2 - Comercial\n3 - Industrial: ");
        scanf("%i", &consumidor[i].codTC);
        fflush(stdin);

        if (consumidor[i].codTC == 1) {
            printf("\nResidencial");
            printf("\n\nDigite o numero do consumidor: ");
            scanf("%i", &consumidor[i].num);
            printf("\nDigite a quantidade de kWh consumidos durante o mes: ");
            scanf("%f", &consumidor[i].kwh);
            //O total do valor sem tarifa, ou seja o custo total para cada consumidor;
            total = consumidor[i].kwh * 0.3;
            //O total do valor com tarifa, ou seja o total + tarifas
            totalT = total + 5.17;
            consumo1 = consumidor[i].kwh;
        } else if (consumidor[i].codTC == 2) {
            printf("\nComercial");
            printf("\n\nDigite o numero do consumidor: ");
            scanf("%i", &consumidor[i].num);
            printf("\nDigite a quantidade de kWh consumidos durante o mes: ");
            scanf("%f", &consumidor[i].kwh);
            total = consumidor[i].kwh * 0.5;
            //O total do valor com tarifa, ou seja o total + tarifas
            totalT = total + 5.17;
            consumo2 = consumidor[i].kwh;
        } else if (consumidor[i].codTC == 3) {
            printf("\nIndustrial");
            printf("\n\nDigite o numero do consumidor: ");
            scanf("%i", &consumidor[i].num);
            printf("\nDigite a quantidade de kWh consumidos durante o mes: ");
            scanf("%f", &consumidor[i].kwh);
            total = consumidor[i].kwh * 0.7;
            //O total do valor com tarifa, ou seja o total + tarifas
            totalT = total + 5.17;
        }
        media = consumo1 + consumo2 / 2;
        printf("\nO total de consumo e %.2f\n", total);
        printf("\nO custo total e %.2f\n", totalT);
        printf("\nA media de consumo dos consumidores 1 e 2 e %.2f\n", media);
        i++; //incrementei a variável
    } while(consumidor[i - 1].num != 0); //seria bom verificar aqui se i chegou a 16
    return(0);
}

See running on ideone .

A slightly better solution but still having problems:

#include <stdio.h>
int main() {
    struct pessoas {
        int codTC; //codigo do consumidor para falar se é 1-Residencial 2-Comercial 3-Industrial
        int num; //numero do consumidor (vou colocar o numero referente ao cod para nao confundir)
        float kwh; //Quilowatt-hora
    };

    struct pessoas consumidor[16];

    float total, totalT, consumo1, consumo2, media;
    int i = 0;

    printf("Exercício desenvolvido considerando a tarifa do CIP - Contribuição Municipal\n");
    do {
        printf("\nDigite o numero do consumidor: ");
        scanf("%i", &consumidor[i].num);
        if (consumidor[i].num == 0) {
            break;
        }
        printf("\nTipo de consumidor, digite:\n1 - Residencial\n2 - Comercial\n3 - Industrial: ");
        scanf("%i", &consumidor[i].codTC);
        printf("\nDigite a quantidade de kWh consumidos durante o mes: ");
        scanf("%f", &consumidor[i].kwh);
        fflush(stdin);
        if (consumidor[i].codTC == 1) {
            printf("\nResidencial");
            total = consumidor[i].kwh * 0.3;
            consumo1 = consumidor[i].kwh; //isto não faz sentido mas deixei
        } else if (consumidor[i].codTC == 2) {
            printf("\nComercial");
            total = consumidor[i].kwh * 0.5;
            consumo2 = consumidor[i].kwh; //isto não faz sentido mas deixei
        } else if (consumidor[i].codTC == 3) {
            printf("\nIndustrial");
            total = consumidor[i].kwh * 0.7;
        }
        totalT = total + 5.17;
        media = consumo1 + consumo2 / 2; //isto não faz sentido mas deixei
        printf("\nO total de consumo e %.2f\n", total);
        printf("\nO custo total e %.2f\n", totalT);
        printf("\nA media de consumo dos consumidores 1 e 2 e %.2f\n", media);
        i++;
    } while (i == 16);
    return(0);
}

See running on ideone .

    
19.09.2015 / 17:52
2

The problem here is that at the start of your do .... while you are storing the value you type into consumer [i] .codTC and your while you validate if the consumer [i] .num value is nonzero.

But as the value entered in consumer [i] .codTC was zero it does not go through any of its ifs and therefore does not set the zero value to consumer [i] .num doing so while returning false and continuing execution.

    
19.09.2015 / 17:53