Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Juan M M N Rocha

C++ Eu nao entendo o porque do programa nao funcionar corretamente

Recommended Posts

Toda vez que tento executar o programa, ele simplesmente trava antes do laço e nao continua.....pfvr se alguém puder me ajudar.

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

main()
{
    int numandar, aptoandar,i = 0, j = 0, m, n, b, v, c, u, resp;
    float gasto[numandar][aptoandar], kWh_max, kWh_min, gasto_max, gasto_min;
    float $conta$[numandar][aptoandar], andarkWh[numandar], kWh_andarmax, kWh_andarmin, andar$[numandar], $_andarmax, $_andarmin;
    float contpredio, kWhpredio, valortotal;
    char donos[numandar][aptoandar];
    char  op;
    
    printf("Informe o numero de andares do predio: ");
    scanf("%d", &numandar);
    printf("Informe o numero de aptos por andares do predio: ");
    scanf("%d", &aptoandar);
    for (i ; i < numandar; i++)
    {
        for (j ; j < aptoandar; j++)
        {
            fflush(stdin);
            printf("Informe o nome do dono do apto %d localizado no andar %d: ", j + 1, i);
            scanf("%ch", &donos[j]);
            fflush(stdin);
            printf("Infome o gasto mensal em kWh deste apartamento: ");
            scanf("%f", &gasto[j]);
            $conta$[j] = gasto[j] * 0.39;
            printf("A Conta mensal deste apartamento e %f reais", $conta$[j]);
            contpredio += $conta$[j];
            kWhpredio += gasto[j];
            kWh_max = gasto[0][1];
            kWh_min = gasto[0][1];
            gasto_max = $conta$[0][1];
            gasto_min = $conta$[0][1];
            andarkWh += gasto[j];
            kWh_andarmax = gasto[0][1];
            kWh_andarmin = gasto[0][1];
            andar$ += $conta$[j];
            $_andarmax = $conta$[0][1];
            $_andarmin = $conta$[0][1];
            if (gasto[j] > kWh_max)
            {
                kWh_max = gasto[j];
                i = b;
                j = v;
            }
            if (gasto[j] < kWh_min)
             {
                kWh_min = gasto[j];
                i = c;
                j = u;
             }            
            if ($conta$[j] > gasto_max)
            {
                gasto_max = $conta$[j];
            }            
            if ($conta$[j] < gasto_min)
            {
                gasto_min = $conta$[j];
            }            
            if (andarkWh > kWh_andarmax)
            {
                kWh_andarmax = andarkWh;
                i = m;
            }
            if (andarkWh < kWh_andarmin)
            {
                kWh_andarmin = andarkWh;
                i = n;
            }            
             if (andar$ > $_andarmax)
            {
                $_andarmax = andar$;
            }
            if (andar$ < $_andarmin)
            {
                $_andarmin = andar$;
            }        
        system("cls");
        }
    }
    puts ("Comandos do SISTEMA de energia:\n");
    puts(" [1] Exibir gasto da conta de luz total do predio:\n");
    puts(" [2] Exibir maior gasto ($) e quantos kWh:\n");
    puts(" [3] Exibir menor gasto ($) e quantos kWh:\n");
    puts(" [4] Exibir o andar que mais gastou kWh:\n");
    puts(" [5] Exibir o andar que menos gastou kWh:\n");
    puts(" [6] Terminar a execucao do programa:\n");
    printf("Comando --->   ");
    scanf("%c", &op);
    switch ( op )
      {
          case '1': printf("O valor gasto neste predio por mes e %f reais e %f kWh", contpredio, kWhpredio); break;
          case '2':    printf("O apartamento %d do andar %d teve o maior gasto.Foram eles %f reais e %f kWh.\n", v, b, gasto_max, kWh_max); break;
           case '3': printf("O apartamento %d do andar %d teve o menor gasto.Foram eles %f reais e %f kWh.\n", u, c, gasto_min, kWh_min); break;
           case '4': printf("O andar que mais gastou energia foi o %d e gastou %f kWh e %f reais.\n", m, kWh_andarmax, $_andarmax); break;
           case '5': printf("O andar que menos gastou energia foi o %d e gastou %f kWh e %f reais.\n", n, kWh_andarmin, $_andarmin); break;
          case '6': exit(0); break;
          default : printf("Funcao ainda nao existente !\n");    
      }
    system("pause");
    return(0);
} 

 

Editado por Simon Viegas
Inserir tag CODE

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha essas declarações:

int numandar, aptoandar;
float gasto[numandar][aptoandar];
float $conta$[numandar][aptoandar];

Você não pode simplesmente declarar um vetor sem o seu tamanho. Em C as alocações de memória são estáticas, terá que saber previamente qual o seu tamanho.

Porém existe um meio de fazer alocação dinâmica, procure por alloc e malloc.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Juan M M N Rocha Olá. Tem alguns 'bugs' no seu código. Perceba q nos dois for você não inicializa a variável, no caso i e j:

 

for (i ; i < numandar; i++) // aqui i não está sendo inicializada
{
    for (j ; j < aptoandar; j++) // aqui j a mesma coisa
    {

O correto seria isso:

 

for (i = 0; i < numandar; i++)
{
    for (j = 0; j < aptoandar; j++)
    {

 

Logo abaixo você lê uma string dessa forma:

printf("Informe o nome do dono do apto %d localizado no andar %d: ", j + 1, i);
scanf("%ch", &donos[j]);

O correto seria isso: (nesse modo q estou passando é para ler string com espaços. Ex: Nome e sobrenome de uma pessoa)

 

printf("Informe o nome do dono do apto %d localizado no andar %d: ", j + 1, i);
scanf("%[^\n]s", &donos[i][j]);

Só q em vários momentos você usa uma matriz bidimensional como se a mesma fosse unidimensional. ex:

kWhpredio += gasto[j];

O correto seria algo assim:

kWhpredio += gasto[i][j];

para seu código rodar, tal como o @Luís Roberto C. da Silva mencionou, é preciso definir um tamanho para a matriz.

Recomendo o seguinte:

 

printf("Informe o numero de andares do predio: ");
scanf("%d", &numandar);
printf("Informe o numero de aptos por andares do predio: ");
scanf("%d", &aptoandar);

char donos[numandar][aptoandar]; // matriz declarada já com tamanho definido, após ser atribuído um valor p numandar e aptoandar

O código após várias correções compilou aqui, mas não chegou até a parte do menu (!?)

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Juan M M N Rocha Olá. Segue seu código compilando. Só q devo adiantar q não me atentei a lógica dos cálculos.

Seria importante dar uma boa olhada na lógica e mudar onde precisa ser mudado.

 

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

int main()
{
    int numandar, aptoandar, i, j, m, n, b, v, c, u, resp;
    float kWh_max, kWh_min, gasto_max, gasto_min;
    float kWh_andarmax, kWh_andarmin, andarmax, andarmin;
    float contpredio, kWhpredio, valortotal;

    int op;

    printf("Informe o numero de andares do predio: ");
    scanf("%d", &numandar);
    printf("Informe o numero de aptos por andares do predio: ");
    scanf("%d", &aptoandar);

    char donos[numandar][aptoandar];
    float gasto[numandar][aptoandar], andarkWh[numandar], andar$[numandar], conta$[numandar][aptoandar];

    for (i = 0; i < numandar; i++)
    {
        for (j = 0; j < aptoandar; j++)
        {
            fflush(stdin);
            printf("Informe o nome do dono do apto %d localizado no andar %d: ", j + 1, i);
            scanf("%[^\n]s", &donos[i][j]);
            fflush(stdin);
            printf("Infome o gasto mensal em kWh deste apartamento: ");
            scanf("%f", &gasto[i][j]);
            conta$[i][j] = gasto[i][j] * 0.39;
            printf("A Conta mensal deste apartamento e %f reais", conta$[i][j]);
            contpredio += conta$[i][j];
            kWhpredio += gasto[i][j];
            kWh_max = gasto[0][1];
            kWh_min = gasto[0][1];
            gasto_max = conta$[0][1];
            gasto_min = conta$[0][1];
            andarkWh[i] += gasto[i][j];
            kWh_andarmax = gasto[0][1];
            kWh_andarmin = gasto[0][1];
            andar$[i] += conta$[i][j];
            andarmax = conta$[0][1];
            andarmin = conta$[0][1];
            if (gasto[i][j] > kWh_max)
            {
                kWh_max = gasto[i][j];
                b = i;
                v = j;
            }
            if (gasto[i][j] < kWh_min)
             {
                kWh_min = gasto[i][j];
                c = i;
                u = j;
             }
            if (conta$[i][j] > gasto_max)
            {
                gasto_max = conta$[i][j];
            }
            if (conta$[i][j] < gasto_min)
            {
                gasto_min = conta$[i][j];
            }
            if (andarkWh[i] > kWh_andarmax)
            {
                kWh_andarmax = andarkWh[i];
                m = i;
            }
            if (andarkWh[i] < kWh_andarmin)
            {
                kWh_andarmin = andarkWh[i];
                n = i;
            }
             if (andar$[i] > andarmax)
            {
                andarmax = andar$[i];
            }
            if (andar$[i] < andarmin)
            {
                andarmin = andar$[i];
            }
            system("cls");
        }
    }

    do
    {
        system("cls");

        puts ("Comandos do SISTEMA de energia:\n");
        puts(" [1] Exibir gasto da conta de luz total do predio:\n");
        puts(" [2] Exibir maior gasto ($) e quantos kWh:\n");
        puts(" [3] Exibir menor gasto ($) e quantos kWh:\n");
        puts(" [4] Exibir o andar que mais gastou kWh:\n");
        puts(" [5] Exibir o andar que menos gastou kWh:\n");
        puts(" [6] Terminar a execucao do programa:\n");
        printf("Comando --->   ");
        scanf("%d", &op);
        switch ( op )
        {
              case 1:
                  printf("O valor gasto neste predio por mes e %f reais e %f kWh", contpredio, kWhpredio);
                  break;
              case 2:
                  printf("O apartamento %d do andar %d teve o maior gasto.Foram eles %f reais e %f kWh.\n", v, b, gasto_max, kWh_max);
                  break;
               case 3:
                   printf("O apartamento %d do andar %d teve o menor gasto.Foram eles %f reais e %f kWh.\n", u, c, gasto_min, kWh_min);
                   break;
               case 4:
                   printf("O andar que mais gastou energia foi o %d e gastou %f kWh e %f reais.\n", m, kWh_andarmax, andarmax);
                   break;
               case 5:
                   printf("O andar que menos gastou energia foi o %d e gastou %f kWh e %f reais.\n", n, kWh_andarmin, andarmin);
                   break;
              case 6:
                  //exit(0);
                  break;
              default :
                  printf("Funcao ainda nao existente !\n");
                  break;
          }
    } while (op != 6);

    system("pause");

    return(0);
}

Para o menu use números, tal como está no código acima.

Obs: Por questão de seguir o padrão de nomenclatura de variáveis em C, mudei o nome de algumas no seu código

 

adicionado 3 minutos depois

Mas inda ficou as variáveis andar$ e conta$

Você programa em PHP?

Editado por giu_d
corrigir comentário

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara mas quando eu imprimo a variável "n" o computador imprime um valor aleatório e alem disso o programa nao consegue achar um valor maximo, acho que ele simplemente nao substitui o valor encontrado

Sem título.png

Editado por Juan M M N Rocha

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Juan M M N Rocha  Olá. Estive olhando o código q passei e me parece q o problema é 'sujeira no buffer'. Recomendo usar essa função ao invés do comando fflush(stdin);:

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

Colocando essa função no código, use ela depois de cada scanf. Exemplo:

printf("Informe o numero de andares do predio: ");
scanf("%d", &numandar);
limpa_linha();

printf("Informe o numero de aptos por andares do predio: ");
scanf("%d", &aptoandar);
limpa_linha();

Mas quanto ao problema q você mencionou para resolver basta inicializar as variáveis m e n com o valor 0 no início do código.

Se o problema persistir avisa, ok?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara eu estou algumas horas tentando arrumar esse programa mas ainda nao consigo achar o erro ... em algumas funcoes ele acha os valores certos em outras nao. Eu nao consigo achar onde eu errei.

 

Sem título.png

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Juan M M N Rocha Deu para resolver o problema q estava dando quanto a variável n?

adicionado 4 minutos depois

É amigo. Nesse seu código é trabalhado com índices das matrizes e realmente exige muita atenção na hora de ajustar a lógica dos cálculos q são feitos, q não são poucos 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim esse deu sim, agora meu problema são as contas...talvez esteja bugando as expressões if ou algo do tipo.Mas não consigo resolver

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Juan M M N Rocha Olá. Segue a forma de ajustar o código na parte anterior ao primeiro if dentro do for:

 

kWh_max = gasto[0][0];
kWh_min = gasto[0][0];
gasto_max = conta$[0][0];
gasto_min = conta$[0][0];

andarkWh[i] += gasto[i][j];

kWh_andarmax = andarkWh[0];
kWh_andarmin = andarkWh[0]

andar$[i] += conta$[i][j];

andarmax = andar$[0]
andarmin = andar$[0]

É preciso inicializar cada variável corretamente para depois, na sequência do código poder fazer as comparações.

Vê se ajuda um pouco

adicionado 12 minutos depois

Na verdade seria adequado inicializar todas as variáveis referentes aos andares com o valor 0

int numandar, aptoandar, i, j, m = 0, n = 0, b = 0, v = 0, c = 0, u = 0, resp = 0;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

confesso que tambem nao me atentei muito a logica matematica..

 

mas achei estranho voce usar o +=.

 

aqui: andarkWh[ i ] += gasto[j];

 

ele vai fazer a seguinte operacao: andarkWh[ i ]  = andarkWh[ i ] +gasto[j].

 

sendo que andarkWh[ i ]  nao recebeu nenhum valor anteriormente.

 

            if (andarkWh[ i ] < kWh_andarmin)
            {
                kWh_andarmin = andarkWh[ i ];
                p = i;
            }

 

ele nao esta entrando por exemplo nessa condicao, já que vai pegar um lixo de memoria de andarkWh e comparar com outro lixo de memoria de kWh_andarmin 

 

tem que rever muito essa logica.

Editado por cezarstark
  • Curtir 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






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

×