Задать вопрос
EgoRusMarch
@EgoRusMarch
C++ Developer

Какой код лучше?

В общем, есть задача:
Напишите на языке Си функцию, которая ищет в массиве самую длинную непрерывную последовательность чисел, имеющих заданное значение. Параметры функции:
1) указатель на массив целых чисел,
2) количество элементов в массиве,
3) искомое значение.
Возвращаемое подпрограммой значение: целое число, которое равно длине самой длинной непрерывной последовательности чисел, имеющих заданное значение.

Например для массива
int array[] = { 1,5,5,5,5,5,8,9,9,3,3,3,9,0,0,0,3,3,4,5,5,5,1,3,3,3,3,3,3,3,3,3,3 };
и искомого числа 3 ответ будет 10
и искомого числа 5 ответ будет 5
и искомого числа 0 ответ будет 3

Есть два варианта кода:
// ПЕРВЫЙ
int find(int *a, int lenght, int key)
{ 
	int tmp = 0; 
	int result = 0; 

	for (int i = 0; i < lenght; i++) { 
		if (a[i] == key) tmp++; 
		if (a[i] != key) tmp = 0; 
		if (tmp > result) result = tmp; 
	}

	return result; 
}

// ВТОРОЙ
int search(const int * const array, const int size, const int number)
{
	int max = 0;
	int count = 0;
	enum {N,Y} equally=N;

	for(int i=0; i<size; ++i)
		if(array[i]==number) {
			++count;
			if(equally==N)
				equally = Y;
		}
		else if(array[i]!=number && equally==Y) {
			if(max<count)
				max = count;
			count = 0;
			equally = N;
		}

	if(max<count)
		max = count;

	return max;
}

Во втором нет ни одного лишнего присваивания.
В первом они происходят почти каждую итерацию.
Но первый намного проще.
Какой код лучше? =))
  • Вопрос задан
  • 454 просмотра
Подписаться Оценить 1 комментарий
Решения вопроса 1
6elkka
@6elkka
В первом варианте

if (a[i] == key) tmp++; 
if (a[i] != key) tmp = 0; 
if (tmp > result) result = tmp;


заменить на

if (a[i] == key) tmp++; 
else if(tmp)
{
    if (tmp > result) result = tmp;
    tmp = 0;    
}


и в конце (после цикла) добавить

if (tmp > result) result = tmp;

Тогда лишних присваиваний не будет и код остался похож на исходный вариант
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Понятие "лучше" абстрактное и вне фразы "лучше чем" не существует. По каким признакам оценивать код - по быстродействию, по читабельности, по еще сто-тыщ-разных критериев?

Если хотите оценить быстродействие - переведите код в ассемблер и посмотрите результат. Скорость выполнения ассемблерных команд тоже конечно в попугаях, но там хоть сравнить можно в числах.

Если хотите оценить понятность кода - второй гораздо сложнее воспринимается. В первом, кстати второй if совершенно лишний :) - a[i] может быть либо равно key, либо не равно, третьего варианта нет, поэтому его совершенно спокойно можно заменить на else - это и по быстродействию даст выйгрыш.

Кстати о присваиваниях. Операции типа tmp++ вполне могут делаться в регистрах, одной командой.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы