- •Введение
- •Блок-схема алгоритма
- •Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Основные понятия языка С(С++)
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Структура программы на языке С(С++)
- •Операции и выражения
- •sizeof
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора
- •Директива #include
- •Директива #define
- •Операторы языка С(С++)
- •Понятие пустого и составного операторов
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Примеры программ
- •Массивы
- •Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели
- •Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Передача массива в функцию
- •inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Вершина стека
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Стек
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Файлы
- •Примеры программ
- •Литература
while(i2>=0) // аналогично для второго массва m3[i3++]=m2[i2--];
puts("\nРезультирующий массив"); for(i3=0;i3<(n+m);i3++) printf("%3d",m3[i3]);
}
Пример . Ввести первый массив расположив его элементы по убыванию, второй по возрастанию. Не используя сортировок сформировать третий массив по убыванию. Все массивы целочисленные
#include <stdio.h> #define n 3 #define m 5
void main()
{int m1[n], m2[m], m3[n+m], i1, i2, i3; puts("\nВведите первый массив по возрастанию"); for(i1=0;i1<n;i1++)
{printf("\nm1[%d]=",i1);
scanf("%d",&m1[i1]);
}
puts("\nВведите второй массив по убыванию"); for(i2=0;i2<m;i2++)
{ printf("\nm2[%d]=",i2); scanf("%d",&m2[i2]);
}
i1=n-1; i2=0; i3=0; while(i1>=0 && i2<m)
{while(m1[i1]>=m2[i2] && i1>=0) m3[i3++]=m1[i1--];
if(i1<0) break; while(m2[i2]>m1[i1] && i2<m)
m3[i3++]=m2[i2++];
}
while(i1>=0) m3[i3++]=m1[i1--]; while(i2<m) m3[i3++]=m2[i2++];
puts("\nРезультирующий массив"); for(i3=0;i3<(n+m);i3++) printf("%3d",m3[i3]);
}
Многомерные массивы (матрицы)
Многомерный массив – это массив элементами которого являются массивы. Размерность массива – это количество индексов, используемых для
доступа к конкретному элементу массива. Пример объявления двухмерного массива.
int mas[5][15];
Константное выражение, определяющее одну из размерностей массива, не может принимать нулевое значение:
int mas[0][7]; // ошибка
Можно инициализировать и многомерные массивы. Инициализация выполняется построчно, то есть в порядке возрастания самого правого индекса. Именно в таком порядке элементы многомерных массивов располагаются в памяти компьютера, например:
int mas[2][3]={2, 14, 36, 23, 1, 9};
Проинициализированный массив будет выглядеть так: 2 14 36 23 1 9
Многомерные массивы могут инициализироваться и без указания одной (самой левой) из размерностей массива. В этом случае количество элементов компилятор определяет по количеству членов в списке инициализации. Например, для массива mas будет получен тот же, что и в предыдущем примере результат:
int mas[][3]={ 34, 23, 67, 38, 56, 73, 37, 94, 28 };
Если необходимо проинициализировать не все элементы строки, а только несколько первых элементов, то в списке инициализации можно использовать фигурные скобки, охватывающие значения для этой строки, например:
int mas[][3]={{ 0 },
{10, 11},
{21, 21, 22} };
Отличие в работе с многомерными массивами от работы с одномерными. состоит в том, что для доступа к элементу многомерного массива необходимо указать все его индексы:
n= mas[i][j]; |
// |
работа с элементом расположенным на i-ой |
mas[i][j]=n; |
// |
строке и в j-ом столбце матрицы mas |
Примеры программ
Рассмотрим некоторые примеры программ с использованием многомерных матриц.
Пример . Транспонировать матрицу относительно главной диагонали. #include <stdio.h>
#define nn 3 void main()
{int mas[nn][nn],i,j,kk; printf("\n‚Введите матрицу");
for(i=0;i<nn;i++) |
// |
цикл по строкам матрицы |
for(j=0;j<nn;j++) |
// |
цикл по столбцам матрицы |
{printf("\n‚введите элемент mas[%d][%d] = ",i,j); scanf("%d",&mas[i][j]);
}
clrscr();
printf("\nИсходная матрица "); // Вывод матрицы на экран
for(i=0;i<nn;i++) |
// |
цикл по строкам матрицы |
|
{ |
printf("\n"); |
|
|
|
for(j=0;j<nn;j++) |
// |
цикл по столбцам матрицы |
} |
printf("%5d",mas[i][j]); |
|
|
|
|
|
// пример транспонирования используя оператор for for(i=0;i<nn;i++)
for(j=i+1;j<nn;j++) { kk=mas[i][j];
mas[i][j]=mas[j][i];
mas[j][i]=kk;
}
// пример транспонирования используя оператор do while i=0;
do
{ j=i+1; do
{kk=mas[i][j];
mas[i][j]=mas[j][i];
mas[j][i]=kk; } while(++j<nn);
}while(+i<nn);
//пример транспонирования используя оператор while i=0;
while(i<nn)
{j=i+1;
while(j<nn)
{kk=mas[i][j];
mas[i][j]=mas[j][i];
mas[j++][i++]=kk;
}
}
printf("\nИсходная матрица "); // Вывод матрицы на экран for(i=0;i<nn;i++) // цикл по строкам матрицы
{ |
printf("\n"); |
|
|
for(j=0;j<nn;j++) |
// цикл по столбцам матрицы |
} |
printf("%5d",mas[i][j]); |
|
|
|
}
Пример . Нахождение седловой точки двухмерного массива (элемента являющегося наибольшим в строке и наименьшим в столбце).
#include<stdio.h> #define n 4
void main()
{int ms[n][n],i,i1,i2,j,j1,k,kk; clrscr();
printf("\n‚Введите матрицу"); for(i=0;i<n;i++)
for(j=0;j<n;j++)
{printf("\ms[%2d][%2d]= ",i,j); scanf("%d",&ms[i][j]);
}
clrscr();
printf("\nВведенный массив MS"); for(i=0;i<n;i++)
{printf("\n");
for(j=0;j<n;j++)
printf("%3d",ms[i][j]);
}
// блок поиска седловой точки for(i=0;i<n;i++)
{k=ms[i][0]; i1=0; j1=0; // начальное значение координат в матрице
//для поиска седловой точки
for(j=0;j<n;j++) |
// цикл анализа i-ой строки |
if (ms[i][j]>k) |
// найдено новое максимальное в строке |
{ k=ms[i][j]; |
// запоминаем найденное значение |
i1=i; j1=j; |
// и его координаты в матрице |
}
kk=0;
for(i2=0;i2<n;i2++) if(ms[i1][j1]>=ms[i2][j1] && i1!=i2) kk=1; if(kk==0)
printf("\nседловая точка = %d \nкоординаты : MS[%d][%d] ", ms[i1][j1],i1,j1);
}
}
Пример . Разработать программу умножения двух целочисленных матриц чисел.
#include<stdio.h> void main()
{int i,j,k,n,t;
int a[3][4],b[4][2],c[3][2]; printf("\nВведите матрицу a"); for(i=0;i<3;i++) for(j=0;j<4;j++)
{printf("\na[%d][%d]=",i,j);
scanf("%3d",&a[i][j]);
}
printf("\n Введите матрицу b"); for(i=0;i<4;i++) for(j=0;j<2;j++)
{printf("\nb[%d][%d]=",i,j);
scanf("%3d",&b[i][j]);
}
// умножение матриц используя оператор while
i=0;
while(i<3)
{j=0;
while(j<2)
{c[i][j]=0;
k=0;
while(k<4)
{c[i][j]+=a[i][k]*b[k][j];
k++;
}
j++;
}
i++;
}
// умножение матриц используя оператор do while
i=0; do
{j=0; do
{c[i][j] = 0; k = 0;
do
{c[i][j] += a[i][k] * b[k][j]; k++;
}while( k < 3 );
j++;