Ir ao conteúdo

ordenando vetores de struct C++


leonp

Posts recomendados

Postado

Boa tarde

Estou com uma dificuldade em realizar a ordenação de uma struct aonde tenho que ordenar pelo ano e mes e imprimir o resultado ordenado

tenho que fazer outras solicitações mas estou com essa duvida no momento

segue o codigo


#include <iostream.h>

int main(){

int x, i,op, parcela, j, aux1;
float aux;
char descricao[50];


cout<<"numeros de contas \n";
cin>>x;

struct dados{

int mes;
int ano;
float saldoAnterior;
float saldoTotal;
float totalDespesas;
float saldo;
float pagar, receber;
};


struct dados saida[x];

for(i=0;i<x;i++){

cout<<"\n\nescolha opcao";
cout<<"\n1- conta a pagar";
cout<<"\n2- conta a receber\n";
cin>>op;

if(op==1){

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 o valor da conta: ";
cin>>saida[i].pagar;
cout<<"\ninforme a quantidade de parcelas: ";
cin>>parcela;
saida[i].receber = 0;

}
if(op==2){

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 o valor da conta: ";
cin>>saida[i].receber;
cout<<"\ninforme a quantidade de parcelas: ";
cin>>parcela;
saida[i].pagar = 0 ;
}




}
for(j=1; j<x; j++){
for(i=x-1; i>=j; i--){
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++){
saida[i].saldoAnterior = saida[i-1].saldo;
if(i==0){
saida[0].saldoAnterior=0;
}
saida[i].saldoTotal = saida[i].receber + saida[i].saldoAnterior;
saida[i].totalDespesas = saida[i].pagar;
saida[i].saldo = saida[i].saldoTotal - saida[i].pagar;

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

trecho de ordenação


for(j=1; j<x; j++){
for(i=x-1; i>=j; i--){
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;

}
}
}

pelo codigo ordenou o mes porém os outros dados não ordenaram

ex:

informei duas contas

1º conta...

conta a pagar:

mes inicial: 10

ano 2013

valor da conta: 500

2 conta

conta a receber

mes inicial:8

ano : 2012

valor da conta:1000

a impressão correta seria

mes inicial:8

ano inicial: 2012

saldo anterior: 0

total saldo:1000

total despesas:0

saldo:1000

mes inicial:10

ano inicial:2013

saldo anterior:1000

total saldo:1000

total despesas:500

saldo:500

mas ao invés disse ordena o mes e ano na struct deixando os outros valores e a impressão fica assim

mes inicial:8

ano inicial: 2012

saldo anterior: 0

total saldo:0

total despesas:500

saldo:-500

mes inicial:10

ano inicial:2013

saldo anterior:-500

total saldo:1000

total despesas:0

saldo:500

alguem poderia me explicar aonde errei?

obs: não pode usar função de ordenar como o qsort.

desde já agradeço

Postado

até faz sentido essa impressão,ja que se voce esta devendo então esta com o saldo negativo

mas se voce quer uma impressão onde o saldo negativo nao apareça na sua conta à receber,voce deve tirar isso

"

aux = saida.saldoAnterior;

saida.saldoAnterior = saida[i-1].saldoAnterior;

saida[i-1].saldoAnterior = aux;

"

pois assim voce esta diminuindo qualquer valor do saldo digitado anteriormente,pelo atual(independente se é de contas a pagar ou receber).

o que voce pode fazer é criar um array só para contas a receber e outro só para contas a pagar e outro só para contas à receber como,com certeza isso vai facilitar as coisas pra voce

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!