Консультация № 184938
24.12.2011, 01:08
61.41 руб.
0 16 1
Здравствуйте! У меня возникли сложности с таким вопросом:

Поменять местами столбцы матрицы (nxn, 1<=n<=8) с максимальной и минимальной суммой элементов.

Если не хочется писать программу,прошу мне объяснить теорию по работе с матрицами на C/C++.

Помогите пожалуйста!

Заранее спасибо!
С уважением,
Иван.

Обсуждение

Неизвестный
24.12.2011, 01:11
общий
Сейчас конец года. Все спецы, как правило, загружены :)
Завтра в течении дня напишу программку и объясню.
Неизвестный
24.12.2011, 16:00
общий
25.12.2011, 00:29
это ответ
Здравствуйте, Барс Иван!
Программа в приложении.
Возможный вариант работы программы.

Компилятор: Borland C++ 3.1
Постарался дать все комментарии прямо в коде программы. Если что-то непонятно - спрашивайте.

Приложение:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int sum(int * * a, int n, int j)
{
int i, t=0;
for(i=0;i<n;i++)
t+=a[i][j];
return(t);
}

void main (void)
{
int n, i, j, sum_min, sum_max, j_min, j_max, tmp;
clrscr();
puts("BBEDU PA3MEP 1<=n<=8");
do
scanf("%d",&n);
while((n<1)||(n>8));
int * * a=(int * *)malloc(n*n*sizeof(int));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
j_min=j_max=0;
sum_min=sum_max=sum(a,n,0);
for(j=1;j<n;j++)
{
tmp=sum(a,n,j);
if(tmp<sum_min)
{
sum_min=tmp;
j_min=j;
}
if(tmp>sum_max)
{
sum_max=tmp;
j_max=j;
}
}
for(i=0;i<n;i++)
{
tmp=a[i][j_min];
a[i][j_min]=a[i][j_max];
a[i][j_max]=tmp;
}
printf("\n");
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<n;j++)
printf("%6d", a[i][j]);
}
getch();
}
Неизвестный
24.12.2011, 16:23
общий
Спасибо большое!
Только одна просьба - можно сделать так,чтобы матрица задавалась во входном потоке?То есть сначала пользователь должен определить размер матрицы,введя число от 1 до 8,а затем вбить матрицу данного размера.Или по-другому - пользователь сразу вводит матрицу размеров nxn..

Неизвестный
24.12.2011, 16:24
общий
Напишите,пожалуйста,и Ваш вариант программы!Мне очень интересно
Неизвестный
24.12.2011, 20:48
общий
Цитата: 388307
То есть сначала пользователь должен определить размер матрицы,введя число от 1 до 8,а затем вбить матрицу данного размера.

Так и реализовано: пользователь вводит n - размер матрицы, с помощью malloc под неё в памяти выделяется место, после чего созданная "матрица" заполняется случайными числами. Или я неправильно истолковал термин "вбить"?
Неизвестный
24.12.2011, 20:52
общий
И по-моему,Вы написали программу для обмена местами столбцов с минимальным и максимальным элементом,а нужно с максимальной и минимальной СУММОЙ элементов
Неизвестный
24.12.2011, 20:54
общий
Цитата: 301080
Так и реализовано: пользователь вводит n - размер матрицы, с помощью malloc под неё в памяти выделяется место, после чего созданная "матрица" заполняется случайными числами. Или я неправильно истолковал термин "вбить"?


Точно,я не увидел,прошу прощения
Неизвестный
24.12.2011, 20:55
общий
Я имел ввиду, что элементы матрицы должны задаваться пользователем,без рандома
Неизвестный
24.12.2011, 20:56
общий
Упс, действительно, невнимательно прочитал вопрос - сейчас пришлю исправленный вариант
Неизвестный
24.12.2011, 21:33
общий
24.12.2011, 21:42
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int sum(int * * a, int n, int j)
{
int i, t=0;
for(i=0;i<n;i++)
t+=a[i][j];
return(t);
}

void main (void)
{
int n, i, j, sum_min, sum_max, j_min, j_max, tmp;
clrscr();
puts("BBEDU PA3MEP 1<=n<=8");
do
scanf("%d",&n);
while((n<1)||(n>8));
int * * a=(int * *)malloc(n*n*sizeof(int));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
j_min=j_max=0;
sum_min=sum_max=sum(a,n,0);
for(j=1;j<n;j++)
{
tmp=sum(a,n,j);
if(tmp<sum_min)
{
sum_min=tmp;
j_min=j;
}
if(tmp>sum_max)
{
sum_max=tmp;
j_max=j;
}
}
for(i=0;i<n;i++)
{
tmp=a[i][j_min];
a[i][j_min]=a[i][j_max];
a[i][j_max]=tmp;
}
printf("\n");
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<n;j++)
printf("%6d", a[i][j]);
}
getch();
}
Неизвестный
24.12.2011, 22:02
общий
Все вроде бы ничего,но у меня на Visual C++ выводит ошибку в связи с попыткой чтения из защищенной памяти..если нужно,могу скриншот предоставить
Из-за чего это могло произойти,подскажите пожалуйста?
(при попытке перевести с языка С++ на язык С выдало ошибку "Segmentation fault")
Обе ошибки появились после ввода первой строки матрицы и нажатия Enter
Неизвестный
24.12.2011, 22:33
общий
Сейчас разберёмся)
Неизвестный
24.12.2011, 22:39
общий
Неизвестный
24.12.2011, 22:41
общий

Неизвестный
24.12.2011, 23:49
общий
Изменить Ваш ответ на существующий, или ещё будете править (вроде проблемы какие-то)?
Неизвестный
25.12.2011, 00:23
общий
Здравствуйте, Verena!
Цитата: 24617
Изменить Ваш ответ на существующий, или ещё будете править (вроде проблемы какие-то)?

Да, изменить. в Borland C++ всё работает:

На изучение Visual C++ может потребоваться некоторое время (сейчас этим занимаюсь). Первоначально требований к компилятору не выставлялось. Надеюсь, (но не гарантирую), что удастся локализовать разницу между компиляторами быстро.
Тем не менее, первый ответ содержал код решения на НЕВЕРНО прочитанное мною задание, что видно из форума.
Форма ответа