msousa7 Posted February 26, 2012 at 04:43 PM Report Share #441212 Posted February 26, 2012 at 04:43 PM #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> /*Painel de Controlo do Usuário Pouco Avançado*/ //Instruções: Altere o numero [MAX(numero)]. Este numero é o numero de registos que voce pode introduzir no programa #define MAX 4 /*--------------------------------------------*/ #define ERRO 0 #define OK 1 #define F 0 #define V 1 typedef struct { int dia; int mes; int ano; } t_data; typedef struct { int id; char nome[30]; t_data dnasc; char sexo; double salario; } t_pessoa; /*Chama de Funções - Estão todas chamadas no caso do editor do programa queira alterar a posição das funções*/ int controlador=0; int inserir(int n, t_pessoa funcionarios1[], int *elems, int cap); void consultar(t_pessoa funcionarios2[]); void alterar(t_pessoa funcionarios3[],int cont8); void sub(t_pessoa funcionarios4[],int cont1); void ord_id(t_pessoa funcionarios6[], int cont3); void ord_nome(t_pessoa funcionarios7[], int cont4); void ord_sal(t_pessoa funcionarios6[], int cont3); int remover(int n,t_pessoa funcionarios6[], int *elems); void total_salarios(t_pessoa funcionarios8[], int cont5); int verificador_id (t_pessoa funcionarios[],int cont10,int id); /*--------------------------------------------------------------------------------*/ int main() { system("color 1F"); int sair,h=0,id[MAX],retorno; int op,i, cont=0,q; char opr; int elementos = 0,identificador; t_pessoa funcionarios[MAX]; if(MAX==0) { system("color 4F"); printf("\n\n\n\t\t\t ERRO em #define MAX (numero)\n"); printf("\t Altere no programa a contante MAX para um numero superior a 0!\n\n\n\n"); system("pause"); } if(MAX!=0) { MENUP:printf("\n----- Menu Principal -----------------------------------------------------------\n"); printf(" 1 - Inserir registos\n"); printf(" 2 - Consultar Registo\n"); printf(" 3 - Alterar Registos\n"); printf(" 4 - Listar Registos\n"); printf(" 5 - Remover Registo\n"); printf(" 6 - Total de salarios pagos pela empresa\n"); printf(" 7 - Sair\n\n"); printf("\t\t\t\t\t Digite 112 para recorrer a ajuda!\n"); printf("--------------------------------------------------------------------------------\n"); OPMP:printf("> Insira a Operacao:"); scanf("%d", &op); printf("\n\n"); switch(op) { case 1: system("cls"); ID:printf("\n----- Introducao de dados ------------------------------------------------------"); printf("\nIntroduza o identificador do registo: "); scanf("%d", &identificador); retorno=verificador_id (funcionarios,elementos,identificador); if(retorno==0) { printf("\n\t\tO Identificador Introduzido ja esta em uso!\n\n"); printf("\n--------------------------------------------------------------------------------\n"); system("pause"); system("cls"); goto ID; } else if(!inserir(identificador,funcionarios, &elementos, MAX)) printf("\nCapacidade esgotada.\n"); if(controlador==0) { printf("\n--------------------------------------------------------------------------------\n"); RE:printf("Deseja introduzir novos registos(s/n)?"); fflush(stdin); scanf("%c",&opr); if(opr=='s') { system("cls"); goto ID; } else if(opr=='n') { system("cls"); goto MENUP; } else printf("\t\t\tA operacao inserida e invalida!\n\n"); goto RE; break; } system("cls"); goto MENUP; break; case 2: system("cls"); consultar(funcionarios); system("cls"); goto MENUP; break; case 3: system("cls"); alterar(funcionarios,elementos); system("cls"); goto MENUP; break; case 4: system("cls"); sub(funcionarios,elementos); system("cls"); goto MENUP; break; case 5: system("cls"); printf("\n----- Menu Remover -------------------------------------------------------------"); printf("\nIntroduza o identificador do registo que pretende remover: "); scanf("%d", &identificador); if(!remover(identificador,funcionarios, &elementos)) printf("\n\n\t\tO Identificador Introduzido e Invalido ou nao existe!\n\n"); printf("\n--------------------------------------------------------------------------------\n"); system("pause"); system("cls"); goto MENUP; break; case 6: system("cls"); printf("\n----- Total de Salarios --------------------------------------------------------\n"); total_salarios(funcionarios,elementos); printf("\n--------------------------------------------------------------------------------\n"); system("pause"); system("cls"); goto MENUP; break; case 7: printf("Deseja mesmo sair? (s/n):"); fflush(stdin); scanf("%c",&sair); if(sair=='n') { system("cls"); goto MENUP; } break; default: printf("A Operacao inserida e invalida!\n\n"); goto OPMP; break; } } } int verificador_id (t_pessoa funcionarios[],int cont10,int id) { int contador,i=0; for(contador=0; contador<cont10;contador++) { if(id==funcionarios[contador].id) return i; } if(i!=0) return 1; } int inserir(int n,t_pessoa funcionarios1[], int *elems, int cap){ int i, j, id1; if (*elems == cap) { printf("\n\t\t O Programa nao suporta mais resgistos! \n\t Altere as definicoes do programa para adicionar mais registos!\n\n\n"); controlador=1; printf("--------------------------------------------------------------------------------\n"); system("pause"); } if(controlador==0) { if (*elems == 0){ funcionarios1[0].id=n; printf("Introduza o nome:"); fflush(stdin); gets(funcionarios1[0].nome); printf("Intruduza a data de nascimento(dd/mm/aaaa):"); scanf("%d/%d/%d", &funcionarios1[0].dnasc.dia,&funcionarios1[0].dnasc.mes,&funcionarios1[0].dnasc.ano); SEXX:printf("Introduza o sexo(m/f):"); fflush(stdin); scanf("%c", &funcionarios1[0].sexo); if(funcionarios1[0].sexo!='m' && funcionarios1[0].sexo!='f') { printf("\t\t\tO Sexo Inserido e invalido!\n"); goto SEXX; } printf("Introduza o salario:"); scanf("%lf", &funcionarios1[0].salario); (*elems)++; return OK; } } for(i = 0; i < (*elems); i++) if(funcionarios1[i].id > id1) break; for(j = (*elems); j > i; j--) funcionarios1[j].id = funcionarios1[j-1].id; if(controlador==0) { funcionarios1[i].id=n; printf("Introduza o nome:"); fflush(stdin); gets(funcionarios1[i].nome); printf("Intruduza a data de nascimento(dd/mm/aaaa):"); scanf("%d/%d/%d", &funcionarios1[i].dnasc.dia,&funcionarios1[i].dnasc.mes,&funcionarios1[i].dnasc.ano); SEX:printf("Introduza o sexo(m/f): "); fflush(stdin); scanf("%c", &funcionarios1[i].sexo); if(funcionarios1[i].sexo!='m' && funcionarios1[i].sexo!='f') { printf("\t\t\tO Sexo Inserido e invalido!\n"); goto SEX; } printf("Introduza o salario: "); scanf("%lf", &funcionarios1[i].salario); (*elems)++; return OK; } } void consultar(t_pessoa funcionarios2[]) { int i, id1,op,ver=0; char opr; CON:printf("Introduza o numero de identificacao do registo a consultar:"); scanf("%d", &id1); for(i=0;i<MAX;i++) { if(funcionarios2[i].id==id1) { printf("\n----- Dados do Registo ---------------------------------------------------------\n"); printf("Nome: %s\n", funcionarios2[i]. nome); printf("Data de nascimento: %d/%d/%d\n", funcionarios2[i].dnasc.dia, funcionarios2[i].dnasc.mes, funcionarios2[i].dnasc.ano); if(funcionarios2[i].sexo=='m') printf("Sexo: Masculino\n"); else if(funcionarios2[i].sexo=='f') printf("Sexo: Feminino\n"); else printf("Sexo: Invalido\n"); printf("Salario: %.2lf\n", funcionarios2[i].salario); printf("\n--------------------------------------------------------------------------------\n"); do { printf("Deseja consultar mais algum registo(s/n)?"); fflush(stdin); scanf("%c",&op); }while(op!='s' && op!='n'); if(op=='s') { system("cls"); goto CON; } else if(op=='n') { system("cls"); ver=ver+1; } } } if(ver!=1) { printf("\n\t O Identificador Introduzido e enixistente ou invalido!\n\n"); system("pause"); ver=0; } } void alterar(t_pessoa funcionarios3[],int cont8) { int contador, id1, op,ver=0; char ald,alr; ver=0; ALR:printf("\nIntroduza o identificador do registo a alterar:"); scanf("%d", &id1); for(contador=0;contador<MAX;contador++) { if(funcionarios3[contador].id==id1) { ver++; system("cls"); printf("\nO identificador %d contem os seguintes dados: \n\n",id1); printf("Nome: %s\n", funcionarios3[contador]. nome); printf("Data de nascimento: %d/%d/%d\n", funcionarios3[contador].dnasc.dia, funcionarios3[contador].dnasc.mes, funcionarios3[contador].dnasc.ano); if(funcionarios3[contador].sexo=='m') printf("Sexo: Masculino\n"); else if(funcionarios3[contador].sexo=='f') printf("Sexo: Feminino\n"); else printf("Sexo: Invalido\n"); printf("O salario: %.2lf\n", funcionarios3[contador].salario); ALD:printf("\n----- Menu Alterar -------------------------------------------------------------\n"); printf(" 1 - Nome\n"); printf(" 2 - Data de nascimento\n"); printf(" 3 - Sexo\n"); printf(" 4 - Salario\n"); printf("\n--------------------------------------------------------------------------------\n"); printf("> Introduza a Operacao:"); scanf("%d" ,&op); switch(op) { case 1: printf("Introduza o nome: "); fflush(stdin); gets(funcionarios3[contador].nome); break; case 2: printf("Intruduza a data de nascimento(dd/mm/aaaa) "); scanf("%d/%d/%d", &funcionarios3[contador].dnasc.dia,&funcionarios3[contador].dnasc.mes,&funcionarios3[contador].dnasc.ano); break; case 3: printf("Introduza o sexo(m/f): "); fflush(stdin); scanf("%c", &funcionarios3[contador].sexo); break; case 4: printf("Introduza o salario: "); scanf("%lf", &funcionarios3[contador].salario); break; } } } if(ver==0) { system("cls"); printf("\n----- Menu Alterar -------------------------------------------------------------\n"); printf("\n\t O Identificador Introduzido e inexistente ou invalido!\n\n"); printf("\n--------------------------------------------------------------------------------\n"); system("pause"); } if(ver!=0) { printf("\nPretende alterar mais algum dado(s/n)?:"); fflush(stdin); scanf("%c",&ald); if(ald=='s') { system("cls"); goto ALD; } else if(ald=='n') { printf("\nPretende alterar mais algum registo(s/n)?:"); fflush(stdin); scanf("%c",&alr); } if(alr=='s') { system("cls"); goto ALR; } else if(alr=='n') { printf("\n\n"); } } } int remover(int n,t_pessoa funcionarios6[], int *elems) { int encontrou = F; //sinaliza se n foi encontrado no vector int p, t; for(p = 0; p < (*elems); p++) if(funcionarios6[p].id == n) { encontrou = V; printf("\n\n\t\t\tRegisto Removido com sucesso!\n\n"); break; } if(!encontrou) return ERRO; for(t = p + 1; t < (*elems); t++) funcionarios6[t - 1] = funcionarios6[t]; (*elems)--; return OK; } void sub(t_pessoa funcionarios4[], int cont1) { int op; MENUL:printf("\n----- Listar Registos ----------------------------------------------------------\n"); printf(" 1 - Listar todos os registos\n"); printf(" 2 - Listar Registos ordenados pelo salario\n"); printf(" 3 - Listar Registos ordenados pelo nome\n"); printf(" 4 - Regressar ao Menu principal\n"); printf("\n--------------------------------------------------------------------------------\n"); OPL:printf("Introduza a Opcao: "); scanf("%d",&op); switch(op) { case 1: ord_id(funcionarios4, cont1); system("cls"); goto MENUL; break; case 2: ord_sal(funcionarios4, cont1); system("cls"); goto MENUL; break; case 3: ord_nome(funcionarios4, cont1); system("cls"); goto MENUL; case 4: break; default: printf("\t\t\tA Operacao inserida e invalida!\n\n"); goto OPL; getch(); } } void ord_id(t_pessoa funcionarios5[], int cont2) { int tempid,tempdia,tempmes,tempano, baixo,alto,separador,contador,primeiro=0,ultimo=(cont2-1),ver=0; char tempnome[30],tempsexo; system("cls"); double tempsalario; baixo = primeiro; alto = ultimo; separador = funcionarios5[(primeiro + ultimo) / 2].id; do { while(funcionarios5[baixo].id < separador) baixo++; while (funcionarios5[alto].id > separador) alto--; if(baixo <= alto) { tempid = funcionarios5[baixo].id; funcionarios5[baixo++].id = funcionarios5[alto].id; funcionarios5[alto--].id = tempid; tempsexo = funcionarios5[baixo].sexo; funcionarios5[baixo].sexo = funcionarios5[alto].sexo; funcionarios5[alto].sexo = tempsexo; tempsalario = funcionarios5[baixo].salario; funcionarios5[baixo].salario = funcionarios5[alto].salario; funcionarios5[alto].salario = tempsalario; strcpy(tempnome,funcionarios5[baixo].nome); strcpy(funcionarios5[baixo].nome,funcionarios5[alto].nome); strcpy(funcionarios5[alto].nome,tempnome); tempdia = funcionarios5[baixo].dnasc.dia; funcionarios5[baixo].dnasc.dia = funcionarios5[alto].dnasc.dia; funcionarios5[alto].dnasc.dia = tempdia; tempmes = funcionarios5[baixo].dnasc.mes; funcionarios5[baixo].dnasc.mes = funcionarios5[alto].dnasc.mes; funcionarios5[alto].dnasc.mes = tempmes; tempano = funcionarios5[baixo].dnasc.ano; funcionarios5[baixo].dnasc.ano = funcionarios5[alto].dnasc.ano; funcionarios5[alto].dnasc.ano = tempano; baixo++; alto--; } }while(baixo <= alto); if(primeiro < alto) { ord_id(funcionarios5,cont2); if(baixo < ultimo) ord_id(funcionarios5,cont2); } system("cls"); for(contador = 0;contador < cont2;contador++) { printf("--------------------------------------------------------------------------------\n"); ver=1; printf(" N Identificacao: %d\n", funcionarios5[contador].id); printf(" Nome: %s\n", funcionarios5[contador].nome); printf(" Data de nascimento: %d/%d/%d\n", funcionarios5[contador].dnasc.dia, funcionarios5[contador].dnasc.mes, funcionarios5[contador].dnasc.ano); if(funcionarios5[contador].sexo=='m') printf(" Sexo: Masculino\n"); if(funcionarios5[contador].sexo=='f') printf(" Sexo: Feminino\n"); printf(" Salario: %.2lf\n", funcionarios5[contador].salario); printf("--------------------------------------------------------------------------------\n"); } system("pause"); system("cls"); printf("\n"); system("cls"); } void ord_sal(t_pessoa funcionarios6[], int cont3) { int tempid,tempdia,tempmes,tempano, baixo,alto,contador,primeiro=0,ultimo=(cont3-1),ver=0; char tempnome[30],tempsexo; system("cls"); double tempsalario,separador; baixo = primeiro; alto = ultimo; separador = funcionarios6[(primeiro + ultimo) / 2].salario; do { while(funcionarios6[baixo].salario < separador) baixo++; while (funcionarios6[alto].salario > separador) alto--; if(baixo <= alto) { tempid = funcionarios6[baixo].id; funcionarios6[baixo++].id = funcionarios6[alto].id; funcionarios6[alto--].id = tempid; tempsexo = funcionarios6[baixo].sexo; funcionarios6[baixo].sexo = funcionarios6[alto].sexo; funcionarios6[alto].sexo = tempsexo; tempsalario = funcionarios6[baixo].salario; funcionarios6[baixo].salario = funcionarios6[alto].salario; funcionarios6[alto].salario = tempsalario; strcpy(tempnome,funcionarios6[baixo].nome); strcpy(funcionarios6[baixo].nome,funcionarios6[alto].nome); strcpy(funcionarios6[alto].nome,tempnome); tempdia = funcionarios6[baixo].dnasc.dia; funcionarios6[baixo].dnasc.dia = funcionarios6[alto].dnasc.dia; funcionarios6[alto].dnasc.dia = tempdia; tempmes = funcionarios6[baixo].dnasc.mes; funcionarios6[baixo].dnasc.mes = funcionarios6[alto].dnasc.mes; funcionarios6[alto].dnasc.mes = tempmes; tempano = funcionarios6[baixo].dnasc.ano; funcionarios6[baixo].dnasc.ano = funcionarios6[alto].dnasc.ano; funcionarios6[alto].dnasc.ano = tempano; baixo++; alto--; } }while(baixo <= alto); if(primeiro < alto) { ord_id(funcionarios6,cont3); if(baixo < ultimo) ord_id(funcionarios6,cont3); } system("cls"); for(contador = 0;contador < cont3;contador++) { printf("--------------------------------------------------------------------------------\n"); ver=1; printf(" N Identificacao: %d\n", funcionarios6[contador].id); printf(" Nome: %s\n", funcionarios6[contador].nome); printf(" Data de nascimento: %d/%d/%d\n", funcionarios6[contador].dnasc.dia, funcionarios6[contador].dnasc.mes, funcionarios6[contador].dnasc.ano); if(funcionarios6[contador].sexo=='m') printf(" Sexo: Masculino\n"); if(funcionarios6[contador].sexo=='f') printf(" Sexo: Feminino\n"); printf(" Salario: %.2lf\n", funcionarios6[contador].salario); printf("--------------------------------------------------------------------------------\n"); } system("pause"); system("cls"); printf("\n"); system("cls"); } void ord_nome(t_pessoa funcionarios7[], int cont4) { system("cls"); int tempid,tempdia,tempmes,tempano, baixo,alto,contador,primeiro=0,ultimo=(cont4-1),ver=0; char tempnome[30],tempsexo,separador[30]; double tempsalario; baixo = primeiro; alto = ultimo; strcpy(separador,funcionarios7[(primeiro + ultimo) / 2].nome); do { while(strcmp(funcionarios7[baixo].nome,separador)>0) baixo++; while (strcmp(funcionarios7[alto].nome,separador)<0) alto--; if(baixo <= alto) { tempid = funcionarios7[baixo].id; funcionarios7[baixo].id = funcionarios7[alto].id; funcionarios7[alto].id = tempid; tempsexo = funcionarios7[baixo].sexo; funcionarios7[baixo].sexo = funcionarios7[alto].sexo; funcionarios7[alto].sexo = tempsexo; tempsalario = funcionarios7[baixo].salario; funcionarios7[baixo].salario = funcionarios7[alto].salario; funcionarios7[alto].salario = tempsalario; strcpy(tempnome,funcionarios7[baixo].nome); strcpy(funcionarios7[baixo].nome,funcionarios7[alto].nome); strcpy(funcionarios7[alto].nome,tempnome); tempdia = funcionarios7[baixo].dnasc.dia; funcionarios7[baixo].dnasc.dia = funcionarios7[alto].dnasc.dia; funcionarios7[alto].dnasc.dia = tempdia; tempmes = funcionarios7[baixo].dnasc.mes; funcionarios7[baixo].dnasc.mes = funcionarios7[alto].dnasc.mes; funcionarios7[alto].dnasc.mes = tempmes; tempano = funcionarios7[baixo].dnasc.ano; funcionarios7[baixo].dnasc.ano = funcionarios7[alto].dnasc.ano; funcionarios7[alto].dnasc.ano = tempano; baixo++; alto--; } }while(baixo <= alto); if(primeiro < alto) { ord_id(funcionarios7,cont4); if(baixo < ultimo) ord_id(funcionarios7,cont4); } for(contador = 0;contador < cont4;contador++) { printf("--------------------------------------------------------------------------------\n"); ver=1; printf(" N Identificacao: %d\n", funcionarios7[contador].id); printf(" Nome: %s\n", funcionarios7[contador].nome); printf(" Data de nascimento: %d/%d/%d\n", funcionarios7[contador].dnasc.dia, funcionarios7[contador].dnasc.mes, funcionarios7[contador].dnasc.ano); if(funcionarios7[contador].sexo=='m') printf(" Sexo: Masculino\n"); if(funcionarios7[contador].sexo=='f') printf(" Sexo: Feminino\n"); printf(" Salario: %.2lf\n", funcionarios7[contador].salario); printf("--------------------------------------------------------------------------------\n"); } system("pause"); system("cls"); printf("\n"); system("cls"); } void total_salarios(t_pessoa funcionarios8[], int cont5) { int contador; double soma=0; for(contador = 0;contador < cont5;contador++) { soma=soma+funcionarios8[contador].salario; } printf("\n\t\tO Total de Salarios pagos pela empresa = %.2lf\n\n",soma); } Este é o meu programa. e tou com muita dificuldade com o quick sorte das funções : void ord_id(t_pessoa funcionarios6[], int cont3); void ord_nome(t_pessoa funcionarios7[], int cont4); void ord_sal(t_pessoa funcionarios6[], int cont3); . O Objectivo é ver os registos inseridos ordenados pelo id, no outro ordenados pelo salario e no outro ordenados pelo nome. Se alguem me poder corrigir pelo menos 1 dos quick sort eu agradecia imenso. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 27, 2012 at 10:16 AM Report Share #441284 Posted February 27, 2012 at 10:16 AM antes de "tentar" ver alguma coisa tenta implementar estas alterações porque senão fica muito confuso : - uma função de troca de elementos : desta forma o código de troca de valores entre os elementos fica fora do código de ordenação tendo duas vantagens : reutilização e facilidade de leitura do código - código de mudança de elementos utilizando do memcpy : em vez de teres 20-30 linhas de código para trocar elementos ficas com 3 - 1 função para cada tipo de ordenação dando a distância entre dois elementos do array - id - nome - salário com estas funções auxiliares podes fazer a melhor das simplificações : - uma única função de ordenação que recebe como parâmetros : o array e um ponteiro para a função de ordenação ficas com um código de oredenação de 10 linhas e fácil de ler e determinar algum erro - retirar o código de apresentação de dados da função de ordenação ... é bom ter as funções separadas por funcionalidades IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now