コード例 #1
0
ファイル: game.c プロジェクト: hirohaya/river_raid
/*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;
}
コード例 #3
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);
}