Deine magischen Konstanten kommen mir aber sehr bekannt vor.
Wenn du den Code so schreiben würdest
1 | if ((*z_i <= '0' ) && (*e_i <= '0' ))
|
2 | {
|
3 | *h_i = *h_i - 1;
|
4 |
|
5 | *z_i = '9';
|
6 | *e_i = '9';
|
7 | }
|
8 |
|
9 | else
|
10 | {
|
11 | if (*e_i <= '0')
|
12 | {
|
13 | *z_i = *z_i - 1;
|
14 | *e_i = '9';
|
15 | }
|
16 |
|
17 | else
|
18 | {
|
19 | *e_i = *e_i - 1;
|
20 | }
|
21 | }
|
dann wäre wenigstens ansatzweise klar, dass dein Zähler im Grunde im
ASCII Code zählt.
Noch einfacher wäre es allerdings, wenn du das Ganze so machst, wie man
das auch mit Papier und Bleistift machen würde. Man fängt bei den Einern
an und subtrahiert 1. Bei einem Unterlauf (borgen von der nächsten
Stelle) arbeitet man sich dann immer weiter 'nach links' vor.
1 | *e_i = *e_i - 1; // Einerstelle 1 abziehen
|
2 |
|
3 | if( *e_i < '0' ) // Unterlauf?
|
4 | {
|
5 | *z_i = *z_i - 1; // von den Zehnern eines runter
|
6 | *e_i = '9';
|
7 |
|
8 | if( *z_i < '0' ) // Zehner Unterlauf?
|
9 | {
|
10 | *h_i = *h_i - 1; // von den Hundertern eines runter
|
11 | *z_i = '9';
|
12 | }
|
13 | }
|
In vielen Fällen ist es klug, einfach zu beobachten wie man selbst ein
Problem mit Papier und Bleistift löst, und diese Lösungsstrategie dann
in Code umsetzt.