Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Exercices] Venez vous entraîner !

Ce mois: Parseur de fonctions mathématiques

20 juillet 2008 à 20:27:46

Citation : Tealc13

Citation : Nanoc

Il part en boucle infinie. C'est correct. (En tout cas sur cet aspect)


Pourquoi, on est sensé trouver une erreur ?
Pour moi il fonctionne très bien.



Nanoc dit "sur cet apsect" parce que ton interpreteur peut bien partir en boucle infinie et ton code être incorrect :)
  • Partager sur Facebook
  • Partager sur Twitter
FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
20 juillet 2008 à 21:01:03

Si ton interpréteur est correct, le "code mystère" doit partir en boucle infinie et avoir un affichage qui devrait vous rapeller quelquechose. (Ne pas dire quoi ici, merci)
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
20 juillet 2008 à 21:38:47

J'aime bien l'exercice, mais le langage est affreux a souhaits :D .
Je pense y partitciciper (au fait, pour le bonus, on pourrait le faire en Ook non ;) )
  • Partager sur Facebook
  • Partager sur Twitter
20 juillet 2008 à 21:55:38

Bienvenue !

Pour le OOk, pourquoi pas, le principe est globalement le même.
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
20 juillet 2008 à 21:59:16

Interpréteur BF envoyé.
Sympa ce langage, il porte bien son nom surtout quand on doit coder des programmes "complexes" ^^ .
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 9:01:49

Le BF a l'avantage d'être très proche du concept de machine de Turing qui est grossièrement l'abstraction mathématique de l'ordinateur.

Il se rapproche également de ce qu'était l'informatique à ses débuts où programmer voulait dire utiliser le langage machine et son jeu d'instruction pas beaucoup plus grand que celui du BF.
Pour ceux que le coté historique et "masturbation cérébrale" intéresse vous pouvez essayer de réaliser les petits codes suivants en BF (par ordre de difficulté):

1) Faire la somme de deux cases et mettre le résultat dans la cas d'à côté
2) Faire la multiplication de deux cases et mettre le résultat dans la cas d'à coté
3) Faire la somme mais avec retenue (si il y en a) et donc mettre le résultat dans 2 cases. (difficile)

Vous verrez alors que n'importe quel opération simple pour un humain est en réalité très complexe à écrire sous forme d'algorithme et de programme informatique. Et on a parlé ici que d'addition et de multiplication d'entier !
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
21 juillet 2008 à 9:37:27

Salut,
Pour ma part j'ai strictement rien compris au brainfuck o_O
Je ne vois pas comment ça marche :euh:

Cela aurait pu être un entrainement assez sympas de faire cela mais rien compris au BF alors ça va être chaud de coder un interpreteur BF :p

tcho
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 14:27:25

Regardes sur Wikipédia : pleins d'infos.
Sinon relis bien le post de Nanoc ^^ (merci Nanoc grâce à toi j'ai compris le BrainFuck, avant je connaissais ce langage mais je ne comprenais rien :p ).
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 15:44:09

Bonjour,

j'aurai aimé savoir comment vous faites pour insérer directement '\n' lors d'un retour à la ligne dans votre texte? Vous le faîtes à la main ou vous c/c juste le texte (de wikipédia par exemple) et les \n \t se mettent automatiquement ?

Merci ;)
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 15:58:21

A quoi est-ce que tu fais référence ?
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
21 juillet 2008 à 16:09:44

Ba étant donné que dans l'exercice sur les stats on doit compter le nombre de paragraphes. Il faut repérer par exemple une succession de 2 "\n" qui représenté un retour à la ligne + un saut de ligne donc un second paragraphe. C'est un peu la façon dont je vois la chose.

Le problème est que si je saisi du texte dans mon bloc notes et que je veux faire un seconde paragraphe (donc deux fois la touche entrée), concrètement il n'y a pas de "\n" qui apparait.

Je sais pas si je suis clair dans mon explication ^^.

EDIT: Je viens de trouver une solution à mon problème.

Merci
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 16:31:49

Si tu as trouvé une solution c'est parfait.

Le Bloc-note (ortho ?) n'affiche que les caractères affichables. Il remplace les '\n' et autres trucs par leur équivalent humain le retour à la ligne, la tabulation,...
Mais les symboles son réelement dans le fichier.
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
21 juillet 2008 à 16:37:52

tu es sur que ca insert bien les "\n" ?

Car si je demande à mon programme d'afficher le contenu de la chaine qu'il a lu ou bien de répérer les \n, ca ne fonctionne pas !

EDIT : tu peux m'expliquer ce problème de caractères, si le message n'a rien à faire ici, dis le moi je le delete

Image utilisateur
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 16:52:23

Non,non il a sa place. Je vais simplifier le tout.

Il existe 127 (128 ?) caractères standards parmi ceux-ci, les lettre minuscules, les majuscules, les chiffres, les parenthèses et symboles courants. Les 32 premiers caractères de ce qu'on apelle en fait la table ASCII sont des caractères "de contrôle" (pas sûr que ce soit le nom officiel). Ils représentent par exemple le retour à la ligne, la tabulation, le bip console :) , ou le caractère de fin de fichier.
Tous ces caractères (donc les 32) ne sont pas affichables. Il n'existe pas de symbole "Fin de fichier" ou "retour à la ligne".
Quand le bloc-note ou la console (c'est le même "problème") rencontre ce caractère, il ne va pas l'afficher (puisqu'il ne peut pas !) mais faire l'action correspondant. Par exemble passer à la ligne suivante ou insérer une tabulation.
Jusque là rien d'intéressant pour le programmeur.

Maintenant, quand je programme, et que je veux par exemple insérer un retour à la ligne dans un fichier (retour à la ligne qui ne sera visible que lors de l'ouverture avec le bloc-note), il me faut bien un symbole pour représenter ce caractère. Il s'agit de la combinaison '\n'. Le programme écrit donc bien \n (ou plutot son équivalent ASCII) dans le fichier. Mais ce symbole n'est pas visible et quand tu ouvres via le bloc-note, tu vois un retour à la ligne comme attendu.

Ca joue ?
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
21 juillet 2008 à 17:07:42

Citation : Nanoc

[...] Il existe 127 (128 ?) caractères standards [...]


128 car il ne faut pas oublier le zéro (caractère NUL)
voilà la table ASCII => http://www.asciitable.com/
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 17:19:03

Ba moi je voulais ajouter à la main '\n\n' des qu'il repère un saut de ligne (donc un nouveau paragraphe). Mais bon comme tu vois sur l'image, il insére un caractère spéciale.

Car ceci :
if(caractere == 'n' && ancienCaractere == '\\')


ne repère pas dans mon fichier de base les retour à la ligne :(

J'avoue être un peu perdue là.
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 17:21:01

le '\n' ce n'est pas deux caractères, mais un seul:
if(Caractere == '\n')
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 17:26:07

Phoen clique sur la petite loupe et tu verras le texte tel que bloc-note l'interprète.


À la lecture tu ne dois pas lire avec l'opérateur << car il va arrêter à chaque caractère blanc (espace, \t, \n, \r ; y en a-t-il d'autres ? ) et il ne l'ajoute pas dans la chaine résultante. Utilise std::getline() plutôt.
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 17:31:32

même avec

if(caractere == '\n')

il n'entre jamais dans la condition.

Mattex, en faite dans mon main() je parcours ligne par ligne mon fichier avec std::getline() et je concatène le tout dans un string nommé texte. Et après j'envoie ceci à ma fonction d'analyse.

Pourquoi le code dessus ne détecte pas mes retour à la ligne ?

Edit: quelle petite loupe ? :)
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 17:32:04

sinon il y a std::istream::get (mais je sais plus si ca prend les caratères blancs, il me semble que si)
char C = 0;
while(File.get(C))
{
   //...
}


ou attaque directement le std::streambuf

EDIT:
<delete>

sinon pour la lecture du fichier il y a plus simple que de tout le temps faire des std::getline()
#include <fstream>
#include <string>
#include <iterator>
#include <algorithm>

std::ifstream Ifs("file.txt");

std::istreambuf_iterator<char> Begin(Ifs);
std::istreambuf_iterator<char> End;

std::string String;

std::copy(Begin, End, std::back_inserter(String));
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 17:38:55

Citation : Phoen

même avec

if(caractere == '\n')


il n'entre jamais dans la condition.

Mattex, en faite dans mon main() je parcours ligne par ligne mon fichier avec std::getline() et je concatène le tout dans un string nommé texte. Et après j'envoie ceci à ma fonction d'analyse.

Pourquoi le code dessus ne détecte pas mes retour à la ligne ?

Edit: quelle petite loupe ? :)



Si je me trompe pas, par defaut, getline lit tout le flux jusqu'au caractère '/n' et retourne la chaine lu donc si tu met tout bout a bout tu as tout le fichier sans les retour a la ligne.
  • Partager sur Facebook
  • Partager sur Twitter
FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
21 juillet 2008 à 17:44:37

Freedom dit vrai... tu dois ajouter le '\n' après un std::getline si tu veux le conserver dans la chaine.

Chlab_lak >> ??? std::string peut contenir tout les caractères. Même plusieurs '\0' ou pas du tout.


<EDIT>Tu utilise Visual alors regarde dans ton image et il y a une petite loupe dans le menu contextuel qui affiche la valeur de ta chaine. Clique dessus!</EDIT>
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 17:53:24

Citation : nono212

Regardes sur Wikipédia : pleins d'infos.
Sinon relis bien le post de Nanoc ^^ (merci Nanoc grâce à toi j'ai compris le BrainFuck, avant je connaissais ce langage mais je ne comprenais rien :p ).


Déjà fait au moins 5 fois à chaque fois mais je pédale dans la semoule o_O
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 17:55:24

En utilisant la méthode de chlab_lak, le tableau Array contient tout le texte mais toujours pas les \n :(


Edit:

while(getline(fichier, ligne))
{
     texte+=ligne+'\n';
}


En faisant ceci, ca fonctionne. Par contre j'aimerai bien que ca fonctionne avec la technique de chlab_lak, car c'est un peu lourd de multiplier les getline() non ?
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 18:03:49

Bon j'ai répondu ici, j'ai oubliés dans quel sujet on était. Ça m'arrive trop souvent.

Phoen >> Démarre un nouveau sujet pour répondre à ta question.

Tout le monde : ne répondez plus ici, ça ne sert à rien ce n'est pas le bon sujet !

Suite des discutions sur les exercices (Et pas sur les problèmes rencontrés)


Désolé Nanoc (et tout le monde) de ne pas avoir agit plus tôt.
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 18:11:47

Citation : MatteX

Chlab_lak >> ??? std::string peut contenir tout les caractères. Même plusieurs '\0' ou pas du tout.



en effet, je viens de tester, toutes mes excuses.

de plus j'ai fais une erreur dans le code que j'ai monté, j'edit
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2008 à 18:27:25

Citation : Gollum

Citation : nono212

Regardes sur Wikipédia : pleins d'infos.
Sinon relis bien le post de Nanoc ^^ (merci Nanoc grâce à toi j'ai compris le BrainFuck, avant je connaissais ce langage mais je ne comprenais rien :p ).


Déjà fait au moins 5 fois à chaque fois mais je pédale dans la semoule o_O



Qu'est-ce que tu ne comprends pas ? (Cet exercice est plus difficile que les autres et c'est voulu. Les exercices de début de mois sont plus simples.)
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
21 juillet 2008 à 21:39:38

Phoen, pour mettre tout le texte dans une string, tranfere le fichier dans un buffer (voir faq developpez.com) puis passe le dans une string (avec la méthode .str() sur le buffer)
  • Partager sur Facebook
  • Partager sur Twitter
FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
21 juillet 2008 à 22:19:27

@Freedom: les deux méthodes sont possibles, elles sont toutes les deux efficaces et tiennent en quelques lignes.
  • Partager sur Facebook
  • Partager sur Twitter