Главная страница

Электронный конспект по программированию часть 1. Программа на языке Си, так же как и на большинстве современных языков программирования, создается в два этапа


Скачать 32.35 Mb.
НазваниеПрограмма на языке Си, так же как и на большинстве современных языков программирования, создается в два этапа
АнкорЭлектронный конспект по программированию часть 1.doc
Дата04.09.2018
Размер32.35 Mb.
Формат файлаdoc
Имя файлаЭлектронный конспект по программированию часть 1.doc
ТипПрограмма
#24059
страница3 из 12
1   2   3   4   5   6   7   8   9   ...   12

Досрочный выход из цикла

Иногда надо выйти из цикла и перейти к следующему оператору, не дожидаясь оконча-

ния очередного шага цикла. Для этого используют специальный оператор break. Можно также сказать компьютеру, что надо завершить текущий шаг цикла и сразу перейти к новому шагу (не выходя из цикла) — для этого применяют оператор continue.

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

Особенность этой задачи состоит в том, что при входе в цикл мы не можем определить,

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

while(1){...} (напомним, что в языке Си единица считается истинным условием). Выйти

из такого цикла можно только с помощью специального оператора break.

В то же время, если второе число равно нулю, то оставшуюся часть цикла не надо выпол-

нять. Для этого служит оператор continue.




• Если только внутри цикла можно определить, надо ли делать вычисления в теле цикла и надо ли продолжать цикл (например, при вводе исходных данных), часто используют бесконечный цикл, внутри которого стоит оператор выхода break:


• С помощью оператора break можно досрочно выходить из любых циклов: for, while,

do—while.

• Чтобы досрочно завершить текущий шаг цикла и сразу перейти к следующему шагу, используют оператор continue.

Вычисление сумм последовательностей

Суммы с заданным числом элементов


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

• каждый элемент представляет собой дробь;

• числитель дроби при переходе к следующему элементу возрастает на единицу;

• знаменатель дроби с каждым шагом увеличивается в 2 раза;

• знаки перед дробями чередуются (плюс, минус и т.д.).

Любой элемент последовательности можно представить в виде

Т



где изменение переменных z, c и d описываются следующей таблицей (для первых пяти элементов)


У переменной z меняется знак (эту операцию можно записать в виде z = -z), значение переменной c увеличивается на единицу (c ++), а переменная d умножается на 2 (d = d*2). Алгоритм решения задачи можно записать в виде следующих шагов:

• записать в переменную S значение 0; в этой ячейке будет накапливаться сумма;

• записать в переменные z, c и d начальные значения (для первого элемента):

z = 1, c = 1, d = 2.

• сделать 20 раз:

o добавить к сумме значение очередного элемента;

o изменить значения переменных z, c и d для следующего элемента.



Суммы с ограничивающим условием

Рассмотрим более сложную задачу, когда количество элементов заранее неизвестно.

Пример



Эта задача имеет решение только тогда, когда элементы последовательности убывают по модулю и стремятся к нулю. Поскольку мы не знаем, сколько элементов войдет в сумму, надо использовать цикл while (или do-while). Один из вариантов решения показан ниже.


Цикл закончится тогда, когда переменная a (она обозначает модуль очередного элемента последовательности) станет меньше 0,001. Чтобы программа вошла в цикл на первом шаге, в эту переменную надо записать любое значение, большее, чем 0,001.

Очевидно, что если переменная a не будет уменьшаться, то условие в заголовке цикла

всегда будет истинно и программа «зациклится».

5. Методы отладки программ

Отладочные средства Dev-C++

Сущность отладки

Слово «отладка» означает «поиск и исправление ошибок в программе». Соответствующий

английский термин debugging (дословно «удаление жучков») по преданию связан с тем, что в контакты компьютера Mark II в 1940 году попал жучок (моль), из-за которого в вычислительной машине произошел сбой.

Существует три типа ошибок в программах:

синтаксические – ошибки в написании операторов (например, вместо printf часто не-

правильно пишут просто print); эти ошибки легко исправить, потому что их обнаруживает транслятор и чаще всего говорит, в какой именно строчке ошибка;

ошибки времени выполнения – во время работы случилась «аварийная» ситуация, например, деление не ноль;

логические – ошибки в алгоритме (программа работает, но выполняет не то, что нужно);

эти ошибки сложнее всего обнаружить, потому что иногда они проявляются совсем не в

том месте, где находится неверная команда.

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

Трассировка

Трассировка – это вывод сигнальных сообщений в определенных точках программы во

время ее работы. Что же это дает?

Во-первых, получив такое сообщение на экран, мы знаем, что программа вышла в эту точку (не завершила работу аварийно раньше и не зациклилась). Во-вторых, в этих сообщениях можно выводить не только текст, но и значения переменных – это позволяет проверять, правильно ли считает программа. Если, например, во 2-ой контрольной точке все значения переменных были верные, а в 3-ой уже нет, то ошибку нужно искать между этими точками.

В этой программе в трех точках (1, 2 и 3) стоят операторы трассировки:


В точке 1 мы увидим на экране число, которое находится в переменной X после ввода значения с клавиатуры – так можно проверить правильность ввода.

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

В точке 3 значение переменной X после завершения цикла выводится на экран.

Заметим, что трассировку можно применять практически всегда, для этого не нужна программа-отладчик.

Отключение части кода

Нередко бывает так: в результате усовершенствований работавшая программа перестает

работать. В такой ситуации для поиска ошибки нужно как-то убрать из программы весь новы код и добавлять его «маленькими порциями», чтобы определить, какие именно добавленные операторы портят все дело. Удалять код из программы совсем не хочется, но можно его отключить, сделав комментарием.

Чтобы отключить одну строчку программы, перед ней нужно поставить символы //, а для

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

комментарий, который начинается символами /* и заканчивается символами */ (здесь и далее многоточие означает «какие-то команды»):


Пошаговое выполнение

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

служат специальные программы —отладчики.

С оболочкой Dev-C++ поставляется отладчики GDB. Сначала нужно установить точки останова,то есть отметить строки, где нужно остановить программу. Для этого

достаточно щелкнуть мышкой слева от нужной строчки программы на

черном фоне. Повторный щелчок снимает точку останова в этом месте. Кроме того, с помощью комбинации клавиш Ctrl+F5 можно устанавливать и снимать точку останова в том месте, где стоит курсор.Когда в программе есть хотя бы одна точка останова, можно запустить ее в отладочном режиме, нажав кнопку F8. Отладчик должен остановить программу на первой встретившейся.


точке останова. После этого можно выполнять программу в пошаговом режиме (по одной

строчке), нажимая клавишу F7.Однако в этом режиме отладчик не позволяет входить внутрь вызываемых процедур (по шагам выполняется только основная программа). Для входа в процедуру или функцию используют комбинацию Shift+F7.

При нажатии клавиш Ctrl+F7 отладчик запускает программу до следующей точки останова. Завершить отладку можно с помощью комбинации клавиш Ctrl+Shift+F2.

Просмотр значений переменных

Пошаговое выполнение программы позволяет лишь посмотреть, какие операторы программы выполняются, сколько раз и в какой последовательности. Однако

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

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


Ручная прокрутка программы

Если другие способы не помогают, приходится делать ручную прокрутку программы, то

есть выполнять программу вручную вместо компьютера, записывая результаты на лист бумаги.Обычно составляют таблицу, в которую записывают изменения всех переменных (неизвестное значение переменной обозначают знаком вопроса). Рассмотрим (ошибочную) программу, которая вводит натуральное число и определяет, простое оно или нет. Мы выяснили, что она дает неверный результат при N=5 (печатает, что 5 – якобы составное число). Построим таблицу изменения значений переменных для этого случая.


Выполняя вручную все действия, выясняем, что программа проверяет делимость числа N на само себя, то есть, счетчик делителей count всегда будет не равен нулю. Теперь, определив причину ошибки, легко ее исправить. Для этого достаточно заменить условие в цикле на i < N.

Проверка крайних значений

Очень важно проверить работу программы (и функций) на крайних значениях возможного

диапазона исходных данных. Например, для программы, определяющей простоту натуральных чисел, надо проверить, будет ли она работать для числа 2 (число 1 не считается ни простым, ни составным). Аналогично, если мы отлаживаем программу, которая ищет заданное слово в строке, надо проверить ее для тех случаев, когда искомое слово стоит первым или последним в строке.

6. Работа в графическом режиме

Простейшая графическая программа

Графическая программа на Си имеет структуру сэндвича:


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


• Для использования графических функций надо подключить заголовочный файл

graphics.h.

• Функция initwindow открывает дополнительное окно, в котором можно рисовать. В

скобках нужно указать ширину и высоту этого окна в пикселях.

• Окно с графикой закрывается с помощью функции closegraph.

Как начать рисовать?

Координаты точек

Пришло время нарисовать что-то на экране. Для этого надо представлять, как определять координаты.

• Начало координат, точка (0,0), находится в левом верхнем углу окна.

• Ось X направлена вправо, ось Y вниз (в отличие от общепринятой математической системы координат).

• Для любой точки координата x – это расстояние до левой границы окна, а y – расстояние до верхней границы.



Цвет

Для 16 стандартных цветов заданы числовое и символьное обозначения:


Кроме того, можно использовать полную палитру цветов (режим True Color, истинный цвет). В этом случае цвет строится из трех составляющих: красной (R) , зеленой (G) и синей (B). Каждая из этих составляющих – целое число от 0 до 255 (256 вариантов), таким образом, всего получается 2563 = 16 777 216 цветов. Цвета строятся с помощью функции COLOR, у нее в скобках перечисляются через запятую значения составляющих R , G и B (именно в таком порядке). Вот,например, некоторые цвета:


Функция setcolor устанавливает цвет линий:

setcolor ( 10 ); // установить светло-зеленый цвет

Все линии (а также прямоугольники, окружности), нарисованные после этой команды, будут светло-зеленого цвета. Эта же функция может установить цвет из полной палитры:

setcolor ( COLOR(255,0,255) ); // установить фиолетовый цвет

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

Работа с отдельными пикселями

Для рисования используются стандартные функции. Для каждого пикселя можно задать свой цвет с помощью функции putpixel:

putpixel ( x, y, 14 ); // покрасить точку (x,y) в желтый цвет

Функция getpixel позволяет определить цвет любого пикселя окна:

n = getpixel(x, y); // записать цвет точки (x,y) в переменную n

Линии

Отрезок можно нарисовать с помощью команды line:

line ( x1, y1, x2, y2 ); // отрезок (x1,y1)-(x2,y2)

Есть и другой способ: сначала перевести курсор (указатель текущего положения) в точку

(x1,y1) командой moveto, а затем нарисовать отрезок в точку (x2,y2) командой lineto:

moveto ( x1, y1 ); // курсор в точку (x1,y1)

lineto ( x2, y2 ); // отрезок в точку (x2,y2)

После выполнения команды lineto курсор смещается в новую точку

(x2,y2). Особенно удобно использовать эти команды при рисовании

ломаных линий:

setcolor(12); // красный цвет

moveto (x1, y1); // курсор в первую точку

lineto (x2, y2); // отрезок во вторую точку

lineto (x3, y3); // ит.д.

lineto (x4, y4);

lineto (x5, y5);


Прямоугольники

Для рисования прямоугольника нужно задать координаты двух противоположных углов (обычно выбирают левый верхний и правый нижний углы). Цвет контура устанавливается с помощью функции setcolor, а сам прямоугольник рисуется командой rectangle:

setcolor ( 9 );

rectangle (x1, y1, x2, y2);

Закрашенный прямоугольник рисует команда bar. Цвет и стиль заливки нужно заранее установить, вызвав функцию setfillstyle:

setfillstyle ( 1, 12 ); // стиль 1, цвет 12

bar (x1, y1, x2, y2);



Первое число в команде setfillstyle задает стиль заливки:

0 – отключить заливку

1 – сплошная заливка

3,4,5,6 – наклонные линии

7,8 – сетка

9,10,11 – точечные узоры

а второе – цвет.
Окружность

Чтобы нарисовать окружность, используют функцию circle:
1   2   3   4   5   6   7   8   9   ...   12


написать администратору сайта