Пример 2
Условие задачи:
«Улитка». Матрицу M(m, n) заполнить натуральными числами от 1 до m x n по спирали, начинающейся в левом верхнем углу и закрученной по часовой стрелке.
Для решения задачи в среде Microsoft Visual Studio 2013 было создано стандартное консольное приложение (проект типа Win32 Console Application) с установленным свойством «пустой проект» (Empty project). В проект добавлен файл с расширением .cpp, исходный код которого приведен ниже.
Листинг программы с комментариями:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int **pMatr;
int n, m;
printf_s("n="); scanf_s("%d", &n);
printf_s("m="); scanf_s("%d", &m);
pMatr = (int **)malloc(n*sizeof(int *));
for (int i = 0; i<n; i++)
pMatr[i] = (int *)malloc(m*sizeof(int));
int i = 0, j = 0, // Текущие координаты улитки
minx = 0, maxx = m - 1, miny = 0, maxy = n - 1; // Границы поля движения
int step = 1; // Шаг перехода (может быть 1 или -1)
bool flag = true; // Направление движения
// улитки true - горизонтальное false - вертикальное
for (int k = 0; k<n*m; k++)
{
pMatr[i][j] = k + 1;
if (flag)
{
if (step>0) if (j<maxx) j++;
else {
miny++;
flag = false;
i++;
}
else
if (j>minx) j--;
else {
maxy--;
flag = false;
i--;
}
}
else // Движение было вертикальное
if (step>0) if (i<maxy) i++;
else {
maxx--;
flag = true;
step = -1;
j--;
}
else
if (i>miny) i--;
else {
minx++;
flag = true;
step = 1;
j++;
}
}
for (int i = 0; i<n; i++)
{
for (int j = 0; j<m; j++)
printf_s("%4d", pMatr[i][j]);
printf_s ("\n");
}
// Освобождаем память
for (int i = 0; i<n; i++) free(pMatr[i]);
free(pMatr);
system("pause");// Останавливаем программу, ждем нажатия любой клавиши
return 0;
}
Форма отчета по лабораторной работе
Отчет должен содержать: титульный лист; цель работы; условие задачи; текст программы с комментариями; результаты работы программ с массивами небольшой размерности и контрольные расчеты этих примеров для проверки правильности работы алгоритмов; выводы по работе.
Вопросы для самоконтроля
1. Связь указателей и массивов в языке Си.
2. Указатель на указатель.
3. Операции с указателями в Си.
4. Создание массивов динамически.
Лабораторная работа № 4. Изучение структурных типов языка Си
Цель и задачи работы, требования к результатам ее выполнения
Цель работы состоит в овладении навыками разработки программ на языке Си, использующих структурные типы данных. Для достижения цели необходимо выполнить следующие задачи:
- изучить учебный материал, посвященный структурам в языке Си [1, 3];
- разработать программу на языке Си для решения заданных вариантов заданий;
- отладить программу;
- выполнить решение контрольного примера небольшой размерности с помощью программы и ручной расчет контрольного примера;
- подготовить отчет по лабораторной работе.