Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 7
1

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

29.12.2011, 15:08. Показов 4523. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В прямоугольном массиве с помощью функции найти элемент, у которого самая большая сумма "соседей". Найденный элемент и его индексы напечатать. Исходные числа из файла читать,



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
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2011, 15:08
Ответы с готовыми решениями:

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

Массив прямоугольный. Вычислить отрицательные элементы через do while
Дан прямоугольный массив, допустим 7х5 Вычислить через do while количество отрицательных...

Прямоугольный треугольник
Разработать класс, набор методов для программной модели заданного объекта. Описание объекта и...

Прямоугольный треугольник
Определить прямоугольный ли треугольник по 3 его сторонам и ввести ограничения на ввод чисел....

16
7 / 5 / 2
Регистрация: 08.10.2010
Сообщений: 58
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. Учи геометрию.
0
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
30.12.2011, 02:25 3
Цитата Сообщение от mike273 Посмотреть сообщение
найти элемент, у которого самая большая сумма "соседей".
Соседи по горизонтали, вертикали и диагонали?
P.S. Это называется матрица, а не прямоугольный массив.Facepalm.
0
62 / 35 / 3
Регистрация: 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.
0
Заблокирован
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];
0
278 / 173 / 21
Регистрация: 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:\ или меняйте путь к файлу в программе.

Не по теме:

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

0
62 / 35 / 3
Регистрация: 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]; }
надо это удалять с памяти
0
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;
}
Мой вариант программы.
0
Заблокирован
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;
}
2
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
30.12.2011, 18:19 10
Цитата Сообщение от alkagolik Посмотреть сообщение
... вот программа, которая считает суммы элементов, окружающих текущий элемент матрицы
А зачем все эти 70 строк кода, если они делают тоже самое?
0
Заблокирован
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];
и может заставит задуматься о понятиях алгоритмов, автоматизации и универсальности. Эта функция будет работать не только на суммы соседних элементов, но и на любые операции и не только соседних. Надо будет ее просто немножко изменить по собственному усмотрению.
0
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
30.12.2011, 19:55 12
Цитата Сообщение от alkagolik Посмотреть сообщение
и может заставит задуматься о понятиях алгоритмов, автоматизации и универсальности.
Ну если универсальности... давайте уж тогда везде добавим шаблоны.Тогда ваш код станет еще монструознее и индусы вас похвалят.
0
62 / 35 / 3
Регистрация: 05.10.2011
Сообщений: 137
30.12.2011, 19:55 13
Цитата Сообщение от alkagolik Посмотреть сообщение
может заставит задуматься о понятиях алгоритмов, автоматизации и универсальности
согласен, поддерживаю,
но когда задача "решается один раз", то о какой универсальности может идти речь?
0
Заблокирован
30.12.2011, 20:06 14
Цитата Сообщение от asm Посмотреть сообщение
но когда задача "решается один раз", то о какой универсальности может идти речь?
а вот я эту функцию уже не впервые применяю и на форуме, и вообще, только слегка переписываю под конкретную задачу. Наверное нету такого что решается "один раз" по сути всё всегда повторяется в разных формах.
Цитата Сообщение от oniks Посмотреть сообщение
Ну если универсальности... давайте уж тогда везде добавим шаблоны.Тогда ваш код станет еще монструознее и индусы вас похвалят.
у меня нету желания разводить офтоп. Если вас интересует критика, то вы вольны разместить оба варианта программы на говнокоде и отслеживать тему. Только если есть какое-то самолюбие то лучше не стоит этого делать. Да, мне не понравилось ваше решение, и да, я считаю его в корне неверным. И, кстати, ошибочным.
0
62 / 35 / 3
Регистрация: 05.10.2011
Сообщений: 137
30.12.2011, 21:34 15
Цитата Сообщение от alkagolik Посмотреть сообщение
на говнокоде
Цитата Сообщение от alkagolik Посмотреть сообщение
его в корне неверным
Цитата Сообщение от alkagolik Посмотреть сообщение
ошибочным

нечего добавить...
0
278 / 173 / 21
Регистрация: 10.07.2011
Сообщений: 441
30.12.2011, 22:36 16
Цитата Сообщение от asm Посмотреть сообщение
надо это удалять с памяти
Надо верно. Забыл об этом в торопях. Я этот код набросал побыстрому после поста товарища
alkagolik, в виде
.
уж жалко мне плотки стало
1
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 7
04.01.2012, 20:12  [ТС] 17
спасибо огромное!!!!!!!
0
04.01.2012, 20:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2012, 20:12
Помогаю со студенческими работами здесь

прямоугольный треугольник из символов
Вот, еще 4 задачи, помогите химикам)) Программа просит ввести символ после чего, рисует из них...

Вывести символами прямоугольный треугольник
Доброе время суток, скажите, где споткнулся? Преподаватель говорит, что пустой треугольник не...

Структура: Создайте структуру Прямоугольный параллелепипед
Создайте структуру Прямоугольный параллелепипед с элементами – a и b – стороны...

Пустой прямоугольный треугольник. Размер катетов – n
Разработать программу, которая выводит на экран геометрическую фигуру, заполняя ее символом ‘*’ или...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru