Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Exercices] Venez vous entraîner !

(v2)

4 octobre 2011 à 21:11:51

Ah, je ne me souviens plus si on peut changer les caractères de séparation sur ces flux...
  • Partager sur Facebook
  • Partager sur Twitter
4 octobre 2011 à 21:33:09

C'est pour cette raison que je suis passé par ofstream et ifstream ^^
(et aussi parce que je ne voulais pas chercher plus loin ayant trouvé cette solution :p )
  • Partager sur Facebook
  • Partager sur Twitter
5 octobre 2011 à 1:08:21

Citation : Patatasux

Citation : nours59

PS : Je pense que dans l'énoncé de l'exercice il faudrait ajouter une astuce, ou une piste, pour la conversion d'un entier en chaîne (j'ai un peu galéré mais j'ai trouvé ma solution quand même).
Ca serait vraiment bien pour aider un peu un débutant qui patauge à ce niveau...


cherche atoi, et itoa.


Ou pas. itoa n'existe pas en C89/99, et atoi est déconseillé si mes souvenirs sont justes.
Il faut juste apprendre à se servir des FAQs -- vous savez, c'est l'histoire d'apprendre à pêcher, ou de donner de la nourriture (avariée ici)
  • 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.
7 octobre 2011 à 22:57:22

Le PGCD


s'adresse aux débutants (vrai débutants)


Voilà, je propose un petit exercice pour les débutants (comme moi), en effet, il suffit de connaitre la partie 1 du tuto (ceci-dit, on peut parfaitement utiliser la P.O.O).
Voici l'énoncé,
l'utilisateur devra fournir deux nombres, puis le programme devra calculer le PGCD de ces deux nombres. Voici un cours extrait du code:

Citation : code c++

if (nombre1 > nombre2)
{
nombre3 = nombre1 % nombre2;


//si nombre 3 est égal à 0
if (nombre3 == 0)
{
//alors pgcd est égal à nombre2
pgcd = nombre2;

}
else.....


Bien sur, j'ai trouvé une solution mais elle n'est pas la meilleure loin de là!!! Personnellement, j'ai utilsé l'algorithme d'Euclide donc à vous de voir. On peu même ne pas du tout utiliser le code ci-dessus (car je le rappelle, je ne suis rendu qu'à la partie 1 ^^)
Je vous souhaite bonne chance (pour ceux qui ne savent plus quel est le pgcd, go to google ;) ).
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 8:40:41

C'est pas une mauvaise idée cet exercice :)
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 10:01:16

Pour le PGCD, voilà mon code :
#include <iostream>
#include <cmath>

using namespace std;

int reste(int a, int b)
{
    return(a - b * (floor(a / b)));
}

int pgcd(int a, int b)
{
    if (b)
        return pgcd(b, reste(a, b));
    return a;
}

int main()
{
    int a, b;
    cout << "PGCD" << endl;
    cin >> a >> b;
    cout << pgcd(a, b);
    return 0;
}
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 10:30:15

@Metallica-z80 o_O
Tu te compliques la vie pour pas grand chose ...
#include <iostream>
using namespace std;

inline int pgcd(int a, int b) // Je sais, c'est inutile de mettre inline et les f() récursives sont à prendre avec précaution 
{
   return b ? pgcd(b, a%b) : a;
}
int main()
{
    int a, b;
    cout << "PGCD" << endl;
    cin >> a >> b;
    cout << pgcd(a, b);
    return 0;
}



Je pense qu'il faut laisser cet exercice aux débutants ...
Et là je dis oufff... Enfin un exo pour les vrais débutants.
  • Partager sur Facebook
  • Partager sur Twitter
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
8 octobre 2011 à 10:38:33

C'est parce que j'ai adapté celui que j'avais fait sur ma calculatrice et c'est vrai que je n'ai pas profité de toutes les possibilités du C++, je modifie mon code sans plus tardé.
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 11:21:09

Citation : TrackOut

Voir tout dans le main ^^


Pas évolutif du tout je pense.
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 11:40:53

Citation : germino

Citation : TrackOut

Voir tout dans le main ^^


Pas évolutif du tout je pense.


