
- •Государственный технический университет - Обнинский институт атомной энергетики е.А.Виноградова а.Г.Царина Программирование на языках высокого уровня.
- •Содержание
- •Введение. Подготовка и решение задач на компьютере.
- •Алгоритмы.
- •Основные свойства.
- •2.2 Способы представления алгоритмов.
- •2.3 Базовые структуры алгоритмов.
- •2.3.1 Линейная структура.
- •2.3.3.1. Цикл с предусловием:
- •2.3.3.2. Цикл с постусловием:
- •Типы данных.
- •3.1 Базовые типы данных.
- •Целый тип (int)
- •Символьный тип (char)
- •Расширенный символьный тип (wchar_t)
- •Логический тип (bool)
- •Типы с плавающей точкой (float, double и long double)
- •3.2 Переменные.
- •3.3 Ссылки.
- •3.4 Указатели.
- •3.3 Выражения.
- •3.3 .1 Операции.
- •4. Реализация базовых структур алгоритмов в языке с.
- •4.1 Оператор присвавания
- •4.2 Оператор «выражение»
- •4.3 Операторы ветвления
- •4.3.1 Условный оператор .
- •4.3.2. Оператор switch.
- •4.4 Операторы цикла
- •4.4.1 Циклы с предусловием
- •4.4.1.1 Цикл for.
- •4.4.1.2 Цикл с условием (while)
- •4.4.1 .3 Цикл с постусловием (do while)
- •5. Функции. Основные понятия
- •Определение функции
- •Рекурсивные функции.
- •Одномерные массивы.
- •6.1 Статические массивы.
- •6.2 Динамические массивы.
- •6.2.2 Функции преобразования динамических массивов.
- •7. Алгоритмы поиска и сортировки.
- •7.2 Последовательный поиск c барьером.
- •7.3 Дихотомический поиск в упорядоченом массиве.
- •7.4 Cортировка массивов.
- •7.4.1 Обменная сортировка (метод пузырька)
- •7.4.2 Метод "простой выбор".
- •7.4.3 Сортировка "прямое включение"
- •8 . Матрицы
- •8.1 Статические матрицы.
- •8.2 Динамические матрицы.
- •9. Строки в с.
- •1. Длина строки – strlen.
- •3. Копирование строк.
- •4. Объединение строк.
- •5. Поиск в строках
- •10. Cтруктуры.
8.2 Динамические матрицы.
Объем памяти, выделяемой под динамическую матрицу, определяется на этапе выполнения программы.
Размеры матрицы представляются переменной или(в общем случае)целым выражением(или приводимым к нему).
Пример универсального и безопасного выделения памяти под матрицу.
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-й строки массива.
8.2.1 Практическая работа с динамическими матрицами.
Размеры матрицы и матрица вводятся с клавиатуры.
Пример 1. В заданной матрице поменять местами строки с максимальной и минимальной суммой элементов
#include<iostream.h>
#include<iomanip.h>
#include<limits.h>
#include<conio.h>
int** input(int& n,int &m)
{int i,j;
cout<<" введите размеры матрицы \n";
cin>>n>>m;
int** w=new int*[n];
cout<<"введите "<<n<<" строк по "<<m<<" элем\n";
for( i=0;i<p;i++){
w[i]=new int[m];
for( j=0;j<m;j++)
cin>>w[i][j];
}
return w;
}
//----------------------------------------
void output(int** w,int n,int m, char title[])
{ cout<<title;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<setw(4)<<w[i][j]<<' ';
cout<<endl;
}
}
//-----------------------------------------------
void change(int** w,int n,int m)
{
int i,j,maxSum=INT_MIN,minSum=INT_MAX,Imin,Imax,Sum,z;
for(int i=0;i<n;i++)
{ Sum=0;
for(int j=0;j<m;j++)
Sum+=w[i][j];
if(Sum>maxSum){maxSum=Sum;Imax=i;}
if(Sum<minSum) {minSum=Sum;Imin=i;}
}
for(int j=0;j<m;j++)
{z=w[Imin][j]; w[Imin][j]= w[Imax][j]; w[Imax][j]=z;}
}
//-------------------------------------------------
void main()
{ int n,m;
clrscr();
int**a= input(n,m);
output(a,n,m,"\n исходная матрица\n");
change(a,n,m);
output(a,n,m,"\n измененная матрица\n");
getch();
}
Пример 2. Отсортировать в порядке возрастания те строки матрицы, которые начинаются с отрицательного элемента. Использовать функцию сортировки одномерного массива.
#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
//-----------------------------
void sort(int *w,int m)
{ int k,j,Nmin,z;
for (j=0;j<m-1;j++)
{ Nmin=j;
for (k=j+1;k<m;k++)
if (w[k]<w[Nmin]) Nmin=k;
z=w[j];
w[j]=w[Nmin];
w[Nmin]=z ;
}}
//-----------------------------------------------
int** input(int& n,int &m)
{
cout<<" введите размеры матрицы \n";
cin>>n>>m;
int** w=new int*[n];
cout<<"введите "<<n<<" строк по "<<m<<" элем\n";
for( int i=0;i<p;i++){
w[i]=new int[m];
for(int j=0;j<m;j++)
cin>>w[i][j];
}
return w;
}
//----------------------------------------
void output(int** w,int n,int m, char title[])
{ cout<<title;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<setw(4)<<w[i][j]<<' ';
cout<<endl;
}
}
void main()
{ clrscr();
int i,n,m;
int**a=input(n,m);
for( i=0;i<n;i++)
if(a[i][0]<0) sort(a[i],m);
output(a,n,m,"\n измененная матрица \n");
getch();
}
Пример 3.
Вычислить p=a*b+с*d, где a,b,c,d-матрицы размером n*n.
В функция MULT выполняет умножение двух матриц z=x*y,
при этом :
zij
=
#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
int** make(int n) //выделение памяти под матрицу
{ int** w =new int*[n];
for( int i=0;i<n;i++)
w[i]=new int[n];
return w;
}
//--------------------------------------
int** input(int n) //заполнение матрицы
{ int**w=make(n);
for( int i=0;i<n;i++){
for(int j=0;j<n;j++)
cin>>w[i][j];
}
return w; }
//----------------------------------------
void output(int** w,int n, char title[]) //вывод матрицы
{ cout<<title;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout<<setw(4)<<w[i][j]<<' ';
cout<<endl;
}
}
//------------------------------------------
void MULT(int** x, int** y, int** z, int n) //умножение матриц z=x*y
{ int sum;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{sum=0;
for(k=0;k<n;k++)
sum+=x[i][k]*y[k][j];
z[i][j]=sum;
}
}
int main()
{ clrscr();
int i,j,n;
cout<<”введите n”;
cin>>n;
int**a=input(n),**b=input(n),**c=input(n),**d=input(n);
int**p=make(n),**t=make(n);
MULT(a,b,p,n);
MULT(c,d,t,n);
for( i=0;i<n;i++)
for(j=0;j<n;j++)
p[i][j]+=t[i][j];
output(p,n,"\n РЕЗУЛЬТАТ: \n");
getch();
}