Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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]);
}//-------------------------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]);
}
*/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.
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?
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).
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
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:lucasSalario: 200 comissao: 200 Nome: andre Salario: 200 comissao: 200
Saida:
Salario do mes: 400.00lucasSalario 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);
}
}
}//-------------------------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;
}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; //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");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
Salario no Mes: R$ 80000.00
Salario no Mes: R$ 700.00
Salario no Mes: R$ 950.00
Salario no Mes: R$ 1000.00
Salario no Mes: R$ 1050.00
Salario no Mes: R$ 1300.00
.
.
.
Salario no Mes: R$ 80000.00
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.
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
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?