Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Матрица


Автор: Denzel666 24.12.2006, 01:53
Пожалуйста...ПРошу помочь с задачей...



Дан одномерный массив целых чисел А размерностью 64. Получить квадратную матрицу порядка 8 

,элементами которой являются числа массива А, расположенные в ней по схемам, приведенным на 

рис


__  _   __
  / /  / /  /  /|
 / /  / /  /  / | 
/ /  / /  /  / /
|/  / /  /  / /
   / /  /  / /  /|  
  / /  /  / /  / |
 / /  /  / /  / /
|/   /_/ /_/ /_->  в о бщем то же самое почти только стрелка внизу и начинается не так 

маленько...

ПРимер на эту же тему:
   _   _   __
| / / / /  /  /  /|     
|/ / / /  /  /  / |       
  / / /  /  /  /  /   
 / / /  /  /  /  /         
| / /  /  /  /  /               
|/ /  /  /  /  /  /|             
  /  /  /  /  /  / |     
 /  /  /  /  /  /  |      
|_/  /_/  /_/  \|/     
                     | 
 Дан одномерный массив целых чисел Р размерностью 64. Получить квадратную матрицу порядка 8 

,элементами которой являются числа массива Р, расположенные в ней по схеме, приведенной на 

рисунке. Эта задача решается с помощью одного основного цикла, в котором организуется 

управление изменением индексов в зависимости от условий размещения элементов. Для 

отслеживания направления движения по диагонали вводится вспомогательная переменная l. Ее 

значение равно 0 при движении вниз по диагонали и 1 при движении вверх.


Код

#include <stdio.h>
#include <math.h>
#include <conio.h>
main()
  {
  clrscr();
  float p[64];
  float a[8][8];
  int n=8,i=0,j=0,k,l=0;
  for (k=0;k<n*n;k++)
    p[k]=k;
  for (k=0;k<n*n;k++)
    {
    a[i][j]=p[k];
    if(j==0 && i<n-1 && l==0 )
      {
      i++;
      l=1;
      }
    else if(i==0 && j<n-1 && l==1 )
      {
      j++;
      l=0;
      }
    else if( j==n-1 && l==1)
      {
      i++;
      l=0;
      }
    else if(i==n-1 && l==0)
      {
      j++;
      l=1;
      }
    else if(l==0)
      {
      i++;
      j--;
      }
    else
      {
      i--;
      j++;
      }
    }
  for(i=0;i<n;i++)
    {
    for(j=0;j<n;j++)
      printf("%3.0f ",a[i][j]);
    printf ("\n");
    }
  }


Добавлено @ 01:56 
Блин опять забыл язык добавить в тему...Надо что то сделать чтоб это перед глазами всегда висело....(К модераторам относится)..


[Это язык Си]

Автор: Denzel666 24.12.2006, 02:59
яЗЫК Си

Автор: apook 24.12.2006, 04:20
я че то не понял на счет этих схем 

Вот как просто из одномерного в двумерный
Код

#include "stdio.h"

void main()
{
int quick_matrix[8][8], i, j, q, c, start_array[64];

for( i=0; i <64; i++ ) start_array[i] =i;
for( i=0; i <8; i++ ) for( j=0; j <8; j++ ) quick_matrix[i][j] =0;


for( i=0, q=0, c=0; i <64; i++, q++ )
{
    quick_matrix[c][q] =start_array[i];

    if( q==8 )
    {
        c++;  
        q=0;
        }
    }

for( i=0; i <64; i++ ) printf( "%d ", start_array[i] );
puts( "\n" );
for( i=0; i <8; i++ )
{
    for( j=0; j <8; j++ )
        printf( "%2d ", quick_matrix[i][j] );
puts( "" );
}

return;
}

Автор: Anikmar 24.12.2006, 10:14
Цитата(apook @  24.12.2006,  04:20 Найти цитируемый пост)
if( q==8 )

Мне кажется, что там нужно не 8, а 7 ставить

Автор: GIK 24.12.2006, 14:06
Цитата(Denzel666)

Дан одномерный массив целых чисел А размерностью 64. Получить квадратную матрицу порядка 8 

,элементами которой являются числа массива А, расположенные в ней по схемам, приведенным на 

рис

Не понятна схема, понятна только твоя похожая задача. Она работает корректно. 
Линейное передвижение: 
вниз -->  вверх по диагонали --> влево --> вниз по диагонали. 
Все видно когда прочитаеш код, я расписал шаги и немно логики. Скажи конкретно задачу, опиши ее правильно, тогда уже можно над чем то думать.
Код

#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <iostream>

main()
  {
  clrscr();
  float p[64];
  float a[8][8];
  int n=8,i=0,j=0,k,l=0;
  for (k=0;k<n*n;k++)
    p[k]=k;
  for (k=0;k<n*n;k++)
    {
    a[i][j]=p[k];    
 
               //направляем вниз (далее по диаганали вверх), Обязательное условие i<n-1, т.е. это не нижний край матрицы
    if(j==0 && i<n-1 && l==0)   
      {
       i++;
       l=1;
      }      //направляем вправо (далее по диаганали вниз), Обязательное условие j<n-1, т.е. это не левый край матрицы 
     else if(i==0 && j<n-1 && l==1) 
      {
       j++;
       l=0;
      }
    else if( j==n-1 && l==1) //направление вниз когда дошли до левого края матрицы
      {
       i++;
       l=0;
      }
    else if(i==n-1 && l==0) //направление вправо, когда дошли до нижнего края матрицы
      {
       j++;
       l=1;
      }
    else if(l==0) //когда не края матрицы (переменные i и J не = 0 равны краям матрицы), и передвижение по диагонали ВНИЗ
      {
       i++;
       j--;
      }
    else  //когда не края матрицы (переменные i и J не = 0 и не равны краям матрицы), и передвижение по диагонали ВВЕРХ 
      {
       i--;
       j++;
      }
    }


  for(i=0;i<n;i++)
    {
    for(j=0;j<n;j++)
      printf("%3.0f ",a[i][j]);
    printf ("\n");
    }
 char ch;
 std::cin>>ch;
  }


PS. Из какого курса задачка?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)