| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > помогите решить задачу с матрицей |
| Автор: b44 18.5.2006, 15:37 |
| помогите развернуть матрицу по часовой стрелке в памяти а не на экране |
| Автор: _hunter 18.5.2006, 15:52 |
| не вопрос -- поможем -- спрашивай что не понятно. |
| Автор: b44 18.5.2006, 15:58 |
| код проги разворота в памяти но она чтото не разворачивает #include <stdlib.h> #include <stdio.h> #include <conio.h> #define b 3 void main() { clrscr(); randomize(); int m[b][b]; int i,j,l,k,z,a,c; for (i=0; i<b; i++) { for (j=0; j<b; j++) { m[i][j]=random(20)+10; printf("%3i",m[i][j]); } printf("\n"); } printf("_________\n\n"); l=b/2; if ((b%2)!=0) l=l+1; for (i=0; i<l; i++) { for (j=(b/2)+2; j>1; j--) { a=m[i][b-(j-1)]; m[i][b-j+1]=m[j][i]; c=m[b-(j-1)][b-(i-1)]; m[b-(j-1)][b-(i-1)]=a; a=m[b-(i-1)][j]; m[b-(i-1)][j]=c; m[j][i]=a; } } for (i=0; i<b; i++) { for (j=0; j<b; j++) { printf("%3i",m[i][j]); } printf("\n"); } getch(); } |
| Автор: likehood 18.5.2006, 17:21 |
| не проще ли записать повёрнутую матрицу в новый массив? Затем можно этот массив скопировать в старый. Больно уж запутанный алгоритм у тебя получается. |
| Автор: b44 18.5.2006, 17:32 |
| пожалуйста напишите код, но лучше переделать написанный мной код, там ошибка в 3 и 4 цикле в диапазонах, я перепечатал эту прогу с паскаля там она отлично работает. |
| Автор: AlanG 18.5.2006, 17:38 |
| А разве правильно использовать одинаковые глобальныйе переменные в дву циклах |
| Автор: likehood 18.5.2006, 17:39 |
| а может кинешь паскалевский код? Только убедительная просьба пользоваться тэгами выделения кода |
| Автор: _hunter 18.5.2006, 17:40 |
| явно не for (j=(b/2)+2; j>1; j--) а for (j=(b/2)+2; j>0; j--) а четвертый -- цикл вывода. какие там ощибки? |
| Автор: AlanG 18.5.2006, 18:05 |
| Ну в принципе задачка не сложная. По логике: в разных циклах передвигать столбцы и строки, и после завершения циклов копировать матрицу, для того чтобы использовать в других. Т.е. каждый цикл изменяет соответствующую сторону. Прикольная задача, порешаю сегодня вечером для себя |
| Автор: b44 18.5.2006, 19:12 |
| Alang потом кинеш решение. Щас кину паскалевский код Uses Crt; Const b=4; Var M:array[1..b,1..b]of integer; i,j,l:byte; a,c:Integer; Begin clrscr; randomize; For i:=1 to b do Begin Writeln; For j:=1 to b do Begin M[i,j]:=Random(90)+10; Write(m[i,j],' '); end; end; Writeln; l:=b div 2; If (b mod 2)<>0 Then l:=l+1; For i:=1 to l do For j:=(b div 2) downto 1 do Begin a:=m[i,b-(j-1)]; m[i,b-j+1]:=m[j,i]; c:=m[b-(j-1),b-(i-1)]; m[b-(j-1),b-(i-1)]:=a; a:=m[b-(i-1),j]; m[b-(i-1),j]:=c; m[j,i]:=a; end; For i:=1 to b do Begin Writeln; For j:=1 to b do Write(m[i,j],' '); end; Readln; end. пожалуйста помогите решить |
| Автор: MAKCim 18.5.2006, 19:49 | ||
поворот матрицы на 90 град. по часовой стрелке код не проверял |
| Автор: b44 19.5.2006, 16:49 |
| пожалуйста лучше исправьте мой код #include <stdlib.h> #include <stdio.h> #include <conio.h> #define b 3 void main() { clrscr(); randomize(); int m[b][b]; int i,j,l,k,z,a,c; for (i=0; i<b; i++) { for (j=0; j<b; j++) { m[i][j]=random(20)+10; printf("%3i",m[i][j]); } printf("\n"); } printf("_________\n\n"); l=b/2; if ((b%2)!=0) l=l+1; for (i=0; i<l; i++) { for (j=(b/2); j>1; j--) { a=m[i][b-(j-1)]; m[i][b-j+1]=m[j][i]; c=m[b-(j-1)][b-(i-1)]; m[b-(j-1)][b-(i-1)]=a; a=m[b-(i-1)][j]; m[b-(i-1)][j]=c; m[j][i]=a; } } for (i=0; i<b; i++) { for (j=0; j<b; j++) { printf("%3i",m[i][j]); } printf("\n"); } getch(); } |
| Автор: Droll 19.5.2006, 20:25 | ||||
Здесь все до безумия просто! Дело в том, что в Паскале Вы создаете массив m[1..b, 1..b], в c++ создаете массив m[0..b-1, 0..b-1], а работать продолжаете как с массивом m[1..b, 1..b]. Т.о., если исправить строчки:
на строчки:
- то у меня все нормально начинает работать. Удачи! |
| Автор: b44 19.5.2006, 21:05 |
| большое спасибо тема закрыта! |
| Автор: AlanG 20.5.2006, 10:03 | ||||
Можно еще свой пример приведу, раз уж подняли вчера Не линейный алгоритм:
Если интересно, то логику могу расписать, так понятно будет сразу, и вообще коментируйте, вдруг ошибок полно, ветдь тоже начинающий, буду рад |