Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2010, 17:06   #1
AnDre_rus
 
Регистрация: 19.10.2010
Сообщений: 8
Вопрос Задача на преобразование матрицы

Текст задачи
Назовём допустимым преобразованием матрицы смещение строк матрицы на одну снизу верхи и столбцов на один справа на лево, при этом строка опускается вниз, а первый столбец становится последним. Дана действительная квадратная матрица порядка n. С помощью допустимых преобразований добиться того, что бы элемент матрицы, обладающий наименьшим значением, располагался в левом верхнем углу матрицы.

Мой код:
Код:
#include <MATH.H>
#include <CONIO.H>
#include <STDIO.H>
#include <STDLIB.H>

int main()
{float a[5][5],min,t;
int k,mi,mj,i,j,n;
//clrscr;

printf("\n BBEDuTE PAZMEP KBADPATHOu` MATPuu,u N=");
scanf("%d",&n);



 for (i=0;i<n;i++)     //3ADAHuE MATPuu,bI
  for (j=0;j<n;j++)
   a[i][j]=rand ();

min=a[0][0];
 for (i=0;i<n;i++)    //        HAXO}|{DEHuE
  for (j=0;j<n;j++)   //        MuHuMAJIbHOrO
  if (a[i][j]<min)    //     3A4EHu9 u Ero uHDEKCOB
   {
   min=a[i][j];
   mi=i;
   mj=j;
   };
 printf("%f %d %d\n",min,mi,mj); //IIPOME}|{. BbIBOD


for (i=0;i<n;i++)  //BbIBOD UcxoDHOu
   {
    for (j=0;j<n;j++)
     {
     printf("%5.0f",a[i][j]);
     };
    printf("\n");
   };
	 printf("\n");



for (k=0;k<n;k++) //CDBur BBEPX
 {
 for (i=0; i<n; i++)
  {
  t=a[0][i];
   for (j=1; j<n; j++)
   a[j-1][i]=a[j][i];
   a[n][i]=t;
  }
 };


for (k=0;k<n;k++) //CDBur B JIEBO
 {
 for (i=0; i<n; i++)
  {
  t=a[i][0];
   for (j=1; j<n; j++)
   a[i][j-1]=a[i][j];
   a[i][n]=t;
  }
 };


  for (i=0;i<n;i++)  //BbIBOD IIPEO6PA3OBAHHOu
   {
    for (j=0;j<n;j++)
     {
     printf("%5.0f",a[i][j]);
     };
    printf("\n");
   };
 getch();

}
Программа запускается, но работает не корректно по непонятным мне причинам.
В режиме отладки наблюдаю какие то не поддающиеся логике зацикливания и т.п. дребедень.
Я только начинаю учить Си, поэтому вполне возможно, все проблемы связаны с этим.

Подскажите, плиз, что именно не так !?
AnDre_rus вне форума Ответить с цитированием
Старый 19.10.2010, 17:19   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

прикольное задание, нестандартное. хотя и простое. если никто не отпишется, вечером сделаю
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 19.10.2010, 17:49   #3
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

2 AnDre_rus вчера делал один в один задание, но на паскале.
Вот погляди:
http://programmersforum.ru/showthread.php?t=117460
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 19.10.2010, 18:35   #4
Fantom.as
Пользователь
 
Аватар для Fantom.as
 
Регистрация: 19.04.2010
Сообщений: 62
Сообщение

Цитата:
#include "clocale" //Вывод русских символов
setlocale(LC_ALL,"rus");
Может не в тему но так ты сможешь выводить и печатать русские символы
<--<--<--Нажми на весы слева <---<---<---
Fantom.as вне форума Ответить с цитированием
Старый 19.10.2010, 19:08   #5
AnDre_rus
 
Регистрация: 19.10.2010
Сообщений: 8
По умолчанию

Roof, спасибо!
Но этот алгоритм я тоже переписал с задачи на паскале, алгоритм рабочий и переписал, вроде бы, с умом, но вот где то затык.
Переписывать ещё один алгоритм смысла не вижу, мне бы с этим лучше кто помог разобраться.

Fantom.as, спасибо, пригодится!

pproger, напиши, плиз, а лучше просто подскажи где в этом коде ошибка?..
AnDre_rus вне форума Ответить с цитированием
Старый 19.10.2010, 19:57   #6
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

2 AnDre_rus ННу хорошо, давай с твоим кодом поразбираемся.
1) Не увидел использования srand.
2) что делает следующий код?
Код:
for (k=0;k<n;k++) //CDBur BBEPX
 {
 for (i=0; i<n; i++)
  {
  t=a[0][i];
   for (j=1; j<n; j++)
   a[j-1][i]=a[j][i];
   a[n][i]=t;
  }
 };
Зачем тут три цикла?
Смысл перемещения как такового - менять местами две соседние строки - поэлементно, а это значит:
- нужен цикл для перебора всех элементов строки и обмена поэлементно со строкой выше
- нужен цикл - для повтора действия, до тех пор, пока строка не станет первой
Полагая, что mi - это индекс строки с минимальным элементом:
Код:
 while (mi > 0) // пока mi не стал на первой строке (индекс 0)
    {
        for(j = 0; j < n; j++) //перебираем элементы строки, меняя местами с верхней
        {
            temp = a[mi - 1][j]; // запоминаем элемент верхней строки
            a[mi - 1][j] = a[mi][j]; // перезаписываем элемент верхней строки значением элемента текущей строки
            a[mi][j] = temp; // перезаписываем элемент текущей строки значением верхней строки, которое предварительно запомнили
        }
        mi -= 1;  // теперь необходимо уменьшить индекс строки с минимальным элементом - ведь уже эта строка выше
    }
3) стиль написания комментариев и строк в программе на русском - жуть.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли

Последний раз редактировалось Roof; 19.10.2010 в 20:00.
Roof вне форума Ответить с цитированием
Старый 19.10.2010, 21:16   #7
AnDre_rus
 
Регистрация: 19.10.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Roof Посмотреть сообщение
2 AnDre_rus ННу хорошо, давай с твоим кодом поразбираемся.
1) Не увидел использования srand.
2) что делает следующий код?
Код:
for (k=0;k<n;k++) //CDBur BBEPX
 {
 for (i=0; i<n; i++)
  {
  t=a[0][i];
   for (j=1; j<n; j++)
   a[j-1][i]=a[j][i];
   a[n][i]=t;
  }
 };
Зачем тут три цикла?
Смысл перемещения как такового - менять местами две соседние строки - поэлементно, а это значит:
- нужен цикл для перебора всех элементов строки и обмена поэлементно со строкой выше
- нужен цикл - для повтора действия, до тех пор, пока строка не станет первой
Полагая, что mi - это индекс строки с минимальным элементом:
Код:
 while (mi > 0) // пока mi не стал на первой строке (индекс 0)
    {
        for(j = 0; j < n; j++) //перебираем элементы строки, меняя местами с верхней
        {
            temp = a[mi - 1][j]; // запоминаем элемент верхней строки
            a[mi - 1][j] = a[mi][j]; // перезаписываем элемент верхней строки значением элемента текущей строки
            a[mi][j] = temp; // перезаписываем элемент текущей строки значением верхней строки, которое предварительно запомнили
        }
        mi -= 1;  // теперь необходимо уменьшить индекс строки с минимальным элементом - ведь уже эта строка выше
    }
3) стиль написания комментариев и строк в программе на русском - жуть.
Да, с циклами действительно какая то лабуда %)
но этот вариант тоже не корректно работает.
сейчас разберусь с циклами в своём коде, мб что получится...
AnDre_rus вне форума Ответить с цитированием
Старый 19.10.2010, 21:51   #8
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

Цитата:
но этот вариант тоже не корректно работает.
приведи полный код - как и что делаешь.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 19.10.2010, 22:30   #9
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

держи. сдвиги эти делал раньше, взял свой прошлый код. он немного расширенный по заданию, чем твой, но мне лень было вырезать) вобщем разберешься

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define ROWS 5
#define COLS 5

//--------------------------------------------------------------------------------------
int **create_mass()
{
	int i, j;
	int **ret = (int **) malloc(sizeof(int *) * ROWS);
	for (i = 0; i < ROWS; i++)
		ret[i] = (int *) malloc(sizeof(int) * COLS);

	for (i = 0; i < ROWS; i++)
		for (j = 0; j < COLS; j++)
			ret[i][j] = rand() % 100;

	return ret;
}

//--------------------------------------------------------------------------------------
void free_mass(int **mass)
{
	int i;
	for (i = 0; i < ROWS; i++)
		free(mass[i]);
	free(mass);
}

//--------------------------------------------------------------------------------------
void print_mass(int **mass)
{
	int i, j;
	for (i = 0; i < ROWS; i++) {
		for (j = 0; j < COLS; j++)
			printf("%d ", mass[i][j]);
		printf("\n");
	}

	printf("\n");
}

/* val - на сколько сдвинуть, to - куда сдвинуть (1 либо 0) */
//--------------------------------------------------------------------------------------
void shift_rows(int **mass, int val, int to)
{
	int i, *temp;

	if (to) {
		while (val-- > 0) {
			for (i = 0; i < ROWS - 1; i++) {
				temp = mass[i];
				mass[i] = mass[i + 1];
				mass[i + 1] = temp;
			}
		}
	} else {
		while (val-- > 0) {
			for (i = ROWS - 1; i > 0; i--) {
				temp = mass[i];
				mass[i] = mass[i - 1];
				mass[i - 1] = temp;
			}
		}
	}
}

/* val - на сколько сдвинуть, to - куда сдвинуть (1 либо 0) */
//--------------------------------------------------------------------------------------
void shift_cols(int **mass, int val, int to)
{
	int i, j, temp;

	if (to) {
		while (val-- > 0) {
			for (i = 0; i < COLS - 1; i++) {
				for (j = 0; j < ROWS; j++) {
					temp = mass[j][i];
					mass[j][i] = mass[j][i + 1];
					mass[j][i + 1] = temp;
				}
			}
		}
	} else {
		while (val-- > 0) {
			for (i = COLS - 1; i > 0; i--) {
				for (j = ROWS - 1; j >= 0; j--) {
					temp = mass[j][i];
					mass[j][i] = mass[j][i - 1];
					mass[j][i - 1] = temp;
				}
			}
		}
	}
}

//--------------------------------------------------------------------------------------
int get_min(int **mass, int *x, int *y)
{
	int i, j, ret;

	*x = 0;
	*y = 0;
	ret = mass[0][0];

	for (i = 0; i < COLS; i++) {
		for (j = 0; j < ROWS; j++) {
			if (ret > mass[i][j]) {
				ret = mass[i][j];
				*x = i;
				*y = j;
			}
		}
	}

	return ret;
}

//--------------------------------------------------------------------------------------
int main()
{
	srand((unsigned int)time(NULL));

	int i, min, x, y;
	int **mass = create_mass();

	printf("current mass:\n\n");
	print_mass(mass);

	min = get_min(mass, &x, &y);
	printf("min = %d, x = %d, y = %d\n\n", min, x, y);

	for (i = 0; i < y; i++)
		shift_cols(mass, 1, 1);

	for (i = 0; i < x; i++)
		shift_rows(mass, 1, 1);

	printf("new mass:\n\n");
	print_mass(mass);

	free_mass(mass);

	return (0);
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 20.10.2010, 19:32   #10
AnDre_rus
 
Регистрация: 19.10.2010
Сообщений: 8
Вопрос

pproger, спасибо за код - работает на ура, но вот понять я ео до конца не могу. а тем более откорректировать под своё задание.

Попробуйте кто нибудь запустить вот этот код в режиме отладки:
Код:
#include <MATH.H>
#include <CONIO.H>
#include <STDIO.H>
#include <STDLIB.H>

int main()
{float a[5][5],min,t;
int k,mi,mj,i,j,n;
clrscr;

printf("\n BBEDuTE PAZMEP KBADPATHOu` MATPuu,u N=");
scanf("%d",&n);

randomize();

 for (i=0;i<n;i++)     //3ADAHuE MATPuu,bI
  for (j=0;j<n;j++)
   a[i][j]=random (30);

min=a[0][0];
 for (i=0;i<n;i++)    //        HAXO}|{DEHuE
  for (j=0;j<n;j++)   //        MuHuMAJIbHOrO
  if (a[i][j]<min)    //     3A4EHu9 u Ero uHDEKCOB
   {
   min=a[i][j];
   mi=i;
   mj=j;
   };
 printf("%f %d %d\n",min,mi,mj); //IIPOME}|{. BbIBOD


for (i=0;i<n;i++)  //BbIBOD UcxoDHOu
   {
    for (j=0;j<n;j++)
     {
     printf("%5.0f",a[i][j]);
     };
    printf("\n");
   };
	 printf("\n");



while (mi>0) //CDBur BBEPX
 {
 for (i=0; i<n; i++)
  {
  t=a[0][i];
   for (j=1; j<n; j++)
   a[j-1][i]=a[j][i];
   a[n][i]=t;
  }
  mi=mi-1;
 };


while (mj>0) //CDBur BJIEBO
 {
 for (i=0; i<n; i++)
  {
  t=a[i][0];
   for (j=1; j<n; j++)
   a[i][j-1]=a[i][j];
   a[i][n]=t;
  }
  mj=mj-1;
 };


  for (i=0;i<n;i++)  //BbIBOD IIPEO6PA3OBAHHOu
   {
    for (j=0;j<n;j++)
     {
     printf("%5.0f",a[i][j]);
     };
    printf("\n");
   };
 getch();

}
не могу понять откуда берутся запредельные значения переменной n в блоках "сдвиг вверх" и "сдвиг влево"?
из за них и происходит зацикливание...

Последний раз редактировалось AnDre_rus; 20.10.2010 в 19:40.
AnDre_rus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование матрицы. (транспонирование) AndyShafl Помощь студентам 9 23.12.2009 17:25
Преобразование матрицы. AndyShafl Общие вопросы Delphi 1 22.12.2009 13:59
Преобразование двумерной матрицы в одномерную shamrock Помощь студентам 7 18.06.2009 18:09
Задача на бит-реверсивное преобразование Ser Помощь студентам 2 16.03.2009 10:55