
- •Государственный технический университет - Обнинский институт атомной энергетики е.А.Виноградова а.Г.Царина Программирование на языках высокого уровня.
- •Содержание
- •Введение. Подготовка и решение задач на компьютере.
- •Алгоритмы.
- •Основные свойства.
- •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труктуры.
Рекурсивные функции.
Прямая рекурсия- функция вызывает саму себя.
Косвенная рекурсия-
функция вызывает другую функцию, а та,
в свою очередь, исходную. Пример.
Вычислить значение
=
#include<iostream.h>
long Fact(int k)
{ if (k<=1)return 1; else return k*Fact(k-1); }
int main(){
int n,m;
cout<<”\nвведите n,m\n”;
cin>>n>>m;
cout<<”C=”<<Fact(n)/(Fact(m)*Fact(n-m));
return 0;}
Одномерные массивы.
Как правило, мы оперируем с последовательностями данных. Большие по объему последовательности можно расположить на долгосрочное хранение во внешней памяти в виде файла.
Сравнительно небольшие по объему последовательности, используемые для оперативной обработки, помещаются в оперативную память.
Один из вариантов организации последовательностей данных в оперативной памяти - массив.
Массив - это структурированный тип для резервирования в памяти места под определенное количество однородных элементов.
Другими словами: конечная именованная последовательность однотипных величин в оперативной памяти называется массивом.
6.1 Статические массивы.
Описание массива в программе:
<тип элем.><имя_массива> [размер];
Память под статические массивы выделяется на этапе компиляции. Компилятор должен точно знать, сколько выделить. Размер массива вместе с типом его элементов определяет объем памяти, необходимый для размещения массива.
Поскольку выделение памяти осуществляется на этапе компиляции, размерность может быть задана только целой положительной константой или константным выражением.
Память под статический массив выделяется в сегменте данных, и сохраняется за ним до конца работы программы.
Объем массива ограничивается размером сегмента данных.
Обратите внимание!
Элементы массива нумеруются, начиная с нуля, последний элемент массива имеет номер, на единицу меньший размера, заданного при его описании.
Размерность массивов предпочтительнее задавать с помощью именованных констант, как это сделано в примере, поскольку при таком подходе для ее изменения достаточно скорректировать значение константы всего лишь в одном месте программы.
Пример объявления массива:
const int n=10;
int A[n];
Под массив А выделяется память из 10*sizeof(int) байт.
Для доступа к элементу массива после его имени указывается номер элемента (индекс) в квадратных скобках.
Имена элементов массива: A[0], A[1],........A[n-1].
Если при описании массива не указан размер, должен присутствовать инициализатор, в этом случае компилятор выделит память по количеству инициализирующих значений. В дальнейшем мы увидим, что размер может быть опущен также в списке формальных параметров.
Инициализирующие значения для массивов записываются в фигурных скобках. Значения элементам присваиваются по порядку. Если элементов в массиве больше, чем инициализаторов, элементы, для которых значения не указаны, обнуляются:
int b[5] = {3, 2, 1}: // b[0]=3, b[1]=2, b[2]=1, b[3]=0, b[4]=0
__________________________________________________________________________
ВНИМАНИЕ
При обращении к элементам массива автоматический контроль выхода индекса за границу массива не производится, что может привести к ошибкам.
______________________________________________________________________________
Алгоритмы, с помощью которых обрабатываются одномерные массивы, очень похожи на обработку последовательностей внешней памяти (файлов). Отличие заключается в том, что в массиве одновременно доступны все его компоненты. Такой доступ называется параллельным.
Пример 1.
Для заданного целочисленного массива А определить наибольший элемент и его порядковый номер. Если таких элементов несколько, то определить порядковый номер первого из них.
#include <iostream.h>
#include <conio.h>
#include <limits.h>
const int n=15;
int main(){
int A[n], i, max, Nmax;
clrscr();
cout<<"\n введите "<<n<<" элементов\n";
for ( i=0;i<n;i++)
cin>>A[i];
max=INT_MIN;
for (i=0;i<n;i++)
if (A[i]>max]) {max=A[i]; Nmax=i;}
cout<<" \n наибольшее значение в массиве= "<<max;
cout<<" \n номер наибольшего= "<<Nmax;
getch();return 0;
}
Пример 2.
Вычислить значение многочлена
A0Xn+A1Xn-1+A2Xn-2+...+An-1X+An в заданной точке Х по схеме Горнера. Последовательность действий по схеме Горнера:
((((A0X+A1)X+A2)X+A3) Х...+An-1)X+An. Результат поместить в Y.
#include <iostream.h>
#include <conio.h>
const int n=15;
int main(){
float A[n+1],x,y;
int i;
clrscr();
cout<<"\n введите "<<n+1<<" элементов\n";
for ( i=0;i<=n;i++)
cin>>A[i];
y=0;
for (i=0;i<=n;i++)
y=y*x+A[i];
cout<<" \n Значение многочлена= "<<y;
getch();}
Пример 3.
Напечатать номера всех отрицательных элементов массива А.
include <iostream.h>
#include <conio.h>
const int n=15;
int main(){
float A[n]
int i;
clrscr();
cout<<"\n введите "<<n<<" элементов\n";
for ( i=0;i<n;i++)
cin>>A[i];
cout<<”\n номера отрицательных элементов\n”;
for (i=0;i<n;i++)
if(A[i]<0) cout<<i<<’ ‘;
getch();return 0;
}
Пример 4.
Напечатать номер первого отрицательного элемента массива А.
В случае неудачного поиска мы выполняем n сравнений. Если в массиве есть отрицательные, то количество шагов меньше или равно n, точное количество шагов заранее не известно.
Вариант 1. (Используем цикл с параметром (FOR))
include <iostream.h>
#include <conio.h>
const int n=15;
void main(){
float A[n]
int i;
clrscr();
cout<<"\n введите "<<n<<" элементов\n";
for ( i=0;i<n;i++)
cin>>A[i];
for (i=0; i<n&&A[i]>=0;i++);
if(i==n) cout<<”\n нет отрицательных\n”;
else
cout<<”\n номер первого отрицательного элемента=”<<i;
getch();return 0;}
Вариант 2. (Используем цикл while)
include <iostream.h>
#include <conio.h>
const int n=15;
void main(){
float A[n]
int i;
clrscr();
cout<<"\n введите "<<n<<" элементов\n";
for ( i=0;i<n;i++)
cin>>A[i];
i=0;
while( i<n&&A[i]>=0)
i++;
if(i==n) cout<<”\n нет отрицательных\n”;
else
cout<<”\n номер первого отрицательного элемента=”<<i;
getch();}