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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2017, 13:33   #1
Dimasik_777
Пользователь
 
Регистрация: 20.01.2017
Сообщений: 10
По умолчанию c++ сформировать из одного массива другой

Дан вещественный массив А[N][М]. Будем называть «соседями» элемента А[i][j] такие элементы массива А, соответствующие индексы которых отличаются от i и j не более чем на единицу. Для массива А сформировать массив В, значения элементов которого вычисляются по следующему правилу: если все соседи а[i][j] меньше самого а[i][j],
то b[i][j]=1; в противном случае b[i][j]=0.

Объясните хотя бы смысл задания, пж. Не знаю что делать после создания массива А.
Dimasik_777 вне форума Ответить с цитированием
Старый 20.01.2017, 14:18   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Объясните хотя бы смысл задания
Что вам не понятно? Вот есть массив 3х3:
00 01 02
10 11 12
20 21 22
Поехали:
шаг - элемент 00, соседи 01, 10, 11 Все меньше 00 b[i][j] = 1, иначе b[i][j] = 0
шаг - элемент 01, соседи 00, 02, 10, 11, 12 Все меньше 01 b[i][j] = 1, иначе b[i][j] = 0
шаг - элемент 02, соседи 01, 11, 12 Все меньше 02 b[i][j] = 1, иначе b[i][j] = 0
и т.д.
p51x вне форума Ответить с цитированием
Старый 21.01.2017, 12:46   #3
Dimasik_777
Пользователь
 
Регистрация: 20.01.2017
Сообщений: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Что вам не понятно? Вот есть массив 3х3:
Ну в общем теперь понятно. Получилось как-то так:
Код:
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <cmath>
#include <Windows.h>
#include <tchar.h>
#include <iomanip>
 
using namespace std;
 
int main()
{
   unsigned short i, j, n, m; 
        
    cout << "Vvedite razmer massiva:" << endl;
    cout << "N = "; 
    cin >> n;
    
	srand(time(0));
	double** a = new double*[n];
    for (int i = 0; i < n; i++)
    {
        a[i] = new double[n];
    }
   
    cout << endl << "Nachalnaya matrica:" << endl << endl;
    
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            a[i][j] = rand() % 100 - 50; 
            cout << setw(4) << a[i][j]; 
        }
        cout << endl;
    }
    
    
	double** b = new double*[n]; 
    for (int i = 0; i < n; i++)
    {
        b[i] = new double[n];
    }
   
    cout << endl << "Ishodnaya matricza:" << endl << endl;
   
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            if(a[i][j]>a[i+1][j]&&a[i][j]>a[i][j+1]&&a[i][j]>a[i+1][j+1]) {
            	
            	if(a[i][j]>a[i+1][j]&&a[i][j]>a[i][j+1]&&a[i][j]>a[i+1][j+1]){
            		
            		b[i][j]=1;
				}
				else{
					
				b[i][j]=1;
				
				}
			}
			
			else{
				
				b[i][j]=0;
				
			}
			
            cout <<setw(4)<< b[i][j];
        }
        cout << endl;
    }
    
    for(int i=0; i<n; ++i)
     delete[] a[i];
     delete [] a;
     
    for(int i=0; i<n; ++i)
     delete[] b[i];
     delete [] b;
     
    system("pause");
	return 0;
}
почему-то в массиве Б, строк получается на 1 меньше чем в А. И при выполнении программы выскакивает ошибка:
Изображения
Тип файла: jpg ошибка.jpg (116.3 Кб, 132 просмотров)
Dimasik_777 вне форума Ответить с цитированием
Старый 21.01.2017, 15:26   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Код:
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            if(a[i][j]>a[i+1][j]&&a[i][j]>a[i][j+1]&&a[i][j]>a[i+1][j+1]) {
            	
            	if(a[i][j]>a[i+1][j]&&a[i][j]>a[i][j+1]&&a[i][j]>a[i+1][j+1]){
Вы уверены, что +1 элемент всегда будет?
p51x вне форума Ответить с цитированием
Старый 21.01.2017, 16:32   #5
Dimasik_777
Пользователь
 
Регистрация: 20.01.2017
Сообщений: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы уверены, что +1 элемент всегда будет?
нет, но как отсортировать затрудняюсь
Dimasik_777 вне форума Ответить с цитированием
Старый 21.01.2017, 17:06   #6
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Вот, что сделай:
1) (я не тестировал) Проверь что всё ОК -
Код:
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <cmath>
#include <Windows.h>
#include <tchar.h>
#include <iomanip>

using namespace std;

int main()
{
	unsigned short i, j, n, m;
	n = 5;

	srand(time(0));
	double** a = new double*[n];
	for (int i = 0; i < n; i++)
	{
		a[i] = new double[n];
	}

	cout << endl << "Nachalnaya matrica:" << endl << endl;

	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			a[i][j] = rand() % 100 - 50;
			cout << setw(4) << a[i][j];
		}
		cout << endl;
	}
	
	cout << endl;
	
	int k, p;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			bool flag = false;
			cout << endl << "Sosedi " << i << j << ": ";

			// условие наличия "верхнего" соседа	
			if (i != 0){
				cout << i - 1 << j << " ";
				if (a[i][j] < a[i - 1][j])
				{
					flag = true;
				}
			}
			// условие наличия "нижнего" соседа	
			if (i != n - 1){
				cout << i + 1 << j << " ";
				if (a[i][j] < a[i + 1][j])
				{
					flag = true;
				}
			}
			// условие наличия "левого" соседа	
			if (j != 0){
				cout << i << j - 1 << " ";
				if (a[i][j] < a[i][j - 1])
				{
					flag = true;
				}
			}
			// условие наличия "правого" соседа	
			if (j != n){
				cout << i << j + 1 << " ";
				if (a[i][j] < a[i][j + 1])
				{
					flag = true;
				}
			}

			if (flag == true)
			{
				cout << "ODDIN";
			}
			else
			{
				cout << "NULL";
			}
		}
		cout << endl;
	}
	system("pause");
	return 0;
}
2) Добавь условия (по аналогии): "соседи по диагонали".
3) Интегрируй этот черновик себе в код.

Последний раз редактировалось ura_111; 21.01.2017 в 17:10.
ura_111 вне форума Ответить с цитированием
Старый 21.01.2017, 17:26   #7
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Уже заметил ошибку. Надо "n-1" в строчке:
Код:
// условие наличия "правого" соседа	
			if (j != n-1){
ura_111 вне форума Ответить с цитированием
Старый 21.01.2017, 17:29   #8
Dimasik_777
Пользователь
 
Регистрация: 20.01.2017
Сообщений: 10
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
1) (я не тестировал) Проверь что всё ОК -
ну вроде работает, спасибо за подсказку
Dimasik_777 вне форума Ответить с цитированием
Старый 21.01.2017, 18:16   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Предлагаю вот так, покороче:
Код:
for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
        bool flag = true;
        for (int k = max(0, i - 1); k < min(n, i + 2) && flag; ++k)
            for (int p = max(0, j - 1); p < min(m, j + 2) && flag; ++p) {
                if (i == k && j == p) continue;
                flag = a[i][j] > a[k][p];
            }
        cout << flag << " ";
    }
    cout << endl;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.01.2017 в 18:22.
BDA вне форума Ответить с цитированием
Старый 21.01.2017, 19:00   #10
Dimasik_777
Пользователь
 
Регистрация: 20.01.2017
Сообщений: 10
По умолчанию

Переписал код немного по-другому. Ошибка не выскакивает, но неправильно присваивает значения элементам массива Б.
Код:
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <cmath>
#include <Windows.h>
#include <tchar.h>
#include <iomanip>
 
using namespace std;
 
int main()
{
    unsigned short i, j, n, m;
    cout << "Vvedite razmer massiva:" << endl;
    cout << "N = "; 
    cin >> n;
 
    srand(time(0));
    double** a = new double*[n];
    for (int i = 0; i < n; i++)
    {
        a[i] = new double[n];
    }
 
    cout << endl << "Nachalnaya matrica:" << endl << endl;
 
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            a[i][j] = rand() % 100 - 50;
            cout << setw(4) << a[i][j];
        }
        cout << endl;
    }
    
    double** b = new double*[n]; 
    for (int i = 0; i < n; i++)
    {
        b[i] = new double[n];
    }
    
    cout <<"\nIskomaya matrica:" <<endl;
    
    int k, p;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
         bool flag = false;
          // верхний сосед  
            if (i != 0){
                
                if (a[i][j] > a[i - 1][j])
                {
                    flag = true;
                }
                else{
                    
                    flag = false;
                }
            }
        
            // нижний сосед 
            if (i != n - 1){
            
                if (a[i][j] > a[i + 1][j])
                {
                    flag = true;
                }
                else{
                    
                    flag = false;
                }
            }
            
            // левый
            if (j != 0){
                
                if (a[i][j] > a[i][j - 1])
                {
                    flag = true;
                }
                else{
                    
                    flag = false;
                }
            }
            
            // правый   
            if (j != n - 1){
                
                if (a[i][j] > a[i][j + 1])
                {
                    flag = true;
                }
                else{
                    
                    flag = false;
                }
            }
            
                // правый   верхний
            if (i != 0 && j != n - 1){
                
                if (a[i][j] > a[i - 1][j + 1])
                {
                    flag = true;
                }
                else{
                    
                    flag = false;
                }
            }
            
                
                // слева и сверху   
            if (j != 0 && i != 0){
                
                if (a[i][j] > a[i - 1][j - 1])
                {
                    flag = true;
                }
                else{
                    
                    flag = false;
                }
            }
            
                    // слева и снизу
            if (j != 0 && i != n - 1){
                
                if (a[i][j] > a[i + 1][j - 1])
                {
                    flag = true;
                }
                else{
                    
                    flag = false;
                }
            }
            
                // слева и сверху
            if (j != n - 1 && i != n - 1){
                
                if (a[i][j] > a[i + 1][j + 1])
                {
                    flag = true;
                }
                else{
                    
                    flag = false;
                }
            }
            
            if (flag == true)
            {
                b[i][j]=1;
            }
            else if(flag==false)
            {
                b[i][j]=0;
            }
        
        cout <<setw(4)<< b[i][j];
        }
        cout << endl;
    }
    system("pause");
    return 0;
}
Dimasik_777 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переписать из одного массива в другой devс++ cas2010 Помощь студентам 0 21.10.2012 12:11
Переписать елементы из одного массива в другой allegri Помощь студентам 3 03.01.2011 18:57
копирование из одного двумерного массива в другой Sanprof Общие вопросы Delphi 7 08.10.2010 17:31
Си. перенос элементов одного массива в другой Денни Помощь студентам 7 07.02.2010 15:34