powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / помогите пожалуйста
13 сообщений из 13, страница 1 из 1
помогите пожалуйста
    #34178991
нью
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не могу найти ошибку (запутался в алгоритме по ходу)
нужно в целочисленной квадратной матрице определить минимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы

вот сама прога...
че-то я там перемудрил с алгоритмом.. не могли бы помочь?
заранее благодарен!

#include <iostream>
#include <conio.h>
int main()
{
int nrow, ncol;

... в этом промежутке вводится сама матрица =)


// вычисление минимума среди сумм элементов диагоналей параллельной главной

//кол-во диагоналей
int n, c, e, min, d; //d - номер диагонали, с - счетчик
c = 0; e = 0;
n = ncol + nrow - 2;
int *dsum=new int [n];
for(i=0;i<=n;i++) dsum =0;

// для диагоналей выше главной
for(d=1;d<=n-1;d++)
{
for(i=d;i<=d-1;i++)
{
dsum[e]+=a[i-d];
c++;
if(c==(n-d)){e++; c=0;}
}
}

// для диагоналей ниже главной
for(d=1;d<=n-1;d++)
{
for(i=d;i<=n-1;i++)
{
dsum[e]+=a[i-d];
c++;
if(c==(n-d)) {e++;c=0;}
}
}

//вычисление минимума

for (i=0;i<=n;i++) cout<<dsum<<" ";
cout<<endl;
min=dsum[0];
for(i=1;i<=n ;i++)
if (dsum<min) min=dsum;
cout<<"Min sredi summ diagonaley: "<<min;


getch();
return 0;
}
...
Рейтинг: 0 / 0
помогите пожалуйста
    #34179002
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты хоть-бы присылал рабочее сорсы!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Borland C++  5 . 6  for Win32 Copyright (c)  1993 ,  2002  Borland
test.cpp:
Error E2451 test.cpp  18 : Undefined symbol 'i' in function main()
Error E2451 test.cpp  25 : Undefined symbol 'a' in function main()
Error E2451 test.cpp  44 : Undefined symbol 'cout' in function main()
Error E2451 test.cpp  45 : Undefined symbol 'endl' in function main()
Error E2034 test.cpp  48 : Cannot convert 'int' to 'int *' in function main()
Error E2034 test.cpp  48 : Cannot convert 'int *' to 'int' in function main()
Warning W8004 test.cpp  54 : 'min' is assigned a value that is never used in function main()
***  6  errors in Compile ***

Лентяй!
...
Рейтинг: 0 / 0
помогите пожалуйста
    #34179011
нью
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин. не ту версию вставил =))
...
Рейтинг: 0 / 0
помогите пожалуйста
    #34179014
нью
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
#include <iostream>
#include <math.h>
#include <conio.h>
using namespace std;

