2010-07-13 6 views
0

J'ai écrit le code suivant dans le but d'essayer de calculer les valeurs ci-dessous, mais toutes mes matrices ne fonctionnent pas; en particulier ceux dans les boucles for. Quelqu'un peut-il m'aider à apprendre comment déclarer un tableau dans une boucle? Ils continuent à montrer des erreurs comme "Avez-vous manqué de déclarer un nouvel objet?"Déclaration de tableaux en C#

Merci

using System; 

using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     public class seasonal 
     { 
      public float mTotal; 
      public float movingAverage; 
      public int y; 

      public char quarter; 
      public char ssq; 
      public int rank; 
      public float forecast; 
      public float centralMovingAverage; 
      public float cmTotal; 
      public float sSeasonal; 
     } 
     public static int i; 
     public static int j; 
     public static int k = 0; 
     public static int n; 

     static void Main(string[] args) 
     { 
      int x; int r; int m; int c; int u = 0; 


      seasonal temp = new seasonal(); 

      int n1; int n2; int n3; int n4; int sumr1 = 0; int sumr2 = 0; int sumr3 = 0; int sumr4 = 0; 
      float h; float ss; float sum; float sums1 = 0; float sums2 = 0; float sums3 = 0; float sums4 = 0; float tsums; 

      Console.WriteLine("Enter the no. of observations"); 
      string nObservations = Console.ReadLine(); 
      n = Convert.ToInt32(nObservations); 

      seasonal[] seasonal = new seasonal[n]; 
      seasonal[] s = new seasonal[n]; 

      for (i = 0; i < n; i++) 
      { 
       Console.Write("{0:D}:", (i+1)); 
       string value = Console.ReadLine(); 
       int observation = Convert.ToInt32(value); 

       seasonal thisSeasonal = new seasonal(); 
       thisSeasonal.y = observation; 

       seasonal[i] = thisSeasonal; 

       if (i>=0 && i<3) 
       { 
        seasonal[i].quarter = '1';      
       } 
       if (i>=3 && i<6) 
       { 
        seasonal[i].quarter = '2'; 
       } 
       if (i>=6 && i<9) 
       { 
        seasonal[i].quarter = '3'; 
       } 
       if (i>=9 && i<12) 
       { 
        seasonal[i].quarter = '4'; 
       } 
       if (i>12) 
       { 
        r = i % 12; 
        if (r>=0 && r<3) 
        { 
         seasonal[i].quarter = '1'; 
        } 
        if (r>=3 && r<6) 
        { 
         seasonal[i].quarter = '2'; 
        } 
        if (r>=6 && r<9) 
        { 
         seasonal[i].quarter = '3'; 
        } 
        if (r>=9 && r<12) 
        { 
         seasonal[i].quarter = '4'; 
        } 
       } 

       for (i = k; i < n-3; i++) 
       { 
        sum = 0; 
        for (j = u+k; j < 4+k; j++) 
        { 
         sum += seasonal[j].y; 
         seasonal[i].mTotal = sum; 
         seasonal[i].movingAverage = seasonal[i].mTotal/4; 
         Console.Write("{0:f}", seasonal[i].movingAverage); 
         k++; 
        } 
       } 

       for (i = 0; i < (n-4); i++) 
       { 
        ss = 0; 

        for (j = 0; j < (2+i); j++) 
        { 
         ss += seasonal[j].movingAverage; 
        } 

        seasonal[i].cmTotal = ss; 
        seasonal[i].centralMovingAverage = seasonal[i].cmTotal/2; 

        seasonal[i].sSeasonal = (seasonal[i+2].y)/(seasonal[i].centralMovingAverage); 

        if (i == 0 || i % 4 == 0) 
        { 
         seasonal[i].ssq = '3'; 
        } 
        if (i == 1 || i % 4 == 1) 
        { 
         seasonal[i].ssq = '4'; 
        } 
        if (i == 2 || i % 4 == 2) 
        { 
         seasonal[i].ssq = '1'; 
        } 
        if (i == 3 || i % 4 == 3) 
        { 
         seasonal[i].ssq = '2'; 
        } 

        Console.Write("\n{0:f}", seasonal[i].centralMovingAverage); 
        Console.Write("\n {0:f}", seasonal[i].sSeasonal); 
       } 
      } 

      for (m= 0; m < n; m++) 
      { 
       s[m] = seasonal[m]; 
      } 

      for (i = 0; i < (n-5); i++) 
      { 
       for (j = 0; j < (n-4); j++) 
       { 
        if (s[i].sSeasonal > s[j].sSeasonal) 
        { 
         temp = s[i]; 
         s[i] = s[j]; 
         s[j] = temp; 
        } 
       } 
      } 

      for (k = 0; k < (n-4); k++) 
      { 
       s[k].rank = k + 1; 
       Console.Write("\n\t {0:D}", s[k].rank); 
      } 

      for (i = 0; i < (n-4); i++) 
      { 
       if (s[i].ssq == '1') 
       { 
        sumr1 += s[i].rank; 
        sums1 += s[i].sSeasonal; 
        //n1 ++; 
       } 
       if (s[i].ssq == '2') 
       { 
        sumr2 += s[i].rank; 
        sums2 += s[i].sSeasonal; 
        //n2++; 
       } 
       if (s[i].ssq == '3') 
       { 
        sumr3 += s[i].rank; 
        sums3 += s[i].sSeasonal; 
        //n3++; 
       } 
       if (s[i].ssq == '4') 
       { 
        sumr4 += s[i].rank; 
        sums4 += s[i].sSeasonal; 
        //n4++; 
       } 
      } 
      tsums = ((sums1/4)+(sums2/4)+(sums3/4)+(sums4/4)); 
      Console.Write("\n\n\n{0:f}",tsums); 
      Console.Write("\n\n\n\n\n{0:D}",sumr1); 
      Console.Write("\n\n\n\n{0:D}",sumr2); 
      Console.Write("\n\n\n\n{0:D}",sumr3); 
      Console.Write("\n\n\n\n\n{0:D}",sumr4); 
      Console.Write("\n{0:f}",sums1/4); 
      Console.Write("\n\n{0:f}",sums2/4); 
      Console.Write("\n\n{0:f}",sums3/4); 
      Console.Write("\n\n{0:f}",sums4/4); 
      Console.Write("\n{0:f}",((sums1/4)/tsums)*4); 
      Console.Write("\n\n{0:f}",((sums2/4)/tsums)*4); 
      Console.Write("\n\n{0:f}",((sums3/4)/tsums)*4); 
      Console.Write("\n\n{0:f}",((sums4/4)/tsums)*4); 

     } 
    } 
} 
+3

Aider les autres pour vous aider: plutôt que de copier votre Tout le programme réduit d'abord votre code à l'exemple minimal qui reproduit le problème. Veuillez également inclure le message d'erreur exact. – EMP

+3

Le problème est probablement comment vous donnez une variable le même nom que vous avez donné à une classe: 'saisonnier [] saisonnier = nouveau saisonnier [n];' Les conventions de nommage du .NET Framework vous recommandent les noms de classes PascalCase et les noms de variables camelCase. Vous devriez utiliser 'Saisonnier [] saisonnier = nouveau Saisonnier [n];' – zneak

+0

De plus, vous réutilisez i comme variable de bouclage. –

Répondre

6

Vous devez initialiser les objets dans vos tableaux:

Seasonal[] seasonal = new Seasonal[n]; 
for (int l = 0; l < seasonal.Length; l++) 
{ 
    seasonal[l] = new Seasonal(); 
} 
Seasonal[] s = new Seasonal[n]; 
for (int l = 0; l < s.Length; l++) 
{ 
    s[l] = new Seasonal(); 
} 

Cela résout uniquement le problème d'initialisation, cependant. Vous pouvez regarder les conventions de nommage pour une meilleure lisibilité, et l'indice hors de 1 vous ferez l'expérience à la ligne à peu près 105.

-2

Je ne pense ce code

seasonal[] seasonal = new seasonal[n]; 
seasonal[] s = new seasonal[n]; 

est correcte. Essayez

seasonal[] seas = (seasonal[])Array.CreateInstance(typeof(seasonal), n); 
+0

'new MyClass [numberOfItemsInArray]' est correct. – icktoofay

+0

Hmm, probablement encore en train de penser avec mon VB.NET 2003 brain :-( – Raj

0

au lieu de travailler avec

seasonal[] seasonal = new seasonal[n]; 
seasonal[] s = new seasonal[n]; 

ne fonctionnent avec

seasonal[] s1 = new seasonal[n]; 
seasonal[] s2 = new seasonal[n]; 

Mais quand je vois code comme, celui-ci où vous copiez simplement votre tableau:

for (m= 0; m < n; m++) 
{ 
    s[m] = seasonal[m]; 
} 

pourquoi voudriez-vous faire cela? Copiez le tableau entier au lieu de chaque entrée.

Pourquoi n'utilisez-vous pas de constructions C#?

+0

Je copie des entrées simples parce que j'ai besoin d'utiliser chaque entrée seule pour un calcul ... où puis-je lire sur les constructions? Avez-vous de bons ebooks, vous pouvez me conseiller de lire? – akalmas

+0

désolé Je ne voulais pas vous tromper, je voulais dire avec des constructions, l'utilisation d'éléments de syntaxe disponibles comme la boucle foreach et tel .. – SwissCoder

0

Le problème est cette ligne:

sum += seasonal[j].y; 

Mais il n'y a pas une solution simple. Vous créez chaque objet individuellement à travers la boucle au lieu d'avant d'entrer dans la boucle afin que chaque itération regarde des objets nuls. En outre, la boucle de cette ligne est en lecture après la fin du tableau. Le code est un peu complexe pour voir facilement ce que vous essayez de faire et comment le réparer.

0

Juste un exemple pour simplifier une partie de votre code: vous écrit ce qui suit:

  if (i>=0 && i<3) 
      { 
       seasonal[i].quarter = '1';      
      } 
      if (i>=3 && i<6) 
      { 
       seasonal[i].quarter = '2'; 
      } 
      if (i>=6 && i<9) 
      { 
       seasonal[i].quarter = '3'; 
      } 
      if (i>=9 && i<12) 
      { 
       seasonal[i].quarter = '4'; 
      } 
      if (i>12) 
      { 
       r = i % 12; 
       if (r>=0 && r<3) 
       { 
        seasonal[i].quarter = '1'; 
       } 
       if (r>=3 && r<6) 
       { 
        seasonal[i].quarter = '2'; 
       } 
       if (r>=6 && r<9) 
       { 
        seasonal[i].quarter = '3'; 
       } 
       if (r>=9 && r<12) 
       { 
        seasonal[i].quarter = '4'; 
       } 
      } 

vous pouvez écrire que la place:

if(i >= 0) 
      seasonal[i].quarter = (((i % 12)/3) + 1).ToString();