Название: Алгоритмическое мышление при решении задач (Шамшев А. Б.)

Жанр: Информационные системы и технологии

Просмотров: 1407


Задача 1: напечатать весь массив целых чисел.

Рассуждения:

1.  Необходимо напечатать весь массив чисел.

Очевидно, что задача печати одного элемента (т. е. в данном случае целого числа) решается с помощью синтаксиса языка (Console.Write в

языке C#, printf в языке C++, write в Pascal).

2. Массив – множество элементов (каждый элемент в данном случае является целым числом). Для того, что бы напечатать множество элементов,  необходимо  напечатать  каждый  элемент  множества.  Для

конкретики назовем массив именем data. Поэтому возникают вопросы:

a.  Как от массива перейти к элементу массива?

b.  Как узнать количество элементов в множестве.

Замечание 1: следует отметить, что в C# есть цикл foreach, который работает по-особенному и для его использования необходимо иметь только  множество  элементов,  которое  реализует  интерфейс IEnumerable. Однако «прямых» аналогов такого цикла в языке Pascal нет, и в чистом С тоже нет (однако в Visual C++ есть итератор, который по смыслу очень близок к циклу foreach). Поэтому пока не будем рассматривать этот вариант решения.

3.  В начале ответим на вопрос 2b. В языке C# у массивов есть свойство

Length, в котором хранится количество элементов массива. Отметим,

что наличие этого свойства сильно облегчает задачу.

4.  Теперь ответим на вопрос 2a. Рассуждая формально, для перехода от массива к элементу массива необходимо применить операцию индексации. С точки зрения синтаксиса это выражается в написании

ИмяМассива[Индекс]. Имя массива у нас есть (data). Поэтому ответ на этот вопрос сводится к ответу на вопрос – какому диапазону чисел принадлежит индекс?

5. Для ответа на этот вопрос необходимо вспомнить, что в С-подобных языках (к которым относится и C#) в массивах индексация элементов начинается с 0. И она последовательна (т. е. в индексации не может

быть «разрывов»). Поэтому нижняя граница диапазона индексов равна

0. Если в массиве data всего N элементов, и первый элемент имеет индекс 0, то последний элемент имеет индекс N-1. При этом по логике

N – количество элементов, а data.Length так же содержит количество элементов. Поэтому N можно заменить на data.Length

6.  Таким   образом,   задача   печати   массива   свелась   к   задаче   печати элементов массива с индексами от 0 до (data.Length – 1) включительно.

Очевидно, что для выполнения этого действия необходимо воспользоваться одним из циклов. В C# есть циклы for, while, do..while (цикл foreach в силу замечания 1 не будем рассматривать).

7. Цикл do..while выполняется как минимум один раз (если в нем нет операторов break). А с учетом того, что в массиве может быть ноль элементов (пустой массив), данный цикл не подходит.

8.  Цикл while для  реализации данной задачи подходит (т. к.  он  может выполниться ноль раз). Реализация на цикле while имеет следующий

вид:

//объявление  и  создание  массива data

int[] data = new int[] { 1, 2, 3, 4, 5 };

//вывод начнем с  элемента  с  индексом равным 0

int i = 0;

while (i < data.Length) {

//выводим  элемент  массива, индекс  которого  равен  текущему

//числу,

Console.Write(data[i] + " ");

// и  увеличиваем число на   1

i = i + 1;

}

9.  Цикл  for  для  реализации  данной  задачи  подходит  (т. к.  он  может

выполниться ноль раз). Реализация на цикле for имеет следующий вид

(очевидно, что она занимает меньше строк кода, чем реализация на цикле while):

//объявление  и  создание  массива data

int[] data = new int[] { 1, 2, 3, 4, 5 };

//для каждого числа  от  0 включая  до   data.Length не   включая  с

//шагом   1

for (int i = 0; i < data.Length; i = i + 1) {

//выводим  элемент  массива, индекс  которого  равен  текущему

//числу

Console.Write(data[i] + " ");

}