- •ГЛАВА 7. ОСНОВЫ АЛГОРИТМИЗАЦИИ
- •1. ПОНЯТИЕ ОБ АЛГОРИТМЕ
- •2. ОСНОВНЫЕ СТРУКТУРЫ
- •2.1. Структура «следование»
- •2.2. Структура «развилка»
- •2.3. Структура «цикл»
- •3. ОСНОВНЫЕ ТИПЫ АЛГОРИТМОВ
- •3.1. Линейный алгоритм
- •3.2. Разветвленный алгоритм
- •3.3. Циклический алгоритм
- •Практические задания
- •1. Алгоритмы линейной структуры
- •2. Алгоритмы разветвляющейся структуры
- •3. Алгоритмы циклической структуры (цикл «ПОКА»)
- •4. Алгоритмы циклической структуры (цикл «ДО»)
- •ГЛАВА 8. ОСНОВЫ ПРОГРАММИРОВАНИЯ В СРЕДЕ VISUAL С++ 2005
- •ВВЕДЕНИЕ
- •1. РАЗРАБОТКА ПРОГРАММЫ
- •2. ПЕРЕМЕННЫЕ
- •3. ЛИНЕЙНАЯ ПРОГРАММА
- •3.1. Оформление линейной программы
- •3.2. Программирование в стандартизованной среде CLR
- •Практические задания
- •Русская система мер
- •4. ПРОГРАММА С ВЕТВЛЕНИЕМ
- •Практические задания
- •5. ЦИКЛ С ПАРАМЕТРОМ
- •6. ЦИКЛ «ПОКА»
- •Практические задания
- •7. ОДНОМЕРНЫЕ МАССИВЫ
- •7.1. Понятие об одномерном массиве
- •7.2. Сортировка в одномерном массиве
- •Практические задания
- •8. ДВУМЕРНЫЕ МАССИВЫ
- •8.1. Понятие о двумерном массиве
- •8.2. Датчик случайных чисел
- •Практические задания
- •9. ФУНКЦИИ
- •9.1. Понятие о пользовательских функциях
- •Рис. 8.20. Пятиугольник со сторонами a, b, c, d, f и диагоналями h,g.
- •9.2. Рекурсия
- •9.3. Вызов функции из функции
- •9.4. Функция типа void и глобальные переменные
- •9.5. Передача в функцию имени функции
- •Практические задания
- •10. СОБСТВЕННАЯ БИБЛИОТЕКА ПРОГРАММИСТА
- •10.1. Перегрузка функций
- •Рис. 8.25. Результат работы программы примера
- •11. ПЕРЕЧИСЛИМЫЙ ТИП
- •11.1. Понятие о перечислимом типе
- •11.2. Множественный выбор
- •12. УКАЗАТЕЛИ
- •12.1. Понятие об указателях
- •12.2. Указатели и функции
- •12.3. Указатели и динамические массивы
- •12.4. Указатели и перегрузка операций
- •13. ОБРАБОТКА СИМВОЛЬНЫХ СТРОК
- •13.1. Символьные переменные
- •13.2. Символьные строки (как массивы символов)
- •13.3. Обработка массивов строк
- •Практические задания
- •14. СТРУКТУРЫ
- •Практические задания
- •15. КЛАССЫ
- •15.1. Понятие класса
- •15.2. Открытые и закрытые члены класса
- •15.3. Конструкторы и деструкторы
- •Практические задания
- •Раздел А
- •Раздел Б
- •16. ФАЙЛЫ
- •16.1. Работа с текстовыми файлами
- •16.2. Работа со структурами в файлах
- •16.3. Работа с классами в файлах
- •Практические задания
- •Раздел А
- •Раздел Б
- •ПРИЛОЖЕНИЯ
- •Приложение 1. Список библиотечных функций
- •Математические функции
- •Строковые функции (для работы с символьными массивами)
- •Приложение 2. План лабораторных работ
- •ГЛАВА 9. ПРИЛОЖЕНИЯ WINDOWS FORMS
- •ВВЕДЕНИЕ
- •1. РАЗРАБОТКА ПРИЛОЖЕНИЯ
- •3. ДИНАМИЧЕСКИЕ ССЫЛКИ НА ОБЪЕКТЫ
- •3.1 Понятие о динамических ссылках.
- •3.2. Программа «Калькулятор»
- •4. ИСПОЛЬЗОВАНИЕ ТАЙМЕРА. КОМПОНЕНТ CHECKBOX
- •4.1 Таймер
- •4.2. Компонент CheckBox
- •5. СПИСКИ ВЫБОРА И ПОЛОСЫ ПРОКРУТКИ. ГРАФИЧЕСКИЕ КОМПОНЕНТЫ В C++Builder
- •5.1. Список выбора ListBox
- •5.2. Полосы прокрутки
- •5.3. Графика
- •6. РАБОТА С ТЕКСТОВЫМИ ФАЙЛАМИ.
- •6.1. Чтение и запись текстового файла
- •ИНДИВИДУАЛЬНЫЕ ЗАДАНИЯ
- •Раздел 1. Кнопки, метки и окна редактирования
- •Раздел 2. Радиокнопки
- •Раздел 3. Полосы прокрутки
- •Раздел 4. Обработка текстовых файлов
- •ЛИТЕРАТУРА
- •ТЕСТЫ
- •Тесты по основам алгоритмизации
- •Тесты по программированию на С++
- •Учебное издание
60
Еще раз обращаем внимание, что хотя мы и используем массивы с размерностью на 3 элемента (берем три точки), но описываем массивы на 4 (чтобы не путаться с нулевыми по номеру элементами). Обратите также внимание, что поскольку координаты заданы в виде целых чисел, а на их основе получаем расстояние, которое является вещественным числом, то для преобразования типа от целого к вещественному (точнее – типу двойной точности) используем (double). Здесь для вычисления квадратного корня sqrt() нужно подключить cmath (в отличие от традиционногоmath.h), поскольку при вычислении корня, вообще говоря, возможны комплексные числа.
8.2.Датчик случайных чисел
Врассмотренном ниже примере будем использовать датчик случайных чисел. На языке ++С он реализуется функцией
rand()%RAND_MAX – дает случайное целое число из интервала от 0 до положительного целого RAND_MAX-1 (в качестве RAND_MAX можно указать сразу конкретное число). Кроме того, для запуска этого датчика случайных чисел(чтобы получать новый набор случайных чисел при каждом новом запуске программы), используют функцию srand(time(0)), т.е. для старта генератора случайных чисел будет использоваться системное время компьютера. Причем это время следует преобразовать в беззнаковое целое(unsigned
int). Кроме того, требуется подключить заголовочный файл <stdlib.h>, содержащий эти функции. Для получения системного времени нужно подключить заголовочный файл <time.h>
В примере 8.2 будем впервые использовать так называемые манипуляторы. Они позволяют, например, выводить числа по определенному формату – скажем, отводить на вывод числа три позиции (независимо от того, что число может быть и двузначным). Для использования манипуляторов нужно подключить заголовочный файл
<iomanip>.
Пример 8.2. В двумерном массиве, заданном с помощью датчика случайных чисел, подсчитать количество строк, имеющих элемент, равный первому элементу строки, и указать номера этих строк.
61
#include <iostream>
#include <stdlib.h>
#include <iomanip>
#include <windows.h> #include <time.h> using namespace std; int main()
{ const int n=5; bool nal;
int i, j,k,b, a[n+1][n+1], num[n+1]; char str[256], str1[256];
// запуск генератора случайных чисел srand((unsigned int)time(0));
//формируем массив из случайных чисел (от 0 до 4) for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{a[i][j]=rand()%5;} // вывод массива for (i=1; i<=n; i++)
{cout<<"\n";
for (j=1; j<=n; j++)
{cout<<setw(3)<< a[i][j];} }
//подсчет числа строк (по условию) k=0;
for (i=1; i<=n; i++)
{b=a[i][1]; nal=false; for (j=2; j<=n; j++)
{if (a[i][j] = = b) nal=true; if nal break;} if (nal) {k=k+1; num[k]=i;};
}
AnsiToOem(" \n количество строк=",str); AnsiToOem(" их номера: ", str1); cout<<str<<k<<str1;
for (i=1; i<=k; i++) cout<<setw(3)<<num[i]; cout<<"\n";
return(0);
}
Результат работы этой программы представлен на рис. 8.19. Обратите внимание, что здесь использована целочисленная
константа const int n=5. Благодаря этому, мы можем легко изменить размерность массива и количество оборотов цикла(при очередном запуске программы изменим значение этой константы в тексте программы). В программе использована также логическая переменная nal, которая примет значение «истина» (true), как толь-
62
ко найдем элемент, равный первому в строке. Это позволит сократить число оборотов цикла(не будет продолжаться поиск до конца строки).
Рис. 8.19. Результат работы программы примера 8.2
Практические задания
8.1. Дана матрица 5´5. Для данного натурального М найти сумму тех элементов матрицы, сумма индексов которых равна М.
8.2. Дана матрица 5´5. Построить одномерный массив В(5), состоящий из сумм элементов строк.
8.3. Дана матрица 5´5. Построить одномерный массив В(5), состоящий из произведений элементов столбцов.
8.4. Дана матрица 5´5. Построить одномерный массив В(5), состоящий из наименьших значений элементов строк.
8.5. Дана матрица 5´5. Построить одномерный массив В(5), состоящий из средних арифметических элементов строк.
8.6. Дана матрица 5´5. Вывести ее в транспонированном виде (поменять местами строки со столбцами).
8.7. Дана матрица 5´5. Вывести ее в верхнем треугольном виде (т.е. напечатать только элементы верхнего треугольника и именно в виде треугольника).
8.8. Дана матрица 5´5. Вывести ее в нижнем треугольном виде. 8.9. Результаты соревнований по прыжкам в длину представле-
ны в виде матрицы5´3 (5 спортсменов по 3 попытки у каждого). Указать, какой спортсмен и в какой попытке показал наилучший результат.
8.10. Результаты соревнований по пятиборью представлены в виде матрицы 5´5 (5 спортсменов и 5 видов соревнований), в которых указаны места, занятые каждым спортсменом в данном виде. Найти лучшего спортсмена (наименьшая сумма мест).
63
В последующих трех задачах использовать следующее:
Таблица футбольного чемпионата задана квадратной матрицей порядка n, в которой все элементы, принадлежащие главной диагонали, равны нулю, а каждый элемент, не принадлежащий главной диагонали, равен 3, 1 или 0 (число очков, набранных в игре: 3 – выигрыш, 1 – ничья, 0 – проигрыш).
8.11. Найти число команд, имеющих больше побед, чем поражений.
8.12. Определить номера команд, прошедших чемпионат без поражений.
8.13. Выяснить, имеется хотя бы одна команда, выигравшая более половины игр.
8.14. Дана действительная матрица размера n x m, в которой не все элементы равны нулю. Получить новую матрицу путём деления всех элементов данной матрицы на её наибольший по модулю элемент.
8.15. Дана действительная квадратная матрица порядка12. Заменить нулями все её элементы, расположенные на на главной диагонали и выше неё.
8.16. Дана действительная матрица размераn´m. Найти сумму наибольших значений элементов её строк.
8.17. В данной действительной квадратной матрице порядкаn найти сумму элементов строки, в которой расположен элемент с наименьшим значением. Предполагается, что такой элемент единственный.
8.18. В данной действительной матрице размера6´9 поменять местами строку, содержащую элемент с наибольшим значением, со строкой, содержащей элемент с наименьшим значением. Предполагается, что эти элементы единственны.
8.19. Дана действительная матрица размераn´m, все элементы которой различны. В каждой строке выбирается элемент с -наи меньшим значением, затем среди этих чисел выбирается наибольшее. Указать индексы элемента с найденным значением.
8.20. Дана целочисленная квадратная матрица порядка 8. Найти наименьшее из значений элементов столбца, который обладает наибольшей суммой модулей элементов. Если таких столбцов несколько, то взять первый из них.
8.21. Составить программу формирования двумерного массива n´n по следующему правилу: элементы главной диагонали приравнять 1, ниже главной диагонали – 0, а выше – сумме индексов.