#include <stdio.h>
#include <string.h> // contient la déclaration de la fonction strlen()
#include <stdbool.h> //nécessite la compilation avec l'option -std=c99

// longueur maximale de la chaine saisie
#define LMAX 80

/* Déclaration de la fonction est_bien_parenthesee() :
Fonction qui détermine si la chaine de caractères str passée en paramètre est bien prenthesee*/
bool est_bien_parenthesee(const char *str);


int main()
{
	char tab [LMAX + 1];// LMAX caractères + le caractère '\0'
	size_t lo ;
	
	printf("Saisir une chaine (longueur max %d) :\n", LMAX);
	
	// dans cet exercice, on est obligé d'utiliser la fonction fgets() pour saisir la chaine
	// car on souhaite pouvoir saisir une chaine avec des espaces
	fgets(tab, LMAX+1, stdin);
	
	
	lo = strlen(tab);
	// pour supprimer le caractère '\n' ajouté par fgets() quand l'utilisateur saisit un nombre de caractères strictement inférieur à LMAX
	// même si dans cet exercice, ça ne sert à rien
	if (tab[lo -1] == '\n')
	{
		tab[lo -1] = '\0';
	}
	printf("\nChaine analysee :\n%s\n\n", tab);
	printf("La chaine est %s parenthesee.\n", est_bien_parenthesee(tab)? "bien" : "mal");
	
	return 0;
}




// le type du paramètre (const char *) interdit à la fonction de modifier les caractères de la chaîne reçue en paramètre 
bool est_bien_parenthesee(const char *str)
{
	size_t l = strlen(str);
	int cpt_ouvrantes = 0, cpt_fermantes = 0;
	bool nb_fermantes_ok = true; // passe à false si à un le nombre de parenthèses fermantes devient strictement supérieur au nombre de parenthèses ouvrantes
	for (size_t i = 0; nb_fermantes_ok && i < l; ++i)
	{
		if (str[i] == '(')
		{
			++cpt_ouvrantes;
		}
		else if (str[i] == ')')
		{
			++cpt_fermantes;
			nb_fermantes_ok = cpt_ouvrantes >= cpt_fermantes;
		}
	}
	return nb_fermantes_ok && cpt_ouvrantes == cpt_fermantes;
}