
- •Государственный технический университет - Обнинский институт атомной энергетики е.А.Виноградова а.Г.Царина Программирование на языках высокого уровня.
- •Содержание
- •Введение. Подготовка и решение задач на компьютере.
- •Алгоритмы.
- •Основные свойства.
- •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труктуры.
7.4 Cортировка массивов.
Cортировку следует понимать как процесс перегруппировки элементов массива в некотором определенном порядке. Цель сортировки – облегчить последующий поиск элементов в таком отсортированном массиве. Алгоритмы сортировки относятся к фундаментальным алгоритмам программирования.
Порядок сортировки:
по возрастанию элементов: (a[i]<a[i+1], для i=0, 1, …,n-2)
по убыванию элементов: (a[i]>a[i+1], для i=0, 1, …,n-2)
по невозрастанию элементов: (a[i]>=a[i+1], для i=0, 1, …,n-2)
по неубыванию элементов: (a[i]<=a[i+1], для i=0, 1, …,n-2)
Рассмотрим три базовых сортировки.
Сравнительные характеристики этих сортировок можно(нужно) прочитать в книге Н.Вирт “Алгоритмы и структуры данных”( Это содержание одной из самостоятельных работ.)
7.4.1 Обменная сортировка (метод пузырька)
Пузырьковая сортировка относится к классу обменных сортировок. Проходя по массиву, сравниваем два соседних элемента. Если они неупорядочены – меняем местами. В результате первого прохода наибольший переходит в последнюю позицию ("тяжелый пузырек всплывает наверх").
Повторяем проходы (n-1) раз, сокращая каждый раз длину прохода на один шаг.
void sort_1(int *a,int n)
{ int i,j,x;
for ( i=1;i<n;i++)
for ( j=0;j<n-i;j++)
if(a[j]>a[j+1]){x=a[j];a[j]=a[j+1];a[j+1]=x;}
}
7.4.2 Метод "простой выбор".
Суть метода заключается в следующем.
Находим наименьшее во всем массиве - ставим на первое место, а первый на место наименьшего, далее находим наименьшее среди всех, кроме первого, и меняем местами со вторым; затем наименьшее среди оставшихся 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 ; }}
7.4.3 Сортировка "прямое включение"
При каждом шаге, начиная с i=1, берем элемент a[i] и сдвигаем его влево на надлежащее ему место. В исходной позиции слева от него - уже упорядоченая подпоследовательность. При движении элемента влево, предшествующие ему- сдвигаются вправо. Двигаем влево, пока наш элемент меньше текущего.
Метод:
Суть метода - кратко:
for (i=1; i< n;i++)
{
x=a[i];
включение х на надлежащее место в ряду a[0],a[2],..a[i]
}
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;}}
8 . Матрицы
8.1 Статические матрицы.
Описание матрицы в программе:
<тип элем.><имя_матрицы> [количество строк] [количество столбцов];
Память под статические матрицы выделяется на этапе компиляции. Компилятор должен точно знать, сколько выделить. Размеры матрицы вместе с типом ее элементов определяют объем памяти, необходимый для размещения матрицы.
Поскольку выделение памяти осуществляется на этапе компиляции, размерность может быть задана только целой положительной константой или константным выражением.
Память под статическую матрицу выделяется в сегменте данных, и сохраняется за ней до конца работы программы.
const int n=4,m-5;
int matr [n][m];
задает описание двумерного массива из 4 строк и 5 столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Многомерные массивы размещаются так, что при переходе к следующему элементу быстрее нсего изменяется последний индекс. Для доступа к элементу многомерного массива указываются все его индексы, например, matr[i][j] .
При инициализации многомерного массива он представляется либо как массив из массивов, при этом каждый массив заключается в свои фигурные скобки (в этом случае размерности при описании можно не указывать), либо задается общий список элементов в том порядке, в котором элементы располагаются в памяти:
int matr2 [][]={ {(1, 1}, {0, 2}, {1, 0} };
int matr2 [3][2]={1, 1, 0, 2, 1, 0};
Стандартные варианты обхода матрицы.
Обход матрицы по строкам.
_________________________
……………………………… for (i = 0; i<n; i++)
_________________________ for (j = 0; j<m; j++)
Ai,0 Ai,1 Ai,2……………….Ai,m-1 …..A[i][j]….
_________________________
Обход матрицы по столбцам.
| | | A0,j | for (j = 0; j<m; j++)
| | | A1,j | for (i = 0; i<n; i++)
| | | A2,j | …..A[i][j]…..
| | | |
| | | An-1,j |
Пример 1. Дана матрица А. В порядке обхода по строкам определить наибольший элемент матрицы, а также его индексы (если наибольший повторяется , то индексы первого из них).
#include <iostream.h>
#include <iomanip.h>
#include <limits.h>
#include <conio.h>
const int n=4,m=5;
int main(){
int i,j,max,Imax,Jmax ,a[n][m];
cout<<" введите "<<n<<" строк по "<<m<<”элементов\n”;
for ( i=0;i<n;i++)
for ( j=0;j<m;j++)
cin>>a[i][j];
cout<<" \n \n исходная матрица \n";
for ( i=0;i<n;i++)
{
for ( j=0;j<n;j++)
cout<<setw(4)<<a[i][j]<<’ ‘;
cout<<"\n";
}
max=INT_MIN;
for ( i=0;i<n;i++)
for ( j=0;j<m;j++)
if (a[i][j]>max) {max=a[i][j]; Imax=i;Jmax=j;}
cout<<" \n\n MAX="<<max<<" Imax=”<<Imax<<” Jmax=”<<Jmax<<”\n" ;
getch();
}
Пример 2. Дана матрица А. В каждой строке определить наибольший элемент также его порядковый номер в строке(если наибольший повторяется , то номер первого из них).
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
const int n=4,m=5;
int main(){
int i,j,max,Jmax ,a[n][m];
cout<<" введите "<<n<<" строк по "<<m<<”элементов\n”;
for ( i=0;i<n;i++)
for ( j=0;j<m;j++)
cin>>a[i][j];
for ( i=0;i<n;i++)
{ max= INT_MIN;
for ( j=0;j<m;j++)
if (a[i][j]>max) {max=a[i][j];Jmax=j;}
cout<<" \n строка “<<i<<” MAX="<<max<<” Jmax=”<<Jmax<<”\n" ;
}
getch();
}
Пример 3. Дана матрица А. Напечатать номера столбцов, упорядоченных по возрастанию элементов.
#include <iostream.h>
# #include <conio.h>
const int n=4,m=5;
int main(){
int i,j ,a[n][m];
cout<<" введите "<<n<<" строк по "<<m<<”элементов\n”;
for ( i=0;i<n;i++)
for ( j=0;j<m;j++)
cin>>a[i][j];
cout<<”\nНомера упорядоченных столбцов\n”;
int f=1;
for ( j=0;j<m;j++)
{ for ( i=0;i<n-1&& (a[i][j]<a[i+1][j]; i++);
if(i==n-1) {cout<<" “<<j ;f=0;}
}
if(f) cout<<”таких столбцов нет\n”;
getch();}
Пример 4. Замечательные линии в матрице.
Дана квадратная матрица A[n][n]. Линия, соединяющая левый верхний и правый нижний углы, называется главной диагональю. Линия, соединяющая правый верхний и левый нижний углы, называется побочной диагональю.
Пример 4.1 Для каждой строки вывести на экран элемент, стоящий на пересечении строки и главной диагонали
for ( i=0;i<n;i++)
cout<<A[i][i]<<endl;
Пример 4.2 Для каждой строки вывести на экран элемент, стоящий на пересечении строки и побочной диагонали
for ( i=0;i<n;i++)
cout<<A[i][n-i-1]<<endl;
Пример 4. 3 Поменять местами элементы, симметричные относительно главной диагонали
#include<iostream.h>
#include<iomanip.h>
#include<conio.h>
const int n=5;
void input(int w[n][n])
{int i,j;
cout<<"input "<<n<<" strok "<<m<<" elem\n";
for( i=0;i<n;i++)
for( j=0;j<n;j++)
cin>>w[i][j];
}
//----------------------------------------
void output(int w[n][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 change_1(int w[n][n])
{ for(int i=1;i<n;i++)
for(int j=0;j<i;j++)
{z=w[i][j];
w[i][j]= w[j][i];
w[j][i]=max;
}
}
int main()
{ int A[n][n];
clrscr();
input(A);
output(A,"\n ishodnaya A\n");
change_1(A);
output(a,"\n izmenen A\n");
getch();
}
Пример 4.4 Функция, меняющая местами элементы, симметричные относительно побочной диагонали.
void change_2(int w[n][n])
{ for(int i=0; i<n-1; i++)
for(int j=0; j<n-i-1; j++)
{z=w[i][j];
w[i][j]= w[n-j-1][n-i-1];
w[j][i]=max;
}
}