Write a c program to simulate two dimensional Parity generator and checker.

Below is a simple C program that simulates a two-dimensional parity generator and checker.

#include <stdio.h>

    #define MAX_ROWS 5
    #define MAX_COLS 5
    
    // Function to generate two-dimensional parity
    void generate_parity(int data[MAX_ROWS][MAX_COLS], int parity[MAX_ROWS+1][MAX_COLS+1]) {
        // Row Parity Calculation
        for (int i = 0; i < MAX_ROWS; i++) {
            int row_parity = 0;
            for (int j = 0; j < MAX_COLS; j++) {
                row_parity ^= data[i][j];  // XOR all elements in the row
            }
            parity[i][MAX_COLS] = row_parity;  // Store row parity in the last column
        }
    
        // Column Parity Calculation
        for (int j = 0; j < MAX_COLS; j++) {
            int col_parity = 0;
            for (int i = 0; i < MAX_ROWS; i++) {
                col_parity ^= data[i][j];  // XOR all elements in the column
            }
            parity[MAX_ROWS][j] = col_parity;  // Store column parity in the last row
        }
    
        // Bottom-right corner parity bit (overall parity)
        int overall_parity = 0;
        for (int i = 0; i < MAX_ROWS; i++) {
            for (int j = 0; j < MAX_COLS; j++) {
                overall_parity ^= data[i][j];
            }
        }
        parity[MAX_ROWS][MAX_COLS] = overall_parity;  // Store overall parity in the bottom-right corner
    }
    
    // Function to check if data has valid parity
    int check_parity(int data[MAX_ROWS][MAX_COLS], int parity[MAX_ROWS+1][MAX_COLS+1]) {
        // Check row parity
        for (int i = 0; i < MAX_ROWS; i++) {
            int row_parity = 0;
            for (int j = 0; j < MAX_COLS; j++) {
                row_parity ^= data[i][j];
            }
            if (row_parity != parity[i][MAX_COLS]) {
                printf("Row %d parity check failed.\n", i + 1);
                return 0;  // Row parity mismatch
            }
        }
    
        // Check column parity
        for (int j = 0; j < MAX_COLS; j++) {
            int col_parity = 0;
            for (int i = 0; i < MAX_ROWS; i++) {
                col_parity ^= data[i][j];
            }
            if (col_parity != parity[MAX_ROWS][j]) {
                printf("Column %d parity check failed.\n", j + 1);
                return 0;  // Column parity mismatch
            }
        }
    
        // Check overall parity (bottom-right corner)
        int overall_parity = 0;
        for (int i = 0; i < MAX_ROWS; i++) {
            for (int j = 0; j < MAX_COLS; j++) {
                overall_parity ^= data[i][j];
            }
        }
        if (overall_parity != parity[MAX_ROWS][MAX_COLS]) {
            printf("Overall parity check failed.\n");
            return 0;  // Overall parity mismatch
        }
    
        printf("Parity check passed.\n");
        return 1;  // All parity checks passed
    }
    
    int main() {
        int data[MAX_ROWS][MAX_COLS];
        int parity[MAX_ROWS + 1][MAX_COLS + 1] = {0};  // Parity array with an extra row and column for parity bits
    
        // Input data matrix
        printf("Enter a %dx%d data matrix (0 or 1 values):\n", MAX_ROWS, MAX_COLS);
        for (int i = 0; i < MAX_ROWS; i++) {
            for (int j = 0; j < MAX_COLS; j++) {
                printf("data[%d][%d] = ", i, j);
                scanf("%d", &data[i][j]);
            }
        }
    
        // Generate parity
        generate_parity(data, parity);
    
        // Print the data matrix with row and column parity
        printf("\nData matrix with parity bits:\n");
        for (int i = 0; i < MAX_ROWS; i++) {
            for (int j = 0; j < MAX_COLS; j++) {
                printf("%d ", data[i][j]);
            }
            printf("| %d\n", parity[i][MAX_COLS]);
        }
        for (int j = 0; j < MAX_COLS; j++) {
            printf("--");
        }
        printf("--\n");
        for (int j = 0; j < MAX_COLS; j++) {
            printf("%d ", parity[MAX_ROWS][j]);
        }
        printf("| %d\n", parity[MAX_ROWS][MAX_COLS]);
    
        // Check parity
        int result = check_parity(data, parity);
        if (result) {
            printf("The data is correct!\n");
        } else {
            printf("The data contains errors.\n");
        }
    
        return 0;
    }