int main()
    {
     int nrow, ncol;
    
     cout << endl << "Enter the number of rows, cols" << endl;
     cin >> nrow >> ncol;

     int i,j,g; 
	 int **a = new int *[nrow];
						//выделение памяти под массив
     for( i =  0 ; i < nrow; i++ ) a[i] = new int [ncol];
	 cout << endl << "Enter array elements:" << endl;
						//ввод массива
	 for( i =  0 ; i < nrow; i++ )
	 for( j =  0 ; j < ncol; j++ )
		 cin >> a[i][j];		
			for( i =  0 ; i < nrow; i++ )
			{
				for( j =  0 ; j < ncol; j++ ) cout  << a[i][j] << "  ";
				cout << endl;
			}
int sum =  0 ;
bool all_posit;
						//просмотр по строкам
 for( i =  0 ; i < nrow; i++ )
 {
	 all_posit = true;
	 //проверка элемента
	 for ( j =  0 ; j < ncol; j++ )
		 if (a[i][j]< 0 ) { all_posit = false; break; }
	 if (all_posit)
	 //вычисление суммы строки
	 { 
		for ( j =  0 ; j < ncol; j++ )
			sum+=a[i][j];

	 }
 }
 //ответ для суммы элементов с строках не содержащих отрициательных элементов
 cout << "summa elementov v strokah, ne soderashih negative elements: " << sum << endl;
						
 
 
 
 
// вычисление минимума среди сумм элементов диагоналей параллельной главной

	//n кол-во диагоналей 
	 int c,e,d,m,min,n;
 m= 2 *n- 3 ;
 c= 0 ;e= 0 ;
 int *dsum=new int [m];
 for(i= 0 ;i<=m;i++) dsum[i]= 0 ;
 for(d= 1 ;d<=n- 1 ;d++) //p-nomer diagonali vniz
	{	
	 for(i=d;i<=n- 1 ;i++)
		{
		dsum[e]+=a[i][i-d];
		c++;
		if(c==(n-d)){e++; c= 0 ;}
		}
	}

 for(d= 1 ;d<=n- 1 ;d++)
	{	
	 for(i=d;i<=n- 1 ;i++)
		{
		 dsum[e]+=a[i-d][i];
		 c++;
		 if(c==(n-d)) {e++;c= 0 ;}
		}
	}

 for (i= 0 ;i<=m;i++) cout<<dsum[i]<<" ";
 cout<<endl;
 min=dsum[ 0 ];
 for(i= 1 ;i<=m ;i++)
 if (dsum[i]<min) min=dsum[i];
 cout<<"Min sredi summ diagonaley: "<<min;
 getch();

return  0 ;
}

вот это вроде пашет.. тока с ошибкой =(

там вначале еще считает сумму элементов в строках не содеаржих отрицательных элементов, но на это не обращайте внимания =)
...
Рейтинг: 0 / 0
помогите пожалуйста
    #34179028
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(качает головой, просматривая)

Ой-ой-ой...

А это зачем? Матрица ведь по заданию - квадратная.
Код: plaintext
1.
2.
3.
...
int **a = new int *[nrow];
...
...
Рейтинг: 0 / 0
помогите пожалуйста
    #34179037
нью
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну это ведь не критично =))
посто начал делать так, потом лень было переписывать
...
Рейтинг: 0 / 0
помогите пожалуйста
    #34179053
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вижу, ты уже зарегистрировался? Правильно!

(откидывается на спинку кресло, закуривая)

Ну.. что-ж. Тогда вопрос?

В твоём задании ничего не сказано про обработку отрицательных чисел . А в программе - следы того, как ты суетишся. Делаешь какие-то проверки. Включаешь какие-то флажки. Следовательно ты не огласил исходную формулировку! Так?

Поясни!
...
Рейтинг: 0 / 0
помогите пожалуйста
    #34179097
нью
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот полностью задание:
авторДана целочисленная квадратная матрица. Определить:
1) сумму элементов в тех строках, котороые не содержат отрицательных элементов
2) минимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы
...
Рейтинг: 0 / 0
помогите пожалуйста
    #34179846
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(заходит с чашкой кофе)

Доброе утро, юноша!

Прошу прощения, что зашел так поздно.

(садится)

Значит так. Твоя программа состоит из 3х частей.

1) Ввод матрицы
Проверять её я не хочу. Условно считаю, что в ней нет ошибок.

2) Вычисление сумм по горизонтали.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
for( i =  0 ; i < nrow; i++ )
 {
	 all_posit = true;
	 //проверка элемента
	 for ( j =  0 ; j < ncol; j++ )
		 if (a[i][j]< 0 ) { all_posit = false; break; }
	 if (all_posit)
	 //вычисление суммы строки
	 { 
		for ( j =  0 ; j < ncol; j++ )
			sum+=a[i][j];

	 }
 }
Здесь. вроде-бы всё верно (по твоим словам). Хотя... мне кажется, что я-бы избавился от первого цикла "for(j...". Впрочем... это опционально.

3) Частичные суммы по диагоналям . Здесь у тебя трудности. Верно?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
 int c,e,d,m,min,n;
 m= 2 *n- 3 ;
 c= 0 ;e= 0 ;
 int *dsum=new int [m];
 for(i= 0 ;i<=m;i++) dsum[i]= 0 ;
 for(d= 1 ;d<=n- 1 ;d++) //p-nomer diagonali vniz
	{	
	 for(i=d;i<=n- 1 ;i++)
		{
		dsum[e]+=a[i][i-d];
		c++;
		if(c==(n-d)){e++; c= 0 ;}
		}
	}

 for(d= 1 ;d<=n- 1 ;d++)
	{	
	 for(i=d;i<=n- 1 ;i++)
		{
		 dsum[e]+=a[i-d][i];
		 c++;
		 if(c==(n-d)) {e++;c= 0 ;}
		}
	}

 for (i= 0 ;i<=m;i++) cout<<dsum[i]<<" ";
 cout<<endl;
 min=dsum[ 0 ];
 for(i= 1 ;i<=m ;i++)
 if (dsum[i]<min) min=dsum[i];
 cout<<"Min sredi summ diagonaley: "<<min;
 getch();

Разгребать этот код, не хочется. Вижу, что ты пошел по пути усложнения условий цикла. (похоже на сканирование верхнего и нижнего треугольников матрицы). Я предлагаю тебе этот код выбросить и написать новый по следующему принципу.

Принцип: для того, чтобы вычислить минимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы, достаточно посетить каждый элемент только один раз, и порядок посещения при этом произволен. Т.е. никаких треугольников не нужно. Единственная сложность - это формула отображения элемента a(i,j) в соответствующий элемент вектора частичных сумм m(). Я думаю, эту формулу ты напишешь.

В этом случае, текст исходника упростится до простых двух вложенных циклов с жесткими границами по всем элеменам матрицы.

Ну как?

Осилишь?
...
Рейтинг: 0 / 0
помогите пожалуйста
    #34180604
нью
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton Принцип: для того, чтобы вычислить минимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы, достаточно посетить каждый элемент только один раз, и порядок посещения при этом произволен. Т.е. никаких треугольников не нужно. Единственная сложность - это формула отображения элемента a(i,j) в соответствующий элемент вектора частичных сумм m(). Я думаю, эту формулу ты напишешь.

В этом случае, текст исходника упростится до простых двух вложенных циклов с жесткими границами по всем элеменам матрицы.

Ну как?

Осилишь?
мм.. нельзя ли чуть подробнее? у меня проблемы именно с алгоритмом прохода по диагоналям..
...
Рейтинг: 0 / 0
помогите пожалуйста
    #34184697
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох... студент!

Ну смотри. Даю кусок на Java. (Под рукой оказался компиллер потому-что).

Сам переведешь на Си.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
int[] m=new int[SIZE* 2 - 1 ];
int[] a=new int[SIZE*SIZE];

// инициализация матрицы a

// вектор m инициализируем самыми большими числами из допустимого диапазона

for(int i= 0 ;i<SIZE* 2 - 1 ;i++) m[i]=Integer.MAX_VALUE;

for(int i= 0 ;i<SIZE;i++)
{
	for(int j= 0 ;j<SIZE;j++)
	{
                                m[SIZE+j-i- 1 ]=min(m[SIZE+j-i- 1 ],a[j+i*SIZE]);
	}
}

for(int i= 0 ;i<SIZE* 2 - 1 ;i++) System.out.printf("%5d ",m[i]);

SIZE+j-i-1 - это есть наклонная прекция
...
Рейтинг: 0 / 0
помогите пожалуйста
    #34187319
нью
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(наконец подключась к интрнету)
оО. спасибо большое! =)
...
Рейтинг: 0 / 0
помогите пожалуйста
    #34187323
net_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Matrixi vi vse horoshi reshat! kto bi mne pomog v teme "kak eto sdelat?" :(
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / помогите пожалуйста
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]