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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2017, 10:30   #1
nightofpromises
Пользователь
 
Регистрация: 01.03.2017
Сообщений: 31
Восклицание Целочисленная матрица размером n*m и график функции

1) Дана целочисленная матрица размером n*m. Написать программу, формирующую двумерный массив по следующему правилу: элементы первой строки – в порядке возрастания индексов столбцов, элементы второй строки – в порядке убывания индексов столбцов и т. д.
2) Разработать приложение, пририсовывающее график функции, написанной пользователем. Приложение должно демонстрировать рассчитанные параметры.
Думаю, нужно создавать процедуру типа void где объявить указатель на целочисленный двумерный массив.. а я забыла, как это делается
А еще я понятия не имею, как разработать приложение, которое строит график функции.
Помогите мне, пожалуйста.
Код:
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
void massiv(int *arr, const int m = 5, const int n = 5)
{
    int a, b, c;
    c = a;
    a = b;
    b = c;
    int i, j;
    for (int i = 0; i < m; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cout << "Введите элементы массива: ";
            cin >> *(arr + i*m + j);
        }
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
    int i, j;
    const int m = 5, n = 5;
    int *arr[m][n];
    for (i = 0; i < m; i++)
    {
       if((i % 2) == 0)
      {
        for(j = 0; j < n; j++)
        {
            massiv(arr[i][j], arr[i][m-j+1]);
        }
      }
    }
    for(i = 0; i < m; i++)
    {
        for(j = 0; j < n; j++)
        {
            cout << "Элемент [" << i << "] массива";
            cout << "Элемент [" << j << "] массива";
        }
    }
    system("pause");
    return 0;
}

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

На ютубе посмотри:

0.jpg

p.s.1: если у тебя консоль, то (вроде) можно использовать сторонние библиотеки.
p.s.2: а может у тебя не чистый С++, а MFC? Или что-то подобное?
p.s.3: кстате, а n (m) разве у тебя "const"? Я уже встречал (в других программах) когда просили от пользователь ввести размер матрицы, и она динамически создавалась, соответствующего размера.
ura_111 вне форума Ответить с цитированием
Старый 26.10.2017, 10:28   #3
nightofpromises
Пользователь
 
Регистрация: 01.03.2017
Сообщений: 31
По умолчанию

Вот мой переделанный код, тут генерируются случайные значения для элементов массива. не знаю, правильный ли он написан.
Код:
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(0, "");
	srand(time(NULL));
	const int n = 2, m = 3;
	int arr[n][m];
	int i, j, temp;
	cout << "Исходный массив: " << endl;
	for(i = 0; i < n; i++)
	{
		for(j = 0; j < m; j++)
		{
		arr[i][j] = -20 + rand() % 30;
		cout << arr[i][j] << " ";
	    }
		cout << endl;
	 }

for(i = 0; i < n; i++)
if(i % 2 == 0)
{
     for(j = 0; j < m - 1; j++)
	  {
	if(arr[i][j] > arr[i][j + 1])
	{
			temp = arr[i][j];
			arr[i][j] = arr[i][j + 1];
			arr[i][j + 1] = temp;
	}
	 }
}
else
{
	for(j = 0; j < m - 1; j++)
	  {
	if(arr[i][j] < arr[i][j + 1])
	{
			temp = arr[i][j];
			arr[i][j] = arr[i][j + 1];
			arr[i][j + 1] = temp;
	}
	 }
}
 
cout << "Массив индексов: " << endl;

for(i = 0; i < n; i++)
	{
		for(j = 0; j < m; j++)
		{
		cout << arr[i][j] << " ";
	    }
		cout << endl;
	 }

	system("pause");
	return 0;
}
nightofpromises вне форума Ответить с цитированием
Старый 26.10.2017, 10:33   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

да никто не знает, зачем вы смешиваете С и С++ ?

Если это С, то
Код:
using namespace std;
Не к месту, а если это С++, то в нем прекрасная библиотека велосипедов есть, например

Код:
temp = arr[i][j];
			arr[i][j] = arr[i][j + 1];
			arr[i][j + 1] = temp;
запишится как
Код:
std::swap(arr[i][j], arr[i][j + 1]);
Вот такая запись пережиток С
Код:
int i, j, temp;
В С++ желательно так

Код:
for(int j = 0; j < m - 1; j++)

Последний раз редактировалось alexzk; 26.10.2017 в 10:37.
alexzk вне форума Ответить с цитированием
Старый 26.10.2017, 10:44   #5
nightofpromises
Пользователь
 
Регистрация: 01.03.2017
Сообщений: 31
Печаль

Цитата:
Сообщение от alexzk Посмотреть сообщение
да никто не знает, зачем вы смешиваете С и С++ ?

Если это С, то
Код:
using namespace std;
Не к месту, а если это С++, то в нем прекрасная библиотека велосипедов есть, например

Код:
temp = arr[i][j];
			arr[i][j] = arr[i][j + 1];
			arr[i][j + 1] = temp;
запишится как
Код:
std::swap(arr[i][j], arr[i][j + 1]);
Вот такая запись пережиток С
Код:
int i, j, temp;
В С++ желательно так

Код:
for(int j = 0; j < m - 1; j++)
вот я переделала код
на С++ пишу
правильно ли этот код написан или нет?
Код:
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(0, "");
	srand(time(NULL));
	const int n = 3, m = 3;
	int arr[n][m];
	int i, j;
	cout << "Исходный массив: " << endl;
	for(i = 0; i < n; i++)
	{
		for(j = 0; j < m; j++)
		{
		arr[i][j] = -10 + rand() % 20;
		cout << arr[i][j] << " ";
	    }
		cout << endl;
	 }

for(i = 0; i < n; i++)
if(i % 2 == 0)
{
     for(j = 0; j < m - 1; j++)
	  {
	if(arr[i][j] > arr[i][j + 1])
	{
			swap(arr[i][j], arr[i][j + 1]);
	}
	 }
}

else
{
	for(j = 0; j < m - 1; j++)
	  {
	if(arr[i][j] < arr[i][j + 1])
	{
			swap(arr[i][j], arr[i][j + 1]);
	}
	 }
}
 
cout << "Отсортированный массив: " << endl;

for(i = 0; i < n; i++)
	{
		for(j = 0; j < m; j++)
		{
		cout << arr[i][j] << " ";
	    }
		cout << endl;
	 }

	system("pause");
	return 0;
}

Последний раз редактировалось nightofpromises; 26.10.2017 в 11:52.
nightofpromises вне форума Ответить с цитированием
Старый 26.10.2017, 12:52   #6
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

удалено - косяк был в выводе на экран) - см. ниже.

Последний раз редактировалось alexzk; 26.10.2017 в 13:13.
alexzk вне форума Ответить с цитированием
Старый 26.10.2017, 13:07   #7
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Гадство, походу просто вывод на экран вкосячил
Код:
#ifndef __GNUC__
#include "stdafx.h"
#endif

#include <iostream>
#include <ctime>
#include <cstdlib>

//using std::sort etc
#include <algorithm>
#include <vector>


typedef std::vector<int> vector_t;

//ссылка на элемент массива i,j при размере строки nsize(т.е. из линейного массива делаем как-бы двумерный)
//это так, для удобства. В С/С++ вообще нет многомерных массивов по сути - там это массивы из массивов указателей.

inline int& value(int* arr, int n, int m, const int nsize)
{
    return *(arr + m * nsize + n);
}

bool myless(int a, int b)
{
    return a < b;
}

bool mygreater(int a, int b)
{
    return a > b;
}
void dump_vector(const std::string& prefix, const vector_t& v)
{
    std::cout<< prefix <<": ";
    for(size_t i = 0, sz = v.size(); i < sz; ++i)
    {
        std::cout << v.at(i) << "  ";
    }
    std::cout << std::endl;
}

void sort_raw(int* arr, const int raw, const int nsize)
{
    //лень писать сортировку) - скопирую строку из массива в вектори применю С++
    //вообще изначально не стоило делать все ети массивы, а пользоватся вектором или array для С++
    std::vector<int> tmp;
    tmp.reserve(nsize); //говорим, что у нас будет nsize элементов - ускоряем
    for (int i = 0; i < nsize; ++i)
    {
        tmp.push_back( value(arr, i, raw, nsize));
    }
    dump_vector("before sort: ", tmp);
    if (raw % 2)
        std::sort(tmp.begin(), tmp.end(), myless);
    else
        std::sort(tmp.begin(), tmp.end(), mygreater);
    
    dump_vector("after sort: ", tmp);
    //пихаем все назад в массив из вектора
    for (size_t i = 0, sz = tmp.size(); i < sz; ++i)
    {
        value(arr,  i, raw, nsize) = tmp.at(i);
    }
}

void dump_array(const int* arr, const int size, const int nsize)    
{
    for (int j = 0, jsz = size / nsize; j < jsz ; ++j)  
    {
    for (int i = 0; i < nsize; ++i )            
            std::cout << value(const_cast<int*>(arr), i, j, nsize) << " ";               
        std::cout <<std::endl;
    }
}

#ifndef __GNUC__
int _tmain(int argc, _TCHAR* argv[])
#else    
int main(int argc, char* argv[])
#endif
{
#ifndef __GNUC__	
    setlocale(0, ""); //только для VC/windows	
#endif
    srand(time(NULL));//только для VC/windows
	const int n = 3, m = 3;
	int arr[n * m]; //делаем линейный массив, так быстрее
    
	
	std::cout << "Исходный массив: " << std::endl;
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)		
		    value(arr,i, j, n) = -10 + rand() % 20;		 
	    	
	dump_array(arr, n * m, n);
    
     for(int i = 0; i < n; ++i)              
         sort_raw(arr,  i,  n);                   	 
                    
std::cout << "Отсортированный массив: " << std::endl;
dump_array(arr, n * m, n);
 
#ifndef __GNUC__
	system("pause");//только для VC/windows
#endif
	return 0;
}
Цитата:
alex@moy-super:~/Work/tests$ ./a.out
Исходный массив:
-7 -2 -4
3 5 -3
8 -3 3
before sort: : -7 -2 -4
after sort: : -2 -4 -7
before sort: : 3 5 -3
after sort: : -3 3 5
before sort: : 8 -3 3
after sort: : 8 3 -3
Отсортированный массив:
-2 -4 -7
-3 3 5
8 3 -3
alex@moy-super:~/Work/tests$ ./a.out
Исходный массив:
-2 -2 -9
-5 3 2
1 -4 -4
before sort: : -2 -2 -9
after sort: : -2 -2 -9
before sort: : -5 3 2
after sort: : -5 2 3
before sort: : 1 -4 -4
after sort: : 1 -4 -4
Отсортированный массив:
-2 -2 -9
-5 2 3
1 -4 -4
alex@moy-super:~/Work/tests$

Кстати, все еще не уверен, что не попутал n и m там в расчетах ...прогоните 3 на 5 и 5 на 3 )

Последний раз редактировалось alexzk; 26.10.2017 в 13:29.
alexzk вне форума Ответить с цитированием
Старый 26.10.2017, 13:47   #8
nightofpromises
Пользователь
 
Регистрация: 01.03.2017
Сообщений: 31
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Гадство, походу просто вывод на экран вкосячил
Код:
#ifndef __GNUC__
#include "stdafx.h"
#endif

#include <iostream>
#include <ctime>
#include <cstdlib>

//using std::sort etc
#include <algorithm>
#include <vector>


typedef std::vector<int> vector_t;

//ссылка на элемент массива i,j при размере строки nsize(т.е. из линейного массива делаем как-бы двумерный)
//это так, для удобства. В С/С++ вообще нет многомерных массивов по сути - там это массивы из массивов указателей.

inline int& value(int* arr, int n, int m, const int nsize)
{
    return *(arr + m * nsize + n);
}

bool myless(int a, int b)
{
    return a < b;
}

bool mygreater(int a, int b)
{
    return a > b;
}
void dump_vector(const std::string& prefix, const vector_t& v)
{
    std::cout<< prefix <<": ";
    for(size_t i = 0, sz = v.size(); i < sz; ++i)
    {
        std::cout << v.at(i) << "  ";
    }
    std::cout << std::endl;
}

void sort_raw(int* arr, const int raw, const int nsize)
{
    //лень писать сортировку) - скопирую строку из массива в вектори применю С++
    //вообще изначально не стоило делать все ети массивы, а пользоватся вектором или array для С++
    std::vector<int> tmp;
    tmp.reserve(nsize); //говорим, что у нас будет nsize элементов - ускоряем
    for (int i = 0; i < nsize; ++i)
    {
        tmp.push_back( value(arr, i, raw, nsize));
    }
    dump_vector("before sort: ", tmp);
    if (raw % 2)
        std::sort(tmp.begin(), tmp.end(), myless);
    else
        std::sort(tmp.begin(), tmp.end(), mygreater);
    
    dump_vector("after sort: ", tmp);
    //пихаем все назад в массив из вектора
    for (size_t i = 0, sz = tmp.size(); i < sz; ++i)
    {
        value(arr,  i, raw, nsize) = tmp.at(i);
    }
}

void dump_array(const int* arr, const int size, const int nsize)    
{
    for (int j = 0, jsz = size / nsize; j < jsz ; ++j)  
    {
    for (int i = 0; i < nsize; ++i )            
            std::cout << value(const_cast<int*>(arr), i, j, nsize) << " ";               
        std::cout <<std::endl;
    }
}

#ifndef __GNUC__
int _tmain(int argc, _TCHAR* argv[])
#else    
int main(int argc, char* argv[])
#endif
{
#ifndef __GNUC__	
    setlocale(0, ""); //только для VC/windows	
#endif
    srand(time(NULL));//только для VC/windows
	const int n = 3, m = 3;
	int arr[n * m]; //делаем линейный массив, так быстрее
    
	
	std::cout << "Исходный массив: " << std::endl;
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)		
		    value(arr,i, j, n) = -10 + rand() % 20;		 
	    	
	dump_array(arr, n * m, n);
    
     for(int i = 0; i < n; ++i)              
         sort_raw(arr,  i,  n);                   	 
                    
std::cout << "Отсортированный массив: " << std::endl;
dump_array(arr, n * m, n);
 
#ifndef __GNUC__
	system("pause");//только для VC/windows
#endif
	return 0;
}



Кстати, все еще не уверен, что не попутал n и m там в расчетах ...прогоните 3 на 5 и 5 на 3 )
можете не используя вектор и линейный массив, предложить другой вариант решения данной задачи?
nightofpromises вне форума Ответить с цитированием
Старый 26.10.2017, 13:51   #9
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

тогда в той функции уберите копирования, и напишите аналоги std::sort для своего массива (это можно делать прям там)....но смысл нужно сохранить.
alexzk вне форума Ответить с цитированием
Старый 26.10.2017, 13:54   #10
nightofpromises
Пользователь
 
Регистрация: 01.03.2017
Сообщений: 31
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
тогда в той функции уберите копирования, и напишите аналоги std::sort для своего массива (это можно делать прям там)....но смысл нужно сохранить.
а как написать аналоги std::sort для моего массива?
nightofpromises вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана целочисленная матрица размером MxN. Найти и напечатать номера Анна997 Паскаль, Turbo Pascal, PascalABC.NET 1 24.04.2016 08:49
Дана целочисленная матрица размером NxN. В строках,содержащих Анна997 Паскаль, Turbo Pascal, PascalABC.NET 4 24.04.2016 08:45
Помогите доделать!! Дана целочисленная матрица А размером nхm. Найти среднее арифметическое каждого столбца матрицы и сумму (на С) tomas88 Помощь студентам 1 27.04.2014 15:49
(C++) Дана целочисленная квадратная матрица A порядка n и вектор b размером n. Найти сумму положительных элементов вектора c=b*A AirC Помощь студентам 2 25.04.2014 16:39
Программа на языке Си: Определить является ли заданна целочисленная квадратная матрица размером n*n ортонормированной lyubov17 Помощь студентам 4 10.12.2013 21:17