|
Программирование >> Структурное программирование
Рис. 5.38. Пример распечатки содержимого памяти Ваша моделирующая программа должна проверять различные типы ошибок. Па этапе загрузки, например, каждое число, которое пользователь вводит в массив memory вашего Простотрона, должно находиться в диапазоне от -9999 до -1-9999. Ваша программа должна использовать цикл while для проверки, находится ли каждое вводимое число в этом диапазоне, и если нет, предлагать пользователю повторить ввод, до тех пор, пока не будет введено правильное число. На этапе выполнения ваша программа должна проверять различные серьезные ошибки, такие как попытки деления на О, попытки выполнения неправильных кодов операции, переполнение аккумулятора (т.е. когда результат арифметических операций больше чем -f-9999 или меньше чем -9999) и тому подобное. Такие серьезные ошибки называются неисправимыми ошибками. Если обнаружена неисправимая ошибка, ваша программа должна печатать сообщение об ошибке, например, такое: *** Попытка деления на О *** *** Выполнение Простотрона завершено ненормально *** и должна напечатать полный дамп в формате, который мы уже ранее обсуждали. Это поможет пользователю локализовать место ошибки в программе. Команда условной передачи управления передать управление, если аккумулятор равен О моделируется следующим образом: if (accumulator == 0) instructionCounter = operand; Теперь вы должны реализовать вашу программу моделирования Простотрона и запустить на выполнение все программы на ЯМП, написанные вами в упражнении 5.18. Вы можете украсить ЯМП дополнительными возможностями и реализовать их в вашей программе моделирования. РЕГИСТРЫ accumulator +0000 instructionCounter 00 instructionRegister +0000 operationCode 00 operand 00 ПАМЯТЬ Дополнительные упражнения на указатели 5.20. Модифицируйте программу тасования и раздачи карт на рис. 5.24 так, чтобы операции тасования и раздачи выполнялись одной и той же функцией (shuffleAndDeal). Функция должна содержать вложенную структуру цикла, которая аналогична функции shuffle на рис. 5.24. 5.21. Что делает эта программа? iinclude <iostream.h> void mysteryl(char *, const char *); main() { char stringl[80], string2[80]; cout << Введите две строки: ; cin >> stringl >> string2; mysteryl(stringl, string2); cout stringl endl; return 0; void mysteryl(char *sl, const char *s2) { while (*sl != \0) ++sl; for ( ; *sl = *s2; sl++, s2++) ; пустой оператор 5.22. Что делает эта программа? iinclude <iostream.h> int mystery2(const char *); main() char string[80]; cout Введите строку: ; cin string; cout mystery2(string) endl; return 0; int mystery2(const char *s) { for (int X = 0; *s != \0; s++) ++x; return x; 5.23. Нгшдите ошибку в каждом из следующих фрагментов программ. Если ошибка может быть исправлена, объясните как. a) int *nuinber; cout number endl; b) float *realPtr; long *integerPtr; integerPtr = realPtr; c) int *x, y; X = y; d) char s[ ] = это массив символов ; for ( ; *s != \0; s++) cout *s << ; e) short *numPtr, result; void *genericPtr = numPtr; result = *genericPtr + 7; f) float X = 19.34; float xPtr = &x; cout xPtr endl; g) char *s; cout s endl; 5.24. (Быстрая сортировка) В примерах и упражнениях главы 4 мы обсуждали технику различных видов сортировок - пузырьковой, блочной, выборочной. Теперь рассмотрим технику рекурсивной сортировки, называемой быстрая сортировка . Основной алгоритм для одномерного массива значений выглядит следующим образом: 1) Шаг декомпозиции: возьмите первый элемент несортированного массива и определите его окончательную позшщю в сортированном массиве. Эта позищш соответствует тому, что все значения слева от элемента в массиве меньше, чем элемент, а все значения справа от элемента в массиве больше, чем элемент. Теперь мы имеем один элемент в соответствующей ему позиции и два несортированных подмассива. 2) Шаг рекурсии : выполняем шаг 1 для каждого из несортированных подмассивов. Каждый раз после применения шага 1 к подмассиву еще один элемент помещается в свою окончательную позицию в сортированном массиве и появляются два несортированных массива. Когда подмассив содержит только один элемент, он отсортирован, поэтому этот элемент находится в своей окончательной позиции. Основной алгоритм представляется достаточно простым, но как определить окончательную позицию первого элемента каждого подмассива? В качестве примера рассмотрим следующее множество значений (выделенный жирным шрифтом элемент - это разделяющий элемент - его мы помещаем в окончательную позицию в сортированном массиве): 37 2 6 4 89 8 10 12 68 45 1) Начиная с самого правого элемента массива, сравниваем каждый элемент с 37 до тех пор, пока не будет найден элемент, меньший, чем 37; тогда переставляем этот элемент и 37. Первый элемент, меньший, чем 37, - число 12, так что переставляем местами 12 и 37. Получаем новый массив: i2 2 6 4 89 8 10 37 68 45
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |