Ir para conteúdo

POWERED BY:

Arquivado

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

MatheusSilva

Problema com ordenação

Recommended Posts

ola amigos, bom, dessa vez estou com um problema, o programa esta parando de funcionar e nao faço a menor ideia do que seja o problema.

 

Bom, deixa eu contar ao que se destina o programa.

Tenho varias entradas, onde na 1 linha é um nome, na 2 um salario tipo float, e na 3 a comissao.

o recebimento de dados acaba quando for achado a palavra FIM.

 

Depois tenho que organizar com o salario de maneira crescente, e o nome de cada funcionario que tem aquele respectivo salario

Salario no Mes: R$ 350.00- Pedro de Aparecida Francisco
Salario no Mes: R$ 1000.00- Arlette Castanheira- Wilson Rogerio

 

em fim, aqui esta meu codigo.

 

 

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <ctype.h>
#define nCOL 2
#define nLIN 1001

//struct funciona como vetor tbm, pode ser feito com: struct nome variavel = {CAMPO1, CAMPO2, CAMPO3}


int main(){

struct pagamentos{
    char nome[1000];
    float salario;
    float comissao;
    float salarioTotal;
    char aux[1000];
};
    //matrisNome[Linhas][COL];
    //char vetor[1001];

    //variaveis para o
    int i,j,k,m;

    int tamanho = 0;
    float salarioBase = 0.0;
    char vetor[1001];


    struct pagamentos pg[100];

while(1){
    k=0;
    m=0;
    //fgets(vetor, 1001, stdin);
    //tamanho = strlen(pg.nome);


    printf("Nome:");

    fflush(stdin);
    fgets(pg[k].nome, 1000, stdin);

    printf("Salario: ");
    scanf("%f", &pg[k].salario);

    printf("comissao: ");
    scanf("%f", &pg[k].comissao);

    //aqui é pra arrumar o problema do \n no buffer que fica depois do scanf
    getchar();


        //if((tamanho >=3) && (pg.nome[0] == 70) && (pg.nome[1] == 73) && (pg.nome[2] == 77)){
           //printf("Caractere achado FIM \n");
        //break;
        //}
        pg[k].salarioTotal = pg[k].salario + pg[k].comissao;
             //salarioBase = pg[i].salario + pg[i].comissao;
            //printf("a%4.2fa", pg[k].salario + pg[k].comissao);

//------------Bubble sort do nome---------------//
    for(i=0;i<1001;i++){
        for(j=i+1;j<1001;j++){
            if(strcmp(pg[j].nome, pg[i].nome)==-1){
                strcpy(pg[i].aux, pg[i].nome);
                strcpy(pg[i].nome, pg[j].nome);
                strcpy(pg[j].nome, pg[i].aux);

            }
        }
 }

/*para printar
    printf("Strings ordenadas: \n");
    for(i=0;i<10;i++){
        printf("String %d: %s", i, vetor[i]);
    }
*/
//------------FIM Bubble sort nome--------------//

//-------------------------BUBBLE SORT------------------//
int l,c,u;
float temp;
    for(l=0;l<60;l++){
        for(u=0;u<60;u++){
            if(pg[l].salarioTotal < pg[u].salarioTotal){
                temp = pg[l].salarioTotal;
                pg[l].salarioTotal = pg[u].salarioTotal;
                pg[u].salarioTotal = temp;

            }
        }
    }

/*//parte pra printar
 for(i=0;i<4;i++){
    printf("%d", vetor[i]);

 }
 */
//------------------------FIM---------------------------//

m++;
k++;
}//while

//------Parte de printagem--------//
printf("Folha de Pagamento\n");

int q;
 for(i=0;i<60;i++){
    printf("Salario no Mes: R$ %4.2f", pg[i].salarioTotal);
    printf("\n");
    for(q=0;q<1001;q++){
        printf("- %s", pg[q].nome);
        printf("\n");
    }

 }


//------Fim parte da printagem------//

system("pause");
return 0;
}
 
 

 

espero que possao me ajudar, e se eu tiver feito algo errado, por gentileza me corrijam.

 

obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tire aquele fflush(stdin) dali. Isso, segundo o padrão ISO, tem comportamento indefinido. Aparentemente só funciona no Windows.

 

 

scanf("%f", &pg[k].comissao);
 
//aqui é pra arrumar o problema do \n no buffer que fica depois do scanf
getchar();

 

Eu trocaria por

 

 

fgets(tmp_buffer, 5, stdin); // tmp_buffer é um array de char
tmp_buffer[strlen(tmp_buffer)-1] = '\0';
sscanf(tmp_buffer, "%.2f", &pg[k].comissao);

 

 

 

pg[k].salarioTotal = pg[k].salario + pg[k].comissao;

 

A comissão não é sobre algo, tipo venda?

 

Se os dados estão todos num mesmo lugar e a ordenação é pelo salário, por que vc está ordenando pelo nome também?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, nesse caso a comissão séria passada pelo usuário tbm.

Eu preciso pra ser daquele jeito que eu demonstrei, pra ordenar o salário é o nome segundo o salário não estaria certo ordenar pelos 2?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda assim está estranho.

Se vc aplicar a ordenação à lista inteira, a segunda operação vai "acabar" com o resultado da primeira.

 

A única coisa que faz sentido p/ mim é ordenar pelo nome se os elementos possuírem o mesmo salário. Isso seria um processamento posterior realizado num subconjunto da lista (eventualmente na lista toda se todo mundo receber a mesma coisa).

Compartilhar este post


Link para o post
Compartilhar em outros sites

na vdd seria ordenado pelo salario total, que é o salario + comissao, e depois tenho que ordenar segundo o salario, e dentro dessa ordenação falar quem q recebe o mesmo salario.

 

Entrada:

 

 

 

Pedro Paulo1000.002000.00Ana Maria da Silva5000.00100.00Luis Meira3000.000.00Guilherme Coelho2500.00500.00

 

a saida teria que ser:

 

 

Salario no Mes: R$ 3000.00- Guilherme Coelho- Luis Meira- Pedro PauloSalario no Mes: R$ 5100.00- Ana Maria da Silva

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe pelo double post, mas nao consegui editar o post que fiz.

 

só uma OBS: esses exercicios sao sistemas hipoteticos.

 

Bom, agora estou tendo problema pra mostrar os nomes e o salario ao mesmo tempo, mas agora estou tendo dificuldades para conseguir imprimir.

 

Eu fiz assim

 

 

CONSIDERAR CODIGO CORRIGIDO MAIS EMBAIXO

 

Coloquei uma variavel de controle qtd pra de fora eu conseguir obter o numero de vezes que o loop repetiu, ja que o que determinara o fim do loop é uma palavra FIM, essa parte ja fiz.

 

Ao fazer no lado de fora um FOR pra poder mostrar o salario, eu até consigo mostrar 1 salarioTOTAL, mesmo que eu digite 2 funcionarios

 

Onde poderia estar o erro disso?

 

 

Pensei em colocar o pg.nome dentro desse for tbm, pra ele pesquisar o nome do funcionario segundo a posição do salario, ja que ele tem que ordenar por salarios, agrupar as pessoas que tem o mesmo salario, e nesse agrupamento ainda ordenar alfabeticamente, mas nao esta dando certo.

 

Obrigado.

 

EDIT##############

Aparentemente consertei o problema, ele printa parcialmente correto:

 

Entrada:

Nome:lucas
Salario: 200
comissao: 200
Nome: andre
Salario: 200
comissao: 200

 

Saida:

 

Salario do mes: 400.00lucas
Salario do mes: 400.00andre

 

apesar da formatação estar errada esse nao é meu problema, o que eu quero que ele faça é trazer só uma vez o salario, e depois os nomes, mas mesmo assim ele nao esta ordenando alfabeticamente aparentemente.

 

 

codigo corrigido:

 

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <ctype.h>
int main(){

struct pagamentos{
    char nome[1000];
    float salario;
    float comissao;
    float salarioTotal;
    char aux[1000];
};
    int i,j,k,m;
    int tamanho = 0;
    float salarioBase = 0.0;
    char vetor[1001];
    int qtd;
    qtd = 0;
    struct pagamentos pg[1001];
    k=0;

while(1){


    printf("Nome:");

    fflush(stdin);
    fgets(pg[k].nome, 1001, stdin);

    //Quebra se for FIM
    tamanho = strlen(pg[k].nome);
    if((tamanho >= 3) && (pg[k].nome[0] == 70) && (pg[k].nome[1] == 73) && (pg[k].nome[2] == 77)){
        break;
     }

    printf("Salario: ");
    scanf("%f", &pg[k].salario);

    printf("comissao: ");
    scanf("%f", &pg[k].comissao);

    //aqui é pra arrumar o problema do \n no buffer que fica depois do scanf
    getchar();


        pg[k].salarioTotal = pg[k].salario + pg[k].comissao;

//------------Bubble sort do nome---------------//
    for(i=0;i<k;i++){
        for(j=0;j<k;j++){
            //char aux[1001];
            if(strcmp(pg[j].nome, pg[i].nome) < 0){
                strcpy(pg[i].aux, pg[j+1].nome);
                strcpy(pg[i].nome, pg[j].nome);
                strcpy(pg[j].nome, pg[i].aux);

            }
        }
 }
//------------FIM Bubble sort nome--------------//

//-------------------------BUBBLE SORT------------------//
int l,c,u;
float temp;
    for(l=0;l<k;l++){
        for(u=0;u<k;u++){
            if(pg[l].salarioTotal < pg[u].salarioTotal){
                temp = pg[l].salarioTotal;
                pg[l].salarioTotal = pg[u].salarioTotal;
                pg[u].salarioTotal = temp;

            }
        }
    }

//------------------------FIM---------------------------//

k++;
}//while

//------Parte de printagem--------//
printf("Folha de Pagamento\n");
for(i=0;i<k;i++){
    printf("Salario do mes: %4.2f", pg[i].salarioTotal);
    printf("%s", pg[i].nome);

}

//------Fim parte da printagem------//
stem("pause");
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora me surgiu outro problema dentro da ordenação, ele nao esta ordenando um nome, porem é só esse nome, que tambem nao esta agrupando-se com a mesma quantia de salario.

 

eis o codigo:

 

 

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(){
struct pagamentos{
    char nome[1000];
    float salario;
    float comissao;
    float salarioTotal;
    char aux[1000];
};
    int i,j,m;
    int k;
    int tamanho = 0;
    struct pagamentos pg[1001];
    k=0;
while(1){
    //printf("Nome:");
    fgets(pg[k].nome, 1001, stdin);
    //Quebra se for FIM
    tamanho = strlen(pg[k].nome);
    if((tamanho >= 3) && (pg[k].nome[0] == 70) && (pg[k].nome[1] == 73) && (pg[k].nome[2] == 77)){
            break;
         }
    //printf("Salario:");
    scanf("%f", &pg[k].salario);
    getchar();
    //printf("comissao:");
    scanf("%f", &pg[k].comissao);
    getchar();

    pg[k].salarioTotal = pg[k].salario + pg[k].comissao;
k++;

int l,c,u;
struct pagamentos temp;
for(l = k; l > 0; l--){
  for(u = 0; u < k; u++){
    if(pg[l].salarioTotal < pg[u].salarioTotal || (pg[l].salarioTotal == pg[u].salarioTotal && strcmp(pg[l].nome, pg[u].nome) < 0)){
          temp = pg[l];
          pg[l] = pg[u];
          pg[u] = temp;
    }
  }
}

}//while


//------Parte de printagem--------//
printf("Folha de Pagamento");
printf("\n");
double auxiliar = -1; /* ninguem tem salario negativo! */
for (i = 0; i < k; i++) {
    if (pg[i].salarioTotal != auxiliar) {
            printf("\nSalario no Mes: R$ %4.2f\n", pg[i].salarioTotal); // <------------
            auxiliar = pg[i].salarioTotal;
    }
    printf("- %s", pg[i].nome);
}

//------Fim parte da printagem------//
//system("pause");
return 0;
}

 

a saida ta sendo essa:

Folha de Pagamento

Salario no Mes: R$ 350.00
- Pedro de Aparecida Francisco Carlos Xavier de Joaquim Gonzaga Pascoal Cipriano de Braganca e Bourbon

Salario no Mes: R$ 80000.00
- Farokh Bommi Bulsara

Salario no Mes: R$ 700.00
- Arlington Florencio
- Francislene Coutinho

Salario no Mes: R$ 950.00
- Lilian Alfredo

Salario no Mes: R$ 1000.00
- Wilson Rogerio

Salario no Mes: R$ 1050.00
- Dante Aliguieri Pereira

Salario no Mes: R$ 1300.00
- Arlette Castanho
- Luis Coelho
- Luis Corridor

.

.

.

Salario no Mes: R$ 80000.00
- Senor Abravanel

AQUI ERA PRA TAR O Farokh Bommi Bulsara TAMBEM

 

ja vasculhei o codigo de cima abaixo e nao faço a menor ideia do erro, isso ta me intrigando muito.

 

obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.