Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Exercices] Venez vous entraîner !

Ce mois: Parseur de fonctions mathématiques

26 juin 2011 à 20:44:37

Il n'y a pas de "vraie struct" en C++, comme l'a très bien dit Freedom.

Et pour l'héritage c'est vrai que je pourrais me dispenser du public, mais je préfère le préciser en toutes circonstances, pour éviter ce genre de confusion justement.
  • Partager sur Facebook
  • Partager sur Twitter
27 juin 2011 à 0:36:23

Pourquoi une map ?
Un simple std::function<void (void)> [127] suffit -- ou autre type moins fonctionnel qui suit le hack pattern-commande. L'espace officiel des commandes c'est de l'ASCII pur. Une map, ça me parait lourd pour si peu de possibilités.
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
27 juin 2011 à 9:54:27

Citation : lmghs

Pourquoi une map ?
Un simple std::function<void (void)> [127] suffit -- ou autre type moins fonctionnel qui suit le hack pattern-commande. L'espace officiel des commandes c'est de l'ASCII pur. Une map, ça me parait lourd pour si peu de possibilités.


Ben parce que j'ai pas envie de me farcir les 256 lignes pour le remplir, voilà pourquoi !
m_com[' '] = &ScriptInterpretor::actNothing;

    m_com['@'] = &ScriptInterpretor::actArobase;
    m_com['v'] = &ScriptInterpretor::actv;
    m_com['^'] = &ScriptInterpretor::actCaret;
    m_com['>'] = &ScriptInterpretor::actMoreThan;
    m_com['<'] = &ScriptInterpretor::actLessThan;

    m_com['0'] = &ScriptInterpretor::act0;
    m_com['1'] = &ScriptInterpretor::act1;
    m_com['2'] = &ScriptInterpretor::act2;
    m_com['3'] = &ScriptInterpretor::act3;
    m_com['4'] = &ScriptInterpretor::act4;
    m_com['5'] = &ScriptInterpretor::act5;
    m_com['6'] = &ScriptInterpretor::act6;
    m_com['7'] = &ScriptInterpretor::act7;
    m_com['8'] = &ScriptInterpretor::act8;
    m_com['9'] = &ScriptInterpretor::act9;

    m_com['+'] = &ScriptInterpretor::actPlus;
    m_com['-'] = &ScriptInterpretor::actMinus;
    m_com['*'] = &ScriptInterpretor::actAsterisk;
    m_com['/'] = &ScriptInterpretor::actSlash;
    m_com['%'] = &ScriptInterpretor::actPercent;
    m_com['.'] = &ScriptInterpretor::actPoint;
    m_com['&'] = &ScriptInterpretor::actAmpersand;

    m_com['$'] = &ScriptInterpretor::actDollar;
    m_com[':'] = &ScriptInterpretor::actColon;
    m_com['\\'] = &ScriptInterpretor::actAntiSlash;

    m_com['!'] = &ScriptInterpretor::actExclamation;
    m_com['`'] = &ScriptInterpretor::actSpacingGrave;
    m_com['_'] = &ScriptInterpretor::actUnderscore;
    m_com['|'] = &ScriptInterpretor::actPipe;


    m_com['"'] = &ScriptInterpretor::actQuotation;
    m_com[','] = &ScriptInterpretor::actComma;
    m_com['~'] = &ScriptInterpretor::actTilde;

    m_com['#'] = &ScriptInterpretor::actNumber;
    m_com['?'] = &ScriptInterpretor::actInterrogation;


    m_com['p'] = &ScriptInterpretor::actp;
    m_com['g'] = &ScriptInterpretor::actg;
    //c'est assez long comme ça, non ?


De plus, je ne connais pas d'équivalent propre à cette condition :
if(m_com.find(c) != m_com.end())
        (this->*m_com[c])();
  • Partager sur Facebook
  • Partager sur Twitter
27 juin 2011 à 11:49:23

ah ah! Il suffit de faire une boucle.
std::fill_n(&m_command[0], array_size(m_commands),
    [&] { invalid_op(m_instruption_pointer);}
);
m_command[' '] = [] {};
for(char c='0'; c<='9' ; ++c)
    m_commands[c] = [&,c] { toss().push(c-'0'); };
m_commands['+'] = [&] { math_op2(std::plus<int>()); };

Certes J'utilise le C++11, mais n'empêche qu'il suffit tout simplement de définir la fonction invalid_op qui va exploiter les infos tirées du pointeur d'instruction (son positionnement et le caractère courant) afin de construire le message d'erreur.

array_size est une macro non standard (si quelqu'un a trouvé l'équivalent dans la nouvelle norme, je suis preneur), et math_op2 un truc que j'ai défini pour l'occasion vu que les codes des opérations mathématiques (et de la comparaison) est toujours le même (à part pour / et % qui supportent la division par 0).
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
27 juin 2011 à 12:29:25

Un tout petit peu trop imbuvable pour moi :).
Comment t'implémente un debugger là-dessus ?
  • Partager sur Facebook
  • Partager sur Twitter
27 juin 2011 à 12:58:08

Je n'implémentes pas de débuger.
Et quand on s'en sert, je ne vois pas ce que cela change. Cela va marcher comme pour un switch. Et rien n'interdit les références à des fonctions. C'est pareil, mais moins lourd à écrire quand il faut binder des paramètres.

PS: si c'est le sigle toss() qui te gêne, c'est juste le terme officiel de la spec bf98.
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
27 juin 2011 à 16:28:27

@lmghs: Je ne crois pas qu'il y est quelque chose dans la STL pour faire ca (par contre en cherchant je suis tombé sur extent et rank qui peuvent être utile quand on manipule des tableaux C), mais on ne pourrait pas le faire avec une constexpr fonction (pour pouvoir l'utiliser au même endroit qu'une "vraie" constante) ? Comme :
template<class T, size_t N>
constexpr size_t bound(T (&)[N])
{ return N; }
//Ou
template<class T>
constexpr size_t bound(T&)
{ return std::extent<T>::value; }

GCC (4.5) râle sur le type du paramètre en disant que ce n'est pas un type litéral, sauf que dans la norme un "reference type" en est un (section 3.9). J'oublie quelque chose ou c'est ma version de GCC qui n'est pas au point sur cette feature ?
  • Partager sur Facebook
  • Partager sur Twitter
FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
27 juin 2011 à 17:30:53

gcc 4.5 ne supporte pas les constexpr. (et ce code marche avec gcc 4.6 / 4.7)
  • Partager sur Facebook
  • Partager sur Twitter
27 juin 2011 à 17:35:49

gcc 4.6 me file des messages d'erreurs peu clairs ici.
Je peux appeler extent directement en jouant avec decltype.
Ensuite, je n'ai pas souvenir que T& puisse matcher un tableau statique dans une fonction template. Je dirais que le problème vient de là.
Concernant la première fonction, gcc me la refuse comme constante par contre
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
27 juin 2011 à 17:50:29

Citation : lmghs

gcc 4.6 me file des messages d'erreurs peu clairs ici.
Je peux appeler extent directement en jouant avec decltype.
Ensuite, je n'ai pas souvenir que T& puisse matcher un tableau statique dans une fonction template. Je dirais que le problème vient de là.
Concernant la première fonction, gcc me la refuse comme constante par contre



$ cat main.cpp 
#include <cstddef>
  
template<class T, size_t N>
constexpr size_t bound(T (&)[N])
{ return N; }


template <size_t N>
void dsp()
{}

int main()
{
    int tab[10];

    dsp<bound(tab)>();
}
$ g++ -std=c++0x main.cpp 
$ g++ -v
gcc version 4.6.1 20110526 (prerelease) (Debian 4.6.0-10)
  • Partager sur Facebook
  • Partager sur Twitter
27 juin 2011 à 17:59:27

OK. Je vois. Le problème arrive quand le tableau est une variable membre.
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
27 juin 2011 à 18:09:09

Au fait std::extent fait exactement ça. (je l'avais loupé celui là). Pas besoin d'essayer de la jouer clever :


template <typename T>
void foo(const T& t)
{
    std::cout << std::extent<T>::value;
}

int main()
{
    int tab[10];
    foo(tab);
}


Bien entendu il renvoie une std::integral_constant donc ::value est aussi une constexpr.

Citation : lmghs


OK. Je vois. Le problème arrive quand le tableau est une variable membre.



Hum, t'as un snippet? Je vois pas de raison immédiate pour que ça marche pas.
  • Partager sur Facebook
  • Partager sur Twitter
27 juin 2011 à 18:43:01

J'ai préféré continuer par là: http://www.siteduzero.com/forum-83-663 [...] ecpr-cie.html (même si on devrait arriver à la fin de la digression)
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
28 juin 2011 à 9:37:29

Je rappelle à tous ceux qui souhaitent continuer à trouver des exercices en C++ que nous aimerions avoir l'avis de tous les concernés sur ce sujet :
[meta][exercices] de l'organisation
  • Partager sur Facebook
  • Partager sur Twitter
28 juin 2011 à 20:59:29

Le topic a été créé, comme ça il y a un endroit où on peut reprendre les exercices, avec une liste que je vous encourage à aider à remplir.

http://www.siteduzero.com/forum-83-664 [...] ntrainer.html

(Je n'ai pas encore eu le temps de noter la difficulté des exercices, et je dois me déconnecter d'internet pour le moment, mais n'hésitez surtout pas à proposer vos notes de difficulté. Pour le moment, j'ai uniquement repris les exercices de Nanoc, mais il y aurait aussi l'interpréteur Befunge à reprendre, par exemple.)
  • Partager sur Facebook
  • Partager sur Twitter
24 août 2011 à 19:10:14

Quelqu'un pourrait t-il m'éclairer sur la façon de convertir un nombre decimal en binaire ? C'est en ce qui concerne l'exercice sur la cryptographie XoR.
  • Partager sur Facebook
  • Partager sur Twitter
24 août 2011 à 19:13:38

Ce n'est pas le bon endroit, pose ta question dans le forum.
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
24 août 2011 à 19:36:06

Ok merci, j'ai trouvé en faisant un recherche sur le forum finalement.
  • Partager sur Facebook
  • Partager sur Twitter
17 novembre 2011 à 18:00:04

bonsoir je suis nouvelle où je peux trouver l'exercice du moi de novembre
  • Partager sur Facebook
  • Partager sur Twitter
17 novembre 2011 à 18:30:49

Ce sujet est arrêté, va plutôt voir la nouvelle version (qui fonctionne d'ailleurs différemment ;) )
Exercices C++ (v2)
  • Partager sur Facebook
  • Partager sur Twitter
29 février 2012 à 18:55:51

J'ai déja tenté un projet dans le genre qui cryptait et décryptait une chaîne en déplaçant les lettres dans un sens donné (gauche ou droite) d'un certain rang (-1,0,3...). J'aimerai bien m'aventurer de nouveau, mais je code plus en c qu'en c++, et je ne sais pas si ca ne serait pas mal vu??
  • Partager sur Facebook
  • Partager sur Twitter
29 février 2012 à 22:56:21

En quoi ça pourrait être mal vu ? Je ne comprends pas ? Tu es encore libre de choisir le langage de programmation que tu veux, non ? ^^
  • Partager sur Facebook
  • Partager sur Twitter
27 septembre 2012 à 11:49:13

bonjour,

j'essaie de réaliser ce programme en langage C.
j'ai un petit probleme je n'arrive pas a faire pour qu'il m'ecrit le reste de la phrase en dessous..

merci
  • Partager sur Facebook
  • Partager sur Twitter
27 septembre 2012 à 12:01:10

Sans nous montrer le code que tu as déjà fait ça va être dur de t'aider, sachant qu'en plus on ne sais pas quel exercice tu fais sachant qu'il y en a des dizaines sur ce topic.
  • Partager sur Facebook
  • Partager sur Twitter
19 mai 2013 à 20:23:14

comment ecrire des programme extension .dll dans de domaine jene me retouve pas eclaissisez moi svp
  • Partager sur Facebook
  • Partager sur Twitter
20 mai 2013 à 18:11:37

hugbo : crée un nouveau sujet pour expliquer ton problème. Ce n'est pas poli de venir squatter le sujet des autres ! De plus, tu dois chercher par toi-même avant, et pas juste venir demander à ce qu'on fasse le travail à ta place.

Merci ;) .

  • Partager sur Facebook
  • Partager sur Twitter

Ma vraie biographie - Ex-Manager de la Validation sur le Site du Zéro - sdlm.be - Horus.aero

20 mai 2013 à 22:49:48

Excusez-moi! J'ai pris bonne note.
  • Partager sur Facebook
  • Partager sur Twitter
29 mai 2013 à 23:21:50

Bonjour,

les raccourcis vers les commentaires pour avoir accès plus facilement aux exercices et correction ne fonctionne apparemment plus . Sans doute a cause de la nouvelle version du site du zéro.

Y a t il moyen de faire quelque chose, parce que c'est assez lent de chercher dans toutes les pages (surtout qu'il y en a 45^^).

Merci d'avance.

Edit : c'est bon j'ai vu qu'il y avait une V2 ou y avait déjà tous ces exercices.

-
Edité par STYLOintelligent 29 mai 2013 à 23:41:29

  • Partager sur Facebook
  • Partager sur Twitter
30 mai 2013 à 0:02:41

Si tu regardes bien, dans l'ancienne url, il y a un indique sur le numéro de la page qu'il faut alors injecter dans la nouvelle URL
  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
30 mai 2013 à 0:17:23

Hmmmmm,
ça sert ps un grand chose maintenant vu que je suis sur la V2, mais tu pourrais me dire où tu vois ça s'il te plaît ^^ Par ce que j'avais cherche et j'avais pas trouvé . ça pourra toujours me servir .

merci

  • Partager sur Facebook
  • Partager sur Twitter