
- •Структура программы на языке Си. Этапы выполнения программы
- •1.1. Алфавит языка Си
- •1.2. Лексемы
- •1.3. Идентификаторы и ключевые слова
- •1.4. Знаки операций
- •1.5. Литералы (константы)
- •1.6. Комментарии
- •1.7. Общая структура программы на языке Си.
- •1.8. Функциональная и модульная декомпозиции
- •1.9. Этапы обработки программы.
- •1.10. Роль препроцессора.
- •1.11. Ошибки
- •2. Переменные и константы. Типы данных
- •2.1. Основные типы данных
- •2.2. Декларация (объявление) объектов
- •2.3. Константы в программах
- •2.4. Целочисленные константы
- •2.5. Константы вещественного типа
- •2.6. Символьные константы
- •2.7. Строковые константы
- •3. Обзор операций
- •3.1. Операции, выражения
- •3.2. Арифметические операции
- •3.3. Операции сравнения
- •3.4. Логические операции
- •4. Операции (продолжение).
- •4.1. Операция присваивания
- •Примеры недопустимых выражений:
- •4.2. Сокращенная запись операции присваивания
- •4.3. Преобразование типов операндов бинарных операций
- •4.4. Преобразование типов при присваивании.
- •4.5. Операция явного приведения типа
- •4.6. Операция «,» (запятая)
- •4.7. Приоритеты операций (по убыванию, чертой разделены разные приоритеты)
- •5. Стандартная библиотека языка Си
- •5.1. Стандартные математические функции
- •5.2. Потоковый ввод-вывод
- •5.3. Консольные функции вывода данных на экран
- •5.4. Консольные функции ввода информации
- •5.5. Ввод-вывод в оконных приложениях.
- •Советы по программированию
- •6. Операторы языка с.
- •7. Составление разветвляющихся алгоритмов
- •7.1. Условные операторы
- •If (выражение) оператор;
- •If (выражение) оператор 1 ;
- •If (выражение 1) оператор 1;
- •If (выражение 2) оператор 2;
- •If (выражение 3) оператор 3;
- •7.2. Оператор выбора альтернатив (переключатель)
- •7.3. Условная операция «? :»
- •8. Составление циклических алгоритмов
- •8.1. Оператор с предусловием while
- •8.2. Оператор цикла с постусловием do – while
- •8.3. Оператор цикла с предусловием и коррекцией for
- •8.4. Вложенные циклы.
- •9. Операторы передачи управления.
- •9.1. Оператор безусловного перехода goto
- •9.2. Операторы continue, break и return
- •10. Массивы
- •10.1. Одномерные массивы
- •10.2. Примеры алгоритмов, использующих одномерные массивы.
- •10.3. Многомерные массивы
- •10.4. Примеры алгоритмов, использующих двумерные массивы.
- •10.5. Компонента StringGrid
- •11. Размещение данных и программ в памяти пэвм
- •11.1. Общие понятия.
- •11.2. Кодирование целых чисел.
- •11.3. Кодирование вещественных чисел.
- •11.4. Кодирование символов.
- •Стандартная часть таблицы символов (ascii)
- •Дополнительная часть таблицы символов
- •11.5. Операция sizeof
- •11.6. Побитовые логические операции. Операции над битами
- •11.7. Кодирование программы.
- •11.8. Регистры
- •12.1. Строки как нуль-терминированные массивы char.
- •12.2. Русификация консольных приложений.
- •12.3. Строки как переменные типа AnsiString.
- •12.4. Преобразования строковых типов.
- •12.5. Тип String в консольных приложениях.
- •13. Функции пользователя и классы памяти.
- •13.1. Сущность и предназначение функций.
- •13.2. Определение и вызов функции.
- •13.3. Прототип функции.
- •13.4. Область видимости.
- •13.5. Классы памяти объектов в языке Cи.
- •13.6. Разбиение программы на модули.
- •15. Генерация псевдослучайных чисел.
- •17. Указатели
- •17.1. Определение указателей
- •17.2. Связь указателей и массивов.
- •17.3. Операции над указателями (косвенная адресация)
- •17.4. Сравнение указателей
- •17.5. Массивы указателей.
- •17.6. Указатели на указатели.
- •17.7 . Указатели как параметры функций.
- •Void f1(int, const double *);
- •17.9. Ссылка
- •17.10. Указатели на функции
- •Id_функции(список аргументов);
- •18. Работа с динамической памятью
- •18.1. Динамическое выделение и освобождение памяти.
- •18.2. Создание одномерного динамического массива.
- •18.3. Создание двуxмерного динамического массива.
- •19. Операция typedef
- •20. Отладка и пошаговое выполнение программы
10.3. Многомерные массивы
Многомерные массивы отличаются от одномерных только тем, что каждый элемент характеризуется не одним, а двумя или более индексами. Они используются, например, для хранения таблиц (каждый элемент таблицы имеет 2 индекса - № строки и № столбца).
Декларация многомерного массива имеет следующий формат:
тип ID [размер1] [размер2]…[размерN] =
{ {список начальных значений},
{список начальных значений},
…
};
Списки начальных значений – атрибут необязательный.
Пример:
int a[3][3]={ {1,2,3}, {4,5,6}, {7,8,9} };
Аналогично, при обращении к конкретному элементу многомерного массива указывается имя массива и затем - последовательно индексы элемента, каждый в квадратных скобках; например:
a[2][1]
a[i+1][k]
Рассмотрим особенности работы с многомерными массивами на конкретном примере двумерного массива (двумерные массивы называют также матрицами):
#include <stdio.h>
void main()
{
int i, j;
int m[3][4] = { { 1, 2, 3, 4}, {11,12,13,14}, {21,22,23,24} };
for (i=0; i<3; i++) {
printf("\n %2d)", i+1);
for (j=0; j<4; j++)
printf(" %3d",m[ i ] [ j ]);
}
}
Результаты работы программы:
1 2 3 4
11 12 13 14
21 22 23 24
10.4. Примеры алгоритмов, использующих двумерные массивы.
а) Простейшие примеры
Задача 1. Ввести матрицу и увеличить все ее элементы на единицу.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
void main() {
int a[10][10],n,m,i,j;
// Ввод матрицы
cout<<"Vvedite n,m <=10:";
cin>>n>>m;
cout<<"Vvedite massiv:\n";
for (i=0; i<n; i++)
for (j=0; j<m; j++)
cin>>a[i][j];
// Увеличение на 1
for (i=0; i<n; i++)
for (j=0; j<m; j++)
a[i][j]++;
// Вывод матрицы
puts("Result:");
for (i=0; i<n; i++)
for (j=0; j<m; j++)
printf("%3d%c", a[i][j], j==m-1? '\n' : ' ');
getch();
}
Задача 2. Найти в матрице наибольший элемент и его позицию.
max=a[0][0];
im=jm=0;
for (i=0; i<n; i++)
for (j=0; j<m; j++)
if (a[i][j]>max) {
max=a[i][j];
im=i;
jm=j;
}
printf("Max element a[%d][%d]=%d\n", im, jm, max);
Задача 3. Переписать матрицу в одномерный массив.
int b[100];
for (i=k=0; i<n; i++)
for (j=0; j<m; j++)
b[k++]=a[i][j];
После выполнения этого участка программы k=n*m -количество элементов в полученном массиве.
б) Диагонали квадратной матрицы
Квадратной называется матрица, у которой число строк равно числу столбцов. Ее главной диагональю называется диагональный ряд элементов, идущий из верхнего левого угла в нижний правый, а побочной диагональю - идущий из верхнего правого угла в нижний левый:
Обозначим размер матрицы буквой N, индекс строки буквой I, а индекс столбца буквой J. Тогда у элементов, лежащих на главной диагонали, I = J , а у элементов, лежащих на побочной диагонали, I + J = N - 1 .
Задача 4. Найти сумму элементов матрицы, лежащих над главной диагональю.
Из рисунка видно, что у элементов, лежащих над главной диагональю,
I < J .
Можно учесть это в условии оператора if , либо цикла for :
for (i=s=0; i<n; i++)
for (j=i+1; j<n; j++)
s+=a[i][j];
в) Работа со строками и столбцами
Строка или столбец матрицы аналогичны одномерному массиву. Поэтому к ним применимы все алгоритмы, рассмотренные для одномерных массивов.
В применении же ко всей матрице это обычно требует дополнительного внешнего цикла (циклов).
Задача 5. Поменять местами первую и последнюю строки матрицы.
for (j=0; j<m; j++) {
p=a[0][j];
a[0][j]=a[n-1][j];
a[n-1][j]=p;
}
Задача 6. Найти сумму элементов в каждой строке матрицы.
Поскольку строк в матрице несколько, ответом будет не одно число, а одномерный массив:
int b[10];
for (i=0; i<n; i++) {
for (j=s=0; j<m; j++)
s+=a[i][j];
b[i]=s;
}
for(i=0; i<n; i++)
printf("%d ", b[i]);
puts("");
Задача 7. Найти сумму элементов в каждом столбце матрицы.
По сравнению с предыдущей задачей, здесь изменится порядок циклов (ведь сначала нужно целиком подсчитать сумму в одном столбце, и только затем - в другом и т.д.):
for (j=0; j<m; j++) {
for (i=s=0; i<n; i++)
s+=a[i][j];
b[j]=s;
}
for(j=0; j<m; j++)
printf("%d ", b[j]);
puts("");
Задача 8. В каждой строке матрицы определить количество элементов, равных нулю. Отсортировать строки матрицы по убыванию этого количества.
Прежде всего, нужно определить эти количества и занести их в одномерный массив (обозначим его b):
for (i=0; i<n; i++) {
for (j=s=0; j<m; j++)
if (a[i][j]==0) s++;
b[i]=s;
}
Затем нужно отсортировать матрицу. В процессе этого обменивать местами нужно как сами строки, так и соответствующие им элементы одномерного массива b (чтобы каждый его элемент продолжал соответствовать своей строке):
for (i=0; i<n; i++)
for (k=i+1; k<n; k++)
if (b[k]>b[i]) {
for(j=0; j<m; j++)
{ p=a[i][j]; a[i][j]=a[k][j]; a[k][j]=p; }
p=b[i]; b[i]=b[k]; b[k]=p;
}