IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> переставить строки матрицы, Pelles С for Windows
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Задана вещественная матрица порядка 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;
}




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

Сообщение отредактировано: *оля* -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Основная часть программы может выглядеть вот так:
    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;
}
}


(за основу взят Метод последовательного поиска минимумов , можешь взять любой другой способ сортировки).

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

P.P.S.
Цитата
Задана вещественная матрица
Что-то не верится smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


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

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

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


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


smile.gif ой, точно, исправлю) спасибо)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
все равно не поняла пока почему не решается так как я писала
Как минимум - потому что в строке
Цитата
    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). К сожалению, отловить это в С-подобных языках не так просто, как в Паскале и его потомках.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


аааа, да, теперь понимаю. непривычно)
спасибо за разъяснение!)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.10.2020 7:37
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name