Консультация № 169715
22.06.2009, 12:50
0.00 руб.
0 11 2
Здравствуйте,уважаемые эксперты!
Помогите со следующей задачей:
Ввести двумерный динамический массив.Сформировать линейный массив элементами которого являются суммы элементов на диагоналях параллельной главной

Спасибо огромное!!!

Обсуждение

Неизвестный
22.06.2009, 14:10
общий
Озерова Елена Сергеевна:
Можно уточнить задание?
Насколько я понял, двумерный массив является квадратной матрицей, раз есть диагонали, так?
Какие именно паралелльные диагонали рассматриваются для вычисления элементов?
Скажем, мы имеем массив:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

Как должен выглядеть линейный массив?
Неизвестный
22.06.2009, 14:27
общий
_Ayl_:
Здравствуйте!
Двумерный массив не обязательно квадратная матрица
4 -6 4
7 3 2
чем не двумерный массив?!

Тогда линейный массив должен выглядеть 7 7 -4 4 (сумма гланой диагонали 4+3=7; одиночные элементы 7 и 4 и -6+2=-4)
Итог 7 7 -4 4
Неизвестный
22.06.2009, 14:58
общий
Озерова Елена Сергеевна:
понял
сейчас сделаю
Неизвестный
22.06.2009, 15:05
общий
Очнитесь!!!
Само понятие главной диагонали применимо только к квадратным матрицам.

Википедия

http://slovari.yandex.ru/dict/lopatnikov/article/lop/lop-0243.htm
Неизвестный
22.06.2009, 15:26
общий
Micren:
Угу
Поэтому я и уточнил
Походу у того, кто составлял задание, главной диагональю называется диагональ, содержащяя элемент a [0] [0]
Я понял, что хочет пользователь, поэтому не стал настаивать на точных формулировках
Неизвестный
22.06.2009, 15:30
общий
Micren:
Да вы все правильно поняли именно a[0] [0]
СПАСИБО вам!
Неизвестный
22.06.2009, 15:32
общий
это ответ
Здравствуйте, Озерова Елена Сергеевна.
Программа С++. Тестировал MS VS 2008
Код:

#include <locale>
#include <limits>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <stdexcept>

using namespace std;

// Ввод с подсказкой
template<class T>
T input(const char *const msg)
{
while(true)
{
T res;
cout<<msg;
cin>>res;
if(cin.fail())
{
cout<<"Ошибочный ввод"<<endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
}
else
{
cin.ignore(numeric_limits<streamsize>::max(),'\n');
return res;
}
}
}

// Суммирует по диагональ
template<class T>
T sumDiag(T *matrix,size_t dim,size_t no)
{
T res=0;
// Вычисляем индекс первого элемента
size_t i=0,j=0;
if(no<dim)
{
i=dim-1-no;
}
else if(no<(((dim-1)<<1)+1))
{
j=no-dim+1;
}
else
{
throw invalid_argument("Номер диагонали выходит за диапазон матрицы");
}
// Указатель на первый суммируемый элемент
T* current=matrix+i*dim+j;
// Количество элементов в диагонали
size_t count=dim-(i>j?i:j);
// Суммирование
while(count--)
{
res+=*current;
current+=dim+1;
}
return res;
}

int main()
{
srand(static_cast<unsigned int>(time(0)));
setlocale(LC_ALL,"russian");
size_t dim=input<size_t>("Введите размерность матрицы:");
int* matrix=0
,*vector=0;
if(dim)
{
try
{
matrix=new int[dim*dim];
size_t dimVec=(dim<<1)-1;
vector=new int[dimVec];
cout<<"Матрица:"<<endl;
// Заполняем матрицу случайными числами и печатаем ее
int* current=matrix;
for(size_t i=0;i<dim;++i)
{
for(size_t j=0;j<dim;++j,++current)
{
*current=rand()%101-50;
cout<<setw(4)<<*current<<' ';
}
cout<<endl;
}
// Считаем суммы
for(size_t i=0,j=0;i<dimVec;++i)
{
vector[j++]=sumDiag(matrix,dim,i);
}
// Выводим результат
cout<<"Получен вектор:"<<endl;
for(size_t i=0;i<dimVec;++i)
{
cout<<vector[i]<<' ';
}
cout<<endl;
}
catch(bad_alloc)
{
cout<<"Не могу выделить память"<<endl;
}
if(matrix)
{
delete[]matrix;
}
if(vector)
{
delete[]vector;
}
}
else
{
cout<<"С такой размерностью матрицы нет"<<endl;
}
system("PAUSE");
return 0;
}


Пример работы:
Код:

Введите размерность матрицы:5
Матрица:
-28 -1 -15 25 -26
-28 15 9 4 14
41 4 1 -41 41
25 -42 -24 3 16
-22 28 -37 -30 -16
Получен вектор:
-22 53 -38 -78 -25 -17 30 39 -26
5
Спасибо вам огромное за помощь<br>Хотя проф говорит,что не обязательно квадратная матрица<br><br>НО я оцениваю задачу- ОНА БЕЗУПРЕЧНА
Неизвестный
22.06.2009, 15:33
общий
_Ayl_:
Пользователь мог сам не разобраться чего хочет тот, кто задал вопрос. Поэтому сделал как правильно.
Неизвестный
22.06.2009, 15:46
общий
_Ayl_:
Пожалуйста,помогите вы мне!
Я жду вашего решения-т.к уважаемый Micren сделал для квадратной матрицы
Неизвестный
22.06.2009, 16:04
общий
_Ayl_:
Извините,пожалуйста!
Вы поможете мне-можно на вас надеяться?
Просто очень нужно сдать сегодня
Неизвестный
22.06.2009, 16:34
общий
это ответ
Здравствуйте, Озерова Елена Сергеевна.

Вот программа
Извините за задержку

Приложение:
// Ввести двумерный динамический массив.
// Сформировать линейный массив,
// элементами которого являются
// суммы элементов на диагоналях,
// параллельной главной
// (содержащих элемент a [0] [0])

#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>

// функция выделения памяти для матрицы
// параметры:
// n - кол-во строк
// m - кол-во столбцов
// результат:
// указатель на выделенную область
int ** allocateMatrix (int n, int m) {
int ** p;

if ((p = (int **)malloc (n * sizeof (int *))) == NULL) {
printf ("\n\nНе могу выделить область памяти!\n");
exit (-1);
}

for (int i = 0; i < n; i++)
if ((p [i] = (int *)malloc (m * sizeof (int))) == NULL) {
printf ("\n\nНе могу выделить область памяти!\n");
exit (-1);
}

return p;
}

// функция сохранения матрицы в файл
// параметры:
// a - матрица
// n - кол-во строк
// m - кол-во столбцов
// fname - имя файла
void SaveMatrix (int **a, int n, int m, char *fname) {
FILE *f;
char c;

if ((f = fopen (fname, "w")) == NULL) {
printf ("\n\nНевозможно создать указанный файл!\n");
printf ("Продолжить без сохранения (Y/N)? ");
scanf (&c);

if (c == 'N' || c == 'n') exit (-1); else return;
}

fprintf (f, "%d %d\n", n, m);

for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
fprintf (f, " %5d", a [i] [j]);
fprintf (f, "\n");
}

fclose (f);
}

// функция считывания матрицы из файла
// параметры:
// n - кол-во строк (возвращаемое значение)
// m - кол-во столбцов (возвращаемое значение)
// fname - имя файла
// результат:
// матрица
int ** LoadMatrix (int *n, int *m, char *fname) {
FILE *f;
int **a;

if ((f = fopen (fname, "r")) == NULL) {
printf ("\n\nНевозможно открыть указанный файл!\n");
exit (-1);
}

fscanf (f, "%d %d", n, m);

a = allocateMatrix (*n, *m);

for (int i = 0; i < *n; i++)
for (int j = 0; j < *m; j++)
fscanf (f, "%d", &(a [i] [j]));

fclose (f);

return a;
}

// функция заполнения матрицы с помощью ручного ввода
// параметры:
// n - кол-во строк (возвращаемое значение)
// m - кол-во столбцов (возвращаемое значение)
// результат:
// матрица
int ** InputMatrix (int *n, int *m) {
int ** a;
char s [100];

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

a = allocateMatrix (*n, *m);

printf ("Введите элементы матрицы:\n");
for (int i = 0; i < *n; i++)
for (int j = 0; j < *m; j++) {
printf ("Элемент a [%d] [%d] --> ", i, j);
scanf ("%d", &(a [i] [j]));
}

printf ("Ввод закончен.\nВведите имя файла для сохранения матрицы или '-' для продолжения без сохранения: ");
scanf ("%s", s);
if (s [0] != '-') SaveMatrix (a, *n, *m, s);

return a;
}

// функция заполнения матрицы
// параметры:
// n - кол-во строк (возвращаемое значение)
// m - кол-во столбцов (возвращаемое значение)
// результат:
// матрица
int ** GetMatrix (int *n, int *m) {
char s [100];

printf ("\nВведите имя файла для считывания матрицы из файла или '-' для ручного ввода: ");
scanf ("%s", s);
if (s [0] == '-') return InputMatrix (n, m); else return LoadMatrix (n, m, s);
}

// функция печати матрицы
// параметры:
// a - матрица
// n - кол-во строк
// m - кол-во столбцов
void PrintMatrix (int **a, int n, int m) {
printf ("\nОбрабатываемая матрица:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
printf (" %5d", a [i] [j]);
printf ("\n");
}
}

// функция получения суммы элементов на диагонали с заданным номером
// (диагонали нумеруются с 0, начиная с левого нижнего угла матрицы
// вверх до левого верхнего угла матрицыи далее до правого верхнего)
// параметры:
// a - матрица
// n - кол-во строк
// m - кол-во столбцов
// d - номер диагонали
// результат:
// сумма элементов на диагонали
int SumDiag (int **a, int n, int m, int d) {
int s = 0;

int i = (d < n) ? (n - d - 1) : 0;
int j = (d < n) ? 0 : (d - n + 1);

while (i < n && j < m)
s += a [i++] [j++];

return s;
}

void main () {
int **a;
int *v;
int n, m;

a = GetMatrix (&n, &m);
PrintMatrix (a, n, m);

// выделим память для линейного массива
if ((v = (int *)malloc ((n + m - 1) * sizeof (int))) == NULL) {
printf ("\n\nНе могу выделить область памяти!\n");
exit (-1);
}

// перебираем диагонали
for (int d = 0; d < n + m - 1; d++) {
v [d] = SumDiag (a, n, m, d);
printf (" %d", v [d]);
}
}
5
Я бы и 6 поставил!<br>Вот это то что нужно<br>От выполнения задания просто нет слов-ВЕЛИКОЛЕПНО!<br>Огромное вам спасибо!!!
Форма ответа