практику

advertisement
Лекция 5.
5.1. Одномерные массивы
5.1.1. Пример решения простой задачи
Задача:
Заполнить массив a[N] случайным образом вещественными числами, заданными
на отрезке [A, B].
Решение:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
// определение константы числа элементов массива
#define N 10
// определение левой границы изменения значений элементов
#define A -1.0f
// определение правой границы изменения значений элементов
#define B 1.0f
// определение функции заполнения массива вещественными
// значениями в интервале (lb,rb)
void fill(float a[], int size, float lb, float rb);
// определение функции печати элементов массива
void print(float a[], int size);
int main()
{
// создание массива вещественных чисел из N элементов
float a[N];
// вызов функции заполнения массива
fill(a, N, A, B);
// вызов функции печати элементов массива
print(a, N);
// выход из основной функции
return 0;
}
// реализация функции заполнения массива вещественными
// значениями в интервале (lb,rb)
void fill(float a[], int size, float lb, float rb)
{
// определение переменной счетчика цикла
int i;
// инициализация генератора случайных чисел
srand((unsigned int) time(0));
// цикл по всем элементам массива
// индексация от 0 дл size-1, с шагом 1
for (i = 0; i < size; i++)
{
// rand() генерирует целое число в отрезке [0, RAND_MAX]
// ((float)rand()) / RAND_MAX переводит в отрезок [0, 1]
// линейное преобразование в [lb, rb]
a[i] = (rb - lb) * ((float)rand()) / RAND_MAX + lb;
}
}
// реализация функции печати элементов массива
void print(float a[], int size)
{
// определение переменной счетчика цикла
int i = 0;
// цикл по всем элементам массива
// индексация от 0 до size-1, с шагом 1
for (; i < size; i++)
{
// печать i-ого элемента массива, 3 знака после запятой
printf("%.3f\n", a[i]);
}
}
Комментарий
В приведенном примере:
1. Подключаются библиотеки стандартного ввода/вывода stdio.h, функций
работы с датой и временем time.h, функций выделения памяти, контроля
процесса выполнения программы, преобразования типов stdlib.h.
2. Объявляются необходимые константы для задания количества элементов
массива и интервала изменения значений элементов.
3. Объявляются функции заполнения массива fill и печати его элементов print.
4. Описывается функция main, в которой:

Создается массив.

Выполняется заполнения массива с помощью объявленной функции
fill.

Выполняется печать
функции print.
массива
с
использованием
объявленной
5. Реализуются функции заполнения массива fill и печати его элементов print.
5.1.2. Пример решения задачи средней сложности
Задача:
Пусть задан массив целых чисел x, элементы которого удовлетворяют условию
x[0]≤x[1]≤⋯x[n-1], n – число элементов массива x. Определить количество
различных элементов в массиве.
Решение:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
// определение константы числа элементов массива
#define N 10
// определение левой границы изменения значений элементов
#define A -10
// определение правой границы изменения значений элементов
#define B 10
// определение функции заполнения массива целыми
// значениями в интервале (lb,rb)
void fill(int a[], int size, int lb, int rb);
// определение функции упорядочивания элементов по возрастанию
void sort(int a[], int size);
// определение функции печати элементов массива
void print(int a[], int size);
// определение функции числа различных элементов в упорядоченном
массиве
int diff(int a[], int size);
int main()
{
int a[N], kDiffNumbers;
// вызов функции заполнения массива
fill(a, N, A, B);
// вызов функции сортировки элементов массива
sort(a, N);
// вызов функции печати элементов массива
print(a, N);
// вызов функции определения числа различных элементов
kDiffNumbers = diff(a, N);
// вывод числа различных элементов массива
printf("kDiffNumbers = %d\n", kDiffNumbers);
// выход из основной функции
return 0;
}
// реализация функции заполнения массива целыми
// значениями в интервале (lb,rb)
void fill(int a[], int size, int lb, int rb)
{
// определение переменной счетчика цикла
int i;
// инициализация генератора случайных чисел
srand((unsigned int) time(0));
// цикл по всем элементам массива
// индексация от 0 дл size-1, с шагом 1
for (i = 0; i < size; i++)
{
// rand() генерирует целое число в отрезке [0, RAND_MAX]
// ((float)rand()) / RAND_MAX переводит в отрезок [0, 1]
// линейное преобразование в [lb, rb]
a[i] = (rb - lb) * ((float)rand()) / RAND_MAX + lb;
}
}
// реализация функции упорядочивания элементов по возрастанию
void sort(int a[], int size)
{
int i, j, buf;
// цикл по всем элементам массива
// индексация от 0 дл size-1, с шагом 1
for (i = 0; i < size; i++)
{
// цикл по всем элементам массива, следующим за i-ым
// индексация от i+1 дл size-1, с шагом 1
for (j = i + 1; j < size; j++)
{
// если i-ый элемент больше, чем j-ый
if (a[i] > a[j])
{
// то выполняется обмен i-ого и j-ого элемента
buf = a[i];
a[i] = a[j];
a[j] = buf;
}
}
}
}
// реализация функции печати элементов массива
void print(int a[], int size)
{
// определение переменной счетчика цикла
int i = 0;
// цикл по всем элементам массива
// индексация от 0 до size-1, с шагом 1
for (; i < size; i++)
{
// печать i-ого элемента массива
printf("%d\n", a[i]);
}
}
// реализация функции числа различных элементов в упорядоченном
массиве
int diff(int a[], int size)
{
int i = 0, kDiffNumbers = 1;
// цикл по всем элементам массива
// индексация от 0 до size-2, с шагом 1
for (;
{
//
//
if
{
i < size - 1; i++)
сравнение текущего i-ого элемента и следующего (i+1)
если они не совпали
(a[i] != a[i + 1])
// то увеличивается количество различных элементов
kDiffNumbers++;
}
}
// возврат числа различных элементов
return kDiffNumbers;
}
Комментарий
В приведенном примере:
1. Подключаются библиотеки стандартного ввода/вывода stdio.h, функций
работы с датой и временем time.h, функций выделения памяти, контроля
процесса выполнения программы, преобразования типов stdlib.h.
2. Объявляются необходимые константы для задания количества элементов
массива и интервала изменения значений элементов.
3. Объявляются функции заполнения массива fill, печати его элементов print, а
также функции упорядочивания массива sort и вычисления количества
различных элементов diff.
4. Описывается функция main, в которой:

Создается массив.

Выполняется заполнения массива с помощью объявленной функции
fill.

Массив упорядочивается функцией sort.

Выполняется печать
функции print.

Определяется количество различных элементов с помощью функции
diff.

Осуществляется
элементов.
массива
печать
с
использованием
полученного
количества
объявленной
различных
5. Реализуются функции заполнения массива fill, печати его элементов print, а
также функции упорядочивания массива sort и вычисления количества
различных элементов diff.
5.1.3. Пример решения задачи повышенной сложности
Задача:
Задан массив Y[n], элементами которого являются целые числа. Преобразовать
массив так, чтобы все его нечетные элементы оказались в конце. Порядок
элементов в четной и нечетной частях может измениться.
Решение:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
// определение константы числа элементов массива
#define N 10
// определение левой границы изменения значений элементов
#define A -10
// определение правой границы изменения значений элементов
#define B 10
// определение функции заполнения массива целыми
// значения в интервале (lb,rb)
void fill(int *a, int size, int lb, int rb);
// определение функции печати элементов массива
void print(int *a, int size);
// определение функции преобразования массива таким образом,
// чтобы все его нечетные элементы оказались в конце
void convert(int a[], int size);
int main()
{
// создание массива целых чисел из N элементов
int a[N];
// вызов функции заполнения массива
fill(a, N, A, B);
// вызов функции печати элементов массива
print(a, N);
// перенос курсора на следующую строку
printf("\n");
// вызов функции преобразования массива
convert(a, N);
// вызов функции печати элементов массива
print(a, N);
// выход из основной функции
return 0;
}
// реализация функции заполнения массива целыми
// значения в интервале (lb,rb)
void fill(int a[], int size, int lb, int rb)
{
// определение переменной счетчика цикла
int i;
// инициализация генератора случайных чисел
srand((unsigned int) time(0));
// цикл по всем элементам массива
// индексация от 0 дл size-1, с шагом 1
for (i = 0; i < size; i++)
{
// rand() генерирует целое число в отрезке [0, RAND_MAX]
// ((float)rand()) / RAND_MAX переводит в отрезок [0, 1]
// линейное преобразование в [lb, rb]
a[i] = (rb - lb) * ((float)rand()) / RAND_MAX + lb;
}
}
// реализация функции печати элементов массива
void print(int a[], int size)
{
// определение переменной счетчика цикла
int i = 0;
// цикл по всем элементам массива
// индексация от 0 до size-1, с шагом 1
for (; i < size; i++)
{
// печать i-ого элемента массива, 3 знака после запятой
printf("%d\n", a[i]);
}
}
// реализация функции преобразования массива таким образом,
// чтобы все его нечетные элементы оказались в конце
void convert(int a[], int size)
{
int i1 = 0, i2 = size - 1, tmp;
// цикл, пока индекс i1 лежит левее i2
while (i1 < i2)
{
// цикл, пока элемент с номером i1 четный,
// сдвиг i1 вправо
while (a[i1] % 2 == 0) i1++;
// цикл, пока элемент с номером i2 нечетный,
// сдвиг i2 влево
while (a[i2] % 2 != 0) i2--;
// если нечетный элемент с номером i1 левее элемента
// с номером i2
if (i1 < i2)
{
// то выполняется обмен значений элементов
// с номерами i1 и i2
tmp = a[i1];
a[i1] = a[i2];
a[i2] = tmp;
}
// сдвиг i1 вправо на 1
i1++;
// сдвиг i2 влево на 1
i2--;
}
}
Комментарий
В приведенном примере:
1. Подключаются библиотеки стандартного ввода/вывода stdio.h, функций
работы с датой и временем time.h, функций выделения памяти, контроля
процесса выполнения программы, преобразования типов stdlib.h.
2. Объявляются необходимые константы для задания количества элементов
массива и интервала изменения значений элементов.
3. Объявляются функции заполнения массива fill и печати его элементов print,
а также функция преобразования массива согласно условиям поставленной
задачи convert.
4. Описывается функция main, в которой:

Создается массив.

Выполняется заполнения массива с помощью объявленной функции
fill.

Выполняется печать
функции print.

Осуществляется преобразование массива с помощью функции
convert.

Выполняется печать
функции print.
массива
массива
с
с
использованием
использованием
объявленной
объявленной
5. Реализуются функции заполнения массива fill и печати его элементов print,
а также функция преобразования массива согласно условиям поставленной
задачи convert.
5.1.4. Простые задачи
Написать функцию (и тестирующую функцию main), которая:
1. Задан массив из N вещественных элементов. Вычислить сумму элементов
массива, имеющих четные индексы.
2. Задан массив из N вещественных элементов. Вычислить сумму элементов
массива, индексы элементов которых образуют последовательность чисел
Фибоначчи.
3. Задан массив из N натуральных элементов. Определить количество четных
чисел в массиве.
4. Задан массив из N вещественных элементов. Найти максимальный элемент
среди элементов с четными индексами, и поменять его местами с первым
элементом массива.
5. Задан массив из N вещественных элементов и вещественное число A.
Определить количество элементов массива, стоящих в нечетных позициях,
значение которых превышает A. Вывести указанные элементы.
6. Задан массив из N вещественных элементов. Определить количество
элементов массива, которые больше своего левого соседа. Вывести
указанные элементы.
7. Задан массив из N вещественных элементов. Проверить, является ли
данный массив упорядоченным по возрастанию.
8. Задан массив Q[n], элементами которого являются вещественные числа.
Проверить, является ли массив упорядоченным по убыванию.
9. Заданы два вещественных массива равной длины N. Поменять местами
элементы первого массива с четными индексами и элементы второго
массива с нечетными индексами (0-ой элемент первого массива с 1-ым
элементом второго массива, 2-ой первого с 3-им второго и т.д.).
10. Задан массив из N вещественных элементов. Заменить каждый элемент,
кроме первого, суммой предыдущих элементов.
11. Задан массив из N вещественных элементов. Определить
чередований знака, т.е. число переходов с «-» на «+» и с «+» на «-».
число
12. Заданы два целочисленных массива длины N и M соответственно. Каждый
массив не содержит повторений. Определить, является ли один набор
подмножеством другого.
13. Многочлен степени N задан набором своих коэффициентов. Найти массив
коэффициентов производной этого многочлена.
14. Задан массив R[n], элементами которого являются вещественные числа.
Напечатать те элементы массива, индексы которых делятся на 5 без
остатка.
15. Задан массив из N вещественных элементов. Найти
арифметическое значение элементов заданного массива.
среднее
16. Задан массив из N вещественных элементов. Проверить, образуют ли
элементы заданного массива арифметическую прогрессию. Если это так, то
программа должна вывести разность прогрессии.
17. Задан массив из N вещественных элементов. Определить максимальный
нечетный элемент массива.
18. Задан массив из N натуральных элементов. Проверить, чередуются ли в
данном массиве четные и нечетные числа. Если чередуются, то вывести 0,
если нет, то вывести номер первого элемента, нарушающего
закономерность.
19. Задан массив из N вещественных элементов. В заданном массиве
определить максимальный элемент среди элементов, содержащихся в
интервале (a, b). Числа a и b даны (0 < a < b).
20. Задан массив из N целочисленных элементов. В исходном массиве:

каждый отрицательный элемент заменить его абсолютной величиной;

все элементы с четными номерами увеличивает в 5 раз;

элементы, кратные 7, уменьшает в 7 раз.
вид обработки массива задается параметром функции.
21. Задан массив из N вещественных элементов. Определить элемент
массива, который наиболее близок к заданному числу A.
22. Задан массив из N вещественных элементов. Определить количество
элементов массива, равных минимальному значению.
23. Задан массив из N вещественных элементов. Переставить в обратном
порядке элементы массива, расположенные между его минимальным и
максимальным элементами.
24. Задан массив из N вещественных элементов. Удалить из массива
элементы, величина которых находится в интервале (a, b) (числа a и b
(0 < a < b) — даны), оставляя неизменным порядок следования остальных
элементов.
25. Задан массив P[m], элементами которого являются неотрицательные целые
числа. Вычислить сумму S тех элементов массива, значения которых
совпадают с их индексами, т.е. P[i] = i.
26. Заданы массив K[n], элементами которого являются целые числа, и целое
число L. Вычислить сумму S тех элементов массива, которые по модулю не
превосходят абсолютной величины L.
5.1.5. Задачи средней сложности
Написать функцию (и тестирующую функцию main), которая:
1. Задан массив из N вещественных элементов. Инвертировать порядок
элементов массива без использования дополнительного массива.
2. Задан массив из N вещественных элементов. Определить количество
различных элементов данного массива, не упорядочивая исходный массив.
3. Задан массив из N вещественных элементов. Сдвинуть массив циклически
на k-элементов.
4. Заданы два целочисленных массива длины N и M соответственно. Каждый
массив не содержит повторений. Построить массив, являющийся
объединением заданных наборов.
5. Заданы два целочисленных массива длины N и M соответственно. Каждый
массив не содержит повторений. Построить массив, являющийся
пересечением заданных наборов.
6. Заданы два целочисленных массива длины N и M соответственно. Каждый
массив не содержит повторений. Построить массив, являющийся
симметрической разностью заданных наборов.
7. Заданы два целочисленных массива длины N и M соответственно. Каждый
массив не содержит повторений. Построить массив, являющийся разностью
заданных наборов.
8. Многочлен степени N задан набором своих коэффициентов. Вычислить
значение многочлена в заданной точке x с использованием схемы Горнера.
9. Заданы два многочлена степени N и M соответственно наборами своих
коэффициентов. Найти частное и остаток от деления в виде массивов
коэффициентов.
10. Заданы два вещественных массива длины N и M соответственно.
Считается, что массивы упорядочены по возрастанию. Построить массив,
который является объединением двух заданных так, чтобы сохранился
возрастающий порядок.
11. Задан массив из N вещественных элементов. Найти минимальный из
локальных минимумов данного массива.
12. Задан массив из N вещественных элементов. Определить количество
элементов, содержащихся между первым и последним минимальным
элементами массива. Если в массиве имеется единственный минимальный
элемент, то программа должна вывести 0.
13. Задан массив из N вещественных элементов и вещественное число A.
Определить два элемента массива, сумма которых наиболее близка к
заданному числу A.
14. Задан массив из N натуральных элементов. Для заданного массива
сформировать массив номеров элементов исходного массива, являющихся
простыми числами.
15. Задан массив из N вещественных элементов. Определить номера двух
ближайших (по значению) друг к другу элементов массива.
16. В заданном массиве С[m] каждый третий элемент заменяет полусуммой
двух предыдущих, а стоящий перед ним – полусуммой соседних с ним
элементов. Дополнительный массив не использовать.
17. Задан массив из N вещественных элементов. Определить максимальное
количество одинаковых элементов в данном массиве.
18. Задан массив из N вещественных элементов. Определить количество
участков, на которых элементы данного массива возрастают.
19. Задан массив из N вещественных элементов. Определить количество
промежутков монотонности, то есть участков, на которых его элементы
возрастают или убывают, в данном массиве.
20. Одномерный массив размерности 2N содержит координаты x, y для N точек
плоскости (x1,y1,x2,y2,…). Определить радиус окружности с центром в
начале координат, которая не содержит ни одной точки, и минимальный
радиус окружности (также с центром в начале координат), которая содержит
все точки.
21. Одномерный массив содержит трехзначные числа – табельные номера
работников фирмы, в которых первая цифра означает номер отдела, а две
другие – номер работника отдела. Написать функции (и тестирующую
функцию main), которые:

выводит номера отделов, с максимальным и минимальным количеством
работников;

для каждого отдела выводит первый свободный (не использующийся в
данном списке) табельный номер. Для этого функция должна
сформировать два массива: номеров отделов и свободных табельных
номеров
22. Имеется два одномерных массива. Первый содержит табельные номера N
работников фирмы, а второй – данные об их заработной плате за текущий
год. Написать функции (и тестирующую функцию main), которые:

подсчитывает количество работников, имеющих зарплату выше средней по
фирме;

определяет на сколько процентов надо повысить зарплату самому
низкооплачиваемому, чтобы он получал зарплату равную средней по
фирме;

определяет
порядковые
номера
и
зарплаты
трех
самых
высокооплачиваемых и трех самых низкооплачиваемых работников фирмы.
23. Все отрицательные значения вещественного массива переместить в его
начало, сохраняя взаимное расположение элементов.
5.1.6. Задачи повышенной сложности
Написать функцию (и тестирующую функцию main), которая:
1. Заданы два целочисленных массива длины N и M соответственно. Каждый
массив может содержать повторяющиеся элементы. Построить массив,
являющийся объединением заданных наборов.
2. Заданы два целочисленных массива длины N и M соответственно. Каждый
массив может содержать повторяющиеся элементы. Построить массив,
являющийся пересечением заданных наборов.
3. Заданы два целочисленных массива длины N и M соответственно. Каждый
массив может содержать повторяющиеся элементы. Построить массив,
являющийся симметрической разностью заданных наборов.
4. Заданы два целочисленных массива длины N и M соответственно. Каждый
массив может содержать повторяющиеся элементы. Построить массив,
являющийся разностью заданных наборов.
5. Задан массив из N целых элементов. Найти самую длинную цепочку
нулевых элементов.
6. Задан массив из N целых элементов, содержащий большое количество
повторяющихся элементов. Найти частоту появления (в процентах) каждого
из M встречающихся элементов (M≪N). M заранее не известно.
7. Задан массив из N целых элементов. Найти в массиве самую длинную
последовательность,
которая
является
арифметической
или
геометрической прогрессией.
8. Задан массив из N натуральных чисел. Найти все такие числа, десятичная
запись которых есть строго возрастающая или строго убывающая
последовательность.
9. Задан массив из N натуральных чисел. Найти все такие числа, которые
совпадают с последними разрядами своих квадратов (например, 252=625,
762=5676).
10. Задан массив из N попарно различных целых чисел. Получить все
перестановки этих чисел.
11. Задана вещественная матрица, содержащая N строк и M столбцов (N≠M), в
виде одномерного массива. Выполнить транспонирование матрицы, не
выделяя дополнительного массива для хранения результата.
12. Задан массив A[i], элементами которого являются целые числа.
Определить (и вывести на экран) три минимальных элемента массива без
учёта повторений. Например: A={6,3,2,5,3,8} -> 2,3,5.
13. Задан массив A[i], элементами которого являются целые числа.
Определить (и вывести на экран) три минимальных элемента массива c
учётом повторений. Например: A={6,3,4,5,3,8} -> 3,3,4.
14. Задан массив M[n], элементами которого являются "длинные" целые числа.
Напечатать все те элементы массива, частота встречаемости которых
минимальна.
15. Задан массив Y[m], элементами которого являются "короткие" целые числа.
Напечатать все те элементы массивы, частота встречаемости которых
максимальна.
16. Заданы натуральное число n и действительные числа x1,x2,...,x3n.
Вычислить сумму S тех чисел из xn+1,xn+2,...,x3n, которые превосходят по
величине все числа x1,x2,...,xn.
17. Задан массив Y[n], состоящий из целых чисел. Найти в массиве элементы,
являющиеся числами Фибоначчи, и отсортировать их в порядке
возрастания. Порядок и расположение остальных элементов не должен
измениться.
18. Заданы целое число t и целочисленный массив K[n]. Найти такое
подмножество элементов массива ki1,ki2,...,kin, что их сумма равна t. Если
такого подмножества не существует, сообщить.
19. Задан массив Y[n], элементами которого являются целые числа.
Преобразовать массив так, чтобы все его нечетные элементы оказались в
конце. Порядок элементов в четной и нечетной частях не должен
измениться.
20. Задан массив целых чисел. Задача состоит в том, чтобы реализовать
функцию, которая формирует новый массив, но без повторений. (Пример: 1,
3, 7, 3, 1, 89 – исходный массив. 1, 3, 7, 89 – новый массив).
21. По данному массиву размера n определить, является ли он перестановкой,
то есть содержит все числа от 1 до n.
22. Дан целочисленный массив а. «Зеркально перевернуть» часть элементов
массива, расположенных между первым из всех наименьших и последним
из всех наибольших элементов массива.
23. Даны значения двух вещественных массивов х и у размером п.
Рассматривая пары значений (х1.у1),... (хп;уп) как координаты точек
плоскости. Написать функции (и тестирующую функцию main), которые
определяют:

номера двух наиболее удаленных точек;

номера трех точек, которые
наибольшей площадью;

номер такой точки и величину r, чтобы окружность с центром в этой точке
содержала все n точек, и при этом радиус r ее был наименьшим среди
радиусов всех таких окружностей.
являются
5.2. Многомерные массивы
5.2.1. Пример решения простой задачи
Задача:
вершинами
треугольника
с
Задана квадратная
матрицы.
вещественная
матрица.
Выполнить
транспонирование
Решение:
#include <stdio.h>
// определение константы числа строк/столбцов матрицы
#define N 10
// определение функции заполнения квадратной матрицы
// вещественными элементами
void fill(float *a, int n);
// определение функции печати квадратной матрицы
void print(float *a, int n);
// определение функции транспонирования квадратной матрицы
void transpose(float *a, int n);
int main()
{
// создание квадратной вещественной матрицы размера NxN
float a[N][N];
// вызов функции заполнения элементов матрицы
fill(&a[0][0], N);
// вызов функции печати квадратной матрицы
print(&a[0][0], N);
// двойной перевод курсора на новую строку
printf("\n\n");
// вызов функции транспонирования матрицы
transpose(&a[0][0], N);
// вызов функции печати квадратной матрицы
print(&a[0][0], N);
// выход из основной функции
return 0;
}
// реализация функции заполнения квадратной матрицы
// вещественными элементами
void fill(float *a, int n)
{
int i = 0, j, tmp;
// цикл по строкам массива
for (; i < n; i++)
{
tmp = i * n;
// цикл по столбцам массива
for (j = 0; j < n; j++)
{
// присваивание элементу с номером [i,j]
// значения i*n+j
a[tmp + j] = (float)(tmp + j);
}
}
}
// реализация функции печати квадратной матрицы
void print(float *a, int n)
{
int i = 0, j, tmp;
// цикл по строкам массива
for (; i < n; i++)
{
tmp = i * n;
// цикл по столбцам массива
for (j = 0; j < n; j++)
{
// печать элемента с номером [i,j],
// 2 знака после запятой
printf("%.2f\t", a[tmp + j]);
}
// переход на новую строку (каждая строка матрицы
// печатается с новой строки)
printf("\n");
}
}
// реализация функции транспонирования квадратной матрицы
void transpose(float *a, int n)
{
int i, j;
float buf;
// цикл по строкам массива
for (i = 0; i < n; i++)
{
// цикл по столбцам массива (рассматриваются элементы
// над главной диагональю)
for (j = i + 1; j < n; j++)
{
// обмен значений элементов с номерами [i,j] и [j,i]
buf = a[i * n + j];
a[i * n + j] = a[j * n + i];
a[j * n + i] = buf;
}
}
}
Комментарий
В приведенном примере:
1. Подключаются библиотеки стандартного ввода/вывода stdio.h, функций
работы с датой и временем time.h, функций выделения памяти, контроля
процесса выполнения программы, преобразования типов stdlib.h.
2. Объявляется константа для задания числа строк/столбцов квадратной
матрицы.
3. Объявляются функции заполнения массива fill, печати его элементов print и
функция транспонирования матрицы transpose.
4. Описывается функция main, в которой:

Создается массив.

Выполняется заполнения массива с помощью объявленной функции
fill.

Выполняется печать
функции print.

Осуществляется транспонирование матрицы с помощью функции
transpose.

Выполняется печать
функции print.
массива
массива
с
с
использованием
использованием
объявленной
объявленной
5. Реализуются функции заполнения массива fill, печати его элементов print и
функция транспонирования матрицы transpose.
5.2.2. Пример решения задачи средней сложности
Задача:
Задана вещественная матрица. Заменить
диагонали, минимальным элементом строки.
каждый
элемент,
стоящий
Решение:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
// определение константы числа строк/столбцов матрицы
#define N 7
// определение левой границы изменения значений элементов
#define A -10
// определение правой границы изменения значений элементов
#define B 10
// определение функции заполнения матрицы вещественными
значениями
void fill(float *a, int n, int lb, int rb);
// определение функции печати матрицы
void print(float *a, int n);
// определение функции замены диагональных элементов матрицы
void swap(float *a, int n);
int main()
{
// создание квадратной вещественной матрицы размера NxN
float a[N][N];
// вызов функции заполнения элементов матрицы
fill(&a[0][0], N, A, B);
на
// вызов функции печати квадратной матрицы
print(&a[0][0], N);
// двойной перевод курсора на новую строку
printf("\n\n");
// вызов функции замены диагональных элементов матрицы
swap(&a[0][0], N);
// вызов функции печати квадратной матрицы
print(&a[0][0], N);
// выход из основной функции
return 0;
}
// реализация функции заполнения матрицы вещественными
значениями
void fill(float *a, int n, int lb, int rb)
{
int i = 0, j, tmp;
// инициализация генератора случайных чисел
srand((unsigned int) time(0));
// цикл по строкам массива
for (; i < n; i++)
{
tmp = i * n;
// цикл по столбцам массива
for (j = 0; j < n; j++)
{
// rand() генерирует целое число в [0, RAND_MAX]
// ((float)rand()) / RAND_MAX переводит в [0, 1]
// линейное преобразование в [lb, rb]
a[tmp + j] = (rb - lb)*((float)rand())/RAND_MAX+lb;
}
}
}
// реализация функции печати квадратной матрицы
void print(float *a, int n)
{
int i = 0, j, tmp;
// цикл по строкам массива
for (; i < n; i++)
{
tmp = i * n;
// цикл по столбцам массива
for (j = 0; j < n; j++)
{
// печать элемента с номером [i,j],
// 2 знака после запятой
printf("%.2f\t", a[tmp + j]);
}
// переход на новую строку (каждая строка матрицы
// печатается с новой строки)
printf("\n");
}
}
// реализация функции замены диагональных элементов матрицы
void swap(float *a, int n)
{
int i, j, idx;
float min;
// цикл по строкам массива
for (i = 0; i < n; i++)
{
idx = i * n;
// считаем, что первый элемент строки является
// минимальным
min = a[idx];
// цикл по столбцам массива
for (j = 1; j < n; j++)
{
// если элемент с номером j в i-ой строке меньше
// текущего минимума
if (min > a[idx + j])
{
// то заменяется значение минимального
min = a[idx + j];
}
}
// запись минимального элемента строки
// на место диагонального
a[idx + i] = min;
}
}
Комментарий
В приведенном примере:
1. Подключаются библиотеки стандартного ввода/вывода stdio.h, функций
работы с датой и временем time.h, функций выделения памяти, контроля
процесса выполнения программы, преобразования типов stdlib.h.
2. Объявляются константы для задания числа строк/столбцов матрицы и
интервала изменения значения элементов.
3. Объявляются функции заполнения массива fill, печати его элементов print и
функции замены диагональных элементов минимальными значениями
строки swap.
4. Описывается функция main, в которой:

Создается массив.

Выполняется заполнения массива с помощью объявленной функции
fill.

Выполняется печать
функции print.

Осуществляется
замена
диагональных
элементов
матрицы
минимальными элементами строк с помощью функции swap.
массива
с
использованием
объявленной

Выполняется печать
функции print.
массива
с
использованием
объявленной
5. Реализуются функции заполнения массива fill, печати его элементов print и
функции замены диагональных элементов минимальными значениями
строки swap.
5.2.3. Пример решения задачи повышенной сложности
Задача:
Задана вещественная матрица, содержащая N строк и M столбцов. Заменить
каждый элемент, исключая граничные, средним арифметическим соседних
элементов по горизонтали, вертикали и диагоналям.
Решение:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
// определение константы числа строк матрицы
#define N 5
// определение константы числа столбцов матрицы
#define M 5
// определение левой границы изменения значений
#define A -2.0f
// определение правой границы изменения значений
#define B 2.0f
// определение функции заполнения матрицы вещественными
элементами
void fill(float *a, int kRows, int kCols, float lb, float rb);
// определение функции печати матрицы
void print(float *a, int kRows, int kCols);
// определение функции замены элементов средним арифметическим
окрестных
// результат записывается в новую матрицу b
void replace(float *a, float *b, int kRows, int kCols);
// определение функции копирования элементов матрицы src в dst
void copyMatrix(float *src, float *dst, int kRows, int kCols);
int main()
{
// создание квадратных вещественных матриц размера NxM
float a[N][M], b[N][M];
// вызов функции заполнения элементов матрицы
fill(&a[0][0], N, M, A, B);
// вызов функции печати матрицы
print(&a[0][0], N, M);
// двойной перевод курсора на новую строку
printf("\n\n");
// вызов функции замены элементов средним арифметическим
окрестных
replace(&a[0][0], &b[0][0], N, M);
// вызов функции копирования матрицы из b в a
copyMatrix(&b[0][0], &a[0][0], N, M);
// вызов функции печати матрицы
print(&a[0][0], N, M);
// выход из основной функции
return 0;
}
// реализация функции заполнения матрицы вещественными
элементами
void fill(float *a, int kRows, int kCols, float lb, float rb)
{
int i = 0, j, tmp;
// инициализация генератора случайных чисел
srand((unsigned int) time(0));
// цикл по строкам массива
for (; i < kRows; i++)
{
tmp = i * kRows;
// цикл по столбцам массива
for (j = 0; j < kCols; j++)
{
// rand() генерирует целое число в [0, RAND_MAX]
// ((float)rand()) / RAND_MAX переводит в [0, 1]
// линейное преобразование в [lb, rb]
a[tmp + j] = (rb-lb)*((float)rand())/RAND_MAX+lb;
}
}
}
// реализация функции печати матрицы
void print(float *a, int kRows, int kCols)
{
int i = 0, j, tmp;
// цикл по строкам массива
for (; i < kRows; i++)
{
tmp = i * kCols;
// цикл по столбцам массива
for (j = 0; j < kCols; j++)
{
// печать элемента с номером [i,j]
printf("%f\t", a[tmp + j]);
}
// переход на новую строку (каждая строка матрицы
// печатается с новой строки)
printf("\n");
}
}
// реализация функции замены элементов средним арифметическим
окрестных
// результат записывается в новую матрицу b
void replace(float *a, float *b, int kRows, int kCols)
{
int i, j, rowIdxPrev, rowIdx, rowIdxNext,
idxPrev, idx, idxNext;
float sum;
// копирование первой строки матрицы
for (j = 0; j < kCols; j++)
{
b[j] = a[j];
}
// копирование последней строки матрицы
rowIdx = (kRows - 1) * kCols;
for (j = 0; j < kCols; j++)
{
idx = rowIdx + j;
b[idx] = a[idx];
}
for (i = 1; i < kRows - 1; i++)
{
// копирование элементов первого столбца
idx = i * kCols;
b[idx] = a[idx];
// копирование элементов последнего столбца
idx = i * kCols + kCols - 1;
b[idx] = a[idx];
}
// вычисление значений внутренних элементов
// цикл по строкам матрицы
for (i = 1; i < kRows - 1; i++)
{
// индекс первого элемента текущей строки
rowIdx = i * kCols;
// индекс первого элемента предыдущей строки
rowIdxPrev = rowIdx - kCols;
// индекс первого элемента следующей строки
rowIdxNext = rowIdx + kCols;
// цикл по столбцам матрицы
for (j = 1; j < kCols - 1; j++)
{
// индекс элемента над текущим
idxPrev = rowIdxPrev + j;
// индекс текущего элемента
idx = rowIdx + j;
// индекс элемента под текущим
idxNext = rowIdxNext + j;
// среднее арифметическое всех окрестных элементов
sum = (a[idxPrev-1]+a[idxPrev]+a[idxPrev+1]+
a[idx-1]+
a[idx+1]+
a[idxNext-1]+a[idxNext]+a[idxNext+1])/8.0f;
// запись результата в новую матрицу
b[idx] = sum;
}
}
}
// реализация функции копирования элементов матрицы src в dst
void copyMatrix(float *src, float *dst, int kRows, int kCols)
{
// !!! Можно использовать функцию memcpy(...)
// Библиотека: string.h
// Вызов: memcpy(dst, src, sizeof(float) * kRows * kCols);
int i = 0, size = kRows * kCols;
// цикл по всем элементам матрицы
for (; i < size; i++)
{
// копирование элемента из src в dst
dst[i] = src[i];
}
}
В приведенном примере:
1. Подключаются библиотеки стандартного ввода/вывода stdio.h, функций
работы с датой и временем time.h, функций выделения памяти, контроля
процесса выполнения программы, преобразования типов stdlib.h.
2. Объявляются константы для задания числа строк истолбцов матрицы и
интервала изменения значения элементов.
3. Объявляются функции заполнения массива fill, печати его элементов print, а
также функция формирования новой матрицы replace, которая заменяет все
внутренние элементы исходной матрицы на среднее арифметическое
соседей, и функция копирования матрицы copyMatrix.
4. Описывается функция main, в которой:

