Главная страница

Не зависят от конкретного компьютера Язык Си


Скачать 5.8 Mb.
НазваниеНе зависят от конкретного компьютера Язык Си
Дата24.10.2022
Размер5.8 Mb.
Формат файлаppt
Имя файлаINFORMATIKA_lektsii_IB-1.ppt
ТипПрограмма
#751529
страница9 из 16
1   ...   5   6   7   8   9   10   11   12   ...   16



Заполнение массива случайными числами


srand() – задает начальное значение для генератора псевдослучайных чисел в текущем потоке (выполняет инициализацию генератора случайных чисел).
Чтобы при каждом запуске получать различные последовательности чисел, необходимо применить функцию srand() до функции rand(). Параметр seed функции srand устанавливает начальную точку для функции rand.





Заполнение массива случайными числами


Если использовать одно и то же значение параметра seed, то с каждым вызовом функции rand() алгоритм генерации псевдослучайных чисел будет генерировать одну и ту же последовательность чисел.
Для получения разных последовательностей псевдослучайных чисел в текущем потоке в качестве значения параметра seed используется значение функции time() с параметром NULL.
time(NULL) – возвращает системное время, представленное в секундах, прошедших с 00:00:00 1 января 1970 года.





Заполнение массива случайными числами


Значение, возвращенное функцией time отличается каждую секунду, что дает возможность получать совершенно разные псевдослучайные последовательности чисел при каждом новом вызове функции rand.
Для работы с функциями rand и srand требуется библиотека , для функции timeбиблиотека <сtime>.
#include
#include <сtime>





Заполнение массива случайными числами


Пример.


#include
#include
#include
using namespace std;
int main()
{
int A[3] = {};
srand(time(NULL));
for (int i = 0; i < 3; i++)
{
A[i] = rand();
cout << A[i] << endl;
}
return 0;
}





Заполнение массива случайными числами


В строке 11 генерируется случайное число и записывается в i-й элемент массива A.
В строке 12 осуществляется вывод на экран полученного на предыдущем шаге i-го элемента массива A.
Примечание: диапазон случайных чисел, генерируемых таким образом – от 0 дo 32767.





Масштабирование диапазона генерации случайных чисел


Для масштабирования диапазона генерации случайных чисел используется операция нахождения остатка от деления «%».
rand() % c + (+/-a); //генерация случайных чисел в диапазоне [a,c – 1 + a] со сдвигом диапазона вправо/влево
a – начальная точка, с которой начинается генерация (нижняя граница рандомизации)
c – масштабируемый коэффициент, определяющий интервал, на котором будет производиться генерация (величина сдвига)





Масштабирование диапазона генерации случайных чисел


Обратите внимание. значение «c» не включается в диапазон генерации случайных чисел, поскольку это не конечная точка, а величина сдвига относительно начальной точки
Примеры
rand() % 7; //генерация случайных чисел в диапазоне [0,6]
rand() генерирует псевдослучайное число, далее вычисляется остаток от деления нa 7 от этого числа. Таким образом, генерация случайных чисел осуществляется в диапазоне от 0 до 6.





Масштабирование диапазона генерации случайных чисел


rand() % 7 + 1; //генерация случайных чисел в диапазоне [1,7]
rand() генерирует псевдослучайное число, далее вычисляется остаток от деления нa 7 от этого числа и к нему добавляется 1. Получаем диапазон генерации случайных чисел oт 1 до 7.
rand() % 101 + 200; //генерация случайных чисел
      в диапазоне [200,300]

    rand() % 41 – 20; //генерация случайных чисел в диапазоне [–20,20]




Масштабирование диапазона генерации случайных чисел


Так как пользователю удобнее вводить верхнюю границу рандомизации, а не величину сдвига, модифицируем запись масштабирования диапазона генерации целых случайных чисел:
rand() %(b – a + 1) + a; //генерация случайных чисел в диапазоне [a,b]
b – верхняя граница рандомизации





Заполнение массива случайными числами


Пример заполнения массива типа int случайными числами из заданного диапазона [a,b].
#include
#include
#include
#include
using namespace std;
void fill_int(int a, int b, int m, int *X) {
srand(time( NULL ));
for(int i=0; i {
X[i] = rand()%(b-a+1)+a;
}
}





Заполнение массива случайными числами


void arr_print(int m, int *X) {
for( int i=0; i {
cout << X[i] << " ";
}
}
int main()
{
const int n = 10;
int A[n];
fill_int(5, 55, n, A);
arr_print(n, A);
_getch();
return 0;
}





Заполнение массива случайными числами


Функция fill_int заполняет массив типа int случайными целыми числами из заданного диапазона [a,b].
Параметры функции fill_int :
m – количество элементов массива,
X – массив, который нужно заполнить,
a, b – границы диапазона.
Функция arr_print выводит массив на печать. Параметры m, X имеют тот же смысл.





Заполнение массива случайными числами


//Заполняет X случайными вещественными числами из [a,b]
void fill_double(double a, double b, int m, double *X) {
srand(time( NULL ));
if (a>b){int r=a; a=b; b=r;}
for( int i=0; i {
X[i] = (double)rand()/(RAND_MAX + 1)*(b - a)+ a;
}
}


Напишем функцию, которая заполняет массив типа double случайными числами из заданного диапазона [a,b].





Двумерные массивы


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





Двумерные массивы


Синтаксис:


ТипЭлементов ИмяМассива [ Кол-воЭлементов1 ] [ Кол-воЭлементов2 ];


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





Двумерные массивы


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





Двумерные массивы


Структура двумерного массива А размером m на n:


m – количество строк двумерного массива;
n - количество столбцов двумерного массива;
m на n – количество элементов массива.





Двумерные массивы


При объявлении двумерного массива сначала указываются:
тип данных массива;
имя массива.
Затем в первых квадратных скобках указывается количество строк двумерного массива, во вторых квадратных скобках – количество столбцов двумерного массива.
Двумерный массив визуально отличается от одномерного второй парой квадратных скобок.


столбец 3





Двумерные массивы


Пример.
int A [3][5];
Данные такого массива представляются таблицей 3 х 5.


1


4


7


3


6


2


-5


0


15


10


8


9


11


12


20


0


1


2


0


1


2


3


4


A


2


-5


0


15


10


строка 2


ячейка A[2][3]


A[0][0]=


1


A[0][1]=


4


A[0][2]=


7


...


A[2][3]=


12


i


j





Двумерные массивы


Первый за именем массива индекс – это индекс строки, второй – индекс столбца.
В данном примере в памяти располагается сначала строка с индексом 0 – ячейки от 0-й до 4-й, далее строка с индексом 1 – ячейки от 0-й до 4-й и т.д.





Объявление двумерных массивов


Примеры.
const int R = 3, C = 4;
int A[R][C];
float a[2][2] = {{3.2, 4.3}, {1.1, 2.2}};
char sym[2][2] = { 'a', 'b', 'c', 'd' };





Инициализация двумерных массивов


Также, как и в случае с одномерными массивами, инициализировать двумерный массив можно при его объявлении.
Пример.
int arr [3][4]={{4, 8, 16, 32}, {9, 6, 3, 0}, {5, 55, 11, 1}};


После знака присвоить ставятся общие фигурные скобки, внутри которых ставится столько пар фигурных скобок, сколько строк в двумерном массиве. Эти скобки разделяются запятыми.





Инициализация двумерных массивов


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





Пример заполнения двумерного массива


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


#include
#include
#include
#include
#include
using namespace std;
int main()
{
setlocale(LC_ALL,"Russian");
const int r = 5; //r – количество строк
const int c = 4; //c – количество столбцов
int A[r][c];
int i, j;





Пример заполнения двумерного массива


//ввод целочисленной матрицы с клавиатуры
for (i = 0; i < r; i++) { //цикл по строкам
for (j = 0; j < c; j++) { //цикл по столбцам
cout << "Введите значение в ячейку[" << i << "][" << j << "] ";
cin >> A[i][j];
}
cout << endl;
}
//вывод матрицы на экран
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++) {
cout << setw(5) << A[i][j] << " |";
}
cout << endl;
}
_getch();
return 0;
}





Пример заполнения двумерного массива


В строках 15 – 22 мы использовали цикл for для записи данных в массив. Если представить этот двумерный массив как таблицу – то внешний цикл for проходит по индексам строк – от 0-й до 4-й. Вложенный цикл – по индексам столбцов (по ячейкам строк таблицы) – от 0-й до 3-й.
В строках 24 – 31 мы использовали цикл for для вывода массива на экран. Внешний и вложенный циклы for имеют тот же смысл.





Заполнение матрицы случайными числами


Пример заполнения матрицы случайными числами из заданного диапазона [a,b].
#include
#include
#include
#include
#include
using namespace std;
const int r = 3;
const int c = 4;





Заполнение матрицы случайными числами


//заполнение целочисленной матрицы случайными числами из диапазона [a,b]
void fill_int(int a, int b, int m, int n, int X[r][c]) {
int i, j;
srand(time( NULL ));
for(i=0; i {
for (j = 0; j < n; j++)
{
X[i][j] = rand()%(b – a + 1) + a;
}
}
}





Заполнение матрицы случайными числами


//вывод матрицы на экран
void arr_print(int m, int n, int X[r][c]) {
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
cout << setw(5) << X[i][j] << " |";
}
cout << endl;
}
}





Заполнение матрицы случайными числами


int main()
{
int A[r][c];
fill_int(-10, 10, r, c, A);
arr_print(r, c, A);
_getch();
return 0;
}
Результат работы программы:





Заполнение матрицы случайными числами


Функция fill_int заполняет матрицу случайными целыми числами из заданного диапазона [a,b].
Параметры функции fill_int :
m – количество строк матрицы,
n – количество столбцов матрицы,
X – матрица, которую нужно заполнить,
a, b – границы диапазона.
Функция arr_print выводит матрицу на печать. Параметры m, n, X имеют тот же смысл.





Заполнение матрицы случайными числами


Обратите внимание. При передаче многомерного массива в качестве параметра функции в формальном параметре можно опустить только первую размерность, значения остальных (константные выражения) должны быть заданы обязательно.
Пример.
void fill_int(int a, int b, int m, int n, int X[][c])
void arr_print(int m, int n, int X[][c]





Обработка матриц


При работе с матрицами решаются задачи следующих классов:
работа с матрицей в целом;
работа со строками (столбцами) матрицы;
работа с диагональными элементами матрицы.
При работе с матрицами в целом вся подготовительная и инициализирующая часть выполняется один раз перед внешним циклом.





Обработка матриц


Поиск суммы элементов матрицы
#include
#include
#include
#include
#include
#include
using namespace std;
main()
{
setlocale(LC_ALL,"Russian");
const int r = 3, c = 4;
int arr[r][c], i, j, sum = 0;





Обработка матриц


//заполнение матрицы случайными числами из диапазона
[a,b]
int a = -50, b = 50;
srand(time( NULL ));
for(i = 0; i < r; i++)
for (j = 0; j < c; j++)
arr[i][j] = rand()%(b - a + 1) + a;
// вывод матрицы на экран
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++)
cout << setw(5) << arr[i][j] << " |"; //вывод строки с заданной шириной
cout << endl;
}
cout << endl;





Обработка матриц


// поиск и вывод на экран суммы элементов матрицы
for ( i = 0; i < r; i++ )
for ( j = 0; j < c; j++ )
sum += arr[i][j];
cout << "Сумма элементов матрицы = " << sum << endl;
_getch();
return 0;
}





Обработка матриц


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





Обработка матриц


Поиск максимального элемента матрицы и его номера
Вначале в качестве максимального элемента (max) запоминается первый элемент матрицы A[0][0], соответственно, номер индексы максимального элемента первоначально равны номеру строки и столбца первого элемента матрицы (imaх=0, jmax=0).


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

main ()
{
setlocale(LC_ALL,"Russian");
const int r = 7, c = 5;
int arr[r][c], i, j, max, imax, jmax;
int a = -50, b = 50;
… // заполнение матрицы случайными числами из диапазона [a,b] и вывод ее на экран


1   ...   5   6   7   8   9   10   11   12   ...   16


написать администратору сайта