Aller au menu - Aller au contenu

[Exercices] Venez vous entraîner !

Ce mois: Parseur de fonctions mathématiques

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page Précédente  1  2  3  ...  31  32  33  34  35  36  37  38  39  Suivante
Auteur Message
2 visiteurs sur ce sujet (1 membre et 1 Anonyme) : CX
Page Précédente  1  2  3  ...  31  32  33  34  35  36  37  38  39  Suivante
Hors ligne Nanoc # Posté le 31/03/2009 à 18:03:51
Refuseur de tutoriels
Avatar
Validateurs

Ville : Lausanne
Pays : Suisse
études : EPFL

Reprise du dernier message de la page précédente :
Mmmh je crois qu'on a compris.

Je pense pas que ce soit le lieu pour un comparatif entre établissements scolaires ni pour un débat sur l'éducation...

Mes tutos : [C++] Notions avancées (suite du tuto de M@teo21)
Autres : Exercices de C++ pour tous les niveaux ! --- Mots-clés du C++
 
Hors ligne Nanoc # Posté le 31/03/2009 à 21:45:27
Refuseur de tutoriels
Avatar
Validateurs

Ville : Lausanne
Pays : Suisse
études : EPFL

Solution du mois de janvier 2009



Re-Bonjour tout le monde ! Il est temps que je dévoile avec encore plus de retard, une solution pour l'exercice du mois de janvier. Vous avez été 8 à m'envoyer une solution. Ce n'est pas beaucoup, surtout que l'exercice était relativement simple et court.

Voici ma solution.

Partie "Papier-Crayon"



Il n'y avait pas grand chose à faire ici. L'algorithme étant entièrement décrit dans la donnée. L'exercice consistait surtout à utiliser correctement les fonctions du C++ pour la lecture de fichiers.

Choix des structures de données



Là non plus, pas de grande difficulté. Le choix naturel d'utiliser les fstream est certainement la meilleure option. Reste à voir comment les utiliser pour faire ce que l'on veut.

Documentation



En farfouillant un peu dans la documentation de la classe ifstream, on tombe rapidement sur la fonction read() qui permet de lire les données directement depuis le flux dans un tableau de caractères.

De même, la documentation de ofstream, nous mène directement vers la fonction write() permettant d'écrire le contenu d'un tableau de caractères dans un fichier.

Programmation



Les deux fonctions citées ci-dessus attendent en argument un tableau de caractères. Nous ne voulons "jouer" qu'avec un seul caractère à la fois, nous aurons donc simplement un tableau de taille 1.

La fonction de cryptage/décryptage est alors:


Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//Crypte un fichier et écrit le résultat dans un nouveau fichier
void crypte(const string& cle,const string& fichier,const string& nouveauFichier)
{
    //On verifie que le fichier d'entrée est différent du fichier de sortie
    if(fichier == nouveauFichier)
        throw string("Le fichier d'entrée est le même que le fichier de sortie");

    //On ouvre les deux fichiers
    ifstream entree(fichier.c_str());
    ofstream sortie(nouveauFichier.c_str());

    //Un "iterateur" sur la cle pour avoir la position courante dans la cle
    int i=0;

    //Un caractère temporaire (= tableau de taille 1)
    char temp;

    //Tant qu'on a pas atteind la fin du fichier, on lit un caractère
    while (entree.read(&temp,1))
    {
        //On utilise le XOR sur le caractère avec le caractère courant de la clé
        temp ^= cle[i];

        //On écrit le résultat dans le fichier de sortie
        sortie.write(&temp,1);

        //On passe au caractère suivant de la clé
        ++i;
        i%=cle.size();
    }
}


Il ne reste plus alors qu'à ajouter un main() qui lit les paramètres et les envoit à la fonction. Le code complet est donc:

Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

//Crypte un fichier et écrit le résultat dans un nouveau fichier
void crypte(const string& cle,const string& fichier,const string& nouveauFichier)
{
    //On verifie que le fichier d'entrée est différent du fichier de sortie
    if(fichier == nouveauFichier)
        throw string("Le fichier d'entrée est le même que le fichier de sortie");

    //On ouvre les deux fichiers
    ifstream entree(fichier.c_str());
    ofstream sortie(nouveauFichier.c_str());

    //Un "iterateur" sur la cle pour avoir la position courante dans la cle
    int i=0;

    //Un caractère temporaire (= tableau de taille 1)
    char temp;

    //Tant qu'on a pas atteind la fin du fichier, on lit un caractère
    while (entree.read(&temp,1))
    {
        //On utilise le XOR sur le caractère avec le caractère courant de la clé
        temp ^= cle[i];

        //On écrit le résultat dans le fichier de sortie
        sortie.write(&temp,1);

        //On passe au caractère suivant de la clé
        ++i;
        i%=cle.size();
    }
}

int main(int argc, char** argv)
{

    //On verifie que le nombre d'arguments est correct
    if(argc < 3 || argc > 4)
    {
        cerr << "ERREUR: Nombre de paramètres incorrects. \n 2 ou 3 paramètres attendus.";
        return 1;
    }

    //On lit les parametres
    const string cle(argv[1]);
    const string fichier(argv[2]);
    string fichierSortie;

    //Pour le fichier de sortie, si il n'est pas donne on le cree a partir du fichier d'entree
    if(argc == 4)
        fichierSortie = argv[3];
    else
        fichierSortie = fichier + ".crypt";

    //Et finalement, on crypte
    try{
        crypte(cle,fichier,fichierSortie);
    }
    catch(const string& e)
    {
        cerr << "ERREUR: " << e << endl;
        return 1;
    }

    return 0;
}


On peut alors utiliser le programme comme suit:

Code : Console
crypt 23fsaddai aCrypter.txt result.crypt


Voilà voilà. La suite de la crypto après l'exercice sur les polynômes.
Édité le 01/04/2009 à 13:38:41 par Nanoc

Mes tutos : [C++] Notions avancées (suite du tuto de M@teo21)
Autres : Exercices de C++ pour tous les niveaux ! --- Mots-clés du C++
 
Hors ligne lmghs # Posté le 31/03/2009 à 23:28:17

Le while de lecture n'est pas bon.
Le test doit être réalisé juste après le read. Sinon il y a aura exploitation d'un caractère invalide ou du dernier 2 fois.
 
Hors ligne Nanoc # Posté le 01/04/2009 à 13:40:09
Refuseur de tutoriels
Avatar
Validateurs

Ville : Lausanne
Pays : Suisse
études : EPFL

En effet. Corrigé.

Merci.

Mes tutos : [C++] Notions avancées (suite du tuto de M@teo21)
Autres : Exercices de C++ pour tous les niveaux ! --- Mots-clés du C++
 
Hors ligne sam101 # Posté le 01/04/2009 à 14:53:24
Avatar

Ville : Gargenville
Pays : France métropolitaine

Les polynomes ça se voit en première scientifique dans R non ?.. Allez, je tente :)

=)..
 
Hors ligne Nanoc # Posté le 01/04/2009 à 16:02:24
Refuseur de tutoriels
Avatar
Validateurs

Ville : Lausanne
Pays : Suisse
études : EPFL

Citation : Nanoc
Mmmh je crois qu'on a compris.

Je pense pas que ce soit le lieu pour un comparatif entre établissements scolaires ni pour un débat sur l'éducation...

Mes tutos : [C++] Notions avancées (suite du tuto de M@teo21)
Autres : Exercices de C++ pour tous les niveaux ! --- Mots-clés du C++
 
Hors ligne guigui' # Posté le 01/04/2009 à 16:57:21

études : UTC

Pour ceux qui veulent un peu documentation sur les polynômes voici le pdf actif du cours de mon école (UTC)
cours polynômes
Édité le 01/04/2009 à 17:12:16 par guigui'

Vive la doc de Qt !!
 
Hors ligne Nanoc # Posté le 01/04/2009 à 17:23:04
Refuseur de tutoriels
Avatar
Validateurs

Ville : Lausanne
Pays : Suisse
études : EPFL

Ton lien n'est pas accessible (et c'est normal c'est un document interne).

Mes tutos : [C++] Notions avancées (suite du tuto de M@teo21)
Autres : Exercices de C++ pour tous les niveaux ! --- Mots-clés du C++
 
Hors ligne guigui' # Posté le 01/04/2009 à 21:28:57

études : UTC

Pas accessible ?? bizarre j'ai vérifié avant de mettre le lien, je ne me suis pas loggué pour y accédé !
Perso pour moi il marche le lien ! et je suis quasi sûr de ne pas être loggué (il l'affiche normalement) bas tant pis alors!

EDIT : en fais il est possible que la 1er fois que vous suivez le lien vous tombez sur la page d'accueil, mais en suivant le lien une 2eme fois vous tombez bien sur le pdf.
Édité le 02/04/2009 à 10:24:54 par guigui'

Vive la doc de Qt !!
 
Hors ligne Darkelfe # Posté le 02/04/2009 à 08:55:18
Apprendre tout sur tout !
Avatar

Ville : Brignais
Pays : France métropolitaine
études : IUT A Lyon 1

chez moi sa passe

Envie de partager vos créations avec d'autre programmeurs ? Une seule adresse :
Image utilisateur
 
Hors ligne pepetiti # Posté le 02/04/2009 à 11:39:04
Epitech Nantes promo 2014
Avatar

études : EPITECH Nantes

Dites, je n'ai pas l'impression que ma réponse ait été prise en compte (pour le cryptage XOR), j'ai envoyé un mp à Reponse_Exercice mais le message est toujours en non lu, est-ce normal ?
 
Hors ligne guigui' # Posté le 02/04/2009 à 12:20:30

études : UTC

Citation : Nanoc
Citation : Cyprien_
Il y a juste un truc qui m'intrigue pour les polynômes, il s'agit de la comparaison de deux polynômes.

Pour comparer deux flottants, je crois qu'il est impossible d'utiliser == et !=, il faut se donner une erreur.
Mais comment généraliser ça à un type template ?


Théoriquement, la classe Polynome ne fera qu'utiliser l'opérateur == surchargé de la classe utilisée comme type. Le problème est donc reporter vers la classe utilisée comme type.
Pour les types POD (double, float, ...), on peut toujours spécialiser la fonction.


Ayant déjà fini l'exercice je souhaiterais approfondir ce point !
Quel sont exactement les spécificités apportés au type POD pour les comparaisons ??
Comment faire un comparaisons de 2 float en utilisant une marge d'erreur ??
(me suis jamais possé la question j'aurais bêtement fais un == )

D'avance merci pour vos éclaircissement !

Vive la doc de Qt !!
 
Hors ligne lmghs # Posté le 02/04/2009 à 13:24:40

s/POD/flottants/
int est POD, FILE est POD, T* est POD, etc.

Et réponse dans la FAQ de développez: http://cpp.developpez.com/faq/cpp/?pag [...] ons_flottants
 
Hors ligne Nanoc # Posté le 02/04/2009 à 13:39:13
Refuseur de tutoriels
Avatar
Validateurs

Ville : Lausanne
Pays : Suisse
études : EPFL

Citation : pepetiti
Dites, je n'ai pas l'impression que ma réponse ait été prise en compte (pour le cryptage XOR), j'ai envoyé un mp à Reponse_Exercice mais le message est toujours en non lu, est-ce normal ?


Si si t'en fais pas. J'utilise lu/non-lu pour trier. Ton code faisait une lecture sur eof() -> pas OK.

EDIT: Plus de 1000 réponses !
Édité le 02/04/2009 à 13:41:36 par Nanoc

Mes tutos : [C++] Notions avancées (suite du tuto de M@teo21)
Autres : Exercices de C++ pour tous les niveaux ! --- Mots-clés du C++
 
Hors ligne guigui' # Posté le 02/04/2009 à 15:33:24

études : UTC

Sans ajouter beaucoup de difficulté, on peut ajouter une fonction qui renvoi la dérivé du polynôme !
Polynome polynome::derive()

EDIT :
Voir pourquoi pas une fonction qui calcule une primitive (qui s'annule en zéro ou avec une constante)
Polynome polynome::primitive()
Polynome polynome::primitive( T constante)
Édité le 02/04/2009 à 15:52:36 par guigui'

Vive la doc de Qt !!
 
Hors ligne iCe_sCrEAm # Posté le 02/04/2009 à 16:36:17
Smoking heals
Avatar

This is gonna be a piece of cake !!
A quel ensemble est-ce que notre polynome appartient ?? |R ??
Édité le 02/04/2009 à 16:37:26 par iCe_sCrEAm

#include <www.siteduzero.com>

#ifnread tuto_c++
#read tuto_c++
 
Hors ligne Freedom # Posté le 02/04/2009 à 16:43:36
I can ... but I won'r
Avatar

Le polynome appartient a l'ensemble des polynomes a une indeterminé dans R (je pense) pour les 2° premiers niveau, et pour ne 3° niveau il s'agit justement d'étendre a n'importe quel ensemble tant que c'est mathématique cohérent.
 
Hors ligne Nanoc # Posté le 02/04/2009 à 16:45:31
Refuseur de tutoriels
Avatar
Validateurs

Ville : Lausanne
Pays : Suisse
études : EPFL

Citation : guigui'
Sans ajouter beaucoup de difficulté, on peut ajouter une fonction qui renvoi la dérivé du polynôme !
Polynome polynome::derive()

EDIT :
Voir pourquoi pas une fonction qui calcule une primitive (qui s'annule en zéro ou avec une constante)
Polynome polynome::primitive()
Polynome polynome::primitive( T constante)


Pourquoi pas. Aller plus loin n'est pas interdit !!

Mes tutos : [C++] Notions avancées (suite du tuto de M@teo21)
Autres : Exercices de C++ pour tous les niveaux ! --- Mots-clés du C++
 
Hors ligne guigui' # Posté le 02/04/2009 à 21:29:06

études : UTC

Je suis confronté à un petit dilemme :
Pour stocker mes coefficients j'utilise une map mais la fonction :
T map<KEY,T>::operator[](const KEY key)
qui permet d'accéder au élément contenu n'est pas une fonction const (normale puisqu'elle offre là possibilité de modifié cette élément).
Du coup, si je souhaite rendre une fonction (ou un paramètre) const je suis obligée de crée une copie de ma map au lieu de me servir direct de celle-ci.

La question est la suivante :
Qu'est t-il préférable : ne pas rendre la fonction et les paramètre constant (alors qu'ils le sont) ou crée à chaque fois une copie (quitte à alourdir le programme) ??
Édité le 02/04/2009 à 21:29:49 par guigui'

Vive la doc de Qt !!
 
Hors ligne Nanoc # Posté le 02/04/2009 à 21:32:57
Refuseur de tutoriels
Avatar
Validateurs

Ville : Lausanne
Pays : Suisse
études : EPFL

Je poserais la question différemment:

Pourquoi utiliser une map ?

http://cpp.developpez.com/faq/cpp/inde [...] oix_conteneur

Mes tutos : [C++] Notions avancées (suite du tuto de M@teo21)
Autres : Exercices de C++ pour tous les niveaux ! --- Mots-clés du C++
 
Hors ligne lmghs # Posté le 02/04/2009 à 21:54:03

La map peut avoir du sens pour X^42 + X^2. Mais cela va-t-il souvent se produire ?
Sinon, pour les accesseurs non modifiants qui vont taper dans des membres de type map, il faut appeler la fonction std::map::find. Il n'y a pas vraiment le choix.
 
Hors ligne guigui' # Posté le 03/04/2009 à 00:03:56

études : UTC

Je t'accorde Nanoc que la map n'est peut être pas le plus adapter mais il me paraissais très bien pour les situations telle que celle proposé par Lmghs X^42 + X^2, même si au finale c'est assez rare.
Bref j'ai utilisé une map et je trouver finalement ça assez agréable. (je voyais pas trop comment faire avec un vector ou autre sans trop me faire chier et là c'est cool)

Lmghs merci de ton aide, c'était effectivement la bonne solution (je l'avais aperçut mais avais un doute), et en jouant bien j'ai obtenu quelque chose de propre et claire (et aprioris rapide).


EDIT:
Bon, maintenant que j'ai ajouté la dérivée et les primitives j'ai plus trop d'idée d'ajout pour la classe ...
Donc a moins que quelqu'un est une idée d'ajout je vais pouvoir rendre ma copie ! ^^
Édité le 03/04/2009 à 00:07:47 par guigui'

Vive la doc de Qt !!
 
Hors ligne lmghs # Posté le 03/04/2009 à 00:40:00

Il y a toutes sortes de choses à s'assurer:
- const-correctness
- symétries
- exception-safety
- justesse des calculs

Il y a des outils adaptés à ce type de développement pour le dernier point tout particulièrement -> les test-unitaires

Et après c'est tout comme les matrices: il y a de quoi amuser débutants et experts.
- quid d'avoir des politiques pour exploiter en interne des vecteurs (cas courant), ou des map (cas de polynômes "creux" X^42+X^2)
- recherche des racines (ça c'est des maths)
- optimisation (pour wanabe-gurus) dans le cas vecteur pour éviter d'avoir à construire trop de temporaires (chercher expression-template ; c'est ce qui est fait dans Blitz++, newmat, boost.ublas)

Bref, si tu t'embêtes, il y a de quoi s'occuper et apprendre sur ce genre de projets. :)
 
Hors ligne Nanoc # Posté le 03/04/2009 à 00:56:02
Refuseur de tutoriels
Avatar
Validateurs

Ville : Lausanne
Pays : Suisse
études : EPFL

Mon implémentation utilise un std::vector et j'ai tenté il y a pas longtemps une version avec une map.

Je vais peut-être me pencher un de ces jours sur une implémentation avec une liste. Le random access n'ayant que peu d'intérêt, cela peu-être un choix. A voir...

Mes tutos : [C++] Notions avancées (suite du tuto de M@teo21)
Autres : Exercices de C++ pour tous les niveaux ! --- Mots-clés du C++
 
Hors ligne Stokastik38 # Posté le 03/04/2009 à 09:36:18

études : ENSAM Cluny

Bonjour,
Veuillez noter qu'il y a une petite erreur puisque le polynôme nul est, en fait, de degré (-infini) (ceci est une convention).

Hors ligne guigui' # Posté le 03/04/2009 à 10:55:13

études : UTC

Merci Lmghs pour tes idées !

Par-contre si tu pouvais m'expliquer ce que tu entend par symétrie ?!
Là j'avoue ne pas savoir/voir de quoi tu parle.

Vive la doc de Qt !!
 
Hors ligne Nanoc # Posté le 03/04/2009 à 11:39:32
Refuseur de tutoriels
Avatar
Validateurs

Ville : Lausanne
Pays : Suisse
études : EPFL

Il parle de symétrie des opérateurs si je ne m'abuse.

Mes tutos : [C++] Notions avancées (suite du tuto de M@teo21)
Autres : Exercices de C++ pour tous les niveaux ! --- Mots-clés du C++
 
Hors ligne guigui' # Posté le 03/04/2009 à 12:25:00

études : UTC

Dsl ça m'aide pas !! (des lacunes sûrement !!)

Vive la doc de Qt !!
 
Hors ligne Nanoc # Posté le 03/04/2009 à 12:30:54
Refuseur de tutoriels
Avatar
Validateurs

Ville : Lausanne
Pays : Suisse
études : EPFL

Hors ligne lmghs # Posté le 03/04/2009 à 13:54:44

Oui.
C'est pour faire en sorte que "1+P", "P+1", "P+P" fonctionnent tous. C'est d'autant plus visible quand il y a des conversions implicites au milieu.

Si vous définissez les opérateurs comme ils sont décrits dans le tuto du sdz, il y aura des déséquilibres à cause des conversions implicites qui ne pourront pas s'opérer sur le membre gauche.
 
Hors ligne guigui' # Posté le 03/04/2009 à 14:52:15

études : UTC

OK, donc en suivant ce que tu dit Lmghs (merci pour le lien Nanoc)
là où moi j'ai fais :
Code : C++
1
2
3
4
5
6
template<class T> Polynome<T> operator+(const T a,const Polynome<T>& poly);
// Pour a + P
Polynome< T > Polynome< T >::operator+(const Polynome< T > &poly) const;
// Pour P + P
Polynome< T > Polynome< T >::operator+(const T a) const;
// Pour P + a


Toi tu ferais juste :
Code : C++
1
2
3
4
template<class T> Polynome<T> operator+(const T a,const Polynome<T>& poly);
// Pour a + P   ET  pour P + a
template<class T> Polynome<T> operator+(const Polynome< T > &poly,const Polynome< T > &poly2);
// Pour P + P


C'est bien ça ??

Donc je vient d'apprendre que operator+( T , A) marche pour T+A et pour A+T.

Et bien merci pour ce "cours".
Et je vais de ce pas aléger ma classe !
Édité le 03/04/2009 à 14:53:43 par guigui'

Vive la doc de Qt !!
 

Retour au forum "Langage C++" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx