Les langages de programmation

Venez apprendre les langages de programmation à votre rythme
 
AccueilGalerieCalendrierFAQRechercherS'enregistrerMembresGroupesConnexion

Partagez | 
 

 Brace !

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
koija
Professeur
Professeur


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

MessageSujet: Brace !   Ven 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.

_________________


All humans will, without exception, eventually die.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://koija.no-ip.org
Invité
Invité



MessageSujet: Re: Brace !   Sam 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


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

MessageSujet: Re: Brace !   Sam 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:
 

_________________


All humans will, without exception, eventually die.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://koija.no-ip.org
Invité
Invité



MessageSujet: Re: Brace !   Sam 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


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

MessageSujet: Re: Brace !   Sam 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

_________________


All humans will, without exception, eventually die.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://koija.no-ip.org
Invité
Invité



MessageSujet: Re: Brace !   Sam 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


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

MessageSujet: Re: Brace !   Sam 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

_________________


All humans will, without exception, eventually die.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://koija.no-ip.org
Contenu sponsorisé




MessageSujet: Re: Brace !   Aujourd'hui à 5:53

Revenir en haut Aller en bas
 
Brace !
Voir le sujet précédent Voir le sujet suivant 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: