Цель занятия:
Практическое изучение простейших приемов проектирования С - программ на примере поиска числовых палиндромов квадратов натуральных чисел.

Формулировка Задания:
Составить программу поиска и печати всех целых чисел от 1 до 100, символический формат представления квадратов которых в десятичной системе счисления образует числовой палиндром. Программа должна быть составлена в системе программирования С.

Понятие палиндрома.

Палиндром - это последовательность символов, которая одинаково читается слева направо и справа налево. Например, “радар” - текстовый палиндром. Его образует симметричная последовательность букв. Числовой палиндром-палиндром, составленный из цифр. Например, ’’1’’,’’232’’, ’’121’’ - числовые палиндромы.

Описание алгоритма.

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

1. Задать предельное значение счетчика чисел (100).

2. Обнулить счетчик чисел.

3. Выполнять цикл
{

Увеличить значение счетчика на 1.

Возвести значение счетчика в квадрат.

Представить значение квадрата счетчика в форме строки цифр и получить копию этой строки.

Реверсировать копию строки цифр, представляющей квадрат счетчика чисел.

Если прямое и инверсное представления строки квадрата счетчика эквивалентны, то

печать палиндрома и значения счетчика.

}
пока счетчик меньше предельного значения.

Структуры данных.

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

count - счетчик целых чисел;

limit - предельное значение счетчика;

square - квадрат счетчика целых чисел;

direct - десятичное представление квадрата счетчика;

inverse - инверсное десятичное представление квадрата счетчика.

По логике работы алгоритма переменные count, limit и square должны принимать неотрицательные целые значения. Поэтому они должны иметь тип unsigned int. Поскольку предельное значение счетчика постоянно, объявление переменной limit можно дополнить модификатором const.

Для хранения прямого и инверсного представлений квадрата счетчика можно зарезервировать 2 массива символов размером по 6 байт. Такая размерность массивов обеспечивает хранение максимального значения символического представления квадрата счетчика (10000), длиной 5 байт плюс символ ’\0’, который обозначает конец информационной части символьной строки. Размерность массивов может быть задана директивой препроцессора define.

Программная реализация.

Исходный текст программной реализации рассмотренных алгоритма и структуры данных в системе программирования ‘’C’’ можно сосредоточить в одном текстовом файле, который имеет произвольное базовое имя, но обязательное расширение ‘’.с’’. Этот файл исходного текста программы должен содержать основную функцию с предопределенным именем main( ), которая должна присутствовать в любой C-программе, а также директивы препроцессора define и include. В данном случае рекомендуется использовать директиву define для макроопределения размерности символьных строк, а директива include для включения заголовочных файлов (n- файлов) <stdio.h> и <string.h>, содержащих прототипы библиотечных функций системы программирования ‘’C’’, которые необходимы для реализации алгоритма. Тело основной функции main ( ) можно условно разделить на 2 части: объявление переменных и основной цикл программы. Целочисленные переменные программы объявляются как автоматические. Память под них будет распределена в стеке выполняемого модуля программы. Массивы полезно объявить как статические, используя служебное слово static. Память под них будет распределена в области инициализированных данных выполняемого модуля программы. Элементы статических символьных массивов инициализируются символами ‘’\0’’.

Основной цикл программы удобно построить на базе конструкции do-while. Для выполнения процедурных шагов цикла рекомендуется использовать следующие стандартные библиотечные функции:

sprintf - преобразование целочисленного значения квадрата счетчика в символьный формат (это преобразование можно выполнить также с помощью функции itoa);

strcpy - копирование строкового представления значения квадрата счетчика;

strcpy -реверсирование строкового представления значения квадрата счетчика;

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

printf - печать результатов на стандартный вывод.

Выполнение основной функции main ( ) должно завершаться оператором return.

Контрольные вопросы.

  1. Модифицировать исходный текст программы, составив собственные функции преобразования целого числа в символьный формат и реверсирования строки символов вместо стандартных библиотечных функций.
  2. Модифицировать исходный текст программы, заменив десятичное представление квадрата счетчика на 16- тиричное или 8-миричное.
  3. Модифицировать исходный текст программы таким образом, чтобы предельное значение счетчика можно было передавать через аргументы командной строки вызова программы.
  4. Какое влияние на быстродействие программы оказывает порядок определения автоматических переменных функции?
  5. Какие директивы поддерживает процессор , компилятор языка программирования ’’С’’ ?
  6. Какое максимальное целочисленное значение может быть присвоено переменным типа int и unsigned int?

Рекомендуемая литература.

1. С. Алагиг, М. Арбиб

Проектирование корректных структурированных программ. М., Радио и связь, 1984г.

2. М. И. Болеки

Язык программирования Си. Справочник. М., Радио и связь, 1988г.

3. М. Уэйт, С. Прата, Д Мартин

Язык Си. Руководство для начинающих. М., Мир, 1988г.