Dans le cas general, c'est vrai, mais pour 1 ligne de code, ça va.
Mais je suis d'accord qu'il faut diviser "au max" son code.
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 17:06:26

Allez, juste pour rigoler (mais ne gère que [0, 128[) :
#include <iostream>
int main_(int argc, char** argv) {
 return
  (argc == 1) ?
  (
    (std::cin >> argc),
    (argv[0][0] = char(argc)),
    (main(2, argv))
  ) :
  (argc == 2) ?
  (
    (std::cin >> argc),
    (argv[0][1] = char(argc)),
    (main(3, argv))
  ) :
  (argc == 3) ?
  (
    (argv[0][1]) ?
    (
      (argc = int(argv[0][0]) % int(argv[0][1])),
      (argv[0][0] = argv[0][1]),
      (argv[0][1] = char(argc)),
      (main(3, argv))
    ) :
    (
      (main(-int(argv[0][0]), argv))
    )
  ) :
  (
    (std::cout << -argc << std::endl),
    (0)
  )
 ;
}
int main(int a, char** b) { main_(a, b); }


Et, pour vraiment rigoler, le même code ramené à une ligne :
#include <iostream>#include <iostream>
int main_(int argc,char**argv){return(argc==1)?((std::cin>>argc),(argv[0][0]=char(argc)),(main(2,argv))):(argc==2)?((std::cin>>argc),(argv[0][1]=char(argc)),(main(3,argv))):(argc == 3)?((argv[0][1])?((argc=int(argv[0][0])%int(argv[0][1])),(argv[0][0]=argv[0][1]),(argv[0][1]=char(argc)),(main(3,argv))):((main(-int(argv[0][0]),argv)))):((std::cout<<-argc<<std::endl),(0));}
int main(int a,char**b){main_(a,b);}


(N'ayant pas de compilateur sous la main, j'espère ne pas m'être trompé, la récursion étant plutôt tordue ^^ ).
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 17:12:00

Pas besoin de compiler..., ton programme est ill-formed. C'est interdit d'appeler main.
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 18:25:10

Le concept étant d'avoir quelque chose d'amusant, la conformance stricte ne me semble pas importante. Mais, pour te faire plaisir, j'édite mon message en corrigeant cette "erreur" et nombreuses autres découvertes en compilant.
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 18:28:48

Bah, c'est plus que de la conformance stricte là... c'est pas comme si c'était un truc borderline :/.

M'enfin, je comprends bien ton intention, mon message était plus à titre informatif qu'autre chose... on est sur un topic d'exercices pour débutant, autant éviter de leur donné de mauvaises idées!
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
8 octobre 2011 à 18:48:24

On pourrait améliorer l'exercice du PGCD en mettant un niveau 2, qui consisterait à calculer le PPCM (en utilisant notre fonction PGCD bien sûr).

Je vous fais ça et le poste.
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 18:54:43

Je pense que le mieux serait de faire un exo ou on doit calculer le PGCD de plusieurs nombres. La seule utilité est la gestion du nombre variable de paramètre ... Je trouve l'idée sympa mais sans plus ...

PS: WTF ?! Je suis @rthur59 o_O Vive les bug du sdz ...
  • Partager sur Facebook
  • Partager sur Twitter
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
Anonyme
8 octobre 2011 à 19:16:55

Si on fait PGCD et PPCM, voilà ce que l'on peut obtenir :

#include <iostream>
#include <cmath>

using namespace std;

int pgcd(int a,int b)
{
    int r(1);

    while(r != 0)
    {
        r = a - b*floor(a/b);

        if(r == 0)
            return b;
        else
        {
            a = b;
            b = r;
        }
    }
}


int main()
{
    int a(0), b(0), c(0);
    cin >> a >> b;

    c = ((fabs(a*b))/pgcd(a,b)); // Calcul du PPCM

    cout << "PGCD : " << pgcd(a,b) << endl;
    cout << "PPCM : " << c << endl;

    return 0;
}


  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 21:02:12

Pourquoi utiliser fabs alors que cette fonction prend comme argument et retourne un nombre flottant ?
Ça peut entrainé des pertes de précisions ...
Autant utiliser abs() qui elle est définie dans stdlib.h (donc cstdlib)
  • Partager sur Facebook
  • Partager sur Twitter
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
Anonyme
8 octobre 2011 à 22:02:13

Je suis désolé, je suis un débutant en C++ (j'ai juste fini le cours de M@teo21 et Nanoc et lu quelques autres tuto, je lis quelques livres, etc ... mais ça ne fait pas de moi un amateur).

Donc je dois rajouter cstdlib dans mes en-têtes et remplacer fabs par abs ?
  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2011 à 22:33:19

Oui, de la même façon que floor(a/b) est strictement équivalent à a/b ; puisque ce sont des entiers. Au passage, avec ces deux modifications, il est possible de supprimer le header <cmath>.

Il serait aussi possible de stocker le PGCD dans une variable, pour éviter de le calculer deux fois. ;)

Au passage, @che, j'espère que tu as remarqué que ma "solution" était une dédicace pour toi, cf. l'exercice du triangle de pascal. ;)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
8 octobre 2011 à 22:40:04

Ok merci. Effectivement, j'ai fait ces modifications et ça doit être bon maintenant ^^

EDIT : En fait en y pensant, ce serait cool de faire une "section" du premier message avec des petits exo bateaux pour les débutants. Non pas que les exercices déjà présents soient complètement inaccessibles mais c'est vraiment pas facile pour les débutants (je suis débutant, et à part le Tic Tac Toe, le Site du Zéro (exercice du polymorphisme) et le Puissance 4, je n'ai pas réussi les autres exercices).
  • Partager sur Facebook
  • Partager sur Twitter
9 octobre 2011 à 5:42:08

@equinoxe: J'avais remarquer qu'il m'etait famillier :D C'est sympa, j'adore ce genre de codes ... c'est amusant a coder ;)

On devrait peut-etre faire un concour ou un atelier autour de l'obfuscation, ca changerait et ca pourait etre sympa ...

@@rthur59: Ne t'en fait pas abs est pas très connu du fait qu'elle ne ce trouve pas dans le header math, ton code etait correcte, c'etait juste une amélioration de la précision ... On ne te te blâme pas, ce sont des remarques constructives. Pour t'apprendre ou te rapeller qq-chose ;)
  • Partager sur Facebook
  • Partager sur Twitter
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
Anonyme
9 octobre 2011 à 9:51:23

@@che : T'inquiètes pas, je sais que vous dites ça pour aider les gens :)
  • Partager sur Facebook
  • Partager sur Twitter
9 octobre 2011 à 10:56:01

Citation : @che

On devrait peut-etre faire un concour ou un atelier autour de l'obfuscation, ca changerait et ca pourait etre sympa ...


Existant dans le forum C, il me semble ;) (Les candidats ont l'air de s'y plaire :p )

Ps : Le voila! -> ici
  • Partager sur Facebook
  • Partager sur Twitter
9 octobre 2011 à 11:02:55

Oui et non ... L'atelier de la ligne de code la plus incompréhensible est fini il me semble. Et le concours d'Obfuscation d'uknow de l'année dernière était une pure merveille :D

Le concours de la ligne de code la moins interprétable était beaucoup moins bien(selon moi), on a pas vraiment le droit de mettre tout un programme sur une ligne mais le dernier code était pas mal ...
  • Partager sur Facebook
  • Partager sur Twitter
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
9 octobre 2011 à 12:09:34

Pour revenir au sujet, quelques notes :
JavaQuarium (à transformer en en "zQuarium", je pense) -> 2/5
Statistiques sur Fichiers -> 1/5

Ensuite, je pense qu'il faudrait supprimmer l'operateur virgule, d'après ce que vous m'avez dit.
  • Partager sur Facebook
  • Partager sur Twitter
9 octobre 2011 à 12:24:05

Le supprimer ou alors demander quelque chose de cohérent au niveau du design. (auquel cas c'est à mon avis pas du niveau du topic/forum)
  • Partager sur Facebook
  • Partager sur Twitter
9 octobre 2011 à 12:38:44

Je parlait de l'exercice
  • Partager sur Facebook
  • Partager sur Twitter
9 octobre 2011 à 12:54:36

Ca tombe bien, moi aussi.
  • Partager sur Facebook
  • Partager sur Twitter

[Exercices] Venez vous entraîner !

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown