Форум программистов, компьютерный форум CyberForum.ru

прямоугольный массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
mike273
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 7
29.12.2011, 15:08     прямоугольный массив #1
В прямоугольном массиве с помощью функции найти элемент, у которого самая большая сумма "соседей". Найденный элемент и его индексы напечатать. Исходные числа из файла читать,



1) Распечатать исходный массив с помощью процедуры.
2) Построить функцию, которая для произвольного внутреннего элемента передаваемого ей массива находит сумму всех соседних (8 штук).



файл с данными DATF.TXT


1 2 3 4 5 6 7
5 4 5 7 3 8 0
1 2 6 4 7 9 5
4 5 6 7 3 6 8
1 3 4 5 7 4 6
9 7 6 4 6 7 4
4 6 0 7 6 5 3
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jaguar799
7 / 5 / 1
Регистрация: 08.10.2010
Сообщений: 57
29.12.2011, 22:05     прямоугольный массив #2
Цитата Сообщение от mike273 Посмотреть сообщение
В прямоугольном массиве с помощью функции найти элемент, у которого самая большая сумма "соседей". Найденный элемент и его индексы напечатать. Исходные числа из файла читать,



1) Распечатать исходный массив с помощью процедуры.
2) Построить функцию, которая для произвольного внутреннего элемента передаваемого ей массива находит сумму всех соседних (8 штук).



файл с данными DATF.TXT


1 2 3 4 5 6 7
5 4 5 7 3 8 0
1 2 6 4 7 9 5
4 5 6 7 3 6 8
1 3 4 5 7 4 6
9 7 6 4 6 7 4
4 6 0 7 6 5 3
Это не прямоугольный массив а квадратный стороны которого равны 7х7. Учи геометрию.
oniks
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
30.12.2011, 02:25     прямоугольный массив #3
Цитата Сообщение от mike273 Посмотреть сообщение
найти элемент, у которого самая большая сумма "соседей".
Соседи по горизонтали, вертикали и диагонали?
P.S. Это называется матрица, а не прямоугольный массив.Facepalm.
asm
 Аватар для asm
62 / 35 / 1
Регистрация: 05.10.2011
Сообщений: 137
30.12.2011, 05:03     прямоугольный массив #4
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
64
#include <iostream.h>
#include <windows.h>
#include <conio.h>
 
void main()
{
        FILE *file;
        char c;
        int m[7][7],i=0,j=0,msize=7;
        struct
        {
                int sum;
                int col;
                int row;
        }MAX;
 
        if( (file = fopen("DATF.TXT","r")) == NULL ) {
        cout << "Не удалось открыть файл." << endl;
        goto end;
    }
 
        while ((c = fgetc(file)) != EOF)
        {
                if(!(c>=0x30&&c<=0x39))continue;
                if(c=='\n') { j=0; i++; continue; }
                m[i][j++] = atoi(&c);
        }
 
        //for(i=0;i<msize;i++)
        //{for(j=0;j<msize;j++)
        //cout << m[i][j];cout<<endl;}
 
        MAX.sum=0;
        for(i=1;i<msize-1;i++)
        for(j=1;j<msize-1;j++)
        {
                int sum=0;
                sum+=m[i-1][j-1];
                sum+=m[i-1][j];
                sum+=m[i-1][j+1];
                sum+=m[i][j-1];
                sum+=m[i][j+1];
                sum+=m[i+1][j-1];
                sum+=m[i+1][j];
                sum+=m[i+1][j+1];
 
                if(MAX.sum < sum)
                {
                        MAX.sum = sum;
                        MAX.row = i;
                        MAX.col = j;
                }
        }
 
        cout << "MAX is on row " << MAX.row+1 <<
                ", column " << MAX.col+1 <<
                ", has sum " << MAX.sum <<
                " and has number " << m[MAX.row][MAX.col] <<endl;
 
        fclose(file);
 
end:
        system("pause");
}
распечатка массива в коментариях
а функцию для произвольных элементов из этого куска написать
C++
1
2
3
4
5
6
7
8
9
10
                
                int sum=0;
                sum+=m[i-1][j-1];
                sum+=m[i-1][j];
                sum+=m[i-1][j+1];
                sum+=m[i][j-1];
                sum+=m[i][j+1];
                sum+=m[i+1][j-1];
                sum+=m[i+1][j];
                sum+=m[i+1][j+1];
причем
i>=1; j>=1;
i<msize-1; j<msize-1.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
30.12.2011, 06:24     прямоугольный массив #5
C
1
2
3
4
5
6
7
8
                int sum=0;
                sum+=m[i-1][j-1];
                sum+=m[i-1][j];
                sum+=m[i-1][j+1];
                sum+=m[i][j-1];
                sum+=m[i][j+1];
                sum+=m[i+1][j-1];
                sum+=m[i+1][j];
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
30.12.2011, 09:55     прямоугольный массив #6
С Новым Годом!

Внимание. Программа просит пользователя ввести реальные номера колонок и строк. т.е начиная не с 0 (нуля), а с 1 (единицы). Ваша матрицы 7 на 7 поэтому от 1 до 7

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
 
#include <fstream>
using std::ifstream;
 
//для чтения файла и заполнения матрицы
void fillMatrixFromFile(int **, const int &, ifstream &);
//для печати матрицы
void printMatrix(int **, const int &);
 
//для поиска суммы всех соседей произволного элемента
//координаты элемента передаются в виде индексов строки и колнки
bool getNeighboursSum(int **, const int &, const int &, const int &, int &);
 
int main() {
 
    const int size = 7;
    int **myMatrix;
    int rowNumber, columnNumber, sum = 0;
 
    ifstream myFile("C:\\DATF.TXT");
    if (myFile.is_open()) {
 
        myMatrix = new int*[size];
        for (int i = 0; i < size; ++i) {
            myMatrix[i] = new int[size];
        }
 
        //читаем файл. заполняем матрицу
        fillMatrixFromFile(myMatrix, size, myFile);
        myFile.close();
 
        //напечатаем то что считали из файла
        printMatrix(myMatrix, size);
 
        cout << "\nPlease enter row number (from 1 to 7)::\n>";
        cin >> rowNumber;
        rowNumber--;
        cout << "\nPlease enter column number (from 1 to 7) ::\n>";
        cin >> columnNumber;
        columnNumber--;
 
        if(getNeighboursSum(myMatrix, size, rowNumber, columnNumber, sum)){
            cout << "\nSum of Neighbours is :: " << sum << endl;
        } else {
            cout << "Error :: Chosen element is not an internal !!";
        }
 
    } else {
        cout << "Error :: Cannot open file !";
    }
 
    cin.ignore();
    cin.get();
    return 0;
}
 
bool getNeighboursSum(int **myMatrix, const int &size, const int &row, const int &column, int &sum){
    //если элемент внутри матрицы (т.е. не на крайних полях матрицы)
    if(row > 0 && row < size-1 && column > 0 && column < size -1 ){
        for(int i = row-1; i <= row+1; ++i){
            for(int j = column-1; j <=column+1; ++j){
                if(i!=row || j!=column){
                    sum+= myMatrix[i][j];
                }
            }
        }
    } else { // если элемент не внутренний
        return false;
    }
    return true;
}
 
void printMatrix(int **myMatrix, const int &size) {
    for (int i = 0; i < size; ++i) {
        for (int j = 0; j < size; ++j) {
            cout << myMatrix[i][j] << " ";
        }
        cout << endl;
    }
}
 
void fillMatrixFromFile(int **myMatrix, const int &size, ifstream &myFile) {
    for (int i = 0; i < size && !myFile.eof(); ++i) {
        for (int j = 0; j < size && !myFile.eof(); ++j) {
            myFile >> myMatrix[i][j];
        }
    }
 
}
ВЫВОД

1 2 3 4 5 6 7
5 4 5 7 3 8 0
1 2 6 4 7 9 5
4 5 6 7 3 6 8
1 3 4 5 7 4 6
9 7 6 4 6 7 4
4 6 0 7 6 5 3

Please enter row number (from 1 to 7)::
>4

Please enter column number (from 1 to 7) ::
>4
Sum of Neighbours is :: 42

----------------------------------------
------- С ошибкой ---------------------
1 2 3 4 5 6 7
5 4 5 7 3 8 0
1 2 6 4 7 9 5
4 5 6 7 3 6 8
1 3 4 5 7 4 6
9 7 6 4 6 7 4
4 6 0 7 6 5 3

Please enter row number (from 1 to 7)::
>3

Please enter column number (from 1 to 7) ::
>1
Error :: Chosen element is not an internal !!


ЗЫ: не забудьте файл с матрицей положить в корень диска C:\ или меняйте путь к файлу в программе.

Не по теме:

будете НГ отмечать не поминайте лихом.

asm
 Аватар для asm
62 / 35 / 1
Регистрация: 05.10.2011
Сообщений: 137
30.12.2011, 14:42     прямоугольный массив #7
Цитата Сообщение от greeezz Посмотреть сообщение
myMatrix = new int*[size]; for (int i = 0; i < size; ++i) { myMatrix[i] = new int[size]; }
надо это удалять с памяти
oniks
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
30.12.2011, 15:25     прямоугольный массив #8
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
 
void Print(int **m, int row, int col) //Вывод матрицы
{
    for (int i=0; i<row;i++) 
    {
        for (int j=0; j<col;j++)
            cout << m[i][j] << " ";
        cout << endl;
    }
}
 
int SumOfNeighbors(int **m, int i, int j) // Находит сумму всех соседних элементов (8 штук)
{
    int sum=m[i-1][j-1]+m[i-1][j]+m[i-1][j+1]+m[i][j-1]+m[i][j+1]+m[i+1][j-1]+m[i+1][j]+m[i+1][j+1];
    return sum;
}
 
int main()
{
    int col,row,i=0,j=0,Max,MaxI,MaxJ;
    string s,num;
    setlocale(0,"");
    ifstream f("C:\\datf.txt");
    cout << "Ведите колличество строк и столбцов:" <<endl;
    cin >> row >> col;
 
    int **matrix = new int* [row];
    for(int z=0;z<col;z++)
        matrix[z] = new int [col];
 
    //Нахождение матрицы из текстового файла
    while(!f.eof())
    {
        for(int y=0;y<row;y++)
        {
            getline(f,s); s+=' ';
            j=0;
            for (int n=0;n<=13;n++)
            {
                if(s[n]!=' ')
                {
                    num+=s[n];
                }
                else
                {
                    matrix[i][j]=atoi(num.c_str());
                    j++;
                    num.clear();
                }
            }
            s.clear();
            i++;
        }
    }
 
    Print(matrix, row, col);
 
 
    //Поиск и вывод элемента, у которого самая большая сумма "соседей"
    Max=SumOfNeighbors(matrix,1,1);
    MaxI=1; MaxJ=1;
    for(i=1;i<row-1;i++)
    {
        for(j=1;j<col-1;j++)
        {
            if(SumOfNeighbors(matrix,i,j)>Max)
            {
                Max=SumOfNeighbors(matrix,i,j);
                MaxI=i; MaxJ=j;
            }
        }
    }
    cout << "Элемент, у которого набольшая сумма соседей:" << matrix[MaxI][MaxJ] <<endl;
    cout << "Координаты: " << MaxI << " " << MaxJ <<endl;
 
    for(i=0;i<row;i++)delete[] matrix[i];
        delete[]matrix;
 
    system("pause");
    return 0;
}
Мой вариант программы.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
30.12.2011, 17:25     прямоугольный массив #9
Цитата Сообщение от oniks Посмотреть сообщение
m[i-1][j-1]+m[i-1][j]+m[i-1][j+1]+m[i][j-1]+m[i][j+1]+m[i+1][j-1]+m[i+1][j]+m[i+1][j+1];
... вот программа, которая считает суммы элементов, окружающих текущий элемент матрицы
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
64
65
66
67
68
69
70
71
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
 
int32_t *create ( size_t size, size_t type ) {
    int32_t *t;
 
    if ( ( t = (int32_t *) malloc( size * type ) ) == NULL ) {
        fprintf( stderr, "alloc error\n" );
        exit( EXIT_FAILURE );
    }
    return t;
}
 
void init ( int32_t **arr, size_t size ) {
    int i, j;
 
    for ( i = 0; i < size; ++i )
        for ( j = 0; j < size; ++j)
            arr[ i ][ j ] = rand() % 10;
}
 
void print( int32_t **arr, size_t size ) {
    int i = 0, j;
 
    while ( i < size ) {
        j = 0;
        while ( j < size )
            printf( "%2i", arr[ i ][ j++ ]);
        ++i;
        puts("");
    }
}
 
int32_t sum ( int32_t **arr, int32_t i, int32_t j, size_t size ) {
    int32_t rowbeg = ( i == 0 ) ? i : i - 1;
    int32_t rowend = ( i == (size - 1) ) ? i : i + 1;
    int32_t colbeg = ( j == 0 ) ? j : j - 1;
    int32_t colend = ( j == (size - 1) ) ? j : j + 1;
    int32_t sum = 0, k, l;
 
    for ( l = rowbeg; l <= rowend; ++l )
        for ( k = colbeg; k <= colend; ++k )
            sum += arr[ l ][ k ];
            
    return ( sum - arr[ i ][ j ] );
}
 
int main (void)
{
    const size_t size = 3;
    int32_t **arr, i = 0, j;
    srand( time( 0 ) );
 
    arr = (int32_t**) create( size, sizeof( int32_t* ) );
    while ( i < size )
        arr[ i++ ] = (int32_t*)create( size, sizeof( int32_t ) );
    init( arr, size );
    print(arr, size );
 
    for ( i = 0; i < size; ++i )
        for ( j = 0; j < size; ++j )
            printf( "\nэлемент с индексами %i, %i, сумма = %i", i, j, sum( arr, i, j, size ) );
 
    for ( i = 0; i < size; ++i)
        free( arr[ i ] );
    free( arr );
 
    return 0;
}
oniks
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
30.12.2011, 18:19     прямоугольный массив #10
Цитата Сообщение от alkagolik Посмотреть сообщение
... вот программа, которая считает суммы элементов, окружающих текущий элемент матрицы
А зачем все эти 70 строк кода, если они делают тоже самое?
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
30.12.2011, 19:43     прямоугольный массив #11
Цитата Сообщение от oniks Посмотреть сообщение
А зачем все эти 70 строк кода, если они делают тоже самое?
разберите функцию
C
1
int32_t sum ( int32_t **arr, int32_t i, int32_t j, size_t size )
это избавит вас в дальнейшем от таких "пируэтов"
Цитата Сообщение от oniks Посмотреть сообщение
int sum=m[i-1][j-1]+m[i-1][j]+m[i-1][j+1]+m[i][j-1]+m[i][j+1]+m[i+1][j-1]+m[i+1][j]+m[i+1][j+1];
и может заставит задуматься о понятиях алгоритмов, автоматизации и универсальности. Эта функция будет работать не только на суммы соседних элементов, но и на любые операции и не только соседних. Надо будет ее просто немножко изменить по собственному усмотрению.
oniks
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
30.12.2011, 19:55     прямоугольный массив #12
Цитата Сообщение от alkagolik Посмотреть сообщение
и может заставит задуматься о понятиях алгоритмов, автоматизации и универсальности.
Ну если универсальности... давайте уж тогда везде добавим шаблоны.Тогда ваш код станет еще монструознее и индусы вас похвалят.
asm
 Аватар для asm
62 / 35 / 1
Регистрация: 05.10.2011
Сообщений: 137
30.12.2011, 19:55     прямоугольный массив #13
Цитата Сообщение от alkagolik Посмотреть сообщение
может заставит задуматься о понятиях алгоритмов, автоматизации и универсальности
согласен, поддерживаю,
но когда задача "решается один раз", то о какой универсальности может идти речь?
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
30.12.2011, 20:06     прямоугольный массив #14
Цитата Сообщение от asm Посмотреть сообщение
но когда задача "решается один раз", то о какой универсальности может идти речь?
а вот я эту функцию уже не впервые применяю и на форуме, и вообще, только слегка переписываю под конкретную задачу. Наверное нету такого что решается "один раз" по сути всё всегда повторяется в разных формах.
Цитата Сообщение от oniks Посмотреть сообщение
Ну если универсальности... давайте уж тогда везде добавим шаблоны.Тогда ваш код станет еще монструознее и индусы вас похвалят.
у меня нету желания разводить офтоп. Если вас интересует критика, то вы вольны разместить оба варианта программы на говнокоде и отслеживать тему. Только если есть какое-то самолюбие то лучше не стоит этого делать. Да, мне не понравилось ваше решение, и да, я считаю его в корне неверным. И, кстати, ошибочным.
asm
 Аватар для asm
62 / 35 / 1
Регистрация: 05.10.2011
Сообщений: 137
30.12.2011, 21:34     прямоугольный массив #15
Цитата Сообщение от alkagolik Посмотреть сообщение
на говнокоде
Цитата Сообщение от alkagolik Посмотреть сообщение
его в корне неверным
Цитата Сообщение от alkagolik Посмотреть сообщение
ошибочным

нечего добавить...
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
30.12.2011, 22:36     прямоугольный массив #16
Цитата Сообщение от asm Посмотреть сообщение
надо это удалять с памяти
Надо верно. Забыл об этом в торопях. Я этот код набросал побыстрому после поста товарища
alkagolik, в виде
.
уж жалко мне плотки стало
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2012, 20:12     прямоугольный массив
Еще ссылки по теме:

C++ прямоугольный треугольник из символов
Пустой прямоугольный треугольник. Размер катетов – n. ПОМОГИТЕ СДЕЛАТЬ ЕГО ПУСТЫМ. ОН ПОЛНЫЙ У МЕНЯ ПОЛУЧАЕТСЯ C++

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

Или воспользуйтесь поиском по форуму:
mike273
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 7
04.01.2012, 20:12  [ТС]     прямоугольный массив #17
спасибо огромное!!!!!!!
Yandex
Объявления
04.01.2012, 20:12     прямоугольный массив
Ответ Создать тему
Опции темы

Текущее время: 05:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru