Отладка и пошаговое выполнение программы

И) Поиск совпадений

З) Сортировка массива

Е) Обмен местами

Задача 14. Поменять местами первый и последний элемент массива.

При обмене, чтобы не потерять одно из значений, потребуется дополнительная переменная:

p=a[0];

a[0]=a[n-1];

a[n-1]=p;

ж) Поиск минимума/максимума

Задача 15. Найти в массиве наименьший элемент и его позицию.

В подобных задачах нахождения "самого-" в каком-нибудь смысле элемента используется та же идея, что и в спорте при определении рекорда: каждый очередной результат сравнивается с текущим рекордом, и если он "лучше", то он и становится новым значением рекорда, а иначе рекорд не меняется. За начальное значение рекорда принимается первый результат.

min=a[0]; k=0;

for (i=0; i<n; i++)

if (a[i]<min)

{ min=a[i]; k=i; }

Эту же программу можно переписать и короче:

for (i=k=0, min=a[0]; i<n; i++)

if (a[i]<min)

min=a[k=i];

Задача 16. Отсортировать массив по возрастанию (т.е. расположить его элементы в порядке возрастания).

Для этой задачи придумано множество различных алгоритмов. Один из них - сортировка методом прямого выбора:

for(i=0; i<n; i++)

for(k=i+1; k<n; k++)

if (a[k]<a[i]) {

p=a[k]; // Обмен a[k] и a[i]

a[k]=a[i];

a[i]=p;

}

Здесь на каждой итерации внешнего цикла происходит помещение на i-ую позицию наименьшего из "оставшихся" (т.е. расположенных от i-ой позиции до конца массива) значений элементов.

Этот алгоритм включает в себя, таким образом, алгоритмы поиска минимума и обмена.

Задача 17. Найти в массиве элемент, повторяющийся наибольшее количество раз. (Если таких элементов несколько, вывести любой из них).

for(max=i=0; i<n; i++){

s=1; // s - число повторений i-го элемента

for(k=i+1; k<n; k++)

if (a[k]==a[i]) s++;

if (s>max) {

max=s; // max - число повторений x

x=a[i]; // x - значение наиболее

} // частого элемента

}

Заметим, что x здесь не присвоено начальное значение, т.к. оператор x=a[i]; обязательно выполнится хотя бы раз (max вначале = 0, а s не меньше 1), а использовано x будет лишь впоследствии.

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

При отладке необходимо:

- проверять работу программы при различных исходных данных;

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

Процесс отладки больших, сложных программ значительно облегчает функциональная декомпозиция, т.к. она позволяет вначале отладить каждую функцию по отдельности, и лишь затем, будучи почти уверенным в их правильности, переходить к отладке программы в целом.

Для вывода промежуточных результатов можно добавлять в середину текста программы операторы вывода, а после отладки - удалять их или оформлять как комментарии. Но это - трудоемкий способ, поэтому в большинстве сред программирования предусмотрены средства пошагового выполнения программы. Пошаговое выполнение означает возможность "приостановить" работу программы в желаемом ее месте и посмотреть текущие значения переменных, после чего продолжить ее работу дальше.

Среда С++ Builder обладает богатейшими средствами пошагового выполнения программ (для их использования служат команды среды C++ Builder'а, которые могут быть вызваны либо через ее меню (пункт Run), либо через горячие клавиши):

- точки останова;

- клавиши пошагового выполнения (с заходом в функцию и без);

- просмотр значений переменных во всплывающей подсказке или в отдельном окне;

- просмотр массивов и строк как целого.

Точка останова - это строка программы, достигнув которой, машина приостанавливает процесс выполнения программы, давая человеку возможность просмотреть текущие результаты и значения переменных. Точка останова может быть поставлена на любую строку программы, содержащую исполняемые операторы (не объявления), с помощью щелчка мыши слева от строки, и убирается так же. Точка останова в среде С++ Builder выделяется красным цветом. В одной программе одновременно может быть несколько точек останова. Кроме того, с помощью команды Run to cursor (клавиша F4) можно заставить программу выполняться до того места, где стоит курсор, и остановиться по его достижении (подобно одноразовой точке останова). Однако при "перескакивании" (невыполнении) строки программы с точкой останова (например, с помощью оператора if) выполнение программы не приостанавливается.

Чтобы в момент останова посмотреть текущее значение переменной, в среде С++ Builder достаточно просто подвести курсор мыши к имени этой переменной в любом месте текста программы и ненадолго задержать его там. Значение переменной появится во всплывающей подсказке. (Разумеется, показывается текущее (на момент останова) значение переменной, независимо от места текста, куда подведен курсор). Отображаются также значения строк и статических (нединамических) массивов, как целого. Но показываются лишь значения переменных, в чью область видимости входит точка останова.

Существует также возможность просматривать значения переменных в отдельном окне с помощью команды Evaluate / Modify (клавиша Ctrl+F7).

Чтобы продолжить выполнение программы до конца (либо до следующей точки останова), нужна команда Run (клавиша F9). Чтобы полностью прекратить выполнение программы, нужна команда Program Reset (клавиша Ctrl+F2). Но существует также возможность выполнения программы по одному оператору (точнее, по одной строчке) с помощью команд Trace Into (клавиша F7) или Step Over (клавиша F8). Различие между ними в том, что Trace Into заходит и внутрь функций для их пошагового выполнения, а Step Over выполняет любой вызов функции за один шаг. После каждого шага можно вновь просмотреть значения переменных; кроме того, становится наглядно видна последовательность выполнения операторов.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: