Ir ao conteúdo
  • Cadastre-se
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);
} 

 

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
Visitante

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

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

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

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

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

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

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

  • 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

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

×