Questions sur un programme fonctionnel

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous, Je viens zester votre zeste (schtroumpfer), afin de m'éclairer :

Je participe à un concours, qui a ceci en premier problème : Image utilisateur J'ai donc crée ce petit programme, qui je pense résout plutôt bien le problème (en respectant les contraintes si j'ai bien lu) :

 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Text;

namespace JeuDeCarteConsole
{
    class Program
    {
        static void Main(string[] args)
        {

            bool resultat = false;

            int nombreDeLigneInt = 0;

            string nombreDeLigneString;

            int nombreDePoints = 0;

            //Initilisation d'une variable pour for
            int i = 0;

            while (resultat == false || (nombreDeLigneInt < 1 || nombreDeLigneInt > 1000))
            {

                //Demande à l'utilisateur de rentrer le nombre de ligne
                Console.WriteLine("Rentrez le nombre de lignes (compris entre 1 et 1000)");
                nombreDeLigneString = Console.ReadLine();

                //On vérifie que l'utilisateur rentre un entier
                resultat = Int32.TryParse(nombreDeLigneString, out nombreDeLigneInt);

                if (true == resultat)
                {
                    //Conversion du nombre ligne n en un entier m
                    nombreDeLigneInt = Int32.Parse(nombreDeLigneString);
                }
                else
                {
                    //On laisse resultat en état false
                }

                //On vérifie que le nombre est compris entre 1 et 1000
                if (nombreDeLigneInt < 1 || nombreDeLigneInt > 1000)
                {
                    Console.WriteLine("Vous n'avez pas saisi un nombre compris entre 1 et 1000. Veuillez recommencer\n");
                }
                else
                {
                    break;
                }
            }

            //On effectue la somme
            for (i = 0; i <= nombreDeLigneInt; i++)
            {
                nombreDePoints += i;
            }

            //On affiche le nombre de points requis
            Console.WriteLine("Le nombre de points requis est : " + nombreDePoints);
            Console.ReadLine();
        }
    }
}

A noter : pour faciliter la lecture j'ai pas mis la variable N mais nombreDeLigneInt, je changerais plus tard bien sur.

A partir de ceci, j'ai deux questions :

1) Dans le site d'entrainement du concours (c'est le concours Prologin), ils mettent à disposition un code source à compléter pour nous aider, et si je prend celui en c, aucun problème, il me semble "normal":

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include<stdio.h>
#include<stdlib.h>

void triangles(int n){
  /* Complétez le code ici */
}

int main(void){
  int n;
  scanf("%d", &n);
  triangles(n);
  return 0;
}

Sauf qu'en C#, le langage que j'ai choisi, le code source n'est pas du tout le même et me semble beaucoup plus compliqué (il l'est…) :

 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;

public class nb_triangulaire
{
static bool eof;
static String buffer;
public static char readChar_(){
  if (buffer == null){
    buffer = Console.ReadLine();
  }
  if (buffer.Length == 0){
    String tmp = Console.ReadLine();
    eof = tmp == null;
    buffer = "\n"+tmp;
  }
  char c = buffer[0];
  return c;
}
public static void consommeChar(){
       readChar_();
  buffer = buffer.Substring(1);
}
public static int readInt(){
  int i = 0;
  char s = readChar_();
  int sign = 1;
  if (s == '-'){
    sign = -1;
    consommeChar();
  }
  do{
    char c = readChar_();
    if (c <= '9' && c >= '0'){
      i = i * 10 + c - '0';
      consommeChar();
    }else{
      return i * sign;
    }
  } while(true);
} 
  public static void triangles(int n)
  {
    /* Complétez le code ici */
  }

  public static void Main(String[] args)
  {
    int n = readInt();
    triangles(n);
  }
}

Alors je ne comprends pas pourquoi, surtout que je ne comprend pas tout le code ? Qu'est ce que ce code apporte ?

Et deuxième question, je ne sais pas si mon code est bien optimisé, alors je prendrai tout avis pour savoir si il est trop commenté ? trop long ? trop compliqué ?

Merci d'avance :)

+0 -0

Bonjour,

Au niveau du premier code, j'ai quelques commentaires:

  • Je ne comprends pas pourquoi tu fais une boucle pour récupérer l'entrée utilisateur, ça ne figure pas dans les consignes.
  • Je le trouve effectivement sur-commenté.
  • Que vient faire le Console.ReadLine(); à la fin de la fonction ?

Au niveau de l'optimisation, je pense que le but de l'exercice est de vous faire travailler là-dessus, donc je ne vais pas donner de pistes, mais il y a beaucoup mieux pour calculer le nombre de points.

Enfin, pour le dernier exemple de code, il s'agit simplement de remplacer le scanf du C par une fonction permettant de lire un entier. Il y a donc une fonction qui bufferise l'entrée, pour ensuite pouvoir la récupérer caractère par caractère, et analyser tant que ceux-ci constituent un nombre.

Je ne connais ni le C ni le C#. Mais de ce que je pense visiblement les I/O en C# sont plus compliqués qu'en C…
Sinon pour ton code faut il vraiment vérifier que N est un entier? Je ne suis pas habitué à ce genre de concours, mais l'énoncé semble indiquer que l'entrée est un entier non?

L'entrée est effectivement un entier dans le problème, mais je ne savais pas si je devais tenir compte du fait que l'utilisateur pouvait rentrer n'importe quoi.

Effectivement pour les commentaires j'avais un doute, je reverrais tout ça. Le Console.ReadLine() servait à ne pas fermer le programme juste après l'affichage.

Le "il y a beaucoup mieux" me suffira, merci :)

Je vais donc simplement récupérer le code de départ proposé (que j'avais vu seulement après avoir fini mon premier code, mais au moins ça m'aura entraîné), et travailler sur l'optimisation du calcul. Merci.

EDIT : donc en gros, je récupère tout le code source, et à la place de "/ Complétez le code ici /" j'insère ceci :

1
2
3
4
5
6
7
8
    public static void triangles(int n)
    {
        int nombreDePoints = 0;

        nombreDePoints = (n * (n + 1)) / 2;

        Console.WriteLine(nombreDePoints);
    }
+0 -0

Quant à la question "pourquoi le code C# proposé est si compliqué ?", je soupçonne que les étudiants qui organisent le concours ne connaissent pas C#, n'utilisent donc pas les fonctions de parsage qui existent déjà, et réinventent la roue comme on leur demande de le faire dans leurs cours de C.

1
2
3
int n;
Int32.TryParse(Console.ReadLine(), out n);
Console.WriteLine((n * (n + 1)) / 2);

me semble être une réponse parfaitement valable. (Notons que je n'ai jamais fait de C# ni lu la doc, donc il faut prendre mon code avec des pincettes).

Non, non. En fait, il utilise métalang. Après, il utilise des options de compilations pour obtenir le bon langage. Ils ne tapent aucun code à la main (presque, certain exemple en C sont écris à la main).

Bref, leur truc donne n'importe quoi. Métalang fait ce qu'il doit faire (grosso modo) mais ne respecte aucune règle de codage. Déjà que c'est codé à la norme Epitech alors bon …

Sinon, dans l'énoncée, tu as quelques garantie. Des garanties sur l'entrée. L'entrée n'est pas trompeuse. Il te dise précisément ce que tu as en entrée. Pas besoin de gérer la sécurité vis à vis de l'utilisateur.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte