Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

ordenando struct em c++

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ ordenando struct em c++

    Gostaria de que alguém me ajudasse a sanar uma duvida
    estou aprendendo a linguagem c++ e estou tentando resolver um exercício.

    o exercício diz que tenho que fazer um programa financeiro que será informado se a conta é a pagar ou a receber, a descrição da conta, o mês e ano inicial da conta, numero de parcelas da conta e o valor da conta.

    na impressão final será informado em ordem em data menor o ano e mês inicial da conta, saldo anterior, total de saldo, total despesas e saldo.

    exemplo:

    se declaro três contas

    1ª conta

    conta a receber
    descrição da conta: salario
    mês inicial: 8
    ano inicial:2013
    numero de parcelas: 3
    valor da conta: 1500

    2ª conta

    conta a pagar
    descrição da conta: luz
    mês inicial: 7
    ano inicial:2013
    numero de parcelas:1
    valor da parcela:149,50

    3ª conta

    conta a pagar
    descrição da conta: festa
    mes inicial 10
    ano inicial 2013
    numero de parcelas 2
    valor da parcela: 600



    na impressão deverá organizar as contas em ordem e sairá assim

    mês: 7
    ano: 2013
    saldo anterior: 0
    total saldo: 0
    total despesas: 149,50
    saldo:-149,50


    mês: 8
    ano: 2013
    saldo anterior: -149,50
    total saldo: 1350,50 ( primeira parcela salario + o saldo anterior)
    total despesas:0
    saldo total:1350,50

    mês 9
    ano: 2013
    saldo anterior: 1350,50
    total saldo: 2850,50 ( segunda parcela salario + o saldo anterior)
    total despesas:0
    saldo total:2850,50

    mês 10
    ano: 2013
    saldo anterior: 2850,50
    total saldo: 4350,50 ( terceira parcela salario + o saldo anterior)
    total despesas: 600
    saldo total:3750,50

    mês 11
    ano: 2013
    saldo anterior: 3750,50
    total saldo: 3750,00 ( como não tem mais nada a receber fica apenas o saldo anterior)
    total despesas: 600 (segunda parcela da conta)
    saldo total:3150,50




    eu comecei a fazer e já começaram os problemas
    a ordenação eu não estou conseguindo fazer
    consegui colocar para ordenar mas o saldo anterior está dando problema pois o primeiro saldo anterior tem que ser =0 e quando ordena o saldo anterior tb ordena

    Código:
    #include <iostream.h>
    
    
    int main(){
    
    int x, i,op, parcela, j, aux1;
    float aux;
    char descricao[50];
    
    //leitura de numero de contas que o usuário irá declarar
    cout<<"numeros de contas \n";
    cin>>x;
    //declaraçao da struct que irá armazenar dados para impressão final
    struct dados{
           
           int mes;
           int ano;
           float saldoAnterior;
           float saldoTotal;
           float totalDespesas;
           float saldo;
           float pagar, receber;
    };
    
    
    
    struct dados saida[x];
    /*laço para leitura dos dados e salvando no vetor da struct 
    enquanto o i valer menos que o numero de contas que o usuário informou */    
         for(i=0;i<x;i++){ 
           
           cout<<"\n\nescolha opcao";
           cout<<"\n1- conta a pagar";    
           cout<<"\n2- conta a receber\n";
           cin>>op;
           
              cin.sync();
              cout<<"\nInforme a descricao da conta: ";
              gets(descricao);
              cout<<"\ninforme o mes inicial da conta: ";
              cin>>saida[i].mes;
              cout<<"\ninforme o ano inicial da conta: ";
              cin>>saida[i].ano;
              cout<<"\ninforme a quantidade de parcelas: ";
              cin>>parcela; 
              
          //condicional para saber se a conta é a pagar ou a receber
               
               if(op==1){   
                      
                      cout<<"\ninforme o valor da conta: ";
                      cin>>saida[i].pagar; 
                       saida[i].receber = 0;                
               }
          
                     
               if(op==2){    
                     cout<<"\ninforme o valor da conta: ";
                     cin>>saida[i].receber;
                     saida[i].pagar = 0 ;
              
              } 
              
         }
    
    //laço para calculo dos dados final     
         for(i=0; i<x; i++){
         //condicional para o saldo anterior valer 0 na primeira vez que passar         
            if(i==0){
                saida[i].saldoAnterior=0;         
            }
            else{
                saida[i].saldoAnterior = saida[i-1].saldo;     
            }
             //o saldo total será o que o usuario tem para receber mais o saldo anterior
             
             saida[i].saldoTotal = saida[i].receber + saida[i].saldoAnterior;
             //o saldo total de despesas são o que o usuário declarou em contas a pagar
             saida[i].totalDespesas = saida[i].pagar;
             //o saldo é o resultado do saldo total menos as contas a pagar
             saida[i].saldo = saida[i].saldoTotal - saida[i].pagar;
             
             
         
                  
         }
         
         //ordenaçao de vetor pelo metodo buble-sort (bolha)
         for(j=1; j<x; j++){ 
              for(i=x-1; i>=j; i--){
              //condicional para ordenar o menor ano informado
                  if(saida[i].ano < saida[i-1].ano){
                       
                       
                       //troca das pocições dos vetores caso a condicional seja verdadeira
                                                     
                       aux1 = saida[i].mes;
                       saida[i].mes = saida[i-1].mes;
                       saida[i-1].mes = aux1; 
                       
                       
                       aux1 = saida[i].ano;
                       saida[i].ano = saida[i-1].ano;
                       saida[i-1].ano = aux1;
                       
                       
                       aux = saida[i].saldoAnterior;
                       saida[i].saldoAnterior = saida[i-1].saldoAnterior;
                       saida[i-1].saldoAnterior = aux;
                       
                       
                       aux = saida[i].saldoTotal;
                       saida[i].saldoTotal = saida[i-1].saldoTotal;
                       saida[i-1].saldoTotal = aux; 
                       
                       
                       aux = saida[i].totalDespesas;
                       saida[i].totalDespesas = saida[i-1].totalDespesas;
                       saida[i-1].totalDespesas = aux;
                       
                       
                       aux = saida[i].saldo;
                       saida[i].saldo = saida[i-1].saldo;
                       saida[i-1].saldo = aux;
                       
                       
                       
                             
                  }       
                  //caso não haja um ano menor informado irá ordenar pelo menor mês
                  else
                  //condicional para ordenar o menor mês informado
                    if(saida[i].ano == saida[i-1].ano){
                         if(saida[i].mes < saida[i-1].mes){ 
                                  
                             aux1 = saida[i].mes;
                             saida[i].mes = saida[i-1].mes;
                             saida[i-1].mes = aux1; 
                       
                       
                             aux1 = saida[i].ano;
                             saida[i].ano = saida[i-1].ano;
                             saida[i-1].ano = aux1;
                       
                            
                             
                                                                                                                              
                             aux = saida[i].saldoAnterior;
                             saida[i].saldoAnterior = saida[i-1].saldoAnterior;
                             saida[i-1].saldoAnterior = aux;
                             
                        
                             
                       
                             aux = saida[i].saldoTotal;
                             saida[i].saldoTotal = saida[i-1].saldoTotal;
                             saida[i-1].saldoTotal = aux; 
                       
                       
                             aux = saida[i].totalDespesas;
                             saida[i].totalDespesas = saida[i-1].totalDespesas;
                             saida[i-1].totalDespesas = aux;
                       
                       
                             aux = saida[i].saldo;
                             saida[i].saldo = saida[i-1].saldo;
                             saida[i-1].saldo = aux; 
                       }
                             
                  }
              }
         }
         
         for(i=0;i<x;i++){ 
             cout<<"\nMes inicial da conta: "<<saida[i].mes<<"   ";
             cout<<"\nAno inicial da conta: "<<saida[i].ano<<"   ";
             cout<<"\nSaldo Anterior: "<<saida[i].saldoAnterior<<"   ";
             cout<<"\nSaldo Total: "<<saida[i].saldoTotal<<"   ";
             cout<<"\nTotal de despesas: "<<saida[i].totalDespesas<<"   ";
             cout<<"\nSaldo: "<<saida[i].saldo<<"   ";
             cout<<"\n\n\n";          
              
         }
         
    system("pause");
    }
    o código ainda não está pronto pois também falta somar as parcelas
    se alguém tiver alguma ideia de como fazer isso a ajuda também é bem vinda ^^

    e desde já agradeço

  • Font Size
    #2
    Fiz um exemplo bem bonitinho em C (169 linhas (achei que a dúvida era de C)).Dá uma olhada e tenta reestruturar seu código.Não precisa usar o mesmo container (Double-Linked list, usei porque achei que seria um exemplo legal) e nem o mesmo algoritmo (pode manter seu bubble-sort).
    Segue:
    Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
    Revisa os conceitos de novo, principalmente o algoritmo do bubble-sort.
    Se ainda assim tiver dúvida volta aqui com o código reestruturado.
    Quero ver suor.

    Comment


    • Font Size
      #3
      Postado Originalmente por singur Ver Post
      Fiz um exemplo bem bonitinho em C (169 linhas (achei que a dúvida era de C)).Dá uma olhada e tenta reestruturar seu código.Não precisa usar o mesmo container (Double-Linked list, usei porque achei que seria um exemplo legal) e nem o mesmo algoritmo (pode manter seu bubble-sort).
      Segue:
      Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
      Revisa os conceitos de novo, principalmente o algoritmo do bubble-sort.
      Se ainda assim tiver dúvida volta aqui com o código reestruturado.
      Quero ver suor.

      vou dar uma olhada melhor mas vi que tem algumas funções que ainda não conheço mas vou procurar no google cada uma delas e tentar passar pra c++ e ai no final posto aqui
      e se surgiu outra duvida posto aqui novamente rsrs

      e obrigado pela ajuda

      Comment


      • Font Size
        #4
        consegui rsrs ^^
        procurando sobre as funções que tu postou eu achei uns artigos bem legais que me ajudaram

        Código:
        #include <iostream.h>
        
        int main(){
        
        int x, i,op, parcela, j, aux1;
        float aux;
        char descricao[50];
        
        //leitura de numero de contas que o usuário irá declarar
        cout<<"numeros de contas \n";
        cin>>x;
        //declaraçao da struct que irá armazenar dados para impressão final
        struct dados{
               
               int mes;
               int ano;
               float saldoAnterior;
               float saldoTotal;
               float totalDespesas;
               float saldo;
               float pagar, receber;
        };
        
        
        
        struct dados saida[x];
        /*laço para leitura dos dados e salvando no vetor da struct 
        enquanto o i valer menos que o numero de contas que o usuário informou */    
             for(i=0;i<x;i++){ 
               
               cout<<"\n\nescolha opcao";
               cout<<"\n1- conta a pagar";    
               cout<<"\n2- conta a receber\n";
               cin>>op;
               
                  cin.sync();
                  cout<<"\nInforme a descricao da conta: ";
                  gets(descricao);
                  cout<<"\ninforme o mes inicial da conta: ";
                  cin>>saida[i].mes;
                  cout<<"\ninforme o ano inicial da conta: ";
                  cin>>saida[i].ano;
                  cout<<"\ninforme a quantidade de parcelas: ";
                  cin>>parcela; 
                  
              //condicional para saber se a conta é a pagar ou a receber
                   
                   if(op==1){   
                          
                          cout<<"\ninforme o valor da conta: ";
                          cin>>saida[i].pagar; 
                           saida[i].receber = 0;                
                   }
              
                         
                   if(op==2){    
                         cout<<"\ninforme o valor da conta: ";
                         cin>>saida[i].receber;
                         saida[i].pagar = 0 ;
                  
                  } 
                  
             }
                   
             struct dados temp;
             //ordenaçao de vetor pelo metodo buble-sort (bolha)
             for(j=1; j<x; j++){ 
                  for(i=x-1; i>=j; i--){
                  //condicional para ordenar o menor ano informado
                      if(saida[i].ano < saida[i-1].ano){
                           
                           temp = saida[i];
                           saida[i] = saida[i-1];
                           saida[i-1] = temp;
                                 
                      }       
                      //caso não haja um ano menor informado irá ordenar pelo menor mês
                      else{
                      //condicional para ordenar o menor mês informado
                            if(saida[i].ano == saida[i-1].ano){
                                   if(saida[i].mes < saida[i-1].mes){ 
                                      
                                      temp = saida[i];
                                      saida[i] = saida[i-1];
                                      saida[i-1] = temp;
                                   }                         
                            }
                      }
                  }
             }                   
                      
        
        //laço para calculo dos dados final     
             for(i=0; i<x; i++){
             //condicional para o saldo anterior valer 0 na primeira vez que passar         
                if(i==0){
                    saida[i].saldoAnterior=0;         
                }
                else{
                    saida[i].saldoAnterior = saida[i-1].saldo;     
                }
                 //o saldo total será o que o usuario tem para receber mais o saldo anterior
                 
                 saida[i].saldoTotal = saida[i].receber + saida[i].saldoAnterior;
                 //o saldo total de despesas são o que o usuário declarou em contas a pagar
                 saida[i].totalDespesas = saida[i].pagar;
                 //o saldo é o resultado do saldo total menos as contas a pagar
                 saida[i].saldo = saida[i].saldoTotal - saida[i].pagar;
                 
                 if(saida[i].saldo<0){
                      saida[i].saldo=saida[i].saldo+(saida[i].saldo*0.1);
                 }                                 
                      
             }
             for(i=0;i<x;i++){ 
                 cout<<"\nMes inicial da conta: "<<saida[i].mes<<"   ";
                 cout<<"\nAno inicial da conta: "<<saida[i].ano<<"   ";
                 cout<<"\nSaldo Anterior: "<<saida[i].saldoAnterior<<"   ";
                 cout<<"\nSaldo Total: "<<saida[i].saldoTotal<<"   ";
                 cout<<"\nTotal de despesas: "<<saida[i].totalDespesas<<"   ";
                 cout<<"\nSaldo: "<<saida[i].saldo<<"   ";
                 cout<<"\n\n\n";
                 if(saida[i].saldo<0){
                      cout<<"ha um adicional de 10% de juros para saldos negativos\n\n\n";
                 }
        agora a minha duvida é como vou somar as parcelas e imprimir
        estou pensando em fazer um laço de repetição pra primeiro comparar o vetor pra ver se tem mes e ano iguais para somar tudo na impressão agora depois eu to pensando ainda
        tem alguma ideia?

        Comment


        • Font Size
          #5
          Ali no meu código em mostra_dados_financeiros faltou checar se it é nulo no inicio da função.
          Se o objetivo é exibir o saldo total por um periodo de tempo (como mes ou ano), você poderia fazer como eu fiz pra exibir os saldos, mas no caso do seu programa, em que os saldos não são previamente calculados, você teria a condição do mes do dado atual (it->mes, por exemplo) ser diferente do mes registrado pros elementos anteriores.
          Código:
          //exemplo tosco
          void mostra_dados_financeiros_2(DadosFinanceiros * it) {
              if(!it)
                  return;
              //gambiarra pra nao ter uma terceira variavel (pode ser necessaria)
              char cur_mes = it->mes+13;
              unsigned cur_ano = it->ano-1;
              float saldo_ano = 0;
              float saldo_mes = 0;
              for(;it != 0;it = it->next) {
                  if(cur_ano != it->ano) {
                      //...
                  }
                  if(cur_mes != it->mes) {
                      //...          
                  }
              }
          }
          Reorganiza um pouco mais, tenta pegar as idéias pra manter o código mais curto e limpo.

          Comment

          X
          Working...
          X