Национальный Исследовательский Университет
Информационных Технологий, Механики и Оптики
Лабораторная работа №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#, способы работы с файлами и данными внутри программы, а также взаимодействие с диалоговыми окнами. Была создана программа, показывающая диаграммы абстрактных цен компьютеров.


