Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
2 / 2 / 3
Регистрация: 04.07.2013
Сообщений: 30
1

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

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

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

Задание 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2014, 01:16
Ответы с готовыми решениями:

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

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

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

Класс с двумя полями
подскажите class classrod { protected: float a; public: ...

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

Решение

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

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

Добавлено через 2 минуты
А неувидел сразу... ты поля делаешь статическими. Это не правильно .все поля и методы у тебя должны быть не статическими
1
2 / 2 / 3
Регистрация: 04.07.2013
Сообщений: 30
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
2151 / 1288 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
25.04.2014, 01:48 4
regint, честно в классе студент метода с инициализацией быть не должно. Это бредово и противоречит ооп.
Я даже понимаю что он должен делать...
0
2 / 2 / 3
Регистрация: 04.07.2013
Сообщений: 30
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
338 / 327 / 154
Регистрация: 29.10.2012
Сообщений: 949
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
2 / 2 / 3
Регистрация: 04.07.2013
Сообщений: 30
25.04.2014, 09:57  [ТС] 7
kmaffa, Ну да, возможно, я суть вопроса не понял того, сделал так, как мне казалось наиболее логичным. Преподам которые не выполняют саму работу, перед тем как ее давать, уши бы оторвать. Вечно, задание разбираешь, а чувство, будто на Что?Где?Когда? попал.

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

Создать класс с двумя полями
Здравствуйте, пишу код, не могу понять почему значение переменных из функции Sum не передаются в...

Создать класс Man (человек), с полями: имя, возраст, пол и вес. Создать производный класс Student ...
Создать класс Man (человек), с полями: имя, возраст, пол и вес. Определить методы задания имени,...

Реализовать класс с двумя скрытыми полями first и second
Ребят, помогите решить задачку: (заранее спасибо:)) Сама задачка: Реализовать класс с двумя...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru