#include "stdafx.h" #include "malloc.h" #include <iostream> using namespace std;
int _tmain(int argc, _TCHAR* argv[]) { // Вводим исходные данные. int m; int n; printf ("Введите количество столбцов? m = "); cin >> m; printf ("Введите количество строк? n = "); cin >> n;
// Инициализируем другие переменные. int xMin = 0, // левая граница спирали xMax = m, // правая граница спирали (не включая ее, поэтому ниже будет использоваться xMax - 1) yMin = 0, // верхняя граница спирали yMax = n, // нижняя граница спирали (не включая ее, поэтому ниже будет использоваться yMax - 1) i = 0, // текущее число x, y; // расходный материал.
// Бесконечный цикл, пока не заполним матрицу. while (1) { // Заполняем верхний ряд слева направо. for (x = xMin; x < xMax; x++) pMatrix[x + yMin * m] = i++; // Заполнили весь верхний ряд. Подвигаем вниз верхнюю границу. yMin ++; // Если верхняя граница совпала с нижней, то заканчиваем цикл. if (yMin == yMax) break;
// Заполняем правый ряд сверху вниз. for (y = yMin; y < yMax; y++) pMatrix[xMax - 1 + y * m] = i++; // Заполнили весь правый ряд. Подвигаем налево правую границу. xMax --; // Если правая граница совпала с левой, то заканчиваем цикл. if (xMax == xMin) break;
// Заполняем нижний ряд справа налево. for (x = xMax - 1; x >= xMin; x--) pMatrix[x + (yMax - 1) * m] = i++; // Заполнили весь нижний ряд. Подвигаем вверх нижнюю границу. yMax --; // Если верхняя граница совпала с нижней, то заканчиваем цикл. if (yMin == yMax) break;
// Заполняем левый ряд снизу вверх. for (y = yMax - 1; y >= yMin; y--) pMatrix[xMin + y * m] = i++; // Заполнили весь левый ряд. Подвигаем направо левую границу. xMin ++; // Если правая граница совпала с левой, то заканчиваем цикл. if (xMax == xMin) break; // если мы все еще здесь, значит идем на очередной виток спирали.. . }
// Есть предположение, что спираль заполнена. Напечатаем ее, посмотреть.. . for (y = 0; y < n; y++) { // Печатаем строку. for (x = 0; x < m; x++) printf ("i, ", pMatrix[x + y * m]); // Переходим на другую строку. printf ("\r\n"); }
// Освобождаем память и выходим. free (pMatrix); pMatrix = 0; }
Продолжительность листопада у различных деревьев, так же как и период пожелтения листвы, бывает крайне различной. Из наших деревьев листопад, по-видимому, наиболее длителен у березы: он продолжается около двух месяцев, в то время как липа успевает сбросить свою листву в две недели. Установить сроки листопада у какой-нибудь древесной породы бывает не так легко, так как у различных экземпляров одного и того же вида он начинается и заканчивается не одновременно. Интересно при этом отметить, что причина этого явления далеко не всегда лежит во внешних условиях. Нередко два дерева, растущие по соседству, на целую неделю различаются по времени пожелтения и опадения своих листьев. Некоторые экземпляры дуба, которые очень долго не сбрасывают своих листьев и в течение всей зимы стоят в своем осеннем уборе.
Продолжительность листопада у различных деревьев, так же как и период пожелтения листвы, бывает крайне различной. Из наших деревьев листопад, по-видимому, наиболее длителен у березы: он продолжается около двух месяцев, в то время как липа успевает сбросить свою листву в две недели. Установить сроки листопада у какой-нибудь древесной породы бывает не так легко, так как у различных экземпляров одного и того же вида он начинается и заканчивается не одновременно. Интересно при этом отметить, что причина этого явления далеко не всегда лежит во внешних условиях. Нередко два дерева, растущие по соседству, на целую неделю различаются по времени пожелтения и опадения своих листьев. Некоторые экземпляры дуба, которые очень долго не сбрасывают своих листьев и в течение всей зимы стоят в своем осеннем уборе.
#include "malloc.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// Вводим исходные данные.
int m;
int n;
printf ("Введите количество столбцов? m = ");
cin >> m;
printf ("Введите количество строк? n = ");
cin >> n;
// Создаем матрицу.
int* pMatrix = (int*) malloc (m * n * sizeof (int));
// Инициализируем другие переменные.
int xMin = 0, // левая граница спирали
xMax = m, // правая граница спирали (не включая ее, поэтому ниже будет использоваться xMax - 1)
yMin = 0, // верхняя граница спирали
yMax = n, // нижняя граница спирали (не включая ее, поэтому ниже будет использоваться yMax - 1)
i = 0, // текущее число
x, y; // расходный материал.
// Бесконечный цикл, пока не заполним матрицу.
while (1)
{
// Заполняем верхний ряд слева направо.
for (x = xMin; x < xMax; x++)
pMatrix[x + yMin * m] = i++;
// Заполнили весь верхний ряд. Подвигаем вниз верхнюю границу.
yMin ++;
// Если верхняя граница совпала с нижней, то заканчиваем цикл.
if (yMin == yMax)
break;
// Заполняем правый ряд сверху вниз.
for (y = yMin; y < yMax; y++)
pMatrix[xMax - 1 + y * m] = i++;
// Заполнили весь правый ряд. Подвигаем налево правую границу.
xMax --;
// Если правая граница совпала с левой, то заканчиваем цикл.
if (xMax == xMin)
break;
// Заполняем нижний ряд справа налево.
for (x = xMax - 1; x >= xMin; x--)
pMatrix[x + (yMax - 1) * m] = i++;
// Заполнили весь нижний ряд. Подвигаем вверх нижнюю границу.
yMax --;
// Если верхняя граница совпала с нижней, то заканчиваем цикл.
if (yMin == yMax)
break;
// Заполняем левый ряд снизу вверх.
for (y = yMax - 1; y >= yMin; y--)
pMatrix[xMin + y * m] = i++;
// Заполнили весь левый ряд. Подвигаем направо левую границу.
xMin ++;
// Если правая граница совпала с левой, то заканчиваем цикл.
if (xMax == xMin)
break;
// если мы все еще здесь, значит идем на очередной виток спирали.. .
}
// Есть предположение, что спираль заполнена. Напечатаем ее, посмотреть.. .
for (y = 0; y < n; y++)
{
// Печатаем строку.
for (x = 0; x < m; x++)
printf ("i, ", pMatrix[x + y * m]);
// Переходим на другую строку.
printf ("\r\n");
}
// Освобождаем память и выходим.
free (pMatrix);
pMatrix = 0;
}