powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите решить задачу
10 сообщений из 35, страница 2 из 2
Помогите решить задачу
    #33457528
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эээ, нет! Если выполнить копирование такого массива один раз, то да быстро.
А когда вы выполняете такое копирование при каждом встреченном нулевом значении
в этом массиве... то не очень.
Соберите исходный пример и результат в студию.

насчет оптимизации, да он вставляется всегда если только не
попросить компилятор отключить такого рода вставку и заменить ее
вызовом функции из библиотеки.


Код: 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.
#include <math.h>
#include <stdio.h>

double func( double arr[], unsigned n, double* max )
{
	double sum =  0 . 0 ;
	unsigned int i =  0 , flag =  0 , insPos =  0 ;
	
	while( i < n ) {
		double val = arr[i];
		if( val ==  0 . 0  ) {
			if( !insPos ) insPos = i+ 1 ;
		} else {
			if( val >  0 . 0  )	flag++;
			else {
				if( flag ==  1  ) sum += val;
				val = fabs( val );
			}
			if( *max < val ) *max = val;
			if( insPos ) arr[ insPos++ -  1  ] = arr[ i ];
		}
		i++;
	}
	if( insPos )
		for( --insPos; insPos < n; insPos++ ) arr[ insPos ] =  0 . 0 ;
	return sum;
}
double func1( double arr[], unsigned n, double* max )
{
    double sum =  0 , val;
    int flag =  0 , i =  0 ;
    while (i < n) {
        val = arr[i];
        if (*max < (val >=  0 )? val : -val)
            *max = val;
        if (flag ==  0 ) 
            flag =  1 ;
        else if (flag >  0 )
            if (val <=  0 ) 
                sum += val; 
            else 
                flag = - 1 ;
        if (val ==  0  && i < n -  1 )
        {
            memcpy(&arr[i], &arr[i +  1 ], (--n - i) * sizeof(double)); 
            arr[n] =  0 ;
        }
        else
            i++;
     }
     return sum;
}

double bigarr[ 100000 ];

#include<time.h>

int main()
{
	int n =  0 ;
	double arr[] = {  8 ,  0 , - 2 . 0 ,  5 ,  0 ,  0 ,  7 ,  6 ,  0 , - 12 . 0  };
	for( n =  0 ; n <  10000 ; n++ ) memcpy( &bigarr[n], arr,  10 *sizeof(double) );
	unsigned sz = sizeof(bigarr)/sizeof(double), i;
	double max =  0 . 0 , sum;

	time_t b = time(NULL);
	sum = func( bigarr, sz, &max );
	printf( "func(): %f\n", difftime( time(NULL), b ) );

	for( n =  0 ; n <  10000 ; n++ ) memcpy( &bigarr[n], arr,  10 *sizeof(double) );

	b = time(NULL);
	sum = func1( bigarr, sz, &max );
	printf( "func1(): %f\n", difftime( time(NULL), b ) );

	return  0 ;
}


--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33457728
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Согласен!!! Сорри, что столько времени отнял. А все потому что самый первый пост Ваш плохо посмотрел. Не понял идеи. Вообщем окончательно.
Код: 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.
double func( double arr[], unsigned n, double* max )
{
    double sum =  0 , val;
    int flag;
    unsigned int i, insPos;
    flag = insPos = i =  0 ;
    while (i < n) {
        if ((val = arr[i]) !=  0 )
        {
            if (*max < ((val >=  0 )? val : -val))
                *max = val;
            if (flag ==  0  && val >  0 ) 
                flag =  1 ;
            else if (flag >  0 )
                if (val <=  0 )
                    sum += val;
                else
                    flag = - 1 ;
            if (i > insPos)
               arr[insPos] = val;
            insPos++;
        }
        i++;
    }
    if (insPos)
       memset(&arr[insPos],  0 , (n - insPos) * sizeof(double));
    if (flag >  0 )
         return  1 ;
    return sum;
}
Или еще будут предложения по оптимизации? Можно на ассемблере попробовать :)
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33460638
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
using namespace std;
#include <vector>
#include <algorithm>
#include <iostream>
#include  <math.h>

template<class _Type>class MyMax // Ищем максимум
{
	public:
	_Type m_max;
	MyMax ( const _Type& val= 0 . 0  ) : m_max ( val ){}
	void operator () ( _Type& elem ) { m_max = abs(elem) > m_max? abs(elem):m_max; }
	operator _Type (){ return m_max; }
};

template<class _Type>class MyOut // Для вывода вектора
{
	public:
	MyOut ( ){}
	void operator () ( _Type& elem ) { cout<<elem<<' '; }
	operator _Type (){ cout <<endl; return (_Type)  0 ; }
};


bool Zcomp (double elem ){ return elem; } // Для разбиения относительно 0


int _tmain(int argc, _TCHAR* argv[])
{


	vector<double> v;
	vector<double> ::iterator it;
	double sum= 0 . 0 ;
	double a[] = {- 10 , 11 . 3 ,- 1 ,- 2 , 0 , 12 ,- 14 , 1 , 2 , 0 };// Чтобы не писать v.push_back(...);
	v.assign(a,a+sizeof(a)/sizeof(double));
//Макисмум
	cout<<"Max="<<for_each(v.begin(),v.end(),MyMax<double>() )<<endl;
//Первое положительное
	for(it = v.begin(); it != v.end() && *it <=  0 . 0 ; ++it);
//Пока положительны
	for(; it != v.end() && *it >  0 . 0 ; ++it) sum += *it;
	cout<<"Sum = "<< sum<<endl;
//Печать исходного
	cout<<"Before sort"<<endl;
	for_each(v.begin(),v.end(),MyOut<double>() );
//0 сзади. порядок сохранён
	partition(v.begin(),v.end(),Zcomp );
//Печать
	cout<<endl<<"After sort"<<endl;
	for_each(v.begin(),v.end(),MyOut<double>() );
	
	
	return  0 ;
}


...
Рейтинг: 0 / 0
Помогите решить задачу
    #33460666
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упс! Похоже я не понял условие 2 - между первым и вторым положительным числом, но модифицировать условие второго цикла не сложно, хуже, если нужно искать что-то типа

положительное неположительное ... положительное

кстати - такого в общем случае может и не быть.
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33460734
Luck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
люди, может окажите помощь ниже привиден текст программы к этой задаче я вот только не могу придумать как находть сумму может подскажите?
# include <stdio.h>
# include <math.h>
# include "rus.h"
int main()
{
const int n=10;
int x[n];
int t,temp,i,z,max, sum;
for (t=0; t<n; ++t)
{
printf(rus("Введите %d-й элемент массива: "), t+1);
scanf("%d", &x[t]);
}
max=x[0];
for (i=0;i<n;i++)
{
if (max<abs(x ))
max=abs(x);
}
printf("Max=%d\n",max);
for(z=1;z<n;z++)
for(i=0;i<n-1;i++)
if(x==0)
{
temp=x;
x=x[i+1];
x[i+1]=temp;
}

printf(rus("Переделанный массив\n"));
for(i=0;i<n;i++)
printf(rus("%d\n"),x);
sum=0;
for(i=0;i<n;i++)// Вот отсюда не знаю как дальше (нахождение суммы)
if(x>0)

return 0;
}
И может кто поможет изобразть болк-схему
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33461229
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Писец! Ужаснах! КГ/АМ. :-) Аффтар выпей йаду!

Luck вам же уже дали готовое решение. Зачем еще что-то изобретать да еще
в таком ужасном стиле.

Или вас уже разоблачили и заставляют писать свое?
--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33463214
Luck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
дело в то что и надо в таком ужастном виде!!!!Нельзя функцию использовать!
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33463227
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Luckдело в то что и надо в таком ужастном виде!!!!Нельзя функцию использовать!
Про функции вам еще на лекциях не рассказывали? Ну-ну...
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33463234
Luck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
расказывали, но для данной задачи сказали не использовать
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33467954
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин! Не уж то так трудно из функции код вынести? :-)

Код: 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.
#include <math.h>
#include <stdio.h>

const int n =  10 ;

int main()
{
	double arr[n], max= 0 . 0 , sum= 0 . 0 ;
	int i, flag =  0 , insPos =  0 ;

	/* Наполнение массива */
	for( i =  0 ; i < n; i++ ) {
		printf( "Введите %d-й элемент массива: ", i+ 1  );
		scanf( "%lf", &arr[i] );
	}

	/* Расчет и преобразование массива */
	for( i =  0 ; i < n; i++ ) {
		double val = arr[i];
		if( val ==  0 . 0  ) {
			if( !insPos ) insPos = i+ 1 ;
		} else {
			if( val >  0 . 0  )	flag++;
			else {
				if( flag ==  1  ) sum += val;
				val = fabs( val );
			}
			if( max < val ) max = val;
			if( insPos ) arr[ insPos++ -  1  ] = arr[ i ];
		}
	}
	if( insPos )
		for( --insPos; insPos < n; insPos++ ) arr[ insPos ] =  0 . 0 ;

	/* Вывод результатов */
	printf( "Max = %f, Sum = %f\nПеределанный массив:\n", max, sum );
	for( i =  0 ; i < n; i++ )
		printf( "arr[%d] = %f\n", i, arr[i] );
}

PS В условиях вашей задаи было использование вещественных (float,double),
а не целых (int) чисел.

--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите решить задачу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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