#include <assert.h>
#include <stdlib.h>
#include <stdio.h>

typedef enum {POSITIF, NEGATIF} Signe;

enum {NB_CHIFFRES = 10};

// chaque case du tableau 'chiffres' contient un chiffre composant le nombre
// les unités sont à l'indice 0, les dizaines à l'indice 1, etc
typedef struct {
	Signe signe;
	unsigned char chiffres[NB_CHIFFRES];
} Nombre;

// paramètre d'entrée
void affichage(const Nombre* pn) {
	int i;
	if (pn->signe == NEGATIF)
		printf("-");
	for (i = NB_CHIFFRES - 1; i > 0 && pn->chiffres[i] == 0; --i)
		continue;
	for ( ; i >= 0; --i)
		printf("%d", pn->chiffres[i]);
}

// structure retournée
Nombre zero() {
	Nombre z;
	int i;
	z.signe = POSITIF;
	for (i = 0; i < NB_CHIFFRES; ++i)
		z.chiffres[i] = 0;
	return z;
}

// structure retournée
Nombre traduction(int v) {
	Nombre n;

	int i;
	if (v >= 0) 
		n.signe = POSITIF;
	else {
		n.signe = NEGATIF;
		v *= -1;
	}
	for (i = 0; i < NB_CHIFFRES; ++i, v /= 10)
		n.chiffres[i] = v % 10;
	return n;
}

// paramètre de sortie
void raz(Nombre* pn) {
	int i;
	pn->signe = POSITIF;
	for (i = 0; i < NB_CHIFFRES; ++i)
		pn->chiffres[i] = 0;
}

// paramètre de sortie
void initialisation(Nombre* pn, int v) {
	// solution alternative moins efficace (recopie)
	// *pn = conversion(v);
	int i;
	if (v >= 0) 
		pn->signe = POSITIF;
	else {
		pn->signe = NEGATIF;
		v *= -1;
	}
	for (i = 0; i < NB_CHIFFRES; ++i, v /= 10)
		pn->chiffres[i] = v % 10;
}

// paramètre d'entrée et tableau en sortie
// autres protypes possibles :
//       void conversion(const Nombre* pn, char s[]);
//       void conversion(const Nombre* pn, char s[12]); // à proscrire
//       void conversion(const Nombre* pn, char s[NB_CHIFFRES + 2]); // à éviter
void conversion(const Nombre* pn, char* s) {
	int i, j = 0;
	if (pn->signe == NEGATIF)
		s[j++] = '-';
	for (i = NB_CHIFFRES - 1; i > 0 && pn->chiffres[i] == 0; --i)
		continue;
	for ( ; i >=0; --i)
		s[j++] = '0' + pn->chiffres[i];
	s[j] = '\0';
}

// paramètre d'entrée/sortie
void incrementation(Nombre* pn) {
	int i = 0;
	if (pn->signe == POSITIF) {
		while (i < NB_CHIFFRES && pn->chiffres[i] == 9)
			pn->chiffres[i++] = 0;
		if (i < NB_CHIFFRES)
			++pn->chiffres[i];
	} 
	else {
		while (i < NB_CHIFFRES && pn->chiffres[i] == 0)
			pn->chiffres[i++] = 9;
		if (i < NB_CHIFFRES) {
			--pn->chiffres[i];
			// le signe a-t-il changé ?
			if (i == 0 && pn->chiffres[i] == 0) {
				for (i = 1; i < NB_CHIFFRES && pn->chiffres[i] == 0; ++i)
					continue;
				if (i == NB_CHIFFRES)
					pn->signe = POSITIF;
			}
		}
	} 
}

int main() {
	int i;
	char chaine[NB_CHIFFRES + 2]; // un pour le signe et un pour '\0'
	Nombre n = zero();

	affichage(&n);
	printf("\n");

	initialisation(&n, -12);
	conversion(&n, chaine);
	printf("%s\n", chaine);

	for (i = 0; i < 123; ++i) {
		incrementation(&n);
		conversion(&n, chaine);
		printf("%s\n", chaine);
	}
	system("pause");
	system("cls");
	return 0;
}
