| 
| 
 | Вопрос # 5 123/ вопрос открыт / | 
 |  Здравствуйте!Помогите написать программу на языке С++.Запрограммировать заполнение матрицы произвольного размера m*n числами 1,2,3,4,5,6...со схеме 1(2).
 Матрицу задать фиксированного большого размера M*N, где M, N - константы, заданные в тексте программы. Размеры m, n задать переменными, вводимыми при работе программы с проверкой условия m<=M и n<=N.
 
 Схема 1.
 
 5 6 7 8 9 10
 4 21 22 23 24 11
 3 20 29 30 25 12
 2 19 28 27 26 13
 1 18 17 16 15 14
 
 Схема 2.
 25 23 22 16 15
 24 21 17 14 7
 20 18 13 8 6
 19 12 9 5 2
 11 10 4 3 1
 (На фотографии это вариант 4 и 12.)
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) 
|  |   Вопрос задала: N@tySuk (статус: Посетитель)Вопрос отправлен: 24 марта 2011, 22:50
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Толяныч Здравствуйте, N@tySuk!
 Код выглядит приблизительно так ( это на простом С, отличия будут только во вводе-выводе ).
 В начале подпрограммы fill вычисляются координаты верхней и нижней точки диагоналей, а дальше проводится заполнение : на прямом проходе влево-вниз, на обратном - вправо-вверх. Начальная и конечная точки заполняются вне цикла. Просто, как вермишель.
 Приложение:Переключить в обычный режим #include <stdio.h>#include <string.h>int Nx,Ny,N,arr[100][100] ;int ATop[100][2],ABott[100][2] ;void fill( int ny, int nx){int ix,iy,k,ks,pr ;N= 1 ; pr = 1 ; ks = nx+ny-3 ; k=0 ; pr=0 ;for (ix = 1;ix<=ks;ix++)  { if (ix<nx-1) {ATop[ix][0]=ix ; ATop[ix][1]=0 ; }    else  {ATop[ix][0]=nx-1 ; ATop[ix][1]=k++ ; }    if (ix<ny-1) {ABott[ix][0]=0 ; ABott[ix][1]=ix ; }    else  {ABott[ix][0]=pr++ ; ABott[ix][1]=ny-1 ; }  }arr[ny-1][nx-1]=1 ;N= 2 ; k = nx+ny-3 ;for (k=ks,pr=0;k>0;k--){    if (pr==0)    for (ix=ATop[k][0],iy=ATop[k][1];ix >= ABott[k][0];ix--)      arr[iy++][ix]=N++ ;    else    for (ix=ABott[k][0],iy=ABott[k][1];ix <= ATop[k][0];ix++)      arr[iy--][ix]=N++ ;    pr++ ; pr&=1 ;}arr[0][0]=nx*ny ; } void display(int ny, int nx){int i,j ;for (i = 0 ; i<ny ; i++)  { for (j =0 ; j<nx ; j++)    { printf ( "%4d",arr[i][j]) ;}    printf ("\n") ;  }} void main(void){  puts ("Row") ; scanf ("%d",&Ny) ;  puts ("Col") ; scanf ("%d",&Nx) ;  fill (Ny,Nx) ; display (Ny,Nx) ;}   Row7Col5  35  33  32  26  25  34  31  27  24  16  30  28  23  17  15  29  22  18  14   7  21  19  13   8   6  20  12   9   5   2  11  10   4   3   1  
|  | Ответ отправил: Толяныч (статус: 4-ый класс)Время отправки: 28 марта 2011, 00:57
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо Вам огромное!!!Вы мне очень помогли))) |  
 Мини-форум вопросаВсего сообщений: 18; последнее сообщение — 30 марта 2011, 18:27; участников в обсуждении: 6. 
|   | Мережников Андрей (статус: Абитуриент), 24 марта 2011, 23:43 [#1]:в чем собственно вопрос? Что непонятно в задании? |  
|   | n1tn4tsn0k (статус: 1-ый класс), 25 марта 2011, 01:55 [#2]:Решение для первой схемы(правда на Си, а не на Си++, но переделать человеку, изучающему плюсы, труда не составит): 
 #include <stdlib.h>
#include <stdio.h>
 
#define M 100
#define N 100
 
int m, n;
int i, j;
int A[M][N];
 
void fill(int i2, int j2, int v)
{
  i += i2;
  j += j2;
  A[i][j] = v;
  if (v == m*n)
    return;
  if (i+i2 < 0 || j+j2 < 0 || i+i2 >= m || j+j2 >= n || A[i+i2][j+j2] != 0)
    fill(-j2, i2, v+1);
  else
    fill(i2, j2, v+1);
}
 
int main()
{
  scanf("%i %i", &m, &n);
  i = 0;
  j = n-1;
  A[i][j] = 1;
  fill(0, -1, 2);
  for (j=0;j<n;j++) {
    for (i=0;i<m;i++)
      printf("%i ", A[i][j]);
    puts("");
  }
  return 0;
}Над второй уже лень думать, да и спать хочется. Может завтра напишу, если никто другой не напишет. Удачи!
 |  
|   | Мережников Андрей (статус: Абитуриент), 25 марта 2011, 05:38 [#3]:первые четыре схемы отличаются друг от друга только начальной точкой. |  25 марта 2011, 12:20: Вопрос перемещён из тематического раздела C++ в раздел Лабораторный практикум » Разное модератором Ерёмин А.А. 
|   | N@tySuk (статус: Посетитель), 25 марта 2011, 12:37 [#4]:А  как сделать 12 вариант(диагональную змейку)и как поменять начальную точку? В языке С++ разбираюсь плохо! |  
|   | matkus (статус: Заблокирован), 25 марта 2011, 18:57 [#5]:Уважаемый n1tn4tsn0k, Ваша прога не работает (это видно без какой-либо проверки). Вы это вообще откуда взяли? Вы, типа, сами от балды нахерачили её? Сасуньте этот несчастный "исходник" себе жопу и, как говорили японцы в Южном Парке, "в жопу Вам китов"!!! |  
|   | matkus (статус: Заблокирован), 25 марта 2011, 18:59 [#6]:Бля, ошибку в слове сделал, сука!!! |  
|   | matkus (статус: Заблокирован), 25 марта 2011, 19:00 [#7]:У меня же, блядь, 4 по русскому было в школе?! |  
|   | n1tn4tsn0k (статус: 1-ый класс), 25 марта 2011, 22:32 [#8]:Уважаемый matkus. http://ru.wikipedia.org/wiki/Идиотия -- вот тут о таких, как вы, написано
  Вы бы лучше проверили код, чем языком молоть исходя из своих глупых убеждений. Программа работает на ура.
 |  
|   | Толяныч (статус: 4-ый класс), 28 марта 2011, 01:03 [#9]:Занятые изгонянием из форума неадеквата, мы забыли юной коллеге расписать второй вариант. Пришлось рачехлить старый бук со старым 'С' и встряхнуть подзапылившиеся знания по этому предмету. |  
|   | N@tySuk (статус: Посетитель), 28 марта 2011, 19:20 [#10]:А первый вариант, что расписывал n1tn4tsn0k верный или нет??? |  
|   | Толяныч (статус: 4-ый класс), 29 марта 2011, 17:01 [#11]:Попробовал - нормально работает при небольших матрицах, на 20*20 уже не то - см. приложение, а на 100*100 вообще вылетает. Вероятно,из-за рекурсии происходит переполнение стека. Мой вариант рекурсию не использует и проще для понимания, мне кажется.
 фрагмент кода
 |  
|   | n1tn4tsn0k (статус: 1-ый класс), 29 марта 2011, 20:07 [#12]:Что у вас за конпелятор такой, что не пережевывает рекурсию глубины 100*100? У меня на gcc компилится и запускается всполне нормально. А чем рекурсия плоха? В ФП(созданном специально для космически-больших вычислений), например, все на ней построено и ничего не вылетает. Единственное, с чем могу согласиться, - это то, что вывод выглядит уродливо из-за отсутствия форматирования, но это легко поправить.
   |  
|   | Толяныч (статус: 4-ый класс), 30 марта 2011, 09:38 [#13]:n1tn4tsn0k: Согласен, компилятор у меня старый на старой Win98 на старом буке. В настройках ставил самую большую модель памяти, кажется Large - монофигственно. Но чем объяснить, что даже на вменяемых объемах вроде 20*20 дает кривое решение ( пример у меня в приложении )? Вывод - это не проблема, я поправил.
 А против рекурсии ничего не имею - например, факториал рекурсивно вычисляется на ура. Но у меня скверная привычка простые задачи решать простыми методами, да и более понятно для задавшей вопрос новичка ( новичкихи ? )
 И вообще чисто эстетически - мне мой код больше нравится : стройный, как колнна войск на параде
   |  
|   | n1tn4tsn0k (статус: 1-ый класс), 30 марта 2011, 09:55 [#14]:Вы меня обижаете) Сейчас на парах. Приду домой, покажу свой вывод, а объясняйте уже как-нибудь сами :Р |  
|   | Толяныч (статус: 4-ый класс), 30 марта 2011, 11:44 [#15]:Перевел в Дельфи - все ОК, работает, даже на 100*100. Преимущество моего алгоритма - работает на сколь угодно слабых компах, хоть даже на микроконтроллерах  Вопрос решен.
 ЗЫ : ФП - это функциональное программирование? Или Фурье преобразование?
 |  
|   | Толяныч (статус: 4-ый класс), 30 марта 2011, 12:37 [#16]:Требуется помощь клуба. О моих приключениях с кодом товарища с труднопроизносимым ником описано выше. Перевел в Дельфи - работает! Но радость была недолгой : повторный клик по кнопке даже на небольшой размерности матрицы дает черт-те что.
 Вывод в Memo для уменьшения размера делаю только угловых частей матрицы.
 В чем тут собака порылась ?
 Но остаюсь при своем мнении, что код, зависящий от среды - не комильфо.
 фрагмент кода
 |  
|   | Вадим К (статус: Академик), 30 марта 2011, 13:16 [#17]:как всегда ответ прост - никаких глобальных переменных и сравнения с неинициализированными элементами массива. вот такие три строки
 
   for i := 0 to 110 do
  for j := 0 to 110 do
  a[i,j] := 0;в районе 46 строки решают проблему. А вот почему - это уже другая история   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Толяныч (статус: 4-ый класс), 30 марта 2011, 18:27 [#18]:Чужая душа - потемки, а чужой код - тем более. Мне показалось странным при заполнении массива использовать его прежнее содержание, но это как-то осталось на периферии сознания, в глубь я не вникал, тем более что у автора массив тоже не обнуляется. Ларчик открывался просто. А я уж думал - мистика, проски внеземных инопланетян. Мой алгоритм, выполняющий задачу просто и без затей, рулит. На сем ставлю точку.
 |  5 апреля 2011, 20:28: Вопрос перемещён из тематического раздела Лабораторный практикум » Разное в раздел Лабораторный практикум » C++ модератором Ерёмин А.А. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |