Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C++ > [Exercices] Venez vous entraîner ! > Lecture du sujet

[Exercices] Venez vous entraîner !

Un nouvel exercice chaque mois

Vous devez être inscrit pour pouvoir poster des messages

Page : Précédente  1  2  3  ...  10  11  12  13  14  15  16  ...  26  27  28  29  Suivante
Auteur Message
2 visiteurs sur ce sujet (1 membre et 1 anonyme) : El Typhone
Page : Précédente  1  2  3  ...  10  11  12  13  14  15  16  ...  26  27  28  29  Suivante
Hors ligne Nanoc # Posté le 08/06/2008 à 17:22:28
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Reprise du dernier message de la page précédente :
J'ai mis cette proposition de manière générale. On ne peut pas prévoir à priori les erreurs que pourrait contenir le fichier à compresser ou à décompresser.
L'idée est d'utiliser une exception pour gérer les cas "non-standards".
 
Hors ligne NioS # Posté le 08/06/2008 à 17:26:38
Avatar
Groupe : Membres
D'accord, on doit donc utiliser les exceptions que pour les fichiers illisibles ou autre, mais si on passe par exemple "AAA@58@P" à notre fonction de décompression, celle-ci doit faire son boulot sans renvoyer d'erreurs même si le format à la base n'est pas bon. C'est ça ?

Internet Explorer porte bien les 4 dernières lettres de son nom... ^^
Pourquoi payer plus cher pour avoir pire ?! (allitération en p et r) :-°
 
Hors ligne Nanoc # Posté le 08/06/2008 à 17:29:10
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Non, si la chaîne à décompresser n'est pas décompressable, c'est qu'il y a eu une erreur. Il faudrait donc le signaler à l'utilisateur.

On peut par exemple le faire en utilisant une exception. C'est dans ce sens là qu'il fallait lire la donnée.
 
Hors ligne NioS # Posté le 08/06/2008 à 17:33:35
Avatar
Groupe : Membres
D'accord ;)
Merci beaucoup je vais lire ton tuto sur les exceptions

Internet Explorer porte bien les 4 dernières lettres de son nom... ^^
Pourquoi payer plus cher pour avoir pire ?! (allitération en p et r) :-°
 
Hors ligne BoudBoulMan # Posté le 10/06/2008 à 12:47:28
Saucisse transgénique
Avatar
Groupe : Membres
J'ai une petite question concernant la solution de l'exercice "Le plus grand nombre".

J'ai remarqué que plusieurs fois, tu utilisais des if avec des arguments entiers.
Code : C++
1
2
3
4
int n;
if(!n){
    // si n est nul
}


Or les structures conditionnelles attendent une expression booléenne et non entière. Le C++ apporte les variables booléennes et il faut les utiliser.
Donc pour être rigoureux avec le langage, il faudrait changer le !n en n==0.
Code : C++
1
2
3
if(n==0){
    // si n est nul
}


Cela facilite la lecture en plus.

Voilà, je trouve que pour une solution à un exercice qui vise à approfondire sa maîtrise du C++, il serait bon d'appuyer aussi sur les bonnes habitudes à prendre pour l'écriture du code et ne surtout pas emprunter les vieilles techniques du C. D'ailleurs, dans d'autres langages comme le Java, c'est strictement interdit d'utiliser une expression entière dans une structure conditionnelle.

Voilà, sinon je salue le fait de proposer des exercices accessibles qui permettent de s'améliorer en C++ et aussi régulièrement :)
Hors ligne Nanoc # Posté le 10/06/2008 à 15:38:22
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Mmmh,
bonne remarque. Chez moi, ce n'est pas une "vieille haitude du C", car j'en ai jamais fait. Plus je programme, plus j'utilise ce genre de petits raccourcis.
Est-ce que c'est une mauvaise habitude ? Honnêtement, je sais pas. C'est un peu comme pour les transtypages, on devrait utiliser les "static_cast<>" mais personne ne le fait jamais, c'est trop lourd.

Mais tu as raison, je vais corriger ça. Ce sera plus clair pour les débutants qui n'ont pas l'habitude de ce genre de raccourcis.

Merci pour cette remarque.

P.S.: Juste comme ça, c'est pas parce que en JAVA c'est mal que c'est faux en C++. Le JAVA a aussi des choses "ignobles" comparés au C++. :)
 
Hors ligne BoudBoulMan # Posté le 10/06/2008 à 20:22:51
Saucisse transgénique
Avatar
Groupe : Membres
Citation : Nanoc
Juste comme ça, c'est pas parce que en JAVA c'est mal que c'est faux en C++. Le JAVA a aussi des choses "ignobles" comparés au C++. :)

Tout à fait, excuse-moi pour cette comparaison déplacée. :-°

Citation : Nanoc
Plus je programme, plus j'utilise ce genre de petits raccourcis.
Est-ce que c'est une mauvaise habitude ? Honnêtement, je sais pas.

Sans vouloir polluer ce topic (je sais que c'est pas vraiment le sujet), je trouve que personnellement les raccourcis sont à éviter au maximum. Tout dépend des raccourcis utilisés bien sûr mais dans la majorité des cas, ils utilisent une syntaxe peu intuitive pour gagner des lignes de codes et en compromettent la lisibilité. Et de plus, ils se basent souvent sur un certain "laxisme" du langage sur certains points, par exemple ici, le langage qui est peu regardant au niveau des types. Ce qui peut d'ailleurs signifier différentes choses selon le compilateur utilisé vu que ce point n'est pas clairement défini.

Pour moi, ces raccourcis sont à réserver à des codes personnels qu'on ne souhaite pas partager puisque dans un travail collectif, on vise à écrire du code lisible qui puisse être maintenu par quelqu'un d'autre.

Ensuite, je conçois que l'usage d'un entier à la place d'un booléen ne pose pas énormément de problèmes.

En tout cas, merci d'avoir pris compte de ma remarque. ^^
Voilà, donc j'arrêterai là pour ne pas trop polluer ce sujet et laisser les cryptographes à l'oeuvre. :p
Édité le 10/06/2008 à 20:46:05 par BoudBoulMan
Hors ligne Nanoc # Posté le 11/06/2008 à 09:27:16
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
J'ai modifié le corrigé du dernier exercice pour tenir compte des remarques de :

- Youyou, qui vouliat savoir comment différencier [] et at()
- BoudBoulMan, qui critiquait très justement certains raccourcis.

Merci à vous deux.

@Cyprien_ :
Je n'ai pas non-plus tellement le temps de faire cela ces jours. La principale modification est en fait de mettre des nombres jusqu'à 255 dans chaque case si tu utilise un vector<char> comme tableau. Il faut modifier les endroits où il y a un modulo 10 et remplacer par un modulo 256. Le reste ne devrait pas changer sauf pour l'affichage et la construction où il faudra faire la "traduction" base 256 -> base 10 et vice-versa.
 
Hors ligne Carma001 # Posté le 13/06/2008 à 20:07:11
Alea jacta est !
Avatar
Validateurs
Bonjour ! :)

J'ai pensé a un truc : on peut ne pas utiliser de flag mettre directement le nombre de fois que le caractère est répété converti en caractère ASCII et directement le caractère après.

Par exemple, sachant que 33 a pour caractère ASCII "!", on peut compresser ça :

Code : Autre
1
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ


en

Code : Autre
1
!J


C'est pratique car ça vire le flag et ça permet de compresser des suites de 255 caractères (max)! ;)
Seulement, c'est toujours pareil, une chaine en francais sera "sous-compressée" ! :p

A+ :)
 
Hors ligne Nanoc # Posté le 13/06/2008 à 20:26:54
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Hello,

Ca marche peut-être, mais tu auras des prèblèmes avec les chaînes qui n'ont jamais de caractères consécutifs.
De plus certains caractères ASCII ne peuvent être utilisé (EOF, \n, \t) et si par hasard la chaîne faisait la mauvaise longueur de sorte que ca donne EOF (par exemple), on aurait un sérieux problème.

Bien essayé !
 
Hors ligne Carma001 # Posté le 13/06/2008 à 20:43:22
Alea jacta est !
Avatar
Validateurs
Salut, :)

Les caractères EOF, \n et \t sont lus comme les autres ! C'est juste l'utilisation que les éditeurs de textes en font après (Retour à la ligne, tabulation, signale la fin d'un fichier ...)
[En plus, il me semble qu'il n'y a pas de EOF en ASCII ... Enfin, j'ai peut être lu trop vite :p ]

A la limite, le caractère qui peut faire foirer, c'est le NUL car il est interprété en C++ par la fin d'un tableau de caractère, ainsi que par la classe string. Mais de toute façon, le NUL n'apparaîtra pas car on n'enregistre pas les chaines de 0 caractère ! :D

Sinon, c'est vrai que ça sert à rien quand les caractères ne sont pas consécutifs ... ;)

A+
 
Hors ligne lmghs # Posté le 13/06/2008 à 20:55:40
Groupe : Membres
Citation : Carma001
A la limite, le caractère qui peut faire foirer, c'est le NUL car il est interprété en C++ par la fin d'un tableau de caractère, ainsi que par la classe string.

Ce n'est pas vrai. Une std::string peut contenir 0, tu peux concaténer des chaines qui en contiennent etc. Par contre à l'affichage, ou lors des exports vers char*, le 0 est de nouveau interprété par les fonction str*() du C.
 
Hors ligne Carma001 # Posté le 13/06/2008 à 21:06:15
Alea jacta est !
Avatar
Validateurs
Oui voilà, à l'affichage ou à l'export dans un fichier ! C'est vrai que je me suis mal exprimé ! ;)

Merci ! :)
 
Hors ligne lmghs # Posté le 13/06/2008 à 21:16:10
Groupe : Membres
Pour l'écriture fichier, tu peux réaliser une écriture binaire (la seule qui a du sens quand il y a des caractères non imprimables) depuis la std::string sans aucun problèmes. -> f.write(str.data(), str.size())
 
Hors ligne Carma001 # Posté le 13/06/2008 à 21:26:18
Alea jacta est !
Avatar
Validateurs
Oui bien sûr mais il me semble qu'on a dit "pas de binaire" dans l'exercice (à moins que je l'ai rêvé ou que vous ayez changé d'avis entre les pages 9 et 12 que j'ai pas lus ! :D )

;)
 
Hors ligne lmghs # Posté le 13/06/2008 à 21:32:23
Groupe : Membres
Pourquoi parler du 0 alors? :p
 
Hors ligne Carma001 # Posté le 13/06/2008 à 22:06:37
Alea jacta est !
Avatar
Validateurs
Oui c'est vrai que ça pose pas de problème en fin de compte ... :D
 
Hors ligne Jaloyan1 # Posté le 15/06/2008 à 15:08:15
Choisir = se priver du reste.
Avatar
Groupe : Membres
ca serait bien de faire 2 exos par mois.

Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir.
Image utilisateur
Image utilisateur
Image utilisateur

Chef du fan club de jaloyan1
 
Hors ligne Reponse_Exercices # Posté le 15/06/2008 à 15:18:53
Groupe : Membres
Tu dis ça, mais j'ai pas encore reçu ta solution, Ô grand maître du C++. :)
Hors ligne Nanoc # Posté le 15/06/2008 à 16:06:17
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Je l'avais annoncé il y a quelques posts, comme les vacances arrivent (en tout cas pour moi :p ), je vais proposer un exercice supplémentaire au milieu du mois. Les délais de soumission n'ont pas changé.
Les exercices de milieu de mois seront un peu plus difficile mais plus court et axés sur un point technique particulier.

2ème Exercice du mois de juin 2008



Cet exercice est plus difficile que le dernier mais aussi plus technique. Il est par contre beaucoup plus court.


Nom : L'opérateur virgule
Sujet : Surcharge d'opérateurs


Introduction



Quand j'ai débuté en C++, j'ai découvert un truc absolument génial : La surcharge d'opérateurs.

J'ai assez rapidement essayé de surcharger tous les opérateurs surchargeables. (Une liste ici). Ce n'est pas difficile et on arrive rapidement à faire du code particulièrment obscure du type :

Code : C++
1
a new b, c % 3 || d delete g;

:p Absolument illisible et in-maintebale.

Dans un deuxième temps, je me suis intéressé à faire de la surcharge d'opérateurs dans un but utile. Pour la plus part des opérateurs, c'est très facile de trouver une application concrète.
Sauf pour un opérateur particulier. Celui situé tout en-bas de la liste, l'opérateur virgule.
J'ai finalement trouvé une application et je vous propose ce mois de la coder.

L'exercice



Vous connaissez certainement les tableaux statiques.

Code : C++
1
int tab[5];   //Un tableau de 5 entiers


et le fait qu'on puisse les initialiser de la manière suivante :

Code : C++
1
int tab[5] = {0,1,2,3,4};   //Initialisation


Il serait intéressant de pouvoir faire de même avec la classe std::vector !!

Evidemment, vous ne pouvez pas modifier (enfin si mais ne le faites pas) le code de la classe vector. Nous allons donc créer une classe qui hérite de cette classe.

Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <vector>
using namespace std;

class Tableau: public vector<int>
{
public:  
    Tableau(unsigned int n = 0, int valeur=0) //Construit un tableau de longueur n donc les elements valent "valeur"
          :vector<int>(n,valeur)
    {}

    //Autres elements utiles
};


On peut donc écrire tout le code que l'on veut dans cette classe et en particulier ajouter les opérateurs que l'on veut.

Par exemple l'opérateur << qui permet d'afficher le contenu du tableau en console.

Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
ostream& operator<<(ostream& flux,const Tableau& tab)  //Affiche le contenu du tableau
{
    if (!tab.empty())  //Si le tableau n'est pas vide
    {
        for (unsigned int i(0);i<tab.size()-1;++i)
            flux << tab[i] << ",";          //On separe les elements par des virgules
        flux << tab[tab.size()-1];
    }
    return flux;
}


Voilà votre base de travail.

Votre programme



Niveau 1



Vous devrez trouvez un moyen de coder l'opérateur virgule de telle sorte que le code suivant compile :

Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
int main()
{
    Tableau tab(10);

    tab=0,1,2,3,4,5,6,7,8,9;

    cout << tab << endl;

    return 0;
}


et affiche :

Code : Console
0,1,2,3,4,5,6,7,8,9


Pour ce faire, vous avez le droit d'ajouter tout le code que vous désirez à partir de la base suivante :

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
#include <vector>
#include <iostream>
using namespace std;

class Tableau: public vector<int>
{
public:  
    Tableau(unsigned int n = 0, int valeur=0) //Construit un tableau de longueur n donc les elements valent "valeur"
          :vector<int>(n,valeur)
    {}

    //A vous de jouer !
};

ostream& operator<<(ostream& flux,const Tableau& tab)  //Affiche le contenu du tableau
{
    if (!tab.empty())  //Si le tableau n'est pas vide
    {
        for (unsigned int i(0);i<tab.size()-1;++i)
            flux << tab[i] << ",";          //On separe les elements par des virgules
        flux << tab[tab.size()-1];
    }
    return flux;
}

int main()
{
    Tableau tab(10);

    tab=0,1,2,3,4,5,6,7,8,9;

    cout << tab << endl;

    return 0;
}


Vous pouvez également écrire du code en-dehors de la classe, voir d'autres classes si nécessaires. Les macros sont évidemment interdites.


Niveau 2



Si vous voulez jouer dans cette catégorie, votre programme devra distinguer 3 cas :

1) Le cas du niveau 1
2) Une affectation du type :

Code : C++
1
tab = 2;


qui elle devra remplir le tableau avec la valeur "2" dans toutes les cases.

3) Une affectation du type (avec un tableau de taille 10)

Code : C++
1
tab = 2,3;


qui devra signaler une erreur à l'utilisateur sous la forme d'une exception par exemple.

Niveau 3



Pourquoi se limiter aux entiers ? Si voulez vraiment jouer aux gourous, alors attaquez le niveau 2, mais avec des templates, de telle sorte que vous puissiez gérer tous les types que l'on peut mettre dans un vector.

Cela peut vous sembler énorme, mais sachez que le point 2 (et 3) tiennent en 35 lignes de code.



Indications si nécessaire


Secret (cliquez pour afficher)

La surcharge de l'opérateur virgule se fait via la syntaxe :

Code : C++
1
type_retour operator,(type_a_droite);


pour une fonction memebre et

Code : C++
1
type_retour operator,(type_a_gauche,type_a_droite);


pour une fonction libre. type_a_droite et type_a_gauche representent respectivement les types situés à gauche et à droite de la virgule.

-------------------------------

Regardez bien la priorité de l'opérateur virgule ainsi que son associativité. Ce sont de précieuses informations.


Il est possible que votre compilateur émette des "Warning" en compilant la classe qui hérite de vector. Ignorez les, ils n'ont aucune importance dans ce cadre.


Vous avez jusqu'au 15 juillet pour soumettre vos réponses à Réponse_Exercices.

Bonne chance à tous !

 
Hors ligne Davidbrcz # Posté le 15/06/2008 à 18:16:24
Geek un jour, geek toujours !
Avatar
Groupe : Membres
boost::assign fournit ce genre de chose et même plus.

Partager grâce à l'open source et aux logiciels libres.

Mes articles sur developpez.com : http://come-david.developpez.com/

Da Nyug
 
Hors ligne Nanoc # Posté le 15/06/2008 à 18:43:10
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Oui, mais là c'est tricher ! :)
 
Hors ligne Jaloyan1 # Posté le 15/06/2008 à 19:53:55
Choisir = se priver du reste.
Avatar
Groupe : Membres
oula trop complexe et en plus les vector j'ai rien compris.

Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir.
Image utilisateur
Image utilisateur
Image utilisateur

Chef du fan club de jaloyan1
 
Hors ligne zero ptt # Posté le 15/06/2008 à 19:54:34
Avatar
Groupe : Bannis
et tu veux créer un OS en plus :-°

mon tout nouveau siteweb: Creations

regroupe tous mes programmes de A à Z :soleil: (piur me soutenir, un clic sur la pub suffit)
attention, google arrive :lol:
 
Hors ligne Jaloyan1 # Posté le 15/06/2008 à 21:51:44
Choisir = se priver du reste.
Avatar
Groupe : Membres
Citation : zero ptt
et tu veux créer un OS en plus :-°


moi?
Non j'ai jamais voulu en créer.
Je m'interresse sur certains points du genre la traduction binaire -> transistor et inverse.

Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir.
Image utilisateur
Image utilisateur
Image utilisateur

Chef du fan club de jaloyan1
 
Hors ligne Nanoc # Posté le 16/06/2008 à 09:30:48
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Jaloyan1, je t'ai déjà dit que tu commençais à me taper sur les nerfs.
Je te demanderai de ne plus poster dans ce topic à moins que ce soit en rapport direct avec les exercices.

Pour les autres: désolé de pourrir ce topic avec ce genre de posts.
 
Hors ligne gymnopaul # Posté le 16/06/2008 à 20:33:11
I could go supersonic !
Avatar
Groupe : Membres
Citation : Nanoc
Jaloyan1, je t'ai déjà dit que tu commençais à me taper sur les nerfs.
Je te demanderai de ne plus poster dans ce topic à moins que ce soit en rapport direct avec les exercices.

Pour les autres: désolé de pourrir ce topic avec ce genre de posts.

Ne dramatisons pas pour une embrouille comme celle-là. Je sens que ça allait encore devenir du n'importe quoi.

Exercice très intéressant :) .
Par contre, je ne vois pas trop comment ça peut tenir en 35 lignes :euh: ...

Projet en cours : 2D-3D-Games -> Tutoriels vidéo sur la création de jeux vidéos
Mes connaissances :
Langages : C - C++ (mon préféré ^^ ) - HTML - PHP - SQL
3D : Blender

 
Hors ligne Nanoc # Posté le 16/06/2008 à 20:42:33
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Je suis pas contre plus de lignes. :)

J'ai mis ça à titre indicatif pour dire que ce serait plus court que BigInt par exemple.
 
Hors ligne gymnopaul # Posté le 16/06/2008 à 21:17:04
I could go supersonic !
Avatar
Groupe : Membres
Je me trompais : j'arrive déjà une partie de l'exercice :-° .
Franchement, ça m'étonne vraiment le nombre de "c'est trop complexe" ou de "j'y arriverais pas". Si on se sert un peu de sa tête ^^ , on y arrive très bien :) .

Projet en cours : 2D-3D-Games -> Tutoriels vidéo sur la création de jeux vidéos
Mes connaissances :
Langages : C - C++ (mon préféré ^^ ) - HTML - PHP - SQL
3D : Blender

 
Hors ligne nono212 # Posté le 17/06/2008 à 20:27:56
Euh..."a" ?
Avatar
Groupe : Membres
Tiens je vais bien m'attaquer au 2ème exercice ^^.

Sinon Nanoc, pourquoi t'engueules Jaloyan1 et pas zero ptt qui a plutôt "cherché" Jaloyan1 ? (j'ai pas trop compris l'histoire moi Oo).
Enfin, j'ai pas envie de m'embrouiller avec les autres membres :/

Image utilisateur
 
Hors ligne hilnius # Posté le 17/06/2008 à 20:29:34
Groupe : Membres
Question un peu à part : ca serait possible d'avoir des exercices mais QT ?

projets :
QT : jeu du Yam (96%)
QT : Calcul de moyenes (85%)
 

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

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 806 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.1457s (0.1031s)