int main(int argc, char** argv) {
    // verifica se um parametro foi passado, senao exibe a forma de uso
    if (!argv[1]){
        mostraUso();
        return 0;
    }

    // Procedimento que carrega os dados do arquivo em uma matriz
    int **matriz;
    int linhas, colunas;
    printf("Abrindo arquivo...\n");
    matriz = (int **)carregaArquivo(argv[1], &linhas, &colunas);
    if (!matriz){
        printf("ERRO: nao foi possivel abrir o arquivo %s\n", argv[1]);
        return 0;
    }
        
    // entrando no loop do menu
    int opcao;
    do{
        // limpa a tela se o clear estiver disponível
        system("clear");
        printf("Selecione uma opcao ou 0 para encerrar\n" \
                "[1] - Salvar\n" \
                "[2] - Limiarizar\n" \
                "[3] - Inverter\n" \
                "[4] - Media 3x3\n" \
                "[5] - Mediana 3x3\n" \
                "[6] - Numero de brancos\n" \
                "======> ");
        scanf("%d", &opcao);
        switch(opcao){
            case 0:
                break;
            case 1:
                printf("\nNome do novo arquivo (enter para sobrescrever): ");
                char caminho[20];
                // workaround do buffer sujo
                getchar();
                fgets(caminho, sizeof(caminho), stdin);
                if (caminho)
                    salvaArquivo(caminho, matriz, linhas, colunas);
                else
                    salvaArquivo(argv[1], matriz, linhas, colunas);
                teclaEnter();
                break;
            case 2:
                limiarizar(matriz, linhas, colunas);
                mostraMatriz(matriz, linhas, colunas);
                break;
            case 3:
                inverter(matriz, linhas, colunas);
                mostraMatriz(matriz, linhas, colunas);
                break;
            case 4:
                if (media3x3(matriz, linhas, colunas))
                    mostraMatriz(matriz, linhas, colunas);
                break;
            case 5:
                if (mediana3x3(matriz, linhas, colunas))
                    mostraMatriz(matriz, linhas, colunas);
                break;
            case 6:
                printf("\nNumero de brancos: %d\n", nroBrancos(matriz, linhas, colunas));
                // espera input do teclado
                teclaEnter();
                break;
            default:
                printf("Opcao nao reconhecida");
                teclaEnter();
                break;
        }
    }while(opcao != 0);

    // liberacao de memoria
    desalocaMatriz(matriz, linhas);
    
    return 0;
}
Exemplo n.º 2
0
int main(int argc, char const *argv[])
{
    /* Verifica se o usuário digitou 5 parâmetros */
    if (argc != 6) {
        mostraUso();
        exit(EXIT_FAILURE);
    }

    /* Atribuição dos parâmetros */
    n = atoi(argv[1]); /*    <convidados> */
    p = atoi(argv[2]); /* <minimo-alunos> */
    t = atoi(argv[3]); /*     <intervalo> */
    r = atoi(argv[4]); /*   <tempo-festa> */
    s = atoi(argv[5]); /*   <tempo-ronda> */
    srand (time(NULL));
    alunosNaFesta = alunosQueJaParticiparam = 0;

    /* Verifica se os parâmetros são valores válidos */
    if (t < 0 || r < 0 || s < 0) {
        printf("Atenção! Os valores de <intervalo>, <tempo-festa> e <tempo-ronda> não devem ser negativos\n");
        mostraUso();
        exit(EXIT_FAILURE);
    }

    /* Cria vetor de threads para representar os alunos */
    pthread_t *threadsAlunos = (pthread_t*) malloc(n * sizeof(pthread_t));

    /* Cria uma thread para representar o segurança */
    pthread_t threadSeguranca;

    /* Inicializa uma fila para representar a ordem de chegada dos alunos */
    filaDeAlunos = malloc(n * sizeof(int));
    if (filaDeAlunos == NULL) {
        printf("Falha ao alocar memória\n");
        exit(EXIT_FAILURE);
    }
    inicioDaFila = fimDaFila = 0;

    /* Variáveis para índice, valores de retorno e id do aluno passado à thread */
    int i, falhou, *idAluno;

    /* Inicialização do Mutex */
    falhou = pthread_mutex_init(&mutex, NULL);
    if (falhou) {
        printf("Ocorreu um erro ao inicializar o mutex\n");
        exit(EXIT_FAILURE);
    }


    /* Inicialização das theads dos alunos */
    for (i = 1; i <= n; i++)
    {
        /* alocando novo ponteiro para um inteiro, a ser passado para a thread do aluno */
        idAluno = (int*) malloc(sizeof(int*)); 
        *idAluno = i;

        falhou = pthread_create(&(threadsAlunos[i]),  /* pthread_t* tid */                           
                        NULL,                     /* const pthread_attr_t* attr */ 
                        aluno,           /* void* (*start_routine)(void *)  */  
                        idAluno);               /* void *arg. */      
        if (falhou) {
            printf("Ocorreu um erro ao criar as threads dos alunos!\n");
            exit(EXIT_FAILURE);
        }
    }

    /* Inicialização da thread do segurança */
    falhou = pthread_create(&threadSeguranca, /* pthread_t* tid */                           
                        NULL,                 /* const pthread_attr_t* attr */ 
                        seguranca,   /* void* (*start_routine)(void *)  */  
                        NULL);                /* void *arg. */  

    if (falhou) {
        printf("Ocorreu um erro ao criar a thread do segurança!\n");
        exit(EXIT_FAILURE);
    }

    /* Espera as threads dos alunos e do segurança terminarem */
    for (i = 0; i < n; i++) {
        pthread_join(threadsAlunos[i], NULL);
    }
    pthread_join(threadSeguranca, NULL);

    /* Termina a festa */
    printf("Término de festa!\n");

    exit(EXIT_SUCCESS);
}