Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / помогите пожалуйста / 13 сообщений из 13, страница 1 из 1
05.12.2006, 23:18
    #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
05.12.2006, 23:38
    #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
05.12.2006, 23:50
    #34179011
нью
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите пожалуйста
блин. не ту версию вставил =))
...
Рейтинг: 0 / 0
05.12.2006, 23:54
    #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
06.12.2006, 00:16
    #34179028
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите пожалуйста
(качает головой, просматривая)

Ой-ой-ой...

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

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

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

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

Поясни!
...
Рейтинг: 0 / 0
06.12.2006, 02:41
    #34179097
нью
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите пожалуйста
вот полностью задание:
авторДана целочисленная квадратная матрица. Определить:
1) сумму элементов в тех строках, котороые не содержат отрицательных элементов
2) минимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы
...
Рейтинг: 0 / 0
06.12.2006, 11:48
    #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
06.12.2006, 14:33
    #34180604
нью
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите пожалуйста
mayton Принцип: для того, чтобы вычислить минимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы, достаточно посетить каждый элемент только один раз, и порядок посещения при этом произволен. Т.е. никаких треугольников не нужно. Единственная сложность - это формула отображения элемента a(i,j) в соответствующий элемент вектора частичных сумм m(). Я думаю, эту формулу ты напишешь.

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

Ну как?

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


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