13. C-sharp 7 15-10-2013

Created Saturday 23 November 2013

** Параллельные массивы
*** Одномерные
*** Массивы одного размера, но возможно разного типа
*** Пусть есть список студентов - как по т.з. найти фамилию?
**** 1) Через массивы
***** Массив ID
***** Массив Lastname
***** ID.Length == Lastname.Length
**** 2) Через структуру
***** struct Student:
#+BEGIN_SRC C#
struct Student {
ind ID;
string Lastname;
}
student[] st_list ...
...
if(st_list[i].ID == key) -- think twice if this is optimal, maybe
#+END_SRC
arrays method better..
*** Использование массивов вместо switch
**** Каждый раз, когда видим такое:
#+BEGIN_SRC C#
switch(day){
case1: ...
case2: ...
case3: ...
...
}
#+END_SRC
почти всегда нужно сделать массив длины, равной количеству кейсов, и тогда:
day_name[day]
*** Использование значений одного массива в качестве индекса другого.
**** Задача:
Производится опрос какого-то кол-ва людей с тем, чтобы получить оценку качества преподавания
по пятибальной системе. Написать программу обработки результатов опроса при том, что было
опрошено 50 человек. Каждый респондент поставил оценку от 1 до 5. Программа обрабатывает данные
и выдаёт следующий отчёт:
| Mark | Count |
|------+-------|
| 5 | 10 |
| 4 | 3 |
| 3 | 17 |
| 2 | 10 |
| 1 | 10 |
Count - количетво людей, давших эту оценку
Решать с помощью массива People - это массив сбора данных, хранит в значениях оценки.
Второй массив Mark (не путать со столбцом) - индекс нужно принять в качестве оценки (соответствует столбцу Count).
Требуется сформировать второй массив за один проход.
Mark[People[i]]++;
** Алгоритм сортировки
*** Методы сортировки C# работают только на одномерных массивах
*** Для сортировки массива можно использовать различные способы сортировки,
но их суть сводится к одному:
надо переставлять значения элементов массива местами так, чтобы в конечном
итоге они стали упорядочены по возрастанию или убыванию.
Основное действие - смена местами:
#+BEGIN_SRC C#
int a = 5;
int b = 10;
int x = 0;
x = a;
a = b;
b = x;
#+END_SRC
*** ascending - по возрастанию, descending - по убыванию
*** Самый простой и самый неэффективный способ сортировки: пузырьковый
**** Идём по массиву и сравниваем 2 рядом стоящих элемента
*** Вряд ли есть сортировки, сортирующие массив за одно прохождение
*** Knuth 3rd tome
*** Если "тяжёлый" элемент "вверху", то написанный алгоритм (см.) эффективен, т.к.
потребуется меньше проходов, но если "лёгкий" элемент "внизу", то эффект
противоположен. Поэтому для усреднения эффективности при любой ситуации
можно проходить массив с двух сторон по очереди.
** ДЗ
*** Добавить в библиотеку массивов методы для сортировки одномерного массива целых чисел по
убыванию и возрастанию значения. При отладке ввести переменную счётчик проходов
для контроля эффективности алгоритма. Проверить на массивах разных объёмов
и с разным составом данных. Для заполнения большого массива использовать случайные
числа. Сравнить с обычным пузырьковым методом.
*** Голосование (см. выше)
*** Source from the lesson
#+BEGIN_SRC C#
using System;

namespace lesson7
{

public class ArrayLib
{
public ArrayLib ()
{
}

public static void Swap (int[] arr, int ind1, int ind2)
{
int temp = 0;
temp = arr [ind1];
arr [ind1] = arr [ind2];
arr [ind2] = temp;
}
public static bool TopDownPass (int[] arr)
{
bool res = false;
// do pass
return(res);
}
public static bool DownTopPass (int[] arr)
{
bool res = false;
// do pass
return(res);
}
public static void SortAsc (int[] arr)
{
bool Sorted = true;
for (int pass = 0; pass < arr.Length - 1; pass++) {
Sorted = true;
// one pass TOP-DOWN
for (int i = 0; i < arr.Length - 1; i++) {
if (arr [i] > arr [i + 1]) {
Swap (arr, i, i + 1);
Sorted = false;
}
}
if (Sorted) break;

// one pass DOWN-TOP
for (int i = arr.Length - 1; i < 1; i--) {
if (arr [i] < arr [i - 1]) {
Swap (arr, i, i - 1);
Sorted = false;
}
}
if (Sorted) break;

}
}

public static void SortDesc (int[] arr)
{
}
}
}
#+END_SR



Backlinks: