Консультация № 189304
05.05.2016, 17:57
0.00 руб.
0 2 1
Здравствуйте, уважаемые эксперты! Прошу вашей помощи в следующем:
Возникли проблемы в написании кода.
Условия задачи:
Характеристикой столбца целочисленной матрицы является сумма модулей его нечётных элементов, которые меньше нуля. Нужно расположить столбцы заданной матрицы в соответствии с ростом характеристик.


Приложение:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <malloc.h> ///для выделения памяти в куче
#include <time.h> ///для инициализации генератора псевдослучайных чисел
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i,j,m,n;

printf("Введите количество строк в матрице m:");
scanf("%d",&m);
printf("Введите количество столбцов в матрице n:");
scanf("%d",&n);

srand(time(NULL)); ///инициализация герератора псевдослучайных чисел
int **A;
A = (int**)malloc(m*sizeof(int*));
int *Ch;
Ch= (int*)malloc(n*sizeof(int*));
for(i=0;i<m;i++)
A[i] = (int*)malloc(n*sizeof(int));

///заполним матрицу случайными числами
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
A[i][j]=(rand()%50)-50;

printf("%4d ",A[i][j]);
}
printf("\n"); ///для следующей строки
}
printf("\nМассив характеристик столбцов\n");
for (i=0; i<m; i++){
for (j=0; j<n; j++){

if (A[i][j]<0 && A[i][j]%2!=0){
Ch[j]+=abs(A[i][j]);
}
printf("%4d", Ch[j]);
}
}
for (j=n;j>0;j--){
if (Ch[j]<Ch[j-1]){ ///если предыдущий меньше
int a = Ch[j];
Ch[j] = Ch[j-1];
Ch[j-1] =a;
for(i = 0; i< m; i++)
{
a = A[j][i];
A[j][i] = A[j-1][i];
A[j][i-1] = a;}
}
}
printf("\nКонечный результат:\n"); ///выводим, что у нас получилось
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
system("pause");
printf("%4d ",A[i][j]);
}
printf("\n");
}

for (j=0;j<n;j++){
free(A[j]);
for(i=0;i<m;i++){
free (A[i]);
free (A); }
}
return 0;
}

Обсуждение

давно
Старший Модератор
312929
1973
10.05.2016, 05:37
общий
это ответ
Здравствуйте, user8351!

Вот исправленный вариант программы (с комментариями):
[code lang=js]
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <malloc.h> ///для выделения памяти в куче
#include <time.h> ///для инициализации генератора псевдослучайных чисел

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i, j, k, m, n;

printf("Введите количество строк в матрице m: ");
scanf("%d", &m);
printf("Введите количество столбцов в матрице n: ");
scanf("%d", &n);

srand(time(NULL)); // инициализация генератора псевдослучайных чисел
int **A;
A = (int**)malloc(n*sizeof(int*)); // Память под матрицу выделяем "наоборот",
for (j=0; j<n; j++) // то есть первый индекс - номер столбца,
A[j] = (int*)malloc(m*sizeof(int)); // второй - номер строки
int *Ch;
Ch = (int*)malloc(n*sizeof(int));
// заполним матрицу случайными числами
for(i=0; i<m; i++)
{
for(j=0; j<n; j++) // В условиях задачи не сказано,
{ // что ВСЕ элементы матрицы отрицательные,
A[j][i]=(rand()%200)-100; // поэтому заполнение делаем случайными числами
printf("%4d ", A[j][i]); // в диапазоне от -100 до 100
}
printf("\n"); // для следующей строки
}
printf("\nМассив характеристик столбцов\n");
for (j=0; j<n; j++)
{
Ch[j] = 0; // Характеристика столбца первоначально равно нулю (и остаётся
for (i=0; i<m; i++) // такой, если в столбце нет отрицательных нечётных элементов)
if (A[j][i]<0 && A[j][i]%2!=0) Ch[j] += abs(A[j][i]);
printf("%4d ", Ch[j]);
}
printf("\n");
for (k=n-1; k>0; k--) // Для упорядочивания массива характеристик
for (j=0; j<k; j++) // используем пузырьковый метод сортировки
if (Ch[j]>Ch[j+1])
{
int a = Ch[j];
Ch[j] = Ch[j+1];
Ch[j+1] = a;
int *aa = A[j]; // Поскольку в массиве A индексы расположены "наоборот"
A[j] = A[j+1]; // (первым - номер столбца), то перестановка столбцов
A[j+1] = aa; // выполняется в одно действие
}
printf("\nКонечный результат:\n"); ///выводим, что у нас получилось
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
printf("%4d ", A[j][i]);
printf("\n");
}
for (j=0; j<n; j++)
free(A[j]);
free(A);
free(Ch);
return 0;
}[/code]
5
давно
Посетитель
399277
11
11.05.2016, 14:19
общий
Огромное спасибо за Вашу помощь!
Форма ответа