void ordenarP() { int escolha; do { system("cls"); printf("\nMenu Ordenar por preço\n"); printf("\nEscolha o menu que pretende abrir.\n"); printf("1. Crescente\n"); printf("2. Decrescente\n"); printf("0. Sair\n"); printf("\nOpção: "); scanf("%d", &escolha); switch (escolha) { case 0: break; case 1: ordenarCrescente(1); break; case 2: ordenarDecrescente(1); break; default: printf("Insira um número de 0 a 3.\n"); break; } } while (escolha != 0); }
void main(void) { // Iniciliza a serial inicializarSerial(); // USART out -> Introducao + mensagem numero de Processos // obs: usamos um While(BusyUSART()) para cada envio para USART. // "### Alocacao de Memoria - Worst Fit ###" // "Entre com o Numero de Processos(Se > 5, em LOTE !!!): " printf("\t\t%S%S%S", msgInicial, CRLF, msgNumProcessos); while(BusyUSART()); // USART in -> Le numero de Processos // função getInt() faz todo o trabalho de feedback ao usuario // ao digitar cada dígito, finalizando com ENTER. iNumProcessos = getInt(); // USART out -> mensagem / in-> numero de BlocosDeMemoria // "Entre com o Numero de Blocos: " printf("%S",msgNumBlocos); while(BusyUSART()); // USART in -> Le numero de Blocos iNumBlocos = getInt(); if(iNumProcessos > 5) { //Ativa modo com iteração da entrada. trabalho em lote. // "Entre com um tamanho para TODOS os Processos: " printf("%S", msgTodosProcessos); while(BusyUSART()); // Recebe tamanho de todos os processos. iTamTodosProcessos = getInt(); //Itera atribuição de tamanho para cada posição // do vetor de tamanho de procesos. for(i=0;i<iNumProcessos;i++) tamProcessos[i] = iTamTodosProcessos; //Quebra de linha simples. printf("%S", CRLF); //new line while(BusyUSART()); // "Entre com um tamanho para TODOS os Blocos: " printf("%S", msgTodosBlocos); while(BusyUSART()); // Recebe tamanho para todos os Blocos. iTamTodosBlocos = getInt(); // atribui tamanho para cada bloco. for(i=0;i<iNumBlocos;i++) { vBlocoMem[i].tamanho = iTamTodosBlocos; vBlocoMem[i].id = i+1; } } else { // Para até 5 Processos, diálogo é lançado // para definir cada proceso e bloco. // Introduz atribuição até 5 elementos. //"Entre com o tamanho dos Processos: " printf("%S%S", tamCadaProcesso, CRLF); while(BusyUSART()); // iNumProcessos sempre <= 5 for(i=0;i<iNumProcessos;i++) { // "Processo i: " printf("%S %d: ",processo, i+1); while(BusyUSART()); // Atribui valor a partir do buffer. tamProcessos[i] = getInt(); } // "Entre com o tamanho dos Blocos: " printf("%S%S",tamCadaBloco, CRLF); while(BusyUSART()); for(i=0;i<iNumBlocos;i++) { // "Bloco i: " printf("%S %d: ",bloco, i+1); while(BusyUSART()); // Atribui valores necessário para preencher struct. vBlocoMem[i].tamanho = getInt(); vBlocoMem[i].id = i+1; // Início em 1. } } //## Fim de entrada, início da computação ## // Ordena vetor de Blocos de Memória de modo a ter // Maior posição na primeira posição. // %%%%% , %%%% , %%% , %% , % // obs: Desse ponto em diante creditamos o usuário // JoeVogel @ Github pela disponibilidade da lógica // usada em Java, que foi adaptada para C e depois PIC. ordenarDecrescente(vBlocoMem, iNumBlocos); // "ID Processo: Tamanho: ID Bloco: Espaco no Bloco: Espaco Restante: " printf("%S%S", cabecalho, CRLF); while(BusyUSART()); // Para cada Processo for(i=0;i<iNumProcessos;i++) { // Percorre vetor de blocos a procura do maior espaço eestante após a alocação. // Melhor caso: Posição inicial conterá maior espaço após alocacção. // Pior cas0: Não há espaço para o Processo. Percorre todo o vetor de blocos. for(j=0;j<iNumBlocos;j++) { // Há espaço? if(vBlocoMem[j].tamanho >= tamProcessos[i]){ // Imprime linha output // "1 250 1 300 50" printf(" %d %d %d %d %d%S",i+1, tamProcessos[i], vBlocoMem[j].id, vBlocoMem[j].tamanho, (vBlocoMem[j].tamanho - tamProcessos[i]),CRLF); while(BusyUSART()); //Registra alteracao no tamanho do bloco vBlocoMem[j].tamanho -= tamProcessos[i]; // Reordena o vetor de BlocosMem. ordenarDecrescente(vBlocoMem, iNumBlocos); break; } } // Não há espaço em nenhum bloco para aquele processo. // Confirma que chegou ao fim do vetor. if(j == iNumBlocos){ // "5 20 IMPOSSIVEL ALOCAR" printf(" %d %d %S%S",i+1, tamProcessos[i],impossivel, CRLF); } } //Encerra programa. printf("\r\n\r\n\r\n" ); while(1); }