Создается массив.

Выполняется заполнения массива с помощью объявленной функции
fill.

Выполняется печать
функции print.

Осуществляется формирование новой матрицы
существующей с использованием функции replace.

Новая матрица копируется в исходную с помощью функции
copyMatrix.

Выполняется печать
функции print.
массива
массива
с
с
использованием
использованием
объявленной
на
основании
объявленной
5. Реализуются функции заполнения массива fill, печати его элементов print, а
также функция формирования новой матрицы replace, которая заменяет все
внутренние элементы исходной матрицы на среднее арифметическое
соседей, и функция копирования матрицы copyMatrix.
5.2.4. Простые задачи
Написать функцию (и тестирующую функцию main), которая:
1. Задана вещественная матрица, содержащая N строк и M столбцов. Найти
минимальный элемент в каждой строке матрицы.
2. Задана вещественная матрица, содержащая N строк и M столбцов. Найти
минимальный элемент матрицы.
3. Задана вещественная матрица. Заменить каждый элемент, стоящий на
диагонали минимальным элементом столбца.
4. Задана вещественная квадратная матрица. Проверить, является ли данная
матрица симметричной.
5. Задана вещественная матрица, содержащая N строк и M столбцов. Найти
все числа, каждое из которых встречается в каждой строке матрицы.
6. Дано множество, содержащее M векторов размерности N. Найти все пары
ортогональных и коллинеарных векторов.
7. Даны две прямоугольные матрицы. Вычислить произведение этих матриц.
Матрицы описать как одномерные массивы.
8. Дана верхнетреугольная вещественная матрица A размера NxN и вектор B,
содержащий N элементов. Найти решение системы уравнений AX=B.
9. Задана двоичная матрицы, содержащая N строк и 8 столбцов. Определить
десятичные коды, соответствующие каждой строке матрицы.
10. находит товар, за который была получена максимальная выручка и выводит
номер этого товара и номер магазина, в котором он был продан; если таких
товаров несколько, то формирует и выводит список: «номер товара – номер
магазина». Используйте проект примера
11. суммирует элементы матрицы по каждой из линий, параллельных главной
диагонали и формирует массив таких сумм.
12. элементы одномерного массива A(n2) построчно располагает в матрице
B(n,n).
13. находит среднее арифметическое элементов каждой строки матрицы A(m,n)
и вычитает его из элементов этой строки.
14. определяет, является ли заданная матрица ортонормированной (т.е.
скалярное произведение каждой пары различных строк равно 0).
15. определяет является ли квадратная матрица размером N*N симметричной
относительно главной диагонали.
16. Написать функции (и тестирующую функцию main), которые для заданной
целой матрицы размером NxN вычисляет суммы элементов:

расположенных на главной диагонали;

расположенных над главной диагональю;

расположенных под главной диагональю;

расположенных на побочной диагонали;

расположенных над побочной диагональю;

расположенных под побочной диагональю.
17. Написать функции (и тестирующую функцию main), которые:

находит значения максимального и минимального элемента и их разность;

переставляет местами строки с заданными номерами i и k;

переставляет местами столбцы с заданными номерами j и k;

меняет местами первую строку и строку, у которой первый элемент
является наибольшим среди элементов первого столбца;

транспонирует матрицу, то есть меняет местами строки и столбцы этой
матрицы;

заменяет j-й столбец матрицы данным вектором.
18. Написать функции (и тестирующую функцию main), которые:

удаляет из данной матрицы mxn строку, содержащую минимальный
элемент матрицы;

удаляет из данной матрицы mxn столбец, содержащий минимальный
элемент матрицы;

удаляет из данной матрицы mxn все столбцы, содержащие только
положительные элементы;

в данную матрицу размера mxn вставляет строку из нулей перед данной
строкой с номером k;

в данную матрицу размера mxn вставляет столбец из нулей перед данной
столбцом с номером k.
19. Дана целочисленная квадратная матрица А порядка п. Произвести разворот
матрицы на 90° против часовой стрелки, то есть элементу а11 присвоить
значение аn1 элементу an1 - значение апп и так далее для всех элементов
матрицы. Ограничение: разрешается в программе использовать
единственную матрицу.
5.2.5. Задачи средней сложности
Написать функцию (и тестирующую функцию main), которая:
1. Задана вещественная квадратная матрица, каждая строка и каждый
столбец которой по одному нулевому элементу. Перестановкой строк
добиться расположения всех нулей по диагонали матрицы.
2. Задана вещественная матрица, содержащая N строк и M столбцов.
Проверить, является ли матрица осе- или центро-симметричной.
3. Задана вещественная матрица, содержащая N строк и M столбцов.
Упорядочить ее строки так, чтобы первые элементы строк образовывали
возрастающую последовательность.
4. Матрица размера NxM состоит из нулей и единиц. Найти в ней самую
длинную цепочку подряд стоящих нулей по горизонтали, вертикали или
диагонали.
5. Дана вещественная матрица A, содержащая N строк и N столбцов.
Известно, что строки матрицы образуют базис в пространстве RN.
Проверить, является ли этот базис ортогональным.
6. Даны две квадратные верхнетреугольные матрицы. Каждая матрица
представляется массивом строк, каждая строка содержит только ненулевые
элементы (первый элемент строки – диагональный, второй – следующий за
диагональным и т.д.). Вычислить произведение таких матриц.
7. Найти k-ую степень Ak квадратной матрицы A, выполнив минимальное
число матричных умножений.
8. Задана вещественная квадратная матрица. Найти минимальный элемент
для каждой ее диагонали, параллельной главной, начиная с
одноэлементной диагонали.
9. Для заданной целочисленной матрицы сформировать массивы индексов
(номера строк и столбцов) всех ее седловых точек. Элемент матрицы
называется седловой точкой, если он является минимальным в своей
строке и максимальным в своем столбце или, наоборот, максимальным в
своей строке и минимальным в своем столбце.
10. Результаты сессии, состоящей из 3 экзаменов, для группы из n студентов
представлены матрицей A(n,3). Оценка ставится по четырехбальной
системе, неявка обозначена единицей. Написать функцию (и тестирующую
функцию
main),
которая
подсчитывает
количество
неявок,
неудовлетворительных, удовлетворительных, хороших и отличных оценок
по каждому экзамену.
11. На
предприятии
зарплата
каждому
сотруднику
рассчитывается
пропорционально количеству отработанных за месяц часов. Для каждого
сотрудника известен размер оплаты за 1 час работы и количество
отработанных за каждый месяц часов. Написать программу, которая
определяет зарплату сотрудников за каждый месяц и ежемесячный общий
фонд зарплаты предприятия.
12. Массив содержит данные о пяти различных характеристиках для N
объектов. Уникальным называется объект, имеющий более двух
характеристик с максимальными значениями или более двух характеристик
с минимальными значениями. Усредненным называется объект, имеющий
все характеристики, наиболее близкие к средним значениям. Написать
функцию (и тестирующую функцию main), которая выводит номера
уникальных и усредненных объектов или сообщения об их отсутствии.
13. В поезде N вагонов, по M мест в каждом. Имеется таблица N*M, в которой
отмечаются занятые места. Написать функцию (и тестирующую функцию
main), которая определяет максимальное количество подряд идущих
свободных мест, расположенных в одном вагоне и номер этого вагона.
14. Дана вещественная квадратная матрица А порядка n. Произвести
«зеркальный разворот» строки матрицы, в которой находится наименьший
среди элементов главной диагонали (под «зеркальным разворотом» строки
матрицы будем понимать обмен значениями первого и последнего
элементов строки, второго и предпоследнего и т.д.).
15. Дана целочисленная матрица А размером тхп. Сформировать массив
индексов тех строк матрицы, которые являются палиндромами (палиндром
- это строка, которая читается одинаково с начала и с конца).
16. Магический квадрат. Дана целочисленная квадратная матрица А порядка п.
Проверить, является ли эта матрица магическим квадратом, то есть такой,
в которой суммы элементов во всех строках и во всех столбцах совпадают.
17. Латинский квадрат. Дана целочисленная квадратная матрица А порядка п.
Проверить, является ли эта матрица латинским квадратом, то есть такой, в
которой каждая строка и каждый столбец содержат все числа от 1 до n.
18. Решить систему n линейных уравнений методом Гаусса. Матрицу и
решение генерировать датчиком случайных чисел; вектор правой части
получить умножением матрицы на вектор решения, для чего написать
функцию умножения квадратной матрицы на вектор.
19. Решить систему n линейных уравнений методом Жордана. Матрицу и
решение генерировать датчиком случайных чисел; вектор правой части
получить умножением матрицы на вектор решения, для чего написать
функцию умножения квадратной матрицы на вектор.
5.2.6. Задачи повышенной сложности
Написать функцию (и тестирующую функцию main), которая:
1. Задана вещественная квадратная матрица. Повернуть содержимое
матрицы на 900 по часовой стрелке, считая центром поворота центр
симметрии матрицы.
2. Задана вещественная квадратная матрица. Повернуть содержимое
матрицы на 900 против часовой стрелки, считая центром поворота центр
симметрии матрицы.
3. Многоугольник на плоскости (не обязательно выпуклый) задан своими
вершинами в порядке обхода по часовой стрелке. Проверить, лежит ли
заданная точка внутри или вне него. Указание: необходимо провести
произвольную прямую через заданную точку и определить количество точек
пересечения с границей многоугольника.
4. Задана вещественная матрица, содержащая N строк и M столбцов.
Упорядочить ее строки так, чтобы последние элементы столбцов
образовывали убывающую последовательность.
5. Задана вещественная матрица, содержащая N строк и M столбцов.
Упорядочить ее строки так, чтобы первые элементы столбцов
образовывали возрастающую последовательность.
6. Задана вещественная матрица, содержащая N строк и M столбцов.
Упорядочить ее столбцы так, чтобы максимальные элементы столбцов
образовывали возрастающую последовательность.
7. Задана вещественная матрица, содержащая N строк и M столбцов.
Упорядочить ее столбцы так, чтобы минимальные элементы столбцов
образовывали убывающую последовательность.
8. Задано N линейных функций с помощью пар соответствующих
коэффициентов y=aix+bi. Найти минимум верхней огибающей этих функций,
т.е. минимум кусочно-линейной функции y(x)=maxi(aix+bi)→minx.
9. Задана бинарная матрица, содержащая N строк и M столбцов. Найти
квадрат наибольшего размера, состоящий целиком из нулей.
10. Пусть M натуральных чисел заданы своими цифрами в q-ичной системе
счисления (q≤10), хранящимися в строках матрицы A размера NxM. Найти
сумму этих чисел в той же системе счисления, не вычисляя самих чисел.
11. В поезде N вагонов, по M мест в каждом. Имеется таблица N*M, в которой
отмечаются занятые места. Необходимо разместить в поезде
туристическую группу из k человек таким образом, чтобы они находились в
одном вагоне. При невозможности такого размещения допускается чтобы в
одном вагоне находилось не менее половины группы, а остальные
размещались в соседнем вагоне. Написать функцию (и тестирующую
функцию main), которая определяет один из возможных вариантов
размещения или сообщение о невозможности этого.
12. Заполнение матрицы по змейке. Для заданного натурального N заполнить
квадратную матрицу размером N х N целыми числами 0,1,2,..., N2-1 в
соответствии со cxeмoй расположения (см. рис).
Download