Пример 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];

- разработать программу на языке Си для решения заданных вариантов заданий;

- отладить программу;

- выполнить решение контрольного примера небольшой размерности с помощью программы и ручной расчет контрольного примера;

- подготовить отчет по лабораторной работе.

Наши рекомендации