Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ переставить строки матрицы

Автор: *оля* 28.10.2010 16:56

Задана вещественная матрица порядка N*M. Переставить строки матрицы в
порядке убывания минимальных элементов строк матрицы.


Код

int main(int argc, char *argv[])
{ int n,m, min_i, min_j,c;
    printf ("vvedite kol-vo elementov n(strok), m(stolbcov) \n");
    scanf("%d %d", &n,&m);
    if ((n<=0)&&(m<=0)) {printf(" nekorektnii vvod"); return 0;}
    printf("vvedite massiv: \n");
    int a[n][m];
    for (int i=0; i<n; i++)  for (int j=0; j<m;j++) scanf("%d", &a[i][j]);
    printf("ishodnaja matrica: \n");
    for (int i=0; i<n; i++) { for (int j=0; j<m;j++) printf("%d\t", a[i][j]); printf("\n");}

    min_i=0;
    min_j=0;
    int n1=n;
    while (n1>1){
    for (int i=0; i<n1; i++) { for (int j=0; j<m;j++)  if (a[i][j]<a[min_i][min_j]) {min_i=i; min_j=j;}}
    for (int j=0; j<m;j++) {c=a[min_i][j]; a[min_i][j]=a[n1][j]; a[n1][j]=c;}
    n1-=1;}

    printf("polucennaja matrica: \n");
    for (int i=0; i<n; i++) { for (int j=0; j<m;j++) printf("%d\t", a[i][j]); printf("\n");}
    /* TODO: Enter code here */
    return 0;
}




что-то не так, помогите пожалуйста разобраться )

Автор: volvo 28.10.2010 17:33

Основная часть программы может выглядеть вот так:

    for(int i = 0; i < n - 1; i++)
{
min_i = i;

// шаг 1 - находим минимум в строке № i
int curr_min = 0;
for(int j = 1; j < m; j++)
{
if(a[i][j] < a[i][curr_min]) curr_min = j;
}
int min = a[i][curr_min];

// шаг 2 - последовательно находим минимумы в
// нижележащих строках и выбираем максимальный из них

for(int ii = i + 1; ii < n; ii++)
{
int next_min = 0;
for(int j = 1; j < m; j++)
{
if(a[ii][j] < a[ii][next_min]) next_min = j;
}

if(a[ii][next_min] > min)
{
min = a[ii][next_min];
min_i = ii;
}
}

// меняем строку i с найденной, где минимум максимален
for(int k = 0; k < m; k++)
{
c = a[i][k];
a[i][k] = a[min_i][k];
a[min_i][k] = c;
}
}


(за основу взят http://forum.pascal.net.ru/index.php?s=&showtopic=3065&view=findpost&p=43319 , можешь взять любой другой способ сортировки).

P.S. Это не Си. По меньшей мере, НЕ ВСЕ компиляторы Си способны это откомпилировать. В частности - строку
Цитата
int a[n][m];
, где m, n - переменные, а не константы.

P.P.S.
Цитата
Задана вещественная матрица
Что-то не верится smile.gif

Автор: *оля* 28.10.2010 18:34

Спасибо большое!

правда все равно не поняла пока почему не решается так как я писала

Цитата(volvo @ 28.10.2010 13:33) *


P.P.S.
Что-то не верится smile.gif


smile.gif ой, точно, исправлю) спасибо)

Автор: volvo 28.10.2010 19:08

Цитата
все равно не поняла пока почему не решается так как я писала
Как минимум - потому что в строке
Цитата
    for (int j=0; j<m;j++) {c=a[min_i][j]; a[min_i][j]=a[n1][j]; a[n1][j]=c;}
у тебя всеми любимая ошибка - вылет за пределы массива. N1 - это граница, до которой НЕЛЬЗЯ дотрагиваться, не просто так ты в цикле делаешь for (int i=0; i<n1; i++). Понимаешь? Не "меньше или равно", а строго меньше. Индексация начинается с 0. А ты при первом обмене строк берешь и меняешь существующую строку с несуществующей (находящейся за пределами области памяти, выделенной под матрицу A). К сожалению, отловить это в С-подобных языках не так просто, как в Паскале и его потомках.

Автор: *оля* 28.10.2010 22:02

аааа, да, теперь понимаю. непривычно)
спасибо за разъяснение!)