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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2010, 21:09   #1
random7
Пользователь
 
Регистрация: 18.09.2009
Сообщений: 15
По умолчанию Сортировка участка матрицы

Помогите пожалуйста разобраться... Эта прога должна заполнять белую область нулями (см рисунок), затем сортировать оставшуюся (заштрихованную) область (столбцы по возрастанию). Она сортирует в принципе правильно, но не все, например все время во втором столбце справа откуда-то все время единица появляется. Задолбался думать уже...

Вот мой код:
Код:
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <ctime>
using namespace std;
int main()
{
    int n;
    cout << "Vvedite razmer: " << endl;
    cin >> n;
    int m[n][n];
    for (int x=0; x<n; ++x)
        for (int y=0; y<n; ++y)
           m[x][y]=rand() & 100 - 1;
    //Вывод матрицы:
    for (int x=0; x<n; ++x)
    {
        for (int y=0; y<n; ++y)
        cout << setw(2)<< m[x][y] << " ";
        cout << endl;
        cout << endl;
    }
        cout << endl;
        cout << endl;
        //Сортировка матрицы:
        for (int x=0; x<n; ++x) {
        for (int y=0; y<n; ++y) {
          if (x>n/2 || y<n/2 || y>n-x-1)
              m[x][y]=0;
        }
        }
        for (int x=0; x<n; ++x) {
        for (int y=0; y<n; ++y) {
          if (y>x-1 && y<=n-x-1 && y>=n/2)
              {
                for (int y=0; y<n; ++y) {
                 for (int c=n; c>=1; --c) {
                  for (int x=0; x<c; ++x) {
                        if (m[x-1][y]<m[x][y])
                          {
                              int z=m[x-1][y];
                              m[x-1][y]=m[x][y];
                              m[x][y]=z;
                          }
                        }
                      }
                    }
               }

        }
        }
    //Вывод матрицы:
    for (int x=0; x<n; ++x)
    {
        for (int y=0; y<n; ++y)
        cout << setw(2)<< m[x][y] << " ";
        cout << endl;
        cout << endl;
    }
}
Еще не додумался как сделать заполнение матрицы числами 1-99 (сейчас 0-99). И мне нужно будет это все оформить в виде подпрограмм, если кто-то покажет как вынести например вывод матрицы в подпрограмму буду оч благодарен.
random7 вне форума Ответить с цитированием
Старый 21.06.2010, 22:44   #2
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

Пример матрицы на функциях:
Код:
#include <iostream>
using namespace std;

void RandomMatrix(int **&Array, int n, int m);
int **RandMatrix(int **Array, int n, int m);
void PrintMatrix(int **Array, int n, int m);

int main(){
	int n = 2, m = 3;
	int **Array = new int *[n];
	for(int i = 0; i < n; i++)
		Array[i] = new int[m];

	RandomMatrix(Array,n,m);
	PrintMatrix(Array,n,m);
	Array = RandMatrix(Array,n,m);
	PrintMatrix(Array,n,m);

	for(int i = 0; i < n; i++)
		delete [] Array[i];
	delete []Array;
	return 0;
}

//------------------
void RandomMatrix(int **&Array, int n, int m){
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++)
			Array[i][j] = rand()%99;
	}
}

//------------------
int **RandMatrix(int **Array, int n, int m){
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++)
			Array[i][j] = rand()%99;
	}
	return Array;
}

//------------------
void PrintMatrix(int **Array, int n, int m){
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++)
			cout << Array[i][j] << " ";
		cout << endl;
	}
}
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶

Последний раз редактировалось Stilet; 22.06.2010 в 16:59.
dxdy вне форума Ответить с цитированием
Старый 22.06.2010, 14:35   #3
random7
Пользователь
 
Регистрация: 18.09.2009
Сообщений: 15
По умолчанию

dxdy, спасибо конечно, но я все равно не смог понять многое.
1) Зачем надо объявлять функции перед main'om?
2) Зачем нужны звездочки перед Array?
3) Что вот тут происходит:
Код:
int **Array = new int *[n]; 
for(int i = 0; i < n; i++) 
Array[i] = new int[m];
Я вот попробовал сделать одну функцию, но не работает...
Код:
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <ctime>
using namespace std;
void PrintMatrix(int m, int n);
int main() {
    int n;
    int m[n][n];
    cout << "Vvedite razmer: " << endl;
    cin >> n;
    for (int x=0; x<n; ++x)
        for (int y=0; y<n; ++y)
           m[x][y]=rand() & 100 - 1;

    PrintMatrix(m, n);
    //Сортировка матрицы:
        cout << endl;
        cout << endl;
        for (int x=0; x<n; ++x) {
        for (int y=0; y<n; ++y) {
          if (x>n/2 || y<n/2 || y>n-x-1)
              m[x][y]=0;
        }
        }
        for (int x=0; x<n; ++x) {
        for (int y=0; y<n; ++y) {
          if (y>x-1 && y<=n-x-1 && y>=n/2)
              {
                for (int y=0; y<n; ++y) {
                 for (int c=n-1; c>=1; --c) {
                  for (int x=1; x<c; ++x) {
                        if (m[x-1][y]<m[x][y])
                          {
                              int z=m[x-1][y];
                              m[x-1][y]=m[x][y];
                              m[x][y]=z;
                          }
                        }
                      }
                    }
               }
        }
        }
    PrintMatrix(m, n);
}
//================================================
void PrintMatrix(int m, int n) {
    for (int x=0; x<n; ++x)
    {
        for (int y=0; y<n; ++y)
        cout << setw(2)<< m[x][y] << " ";
        cout << endl;
        cout << endl;
    }
}
random7 вне форума Ответить с цитированием
Старый 22.06.2010, 15:08   #4
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

Цитата:
1) Зачем надо объявлять функции перед main'om?
Это прототип функции. Большую информацию можно почитать на Википедии
http://ru.wikipedia.org/wiki/%D0%9F%...86%D0%B8%D0%B8
Цитата:
2) Зачем нужны звездочки перед Array?
Это указатель, ведь у нас двумерный массив.
Цитата:
int **Array = new int *[n];
for(int i = 0; i < n; i++)
Array[i] = new int[m];
Это динамическое создание двумерного массива int-типа.

С первого взгляда бросаются такие ошибки:
Код:
    int n;
    int m[n][n];
    cout << "Vvedite razmer: " << endl;
    cin >> n;
Если ты хочешь задавать размерность с клавиатуры, то тебе нужно динамически выделять память под этот массив, смотри мои посты выше.
А если хочешь как ты, то придется лишь только так
Код:
    int n = 3; // постоянное значение
    int m[n][n];
   //cout << "Vvedite razmer: " << endl;
    //cin >> n;
Цитата:
void PrintMatrix(int m, int n)
Ты должен передавать саму матрицу, а в данной случаи как у тебя будет функция работать, если матрицу объявить глобально.
У функции main нет
Цитата:
return 0;
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶

Последний раз редактировалось Stilet; 22.06.2010 в 17:00.
dxdy вне форума Ответить с цитированием
Старый 22.06.2010, 16:53   #5
random7
Пользователь
 
Регистрация: 18.09.2009
Сообщений: 15
По умолчанию

dxdy. короче переделал твою прогу под свои нужды) только один вопрос остался: там теперь почему-то все время "-1" в матрице присутствует, и во входной и в отсортированной. Как ее убрать?
Код:
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <ctime>
using namespace std;
void RandomMatrix(int **&Array, int n);
int **SortMatrix(int **Array, int n);
void PrintMatrix(int **Array, int n);
int main(){
    int n;
    cout << "Vvedite razmer: " << endl;
    cin >> n;
    int **Array = new int *[n];
    for(int i = 0; i < n; ++i)
        Array[i] = new int [n];
    RandomMatrix(Array,n);
    PrintMatrix(Array,n);
    Array = SortMatrix(Array,n);
    PrintMatrix(Array,n);
    return 0;
}
//------------------
void RandomMatrix(int **&Array, int n){
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < n; ++j)
            Array[i][j] = rand()%100-1;
    }
}
//------------------
int **SortMatrix(int **Array, int n){
    cout << endl;
    for(int i = 0; i < n; ++i) {
    for(int j = 0; j < n; ++j) {
        if (i>n/2 || j<n/2 || j>n-i-1)
            Array[i][j] = 0;
    }
    }
    for(int i = 0; i < n; ++i) {
    for(int j = 0; j < n; ++j) {
        if (j>i-1 && j<=n-i-1 && j>=n/2)
            {
            for (int j=0; j<n; ++j) {
                 for (int c=n-1; c>=1; --c) {
                  for (int i=1; i<c; ++i) {
                        if (Array[i-1][j]<Array[i][j])
                          {
                              int z=Array[i-1][j];
                              Array[i-1][j]=Array[i][j];
                              Array[i][j]=z;
                          }
                   }
                  }
                 }
            }
    }
    }
    return Array;
}
//------------------
void PrintMatrix(int **Array, int n){
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < n; ++j)
            cout << setw(2)<< Array[i][j] << " ";
            cout << endl;
            cout << endl;
    }
}
random7 вне форума Ответить с цитированием
Старый 22.06.2010, 17:30   #6
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

Здесь у тебя недочет:
Код:
 Array[i][j] = rand()%100-1;
если число делится на 100 без остатка, то будет 0, а затем ты отнимаешь еще единицу, по этому у тебя и появляется -1.
По правилам, когда ты создал матрицу
Код:
    int **Array = new int *[n];
    for(int i = 0; i < n; ++i)
        Array[i] = new int [n];
Ты обязан освободить память, после всей работы.
Код:
	for(int i = 0; i < n; i++)
		delete [] Array[i];
	delete []Array;
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶
dxdy вне форума Ответить с цитированием
Старый 22.06.2010, 23:17   #7
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Цитата:
Сообщение от dxdy Посмотреть сообщение
С первого взгляда бросаются такие ошибки:
...
А если хочешь как ты, то придется лишь только так
Код:
 
    int n = 3; // постоянное значение
    int m[n][n];
Хде оно постоянно ? const, const, const ...
Цитата:
Сообщение от dxdy Посмотреть сообщение
...
Код:
return 0;
В С++ оно и не нужно
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux

Последний раз редактировалось ozo; 22.06.2010 в 23:21.
ozo вне форума Ответить с цитированием
Старый 23.06.2010, 08:13   #8
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Цитата:
Хде оно постоянно ? const, const, const ...
При таком объявлении матрицы:
Код:
int m[n][n];
m и n должны быть константами, т.е. объявлены так:
Код:
const int m=5;
const int n = 7;
и нигде в тексте ты не сможешь изменить эти значения, равно как и ввести их с клавиатуры.
При таком объявлении:
Цитата:
Сообщение от dxdy Посмотреть сообщение
Код:
int **Array = new int *[n];
    for(int i = 0; i < n; ++i)
        Array[i] = new int [n];
память выделяется динамически. Это дает преимущество в том, что теперь можно m и n объявлять как переменные и спокойно ввести их с клавиатуры. Но
Цитата:
Сообщение от dxdy Посмотреть сообщение
Ты обязан освободить память, после всей работы.
Код:
	for(int i = 0; i < n; i++)
		delete [] Array[i];
	delete []Array;
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка матрицы Eovin Помощь студентам 0 20.12.2009 15:36
Сортировка матрицы VD1988 Помощь студентам 1 01.12.2009 09:23
Сортировка матрицы GOODMAN Microsoft Office Excel 3 09.07.2009 23:31
c++ сортировка матрицы Aion Помощь студентам 10 15.05.2009 14:30