- •Цели программирования.
- •Уровни языков программирования. Языки ассемблера (история возникновения, отличительные особенности, пример языков).
- •Уровни языков программирования. Языки высокого уровня (история возникновения, отличительные особенности, пример языков).
- •Методы реализации программ. Компиляция (схема получения результата из исходного кода, преимущества и недостатки, сравнительная таблица).
- •Методы реализации программ. Интерпретация (схема получения результата из исходного кода, преимущества и недостатки, сравнительная таблица).
- •Методы реализации программ. Смешанная реализация (схема получения результата из исходного кода, преимущества и недостатки, сравнительная таблица).
- •Методы реализации программ. Трансляция (схема получения результата из исходного кода, преимущества и недостатки, сравнительная таблица).
- •Жизненный цикл программного продукта.
- •Этапы решения задач на эвм.
- •Критерии качества программ.
- •Способы записи алгоритма. Блок-схемы.
- •Способы записи алгоритма. Псевдокод.
- •Способы записи алгоритма. Сравнение различных подходов. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- •Высоконадежная память:
- •Принципы типизации данных.
- •Иерархия простых типов данных.
- •Стандартные типы данных. Таблица характеристик. Особенности выбора типа
- •Правила приведения типов.
- •Оператор sizeof.
- •Константы. Специальные символы. Квалификатор const.
- •Область видимости переменных.
- •Операторы управления областью видимости.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- •Понятие ассоциативности, приоритета, размерности. Таблица приоритета операций.
- •Арифметические операции.
- •Логические операции (краткая схема вычислений).
- •Побитовые операции (таблицы истинности).
- •Структурное программирование: историческая справка.
- •Принципы структурного программирования.
- •Структурное программирование: три базовые конструкции.
- •Основные операторы.
- •Пустой оператор.
- •Оператор присваивания (синтаксис, логика работы, полная и сокращённая форма, порядок выполнения, контекст вычисления, пример).
- •Условный оператор (полная и краткая формы, неоднозначность условного оператора).
- •Составной оператор (синтаксис, логика работы, пример).
- •Неоднозначность условного оператора.
- •Связь между несколькими условными операторами и сложными логическими выражениями.
- •Оператор выбора (синтаксис, логика работы, пример).
- •Ссылки (понятие, способы применения).
- •Подпрограммы (синтаксис, виды подпрограмм, контекст, пример).
- •Оператор return.
- •Прототипы функций (понятие, назначение, способы применения).
- •Библиотеки функций. Оператор #include.
- •Создание пользовательских библиотек.
- •Способы передачи параметров в функции.
- •Способы передачи значения из одной функции в другую.
- •Рекурсия (понятие, правила написания рекурсивных подпрограмм, прямая и обратная и косвенная рекурсии).
- •Параметры по-умолчанию.
- •Перегрузка функций.
- •Перегрузка операторов.
- •Шаблоны функций.
- •Разрешение неоднозначностей при вызове функций.
- •Одномерные массивы (объявление, индексация, хранение в памяти, сортировка). Пример: поиск второго наибольшего по величине значения в массиве.
- •Типовые алгоритмы обработки массивов.
- •77. Указатели (назначение, синтаксис, операции).
- •78. Различие между указателями и ссылками.
- •79. Динамическая память (выделение и освобождение памяти под переменные, одномерные массивы, двумерные массивы).
- •80. Тип данных «массив массивов».
- •81. Представление строк в языках программирования. Достоинства и недостатки различных представлений (отличие ‘a’ от “a”).
- •82. Основные алгоритмы обработки строк.
- •Функции классификации Функции преобразования
- •85. Файлы (понятие, текстовые и двоичные файлы, структурированные и неструктурированные, операции, основные библиотеки для работы с файлами).
- •86. Потоковый ввод-вывод. Библиотека потокового ввода-вывода.
- •88. Файловый ввод-вывод. Стандартная библиотека ввода-вывода.,
- •90. Типовые алгоритмы обработки файлов.
- •92. Создание простых бд с помощью массива структур.
- •93. Списки (определение, типовые операции, использование).
- •94. Создание простых бд с помощью списков.
Одномерные массивы (объявление, индексация, хранение в памяти, сортировка). Пример: поиск второго наибольшего по величине значения в массиве.
Общая форма объявления одномерного массива имеет следующий вид:
тип имя_переменной [размер];
Как и другие переменные, массив должен быть объявлен явно, чтобы компилятор выделил для него определенную область памяти (т.е. разместил массив). Здесь тип обозначает базовый тип массива, являющийся типом каждого элемента. Размер задает количество элементов массива. Например, следующий оператор объявляет массив из 100 элементов типа double под именем balance:
double balance[100];
Согласно стандарту С89 размер массива должен быть указан явно с помощью выражения-константы. Таким образом, в программе на С89 размер массива определяется во время компиляции и впоследствии остается неизменным. (В С99 определены массивы, размер которых определяется во время выполнения. О них еще будет идти речь далее в этой главе, а также более подробно в части II).
Доступ к элементу массива осуществляется с помощью имени массива и индекса. Индекс элемента массива помещается в квадратных скобках после имени. Например, оператор balance[3] = 12.23;присваивает 3-му элементу массива balance значение 12.23. Индекс первого элемента любого массива в языке С равен нулю. Поэтому оператор char p[10];объявляет массив символов из 10 элементов — от р[0] до р[9]. В следующей программе вычисляются значения элементов массива целого типа с индексами от 0 до 99:
#include <stdio.h>
int main(void)
{
int x[100]; /* объявление массива 100 целых */
int t;
/* присваение массиву значений от 0 до 99 */
for(t=0; t<100; ++t) x[t] = t;
/* вывод на экран содержимого x */
for(t=0; t<100; ++t) printf("%d ", x[t]);
return 0;
}
Объем памяти, необходимый для хранения массива, непосредственно определяется его типом и размером. Для одномерного массива количество байтов памяти вычисляется следующим образом:
количество_байтов = sizeof(базовый_тип) × длина_массива
Во время выполнения программы на С не проверяется ни соблюдение границ массивов, ни их содержимое. В область памяти, занятую массивом, может быть записано что угодно, даже программный код. Программист должен сам, где это необходимо, ввести проверку границ индексов. Следующий пример программы компилируется без ошибки, однако при выполнении происходит нарушение границы массива count и разрушение соседних участков памяти:
int count[10], i;
/* здесь нарушена граница массива count */
for(i=0; i<100; i++) count[i] = i;
Можно сказать, что одномерный массив — это список, хранящийся в непрерывной области памяти в порядке индексации. На рис. 4.1 показано, как хранится в памяти массив а, начинающийся по адресу 1000 и объявленный как
char a[7];
Рис. 4.1. Массив из семи символов, начинающийся по адресу 1000
Элемент a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7]
Адрес 1000 1001 1002 1003 1004 1005 1006 100
Типовые алгоритмы обработки массивов.
1. Сортировка массива выбором.
Метод основан на поиске наименьшего элемента. Номер этого элемента запоминается, затем его меняют
местами с первым элементом. Далее, ищется наименьший элемент среди оставшихся и меняется
местами со вторым и т.д
Программный код:
procedure TForm1.Button1Click(Sender: TObject);
const n=5;
var a:array[1..n] of integer;
i,j,n_min,t:integer;
begin
for i:=1 to n do a[i]:=strtoint(memo1.Lines[i-1]);
for i:=1 to n do begin
n_min:=i;
for j:=i+1 to n do
if a[j]<a[n_min] then n_min:=j;
t:=a[i];
a[i]:=a[n_min];
a[n_min]:=t;
end;
memo1.Lines.add('отсортированный массив:');
for i:=1 to n do memo1.Lines.Add(inttostr(i)+'-й = '+inttostr(a[i]));
end;
end.
2. Сортировка перестановками
Метод основан на принципе сравнения и обмена пары соседних элементов до тех пор, пока не будут
рассортированы все элементы. Этот метод широко известен как сортировка методом пузырька.
Программный код:
procedure TForm1.Button1Click(Sender: TObject);
const n=5;
var a:array[1..n] of integer;
i,j,t:integer;
begin
for i:=1 to n do a[i]:=strtoint(memo1.Lines[i-1]);
for i:=2 to n do
for j:=n downto i do
if a[j-1]>a[j] then begin
t:=a[j-1];
a[j-1]:=a[j];
a[j]:=t;
end;
memo1.Lines.add('отсортированный массив:');
for i:=1 to n do memo1.Lines.Add(inttostr(i)+'-й = '+inttostr(a[i]));
end;
end.
3. Инвертирование массива
Алгоритм заключается в том, чтобы переставить элементы массива в обратном порядке, т.е
поменять местами 1-ый элемент с последним, 2-ой – с предпоследним и т.д.
Программа:
procedure TForm1.Button1Click(Sender: TObject);
const n=5;Тимошина О.В. Массивы. Страница 3
var a:array[1..n] of integer;
i,j,t:integer;
begin
for i:=1 to n do a[i]:=strtoint(memo1.Lines[i-1]);
for i:=1 to (n div 2) do begin
t:=a[i];
a[i]:=a[n-i+1];
a[n-i+1]:=t;
end;
memo1.Lines.add('инвертированный массив:');
for i:=1 to n do memo1.Lines.Add(inttostr(i)+'-й = '+inttostr(a[i]));
end;
end.
4. Формирование нового массива из элементов исходного
А) Формирование нового массива из элементов исходного, которые меньше заданного числа К
Программный код:
procedure TForm1.Button1Click(Sender: TObject);
const n=5;
var a,b:array[1..n] of integer;
i,j,t,k:integer;
begin
for i:=1 to n do a[i]:=strtoint(memo1.Lines[i-1]);
k:=strtoint(edit1.Text);
j:=0;
for i:=1 to n do
if a[i]<K then begin
j:=j+1;
b[j]:=a[i];
end;
memo1.Lines.add('Новый массив b:');
for i:=1 to j do memo1.Lines.Add(inttostr(i)+'-й = '+inttostr(b[i]));
end;
end.
Б) Слияние двух упорядоченных массивов в один упорядоченный
Программный код:
procedure TForm1.Button1Click(Sender: TObject);
const n=5; m=4;
var a:array[1..n] of integer;
b:array[1..m] of integer;
c:array[1..n+m] of integer;
i,j,t,k:integer;
begin
for i:=1 to n do a[i]:=strtoint(memo1.Lines[i-1]);
for i:=1 to m do b[i]:=strtoint(memo2.Lines[i-1]);
i:=1;j:=1;
for k:=1 to n+m do
if i>n then begin
c[k]:=b[j];
j:=j+1
end
else if j>m then begin
c[k]:=a[i];
i:=i+1
end
else
if a[i]<b[j] then begin
c[k]:=a[i];
i:=i+1
end
else begin
c[k]:=b[j];
j:=j+1;
end;
for i:=1 to n +m do memo3.Lines.Add(inttostr(i)+'-й = '+inttostr(c[i]));
end;
end. 74. Двумерные массивы
Кроме одномерных массивов встречаются двумерные. Синтаксис объявления:
<тип> < имя>[кол-во строк][кол-во столбцов]; пример: int mas[10][10];
Обращение к элементам массива по их индексам:
<имя массива>[номер строки][номер столбца] пример: mas[3][5] \\ 3 строка 5 столбец
Массив обрабатывается в 2-ух циклах с параметрами(индексами элементов массива).
Пример обработки массива mas размером [n][m] – обнуление элементов:
for (int I; i<n;i++) \\ цикл с индексом строки - i
for(int j;j<m;j++) \\ цикл с индексом столбца (каждого элемента в i-ой строке) - j
mas[i][j]=0;
75. Представление двумерного массива в виде одномерного. Соответствие индексов двумерного и одномерного.
Двумерный массив можно представить как одномерный. Образно это выглядит так:
т.е. его индексы остаются те же «номер строки» «номер столбца» (далее i и j). Вся суть в занесении особой формулы в параметр одномерного массива при обработки
mas[ i*m+j]=0; где i –индекс строки j индекс элемента в строке m- кол-во символов в строке.
Выражение i*m распиливает весь одномерный массив на одинаковые части (см. рисунок) а операция «+j» непосредственно находит элемент в i-ом куске одномерного массива.
Размер этого массива должен вычисляться по формуле кол-во=кол-во строк *кол-столбцов (далее n*m).
Пример объявления и обработки массива 3 на 5:
int mas[15]; \\ определение размерности 3*5=15
for (int I; i<n;i++) \\ цикл с индексом строки - i
for(int j;j<m;j++) \\ цикл с индексом элемента в i-ой строке - j
mas[ i*m+j]=0;
76. Многомерные массивы (объявление, индексация, хранение в памяти, сортировка). Пример.
Можно объявлять не только двумерные массивы, но и массивы с большим количеством измерений. Например, объявление int A[n][m][l] создает трехмерный массив из n*m*l элементов. Для обращения к каждому элементу такого массива необходимо указать три индекса: A[i][j][k], при этом 0<=i, i<n, 0<=j, j<m, 0<=k, k<l(т.е. индекс не может превышать размерность массива). Количество измерений в массиве может быть практически бесконечным.