/media/sda-magnetic/david/Dokumente-16-2024-08-01/informatikUmathematik/excerpt20240906before/progs2sources20240801/abakus3.c


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_NUM 8192 * 4


void add (int a [10][20], int row, int val);

void print_abacus (int a [10][20]) {
    int i, j;

    printf ("==========================\n\n");
    for (i = 0;  i < 10;  i++) {
        for (j = 0;  j < 20;  j++) {
            if (a [i][j] == 1)
                printf ("x");
            else
                printf ("_");
        }
        printf ("\n");
    }
    printf ("==========================\n\n");
}

int main(void) {
    int x, y;
    int ch [10];
    time_t t;
    int i, j;
    int a [10][20];
    int r, q;

    srand ((unsigned) time (&t));


    for (i = 0, y = 0;  i < 10;  i++) {
        printf ("%i + ", x = ((rand () % MAX_NUM) + 1));
        ch [i] = x;
        y += x;
    }
    printf (" = %i\n", y);

    for (i = 0;  i < 10;  i++) {
        for (j = 0;  j < 10;  j++) {
            a [i] [j] = 1;
        }
        for (;  j < 20;  j++)
            a [i] [j] = 0;
    }

    print_abacus (a);

    for (i = 0;  i < 10;  i++) {
        r = 10000;

        for (j = 0;  j < 5;  j++) {
            x = (ch [i] / (r)) % 10;

            printf ("%i ", x);

            r = r / 10;

            add (a, (5-j), x);
            print_abacus (a);

        }
        printf ("\n");
    }
}

void add (int a [10][20], int row, int val) {
        int limit1;
        int limit2;
        int j, k, l, i;

        printf ("%i\n", val);
        for (j = 19;  j > 0;  j--)
            if (a [row][j] == 0) {
                limit2 = j+1;
                break;
            }


        for (limit1 = 0;  limit1 < 10;  limit1++) {
            if (a [row][limit1] == 0)
                break;
        }
            if (val > limit1) {
                add (a, row - 1, 1);
                for (k = limit1, l = limit2, i = 0;  i <= (10 - val);  i++, k--, l--) {
                    a [row][k] = 0;
                    a [row][l] = 1;
                }
            }
            else {
                for (k = limit1, l = limit2, i = 0;  i <= val;  i++, k--, l--) {
                    a [row][k] = 0;
                    a [row][l] = 1;
                }
            }

            for (limit2 = 19, limit1 = 0;  limit2 > 0;  limit2--, limit1 ++)
                if (a [row][limit2] == 0)
                    break;
            if (limit1 == 9)
                for (limit1 = 0, limit2 = 19;  limit1 < 9; limit1++, limit2--) {
                    a [row][limit1] = 1;
                    a [row][limit2] = 0;
                }
        print_abacus (a);
        //getchar ();
}