Логические алгоритмические ошибки в программе устранимы

Сборник тестовых вопросов по информатике 9 класс

Правильный вариант ответа отмечен знаком +

1. Информатика (более полно, точно) – наука, изучающая:

— компьютеры

+ информационные системы и среды

— программирование

2. У алгоритма есть свойство:

+ массовости

— измеримости

— неотрицательности

3. По санитарно-гигиеническим нормам работа учеников 9 класса в компьютерном классе должна продолжаться не более:

— 1 часа без перерыва

+ 4 часов с двумя 10-минутными перерывами

— 6 часов с шестью 10-минутными перерывами

4. Более правильный вариант установки компьютера на столе (расстояние от экрана до глаз — Г, размеры свободной поверхности стола — П, положение системного блока — Б, пол или стол) – это:

— Г — 1,0 м, П — 0,51,0 м, Б — стол

+ Г — 0,6 м, П — 0,6´1,0 м, Б — пол

— Г — 0,5 м, П — 0,6´1,5 м, Б — стол

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

— фон экрана – красный, шрифт — синий

+ фон экрана – серый, шрифт — белый

— фон экрана – синий, шрифт — черный

6. Наиболее приемлема топология (расстановка) компьютеров в компьютерном классе:

— П-образная, компьютер учителя «внутри буквы П»

+ П-образная, компьютер учителя «в середине основания буквы П»

— П-образная, компьютер учителя у входа в класс

7. Математическая модель всегда представляется:

— лишь математическими уравнениями

— лишь математическими и геометрическими связями

+ любым математическим и геометрическим аппаратом

8. Компьютер как инструмент моделирования может использоваться:

— лишь для решения старых задач компьютерными средствами

— лишь для постановки и решения новых («компьютерных») задач

+ постановки и исследования новых и старых задач

9. Вопросу при компьютерном моделировании по схеме «исследуемая система – ? – алгоритм» соответствует:

— компьютер

— программа

+ модель

тест 10. Математическая модель оригинала (объекта, процесса) – это:

— любые математические уравнения, относящиеся к оригиналу

+ математическое описание связей и отношений в оригинал

— математическое именование, обозначение оригинал

11. Математическая модель используется, в основном, для:

— управления оригиналом

— изучения оригинала

+ управления и изучения оригинала

12. Вопросу при компьютерном моделировании по схеме «алгоритм – ? – пользователь» соответствует:

+ компьютер

— система

— модель

13. Математическая модель не зависит от:

— предположений о поведении оригинала

— методов изучения оригинала

+ используемых обозначений

14. Математическая модель системы должна всегда быть:

— в виде одного уравнения

+ адекватной

— универсальной (на все случаи)

15. Вопросу при компьютерном моделировании по схеме «модель – ? – компьютер» соответствует:

+ программа

— технология

— тест

16. Любая модель должна быть (в рамках гипотезы моделирования):

— абсолютно точной

— идеальной

+ адекватной

17. Математической моделью будет:

+ выражение для второго закона Ньютона

— словосочетание «треугольник»

— макет дома

18. Знаку вопроса в схеме компьютерного моделирования «модель – ? – программа» соответствует:

— компьютер

+ алгоритм

— тест

19. Компьютерная модель – модель, представленная:

+ компьютерными системами и программными средствами

— математическим языком

— большим объемом рутинных вычислений

тест-20. Математическая модель любой системы необходима, в основном, для:

+ познания

— быта

— производства

21. Соотношение вида точнее и грамотнее назвать моделью:

+ математической

— геометрической

— планиметрической

22. Основные риски безопасности сети – все перечисленное в списке:

— искажение, перекодировка и уменьшение информации

— техническое вмешательство, непрофессионализм администратора сети

+ искажение, утечка и потеря информации

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

— «все пользователи – равны по рангу»

— однотипных средств сети

24. К основному типу воздействия на компьютерную сеть относится:
— компьютерный сбой

+ логические закладки («мины»)

— аварийное отключение питания

25. При получении спама (e-mail с приложенным неизвестным файлом), следует:
— прочитать приложение и удалить, если оно не содержит ничего ценного

— сохранить в папке «Спам», затем выяснить IP-адрес генератора спама

+ удалить письмо с приложением, не раскрывая (не читая) его

26. Предоставляющий всем пользователям в сети свои ресурсы компьютер –

— пользовательский

— клиентский

+ сервер

27. Центральный компьютер сети – это:

— центральный процессор

+ сервер

— маршрутизатор

28. Интернет – глобальная…:

+ система (среда) сетей

— почтовый сервис

— компьютерная сеть

29. Основное назначение сети компьютеров –
+ удаленное использование сервера пользователями

— физическое соединение компьютеров для увеличения мощности сети

— совместное решение сложнейших задач пользователями сети

тест_30. Сеть в границах одного учреждения –

+ локальная

— глобальная

— Интранет

31. Маршрутизатор – устройство для соединения различных:

+ компьютерных сетей

— по архитектуре компьютеров

— маршрутов приема-передачи e-mail

32. Алгоритм не имеет свойства:

— полноты

— детерминированности

+ открытости

33. Метод реализации алгоритма сборкой из базовых команд —

— нисходящий

+ восходящий

— разбивающий

34. Логические (алгоритмические) ошибки в программе устранимы:

— лишь при отладке и тестировании

— лишь при сопровождении

+ во время отладки, тестирования и сопровождения

35. Число тестов для любого алгоритма:

— равно не менее 5

— чем больше, тем лучше

+ зависит от метода

36. По убыванию старшинства операции ранжирован список:

+ умножение и деление; сложение и вычитание

— умножение; деление; сложение; вычитание

— сложение; умножение; вычитание; деление

37. В программе на Паскале (Бейсике, Си) можно описывать

+ используемый тип данных

— используемый интерфейс

— часто встречающиеся ошибки

38. Фрагмент программы (дан на трех языках):

ШАЯ: y:=0; x:=12345; нц для i=1 до 4; y:=y+mod(х,10); x:=int(x/10); кц;

Паскаль: y:=0; x:=12345; for i:=1 to 4 do begin y:=y+x mod 10; x:=int(x/10) end;

Бейсик: y=0 : x=12345 : for :=1 to 4; y=y+x mod 10; x=int(x/10); next i;

вычисляет значение y равное

— 18

— 16

+ 14

39. Фрагмент

ШАЯ: нц для i от 1 до n; y:=mod(x,10); x:=div(x,10); кц

Паскаль: for i:=1 to n do begin y:=x mod 10; x:=x div 10 end

Бейсик: for i=1 to n : y= x mod 10 : x = x 10 : next i

вычисляет значение переменной y равное:

— цифре единиц натурального числа x

— цифре самого старшего разряда числа

+ цифре n-го разряда числа x (начиная с младшего разряда)

тест*40. Тело цикла

i:=1;s:=0; while i mod i=1 do begin if (x[i] div 5=0) then s:=s+x[i]; i:=i+1 end

— бесконечно выполняется (зацикливается)

+ ни разу не выполняется

— выполняется только при четных i

41. Фрагмент программы

i:=1; s:=0; while i<5 do begin x[i]:=i; if 2*trunc(x[i]/2)=x[i] then s:=s+i; i:=i+1

end; write(s);

выводит значение:

+ 6

— 10

— 11

42. Выделить в электронной таблице группу из 4 ячеек можно диапазоном:

+ A1 : D1

— A1 : B2

— A1 : C2

43. FrontPage – приложение для:

— редактирования графики, фото

— поиска интернет-ресурсов

+ создания веб-страниц

44. Для фрагмента электронной таблицы:

 

A

B

C

D

1

 

=$A$1*B1

   

2

       

3

       

При копировании формулы из ячейки В1 в ячейку D3, формула в ячейке D3 имеет вид:

+ =$A$1*D3

— =$A$1*B2

— =$A$1*B1

Отладка, или debugging, — это поиск (локализация), анализ и устранение ошибок в программном обеспечении, которые были найдены во время тестирования.

Виды ошибок

Ошибки компиляции

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

В интерпретируемых языках (например Python) текст программы команда за командой переводится в машинный код и сразу исполняется. К моменту обнаружения ошибки часть программы уже может исполниться.

Ошибки компоновки

Ошибки связаны с разрешением внешних ссылок. Выявляет компоновщик (редактор связей) при объединении модулей программы. Простой пример — ситуация, когда требуется обращение к подпрограмме другого модуля, но при компоновке она не найдена. Ошибки также просто найти и устранить.

Ошибки выполнения (RUNTIME Error)

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

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

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

Ошибки определения данных или неверное определение исходных данных. Они могут появиться во время выполнения операций ввода-вывода.

К ним относятся:

  • ошибки преобразования;
  • ошибки данных;
  • ошибки перезаписи.

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

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

В эту группу входят:

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

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

Методы отладки программного обеспечения

Метод ручного тестирования

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

Метод индукции

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

Вот как выглядит процесс:

Алгоритм отладки по методу индукции

Важно, чтобы выдвинутая гипотеза объясняла все проявления ошибки. Если объясняется только их часть, то либо гипотеза неверна, либо ошибок несколько.

Метод дедукции

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

Отладка по методу дедукции

Метод обратного прослеживания

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

Как выполняется отладка в современных IDE

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

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

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

Шаг с заходом (step into)

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

Шаг с обходом (step over)

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

Шаг с выходом (step out)

В отличие от step into и step over, step out выполняет не следующую строку кода, а весь оставшийся код функции, исполняемой в настоящее время. После возврата из функции он возвращает управление разработчику. Эта команда полезна, когда специалист случайно вошел в функцию, которую не нужно отлаживать.

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

У некоторых отладчиков (таких как GDB 7.0, Visual Studio Enterprise Edition 15.5 и более поздних версий) есть возможность вернуться на шаг назад. Это полезно, если пропущена цель либо нужно повторно проверить выполненную инструкцию. 

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

  1. Находит в памяти
    алгоритм с указанным именем.

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

  3. Последовательно
    читает команды после строки нач
    и передает
    их исполнителю. Каждый такой приказ на
    выполнение команды называется вызовом
    этой команды.

  4. Встретив строку
    кон,
    проверяет,
    достигнута ли цель алгоритма, указанная
    в строке надо
    (см. примечание
    к п. 2).

  5. Заканчивает
    выполнение алгоритма.

Пример.
Компьютер
получает приказ исполнить алгоритм
«ход конем».

  1. Компьютер находит
    в памяти алгоритм А1.

  2. В строке дано
    записан
    комментарий — компьютер его пропускает.

  3. Компьютер
    последовательно командует Роботу
    вправо,
    вправо, вниз
    .
    Робот
    исполняет
    эти команды.

  4. В строке надо
    помещен
    комментарий — компьютер его пропускает.

  5. Компьютер
    заканчивает выполнение алгоритма «ход
    конем».

7.6. Ошибки в алгоритмах

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

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

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

Рис. 2

У каждого исполнителя
могут быть свои причины отказов. Отказ
Робота
возникает
при попытке идти сквозь стену.

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

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

Таблица 1. Ошибки
в алгоритмах.

Смысл ошибки

Название

Пример

1

Цель не достигнута

Логическая

Робот не попал
куда надо

2

Команда не входит
в СКИ

Синтаксическая

наверх, направо

3

Авария при попытке
исполнения команды

Семантическая
(отказ)

Попытка пройти
сквозь стену

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Главная / Образование /
Введение в информатику / Тест 9

Упражнение 1:


Номер 1

Скрытые ошибки в программе после начала её эксплуатации устраняют в процессе:

Ответ:

(1) отладки 

(2) сопровождения 

(3) тестирования 


Номер 2

Синтаксические ошибки в программе устраняют в процессе:

Ответ:

(1) отладки 

(2) сопровождения 

(3) тестирования 


Номер 3

Логические (алгоритма, метода) ошибки в программе устраняют обычно в процессе:

Ответ:

(1) отладки 

(2) сопровождения 

(3) тестирования 


Упражнение 2:


Номер 1

Метод разработки алгоритмов с помощью разбиения алгоритмов на подалгоритмы называется:

Ответ:

(1) нисходящим 

(2) восходящим 

(3) разбивающим 


Номер 2

Метод разработки алгоритмов с помощью «сборки» алгоритма из функционально более простых алгоритмов называется:

Ответ:

(1) нисходящим 

(2) восходящим 

(3) разбивающим 


Номер 3

Исправление ошибок в программе, не обнаруженных в процессе тестирования, происходит на этапе:

Ответ:

(1) трассировки 

(2) тестирования 

(3) сопровождения 


Упражнение 3:


Номер 1

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

Ответ:

(1) конструкционным 

(2) композиционным 

(3) структурным 


Номер 2

Проверка алгоритма на специально построенном полном наборе примеров называется:

Ответ:

(1) трассировкой 

(2) тестированием 

(3) верификацией 


Номер 3

Формальное доказательство правильности алгоритма называется:

Ответ:

(1) трассировкой 

(2) тестированием 

(3) верификацией 


Упражнение 4:


Номер 1

Неверно утверждение:

Ответ:

(1) структурный принцип оптимизирует алгоритм 

(2) структурный принцип улучшает читабельность и исполняемость 

(3) структурный принцип облегчает понимаемость алгоритма 


Номер 2

Неверно утверждение:

Ответ:

(1) структурный принцип всегда опирается на базовые алгоритмические конструкции 

(2) структурный принцип всегда оптимизирует время выполнения 

(3) структурный принцип всегда облегчает понимаемость алгоритма 


Номер 3

Неверно утверждение:

Ответ:

(1) модульный принцип всегда использует библиотеки алгоритмов 

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

(3) модульный принцип всегда улучшает читаемость алгоритма 


Упражнение 5:


Номер 1

Верно утверждение:

Ответ:

(1) тестирование всегда опирается на верификацию 

(2) структурный принцип всегда опирается на верификацию 

(3) верификация не требует тестирования 


Номер 2

Верно утверждение:

Ответ:

(1) верификация всегда осуществляется на основе тестирования 

(2) тестирование всегда осуществляется на основе верификации 

(3) для трассировки всегда необходимо задать тест 


Номер 3

Верно утверждение:

Ответ:

(1) при модульном подходе не нужно тестирование 

(2) при структурном подходе не нужно тестирование 

(3) при верификации не нужно тестирование 


Логические ошибки

Опытные программисты знают, что ошибки в программе делятся на два основных типа. Первая разновидность — это баги, которые вылавливаются при компиляции. К ним относятся преимущественно проблемы с синтаксисом, явная несовместимости типов и т.д. Эту разновидность багов исправляют на этапе разработки, так как компилятор «вылетает по ошибке». Их просто невозможно не заметить.

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

Выявить этот вид багов удается только на этапе тестирования. И хорошо, если ошибку удается исправить локальной «заплаткой». Нередко приходится менять практически весь алгоритм. А это – дополнительные затраты времени, сил, а в коммерческих проектах – финансовые, а иногда и репутационные потери.

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

Алгоритм – основа всех основ

Написание алгоритма – это самый первый этап разработки, когда идеи только обретают форму еще без привязки к языку программирования. Нередко начинающие программисты относятся к созданию алгоритма «спустя рукава» — делают только «общие наброски» или вообще приступают к кодингу сразу без предварительной проработки логики «на бумаге».

Такой подход возможен при решении учебных задач на 10-15 строк кода. Но при работе над серьезным программным продуктом пренебрежение алгоритмом – почти гарантированный путь к логическим ошибкам и катастрофическим результатам.

Как работать с алгоритмом:

  • Начинайте с малого. Запишите алгоритм упрощенно, в виде «черных ящиков» (логических блоков без подробностей их работы). Это поможет оценить работоспособность идеи в целом.
  • Двигайтесь сверху вниз. Сначала – общая идея «в целом», далее – детализация основных функций и так далее. Не бойтесь ставить «заглушки» и прорабатывать мелкие детали в последнюю очередь. Двигаться сверху вниз проще и с точки зрения логики, и психологически.
  • Пишите команды «от имени компьютера». Помните, что вы имеете дело не с человеком, а с компьютером, который буквально выполняет команды и после каждого шага ждет ответа на вопрос «что делать». Например, логический блок «сохранение документа» будет понятен вам, но не компьютеру. Он вполне подойдет на этапе крупных блоков в качестве заглушки. Но далее придется проработать все действия пошагово с учетом выбранного языка программирования.
  • Делите код на отдельные модули (блоки), которые можно будет запускать отдельно друг от друга. Это сильно облегчит как алгоритмизацию, так и процесс отладки.
  • Читайте алгоритм «как будто компьютер». Проверяйте себя на каждом этапе. Главное правило – одинаковые данные всегда должны вести к одинаковым результатам.

Итак, алгоритм написан и проверен со всех сторон. Выбран язык программирования. Начинается процесс кодинга. Давайте разбираться, на что обращать особое внимание.

Что делать начинающим программистам

«Не туда положил»: о типах данных

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

  1. При статической типизации в таких языках, как С++, Java или С# неверно определен тип переменной. Большинство подобных ошибок выявляет компилятор. Но здесь есть свои «лазейки» для багов. Например, в С# вполне возможно «положить» вещественное значение в целочисленную переменную. И оно просто округлится до целого. Т.е. вместо 1,3 у вас будет храниться значение 1. Само собой, все дальнейшие вычисления будут содержать ошибку.
  2. При динамической типизации (JavaScript, Python, PHP) неявное приведение типов – самое обычное дело. А потому здесь даже компилятор промолчит в случае ошибки. Например, вы планируете получить целочисленное значение, для чего отправляете результаты вычислений в переменную типа int. Но программа видит «знаки после запятой», и переменная без вашего участия меняет тип на float.

Самый известный пример подобной ошибки – деление двух целых чисел с остатком.

int a = 25;

int b = 8;

float c = a/b;

Console.Write(c);

Как вы думаете, какое число будет выведено на экран после выполнения последней строки? По идее, это должно быть 3,125. Но, например, в C# вы увидите целую цифру «3». Причем, тип переменной С будет float, как вы и заказывали.

Здесь проблема в другом: компилятор сначала проводит целочисленное деление, так как определяет переменные A и B как относящиеся к типу int. И полученный результат отправляет в переменную C (тип float). Целое значение (32 разряда) прекрасно помещается в 64-разрядный float, отведенный под хранение результата. Компилятор не видит ошибки. А у вас в программе появляются неточные вычисления, которые могут повлечь за собой большие проблемы.

Аналогичным образом компилятор округлит значение до целого и в Python 2. А уже в Python 3 алгоритм преобразования типов сработает иначе: сначала определится тип переменной, куда отправляется значение, а потом будет проводиться деление. После компиляции кода в Python 3 вы получите c=3,125.

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

Высвобождение ресурсов: до 100% загрузки процессора

Если вы работаете с языком, где реализована автоматическая сборка мусора, внимательно следите за тем, как происходит высвобождение ресурсов. В отдельных случаях эта полезная функция может начать работать во вред: отбирать для себя максимум памяти, загружать дополнительными задачами процессор, замедлять и даже «подвешивать» программу.

Например, в Java этот процесс работает так:

  • Виртуальная машина проводит поиск ненужных объектов;
  • Составляет из них очередь на удаление;
  • По мере продвижения очереди очищает ячейки памяти.

В результате очередь может стать настолько большой, что компьютер перестанет с ней справляться. А до удаления всех ненужных объектов дело может даже не дойти.

Как итог, программа «загрязняет» память служебной информацией. Кроме того, формируется уязвимость: в этой «свалке данных» могут оказаться логины с паролями и другие личные данные.

Намного надежнее своевременно применять функции типа try-with-resources и try-finally. И все ресурсы очищать в том коде, где вы их получили.

И еще: не забывайте закрывать сессии и файлы сразу после того, как они перестают быть нужны. Это должно быть также естественно, как закрыть скобку в коде.

Конфликт интересов

Конфликт потоков: кто первый успеет?

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

Например: первый поток в результате вычислений получает значение 1, отправляет его в переменную. В это время второй поток перехватывает доступ и обнуляет эту переменную. А первый – сохраняет значение. В результате вы планировали запомнить значение 1. А у вас сразу после вычислений сохраняется 0. И далее копятся ошибка за ошибкой.

Чтобы избежать этой проблемы не забывайте при работе с разными потоками ставить блокировки, чтобы они не обращались одновременно к одним и тем же ресурсам. Можно применять и другие методы синхронизации – события, семафоры, критические секции.

Переменные: склонность к глобализации

Эта ошибка популярна у новичков – стремление объявить сразу все переменные и сделать их глобальными. В результате таких действий вы:

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

На глобальном уровне определяют только необходимый минимум – те самые глобальные переменные, с которыми работают практически все модули. Все остальные объявляйте в тех модулях, где они работают. И не забывайте об идентификаторах ограничения доступа: public, private и protected.

Переполнение буфера в С/С++: «танцы на граблях»

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

Но нередко для экономии ресурсов программисты используют C-библиотеки. В этом случае очень важно следить за буферизацией. Дело в том, что языки C/С++ очень уязвимы к переполнению буфера. Если он окажется меньше, чем нужно для работы, программа попытается использовать память за пределами выделенного участка. Результат – многочисленные, можно сказать, легендарные ошибки, когда в обрабатываемые данные попадает «неведомый мусор».

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

Изучите особенности работы с буфером и методы борьбы с его переполнением, чтобы не пополнить число «танцующих на граблях с 30-летней историей».

Отладка и поиск логических багов

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

  • Пользуйтесь возможностями отладчика вашей IDE. Ставьте контрольные точки, отражайте на консоли ход выполнения и значения переменных, переходите в «пошаговый режим» выполнения в наиболее «подозрительных» участках кода. Так вы быстрее сможете локализовать проблему.
  • Помните: компилятор может неправильно указывать строку с ошибкой. Если вам повезло, и компилятор помог вам выявить баг, не спешите радоваться. При «завершении с ошибкой» вы видите номер строки, в которой выполнение программы стало невозможным. Если проблема в простейшей опечатке (синтаксис), то строка с багом вам известна. В случае логических ошибок вероятнее всего, проблема появилась на более ранних этапах работы программы. А в указанной строке была попытка использовать ошибочные данные, что и привело к аварийному завершению.
  • Старый добрый листинг программы тоже может помочь. Если вы запутались и не знаете, что делать, распечатайте код и попробуйте его «выполнить» как будто вы – и есть компьютер. Шаг за шагом двигайте по командам. Переходите от блока к блоку так, как это делает программа. На каждом этапе вычисляйте и фиксируйте значения переменных (калькулятором пользоваться можно). И сверяйте результаты с ожидаемыми. Все в порядке? Двигайтесь дальше. Что-то не так? Ура! Вы локализовали баг. Можно возвращаться за компьютер и разбираться подробнее в этом фрагменте кода в отладчике.

И самое главное: не бойтесь что-то менять, в том числе, на глобальном уровне. Лучше переписать «сырой» код на раннем этапе разработки практически полностью, чем из-за серьезной логической ошибки терять в скорости и качестве работы программы, пытаясь использовать кучу «заплаток». От ошибок не застрахован никто. Потраченного времени жаль, но это – ваш личный практический опыт. А программа должна работать быстро, надежно и, самое главное, правильно.

Возможно, вам также будет интересно:

  • Логическая функция в экселе если ошибка
  • Логическая связь между тезисом и аргументами это ошибка
  • Логическая ошибка это что примеры
  • Логическая ошибка это с примером
  • Логическая ошибка это ошибка в информации

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии