Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Controller
0 / 0 / 0
Регистрация: 23.10.2014
Сообщений: 9
#1

Проблема с выводом массива спиралью против часовой стрелки - C++

05.02.2015, 09:31. Просмотров 495. Ответов 5
Метки нет (Все метки)

Здравствуйте, недавно была задача, создать массив 10х10 рандомных чисел и вывести спиралью против часовой стрелки. В паскале задачу я выполнил и попытался перенести код на с++. К сожалению на этапе вывода значений спирали у меня возникли сложности.Я понимаю что на с++ массив начинается с 0, но самостоятельно исправить ошибку не смог.
Код на паскале
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Program HelloWorld;
var i,j,l,k,il,ik,min:integer;
x,y:array[1..10,1..10] of integer;
output: array[1..100] of integer;
m:integer;
x1,y1,num,add,dir:integer;
begin
for i:= 1 to 10 do
for j:=1 to 10 do
x[i,j]:=random(101);
 
for i:= 1 to 10 do
for j:=1 to 10 do Begin
min:=10000;
for l:=1 to 10 do
for k:=1 to 10 do
if(x[l,k]<min) then Begin
min:=x[l,k];
il:=l;
ik:=k;
End;
y[i,j]:=min;
x[il,ik]:=10000;
End;
 
for i:=1 to 10 do Begin
  for j:=1 to 10 do Begin
    Write(y[i,j]:4);
    output[(i-1)*10+j]:=y[i,j];
  End;
  WriteLn;
End;
 
 
j:=1; // output pointer
 
m:=10;
writeln('Вывод элементов по спирали от [1,1] против часовой стрелки:');
x1:=1;{первый столбец}
y1:=0;{начнем сверху}
Add:=m;{начальная длина пути в одном направлении}
dir:=1;{знак направления +1 вниз и вправо, -1 вверх и влево}
while (add<>0) do{пока не пройдем все пути}
begin
  i:=0;
  while (i<>add) do begin
    y1:=y1+dir;{вниз, вверх}
    //write(y[y1,x1],' ');
    x[y1,x1]:=output[j];
    j:=j+1;
    i:=i+1;
  end;
  i:=0;
  add:=add-1;{уменьшаем путь}
  while (i<>add) do begin
    x1:=x1+dir;{вправо-влево}
    //write(y[y1,x1],' ');
    x[y1,x1]:=output[j];
    j:=j+1;
    i:=i+1;
  end;
  dir:=dir*(-1);{после каждых двух отрезков меняем знак}
end;
 
for i:=1 to 10 do Begin
  for j:=1 to 10 do
    Write(x[i,j]:4);
  WriteLn;
End;
 
end.


А вот мой перенос кода на с++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include "stdio.h"
#include <stdlib.h>
using namespace std;
 
int main()
{int m,i,j,l,k,il,ik,min;
int x[10][10],y[10][10],output[100];
int x1,y1,num,add,dir;
for (i=0;i!=10;i++)
for (j=0;j!=10;j++)
{x[i][j]=rand()%100 +1;}
 
for (i=0;i!=10;i++)
for (j=0;j!=10;j++)
    {min=10000;
    for (l=0;l!=10;l++)
    for (k=0;k!=10;k++)
        if(x[l][k]<min)
            {min=x[l][k];
            il=l;
            ik=k;
            }
            y[i][j]=min;
            x[il][ik]=10000;
 
    }
for (i=0;i!=10;i++){
    for(j=0;j!=10;j++)
        {cout<<y[i][j]<<"   ";
        }
        cout<<"\n";
    }
j=1;
m=10;
cout<<"Вывод элементов массива согласно условию \n";
x1=1;
y1=0;
add=m;
dir=1;
while(add!=0)
    {i=0;
        while(i!=add)
            {y1=y1+dir;
            x[y1][x1]=output[j];
            j=j+1;
            i=i+1;
            }
            i=0;
            add=add-1;
        while(i!=add)
        {x1=x1+dir;
        x[y1][x1]=output[j];
         j=j+1;
         i=i+1;}
         dir=dir*(-1);}
  for(i=0;i!=10;i++)
    {for(j=0;j!=10;j++)
    {cout<<x[i][j]<<" ";
    }
    cout<<"\n";
        }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2015, 09:31
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Проблема с выводом массива спиралью против часовой стрелки (C++):

Сформируйте линейный массив получающийся при чтении массива с левого верхнего угла до середины против часовой стрелки - C++
Помогите, пожалуйста, составить программу, для решения такой задачи: Дан двумерный массив целых чисел А . Сформируйте линейный массив В ,...

Поворот матрицы против часовой стрелки - C++
Здравствуйте! Я собрал программу для решения этой задачи, но программа всё равно не работает. // Программа_№5.cpp: определяет точку...

Заполнение матрицы против часовой стрелки - C++
Заполнить матрицу 9х9 числами, начиная с единицы: вниз - вправо - вверх - влево. Помогите, пожалуйста. Срочно надо...

Повернуть матрицу против часовой стрелки - C++
Повернуть матрицу против часовой стрелки. Я написал программу, но она не запускается. Где-то я опять ошибся. :-( // Программа_№5.cpp:...

Заполнить матрицу с середины против часовой стрелки - C++
Нужно заполнить квадратную матрицу(то есть размер nXn) нужно заполнить по спирали, начиная с центра и продолжая идти против часовой...

Повернуть массив на 90˚ против часовой стрелки - C++
Здравствуйте. Помогите пожалуйста решить задание по c++. Нужно повернуть массив на 90˚ против часовой стрелки.

5
Yan12_04
30 / 30 / 16
Регистрация: 05.11.2014
Сообщений: 117
05.02.2015, 10:11 #2
О боже!!!
0
1XPLoade1
30 / 30 / 17
Регистрация: 23.01.2015
Сообщений: 174
05.02.2015, 11:12 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <memory.h>
 
#define N 10
#define M 20
 
int main(int argc, char* argv[])
{
    int** A = new int*[N];
    memset((void*)A, 0x00, sizeof(int*) * N);
 
    for (int i1 = 0; i1 < N; i1++)
    {
        A[i1] = new int[M];
        for (int i2 = 0; i2 < M; i2++)
        {
            A[i1][i2] = rand() % 9 + 1;
            printf("%d ", A[i1][i2]);
        }
 
        printf("\n");
    }
 
    printf("\n\n");
 
    int C[N * M] = { 0 }, n = 0;
    memset((void*)C, 0x00, sizeof(int) * N * M);
 
    for (int r = 0; r < N / 2; r++)
    {
        for (int k1 = M - 1 - r; k1 >= r; k1--)
            C[n++] = A[r][k1];
 
        for (int k2 = r + 1; k2 < N - 1 - r; k2++)
            C[n++] = A[k2][r];
 
        for (int k3 = r; k3 < M - 1 - r; k3++)
            C[n++] = A[N - r - 1][k3];
 
        for (int k4 = N - r - 1; k4 >= r + 1; k4--)
            C[n++] = A[k4][M - r - 1];
    }
 
    for (int i = 0; i < N * M; i++)
        printf("%d ", C[i]);
 
    printf("\n\n");
 
    for (int j = N * M - 1; j >= 0; j--)
        printf("%d ", C[j]);
 
    printf("\n");
 
    _getch();
 
    return 0;
}
http://codepad.org/Cq9q8zyn
0
Миниатюры
Проблема с выводом массива спиралью против часовой стрелки  
azoller
17 / 17 / 1
Регистрация: 03.05.2013
Сообщений: 114
05.02.2015, 11:15 #4
С чувством, с толком, с расстановкой.
0
Controller
0 / 0 / 0
Регистрация: 23.10.2014
Сообщений: 9
05.02.2015, 11:47  [ТС] #5
Цитата Сообщение от 1XPLoade1 Посмотреть сообщение
Код C++

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <memory.h>
#define N 10
#define M 20
int main(int argc, char* argv[])
{
* * int** A = new int*[N];
* * memset((void*)A, 0x00, sizeof(int*) * N);
for (int i1 = 0; i1 < N; i1++)
* * {
* * * * A[i1] = new int[M];
* * * * for (int i2 = 0; i2 < M; i2++)
* * * * {
* * * * * * A[i1][i2] = rand() % 9 + 1;
* * * * * * printf("%d ", A[i1][i2]);
* * * * }
printf("\n");
* * }
printf("\n\n");
int C[N * M] = { 0 }, n = 0;
* * memset((void*)C, 0x00, sizeof(int) * N * M);
for (int r = 0; r < N / 2; r++)
* * {
* * * * for (int k1 = M - 1 - r; k1 >= r; k1--)
* * * * * * C[n++] = A[r][k1];
for (int k2 = r + 1; k2 < N - 1 - r; k2++)
* * * * * * C[n++] = A[k2][r];
for (int k3 = r; k3 < M - 1 - r; k3++)
* * * * * * C[n++] = A[N - r - 1][k3];
for (int k4 = N - r - 1; k4 >= r + 1; k4--)
* * * * * * C[n++] = A[k4][M - r - 1];
* * }
for (int i = 0; i < N * M; i++)
* * * * printf("%d ", C[i]);
printf("\n\n");
for (int j = N * M - 1; j >= 0; j--)
* * * * printf("%d ", C[j]);
printf("\n");
_getch();
return 0;
}
Спасибо, но совсем не то что мне нужно . (Возможно я не совсем правильно выразился в начале теми)Согласно условия:
Задана матрица размером 10х10 рандомных чисел от 0 до 100. Ее нужно отсортировать методом вставки спиралью с верхнего левого угла против часовой стрелки. При решение нужно использовать процедуры. Следует вывести массив до обработки и после и после.
Спираль должна выглядеть примерно так:
0 17 15 13 12
0 19 35 31 11
1 21 22 30 7
1 2 3 5 6
0
magnetall
2 / 2 / 1
Регистрация: 03.02.2015
Сообщений: 23
05.02.2015, 13:05 #6
Как тебе уже писали в другой теме :
1. начни с форматирования кода и замены названия переменных.
2. Забудь про Паскаль.
3. Разбей существующий код на функции
4. Пойми какая функция работает не правильно
5. Исправь
0
05.02.2015, 13:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2015, 13:05
Привет! Вот еще темы с ответами:

Поменять элементы матрицы в направлении против часовой стрелки - C++
всем здраствуйте, мне надо составить программу чтобы меняла элементы матрицы в направлении против часовой стрелки, а центр остается...

Повернуть матрицу с случайными числами на 90 градусов против часовой стрелки - C++
Задание звучит так: Заполнить матрицу случайными числами. Развернуть матрицу на 90o против часовой стрелки. Поможет кто?

Вывести содержимое файла в матрицу по спирали против часовой стрелки - C++
необходимо считывать из файла символ и заносить его в матрицу по спирали против часовой стрелки, не совсем понятен алгоритм заполнения как...

Как повернуть элементы матрицы на 90 градусов против часовой стрелки? - C++
ЗАДАНИЕ: Дана матрица. Повернуть все её элементы вокруг центра на 90 градусов против часовой стрелки. #include &lt;iostream&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru