Les langages de programmation
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

Les langages de programmation

Venez apprendre les langages de programmation à votre rythme
 
AccueilGalerieRechercherDernières imagesS'enregistrerConnexion
-45%
Le deal à ne pas rater :
WHIRLPOOL OWFC3C26X – Lave-vaisselle pose libre 14 couverts – ...
339 € 622 €
Voir le deal

 

 Brace !

Aller en bas 
AuteurMessage
koija
Professeur
Professeur
koija


Nombre de messages : 81
Age : 28
Réputation : 11
Date d'inscription : 13/02/2011

Brace ! Empty
MessageSujet: Brace !   Brace ! Icon_minitimeVen 20 Avr - 21:48

Le but de cette exercice est de vérifier si une chaine de caractère est bien "parenthèsée", c'est à dire qu'il y a bien autant que parenthèse ouvrante que fermante et qu'il n'y ai pas de moment où on ferme une parenthèse sans en avoir ouvert.
Revenir en haut Aller en bas
http://koija.no-ip.org
Invité
Invité




Brace ! Empty
MessageSujet: Re: Brace !   Brace ! Icon_minitimeSam 21 Avr - 11:45

Hello Wink

Voilà mon code

parse.c

Code:
#include <stdio.h>
#include <stdlib.h>
#include "parse.h"

void verifier(int ouvrante, int fermante)
/* Vérifie qu'il n'y a pas plus de fermantes que d'ouvrantes pendant le parsing */
{
    if(fermante>ouvrante)
    {
        puts("Chaine incorrecte");
        exit(-1);
    }
}

void parser(char chaine[])
{
    int ouvrante=0, fermante=0;
    int i=0;
    while(chaine[i] != '\0')
    {
        if ( chaine[i] == '(' ) ouvrante += 1;
        else if ( chaine[i] == ')' ) fermante += 1;
        verifier(ouvrante, fermante);
        i++;
    }
    /* A la fin on compare le nombre total d'ouvrante et fermante */
    if(ouvrante>fermante)
    {
        puts("Chaine incorrecte");
        exit(-1);
    }
    /* Si ouvrante == fermante, c'est good */
    else puts("Chaine correcte");
}

int main(void)
{
    char test[] = "2 + (5-3) * (12/7)";
    parser(test);
    return 0;
}

parse.h

Code:
#ifndef PARSE_H_INCLUDED
#define PARSE_H_INCLUDED

void verifier(int ouvrante, int fermante);
void parser(char chaine[]);

#endif

Merci
Revenir en haut Aller en bas
koija
Professeur
Professeur
koija


Nombre de messages : 81
Age : 28
Réputation : 11
Date d'inscription : 13/02/2011

Brace ! Empty
MessageSujet: Re: Brace !   Brace ! Icon_minitimeSam 21 Avr - 13:12

J'ai pas vraiment testé ton programme parce que vu que C est un langage qui se compile, j'ai la flemme de faire ça pour chaque exercice. Parcontre, j'ai lu ton code et il m'a l'air correcte: il y a toutes les situations qui sont pensés, c'est bien joué Smile ! Si tu veux une idée d'amélioration, j'en ai une: pourquoi ne pas laisser le choix en paramètre de ta fonction le choix du caractère qu'on considère comme ouvrant et fermant? Par exemple, il pourrait très bien y avoir des [ et ], des < et >, { et } et etc... Je vais te dire: cette exercice, je l'avais déjà fais. Il a déjà été proposé dans un autre forum.. Je l'avais fini et il fallait que je continu alors j'ai eu l'idée de faire ça.
Par exemple, à l'appel de la fonction, on pourrait écrire parser(test, '(', ')'); ou parser(test, '<', '>');

Bon, si tu veux, j'te propose mon code:

Spoiler:
Revenir en haut Aller en bas
http://koija.no-ip.org
Invité
Invité




Brace ! Empty
MessageSujet: Re: Brace !   Brace ! Icon_minitimeSam 21 Avr - 13:35

Oui c'est le même sauf que j'ai rajouté une fonction pour la vérification en live.

La modif pour les choix de caractères à parser (rien à faire)

Code:
void parser(char chaine[], char car_1, char car_2)
{
    int ouvrante=0, fermante=0;
    int i=0;
    while(chaine[i] != '\0')
    {
        if ( chaine[i] == car_1 ) ouvrante += 1;
        else if ( chaine[i] == car_2 ) fermante += 1;
        verifier(ouvrante, fermante);
        i++;
    }
    /* A la fin on compare le nombre total d'ouvrante et fermante */
    if(ouvrante>fermante)
    {
        puts("Chaine incorrecte");
        exit(-1);
    }
    /* Si ouvrante == fermante, c'est good */
    else puts("Chaine correcte");
}

Wink
Revenir en haut Aller en bas
koija
Professeur
Professeur
koija


Nombre de messages : 81
Age : 28
Réputation : 11
Date d'inscription : 13/02/2011

Brace ! Empty
MessageSujet: Re: Brace !   Brace ! Icon_minitimeSam 21 Avr - 13:52

Voilà ! ^^
Et euh.. Si ! Il y a une différence entre nos deux code. Moi j'utilise une variable qui vaut la différence entre ouvrante et fermante, c'est à dire: ouvrante - fermante. L'équivalence entre nos programmes vient du fait que a - b < 0 <=> a < b. Sinon, niveau façon de penser le problème, nos façons de faire sont identiques. En même temps, je pense pas qu'il y ai d'autres façons de pensées valable sans se prendre la tête pour un rien ^^ !

Sinon, j'ai juste une petite remarque à faire maintenant que je le vois... Tu préfères pas plutôt faire ouvrante++; au lieu de faire ouvrante+=1; ? Je sais qu'on ne gagne qu'un seul caractère et que c'est chipoter pour rien mais l'incrémentation existe et je trouve de mon côté que c'est plus clair.. Tu trouves pas ?

ps: si j'ai parlé de la petite amélioration, c'était juste pour pouvoir intégrer mon code dans la discussion: je l'avais fais il y a longtemps et je trouvais dommage de devoir le modifier pour le faire régresser
Revenir en haut Aller en bas
http://koija.no-ip.org
Invité
Invité




Brace ! Empty
MessageSujet: Re: Brace !   Brace ! Icon_minitimeSam 21 Avr - 14:04

Citation :
Sinon, j'ai juste une petite remarque à faire maintenant que je le vois... Tu préfères pas plutôt faire ouvrante++; au lieu de faire ouvrante+=1; ?

Si, mais... Il y a toujours un mais Smile

Certaine fois le compilateur n'aime pas, et préfère le +=1 au ++, j'ai eu un cas comme celui-ci, mais sinon comme tu le vois dans mes itérations, j'utilise sans hésiter le ++

Qui puis est c'est plus explicite pour un codeur en C/C++, mais dans d'autres langages, le +=1 est plus explicite car très souvent usités, ce qui permet une lecture plus simple pour des codeurs venant d'autres horizons.

Citation :
ps: si j'ai parlé de la petite amélioration, c'était juste pour pouvoir intégrer mon code dans la discussion: je l'avais fais il y a longtemps et je trouvais dommage de devoir le modifier pour le faire régresser

Oui il y a pas de soucis, la modif est rapide Smile

Citation :
En même temps, je pense pas qu'il y ai d'autres façons de pensées valable sans se prendre la tête pour un rien ^^ !

En effet je vois pas mieux.

Citation :
Moi j'utilise une variable qui vaut la différence entre ouvrante et fermante, c'est à dire: ouvrante - fermante

Oui en effet j'avais pas fais gaffe, lu trop vite.

C'est bien pensé, il me manque les réflexes de l'algorithmeur (sais pas si ça se dit), car en python on fait pas vraiment gaffe à l'algorithme, c'est des fonctions toutes prêtes.

Wink
Revenir en haut Aller en bas
koija
Professeur
Professeur
koija


Nombre de messages : 81
Age : 28
Réputation : 11
Date d'inscription : 13/02/2011

Brace ! Empty
MessageSujet: Re: Brace !   Brace ! Icon_minitimeSam 21 Avr - 14:08

Aah ah Razz ! Pour moi, le seul réflexe à avoir c'est.. Prendre un papier et un stylo quand on y arrive pas de tête Smile
Revenir en haut Aller en bas
http://koija.no-ip.org
Contenu sponsorisé





Brace ! Empty
MessageSujet: Re: Brace !   Brace ! Icon_minitime

Revenir en haut Aller en bas
 
Brace !
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Les langages de programmation :: Exercices de programmation :: Exercices en C-
Sauter vers: