
- •Государственный технический университет - Обнинский институт атомной энергетики е.А.Виноградова а.Г.Царина Программирование на языках высокого уровня.
- •Содержание
- •Введение. Подготовка и решение задач на компьютере.
- •Алгоритмы.
- •Основные свойства.
- •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труктуры.
6.2 Динамические массивы.
Преимущество динамических массивов состоит в том, что их размер представляется переменной или(в общем случае)целым выражением(или приводимым к нему). То есть, объем памяти, выделяемой под массив, определяется на этапе выполнения программы.
Динамические массивы создают с помощью операции new, при этом необходимо указать тип и размерность, например:
int n;
cout<<”Введите размер массива\n”;
cin>>n;
float *A = new float [n];
В этом случае создается переменная-указатель на float, в динамической памяти отводится непрерывная область, достаточная для размещения n элементов вещественного типа, и адрес ее начала записывается в указатель A. Динамические массивы нельзя при создании инициализировать.
C элементами массива можно работать при помощи индекса (A[i]) и при помощи указателя( к i-тому элементу массива можно обратиться, используя выражение *(A+i).
Например. Вычисление суммы элементов массива можно оформить :
float sum=0;
for(i=0;i<n;i++) sum+=A[i];
float sum=0;
for(i=0;i<n;i++) sum+=*(A+i);
6.2.1 Примеры работы с динамическими массивами.
Размер массива и массив вводятся с клавиатуры.
Пример 1. Выполнить циклический сдвиг массива влево на одну позицию
Исходный массив:
A0,A1,A2,…,An-1
После сдвига
A1,A2,...An-1, A0
Алгоритм :
1) запомнить в z A0;
2) сдвинуть влево на 1 позицию A1 ,A2 ,...An-1;
3) в последний элемент записать копию первого.
#include <iostream.h>
#include <conio.h>
int *input(int &n)
{ cout<<”\n введите размер массива \n”;
cin>>n;
int* w=new int[n]; cout<<"\nвведите “,n,” элементов массива\n”; for(i=0;i<n;i++)
cin>>w[i];
return w;
}
void output(int *w,int n,char message[])
{
cout<<message;
for(int i=0;i<n;i++)
cout<<' '<<w[i];
cout<<endl;
}
void shift(int*x,int n)
{int z=x[0];
for ( i=1;i<n;i++)
x[i-1]=x[i];
x[n-1]=z;
}
int main(){
int n; clrscr();
int*A= input(n);
shift(A,n);
output(A,n,"\nмассив после сдвига\n" ;
return 0;
}
6.2.2 Функции преобразования динамических массивов.
1. Проверить, является ли массив упорядоченным по возрастанию.
bool prov(int *A,int n)
{ int i;
for ( i=0;i<n-1&&A[i]<=A[i+1];i++);
if (i==n-1)return true; else return false;
}
2. Выполнить циклический сдвиг массива вправо на одну позицию
Исходный массив:
A0,A1,A2,…,An-1
После сдвига
An-1, A0, A1,A2,...,An –2
Действия :
запомнить в z An-1
сдвинуть вправо на 1 позицию A0,A1,...,An-2; cдвиг начать с Аn-2
в первый элемент записать копию последнего
void shift_R(int *w,int n)
{ z=A[n-1];
for(i=n-2;i>=0;i--)
A[i+1]=A[i];
A[0]=z;
}
3. Элемент с заданным номером k исключить из массива.
Исходный массив:
Исходный массив:
A0, A1, A2,…,Ak-1, Ak, Ak+1,...,An-1
После сдвига
A0, A1, A2,…,Ak-1, Ak+1,...,An-1, 0
Действия :
1) сдвинуть влево на 1 позицию Ak+1, Ak+2,…,An-1; начать сдвиг с позиции k+1
2) в последний элемент записать 0
void del(int *A,int n,int k)
{
for(i=k+1;i<n;i++)
A[i-1]=A[i];
A[n-1]=0;
}
4. Элемент с заданным номером k сдвинуть в конец массива.
Исходный массив:
A0, A1, A2,…,Ak-1, Ak, Ak+1,...,An-1
После сдвига
A0, A1, A2,…,Ak-1, Ak+1,...,An-1, Ak
Действия :
запомнить в z Ak
сдвинуть влево на 1 позицию Ak+1, Ak+2,...,An-1; начать сдвиг с позиции k+1
в последний элемент записать копию Ak
void shift_End(int *A,int n,int k)
{z=A[k];
for(i=k+1;i<n;i++)
A[i-1]=A[i];
A[n-1]=z;
}
5. Элемент с заданным номером k сдвинуть в начало массива.
Исходный массив:
A0, A1, A2,…,Ak-1, Ak, Ak+1,...,An-1
После сдвига
Ak, A0, A1, A2,…,Ak-1, Ak+1,...,An-1
Действия :
запомнить в z Ak
сдвинуть вправо на 1 позицию A0, A1,...,Ak-1; начать сдвиг с позиции k-1
в первый элемент записать копию Ak
void shift_Beg(int *A,int n,int k)
{ z=A[k];
for (i=k-1;i>=0;i--)
A[i+1]=A[i];
A[0]=z;
}
_________________________________________________
Эффективный алгоритм исключения всех отрицательных.
void del(int *A,int n)
{ int k=0; {количество отрицательных}
for (i=0;i<n;i++)
if (A[i]<0) k++; else A[i-k]=A[i];
for (i=n-k;i<n;i++)
A[i]=0;
}
___________________________________________________________