Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

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);
} 

 

Link para o comentário
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 1
Link para o comentário
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 (!?)

 

 

 

Link para o comentário
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?

Link para o comentário
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?

Link para o comentário
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 

Link para o comentário
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;

 

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

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