/*Da um update na tela criando uma nova linha, respeitando o tamanho maximo e minimo das margens, e inserindo ela no final da fila ao mesmo tempo que exclui a primeira linha da fila*/ void update_tela(){ int m_e; int m_d; m_e = (fila->fim)->margem_e + i_rand(-1, 1); m_d = (fila->fim)->margem_d + i_rand(-1, 1); if(m_e < MIN_MARGEM) m_e = (fila->fim)->margem_e + i_rand(0, 1); if(m_e > MAX_MARGEM) m_e = (fila->fim)->margem_e + i_rand(-1, 0); if(m_d < (T_LARG - MAX_MARGEM)) m_d = (fila->fim)->margem_d + i_rand(0, 1); if(m_d > (T_LARG - MIN_MARGEM)) m_d = (fila->fim)->margem_d + i_rand(-1, 0); remove_fila(); cria_linha(m_e, m_d); }
int main ( int argc, char *argv[] ) { int comando, valor; int n, i; int flag[ 3 ]; int recebido; tipo_sacola data; while ( scanf ( "%d", &n ) != EOF ) { memset ( flag, 0, sizeof( flag ) ); data.comeco_fila = 0; data.final_fila = 0; data.indice_pilha = 0; data.indice_lista_prioridade = 0; for ( i=0; i<n; i++ ) { scanf( "%d %d", &comando, &valor ); /********************************************************* * Se o comando for 1, insere o elemento em todas as * * estruturas. * **********************************************************/ if ( comando == 1 ) { insere_fila ( valor, &data ); insere_pilha ( valor, &data ); insere_lista_prioridade ( valor, &data ); } /********************************************************* * Se o comando for 2, remove o elemento em todas as * * estruturas. * **********************************************************/ else { recebido = remove_fila ( &data ); /***************************************************** * Compara o valor obtido ao fazer a remoção das * * estruturas com o dado recebido. Se forem diferentes* * a flag deve ser 'ativada', identificando que o * * resultado não pode ser a estrutura correspondente. * ******************************************************/ if ( recebido != valor ) { flag[0] = 1; } recebido = remove_pilha ( &data ); if ( recebido != valor ) { flag[1] = 1; } recebido = remove_lista_prioridade ( &data ); if ( recebido != valor ) { flag[2] = 1; } } } /************************************************************* * No caso de todas as três flags terem sido ativadas, não * * pode ser nenhuma das três estruturas, portanto, impossível.* **************************************************************/ if ( flag[ 0 ] + flag[ 1 ] + flag[ 2 ] == 3 ) printf ( "impossible\n" ); /************************************************************* * No caso de terem sobrado duas flags não ativadas, pode * * duas estruturas diferentes, portanto, sem certeza * **************************************************************/ else if ( flag[ 0 ] + flag[ 1 ] + flag[ 2 ] < 2 ) printf ( "not sure\n" ); /************************************************************* * Se apenas uma flag não tiver sido ativada, é essa a * * estrutura utilizada. * **************************************************************/ else { if ( !flag[0] ) printf ( "queue\n" ); if ( !flag[1] ) printf ( "stack\n" ); if ( !flag[2] ) printf ( "priority queue\n" ); } } return 0; }
void ordenacaoExterna(int numerosArmazenados){ /* FILE *arqOrdenado; arqOrdenado = fopen("arqOrdenado.txt", "r"); //arquivo a ser ordenado*/ int i = 0; int w = 0; int z = 0; fila fp; // Fila de prioridade int *bs; // Buffer de saida tipo_buffer *be; // Buffer de entrada tipo_nodo aux,auxRetirada; int numeroRuns = numerosArmazenados/TAM_RUN; // Runs geradas int inserirBufferEntrada; if(numerosArmazenados%TAM_RUN > 0) // Se teve resto tem que gerar mais uma Run pro resto numeroRuns++; printf("\nQtd de Runs(50 chaves): %d",numeroRuns); gerar_runs(numeroRuns,numerosArmazenados); //Alocando memoria para os buffers bs = (int*)malloc(sizeof(int)*numeroRuns); be = (tipo_buffer*)malloc(sizeof(tipo_buffer)*numeroRuns); //Criando fila de prioridade fp = cria_fila(numeroRuns); //---------------------------------ADICIONAR ELEMENTOS NO BUFFER DE ENTRADA printf("\n\n2 - Adicionando elementos no buffer de entrada"); for (i=0;i<numeroRuns;i++){ be[i].posAtual=0; /* Somente para armazenar o posição corrente do arquivo. Para quando pegar novamente mais um elemento pegar na posição atual */ //Total de elementos que este buffer podera pegar da RUN // if( (i < numeroRuns || numeroRuns == 1) && numerosArmazenados >= 50 ) if(i!=numeroRuns-1 || (numerosArmazenados % TAM_RUN) == 0) be[i].totalElementos = TAM_RUN; // Run completa else be[i].totalElementos = numerosArmazenados % TAM_RUN; // Run com menos de TAM_RUM //Carregando os buffers de entrada e inserindo os itens de cada Run inserirBufferEntrada = inserirElementosBufferEntrada(be,i); if (!inserirBufferEntrada){ be[i].posAtualBuffer=-1; }else { aux.chave = be[i].chave[0]; aux.run = i; be[i].posAtualBuffer++; //printf("\nRecebendo aux.chave %d aux.run %d",aux.chave,aux.run); insere_fila(fp,aux,numeroRuns); // Coloca na fila o elemento de indice 0 do buffer de entrada } } //-----------------------------------INICIO DA ORDENAÇÃO EXTERNA printf("\n\n3 - Realizando ordenação externa"); w = 0; while (fila_vazia(fp)){ imprime_fila(fp); remove_fila(fp,&auxRetirada); printf("\nElemento retirado = %d do Buffer de Entrada %d ",auxRetirada.chave,auxRetirada.run); bs[w]=auxRetirada.chave; w++; //verifica se o buffer de saida esta cheio e imprime no arquivo resultado if (w==numeroRuns){ gravar_resultado(bs,w); w=0; } z=0; while (z<numeroRuns){ if (z==auxRetirada.run){ if (be[z].posAtualBuffer==TAM_BUFFER) if (!carregaBE(auxRetirada.run,be)){ be[z].posAtualBuffer=-1; printf("\nBuffer de entrada %d foi carregado!",auxRetirada.run); break; } if (be[z].posAtualBuffer < be[z].totalBuffer){ auxRetirada.run=z; auxRetirada.chave=be[z].chave[be[z].posAtualBuffer]; insere_fila(fp,auxRetirada,numeroRuns); be[z].posAtualBuffer++; printf("\nElemento inserido = %d no Buffer de Entrada %d ",auxRetirada.chave,auxRetirada.run); } break; } z++; }// fim while //getchar(); } //verifica se o buffer de saida possui algum elemento restante e salva no arquivo resultado if (w!=0) gravar_resultado(bs,w); //--------------------------------------------------- imprime_fila(fp); //Finalizando a fila de prioridade termina_fila(fp); printf("\n\Final da Ordenacao Externa"); //fclose(arqOrdenado); }