2016-10-04 2 views
1

Я пытаюсь написать код C#, который получает оценки учащихся с зубчатым массивом (количество оценок может быть разным в каждом ученике) и вычислять среднее значение для каждого ученика. вот мой код:Как добавить массив в целое число C#

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

namespace students_avg 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int n,m,i,j,count=0,avg; 
      Console.WriteLine("please enter the number of students"); 
      n = Convert.ToInt32(Console.ReadLine()); 
      int [][] student = new int [n+1][]; 
      for (i = 1; i <= n; i++) 
      { 
       Console.WriteLine("how many grades does student number " + i + "have?"); 
       m = Convert.ToInt32(Console.ReadLine()); 
       student[i] = new int[m]; 
       Console.WriteLine("please enter student number " + i + "'s grades"); 
       for (j = 1; j <= m; j++) 
       { 
        student[i] =new int[] {Convert.ToInt32(Console.ReadLine())}; 
        count +=Convert.ToInt32(student[i]);    
       } 
       avg = count/m ; 
       Console.WriteLine("the student number " + i + "'s average is " + avg);   
      } 
      Console.ReadKey(); 
     } 
    } 
} 

, но у меня есть проблема, потому что он не дает мне правильное среднее. Итак, как я могу правильно добавить оценки ученика?

+2

Любая конкретная причина пытается ручными шаровыми массивов, когда вы можете просто использовать список списков и получить все это с помощью LINQ? – Mark

+0

Вы устанавливаете 'student [i] = new ...' вне цикла и при каждом выполнении цикла, но не используете 'j' в цикле. 'Convert.ToInt32 (student [i])' передает внутренний массив как объект, который, как я думал, должен генерировать исключение, поскольку int [] не является 'IConvertible'. Думаю, вы имеете в виду 'student [i] [j] = Convert.ToInt32 (Console.ReadLine()); count + = student [i] [j]; 'Нет необходимости вызывать Convert во второй строке, когда мы уже знаем, что это значение' int'. Вероятно, вы должны использовать 'int.Parse()' или даже лучше 'int.TryParse()', чтобы вы могли обрабатывать плохой ввод. – pinkfloydx33

+0

Не нужно объявлять переменные цикла в верхней части метода. Они должны быть привязаны к условию цикла. Также дайте другим переменным значимые имена. –

ответ

0

Я предполагаю, что используя зубчатый массив s - это требование для вашей задачи, поэтому я буду придерживаться OP. Если это не так, вы можете использовать List<List<int>> для оценок, как предложил Марк.

Я попытался внести минимальные изменения в ваш код.

Дело в том, что вам не хватало объявления «зубчатой» части вашего массива и при попытке добавить к общему счету у вас возникла небольшая проблема.

static void Main(string[] args) 
{ 
    int n, m, i, j, count; 

    Console.WriteLine("please enter the number of students"); 
    n = Convert.ToInt32(Console.ReadLine()); 
    int[][] student = new int[n][]; 
    for (i = 0; i < n; i++) 
    { 
     count = 0; 
     Console.WriteLine("how many grades does student number " + (i+1) + "  have?"); 
     m = Convert.ToInt32(Console.ReadLine()); 
     student[i] = new int[m]; 
     Console.WriteLine("please enter student number " + (i+1) + "'s grades"); 
     for (j = 0; j < m; j++) 
     { 
      student[i][j] = Convert.ToInt32(Console.ReadLine()); 
      count += Convert.ToInt32(student[i][j]); 
     } 
     var avg = count/m; 
     Console.WriteLine("the student number " + i + "'s average is " + avg); 

    } 


    Console.ReadKey(); 
} 
+0

Спасибо, что было очень полезно –

+0

@SaraMolavi Добро пожаловать. Думаю, я забыл добавить «+ 1», показывая среднее. Возможно, вам придется это изменить. Я также предлагаю вам взглянуть на ответ Дмитрия также с целью обучения, поскольку он включает темы Linq и String Interpolation. – uTeisT

+0

, вы также можете установить avg на ноль после печати значения –

0

Изменить эту строку:

int n,m,i,j,count=0,avg; 

к:

int n,m,i,j,count=0; 
double avg; 

и эта линия:

avg = count/m ; 

в

avg = (double)count/(double)m ; 
count=0; 
0

Кроме того: вы создаете новый массив класса для каждого входа класса здесь

student[i] =new int[] {Convert.ToInt32(Console.ReadLine())}; 

Эта линия должна быть

student[i][j-1] =Convert.ToInt32(Console.ReadLine()); 

Второе:

count +=Convert.ToInt32(student[i]); 

Должно быть

count += student[i][j-1]; 
0

Модифицированный код попробуйте сейчас

static void Main(string[] args) 
    { 
     int n, m, i, j, count = 0, avg; 
     Console.WriteLine("please enter the number of students"); 
     n = Convert.ToInt32(Console.ReadLine()); 
     int[][] student = new int[n + 1][]; 
     for (i = 1; i <= n; i++) 
     { 
      Console.WriteLine("how many grades does student number " + i + "  have?"); 
      m = Convert.ToInt32(Console.ReadLine()); 
      student[i] = new int[m+1]; 
      Console.WriteLine("please enter student number " + i + "'s grades"); 
      for (j = 1; j <= m; j++) 
      { 
       student[i][j] = Convert.ToInt32(Console.ReadLine()); 
       count += Convert.ToInt32(student[i][j]); 
      } 
      avg = count/m; 
      Console.WriteLine("the student number " + i + "'s average is " + avg); 
      avg = 0; 
     } 


     Console.ReadKey(); 
    } 
Смежные вопросы