/***
Dato un file matrice.txt (ad esempio come quello qui sotto, ove i due primi numeri interi
stabiliscono rispettivamente le righe e le colonne di una matrice) caricare in una matrice M
in memoria il file e poi visualizzare a video:
A) la matrice
B) gli elementi della colonna N (chiedi N da tastiera)
C) quanti elementi della matrice sono divisibili per l'elemento K (Chiedi K da tastiera. Se
K=6 e la matrice e' quella qui sotto, il valore corrispondente e' 0, cioe' il sesto numero
partendo dall'elemento 0,0)
 3 4
 2 3 4 5
 8 0 7 2
 4 4 9 8
***/

#include <stdio.h>

// Funzione stampaMatrice (serve a visualizzare la matrice a video)
void stampaMatrice(int righe, int colonne, int m[][colonne]) {
    int i, j;
    for (i = 0; i < righe; i++) {
        for (j = 0; j < colonne; j++)
            printf("%3d ", m[i][j]);
        printf("\n");
    }
}

// Funzione stampaColonna (serve a visualizzare la colonna scelta a video)
void stampaColonna(int righe, int colonne, int m[][colonne], int n) {
    int i;
    printf("Elementi della colonna %d:\n", n);
    for (i = 0; i < righe; i++)
        printf("%d\n", m[i][n]);
}

// Funzione trovaElemento (serve a trovare l'elemento k corrispondente all'interno della matrice)
int trovaElemento(int *inizio, int k) {
    int *p, tem;

    p = inizio + k - 1;    // l'elemento in posizione k si trova dopo k - 1 indirizzi partendo dall'inizio
    tem = *p;              // valore che si trova all'indirizzo inizio + k - 1
    return tem;
}

// Funzione contaDivisibili (conta quanti elementi della matrice sono divisibili per tem)
int contaDivisibili(int *inizio, int tot, int tem) {
    int *p, divisibili;

    divisibili = 0;
    for (p = inizio; p < inizio + tot; p++)
        if (*p % tem == 0)
            divisibili++;
    return divisibili;
}

// Funzione principale (main - le funzioni vengono chiamate all'interno)
int main() {
    int righe, colonne;
    int i, j, n, k, tem, divisibili;
    FILE *f;

    // Caricamento del file nella matrice
    f = fopen("matrice.txt", "r");
    fscanf(f, "%d %d", &righe, &colonne);

    // Dichiaro la matrice solo dopo aver ottenuto le dimensioni dal file
    int m[righe][colonne];

    for (i = 0; i < righe; i++)
        for (j = 0; j < colonne; j++)
            fscanf(f, "%d", &m[i][j]);
    fclose(f);

    // A) Visualizza la matrice
    printf("Matrice caricata dal file:\n");
    stampaMatrice(righe, colonne, m);

    // B) Visualizza la colonna scelta dall'utente
    printf("\nQuale colonna vuoi visualizzare? ");
    scanf("%d", &n);
    stampaColonna(righe, colonne, m, n);

    // C) Trova l'elemento in posizione K e conta i divisibili
    printf("\nInserisci K: ");
    scanf("%d", &k);

    tem = trovaElemento(&m[0][0], k);
    printf("L'elemento in posizione %d e': %d\n", k, tem);

    if (tem == 0)
        printf("Nessun elemento e' divisibile per 0\n");
    else {
        divisibili = contaDivisibili(&m[0][0], righe * colonne, tem);
        printf("Gli elementi divisibili per %d sono: %d\n", tem, divisibili);
    }

    return 0;
}