Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Exercices] Venez vous entraîner !

(v2)

8 juillet 2012 à 22:59:53

Bonjour à tous

Vous me voyez le plus souvent sur le C ou le forum sur la 3D mais je connais et j'approfondis aussi le C++ et le python. Même si je suis encore loin d'être bon, je me suis fixer un exercice à faire après avoir lu les vectors et compagnies sur le tuto de Mateo et j'ai envi de le faire partagé car cela m'a pris 3/4 jour à raison de 4/5 heures par jour en moyenne vu mon faible niveau.
Bon, j'arrête de parler de ma vie et je le mets. Je précise que c'est un programme au cas où il serait mis dans la première page

Moyenne



Situation initiale



Luc est un heureux père depuis bientôt 6 ans. Et comme tout les enfants, son fils va aller en CP. Comme son père est très pressé, il n'attend pas les bulletins de notes et conservent précieusement toutes les notes qu'il a eu pendant le trimestre. Et régulièrement, grâce à votre programme, il suit l'évolution de sa moyenne.

Niveau 1 : le primaire



A l'école primaire, son fils à des notes /20, sur /5, sur /10... Grâce à votre programme, le père doit pouvoir avoir la moyenne générale de son fils sur 20.

Voici ce qu'il doit rentrer :
  • La note
  • Sur combien elle est


Niveau 2 : le collège



Ca y est, son fils vit un grand jour : il rentre au collège. Mais son père est désemparé car maintenant, les notes ont un coefficient comme 1, 2, 0.5...
Mais grâce à vous, il aura un nouveau programme où il peut rajouter pour chaque note son coefficient.

Niveau 3 : le lycée



Le temps à passer mais vous voilà face à un nouveau défi : les coefficients pour les matières. En effet, son fils est en première et tout les matière ne se valent pas. Le français par exemple pour le bac S vaut 2 et l'histoire 3.
Modifiez votre programme pour que chaque note soit associé à une matière.

Idées pour le mettre en place :
  • Vous définissez la matière, son coefficient puis suivent les notes correspondante. Puis on passe à une autre matière.
  • On définit les matière au début puis à chaque note, on dit à quel matière elles appartiennent.


Et en plus...



Idées d'améliorations :
  • Faire le compte rendu avant le résultat comme faire un récapitulatif des notes ou des moyennes pour chaque matières.
  • Mettre les notes dans un fichiers avec leurs caractéristiques puis le logiciels se débrouille tout seul.
  • Mettre les matières dans un fichier puis à chaque note, on dit à quel matière présent dans le fichier elle appartient.
  • Pouvoir choisir entre un mode primaire, collège ou lycée afin de ne pas avoir de paramètres superflu.


Voilà, bonne chance et merci d'avance pour vos retours
jérémie 14
  • Partager sur Facebook
  • Partager sur Twitter
Venez découvrir mon site, madgic système.
9 juillet 2012 à 8:14:32

je sais pas si c'est trompeur, mais ca m'a l'air relativement simple non ? (enfin je me foure peut être et même probablement un doit dans l'oeil ^^ )
  • Partager sur Facebook
  • Partager sur Twitter
9 juillet 2012 à 9:58:49

Bonjour

On peut le faire en 5 minutes le niveau 2 mais avec les matières en plus, j'ai mis un moment à trouver et moi aussi je me suis dit "Et tiens, si je rajoutais un coefficient pour les matières, je le fait en 5 minutes et hop...".
Et ben non car c'est soi la moyenne général qui foire, soit les moyennes des matières donc la moyenne générale...

jérémie 14
  • Partager sur Facebook
  • Partager sur Twitter
Venez découvrir mon site, madgic système.
9 juillet 2012 à 10:40:30

ben ru considère chaque moyenne comme une note, caculé avec les coeff, puis tu calcul la moyenne G pareil non ?
Du coup c'est la même chose il me semble ?
Enfin en tout cas, je sais bien que les apparences sont parfois trompeuses, c'est pour ca que je n'était pas sur si c'était simple ou bien juste apparement simple ^^
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
9 juillet 2012 à 11:09:34

Citation : PITETRE

ben ru considère chaque moyenne comme une note, caculé avec les coeff, puis tu calcul la moyenne G pareil non ?
Du coup c'est la même chose il me semble ?
Enfin en tout cas, je sais bien que les apparences sont parfois trompeuses, c'est pour ca que je n'était pas sur si c'était simple ou bien juste apparement simple ^^



Bah c'est exactement ça. Il suffit juste de faire une fonction moyenne prenant en paramètre une référence constante sur un tableau statique (ou dynamique si vous le souhaitez) de double et qui renvoie un double (la moyenne des notes du tableau).
Tu l'appliques d'abord pour les notes de chaque matière afin d'avoir chaque moyenne par matière. Tu crées alors un tableau avec les moyennes obtenues et tu le repasses dans ta fonction et t'as la moyenne générale.
Après, pour les coefficients, soit tu crées un deuxième tableau contenant les coefficients de chaque note (ou moyenne) et tu le passes aussi en paramètre de ta fonction, soit tu passes en paramètre de ta fonction un tableau à deux dimensions.

Ca n'empêche que ça reste un exercice plutôt facile, et on devrait le garder, car c'est un peu ce qui manque sur ce topic : des exercices assez faciles pour les débutants qui cherchent un moyen de s'entraîner, sans passer directement par les exos plus ou moins difficiles déjà présents.
  • Partager sur Facebook
  • Partager sur Twitter
9 juillet 2012 à 11:33:41

après effectivement j'ai jamais dit u'il ne fallait pas le garder d'ailleur je pense même le faire pour me remmetre dans le bain du C++
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
9 juillet 2012 à 11:37:17

Citation : PITETRE

après effectivement j'ai jamais dit u'il ne fallait pas le garder d'ailleur je pense même le faire pour me remmetre dans le bain du C++



Idem, je le ferais dans l'aprem ou la soirée et je posterais mon code. Et en y réfléchissant légèrement pour l'instant, le plus gros problème que je vois, ça reste l'interaction avec l'utilisateur : combien de matières veut-il prendre en compte ? Combien de notes ? etc...

Soit on lui demande au lancement, soit il faut lui demander à chaque fois s'il veut rentrer une nouvelle note.


En fait, cet exercice est sympa comme tout.
  • Partager sur Facebook
  • Partager sur Twitter
9 juillet 2012 à 12:12:43

Bonjour

Citation : Zeene

Soit on lui demande au lancement, soit il faut lui demander à chaque fois s'il veut rentrer une nouvelle note.



Moi,j'ai appliqué ma première méthode parmi les deux que je donne : vous définissez la matière, son coefficient puis suivent les notes correspondante. Puis on passe à une autre matière.

Et pour te donner un exemple, voici un petit exemple de ce que j'ai dans ma console.

Image utilisateur

Pour te donner un ordre d'idée, j'ai fait mon programme avec 3 fonctions, 2 d'une dizaine de lignes plus le main.c d'une centaine de ligne.

Voilà, j'espère que cela t'inspira...
jérémie 14
  • Partager sur Facebook
  • Partager sur Twitter
Venez découvrir mon site, madgic système.
9 juillet 2012 à 12:22:50

Et bah moi qui ne s'avait pus quoi faire de mes vacances, je vais faire ton petit exo sa m'occupera ;)

Le seul petit reproche que j'ai a faire a tout logiciel c'est l'absence d'un menue qui proposerait ajouter une note (puis le niveau, primaire, college, lycee), retirer une note ( car oui l'élève peut parfois mentir a ses parents ;) ) et quitter, c'est juste que sa fait plus propre mais au final sa ne change pas enormement de ton
oui => 1
non => 2

Sa sera plus utile si on le fait passer sur une BDD ce que je ferrais peut être ( j'ai un pitit peu de mal avec sa :p )

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
9 juillet 2012 à 12:26:26

Pour retirer une note, il suffit de la rentrer avec un coefficient négatif, non ?
  • Partager sur Facebook
  • Partager sur Twitter
9 juillet 2012 à 12:35:37

Bonjour

hackbug, oui car cette bdd là n'est pu mise à jour. Et si t'as un peu de mal, je peux le faire, je l'ai déjà fait avec Blender sur le forum de la 3D (rassemblement de tuto).

jérémie 14
  • Partager sur Facebook
  • Partager sur Twitter
Venez découvrir mon site, madgic système.
9 juillet 2012 à 12:40:55

On a du mal ce comprendre, je ne vois pas de quelle BDD tu parle :-° Pour ma part je parlais de coder une BDD pour une gestion sur le long terme des notes, et j'ai des difficulté pour ajouter, retirer des mots, caracteres etc... Je pense que c'est mon gros point faible en C++ :p enfin ormis sa je me debrouille mais sa va être l'occasion de m'entrainer dessus ;)
  • Partager sur Facebook
  • Partager sur Twitter
9 juillet 2012 à 12:46:41

Bonjour

Oui en effet car moi j'avais compris : BDD = banque de donnée et puisque celle là n'est plus mis à jour, en faire en autre et mettre se tuto dedans.

jérémie 14
  • Partager sur Facebook
  • Partager sur Twitter
Venez découvrir mon site, madgic système.
9 juillet 2012 à 13:01:35

pourquoi écris tu jémérémie 14 à chaque fois ?
c'est déjà dans t'a signature (dont c'est l'utilité ^^ )
  • Partager sur Facebook
  • Partager sur Twitter
9 juillet 2012 à 13:05:03

Bonjour

Je c'est pas, c'est une habitude, dans tous les forums je fais ça et certain non pas de signature ou une signature sans le nom et j'ai pas pris le temps de changer .

jérémie 14

ps : tu me le présente ce jérémie ? :p
  • Partager sur Facebook
  • Partager sur Twitter
Venez découvrir mon site, madgic système.
9 juillet 2012 à 13:27:29

bah, comme tu veut c'était qu'un flood à 3 balles ^^
  • Partager sur Facebook
  • Partager sur Twitter
9 juillet 2012 à 14:07:08

C'est un exercice simple mais qui a l'avantage de pouvoir être modifié de multiples façons ^^
Je pense qu'il a sa place sur ce topic :)
Ferai peut-être une solution vite fait en c++11 pour voir ça.
  • Partager sur Facebook
  • Partager sur Twitter
9 juillet 2012 à 17:51:28

C'est un des exercices fil conducteur d'AC++ il est très formateur et ils introduisent énormément de notions avec (plus que ce qui est introduit dans ce tuto d'ailleurs).
  • Partager sur Facebook
  • Partager sur Twitter
10 juillet 2012 à 0:00:20

Je verrais quelque chose comme : (codé dans la boîte de réponse rapide, donc aucune vérification faite ; et les temps sont moches)

#include <iostream>
#include <map>
#include <string>

int main() {
   std::string tmps;
   int tmpi;
   double tmpd;

   std::map<std::string, int> matieres;
   std::cout << "Matiere (vide pour fin) : ";
   std::getline(std::cin, tmps);
   while (tmps != "") {
      std::cout << "Coeff                   : ";
      std::cin >> tmpi; std::cin.ignore();
      matieres[tmps] = tmpi;
      std::cout << "Matiere (vide pour fin) : ";
      std::getline(std::cin, tmps);
   }

   std::map<std::string, std::multimap<double, int>> notes;
   // Si on veut mettre en place une DB, charger ici et ameliorer l'UI
   for (auto matiere : matieres) {
      std::cout << matiere.first << " :\n";
      std::cout << "  Note (-1 pour fin) : ";
      std::cin >> tmpd; std::cin.ignore();
      while (tmpd >= 0.1) {
         std::cout << "  Coeff              : ";
         std::cin >> tmpi; std::cin.ignore();
         notes[matiere.first].insert(std::make_pair(tmpd, tmpi));
         std::cout << "  Note (-1 pour fin) : ";
         std::cin >> tmpd; std::cin.ignore();
      }
   }
   // Si on veut mettre en place une DB, sauvegarder ici

   double moyenne = 0.;
   int over = 0;
   for (auto matiere : matieres) {
      double matmoy = 0.;
      int matover = 0;
      for (auto note : notes[matiere.first]) {
         matmoy += note.second * note.first;
         matover += note.second;
      }
      matmoy /= matover;
      std::cout << "Moyenne de " << matiere.first << " : " << matmoy << "\n";
      moyenne += matiere.second * matmoy;
      over += matiere.second;
   }
   moyenne /= over;

   std::cout << "Moyenne generale : " << moyenne << "\n";
}


[EDIT: En fait, après relecture, on pourrait même mélanger les deux dernières boucles, mais je préfère les garder séparées pour simplifier l'ajout d'une BDD.]

[EDIT 2: Et puis les balises secret, après tout, c'est mieux.]
  • Partager sur Facebook
  • Partager sur Twitter
10 juillet 2012 à 20:30:33

Bonjour à tous

Cela fait bientôt 2 jours que l'exercice à été proposé. Je propose maintenant une réponse possible.
Je précise que :
  • Fait avec les connaissances du début du tuto sur le C++ (jusqu'au tableaux). Donc pas de structures ou d'objets pour regrouper les tableaux par exemple.
  • Défait et refais au fil du temps et des 3 jours donc si sa se trouve, une ou deux variables ne servent plus à grand chose.
  • Mal optimisé, il y a surement une solution mieux...


main.cpp

#include <iostream>
#include <vector>
#include "fonction.h"

using namespace std;

int main()
{
    string prenom;
    string nom;
    vector<double> note(0);
    vector<double> coeff(0);
    vector<double> note_max(0);
    double var_matiere_coeff=0;
    string matiere_nom="0";
    int continuer=1;
    int case_tableau=0;

    double moyenne_local=0;
    double coeff_local=0;

    double moyenne_global=0;
    double coeff_global=0;
    vector<double> tab_moyenne(0);
    vector<double> tab_coeff(0);


    cout<<"Bonjour et bienvenue !"<<endl<<endl<<"Ici, vous allez pouvoir calculer votre moyenne a partir des notes que vous avez eu. Mais avant, je voudrais vous connaitre un peu plus."<<endl<<"  Prenom : ";
    getline(cin,prenom);
    cout<<"  Nom : ";
    getline(cin,nom);

    while(continuer==1)
    {
        cout<<endl<<"  Matiere : ";
        getline(cin,matiere_nom);
        cout<<"  Coefficient : ";
        cin>>var_matiere_coeff;
        cin.ignore();
        tab_coeff.push_back(0);
        tab_coeff[tab_coeff.size()-1]=var_matiere_coeff;

        while(continuer==1)
        {
            cout<<endl<<"  Note : ";
            ecriture(note);
            cout<<"  Sur : ";
            ecriture(note_max);
            cout<<"  Avec un coefficient de : ";
            ecriture(coeff);
            cout<<endl<<"Voulez vous mettre une autre note ?"<<endl<<"  oui => 1"<<endl<<"  non => 2"<<endl;
            cin>>continuer;
            cin.ignore();
        }

        while(case_tableau<note.size())
        {
            moyenne_local=moyenne_local+note[case_tableau]/note_max[case_tableau]*20*coeff[case_tableau];
            coeff_local=coeff_local+coeff[case_tableau];
            case_tableau=case_tableau+1;
        }
        moyenne_local=moyenne_local/coeff_local;
        case_tableau=0;
        tab_moyenne.push_back(0);
        tab_moyenne[tab_moyenne.size()-1]=moyenne_local;

        cout<<endl<<"La moyenne de la matiere "<<matiere_nom<<" est "<<moyenne_local<<"/20."<<endl<<endl<<"Voulez vous mettre une nouvelle matiere ?"<<endl<<"  oui => 1"<<endl<<"  non => 2"<<endl;
        cin>>continuer;
        cin.ignore();

        supprimer(note);
        supprimer(coeff);
        supprimer(note_max);
        moyenne_local=0;
        coeff_local=0;
    }

    while(case_tableau<tab_moyenne.size())
    {
        moyenne_global=moyenne_global+tab_moyenne[case_tableau]*tab_coeff[case_tableau];
        coeff_global=coeff_global+tab_coeff[case_tableau];
        case_tableau=case_tableau+1;
    }
    moyenne_global=moyenne_global/coeff_global;

    cout<<endl<<prenom<<" "<<nom<<", votre moyenne general est de "<<moyenne_global<<"/20.";

    return 0;
}


fonction.cpp

#include <iostream>
#include <vector>

using namespace std;

void ecriture(vector<double> &tableau)
{
    tableau.push_back(0);
    cin>>tableau[tableau.size()-1];
    cin.ignore();
}

void supprimer(vector<double> &tableau)
{
    int case_tableau=0;
    int nombre=0;

    nombre=tableau.size();

    while(case_tableau<nombre)
    {
        tableau.pop_back();
        case_tableau=case_tableau+1;
    }
}


fonction.h

#ifndef def_fonction
#define def_fonction

using namespace std;

void ecriture(vector<double> &tableau);
void supprimer(vector<double> &tableau);

#endif


Voilà, dans tout les cas, sa m'aura permis de réutiliser mes connaissances, de m’entraîner et ça servira de base si certains ont des problèmes.
jérémie 14
  • Partager sur Facebook
  • Partager sur Twitter
Venez découvrir mon site, madgic système.
10 juillet 2012 à 20:56:48

ben en fait, à par pour "hello world", et encore, il y a toujours une solution mieux optimisée ^^
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
10 juillet 2012 à 21:05:07

Citation : PITETRE

ben en fait, à par pour "hello world", et encore, il y a toujours une solution mieux optimisée ^^



Non, au bout d'un moment, on ne peut plus rien optimisé (mais généralement ça prend du temps avant d'arriver à ce moment) ^^
  • Partager sur Facebook
  • Partager sur Twitter
10 juillet 2012 à 21:49:03

et bien je ne suis pas d'accord, ca ce n'est qu'une limite et on ne peut l’atteindre réellement, il existe toujours d'autr moyens de faire une chose et donc forcément des plus rapides ...
  • Partager sur Facebook
  • Partager sur Twitter
10 juillet 2012 à 21:54:33

Quand tu auras optimisé ton assembleur en fonction de l'OS à la main après le passage du compilo, tu seras bien obligé d'admettre que niveau software, tu peux pas optimiser plus ^^ ! Après libre à toi de modifier ton processeur, m'enfin je doute que tu arrives à faire mieux que les intels :-°
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
10 juillet 2012 à 22:13:33

Citation : germino

Quand tu auras optimisé ton assembleur en fonction de l'OS à la main après le passage du compilo, tu seras bien obligé d'admettre que niveau software, tu peux pas optimiser plus ^^ ! Après libre à toi de modifier ton processeur, m'enfin je doute que tu arrives à faire mieux que les intels :-°



Sans aller jusque là ^^

On sait bien des fois, que pour faire certaines choses, certains algorithmes connus ont été optimisés à mort, ils ne font vraiment que le strict nécessaire et de la façon la plus simple possible (donc logiquement la plus rapide, mais je dis bien logiquement). L'optimisation de code est d'ailleurs l'activité consistant à enlever le superflu de code (et des fois les résultats sont impressionnants : exemple montrant un gain de 30% à 100% en terme de rapidité juste en nettoyant le code).
  • Partager sur Facebook
  • Partager sur Twitter
1 août 2012 à 13:01:51

Releveur de température du processeur
difficulté: difficile/expert

L'exercice consiste a crée un programme capable de nous donner la température de chaque core du processeur.

Voici le résultat attendu:
Initialisation reussie :
******** Lecture Tj by Thejailbreakman3 ********
Msr 19C :
        eax1 = -58        eax2 = -58        eax3 = -57        eax4 = 64
        Temp core 0 : 60 degres
        Temp core 1 : 58 degres
        Temp core 2 : 47 degres
        Temp core 3 : 53 degres

Continuer ? (O/N)O
Msr 19C :
        eax1 = -58        eax2 = -58        eax3 = -57        eax4 = 64
        Temp core 0 : 46 degres
        Temp core 1 : 39 degres
        Temp core 2 : 43 degres
        Temp core 3 : 45 degres

Continuer ? (O/N)N
Desinitialisation reussie
Appuyez sur une touche pour continuer...


Penser a mettre ce bout de code dans le main pour gérer les erreurs:

if(!IsCpuid())
		{
			cout << "CPUID non supporte !" << endl << "Fermeture de l'application !" << endl;
			DeinitializeOls();
			return 1;
		}
		if(!IsMsr())
		{
			cout << "MSR non supporte !" << endl << "Fermeture de l'application !" << endl;
			DeinitializeOls();
			return 1;
		}
		if(!IsTsc())
		{
			cout << "Time stamp counter non supporte !" << endl << "Fermeture de l'application !" << endl;
			DeinitializeOls();
			return 1;
		}


ainsi qu'une boucle:
do{
                        \\ici le code pour relever la température
                        char valid;
			cin >> valid;
			if(valid!=79 && valid!=111)
				continuer=false;
		}while(continuer);


Le projet doit contenir:

-main.cpp
-OlsApiInit.h
-OlsApiInitDef.h avec "#pragma once" et "#include <windows.h>"

-OlsDef.h avec "#pragma once"

Bon voilà, je vous ai tout dit, a vos clavier!




Solution:
  • Partager sur Facebook
  • Partager sur Twitter
1 août 2012 à 13:59:45

je n'ai jamais essayé, mais est-ce que cet exercice est bien portable?
  • 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