- •Государственный технический университет - Обнинский институт атомной энергетики е.А.Виноградова а.Г.Царина Программирование на языках высокого уровня.
- •Содержание
- •Введение. Подготовка и решение задач на компьютере.
- •Алгоритмы.
- •Основные свойства.
- •2.2 Способы представления алгоритмов.
- •2.3 Базовые структуры алгоритмов.
- •2.3.1 Линейная структура.
- •2.3.3.2. Цикл с постусловием:
- •Типы данных.
- •3.1 Базовые типы данных.
- •2.3.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. Алгоритмы поиска и сортировки.
7.1. Последовательный поиск в неупорядоченном массиве.
Дано :
A[n]- массив целых чисел,
х -вещественное число.
Определить, есть ли в вещественном массиве А элемент, совпадающий с заданным значением х.
Выполняем последовательное сравнение элементов массива А с заданным значением x до тех пор, пока либо элемент массива совпадет с x, либо пройдем весь массив и поиск закончится безуспешно.
Вариант 1.(Используем цикл с параметром 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();}
7.2 Последовательный поиск c барьером.
В предыдущей программе используется алгоритм линейного поиска в массиве. Инварианта цикла содержит два условия. Упростим инварианту цикла. При этом существенно сократится количество операций(n операций сравнения в случае неудачного поиска). Предлагается алгоритм “поиск с барьером”.
Добавим в массив один элемент – барьер (An), и перед началом поиска поместим Х в "барьер". При этом отпадает необходимость использовать в заголовке цикла условие (i<n).
Вариант 1.(Используем цикл с параметром for)
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();}
7.3 Дихотомический поиск в упорядоченом массиве.
Определить, найдется ли в заданном упорядоченном целочисленном массиве элемент, равный заданному числу Х. Пусть массив упорядочен по возрастанию.
Можно при этом использовать любой из вышеописаных алгоритмов.
Однако предложим более эффективный алгоритм поиска. Используем алгоритм двоичного поиска. Суть его в следующем:
1)пусть L, R –левый и правый концы секции массива , где еще может быть обнаружен Х.Для начала – L=0, R=n-1
2) определить индекс серединного элемента m ( m=(L+R) / 2)
3) Если х>a[m], то поиск сузить до правого интервала(L=m+1),
иначе - до левого(R=m).
4)если L<=R перейти к пункту 2.
include <iostream.h>
#include <conio.h>
const int n=15;
void main(){
int A[n],x;
int 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; //сузить поиск до левого
else F=0; //нашли
}
if(F) cout<<”\n нет такого в массиве\n”;
else
cout<<”\n номер первого элемента, совпадающего с заданным ”<<m;
}
