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

> Внимание!

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

 
 Ответить  Открыть новую тему 
> Двумерный массив (ОЧЕНЬ СРОЧНО), С/С++
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Алексей

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


Вопрос жизни и смерти!!!
Дана целочисленная квадратная матрица. Определить:
1) ...
2) минимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали матрицы.

Кто-нибудь исправьте последние две функции, по каким индексам суммировать.
Пожалуйста приведите код...

#include <iostream.h>
#include <math.h>

#define SIZE 3 // размер матрицы

// прототипы функций
int Sum (int matrix[SIZE][SIZE]); // суммирует неотрицательных столбцов
int Summ (int matrix[SIZE][SIZE]); // суммирует элементы диагоналей выше побочной диагонали
int Summ1 (int matrix[SIZE][SIZE]); //суммирует элементы диагоналей ниже побочной диагонали

int main () {

// забиваем матрицу элементами
int matrix[SIZE][SIZE];
for (int i=0; i<SIZE; i++){
for (int j=0; j<SIZE; j++){
cin >> matrix[i][j];
}
}

cout <<"Сумма элементов столбцов без отриц. элементво: " << (Sum(matrix)) << endl;
if (Summ(matrix)<Summ1(matrix))
cout <<"Минимальная сумма: " << (Summ(matrix))<< endl;
else cout <<"Минимальная сумма: " << (Summ1(matrix))<< endl;
return 0;

}


// сумма элементов столбцов без отрц. элементов
int Sum (int matrix[SIZE][SIZE]) {

int sum=0; // общая сумма
int sum2; // сумма одного столбца
bool N=false;

for (int j=0; j<(SIZE); j++) {
N=false;
sum2=0;
for (int i=0; i<(SIZE); i++) {
if (matrix[i][j]<0) N=true;
sum2 += matrix[i][j];
}
if (N) sum2 = 0;
else sum += sum2;
}

return sum;
}


// сумма диагоналей выше побочной диагонали (по модулю)
int Summ(int matrix[SIZE][SIZE]) {

int summ=0;
int minimum=fabs(matrix[1][1]);

for (int j=1;j<(SIZE-1);j++){
summ=0;
for (int i=1;i<(SIZE-j);i++){
summ+=fabs(matrix[i][SIZE-j-i+1]);
cout << summ << " ";
}
if (minimum>summ) minimum=summ;
}
return minimum;
}

// сумма диагоналей ниже побочной диагонали (по модулю)
int Summ1(int matrix[SIZE][SIZE]) {

int summ=0;
int minimum1=fabs(matrix[1][1]);

for (int j=2;j<SIZE;j++){
summ=0;
for (int i=j;i<SIZE;i++){
summ+=fabs(matrix[i][SIZE-i+j]);
cout << summ << " ";
}
if (minimum1>summ) minimum1=summ;
}
return minimum1;
}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






// Выше побочной диагонали
int Summ(int matrix[SIZE][SIZE]) {

int summ = 0;
int minimum = fabs(matrix[0][0]);
cout << "up" << endl;

for(int i = 0; i < SIZE - 1; ++i) {

summ = 0;
for(int j = 0; j <= i; ++j) summ += fabs(matrix[i][j]);
cout << summ << " ";

if(minimum > summ) minimum = summ;

}
cout << endl;
return minimum;
}

// Ниже побочной диагонали
int Summ1(int matrix[SIZE][SIZE]) {

int summ=0;
int minimum = matrix[SIZE-1][SIZE-1];
cout << "down" << endl;

for (int j=0;j<SIZE-1;j++){

summ=0;
for (int i = j; i < SIZE-1; i++) {
summ += fabs(matrix[i][SIZE-i+j-1]);
}
cout << summ << " ";
if(minimum > summ) minimum = summ;

}
cout << endl;
return minimum;
}


Вызывать так:
...
int min_up, min_down;
if((min_up = Summ(matrix)) < (min_down = Summ1(matrix)))
cout <<"Минимальная сумма: " << min_up << endl;
else cout <<"Минимальная сумма: " << min_down << endl;
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






volvo Громадное спасибо, за помощь!!!

Только вот не всегда он правильно выдает сумму? Например, если взять матрицу: 17, 2, 6, -3, 9, 3, 1, 3, 11. Выдает ответ 3, хотя должен 5. Может где-нить ошибка есть?

Вот исходник весь (вроде всё правильно с виду):


#include <iostream.h>
#include <math.h>

#define SIZE 3 // размер матрицы

// прототипы функций
int Sum (int matrix[SIZE][SIZE]); // суммирует неотрицательных столбцов
int Summ (int matrix[SIZE][SIZE]); // суммирует элементы диагоналей выше побочной диагонали
int Summ1 (int matrix[SIZE][SIZE]); //суммирует элементы диагоналей ниже побочной диагонали

int main () {

// забиваем матрицу элементами
int matrix[SIZE][SIZE];
for (int i=0; i<SIZE; i++){
for (int j=0; j<SIZE; j++){
cin >> matrix[i][j];
}
}

cout <<"Сумма элементов столбцов без отриц. элементво: " << (Sum(matrix)) << endl;
int min_up, min_down; // переменные для хранения минимальных сумм
if((min_up = Summ(matrix)) < (min_down = Summ1(matrix)))
cout <<"Минимальная сумма: " << min_up << endl;
else cout <<"Минимальная сумма: " << min_down << endl;

}


// сумма элементов столбцов без отрицательных элементов
int Sum (int matrix[SIZE][SIZE]) {

int sum=0; // общая сумма
int sum2; // сумма одного столбца
bool N=false;

for (int j=0; j<(SIZE); j++) {
N=false;
sum2=0;
for (int i=0; i<(SIZE); i++) {
if (matrix[i][j]<0) N=true;
sum2 += matrix[i][j];
}
if (N) sum2 = 0;
else sum += sum2;
}
return sum;
}

// суммирование выше побочной диагонали
int Summ(int matrix[SIZE][SIZE]) {

int summ = 0;
int minimum = fabs(matrix[0][0]);
cout << "up" << endl;

for(int i = 0; i < SIZE - 1; ++i) {

summ = 0;
for(int j = 0; j <= i; ++j) summ += fabs(matrix[i][j]);
cout << summ << " ";

if(minimum > summ) minimum = summ;

}
cout << endl;
return minimum;
}

// ниже побочной диагонали
int Summ1(int matrix[SIZE][SIZE]) {

int summ=0;
int minimum = fabs(matrix[SIZE-1][SIZE-1]);
cout << "down" << endl;

for (int j=0;j<SIZE-1;j++){

summ=0;
for (int i = j; i < SIZE-1; i++) {
summ += fabs(matrix[i][SIZE-i+j-1]);
}
cout << summ << " ";
if(minimum > summ) minimum = summ;

}
cout << endl;
return minimum;
}


 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Да, что-то меня проглючило... Вот так проверь:
// Выше
int Summ(int matrix[SIZE][SIZE]) {

int summ = 0;
int minimum = fabs(matrix[0][0]);
cout << "up" << endl;

for(int j = 1; j < SIZE; ++j) {

summ = 0;
for(int i = 1; i <= SIZE - j; ++i) {
summ += fabs(matrix[i - 1][SIZE - j - i]);
}
cout << summ << " ";

if(minimum > summ) minimum = summ;

}
cout << endl;
return minimum;
}

// Ниже
int Summ1(int matrix[SIZE][SIZE]) {

int summ=0;
int minimum = matrix[SIZE-1][SIZE-1];
cout << "down" << endl;

for (int j = 2;j < SIZE+1;j++){

summ=0;
for (int i = j; i < SIZE + 1; i++) {
summ += fabs(matrix[i-1][SIZE-i+j-1]);
}
cout << summ << " ";
if(minimum > summ) minimum = summ;

}
cout << endl;
return minimum;
}

(проверял на матрице 3*3 и 5*5 - все работает)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Алексей

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


volvo
Всё отлично работает!!! По крайней мере я не нашел такой комбинации цифр при которой программа бы запоролась. =))) smile.gif yes2.gif Очень тебе благодарен, ты сегодня просто спас мою пятую точку!!! RESPECT!!! good.gif good.gif good.gif

P.S. Тока я поставил ещё всё-таки модуль в третьей функцие, где minimum определяется.
 // Ниже
int Summ1(int matrix[SIZE][SIZE]) {

int summ=0;
int minimum = abs(matrix[SIZE-1][SIZE-1]);
cout << "down" << endl



УРА!!! yes2.gif yes2.gif yes2.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Алексей

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


Нужна помощь...
Не могу засунуть смену индексов в сам цикл... unsure.gif
чтобы записывать само суммирование не так:
 summ += fabs(matrix[i - 1][SIZE - j - i]);

а так:
 summ += fabs(matrix[i][j]);

Можно ли это сделать? mega_chok.gif
Из-за этого не принимают задачу... mad.gif

P.S. После повторных тестов суммирование на больших матрицах идет коряво... dry.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






А тесты, кстати, надо СРАЗУ приводить. Пока тестов (причем ВСЕХ, на которых ты собираешься тестировать задачу) не будет здесь - не прикоснусь больше к заданию.

ВСЕ. Надоело. Это не то, и это не так. СДЕЛАЙ ТАК!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Алексей

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


volvo
Извини, но тесты не я даю, а препод... mega_chok.gif

Один вопрос только, можно всё-таки убрать изменение индексов в сами циклы или нет? А то я парюсь с этим уже битый час... nea.gif

Заранее благодарен за ответ.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Можно...
// up
int Summ(int matrix[SIZE][SIZE]) {

int summ = 0;
int minimum = fabs(matrix[0][0]);
cout << "up" << endl;

for(int i = 0; i < SIZE - 1; ++i) {

summ = 0;
for(int j = 0, k = i; j <= i; ++j, --k) {
summ += fabs(matrix[k][j]);
}
cout << summ << " ";

if(minimum > summ) minimum = summ;

};

cout << endl;
return minimum;
}

// down
int Summ1(int matrix[SIZE][SIZE]) {

int summ=0;
int minimum = matrix[SIZE-1][SIZE-1];
cout << "down" << endl;
for(int i = SIZE - 1; i > 0; --i) {

summ = 0;
for(int j = i, k = SIZE - 1; j < SIZE; ++j, --k) {
summ += fabs(matrix[k][j]);
}
cout << summ << " ";

if(minimum > summ) minimum = summ;

};

cout << endl;
return minimum;
}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Алексей

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


Спасибо volvo за помощь! smile.gif Благодаря тебе намного улучшил программу. good.gif
Задача звучала так:
Дана квадратная матрица, определить в ней:
1) Сумму столбцов, в которых нет отрицательных элементов
2) Минимальную сумму элементов диагоналей параллельных побочной диагонали.

Конечный результат программы таков:

#include <iostream.h>
#include <fstream.h>
#include <math.h>

#define SIZE 5 // размер матрицы

// прототипы функций
int Sum (int matrix[SIZE][SIZE]); // находит сумму столбцов, в которых нет отричательных элементов
int UpSum (int matrix[SIZE][SIZE]); // суммирует и находит минимум среди сумм диагоналей выше побочной
int DownSum (int matrix[SIZE][SIZE]); // суммирует и находит минимум среди сумм диагоналей ниже побочной
int main () {


// забиваем матрицу из файла "matrix.txt" (не забудьте его создать =) )
int matrix[SIZE][SIZE];

ifstream fin("matrix.txt");
for (int i=0; i<SIZE; i++){
for (int j=0; j<SIZE; j++){
fin >> matrix[i][j];
}
}


cout <<"Sum of column without negative elements: " << (Sum(matrix)) << endl;
int min_up, min_down; // переменные для хранения минимумов сумм выше и ниже побочной диагонали
if((min_up = UpSum(matrix)) < (min_down = DownSum(matrix)))
cout <<"Minimal sum of elements of lateral diagonal: " << min_up << endl;
else cout <<"Minimal sum of elements of lateral diagonal: " << min_down << endl;


}



// находит сумму столбцов, в которых нет отричательных элементов
int Sum (int matrix[SIZE][SIZE]) {

int sum=0; // общая сумма
int onesum; // сумма одного столбца
bool N=false; // показывает был ли отрицательный элемент в столбце

// суммирование по столбцам
for (int j=0; j < SIZE; j++) {
N=false;
onesum=0;
for (int i=0; i < SIZE; i++) {
if (matrix[i][j]<0) N=true;
onesum += matrix[i][j];
}
if (!N) sum += onesum;
}

return sum;
}


// суммирует и находит минимум среди сумм диагоналей выше побочной
int UpSum(int matrix[SIZE][SIZE]) {

int sum = 0;
int minimum = abs(matrix[0][0]);
cout << "up" << endl;

// цикл по диагоналям (сверху вниз)
for(int d =1; d < SIZE; d++){
sum = 0;
// цикл строит и суммирует диагонали
for(int s = 0; s < d; s++) {
int i = d - s - 1;
int j = s;
sum += abs(matrix[i][j]);
}
if(minimum > sum) minimum = sum;
cout << sum <<" ";
}

cout << endl;
return minimum;
}

// суммирует и находит минимум среди сумм диагоналей ниже побочной
int DownSum(int matrix[SIZE][SIZE]) {

int sum=0;
int minimum = abs(matrix[SIZE-1][SIZE-1]);
cout << "down" << endl;

// цикл по диагоналям (снизу вврех)
for (int d = SIZE; d > 1; d--){

sum=0;
// строит и суммирует диагонали
for (int s = 0; s < SIZE - d + 1; s++)
{
int i = (d+s-1);
int j = (SIZE-s-1);
sum += abs(matrix[i][j]);
}
if(minimum > sum) minimum = sum;
cout << sum << " ";
}

cout << endl;
return minimum;
}



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


Гость






А вот теперь объясни мне смысл изменений, внесенных тобой в программу.

Зачем, по-твоему, я вносил все вычисления индексов в сами циклы? Не по твоей ли просьбе:
Цитата(xazard @ 31.05.2006 10:47)
можно всё-таки убрать изменение индексов в сами циклы или нет? А то я парюсь с этим уже битый час...

?

Так что же получается? Ты просишь внести все в цикл, тебе это ДЕЛАЮТ, и ты ТУТ ЖЕ выносишь все обратно? Тогда зачем просил?

Да и вообще, ты на С++ пишешь, или на Бейсике? Так ПОЛЬЗУЙСЯ преимуществами языка! Зачем вычислять эти i и j отдельно, если я показал тебе, как это сделать прямо в цикле? Почему надо все время привыкать к ПЛОХОМУ стилю? Ведь так и будешь продолжать пользоваться таким стилем "кодирования" (я даже программированием это назвать не могу). До первого собеседования, ибо ТАКОЙ стиль никому не нужен...

Как видно, в следующий раз надо просто игнорировать такие темы nea.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: Алексей

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


Спорить не буду, как писать лучше, потому как опыта в программировании на С/С++ пока практически не имею. Но мне кажется, что по читабельности разница сразу ощутима (хотя ИМХО). А изменения сделаны для того, чтобы сдать задачу. Потому как у всех разные стили и мне приходится подстраиваться под тех, кому я сдаю. Возможно, такое в производстве и «не пройдет», но я пока тока учусь… smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


что ж это за преподы, которые требуют писать в "своем" (==бейсиковском) стиле?
и почему ты тогда сначала хотел по-другому?
я понимаю, когда требуют отступы и т.д., но в остальном обычно не придираются - если:
1. работает.
2. можешь объяснить, как работает.
3. можешь объяснить, почему твой вариант не хуже предложенного преподом. (если наглости хватит - доказывай, что лучше).

а вообще, имхо, читается изменение в цикле лучше.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 




- Текстовая версия 18.08.2017 19:30
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"