- •8.Совместимость и преобразование типов. Явное и неявное преобразование.
- •10. Оператор присвоения. Комбинированные операторы присвоения. Математические и логические операции, операции сравнения . Ограничения на применения операторов(несовместимость типов).
- •11.Условная инструкция. Условный оператор. Пример.
- •12. Оператор множественного выбора. Пример. Управление оператором множественного выбора с помощью оператора break.
- •Вопрос 19. Регулярные структурированные типы. Одномерные массивы. Примеры работы с одномерными массивами (инвертирование массива относительно центрального элемента, относительно к-го элемента)
- •Вопрос 20. Регулярные структурированные типы. Одномерные массивы. Примеры работы с одномерными массивами (сложение векторов, скалярное произведение векторов, проверка на равенство)
- •Вопрос 22-24 Сортировка массивов. Методы сортировки (простого выбора, простой вставки, простого обмена). На примере массива структур.
- •Функции
- •39. Текстовые файлы
- •Функции вывода в стандартный и файловые потоки
- •Int printf([строка формата],
- •Функции ввода из стандартного и файловых потоков
- •Int scanf([строка формата],
- •Int fscanf(file*f,[строка формата],
- •40. Бинарные файлы с
- •41. Пользовательские типы данных
- •42. Модульная организация программы
Вопрос 22-24 Сортировка массивов. Методы сортировки (простого выбора, простой вставки, простого обмена). На примере массива структур.
Cортировку следует понимать как процесс перегруппировки элементов массива в некотором определенном порядке. Цель сортировки – облегчить последующий поиск элементов в таком отсортированном массиве. Алгоритмы сортировки относятся к фундаментальным алгоритмам программирования.
Порядок сортировки:
• по возрастанию элементов (Ai<Ai+1, для i=0, 1, …,n−2)
• по убыванию элементов (Ai>Ai+1, для i=0, 1, …,n−2)
• по невозрастанию элементов (Ai≥Ai+1, для i=0, 1, …,n−2)
• по неубыванию элементов (Ai<=Ai+1, для i=0, 1, …,n−2)
Рассмотрим три базовые сортировки.
Обменная сортировка (метод пузырька). Пузырьковая сортировка относится к классу обменных сортировок. Проходя по массиву, сравниваем два соседних элемента. Если они неупорядочены, то меняем их местами. В результате первого прохода наибольший переходит в последнюю позицию («тяжелый пузырек опускается вниз»).
Повторяем проходы n−1 раз, сокращая каждый раз длину прохода на один шаг.
void sort_1(int *a,int n){
for (int i=1;i<n;i++)
for (int j=0;j<n-i;j++)
if(a[j]>a[j+1])
{
int x=a[j];
a[j]=a[j+1];
a[j+1]=x;
}
}
Метод «простой выбор». Суть метода заключается в следующем.
Находим наименьшее во всем массиве, ставим его на первое место, а первый – на место наименьшего; далее находим наименьшее среди всех, кроме первого, и меняем местами со вторым; затем наименьшее среди оставшихся n−2 элементов и т.д. Выстраивая таким образом очередные минимумы, сортируем элементы массива в порядке, например, неубывания (нестрогое возрастание).
Алгоритм
for (i = 0;i < n-1; i++){
Определить Nmin - номер наименьшего в ряду Ai, Ai+1, Ai+2,…,An-1
Поменять местами Аi и ANmin
}
void sort_2(int *a,int n){
int i, j, Nmin, z;
for (i = 0; i < n - 1; i++)
{
Nmin = i;
for (j = i + 1; j < n; j++)
if (a[j] < a[Nmin])
Nmin=j;
z = a[i];
a[i] = a[Nmin];
a[Nmin]=z;
}
}
Сортировка «прямое включение». При каждом шаге, начиная с i=1, берем элемент Ai и сдвигаем его влево на надлежащее ему место. В исходной позиции слева от него находится уже упорядоченная подпоследовательность. При движении элемента влево предшествующие ему сдвигаются вправо. Двигаем влево, пока наш элемент меньше текущего.
Алгоритм
for (i=1; i< n;i++){
x = Ai;
включение х на надлежащее место в ряду A0, A1,.., Ai
}
void sort_3(int* a,int n){
int i, j, x;
for (i = 1; i < n; i++)
{
x = a[i];
j = i-1;
while (j >= 0 && a[j] > x){
a[j+1] = a[j];
j--;
}
a[j+1] = x;
}}
Билет 25.
Последовательный поиск в неупорядоченном массиве
Дано: A – массив целых чисел, состоящий из n элементов; х –вещественное число.
Определить, есть ли в вещественном массиве А элемент, совпадающий с заданным значением х.
Выполняем последовательное сравнение элементов массива А с заданным значением x до тех пор, пока либо элемент массива совпадет с x, либо после прохождения всего массива поиск закончится безуспешно.
Для решения задачи используем цикл с параметром (for)
#include <iostream.h>
#include <conio.h>
const int n=15;
void main(){
int A[n], x, i;
clrscr();
cout << "\n введите "<<n<<" элементов\n";
for (i = 0; i <n; i++)
cin >> A[i];
cout << "\n введите x\n";
cin >> x;
for (i = 0; i < n && A[i] != x; i++);
if(i==n)
cout<<”\n нет такого в массиве\n”;
else
cout<<”\n номер первого элемента, совпадающего\ с заданным ”<<i;
getch();
}
Последовательный поиск c барьером
В предыдущей программе используется алгоритм линейного поиска в массиве. Инварианта цикла содержит два условия. Упростим инварианту цикла. При этом существенно сократится количество операций (n операций сравнения в случае неудачного поиска). Предлагается алгоритм «поиск с барьером».
Добавим в массив один элемент – барьер (An) и перед началом поиска поместим x в «барьер». При этом отпадает необходимость использовать в заголовке цикла условие (i < n).
#include <iostream.h>
#include <conio.h>
const int n=15;
void main(){
int A[n+1], x, i;
clrscr();
cout << "\n введите " << n << " элементов\n";
for (i = 0; i < n; i++)
cin >> A[i];
cout << "\n введите x\n";
cin >> x;
A[n] = x; // барьер
for (i = 0; A[i] != x; i++);
if(i==n)
cout<<”\nнет такого в массиве\n”;
else
cout<<”\n номер первого элемента, совпадающего\ с заданным ”<<i;
getch();
}
Дихотомический поиск в упорядоченном массиве
Определить, найдется ли в заданном упорядоченном целочисленном массиве элемент, равный заданному числу x. Пусть массив упорядочен по возрастанию.
Можно при этом использовать любой из вышеописаных алгоритмов. Однако предложим более эффективный алгоритм поиска. Используем алгоритм двоичного поиска. Суть его состоит в следующем:
пусть L, R –левый и правый концы секции массива, где еще может быть обнаружен x (для начала – L = 0, R = n−1);
определить индекс серединного элемента m (m = (L+R) / 2);
если х>Am, то поиск сузить до правого интервала (L = m + 1), иначе – до левого (R = m−1);
если L ≤ R, перейти к пункту 2).
#include <iostream.h>
#include <conio.h>
const int n=15;
void main(){
int A[n], x, i, m, L, R, F = 1;
clrscr();
cout << "\n введите " << n << " элементов\n";
for (i = 0; i < n; i++)
cin >> A[i];
cout << ”\n введите искомое число x \n”;
cin >> x;
L = 0; //заданы левый и правый концы интервала
R = n-1; // поиска
while (L <= R && F){
m=(L+R) / 2; // серединный элемент
if (x>a[m])
L=m+1; //сузить поиск до правого интервала
else
if (x<a[m])
R=m-1; //сузить поиск до левого
else
F=0; //нашли
}
if(F)
cout<<”\n нет такого в массиве\n”;
else
cout<<”\n номер первого элемента, совпадающего\ с заданным ”<<m;
}
Билет 26.
Большие возможности заключают в себе структурированные данные, определяемые разработчиком программы (в пределах возможностей используемого им языка программирования). К структурированию данных разработчика программы толкает как логика прикладной задачи, так и чисто утилитарное соображение: при наличии в задаче большого количества входных и выходных данных отдельное именование каждого из них может оказаться практически невозможным. Разумеется, действия разработчика алгоритма и программы ограничены возможностями того языка программирования, на который он ориентируется. В разных языках возможности структуризации переменных на уровне сложных структур не совпадают, но многие структуры давно стали традиционными и реализованы в большинстве практически используемых языков программирования. Структурированные типы данных классифицируют по следующим основным признакам: однородная – неоднородная, упорядоченная – неупорядоченная, прямой доступ – последовательный доступ, статическая – динамическая. Эти признаки противостоят друг другу лишь внутри пары, а вне этого могут сочетаться. Если все элементы, образующие структуру, однотипны (например – целые числа или символы), то структура является однородной; если же в ней «перепутаны» элементы разной природы (например, числа чередуются с символами), то неоднородной. Структуру называют упорядоченной, если между ее элементами определен порядок следования. Примером упорядоченной математической структуры служит числовая последовательность, в которой у каждого элемента (кроме первого) есть предыдущий и последующий. Наличие индекса в записи элементов структуры уже указывает на ее упорядоченность (хотя индекс для этого не является обязательным признаком). По способу доступа упорядоченные структуры бывают прямого и последовательного доступа. При прямом доступе каждый элемент структуры доступен пользователю в любой момент независимо от других элементов. Глядя на линейную таблицу чисел мы можем списать или заменить сразу, допустим, десятый элемент. Однако, если эта таблица не на бумаге, а, скажем, каким-то образом записана на магнитофонную ленту, то сразу десятое число нам недоступно – надо сначала извлечь девять предшествующих. В последнем случае мы имеем дело с последовательным доступом. Если у структуры размер (длина, количество элементов) не может быть изменен «на ходу», а фиксирован заранее, то такую структуру называют статической. Программные средства информатики иногда позволяют не фиксировать размер структуры, а устанавливать его по ходу решения задачи и менять при необходимости, что бывает очень удобно. Такую структуру называют динамической. Например, при описании закономерностей движения очереди в магазине мы не знаем заранее, сколько человек в ней будет в тот или иной момент, и соответствующую структуру данных (например, список фамилий участников очереди) лучше представлять динамической. Массивы Самым традиционным и широко известным из структурированных типов данных является массив (иначе называемый регулярным типом) – однородная упорядоченная статическая структура прямого доступа.
Матрица — это двумерный массив, каждый элемент которого имеет два индекса: номер строки и номер столбца, поэтому для работы с элементами матрицы необходимо использовать два цикла. Если значениями параметра первого цикла будут номера строк матрицы, то значениями параметрами второго — столбцы (или наоборот). Обработка матрицы заключается в том, что вначале поочередно рассматриваются элементы первой строки (столбца), затем второй и т.д. до последней.
Для обращение к элементу ai, j в программе на C++ необходимо указать его имя, и в квадратных скобках номер строки и столбца (a[i] [j]).
Ввод/вывод матрицы:
#include <iostream.h> #include <conio.h> using namespace std; int main() { int i,j,N,M,a[20][20]; cout<<"N="; //ввод количества строк cin>>N; cout<<"M="; //ввод количества столбцов cin>>M; cout<<"Input matrix A \n"; //цикл по переменной i, в которой перебираем строки матрицы for (i=0; i<N; i++) //цикл по переменной j, в котором перебираем элементы внутри строки for (j=0; j<M; j++) cin>>a[i][j]; //ввод очередного элемента матрицы cout<<"matrix A \n"; for (i=0; i<N; i++) { //цикл по переменной i, в котором перебираем строки матрицы for (j=0; j<M; j++) cout<<a[i][j]<<"\t"; //вывод очередного элемента матрицы cout<<endl; //переход на новую строку после вывода всех элементов строки } return 0;
}
Сумма элементов:
#include<iostream.h>
#include<conio.h>
Const int n=5, m=4;
Void input (int w[n][m]){
Cout<<”input matrix\n”;
For (int i=0; i<n; i++){
For (int j=0; j<m; j++)
Cin>>w[i][j];}}
Void Edition(int w[n][m]){
Int i, j, Sum=0;
For (i=0; i<n; i++){
For (j=0; j<m; j++)
Sum+=w[i][j];
Cout<<”Sum= “<<Sum;
Getch();
}}
Void main(){
Int A[n][m];
Input(A); Edition(A);}
Произведение элементов:
#include<iostream.h>
#include<conio.h>
Const int n=5, m=4;
Void input (int w[n][m]){
Cout<<”input matrix\n”;
For (int i=0; i<n; i++){
For (int j=0; j<m; j++)
Cin>>w[i][j];}}
Void Multiplication(int w[n][m]){
Int i, j, Mult=0;
For (i=0; i<n; i++){
For (j=0; j<m; j++)
Mult=w[i][j]*w[i+1][j+1];
Cout<<”Mult= “<<Mult;
Getch();
}}
Void main(){
Int A[n][m];
Input(A); Multiplication(A);}
Сумма элементов выше главной диагонали:
#include <iostream.h> #include <conio.h> using namespace std; int main() { int S, i, j, N, M, a[20][20]; cout<<"N="; cin>>N; cout<<"M="; cin>>M; cout<<"Введите матрицу А \n"; for (i=0; i<N; i++) for (j=0; j<M; j++) cin>>a[i][j]; for (S=i=0; i<N; i++) for (j=0; j<M; j++) //если элемент лежит выше главной диагонали, то наращиваем сумму if (j>i) S+=a[i][j]; cout<<"S="<<S<<endl; return 0;} } Сумма элементов столбцов:
#include<iostream.h>
#include<conio.h>
Const int n=5, m=4;
Void input (int w[n][m]){
Cout<<”input matrix\n”;
For (int i=0; i<n; i++){
For (int j=0; j<m; j++)
Cin>>w[i][j];}}
Int Sum(int w[n][m]){
Int i, j, Sum=0;
Int*S=new int [m];
For (i=0; i<n; i++){
For (j=0; j<m; j++)
Sum+=w[i][j];
S[j]=Sum;
Cout<<”Sum= “<<Sum;
Return S;
Getch();
}}
Void main(){
Int A[n][m];
Input(A); Sum(A);}
Сумма элементов строк:
#include<iostream.h>
#include<conio.h>
Const int n=5, m=4;
Void input (int w[n][m]){
Cout<<”input matrix\n”;
For (int i=0; i<n; i++){
For (int j=0; j<m; j++)
Cin>>w[i][j];}}
Int Sum(int w[n][m]){
Int i, j, Sum=0;
Int*S=new int [m];
For (i=0; i<n; i++){
For (j=0; j<m; j++)
Sum+=w[i][j];
S[i]=Sum;
Cout<<”Sum= “<<Sum;
Return S;
Getch();
}}
Void main(){
Int A[n][m];
Input(A); Sum(A);}
Билет 27
Большие возможности заключают в себе структурированные данные, определяемые разработчиком программы (в пределах возможностей используемого им языка программирования). К структурированию данных разработчика программы толкает как логика прикладной задачи, так и чисто утилитарное соображение: при наличии в задаче большого количества входных и выходных данных отдельное именование каждого из них может оказаться практически невозможным. Разумеется, действия разработчика алгоритма и программы ограничены возможностями того языка программирования, на который он ориентируется. В разных языках возможности структуризации переменных на уровне сложных структур не совпадают, но многие структуры давно стали традиционными и реализованы в большинстве практически используемых языков программирования. Структурированные типы данных классифицируют по следующим основным признакам: однородная – неоднородная, упорядоченная – неупорядоченная, прямой доступ – последовательный доступ, статическая – динамическая. Эти признаки противостоят друг другу лишь внутри пары, а вне этого могут сочетаться. Если все элементы, образующие структуру, однотипны (например – целые числа или символы), то структура является однородной; если же в ней «перепутаны» элементы разной природы (например, числа чередуются с символами), то неоднородной. Структуру называют упорядоченной, если между ее элементами определен порядок следования. Примером упорядоченной математической структуры служит числовая последовательность, в которой у каждого элемента (кроме первого) есть предыдущий и последующий. Наличие индекса в записи элементов структуры уже указывает на ее упорядоченность (хотя индекс для этого не является обязательным признаком). По способу доступа упорядоченные структуры бывают прямого и последовательного доступа. При прямом доступе каждый элемент структуры доступен пользователю в любой момент независимо от других элементов. Глядя на линейную таблицу чисел мы можем списать или заменить сразу, допустим, десятый элемент. Однако, если эта таблица не на бумаге, а, скажем, каким-то образом записана на магнитофонную ленту, то сразу десятое число нам недоступно – надо сначала извлечь девять предшествующих. В последнем случае мы имеем дело с последовательным доступом. Если у структуры размер (длина, количество элементов) не может быть изменен «на ходу», а фиксирован заранее, то такую структуру называют статической. Программные средства информатики иногда позволяют не фиксировать размер структуры, а устанавливать его по ходу решения задачи и менять при необходимости, что бывает очень удобно. Такую структуру называют динамической. Например, при описании закономерностей движения очереди в магазине мы не знаем заранее, сколько человек в ней будет в тот или иной момент, и соответствующую структуру данных (например, список фамилий участников очереди) лучше представлять динамической. Массивы Самым традиционным и широко известным из структурированных типов данных является массив (иначе называемый регулярным типом) – однородная упорядоченная статическая структура прямого доступа.
Матрица — это двумерный массив, каждый элемент которого имеет два индекса: номер строки и номер столбца, поэтому для работы с элементами матрицы необходимо использовать два цикла. Если значениями параметра первого цикла будут номера строк матрицы, то значениями параметрами второго — столбцы (или наоборот). Обработка матрицы заключается в том, что вначале поочередно рассматриваются элементы первой строки (столбца), затем второй и т.д. до последней.
Сложение матриц:
#include <iostream.h> #include <conio.h> using namespace std; int main() { int i, j, N, M; int A, B, C; //ввод размеров матрицы cout<<"N = "; cin>>N; cout<<"M = "; cin>>M; //выделение памяти для матриц a=new int[N*M]; b=new int[N*M]; c=new int[N*M]; //ввод матрицы А cout<<"введите матрицу А"<<endl; for (i=0; i<N; i++) for (j=0; j<M; j++) { cin>>a[i][j]; } //ввод матрицы B cout<<"введите матрицу B"<<endl; for (i=0; i<N; i++) for (j=0; j<M; j++) { cin>>*b[i][j]; } //вычисление матрицы C=A+B for (i=0; i<N; i++) for (j=0; j<M; j++) c[i][j]=a[i][j]+b[i][j]; //вывод матрицы С cout<<"матрица С:"<<endl; for (i=0; i<N; cout<<endl, i++) for (j=0; j<M; j++) cout<<c[i][j]; return 0; }
Билет 28.
Большие возможности заключают в себе структурированные данные, определяемые разработчиком программы (в пределах возможностей используемого им языка программирования). К структурированию данных разработчика программы толкает как логика прикладной задачи, так и чисто утилитарное соображение: при наличии в задаче большого количества входных и выходных данных отдельное именование каждого из них может оказаться практически невозможным. Разумеется, действия разработчика алгоритма и программы ограничены возможностями того языка программирования, на который он ориентируется. В разных языках возможности структуризации переменных на уровне сложных структур не совпадают, но многие структуры давно стали традиционными и реализованы в большинстве практически используемых языков программирования. Структурированные типы данных классифицируют по следующим основным признакам: однородная – неоднородная, упорядоченная – неупорядоченная, прямой доступ – последовательный доступ, статическая – динамическая. Эти признаки противостоят друг другу лишь внутри пары, а вне этого могут сочетаться. Если все элементы, образующие структуру, однотипны (например – целые числа или символы), то структура является однородной; если же в ней «перепутаны» элементы разной природы (например, числа чередуются с символами), то неоднородной. Структуру называют упорядоченной, если между ее элементами определен порядок следования. Примером упорядоченной математической структуры служит числовая последовательность, в которой у каждого элемента (кроме первого) есть предыдущий и последующий. Наличие индекса в записи элементов структуры уже указывает на ее упорядоченность (хотя индекс для этого не является обязательным признаком). По способу доступа упорядоченные структуры бывают прямого и последовательного доступа. При прямом доступе каждый элемент структуры доступен пользователю в любой момент независимо от других элементов. Глядя на линейную таблицу чисел мы можем списать или заменить сразу, допустим, десятый элемент. Однако, если эта таблица не на бумаге, а, скажем, каким-то образом записана на магнитофонную ленту, то сразу десятое число нам недоступно – надо сначала извлечь девять предшествующих. В последнем случае мы имеем дело с последовательным доступом. Если у структуры размер (длина, количество элементов) не может быть изменен «на ходу», а фиксирован заранее, то такую структуру называют статической. Программные средства информатики иногда позволяют не фиксировать размер структуры, а устанавливать его по ходу решения задачи и менять при необходимости, что бывает очень удобно. Такую структуру называют динамической. Например, при описании закономерностей движения очереди в магазине мы не знаем заранее, сколько человек в ней будет в тот или иной момент, и соответствующую структуру данных (например, список фамилий участников очереди) лучше представлять динамической. Массивы Самым традиционным и широко известным из структурированных типов данных является массив (иначе называемый регулярным типом) – однородная упорядоченная статическая структура прямого доступа.
Матрица — это двумерный массив, каждый элемент которого имеет два индекса: номер строки и номер столбца, поэтому для работы с элементами матрицы необходимо использовать два цикла. Если значениями параметра первого цикла будут номера строк матрицы, то значениями параметрами второго — столбцы (или наоборот). Обработка матрицы заключается в том, что вначале поочередно рассматриваются элементы первой строки (столбца), затем второй и т.д. до последней.
Транспонирование матрицы:
#include<iostream.h>
#include<conio.h>
Const int n=5, m=4;
Void input (int w[n][m]){
Cout<<”input matrix\n”;
For (int i=0; i<n; i++){
For (int j=0; j<m; j++)
Cin>>w[i][j];}}
Void Transp(int w[n][m]){
Int i, j;
for(i=1; i<n; i++)
for(j=0; j<i; j++)
w[i][j]=w[j][i];
}
Void main(){
Int A[n][m];
Input(A); Transp(A);}
Создание единичной матрицы:
#include <cstring>
using namespace std;
void main()
{
int n = 0,i,j;
cout <<"Введите размер массива";
cin >> n;
int **a = new int* [n];
for ( i = 0; i < n; i++)
{
a[i] = new int [n];
}
for ( i = 0; i < n; i++)
for ( j = 0; j < n; j++)
if (i == j )
a[i][j] = 1;
for ( i = 0; i < n; i++)
{
for ( j = 0; j < n; j++)cout << a[i][j]; cout<<endl;}
}
else
a[i][j] = 0;
cout <<0"\n";
Билет 29
Большие возможности заключают в себе структурированные данные, определяемые разработчиком программы (в пределах возможностей используемого им языка программирования). К структурированию данных разработчика программы толкает как логика прикладной задачи, так и чисто утилитарное соображение: при наличии в задаче большого количества входных и выходных данных отдельное именование каждого из них может оказаться практически невозможным. Разумеется, действия разработчика алгоритма и программы ограничены возможностями того языка программирования, на который он ориентируется. В разных языках возможности структуризации переменных на уровне сложных структур не совпадают, но многие структуры давно стали традиционными и реализованы в большинстве практически используемых языков программирования. Структурированные типы данных классифицируют по следующим основным признакам: однородная – неоднородная, упорядоченная – неупорядоченная, прямой доступ – последовательный доступ, статическая – динамическая. Эти признаки противостоят друг другу лишь внутри пары, а вне этого могут сочетаться. Если все элементы, образующие структуру, однотипны (например – целые числа или символы), то структура является однородной; если же в ней «перепутаны» элементы разной природы (например, числа чередуются с символами), то неоднородной. Структуру называют упорядоченной, если между ее элементами определен порядок следования. Примером упорядоченной математической структуры служит числовая последовательность, в которой у каждого элемента (кроме первого) есть предыдущий и последующий. Наличие индекса в записи элементов структуры уже указывает на ее упорядоченность (хотя индекс для этого не является обязательным признаком). По способу доступа упорядоченные структуры бывают прямого и последовательного доступа. При прямом доступе каждый элемент структуры доступен пользователю в любой момент независимо от других элементов. Глядя на линейную таблицу чисел мы можем списать или заменить сразу, допустим, десятый элемент. Однако, если эта таблица не на бумаге, а, скажем, каким-то образом записана на магнитофонную ленту, то сразу десятое число нам недоступно – надо сначала извлечь девять предшествующих. В последнем случае мы имеем дело с последовательным доступом. Если у структуры размер (длина, количество элементов) не может быть изменен «на ходу», а фиксирован заранее, то такую структуру называют статической. Программные средства информатики иногда позволяют не фиксировать размер структуры, а устанавливать его по ходу решения задачи и менять при необходимости, что бывает очень удобно. Такую структуру называют динамической. Например, при описании закономерностей движения очереди в магазине мы не знаем заранее, сколько человек в ней будет в тот или иной момент, и соответствующую структуру данных (например, список фамилий участников очереди) лучше представлять динамической. Массивы Самым традиционным и широко известным из структурированных типов данных является массив (иначе называемый регулярным типом) – однородная упорядоченная статическая структура прямого доступа.
Матрица — это двумерный массив, каждый элемент которого имеет два индекса: номер строки и номер столбца, поэтому для работы с элементами матрицы необходимо использовать два цикла. Если значениями параметра первого цикла будут номера строк матрицы, то значениями параметрами второго — столбцы (или наоборот). Обработка матрицы заключается в том, что вначале поочередно рассматриваются элементы первой строки (столбца), затем второй и т.д. до последней.
Преобразование матрицы в одномерный массив:
#include <iostream.h>
#include <conio.h>
using namespace std;
int main()
{
cout<<"Введите количество строк ";
int n,m;
cin>>n; cout<<"Введите количество столбоц ";cin>>m;
int**w=new int*[n];
for(int i=0; i<n; i++)
{ w[i]=new int[n];
for(int j=0; j<m; j++)
cin>>w[i][j];}
int *mass_odnom=new int[n][m];
int k=0;
cout<<endl<<"одномерный массив: ";
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
mass_odnom[k]=w[i][j];
cout<<mass_odnom[k]<<" ";
k++;
}
}
cout<<endl;
return 0;
}
Билет 30.
Динамические матрицы
Объем памяти, выделяемой под динамическую матрицу, определяется на этапе выполнения программы. Размеры матрицы представляются переменной или (в общем случае) целым выражением либо приводимым к нему.
Пример универсального и безопасного выделения памяти под матрицу
int n, m;
cout << “Введите размеры матрицы\n”;
cin >> n >> m;
float **A = new float* [n];
for (int i = 0; i < n; i++)
A[i] = new float[m];
В этом случае создается переменная A – указатель на float*, в динамической памяти отводится непрерывная область, достаточная для размещения n указателей вещественного типа, и адрес ее начала записывается в указатель A. Затем в цикле поочередно выделяются по m ячеек под очередную строку и указатель на эту строку заносится в A[i].
Динамические массивы нельзя при создании инициализировать.
Для доступа к элементу динамической матрицы указываются все его индексы, например, A[i][j], или более экзотическим способом: *(A [i]+j) или *(*(A+i)+j). Это возможно, поскольку A[i] является адресом начала i-й строки массива.
Пример динамической:
Статические матрицы
Память под статические матрицы выделяется на этапе компиляции. Компилятор должен точно знать, сколько выделить. Размеры матрицы вместе с типом ее элементов определяют объем памяти, необходимый для размещения матрицы.
Поскольку выделение памяти осуществляется на этапе компиляции, размерность может быть задана только целой положительной константой или константным выражением.
Память под статическую матрицу выделяется в сегменте данных и сохраняется за ней до конца работы программы.
const int n = 4,m = 5;
int matr [n][m];
Данный фрагмент кода задает описание двумерного массива из четырех строк и пяти столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Многомерные массивы размещаются так, что при переходе к следующему элементу быстрее вссего изменяется последний индекс. Для доступа к элементу многомерного массива указываются все его индексы, например, matr[i][j].
При инициализации многомерного массива он представляется либо как массив из массивов, при этом каждый массив заключается в свои фигурные скобки (в этом случае размерности при описании можно не указывать), либо задается общий список элементов в том порядке, в котором элементы располагаются в памяти:
int matr1 [][]={{(1, 1}, {0, 2}, {1, 0}};
int matr2 [3][2]={1, 1, 0, 2, 1, 0};
В приведенном примере две созданные и инициализированные матрицы будут друг другу подобны. Обе матрицы будут состоять из трех строк и двух столбцов и заполнены одинаковыми элементами.
Билет 31.
