Ir ao conteúdo
  • Cadastre-se
Lindon Johnsson Júnior

C RESOLVIDO Calculadora de consumo elétrico

Recommended Posts

E aí, galera! Seguinte: tô precisando fazer uma calculadora de consumo elétrico pra um projeto da faculdade, porém eu dei uma travada logo no início e tô sem saber o que fazer

queria colocar no "app" algumas dicas de economia de energia também.

#include<stdio.h>
#include<locale.h>
main()
{
float quant,consumo,tempo;
	char op,apar;
	setlocale(LC_ALL, "Portuguese");
	printf("\t\tEfficiEnergy+ \n \tEscolha uma das opções:\n \t1.Calculadora de consumo mensal\n \t2.Dicas de economia\n \t3.Analisador em tempo real\n \t4.Sair\n\t");
	scanf("%c", &op);
	if (op==1);{
	printf("Insira o eletrodoméstico ou aparelho que deseja calcular o consumo:");
	scanf("%c",&apar);
		switch(apar){
			case 'liqui': printf("Insira a quantos possui e o tempo em horas que fica ligado diariamente:");
							scanf("%f%f",&quant,&tempo);
							consumo=(quant*200*tempo*30/1000);
							printf("O aparelho consome %fkW por mês",consumo);break;}
		}
	
}

Eu tô fazendo por agr um simples teste com um único caso(no caso seria liquidificador), e a partir daí eu vou inserindo os outros.Nessa primeira tentativa, o programa para logo no print de "Insira o eletrodoméstico"(n entendi mt bem porque, devo ter errado em algo, claro).

#include<stdio.h>
#include<locale.h>
main()
{
	float quant,consumo,tempo,pot;
	char op,apar;
	setlocale(LC_ALL, "Portuguese");
	printf("\t\tEfficiEnergy+ \n \tEscolha uma das opções:\n \t1.Calculadora de consumo mensal\n \t2.Dicas de economia\n \t3.Analisador em tempo real\n \t4.Sair\n\t");
	scanf("%c", &op);
	if (op==1);{
	printf("Insira o eletrodoméstico ou aparelho que deseja calcular o consumo: ");
	scanf("%c",&apar);
	printf("Insira quantos aparelhos iguais a este possui em sua residência: ");
	scanf("%f",&quant);
	printf("Insira o tempo médio diário em que fica ligado: ");
	scanf("%f",&tempo);
	consumo=(quant*tempo*30/1000);	
		switch(apar){
			case 'liqui': printf("O consumo médio é de %fkW por mês",consumo*200); break;}
		}
	
}

Nessa segunda tentativa, o programa pula o printf de inserir a variável char

#include<stdio.h>
#include<locale.h>
main()
{
	float quant,consumo,tempo,pot;
	char op,apar;
	setlocale(LC_ALL, "Portuguese");
	printf("\t\tEfficiEnergy+ \n \tEscolha uma das opções:\n \t1.Calculadora de consumo mensal\n \t2.Dicas de economia\n \t3.Analisador em tempo real\n \t4.Sair\n\t");
	scanf("%c", &op);
	if (op==1);{
	printf("Insira o eletrodoméstico ou aparelho que deseja calcular o consumo, quantos aparelhos iguais a este possui em sua residência e o tempo médio diário em que fica ligado: ");
	scanf("%c%f%f",&apar,&quant,&tempo);
	consumo=(quant*tempo*30/1000);	
		switch(apar){
			case 'liqui': printf("O consumo médio é de %fkW por mês",consumo*200); break;}
		}
	
}

Agora, nessa terceira tentativa, o printf do case 'liqui' é pulado.

 

Se puderem me ajudar a fazer e entender meus erros, fico muito agradecido!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

### Vamos ver do código abaixo o que mudou no teu.

#include <locale.h>
#include <stdio.h>

int main(void) {
  float	quant = 0,
  	consumo = 0,
  	tempo = 0,
  	pot = 0;
  char	op = 0, 
  	apar = 0;

	setlocale(LC_ALL, "Portuguese_Brazil");

	printf("\t\tEfficiEnergy+ \n"
        "\tEscolha uma das opções:\n "
        "\t1.Calculadora de consumo mensal\n"
        "\t2.Dicas de economia\n"
        "\t3.Analisador em tempo real\n\t4.Sair\n\t: ");
	scanf("%hd", &op);

	if (op == 1){
		printf("Insira o eletrodoméstico ou aparelho que deseja calcular o "
			   "consumo, quantos aparelhos iguais a este possui em sua "
			   "residência e o tempo médio diário em que fica ligado: ");
		scanf(" %c %f %f", &apar, &quant, &tempo);

		consumo = (quant * tempo * (30.0 / 1000.0));
		switch (apar){
		    case 'l':
			printf("O consumo médio é de %gkW por mês", consumo * 200.0);
		    break;
            	default:
                	puts("Erro!");
		}
	}
    return 0;
}

 

pergunte o que desejar.

adicionado 1 minuto depois

formatação é meio louca assim, por conta de incompatibilidades entre IDE online e <> code do fórum.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Eu recomendo esse site para indentar automaticamente códigos mal formatados, uso ele frequentemente com códigos aqui do fórum, ele formata muito bem e o resultado funciona perfeitamente com o <> Code do fórum:

 

https://www.tutorialspoint.com/online_c_formatter.htm

 

Veja o resultado usando o seu código:

#include <locale.h>
#include <stdio.h>

int main(void) {
    float quant = 0,
          consumo = 0,
          tempo = 0,
          pot = 0;
    char op = 0,
         apar = 0;

    setlocale(LC_ALL, "Portuguese_Brazil");

    printf("\t\tEfficiEnergy+ \n"
           "\tEscolha uma das opções:\n "
           "\t1.Calculadora de consumo mensal\n"
           "\t2.Dicas de economia\n"
           "\t3.Analisador em tempo real\n\t4.Sair\n\t: ");
    scanf("%hd", &op);

    if (op == 1) {
        printf("Insira o eletrodoméstico ou aparelho que deseja calcular o "
               "consumo, quantos aparelhos iguais a este possui em sua "
               "residência e o tempo médio diário em que fica ligado: ");
        scanf(" %c %f %f", &apar, &quant, &tempo);

        consumo = (quant * tempo * (30.0 / 1000.0));
        switch (apar) {
        case 'l':
            printf("O consumo médio é de %gkW por mês", consumo * 200.0);
            break;
        default:
            puts("Erro!");
        }
    }
    return 0;
}

Aí se quiser fazer algum ajuste no resultado dá pra fazer lá mesmo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Primeiro: obrigado, cara, ajudou muito!

Mas eu tenho algumas dúvidas...ainda sou meio leigo nisso, então...

1 - porque int main (void)?

2 - porque definir 0 como valor das variáveis?

3 - porque no primeiro scanf se usa %hd? Nem sabia q isso existia

4- O que é %g? Um "substituto" do %f? Também é um comando que não conheço

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
24 minutos atrás, Lindon Johnsson Júnior disse:

1 - porque int main (void)?

  • void como parâmetro da função main; Isso porque estamos sinalizando negativo para qualquer tentativa de chamar a função com argumentos. A função main é a primeira de todos os programas escritos em C, tem diversos protótipos [forma de se apresentar], main(void) é a formato que comunica ao sistema operacional que ignore qualquer argumento no arranco do programa. Isso é perfeitamente válido, já que não faz uso de argumento. O mesmo para todas as funções declaradas sem parâmetros desta forma o programa fica tecnicamente consistente. Contudo, dentro do contexto tanto faz e resta apenas a lição.
  • int a função precisa comunicar ao sistema operativo como foi realizada o processo do programa retornando um sinal de status, então int main(){ ... return 0;} retorna 0 se tudo ocorreu bem a assim contribuirmos com muitas objetos inerentes ao sistema, alguns compiladores irão força o main a retorna um valor, 0 é sinal de tudo ocorreu bem. Outros valores podem ser atribuídos, entretanto isso não tem importância por enquanto.
38 minutos atrás, Lindon Johnsson Júnior disse:

2 - porque definir 0 como valor das variáveis?

  • Essa é prática que remonta os primeiros códigos antes do C inclusive. É mais um metida de segurança, prática que tem por objetivo não envolver valores antigos em operações novas. C opera diretamente cm células de memória, logo pode reutiliza-las o tempo inteiro reiniciar essas células impede o programa de acabar envolvendo valores inúteis [errantes] na lógica. Por exemplo:
#include <stdio.h>

int my_potencia();
int main(void) {
  printf("%d", my_potencia("Estranho aceito argumento!? Por quê?", 123.0, 'B', 1));
	return 0;
}
int my_potencia(){
  float potencia;
  for(float step = 0;step < 10e2; step++){
    potencia = step + potencia;
  }
  return potencia;
}

a variável potencia pode assumir o valor 0, ou qualquer outro dependendo da sorte. Se assumir qualquer outro não representa mais a soma desejada, se assumir 0 sim. Daí temos que garantir a nulidade de todas as variáveis com tempo torna-se ato-reflexo [faz sem perceber] e útil.

 

55 minutos atrás, Lindon Johnsson Júnior disse:

3 - porque no primeiro scanf se usa %hd? Nem sabia q isso existia

  • %hd Boa pergunta! Não percebi que tinha feito [ato-reflexo], está presente nos programas e livros mais antigos, inclusive eu errei são dois h's e não 1. %hhd, porque a variável tem 1 byte e não 2. A variável char tem largura de 8 bits quando pequemos dados por meio do scanf todos os parâmetros nos argumentos são de um tipo só ponteiro, portanto devemos comunicar o largura que queremos para que a função não extravase a memória reservada, daí usamos as mascaras adequadas para cada tipo, assim quando quiser o tipo char [1 byte] em inteiro use: %hhd ou %hhu. Exemplo:
#include <stdio.h>

int main(void) {
  char byte_char;
  printf("%s\n%s", "Pegar inteiros de 8 bits[0-255]",": ");
  scanf("%hhd", &byte_char);

  printf("Digitou 1byte  com sinal d: %hhd\n", byte_char);
  printf("Digitou 1byte  sem sinal u: %hhu\n", byte_char);
  printf("Digitou 4bytes com sinal d: %d\n", byte_char);
  printf("Digitou 4bytes sem sinal u: %u\n", byte_char);
  return 0;
}

Teste para todos valores dentro e fora e igual ao limite [0,255]... Comece por digitando: 255

 

1 hora atrás, Lindon Johnsson Júnior disse:

4- O que é %g? Um "substituto" do %f? Também é um comando que não conheço

%g é mais inteligente, porque suprime os 0 quando não significativos e também para números muito grandes ou muito pequenas exibe em notação científica, sua principal vantagem e supressão de 0. Daí para o tipo de programa científico é muito mais adequando, entretanto pode não ser o caso, porém fica a lição. Aprenda mais aqui neste atalho sobre isso e outras coisa a respeito da scanf: http://www.cplusplus.com/reference/cstdio/scanf/

 

:thumbsup: 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Obrigado novamente por responder minhas dúvidas. Porém surgiu um problema enquanto eu continuava com o programa:

#include <locale.h>
#include <stdio.h>

int main(void) {
    float quant = 0,
          consumo = 0,
          tempo = 0 ,
          pot = 0 ;
    char op = 0 ,
         apar = 0;

    setlocale(LC_ALL, "Portuguese_Brazil");

    printf("\t\tEfficiEnergy+ \n"
           "\tEscolha uma das opções:\n "
           "\t1.Calculadora de consumo mensal\n"
           "\t2.Dicas de economia\n"
           "\t3.Analisador em tempo real\n\t4.Sair\n\t: ");
    scanf("%hd", &op);

    if (op == 1) {
        printf("Insira o eletrodoméstico ou aparelho que deseja calcular o "
               "consumo, quantos aparelhos iguais a este possui em sua "
               "residência e o tempo médio diário em que fica ligado: ");
        scanf(" %c %f %f", &apar, &quant, &tempo);
		consumo = (quant * tempo * (30.0 / 1000.0));
        switch (apar) {
        case 'liquidificador':
        case 'liqui':
		case 'LIQUI':
		case 'LIQUIDIFICADOR':	
            printf("O consumo médio é de %gkW por mês", consumo * 200.0);
            break;
        case 'microondas':
        case 'MICROONDAS':
        	printf("O consumo médio é de %gkW por mês", consumo*2000.0);
        	break;
        case 'aspirador':
        case 'ASPIRADOR':
        case 'ASPIRADOR DE PÓ':
        case 'aspirador de pó':
        	printf("O consumo médio é de %gkW por mês", consumo*1000.0);
        	break;
		default:
            puts("Erro!");
        }
    }
    return 0;
}

Adicionei mais cases dentro do switch(no caso, mais aparelhos e eletrodomésticos), mas o programa não "recebe" os nomes...por exemplo, se eu executo o programa e digito microondas, aparece a mensagem de erro do default, enquanto que, quando testei o programa que você fez e enviou, funcionava perfeitamente, porém era utilizada uma única letra.

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 horas atrás, Lindon Johnsson Júnior disse:

quando testei o programa que você fez e enviou, funcionava perfeitamente, porém era utilizada uma única letra.

É que cada case suporta um letra!  

 

Minha recomendação é criar um menu para os eletrodomésticos.

Assim fica mais fácil, para isso use a primeira letra do alfabeto ou outro sinal de tua preferência 

 

Exemp_Menu:

  ...
    printf(
    	"Insira o eletrodoméstico ou aparelho que deseja calcular o "
	"a- Geradeira\n"
	"b- Micro-ondas\n"
	"c- Lava-louca\n"
	"consumo, quantos aparelhos iguais a este possui em sua "
	"residência e o tempo médio diário em que fica ligado: ");
  ...
  switch (apar) {
    case 'a':
      printf("O consumo médio é de %gkW por mês", consumo * 200.0);
    break;
  ...
  }

Caso não gostei assim, vai ter que usar a biblioteca string.h [pesquisa na internet] por meio da função strcmp localizar dentro de um vetor, escaneando nome a nome de eletrodoméstico..., só então daí alimentar com índice se localizado a proposição Switch(apar)

 

 

adicionado 6 minutos depois

Essa é uma boa dica!

Pense como o usuário vai ter certeza se o seu eletrodoméstico existe na lista? Tem que ter uma lista de opções para se localizar. 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×