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
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...
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
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.
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.
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.
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.
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 )
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).
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++ enfin ormis sa je me debrouille mais sa va être l'occasion de m'entrainer dessus
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 .
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.
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).
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.]
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;
}
}
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
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 ...
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
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).
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.