C# problème inconnue avec le main de mon programme

Fermé
GnacGnouc - 24 mars 2022 à 14:37
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 - 25 mars 2022 à 18:02
Bonjour, je débute en programmation, et je cherche à optimiser un programme dont que j'ai eu avec un site pour apprendre la programmation.
Mais je ne comprend pas d'où viennent mes erreurs car je crois que normalement le programme est censé marché dès le début.

Le programme :

static void Main(string[] args) 
{
    List<float> temperatures = new List<float>();
    int x = 1;
    float temp;
    String reponse = "o";
    while(reponse != "n") 
    {
        temp = 70;
        while (temp > 60 || temp < -60)
        {
            Console.Write("temperature n°"+ x +"(entre -60 et 60) =");
            temp = float.Parse(Console.ReadLine());
        }
        temperatures.Add(temp);
        Console.Write("autre température à saisir ? (o/n) ");
        reponse = Console.ReadLine();
        x++;
    }
    String choix = "z";
    while(choix != "0")
    {
        Console.WriteLine("Moyenne des températures .......................................  1");
        Console.WriteLine("Moyenne des températures >= à une t° précise....................  2");
        Console.WriteLine("Moyenne des températures <= à une t° précise....................  3");
        Console.WriteLine("Moyenne des températures comprises entre 2 t° précise...........  4");
        Console.WriteLine("Quitter.........................................................  0");
        Console.Write("Votre choix : ");
        choix = Console.ReadLine();
        switch (choix)
        {
            case "1":
                float moyenne = 0;
                for (int k=0; k < temperatures.Count; k++)
                {
                    moyenne += temperatures[k];
                }
                if (temperatures.Count == 0)
                {
                    Console.WriteLine("pas de valeur concernée");
                }
                else
                {
                    moyenne = moyenne / temperatures.Count;
                    Console.WriteLine("moyenne de toutes les températures = "+ moyenne);
                }
                break;
            case "2":
                moyenne = 0;
                Console.Write("t° min = ");
                float tmin = float.Parse(Console.ReadLine());
                int nbTempMin = 0;
                for (int k = 0; k < temperatures.Count; k++)
                {
                    if (temperatures[k] >= tmin)
                    {
                        moyenne += temperatures[k];
                        nbTempMin++;
                    }
                }
                if (nbTempMin == 0)
                {
                    Console.WriteLine("pas de valeur concernée");
                }
                else
                {
                    moyenne = moyenne / nbTempMin;
                    Console.WriteLine("Moyenne des t° >= à "+ tmin + " = "+ moyenne);
                }
                break;
            case "3":
                moyenne = 0;
                Console.WriteLine("pasde valeur concernée");
                float tmax = float.Parse(Console.ReadLine());
                int nbTempMax = 0;
                for (int k = 0; k < temperatures.Count; k++)
                {
                    if (temperatures[k] <= tmax)
                    {
                        moyenne += temperatures[k];
                        nbTempMax++;
                    }
                }
                if (nbTempMax == 0)
                {
                    Console.WriteLine("pas de valeur concernée");
                }
                else
                {
                    moyenne = moyenne / nbTempMax;
                    Console.WriteLine("moyenne des t° <= à "+ tmax + " =" +moyenne);
                }
                break;
            case "4":
                moyenne = 0;
                Console.Write("t° min = ");
                tmin = float.Parse(Console.ReadLine());
                Console.Write("t° max = ");
                tmax = float.Parse(Console.ReadLine());
                int nbTemp = 0;
                for (int k = 0; k < temperatures.Count; k++)
                {
                    if (temperatures[k] >= tmin && temperatures[k] <= tmax)
                    {
                        moyenne += temperatures[k];
                        nbTemp++;
                    }
                }
                if (nbTemp == 0)
                {
                    Console.WriteLine("pas de valeur concernée");
                }
                else
                {
                    moyenne = moyenne / nbTemp;
                    Console.WriteLine("moyenne des t° >= à "+ tmin + " et <= à "+ tmax + " = " + moyenne);
                }
                break;
            case "0":
                Console.WriteLine("Fin de traitement");
                break;
            default:
                Console.WriteLine("Choix invalide");
                break;
        }
    }
    Console.ReadLine();
}


Configuration: Windows / Opera 83.0.4254.70

4 réponses

Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 931
25 mars 2022 à 08:12
Bonjour

Y’a t il un ou des messages d’erreurs ?
Si oui
  • à quelles lignes?
  • que décrivent ils?
  • quels sont les contenus des variables au moment du plantage si ces erreurs apparaissent à l’exécution ?


Si non
  • ça veut dire quoi pour toi
    le programme est censé marché dès le début.
    ? (marcheR j’imagine pas le marché du dimanche où on achète ses fruits et légumes…)

0
Il y en a plusieurs :

- Compilation error (line 1, col 8): Expected class, delegate, enum, interface, or struct
- Compilation error (line 1, col 25): Identifier expected
- Compilation error (line 1, col 27): Expected class, delegate, enum, interface, or struct
- Compilation error (line 3, col 36): Expected class, delegate, enum, interface, or struct
- Compilation error (line 36, col 47): Expected class, delegate, enum, interface, or struct
- Compilation error (line 37, col 17): Type or namespace definition, or end-of-file expected

Et c'est bizarre que j'en ai dès le début car c'est le code original
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 931
25 mars 2022 à 15:22
Ok,
Tu peux mettre le lien vers le site en question ?
0
Je pense que tu pourras pas y récupérer le code car il faut mon compte, j'ai juste récupérer une copie du code avec un pdf et j'ai 2 questions
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 931
25 mars 2022 à 16:37
Est ce que la ligne 1 du code présenté ici correspond à la ligne 1 chez toi?
En gros as tu posté tout le code (et auquel cas y’en manque) ? Ou juste un bout?
0
Ils disent dans l'énoncé que c'est le code complet donc normalement oui.

Après ma première question est celle-là :

1. Ecrivez le module demandé.
un module pour le calcul et l'affichage de la moyenne.

2. Et réécrivez le contenu du switch en exploitant le module. Vous n'avez pas à gérer les captures d'erreurs liées aux erreurs de saisie.


Après est-ce que tu pense qu'il faudrait le module pour faire marcher le code et pas seulement l'optimiser ?
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 931
Modifié le 26 mars 2022 à 09:53
Il est complet oui dans un sens, mais en vrai il n'est pas complètement complet.

Ce que je pense, c'est que tu n'as pas compris les étapes précédentes avant d'en arriver là.

Là je suis rentré chez moi, j'ai copié coller le code comme il doit être, c'est à dire:
  • Créer un projet C# console
  • copier le corps de la méthode main dans la méthode main préexistante

Et ça quand tu arrives à un tel exercice, tu devrais le savoir, au premier coup d'oeil sur le code.

Ce code, "il fonctionne", c'est à dire qu'il démarre, mais il ne fait pas exactement ce à quoi on s'attend. J'ai saisi 70 qui est en dehors de l'intervalle prévu, il l'a pris et utilisé pour les calculs, même dans la moyenne entre 2 températures où j'ai saisi min -60 et max 60....

En plus d'être incorrect (puisqu'il ne fait pas ce qu'il devrait), il est mal écrit:
  • utiliser des floats, ça veut dire que les nombres à virgules flottantes sont codés sur 16 bits,
    • nos environnements aujourd'hui sont majoritairement en 64 bits, ça veut dire qu'un emplacement mémoire c'est 64 bits et tu n'en utilises que 16
    • par rapport au double qui est codé sur 32 bits ça veut dire qu'il y aura des problèmes de précisions de calcul (le double a un sens aujourd'hui pour rester compatible avec les environnements 32 bits, notamment certains mobiles et les vieux PC)
    • donc c'est aberrant, ce code gâche de la mémoire et augmente le risque d'erreurs de calcul dus à l'imprécision plus forte du float que celle du double
  • un exemple de code (voir les commentaires)

                float moyenne = 0;
                for (int k=0; k < temperatures.Count; k++)
                {
                    moyenne += temperatures[k]; //ici la variable qui s'appelle moyenne sert à calculer une somme, le nom n'est pas cohérent
                }
                if (temperatures.Count == 0)
                {
                    Console.WriteLine("pas de valeur concernée"); // après avoir calculé la somme, on se pose la question s'il y a quelque chose à calculer, c'est pas cohérent non plus, ça ne plantera pas car s'il n'y a pas de données, le for précédent ne sera pas exécuté, mais de façon logique on ne devrait même pas accéder au for s'il n'y a pas de données....
                }
  • etc....


Bref, si comme tu le dis c'est exactement le code exemple de ton cours, ben on peut se poser la question si ce cours est bien fait, c'est pour cela que je te demandais le lien.

Mais peut être que tu es passé sur les étapes précédentes trop rapidement.

Si tu veux bien dire de quel site il s'agit et poster le pdf sur un partage de fichier dont tu donneras le lien, ça me permettrais de me faire une meilleure idée de la situation et de te conseiller ou aiguiller selon le cas


Edit correction d'une faute du correcteur d'orthographe, qui a écrit impression au lieu d'imprécision
0