Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
regint
2 / 2 / 3
Регистрация: 04.07.2013
Сообщений: 20
#1

Определите новый класс Student с двумя закрытыми полями полями: name и sumb

25.04.2014, 01:16. Просмотров 685. Ответов 6
Метки нет (Все метки)

Я очередной студент, которые вам, полагаю, очень надоели, но все же я очень надеюсь на вашу помощь.

Задание 4. Массивы Объектов.

Немного теории по заданию, от сюда все корни идут
Во всех рассмотренных примерах нам встречались массивы, элементы которых имели только простые значимые типы. В реальных программах массивы объектов и других ссылочных типов встречаются не менее часто. Каков бы ни был тип элементов, большой разницы при работе с массивами нет. Но один важный нюанс все же есть, и его стоит отметить. Он связан с инициализацией элементов по умолчанию. Уже говорилось о том, что компилятор не следит за инициализацией элементов массива и доверяет инициализации, выполненной конструктором массива по умолчанию. Но для массивов ссылочного типа инициализация по умолчанию присваивает ссылкам значение Null. Это означает, что создаются только ссылки, но не сами объекты. По этой причине, пока не будет проведена настоящая инициализация с созданием объектов и заданием ссылок на конкретные объекты, работать с массивом ссылочного типа будет невозможно.

Собственно само задание
Рассмотрим детали этой проблемы на примере. Определим достаточно простой и интуитивно понятный класс, названный Student свойства которого задают имя студента и его баллы, а методы позволяют установить количество полученных баллов и распечатать его свойства.
  1. Создайте новое консольное приложение;
  2. Определите новый класс Student с двумя закрытыми полями полями: name и sumb;
  3. Объявите статическое или динамическое поле rnd и инициализируйте его объектом класса Random;
  4. Напишите открытый метод SetValue, которому передается фамилия студента и который инициализирует соответствующее поле, а так же с помощью объекта rnd инициализирует значение набранных баллов случайным числом.
  5. Напишите функцию вывода информации об объекте на консоль, предварительно переопределив метод ToString;
  6. В функции main создайте массив объектов Student из трёх элементов с отложенной инициализацией;
  7. Задайте значения полей элементов данного массива , используя специальную функцию SetValue; Когда будет сгенерировано сообщение об ошибке? Почему?
  8. Для решения указанной проблемы чаще всего используют следующий приём:
    • В классе Student определите метод InitAr (Метод должен быть статическим, чтобы его можно было вызывать еще до того, как созданы экземпляры класса, поскольку метод предназначен для создания этих самых экземпляров.) Метод имеет следующую сигнатуру:
    • public static Student[] InitAr(Student[] Stud)
    • В цикле инициализируются все элементы массива с помощью конструктора по умолчанию Student();
    • Не забудьте вернуть сам массив!
  9. Вызовите данный метод в функции main и снова попробуйте выполнить шаг №7;
  10. Выведите массив на экран;


ClassStudent
C#
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
namespace _Student
{
    class Student
    {
        static string name;
        static int sumb;
 
        static Random rnd = new Random();
 
        public Student()
        {
            name = "Null";
            sumb = -1;
        }
 
        public static void SetValue(string _name)
        {
            name = _name;
            sumb = rnd.Next(0,50);
        }
 
        public static void Show()
        {
            Console.WriteLine("{0}:\t{1}",name,sumb);
        }
 
        //по задумке, это инициализация массива
        public static Student[] InitAr(Student[] _Stud)
        {
            for (int i = 0; i < _Stud.Length; i++)
                _Stud[i] = new Student();
            return _Stud;
        }
    }
}

Main
C#
1
2
3
4
5
6
7
8
9
10
namespace _Student
{
    class main
    {
        static void Main(string[] args)
        {
            Student[] arr = new Student[3];
        }
    }
}


Все что ниже седьмого пункта я сделать не смог. Созданный мною массив даже не видит функций, заданных в классе.
P.S. Не комментировал функции, вроде как они очень простые. Если надо, напишите, все откомментирую.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2014, 01:16
Ответы с готовыми решениями:

Определить класс Student с двумя закрытыми полями полями: name и sumb
Всем доброго дня. Помогите пожалуйста довести код до ума. Я что то никак не...

Создать класс, описывающий магазин с 6-ю закрытыми / открытыми полями и 6-ю закрытыми / открытыми свойствами
Всем доброго времени суток. Такая вот задача. 2. Создать класс,...

класс с закрытыми полями, где операции реализуются как методы класса
Создайте класс с закрытыми полями, где операции реализуются как методы класса....

Сделать класс с двумя полями и методом
На С# 1. ООП 1.1 сделать класс с двумя полями и методом; 1.2 создать...

Cделать класс с двумя полями и методом
не пашет 2017 и 2015 вижуал студио так что надо разобраться по другому 1.1...

6
Metall_Version
2118 / 1255 / 516
Регистрация: 04.03.2014
Сообщений: 4,094
Завершенные тесты: 2
25.04.2014, 01:29 #2
Лучший ответ Сообщение было отмечено regint как решение

Решение

Обращайся к обектам , а не к массиву
arr[1].

Добавлено через 1 минуту
А что значит статическое или динамическое поле?

Добавлено через 2 минуты
А неувидел сразу... ты поля делаешь статическими. Это не правильно .все поля и методы у тебя должны быть не статическими
1
regint
2 / 2 / 3
Регистрация: 04.07.2013
Сообщений: 20
25.04.2014, 01:46  [ТС] #3
По объектам можно проинициализировать через цикл. Но не по заданию, мне интересно было понять, как сделать это через передачу массива. Но даже по инициализации таким образом, не получается воспользоваться функцией arr[i].SetValue("Имя") arr[i].Show(). Программа не видит данных методов, вернее она вообще не видит методов указанных мною в классе.

Добавлено через 9 минут
Все, с инициализацией через цикл заработало все, спасибо!
С методом для инициализации всего массива не знаешь как проблему решить?

C этим методом
C#
1
2
3
4
5
6
public static Student[] InitAr(Student[] _Stud)
        {
            for (int i = 0; i < _Stud.Length; i++)
                _Stud[i] = new Student();
            return _Stud;
        }


Добавлено через 7 минут
Обращу внимание, что в задание этот метод именно статическим указан.
public static Student[] InitAr(Student[] _Stud)
0
Metall_Version
2118 / 1255 / 516
Регистрация: 04.03.2014
Сообщений: 4,094
Завершенные тесты: 2
25.04.2014, 01:48 #4
regint, честно в классе студент метода с инициализацией быть не должно. Это бредово и противоречит ооп.
Я даже понимаю что он должен делать...
0
regint
2 / 2 / 3
Регистрация: 04.07.2013
Сообщений: 20
25.04.2014, 02:18  [ТС] #5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Так полагаю он должен делать то, что делает метод Initialize для массивов значимого типа.

Добавлено через 26 минут
Блин, уже 3 раз создаю на форуме тему и сам решаю поставленную проблему. Может кому пригодиться, поэтому выкладываю исправленное решение.

ClassStudent

C#
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _Student
{
    class Student
    {
        string name;
        int sumb;
 
        static Random rnd = new Random();
 
        public Student()
        {
            name = "Null";
            sumb = -1;
        }
 
        public void SetValue(string _name)
        {
            name = _name;
            sumb = rnd.Next(0,50);
        }
 
        public void Show()
        {
            Console.WriteLine("{0}:\t{1}",name,sumb);
        }
 
        //функция для инициализации массива заданного размера
        //как ее вызывать, смотрим в коде "Main"
        public static Student[] InitAr(Student[] _Stud)
        {
            for (int i = 0; i < _Stud.Length; i++)
                _Stud[i] = new Student();
            return _Stud;
        }
    }
}


Main

C#
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _Student
{
    class main
    {
        static void Main(string[] args)
        {
            Student[] arr = new Student[3];
            //вызываем это функцию таким образом, и она сама инициализирует массив объектов
            //конструктором по умолчанию, а дальше уже можем работать с элементами
            Student.InitAr(arr);
 
            arr[0].SetValue("Александр");
            arr[1].SetValue("Владимир");
            arr[2].SetValue("Егор");
 
            arr[0].Show();
            arr[1].Show();
            arr[2].Show();
 
            Console.ReadKey();
        }
    }
}


Всем спасибо за участие!
1
kmaffa
302 / 300 / 145
Регистрация: 29.10.2012
Сообщений: 819
25.04.2014, 09:09 #6
Лучший ответ Сообщение было отмечено NickoTin как решение

Решение

Небольшие дополнения:
п.5 задания:
C#
1
2
3
4
5
6
7
8
public override string ToString()
{
    return string.Format("{0}:\t{1}", name, sumb);
}
public void Show()
{
    Console.WriteLine(this.ToString());
}
В метода Main наверное все таки предполагалось сделать вот так (строка 16):
C#
1
arr = Student.InitAr(arr);
1
regint
2 / 2 / 3
Регистрация: 04.07.2013
Сообщений: 20
25.04.2014, 09:57  [ТС] #7
kmaffa, Ну да, возможно, я суть вопроса не понял того, сделал так, как мне казалось наиболее логичным. Преподам которые не выполняют саму работу, перед тем как ее давать, уши бы оторвать. Вечно, задание разбираешь, а чувство, будто на Что?Где?Когда? попал.

Добавлено через 2 минуты
Цитата Сообщение от kmaffa Посмотреть сообщение
В метода Main наверное все таки предполагалось сделать вот так (строка 16):
Код C#
1
arr = Student.InitAr(arr);
Не знаю, я полагаю, возвращение значения нужно, если вдруг хочешь ссылку на массив, другой переменно отдать. А в том коде, что ты предложил, он не имеет особого смысла, так как не меняет результата выполнения функции.
0
25.04.2014, 09:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2014, 09:57

Создать класс с двумя полями и тремя методами
Для всех вариантов задач создать класс с указанными двумя полями (Поле 1, Поле...

Создать класс с указанными двумя полями и тремя методами
Здравствуйте! Для всех вариантов задач создать класс с указанными двумя полями...

Создать класс с двумя полями и перегрузить оператор сложения
Создать класс с двумя переменными x y int. И перегрузить оператор +


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru