powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите решить задачу
35 сообщений из 35, показаны все 2 страниц
Помогите решить задачу
    #33453327
Luck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) максимальный по модулю элемент массива;
2) сумму элементов массива, расположенных между первым и вторым положительными элементами.
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33453542
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.
#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  ) {
				if( flag <  2  ) { flag =  1 ; sum += val; }
			} else {
				if( flag ==  1  ) { flag =  2 ; }
				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;
}

int main()
{
	double arr[] = { - 3 . 0 , - 2 . 0 ,  5 ,  0 ,  0 ,  7 ,  6 ,  0 , - 4 . 0 ,  3 ,  4  };
	unsigned sz = sizeof(arr)/sizeof(double), i;
	double max =  0 . 0 ;
	
	double sum = func( arr, sz, &max );

	printf( "Sum = %f, |Max| = %f, array:\n", sum, max );
	for( i =  0 ; i < sz; i++ )
		printf( "[%d] = %f\n", i, arr[i] );
	return  0 ;
}
--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33453553
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс! Малость не так. Не совсем верно понял второе условие.
Сейчас второй вариант нарисуюю
--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33453578
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Luck2) сумму элементов массива, расположенных между первым и вторым положительными элементами.

Включая эти элементы или исключая их?
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33453592
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackStar Luck2) сумму элементов массива, расположенных между первым и вторым положительными элементами.

Включая эти элементы или исключая их?
Блин! А ноль считается положительным? :)
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33455151
Luck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, но по проще нельзя?
Не считая эти элименты.
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33455349
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда вот так. Это вариант когда 0 не считается положительным значением.

Код: 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.
#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;
}

int main()
{
	double arr[] = {  8 , - 3 . 0 , - 2 . 0 ,  5 ,  0 ,  0 ,  7 ,  6 ,  0 , - 12 . 0 ,  3 ,  4  };
	unsigned sz = sizeof(arr)/sizeof(double), i;
	double max =  0 . 0 ;
	
	double sum = func( arr, sz, &max );

	printf( "Sum = %f, |Max| = %f, array:\n", sum, max );
	for( i =  0 ; i < sz; i++ )
		printf( "[%d] = %f\n", i, arr[i] );
	return  0 ;
}

Если же хочется и 0 считать положительным надо поправить кусочек вот так
Код: plaintext
1.
2.
3.
4.
		if( val ==  0 . 0  ) {
			flag++;
			if( !insPos ) insPos = i+ 1 ;
		} else {

Ну куда уж проще? Или еще прокоментировать что каждая строка делает?
--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33455478
spectre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlackStarЕсли же хочется и 0 считать положительным надо поправить кусочек вот так
"0" не является положительным числом.

А вот как можно посчитать сумму между первыми двумя положительными числами.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
double sumbetween(double*a,int n)
{
   double sum =  0 ;
   int i =  0 ;
   while(a[i++]<= 0 );
   while(a[i]<= 0 )sum+=a[i++];
   return sum;
}
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33455562
Luck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет, каждую строку коментировать не стоит.
Просто на сколько я понимаю здесь используется функция? а без неё никак?
прошу прощения если я не прав.Не давно только начал изучать
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33456751
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Luckнет, каждую строку коментировать не стоит.
Просто на сколько я понимаю здесь используется функция? а без неё никак?
прошу прощения если я не прав.Не давно только начал изучать

Можно и без функции. Но зачем?
Функция func решает вашу задачу. Функция main (основная функция программы)
вызывает func с необходимыми данными и отображает результат.
func можно вызывать несколько раз, с разными исходными данными.
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33456756
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spectre BlackStarЕсли же хочется и 0 считать положительным надо поправить кусочек вот так
"0" не является положительным числом.

А вот как можно посчитать сумму между первыми двумя положительными числами.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
double sumbetween(double*a,int n)
{
   double sum =  0 ;
   int i =  0 ;
   while(a[i++]<= 0 );
   while(a[i]<= 0 )sum+=a[i++];
   return sum;
}


Угу. Тока мой вариант решает все три условия задачи за один проход
по массиву и не используя дополнительной памяти для упорядочивания
массива.
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33456837
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эххх... тоже чтоли молодость вспомнить, пока работы немного...
Код: 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.
double func( 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 )
        {
            ::memmove(arr[i], arr[i +  1 ], (--n - i) * sizeof(double)) 
            arr[n] =  0 ;
        }
        else
            i++;
     }
     return sum;
}
Не тестировал правда...
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33456858
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 _Балтика:

двигать весь хвост массива на каждый ноль - не совсем экономично :)
если например размер массива 100000, и он хорошо разряжен нулевыми значениями...

--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33456877
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Балтика
Код: 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.
double func( 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 )
        {
            ::memmove(arr[i], arr[i +  1 ], (--n - i) * sizeof(double)) 
            arr[n] =  0 ;
        }
        else
            i++;
     }
     return sum;
}

Да, нужно бы еще учесть, что в массиве есть только одно положительное значение и в конце цикла while вставить что то типа
Код: plaintext
1.
2.
if (i >= n -  1  && flag >  0 )
    sum =  1 ;
Тогда возвращаемое положительное значение как раз и будет регистрировать этот факт.
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33456879
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будьте осторожны, когда сравниваете вещественные числа, помните о двоичном представлении оных, ибо ошибки могуть крыться здесь...
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33456895
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlackStar2 _Балтика:

двигать весь хвост массива на каждый ноль - не совсем экономично :)
если например размер массива 100000, и он хорошо разряжен нулевыми значениями...

--
There Ain't No Such Thing As A Free Lunch
А я и не двигаю
Код: plaintext
1.
::memmove(arr[i], arr[i +  1 ], (--n - i) * sizeof(double))
--n
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33456907
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, естественно вот так
Код: plaintext
1.
::memmove(&arr[i], &arr[i +  1 ], (--n - i) * sizeof(double));
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33456923
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Балтика BlackStar2 _Балтика:

двигать весь хвост массива на каждый ноль - не совсем экономично :)
если например размер массива 100000, и он хорошо разряжен нулевыми значениями...

--
There Ain't No Such Thing As A Free Lunch
А я и не двигаю
Код: plaintext
1.
::memmove(arr[i], arr[i +  1 ], (--n - i) * sizeof(double))
--n

один черт. :)
и кстати передавать в memmove значения массива не самая удачная идея :)
наверное правильно вот так
Код: plaintext
1.
::memmove(&arr[i], &arr[i +  1 ], (--n - i) * sizeof(double))
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33456937
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlackStar
один черт. :)
и кстати передавать в memmove значения массива не самая удачная идея :)

Это очепятка, я сам заметил :).
Почему же, один черт? В этом случае мы исключаем из движения все завершающие нули. Да и кол-во циклов уменьшается.
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33457084
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Балтика BlackStar
один черт. :)
и кстати передавать в memmove значения массива не самая удачная идея :)

Это очепятка, я сам заметил :).
Почему же, один черт? В этом случае мы исключаем из движения все завершающие нули. Да и кол-во циклов уменьшается.
Потому что все равно приходится перемещать в памяти достаточно большие блоки информации. Теперь насчет циклов, вы думаете их нет в memmove?

Код: 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.
void * memmove(void *dst0, const void *src0, size_t length)
{
        char *dst = dst0;
        const char *src = src0;
        size_t t;

        if (length ==  0  || dst == src)          /* nothing to do */
                goto done;

        /*
         * Macros: loop-t-times; and loop-t-times, t>0
         */
#define TLOOP(s) if (t) TLOOP1(s)
#define TLOOP1(s) do { s; } while (--t)

        if ((unsigned long)dst < (unsigned long)src) {
                /*
                 * Copy forward.
                 */
                t = (uintptr_t)src;     /* only need low bits */
                if ((t | (uintptr_t)dst) & wmask) {
                        /*
                         * Try to align operands.  This cannot be done
                         * unless the low bits match.
                         */
                        if ((t ^ (uintptr_t)dst) & wmask || length < wsize)
                                t = length;
                        else
                                t = wsize - (t & wmask);
                        length -= t;
                        TLOOP1(*dst++ = *src++);
                }
                /*
                 * Copy whole words, then mop up any trailing bytes.
                 */
                t = length / wsize;
                TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize);
                t = length & wmask;
                TLOOP(*dst++ = *src++);
        } else {
                /*
                 * Copy backwards.  Otherwise essentially the same.
                 * Alignment works as before, except that it takes
                 * (t&wmask) bytes to align, not wsize-(t&wmask).
                 */
                src += length;
                dst += length;
                t = (uintptr_t)src;
                if ((t | (uintptr_t)dst) & wmask) {
                        if ((t ^ (uintptr_t)dst) & wmask || length <= wsize)
                                t = length;
                        else
                                t &= wmask;
                        length -= t;
                        TLOOP1(*--dst = *--src);
                }
                t = length / wsize;
                TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src);
                t = length & wmask;
                TLOOP(*--dst = *--src);
        }
done:
        return (dst0);
}
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33457150
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для предыдущего поста в перед функцией memmove надо добавить пару строчек
Код: plaintext
1.
2.
3.
4.
typedef int word;               /* "word" used for optimal copy speed */

#define wsize   sizeof(word)
#define wmask   (wsize -  1 )
--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33457178
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlackStar
Потому что все равно приходится перемещать в памяти достаточно большие блоки информации. Теперь насчет циклов, вы думаете их нет в memmove?

Вобщем то в этом случае memcpy можно использовать.
И надо еще посмотреть это ли используется в memmove?
Может быть из MEMCPY.ASM ? Там если посмотреть так делают:
................
rep movsd
................
А это, согласитесь, в несколько раз быстрее.
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33457227
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Балтика BlackStar
Потому что все равно приходится перемещать в памяти достаточно большие блоки информации. Теперь насчет циклов, вы думаете их нет в memmove?

Вобщем то в этом случае memcpy можно использовать.
И надо еще посмотреть это ли используется в memmove?
Может быть из MEMCPY.ASM ? Там если посмотреть так делают:
................
rep movsd
................
А это, согласитесь, в несколько раз быстрее.
Именно из MEMCPY.ASM . (легко увидеть в дизасемблере).
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33457353
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну уж если начали пиписками меряться... ;-))
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
double bigarr[ 100000 ];

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 ;
}
Код: plaintext
1.
2.
3.
4.
bs@Hearse:~/prj> gcc -O3 -o test1 test.c 
bs@Hearse:~/prj> ./test1
func(): 0.000000
func1(): 33.000000

При этом я заменил в вашей функции (func1) memmove на memcpy,
а gcc при оптимизации -O3 как раз заменяет ее вызов на ассемблерный
код с участием rep movsl

PS Однако при малых размерах массива, разница будет не так заметна.
--
There Ain't No Such Thing As A Free Lunch
Код: plaintext
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33457481
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlackStar
Код: plaintext
1.
2.
3.
4.
bs@Hearse:~/prj> gcc -O3 -o test1 test.c 
bs@Hearse:~/prj> ./test1
func(): 0.000000
func1(): 33.000000

Ну, это по-моему фантастика (33 сек!!!). Если только на
Код: plaintext
1.
sum = func1( bigarr, sz, &max );
брейкпойнта не было :) Во всяком случае при выполнении вот этого (массив в 10 раз больше)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include "stdafx.h"
#include <conio.h>
#include <time.h>

#define SZ_ARRAY	 1000000 

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

	double a[SZ_ARRAY];
	double	b[SZ_ARRAY];

	time_t t = time(NULL);
	memcpy(&a, &b, SZ_ARRAY * sizeof(double));
	printf( "memcpy time: %f\n", difftime( time(NULL), t ));

	t = time(NULL);
	for (int i =  0 ; i < SZ_ARRAY; i++)
		a[i] = b[i];
	printf( "for copy time(): %f\n", difftime( time(NULL), t ));
	getch();
	return  0 ;
}
получается
Код: plaintext
1.
2.
memcpy time: 0.000000
for copy time: 0.000000
Да, кстати, страннно, у меня и при /Od ассемблерный код подставляется.
...
Рейтинг: 0 / 0
Помогите решить задачу
    #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
35 сообщений из 35, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите решить задачу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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