IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Initialiser un tableau


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Economiste
    Inscrit en
    Avril 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Economiste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2019
    Messages : 18
    Points : 10
    Points
    10
    Par défaut Initialiser un tableau
    Bonjour,

    Je travaille en ce moment sur le solveur de l'interpolation de Lagrange. Le polynôme est de degré variable, donc j'ai programmé un tableau qui s'adapte en fonction du nombre de points. J'ai donc une classe pour l'entrée des valeurs, et une classe pour la résolution de l'équation.

    J'arrive à initialiser le nombre de points n, mais pas leurs coordonnées x[] et y[]. Voici le code pour que ce soit plus compréhensible.

    Le code qui demande d'entrée les valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Lagrande_interpolation
    {
    	public class Eq_values
    	{
    		public int i {get; set; }
    		public int j { get; set; }
    		public int n { get; set; }
    		public float [] x { get; set; }
    		public float [] y { get; set; }
     
    		public Eq_values()
    		{
    			float[] x = new float[100];
    			float[] y = new float[100];
     
    			float xp, yp = 0, p, l, expd;
     
    			Console.Write("Enter number of data : ");
    			n = Convert.ToInt32(Console.ReadLine());
    			Console.WriteLine("Enter data : ");
    			for (i = 0; i <= n - 1; i++)
    			{
    				Console.Write($"x[{i}] = ");
    				x[i] = Convert.ToInt32(Console.ReadLine());
    				Console.Write($"y[{i}] = ");
    				y[i] = Convert.ToInt32(Console.ReadLine());
    			}
    		}
    	}
    }
    Le code qui résout l'équation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    using System;
     
    namespace Lagrande_interpolation
    {
    	class Program
    	{
    		static void Main(string[] args)
    		{
    			Eq_values eq_values;
    			eq_values = new Eq_values();
     
    			int i = eq_values.i;
    			int j = eq_values.j;
    			int n = eq_values.n;
    			float[] x = eq_values.[]x;
     
    			Console.WriteLine("Enter interpolation point : ");
    			xp = Console.Read();
     
    			/* Implementing Lagrange Interpolation */
    			for (i = 0; i <= n - 1; i++)
    			{
    				p = 1;
    				for (j = 0; j <= n - 1; j++)
    				{
    					if (i != j)
    					{
    						p *= ((xp - x[j]) / (x[i] - x[j]));
    					}
    				}
    				yp = yp + p * y[i];
    			}
    			Console.WriteLine("Interpolated value at ", xp, " is ", yp);
     
    			/* Calculus method */
    			for (i = 0; i <= n - 1; i++)
    			{
    				l = 0;
     
    				// Equation form
    				Console.Write($"l[{i}] = ");
     
    				for (j = 0; j <= n - 1; j++)
    				{
    					if (i != j)
    					{
    						Console.Write($"((x - x[{j}]) / (x[{i}] - x[{j}]))");
    					}
    				}
     
    				Console.Write("\n");
     
    				// Equation values
    				Console.Write($"l[{i}] = ");
     
    				for (j = 0; j <= n - 1; j++)
    				{
    					if (i != j && x[j] > 0)
    					{
    						Console.Write($"((x - {x[j]}) / ({x[i]} - {x[j]}))");
    					}
     
    					if (i != j && x[j] < 0)
    					{
    						Console.Write($"((x + {-x[j]}) / ({x[i]} + {-x[j]}))");
    					}
    				}
     
    				Console.Write("\n");
     
    				// Factored equation
    				Console.Write($"l[{i}] = ");
     
    				float eq = 1;
     
    				for (j = 0; j <= n - 1; j++)
    				{
    					if (i != j)
    					{
    						eq *= (x[i] - x[j]);
    					}
    				}
    				Console.Write(eq);
     
    				for (j = 0; j <= n - 1; j++)
    				{
    					if (i != j && x[j] > 0)
    					{
    						Console.Write($"(x - {x[j]})");
    					}
     
    					if (i != j && x[j] < 0)
    					{
    						Console.Write($"(x + {-x[j]})");
    					}
    				}
     
    				Console.Write("\n\n");
    			}
    		}
    	}
    }
    Le problème intervient à la ligne 15 de la class Program. J'arrive à initialiser i, j, n, mais mais pas les valeurs de x[]. Alors comment initialiser un tableau dans une autre classe ?

    J'en profite pour faire une parenthèse sur les lignes 28 et 30 de la class Eq_values. L'entrée de valeurs ne prend en compte que les entiers, comment faire pour que les float soient pris en compte ?

    Merci à tous pour votre aide.

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 640
    Points : 2 149
    Points
    2 149
    Par défaut
    Bonjour,

    Plusieurs problèmes sont à signaler :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float[] x = new float[100];
    float[] y = new float[100];
    Tu redéfinis des tableaux dans le constructeur, ils n'existeront donc que dans la portée de celui-ci. Ils n'ont rien à voir avec ceux auquels tu veux accéder après. Pour résoudre le problème c'est très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = new float[100];
    y = new float[100];
    Ensuite tu appelles ton tableau de la manière suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float[] x = eq_values.[]x;
    Pas besoin de préciser dans l'appel que c'est un tableau, un simple appel suffit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float[] x = eq_values.x;
    Bon après certains diront que la déclaration et l'affection d'une nouvelle variable est inutile mais j'imagine que c'est pour simplifier l'écriture des calculs après.

    Enfin en ce qui concerne les lignes 28 et 30, il te suffit de les convertir en float au lieu d'int comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x[i] = Convert.ToSingle(Console.ReadLine());

  3. #3
    Membre à l'essai
    Homme Profil pro
    Economiste
    Inscrit en
    Avril 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Economiste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2019
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Merci PixelJuice,

    Tu me lève une sacrée épine du pied. Du coup ça soulève deux questions.

    J'ai remarqué qu'avec ToSingle la décimale doit être marquée avec une virgule, et pas un point. Pourquoi ?

    Je cherche à clarifier mon code et j'arrive à ceci.


    L'entrée des valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Lagrande_interpolation
    {
    	public class Eq_values
    	{
    		public int i {get; set; }
    		public int j { get; set; }
    		public int n { get; set; }
    		public float [] x { get; set; }
    		public float [] y { get; set; }
     
    		public Eq_values()
    		{
    			x = new float[100];
    			y = new float[100];
     
    			Console.Write("Enter number of data : ");
    			n = Convert.ToInt32(Console.ReadLine());
    			Console.WriteLine("Enter data : ");
    			for (i = 0; i <= n - 1; i++)
    			{
    				Console.Write($"x[{i}] = ");
    				x[i] = Convert.ToSingle(Console.ReadLine());
    				Console.Write($"y[{i}] = ");
    				y[i] = Convert.ToSingle(Console.ReadLine());
    			}
    		}
    	}
    }
    La résolution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    using System;
     
    namespace Lagrande_interpolation
    {
    	class Program
    	{
    		static void Main(string[] args)
    		{
    			Eq_values eq_values;
    			eq_values = new Eq_values();
     
    			int i = eq_values.i;
    			int j = eq_values.j;
    			int n = eq_values.n;
    			float[] x = eq_values.x;
    			float[] y = eq_values.y;
     
    			/* Calculus method */
    			for (i = 0; i <= n - 1; i++)
    			{
     
    				// Equation form
    				Console.Write($"l[{i}] = ");
     
    				for (j = 0; j <= n - 1; j++)
    				{
    					if (i != j)
    					{
    						Console.Write($"((x - x[{j}]) / (x[{i}] - x[{j}]))");
    					}
    				}
     
    				Console.Write("\n");
    				// Equation values
    				Console.Write($"l[{i}] = ");
     
    				for (j = 0; j <= n - 1; j++)
    				{
    					if (i != j && x[j] > 0)
    					{
    						Console.Write($"((x - {x[j]}) / ({x[i]} - {x[j]}))");
    					}
     
    					if (i != j && x[j] < 0)
    					{
    						Console.Write($"((x + {-x[j]}) / ({x[i]} + {-x[j]}))");
    					}
    				}
     
    				Console.Write("\n");
     
    				// Factored equation
    				Console.Write($"l[{i}] = ");
     
    				float eq = 1;
     
    				for (j = 0; j <= n - 1; j++)
    				{
    					if (i != j)
    					{
    						eq *= (1/(x[i] - x[j]));
    					}
    				}
    				Console.Write(eq);
     
    				for (j = 0; j <= n - 1; j++)
    				{
    					if (i != j && x[j] > 0)
    					{
    						Console.Write($"(x - {x[j]})");
    					}
     
    					if (i != j && x[j] < 0)
    					{
    						Console.Write($"(x + {-x[j]})");
    					}
    				}
     
    				Console.Write("\n\n");
    			}
    		}
    	}
    }
    On peut voir que j'ai fait en sorte que le programme de décompose en 4 étapes :
    - l'entrée des valeurs
    - l'équation sans les valeurs
    - l'équation avec les valeurs
    - la factorisation de l'équation

    Grace à la réponse précédente j'ai pu mettre la première étape dans une classe à part. Je souhaiterai faire de même avec les 3 autres étapes.
    J'ai donc commencer par initialiser les variables dans une 3eme classe dédiée à l'équation sans les valeurs.

    Seulement la saisie de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int i = eq_values.i;
    int j = eq_values.j;
    int n = eq_values.n;
    float[] x = eq_values.x;
    float[] y = eq_values.y;
    Oblige à saisir en amont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Eq_values eq_values;
    eq_values = new Eq_values();
    Et saisir ces lignes lancera une l'entrée des valeurs une nouvelles fois, et dans la troisième classe.

    Alors comment initialiser les valeurs dans chaque classe sans avoir à lancer l'exécution de la classe précédente ?

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Citation Envoyé par Devellopy Voir le message
    J'ai remarqué qu'avec ToSingle la décimale doit être marquée avec une virgule, et pas un point. Pourquoi ?
    Tout est question de culture.
    La culture sur ton poste est en français, donc le ToSingle applique cette culture par défaut.
    Mais ToSingle peut prendre un paramètre de type IFormatProvider où tu peux définir une autre culture avec CultureInfo.CreateSpecificCulture("en-US") par exemple

  5. #5
    Membre à l'essai
    Homme Profil pro
    Economiste
    Inscrit en
    Avril 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Economiste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2019
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Merci Popo !

    C'est vrai qu'en autodidacte ce n'est pas toujours facile.

    J'en, profite pour rebondir sur mon code. J'avais commencé à faire un tableau mais ce dernier se limite à 100, pour avoir un entrée de valeurs au nombre indéterminé, il est préférable de faire une liste. Je laisse donc un bout de mon code, en espérant qu'il aidera certains qui tomberont sur ce topic.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    ing System;
    using System.Collections.Generic; // Est obligatoir pour utiliser List
     
    namespace Interpolation_Lagrange
    {
    	public class Coordinate
    	{
    		public float x = 0;
    		public float y = 0;
    	}
     
    	public class Program
    	{
    		static void Main(string[] args)
    		{
    			int i = 0;
    			int j = 0;
    			int n = 0;
     
    			// Variable enter
     
    			List<Coordinate> points = new List<Coordinate>();
     
    			Console.Write("Enter number of data : ");
    			n = Convert.ToInt32(Console.ReadLine());
    			Console.WriteLine("Enter data : ");
    			for (i = 0; i <= n - 1; i++)
    			{
    				Coordinate data = new Coordinate();
     
    				Console.Write($"x[{i}] = ");
    				data.x = Convert.ToSingle(Console.ReadLine());
    				Console.Write($"y[{i}] = ");
    				data.y = Convert.ToSingle(Console.ReadLine());
     
    				points.Add(data);
    			}
    		}
    	}
    }

  6. #6
    Membre éprouvé
    Homme Profil pro
    Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique
    Inscrit en
    Décembre 2014
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 449
    Points : 991
    Points
    991
    Par défaut
    Juste une précision la liste n'est qu'une des solutions possibles quand tu veux un container de taille variable, il faut mesurer l'intérêt d'une liste, si tu veux accéder aux éléments via un index, si t'as besoin d'un ordre, de pouvoir modifier etc etc... Tu as d'autres possibilités comme les queues, les hashsets, etc... C'est pour t'inviter à te renseigner un peu afin d'approfondir tes connaissances. Je suis autodidacte aussi.

    Cordialement.

Discussions similaires

  1. Réponses: 35
    Dernier message: 14/02/2006, 18h57
  2. Réponses: 7
    Dernier message: 31/01/2006, 22h34
  3. initialiser un tableau 2D dans le main
    Par miminou dans le forum C++
    Réponses: 5
    Dernier message: 20/12/2005, 10h35
  4. [LG] Jeu mémory : initialisation de tableau
    Par DarkLords dans le forum Langage
    Réponses: 1
    Dernier message: 19/10/2005, 15h13
  5. Problème d'initialisation variable tableau
    Par HeZiX dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2005, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo