Национальный Исследовательский Университет

Информационных Технологий, Механики и Оптики

Лабораторная работа №1

Программа написана на C#

       Дисциплина:                Технологии программирования

Кафедра:                Информатики и Прикладной Математики

Студент:                Петряков Станислав

Группа:                        4120

Санкт-Петербург

2014 год

Задание

       Написать приложение Windows, которое по заданным в файле исходным данным выводит информацию о компьютерах.

       Этапы работы:

1)        Создать главное окно. Заголовок содержит ФИО, гр., вар.

2)        Создать меню вида:  Show  Diagram  About  Quit

    По Quit приложение завершается. По About выдается информация о теме разработки. Пункт Diagram запрещен.

3)        При запуске приложения из файла читаются исходные данные (файл сформировать самостоятельно). Файл должен содержать названия компьютеров и их цены) и быть доступен для корректировки текстовым редактором.

4)        Пo Show открывается диалоговое окно, содержащее:

    окно-список (класс Listbox) с введенной информацией (для вывода использовать равноширинный шрифт и под имя отвести 20 позиций, далее пробел и 6 позиций под значение цены) статическое окно над списком - заголовки граф (наименование компьютера, цена) над соответствующей частью строк в окне-списке. окно-редактор для ввода максимальной приемлемой цены OK, CANCEL - кнопки типа BS_PUSHBUTTON. При инициализации диалога фокус ввода должно иметь окно-редактор. Пункт меню Diagram разрешается после выбора OK и завершения диалога. По CANCEL выбор игнорируется и по завершению диалога пункт меню Diagram остается в предыдущем состоянии.

5)        По Diagram в главное окно приложения выводится графическая иллюстрация величины стоимости компьютеров, удовлетворяющих введенному ограничению, в виде горизонтальной столбиковой диаграммы (столбики располагаются параллельно оси Х), упорядоченной по возрастанию стоимости. При этом ось Х должна иметь градацию и наименование(Цена), ось Y именуется "Компьютеры" и содержит их имена (допускается выводить имена внутри прямоугольников).

НЕ нашли? Не то? Что вы ищете?

       Компьютеры с максимальной и минимальной стоимостью выделяются разными цветами (для максимальной - желтый, для минимальной - зеленый, остальные - синий) и имеют бордер черного цвета. Синие прямоугольники бордера не имеют.

  В правом верхнем углу рабочей области главного окна выводится значение введенного ограничения по цене.

6) При двойном нажатии правой клавиши мыши толщина линий осей координат изменяется и становится равной 2 пикселам, а при двойном нажатии левой клавиши мыши - 1 пиксел. Обратите внимание на то, что отрисовка осей и диаграммы с новыми значениями осуществляется только после входа в пункт Diagram. Изображение должно масштабироваться при изменении размеров окна.

Исходный файл с данными
разделитель цены и названия - табуляция

Celeron 2k        3000

Pentium 4        4000

Core 2 Duo        6000

i5 Nehalem        7500

i3 Sandy Bridge        9100

i3 Ivy Bridge        11000

Haswell i7        15000

Основные фрагменты кода программы

Вспомогательный класс для работы с данными

class Item : IComparable        {

  String name;

  int price;

  public Item(String name, int price)        {

  this. name = name;

  this. price = price;

  }

  public int GetPrice        {

  get { return price; }

  }

  public String GetName        {

  get { return name; }

  }

  public int CompareTo(object obj)        {

  if (obj == null)

  throw new ArgumentNullException("Object is Null!");

  Item otherItem = obj as Item;

  if (otherItem!= null)

  return this. pareTo(otherItem. price);  // sort items by price

  else

  throw new ArgumentException("Object is not a Temperature!");

  }

  }

Отрисовка диаграммы и сетки

public Image graphIt(Int32 w, Int32 h)        {

  if (!Diagram || items. Count == 0)

  return null;

  Bitmap iM = new Bitmap(w, h);

  Graphics g = Graphics. FromImage(iM);

  g. SmoothingMode = SmoothingMode. AntiAlias;

  // столбцы

  int dH = (h - 14) / items. Count;

  int sH = (int)(dH * 0.9);

  int gap = (int)(dH * 0.1);

  int y = 6;

  SolidBrush yel = new SolidBrush(Color. FromArgb(255, 187, 51));

  SolidBrush gre = new SolidBrush(Color. FromArgb(153, 204, 0));

  SolidBrush blu = new SolidBrush(Color. FromArgb(51, 181, 229));

  Brush b;

  for (int i = 0; i < items. Count; i++)        {

  if (i == 0)

  b = gre;

  else

  if (i == items. Count - 1)

  b = yel;

  else b = blu;

  g. FillRectangle(b, 2f, y * 1f, 1f * items[i].GetPrice / items[items. Count - 1].GetPrice * w - 32, sH * 1f);

  if (b!= blu)

  g. DrawRectangle(pen, 2f, y * 1f, 1f * items[i].GetPrice / items[items. Count - 1].GetPrice * w - 32, sH * 1f);

  g. DrawString(items[i].GetName, SystemFonts. DefaultFont, Brushes. Black, new PointF(8, y + gap * 3));

  g. DrawLine(pen, 1f * items[i].GetPrice / items[items. Count - 1].GetPrice * w - 32, 0, 1f * items[i].GetPrice / items[items. Count - 1].GetPrice * w - 32, 4);

  g. DrawString(items[i].GetPrice. ToString(), SystemFonts. DefaultFont, Brushes. Black, new PointF(1f * items[i].GetPrice / items[items. Count - 1].GetPrice * w - 56, 6));

  y += sH + gap;

  }

  // сетка

  g. DrawLine(pen, 2, 2, w - 2, 2);

  g. DrawLine(pen, 2, 2, 2, h - 2);

  g. DrawLine(pen, w - 2, 2, w - 8, 0);

  g. DrawLine(pen, w - 2, 2, w - 8, 4);

  g. DrawLine(pen, 2, h - 2, 0, h - 8);

  g. DrawLine(pen, 2, h - 2, 4, h - 8);

  g. DrawString("0", SystemFonts. DefaultFont, Brushes. Black, new PointF(4, 6));

  g. DrawString("Компьютеры", SystemFonts. DefaultFont, Brushes. Black, new PointF(4, h - 16));

  g. DrawString("Цена", SystemFonts. DefaultFont, Brushes. Black, new PointF(w - 28, 4));

  g. DrawString("Ограничение: " + bound, SystemFonts. DefaultFont, Brushes. Black, new PointF(w - 146, 16));

  return iM;

  }

Загрузка данных в ListBox

try

{

       foreach (String s in data)        {

  String[] i = s. Split('\t');

  String name = i[0].Length > 20 ? i[0].Substring(0, 20) : i[0];

  String price = i[1].Length > 6 ? i[1].Substring(0, 6) : i[1];

  listBox1.Items. Add(name + " " + price);

  }

  }

catch

{

       MessageBox. Show("Ошибка в формате входного файла!", "Error", MessageBoxButtons. OK, MessageBoxIcon. Error, MessageBoxDefaultButton. Button1);

}

Вывод

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