Форум «Всё о Паскале» _ Ада и другие языки _ переставить строки матрицы
Автор: *оля* 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; }
// меняем строку 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.
Цитата
Задана вещественная матрица
Что-то не верится
Автор: *оля* 28.10.2010 18:34
Спасибо большое!
правда все равно не поняла пока почему не решается так как я писала
Цитата(volvo @ 28.10.2010 13:33)
P.P.S. Что-то не верится
ой, точно, исправлю) спасибо)
Автор: 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
аааа, да, теперь понимаю. непривычно) спасибо за разъяснение!)