Ir ao conteúdo

Posts recomendados

Postado

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!

  • Solução
Postado

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
Postado

@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
Postado

@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

 

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

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

Postado
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

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