Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

Чемпионы рейтинга экспертов в этой рассылке

Micren
Статус: Практикант
Рейтинг: 107
∙ повысить рейтинг >>
Hubbitus
Статус: 8-й класс
Рейтинг: 103
∙ повысить рейтинг >>
Evgenijm
Статус: 4-й класс
Рейтинг: 37
∙ повысить рейтинг >>

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1284
от 13.04.2009, 23:35

Администратор:Dr_Andrew
В рассылке:Подписчиков: 512, Экспертов: 41
В номере:Вопросов: 1, Ответов: 1

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>

Вопрос № 164484: Здравствуйте уважаемые эксперты у меня вопрос по С# Создать класс студент (виртуальный) метод PassExam() возвращает оценку и 5 наследников, каждый со своей рареализацией. создать случайным образом коллекцию из 20 студентов. Вывести на кон...


Вопрос № 164.484
Здравствуйте уважаемые эксперты у меня вопрос по С#

Создать класс студент (виртуальный) метод PassExam() возвращает оценку и 5 наследников, каждый со своей рареализацией. создать случайным образом коллекцию из 20 студентов.
Вывести на консоль распределение оценок и % списывавших.

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

Приложение:

Отправлен: 08.04.2009, 23:16
Вопрос задал: Sky-er (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 6)

Отвечает: Micren
Здравствуйте, Sky-er!
Честно говоря, задача поставлена так, что и решать ее не хочется в этом виде. Поэтому я ее немного усложнил.
Предположим, что нашему коду заранее неизвестно количество потомков от Student. Вы можете создать любое их количество в сборке. Назвать их любыми именами(у меня названы St1..St5, но это не имеет значения). При этом остальной код можно не трогать. Благодаря применению рефлексии код сам извлечет информацию о потомках и создаст требуемый массив наследников. Единственное условие: необходимо, чтоб наследник содержал конструктор с прототипом (string,uint).

Почитать немного о рефлексии можно здесь: http://msdn.microsoft.com/ru-ru/library/system.reflection.aspx

Вот программа:
Код:

using System;
using System.Collections.Generic;
using System.Reflection;

namespace DemoReflection
{
class Program
{
const uint studentsCount = 20;
static void Main(string[] args)
{
try
{
// Создадим генератор случайных чисел
Random rand = new Random();
// Список с информацией о конструкторах для потомков Student
List<ConstructorInfo> childConstructors = new List<ConstructorInfo>();
// Требуемый конструктор с параметрами (string,uint)
Type[] constructorRequired = new Type[] { typeof(string), typeof(uint) };
// Пройдем по всем типам содержащимся в сборке
foreach (Type t in Assembly.GetExecutingAssembly().GetTypes())
{
// Если найденный тип является классом
if (t.IsClass)
{
// Если базовый тип у класса Student
if (t.BaseType == typeof(Student))
{
// Ищем в классе требуемый нам конструктор
ConstructorInfo constructor = t.GetConstructor(constructorRequired);
// Если такой конструктор найден добавим его в список
if (constructor != null) childConstructors.Add(constructor);
}
}
}
// А это наш массив студентов
Student[] students = new Student[studentsCount];
// Пройдем по нему и заполним его потомками класса Student
for (int i = 0; i < students.Length; ++i)
{
// Пар аметры передаваемые конструктору
// Имя Student+номер и случайная оценка от 2 до 5
object[] parameters = new object[2] { "Student " + i.ToString(), (uint)rand.Next(4) + 2 };
// Создаем объект и приводим его к родительскому типу Student
students[i] = childConstructors[rand.Next(childConstructors.Count)].Invoke(parameters) as Student;
}
// В этом словаре будем хранить оценки и их количество
SortedDictionary<uint, uint> rateDict = new SortedDictionary<uint, uint>();
uint writtenOff = 0; // Количество списавших
// Выводим наш массив студентов и считаем оценки и списавших
Console.WriteLine("Студенты:");
foreach (Student s in students)
{
// Выводим инфо о студенте с указанием имени кл асса для интереса(измените если не надо)
Console.WriteLine("Тип:{0}, {1}", s.GetType().Name, s);
uint rate;
// Проверяем не списал ли студент и увеличиваем счетчик если так
if (s.PassExam(out rate)) ++writtenOff;
// Если наш словарь счетчиков оценок не содержит еще такую то добавим ее
if (!rateDict.ContainsKey(rate)) rateDict.Add(rate, 0);
// Увеличим счетчик оценок
++rateDict[rate];
}
// Выводим результат
Console.WriteLine("Получено оценок:");
foreach (uint rate in rateDict.Keys)
{
Console.WriteLine("Оценка: {0}, Количество: {1}", rate.ToString(), rateDict[rate].ToString());
}
Console.WriteLine("Списано:{0 }%", (double)writtenOff / students.Length * 100);
}
catch (System.Exception ex)
{
Console.WriteLine("Исключение: " + ex.Message);
}
finally
{
Console.ReadKey();
}
}
}
// Классы потомки от Student
class St1 : Student
{
public St1(string name, uint rate)
: base(name, rate)
{ }
public override bool PassExam(out uint rate)
{
rate = this.rate;
return true;
}
}
class St2 : Student
{
public St2(string name, uint rate)
: base(name, rate)
{ }
public override bool PassExam(out uint rate)
{
rate = this.rate;
return false;
}
}
class St3 : Student
{
public St3(string name, uint rate)
: base(name, rate)
{ }
public override bool PassExam(out uint rate)
{
rate = this.rate;
return false;
}
}
class St4 : Student
{
public St4(string name, uint rate)
: base(name, rate)
{ }
public override bool PassExam(out uint rate)
{
rate = this.rate;
return false;
}
}
class St5 : Student
{
public St5(string name, uint rate)
: base(name, rate)
{ }
public override bool PassExam(out uint rate)
{
rate = this.rate;
return true;
}
}
// Класс Student
abstract class Student
{
// Конструктор
public Student(string name, uint rate)
{
this.name = na me;
this.rate = rate;
}
// абстрактный метод
public abstract bool PassExam(out uint rate);
// Имя
private string name;
public string Name
{
get { return name; }
}
// Оценка
protected uint rate;
public override string ToString()
{
return String.Format("Имя: {0}, Оценка: {1}", name, rate);
}
}
}

Пример ее работы:
Код:

Студенты:
Тип:St5, Имя: Student 0, Оценка: 4
Тип:St5, Имя: Student 1, Оценка: 5
Тип:St4, Имя: Student 2, Оценка: 5
Тип:St2, Имя: Student 3, Оценка: 2
Тип:St1, Имя: Student 4, Оценка: 2
Тип:St2, Имя: Student 5, Оценка: 4
Тип:St3, Имя: Student 6, Оценка: 4
Тип:St2, Имя: Student 7, Оценка: 5
Тип:St2, Имя: Student 8, Оценка: 4
Тип:St3, Имя: Student 9, Оценка: 5
Тип:St2, Имя: Student 10, Оценка: 4
Тип:St4, Имя: Student 11, Оценка: 5
Тип:St3, Имя: Student 12, Оценка: 4
Тип:St1, Имя: Student 13, Оценка: 4
Тип:St3, Имя: Student 14, Оценка: 2
Тип:St5, Имя: Student 15, Оценка: 2
Тип:St5, Имя: Student 16, Оценка: 3
Тип:St5, Имя: Student 17, Оценка: 2
Тип:St1, Имя: Student 18, Оценка: 4
Тип:St5, Имя: Student 19, Оценка: 2
Получено оценок:
Оценка: 2, Количество: 6
Оценка: 3, Количество: 1
Оценка: 4, Количество: 8
Оценка: 5, Количество: 5
Списано:45%
Ответ отправил: Micren (статус: Практикант)
Ответ отправлен: 12.04.2009, 03:42

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 247300 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!

    Оценка за ответ: 5
    Комментарий оценки:
    Спасибо очень хороший ответ


    Вы имеете возможность оценить этот выпуск рассылки.
    Нам очень важно Ваше мнение!
    Оценить этот выпуск рассылки >>

    Отправить вопрос экспертам этой рассылки

    Приложение (если необходимо):

    * Код программы, выдержки из закона и т.п. дополнение к вопросу.
    Эта информация будет отображена в аналогичном окне как есть.

    Обратите внимание!
    Вопрос будет отправлен всем экспертам данной рассылки!

    Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
    экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


    Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
    Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RusFAQ.ru, Россия, Москва.
    Авторское право: ООО "Мастер-Эксперт Про"
    Техподдержка портала, тел.: +7 (926) 535-23-31
    Хостинг: "Московский хостер"
    Поддержка: "Московский дизайнер"
    Авторские права | Реклама на портале

    ∙ Версия системы: 5.13 от 01.12.2008

    Яндекс Rambler's Top100
    RusFAQ.ru | MosHoster.ru | MosDesigner.ru
    RusIRC.ru | Kalashnikoff.ru | RadioLeader.ru

    В избранное