Консультация № 171404
17.08.2009, 09:17
150.00 руб.
0 3 1
Здравствуйте!
Необходимо решить следующую задачу (написать весь код):
Характеристикой строки целочисленной матрицы назовем сумму ее положительных четных элементов. Переставляя строки заданной матрицы, расположить их в соответствии с убыванием характеристик.
Задача по основам программирования, просьба не использовать "продвинутые" функции.
Ограничиться только перестановками в массивах, удалениями, вставками. Желательно, чтобы работала на MS Visual C++ 6.0.

Заранее спасибо.

Обсуждение

давно
Посетитель
7438
7205
17.08.2009, 10:07
общий
Как задаем размерность матрицы и как формируем исходную матрицу? В теле программы, вводим с консоли, вводим из файла?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
17.08.2009, 13:02
общий
Лысков Игорь Витальевич:
В теле программы.
давно
Посетитель
7438
7205
17.08.2009, 15:37
общий
это ответ
Здравствуйте, starcode.
Решение в приложении.
Конечно, далеко не самое оптимальное, зато не должно остаться никаких вопросов...
Как раз, "по основам программирования".
Единственно, что хочется добавить:
Реализация двумерного массива возможна в двух видах:
1)массив адресов одномерных массивов
2)сплошной массив данных (когда строки в памяти лежат одна за другой).
В таком случае, двумерный массив можно считать одномерным.
В программе реализован второй подход.

Удачи! Если будут вопросы, милости просим в мини-форум

Приложение:
#include <stdio.h>
#include <conio.h> //надо только для getch()

//Функция подсчета характеристики строки матрицы
//Параметры: iRow - номер строки (с 0)
// iMax - число столбцов
// B - адрес первого байта строки
//Возвращает характеристику
int CalcChar(int iRow, int iMax, int *B)
{
int i; //номер столбца в строке
int iRet=0; //здесь будет искомая характеристика

for (i=0; i<iMax; i++) //по всем элементам строки
{
if ((B[i] > 0) && //ждем положительный элемент
((B[i] & 1) == 0)) //и четный (младший бит = 0)
{
iRet += B[i]; //накапливаем сумму
}
}
return iRet; //возвращаем характеристику
}

//Функция меняет местами строки
//Параметры: iRow1 - номер первой строки
// iRow2 - номер второй строки
// iMax - число столбцов
// B - адрес матрицы, как одномерного массива
void RowsChange(int iRow1, int iRow2, int iMax, int *B)
{
int i; //номер столбца в строке
int c; //временная переменная для обмена двух элементов

for (i=0; i<iMax; i++) //по столбцам двух строк
{
c = B[iRow1*iMax+i]; //меняем местами две целые величины
B[iRow1*iMax+i] = B[iRow2*iMax+i]; // индекс в одномерном массиве вычисляем,
B[iRow2*iMax+i] = c; // как строка * длина строки + столбец
}
}

int main(void)
{
const int n=6; //число строк
const int m=7; //число столбцов
int A[n][m] = //матрица
{
{ 1, -2, 10, -5, 5, 6, 7},
{ 10, 20,-10, 5, -5, -6, 0},
{ 0, 0,-10, 0, 1, 5, 0},
{ -3, -4, 10, 15,-15, 16, 0},
{ 1, 2, 4, 5, 2, -6, 10},
{ 5, 2, -1, 2, -1, -2, 4}
};
int i,j; //переменные цикла;
int iChar1, iChar2; //переменные для характеристик


printf("A[%d,%d] before\n",n,m); //выведем матрицу до сортировки
for(i=0;i<n;i++) //по всем строкам
{
for(j=0;j<m;j++) //по столбцам
printf("%5d",A[i][j]); //элемент выводим как целое длины 5 символов
printf("\n"); //перевод строки
}

//Сортируем матрицу методом пузырька
//Строка с большей характеристикой как бы "всплывает" к началу матрицы
for(i=0;i<n-1;i++) //от первой до предпоследней строки
{
iChar1 = CalcChar(i, m, A[i]); //характеристика i-й строки (чтобы меньше вычислять)
for(j=i+1; j<n; j++) //по всем последующим до последней строки
{
iChar2 = CalcChar(j, m, A[j]);//характеристика j-й строки
if (iChar1<iChar2) //если хар-ка более ранней строки меньше хар-ки более дальней
{
RowsChange(i, j, m, (int*)A); //то меняем местами строки i и j
iChar1 = iChar2; //и запоминаем хар-ку новой строки, с которой будут сравниваться оставшиеся строки
}
}
}

printf("A[%d,%d] after\n",n,m); //выведем матрицу после сортировки
for(i=0;i<n;i++) //аналогично...
{
for(j=0;j<m;j++)
printf("%5d",A[i][j]);
printf("\n");
}
getch(); //подождем нажатие на клавишу, чтобы сразу не ушло с экрана
return 0;
}
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа