IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Улучшить функцию улучшил я, но не знаю правильно или нет
maksimla
сообщение 9.10.2009 18:27
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


Первичные данные целых чисел массив, элементы в массиве упорядочены возрастающем порядке. Функция Daug читает элементы и определяет число который больше всех в этом массиве находится. Если есть числа которые одинаковое число раз повторяются то в ответе любое должно быть.
Задание простое и логичное.
Код
const m = ...;
      n = ...;
type masyvas = array [m..n] of integer;
function Daug (a : masyvas) : integer;
var i, r,        
    k,          
    sk : integer;
begin
  r := a[m];
  sk := 1; k := 1;
  for i := m + 1 to n do
    begin
      if a[i] = a[i – 1]
        then begin
               k := k + 1;
               if k > sk
                 then begin
                        r := a[i];
                        sk := k
                      end
             end
        else k := 1
    end;
  daug := r
end;

Henry Ledgard писал что этот алгоритм пробовали улучшить сто людей но некто лучше нечего не придумал.
Но вы сто первый.
Попробуйте написать решение одной переменной, и одной управляемой структурой меньше.
Что это за структура управляемой?
Я вот изменил не много не знаю правильно или нет.
Код
const m = ...;
      n = ...;
type masyvas = array [m..n] of integer;
function Daug (a : masyvas) : integer;
var i,        
    k,          
    sk : integer;
begin
  Daug := a[m];
  sk := 1; k := 1;
  for i := m + 1 to n do
      if a[i] = a[i – 1]
        then begin
               k := k + 1;
               if k > sk
                 then begin
                        Daug := a[i];
                        sk := k
                      end
             end
        else k := 1
end;


Сообщение отредактировано: maksimla - 10.10.2009 18:54


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 18.10.2009 17:35
Сообщение #2


Гость






Да какие пару часов? Тут все прозрачно: сначала переписываем функцию в виде
function Daug (a : masyvas) : integer;
var i, r,
k,
sk : integer;
begin
r := a[m];
sk := 1; k := 1;
for i := m + 1 to n do
begin
if a[ i ] = a[i - 1]
then begin
k := k + 1;
end
else k := 1;

if k > sk then begin
r := a[ i ];
sk := k
end
end;
daug := r
end;
(выносим проверку k > sk из первого if-а наружу), потом думаем, какую из этих двух уже независимых друг от друга проверок можно представить собственно БЕЗ if... Получается, что первую, потому что по результатам первой проверки выполняется одно действие (k := k + 1), а по результатам второй - целых 2: изменение R и изменение sk. Поэтому вторую проверку оставляем в покое, и более внимательно смотрим, что же нам надо сделать в первом if-е... А вот что:
if a[ i ] = a[i - 1] then 
k := k + 1
else
k := 1;

, или по-другому:
if a[ i ] = a[i - 1] then
{ k не изменяется }
else
k := 0;

k := k + 1;
Что получили? Получили if с пустой веткой then... Меня учили, что это неправильно, и так делать не надо. Надо "перевернуть" условие, чтобы пустой стала ветка else, и избавиться от нее:
if a[ i ] <> a[i - 1] then { меняем знак = на противоположный: <> }
k := 0; { то, что было в else переходит в then, а пустой бывший then убираем }

k := k + 1;

Ну, а теперь - дело техники добиться того, чтобы при разных значениях a[ i ] и a[i - 1] переменная K становилась равной 0, а при одинаковых - не изменялась. Это можно сделать по-разному, я выбрал способ: "поделить K нацело на число ЗАВЕДОМО большее K (если элементы разные) или на 1 (если элементы одинаковые)"... Вот и вся логика.
 К началу страницы 
+ Ответить 

Сообщений в этой теме
maksimla   Улучшить функцию улучшил я   9.10.2009 18:27
maksimla   а я даже тут в данной мне функции нашел ошибку вве...   18.10.2009 11:44
volvo   Ты задание внимательно читал? У тебя - НЕ возраст...   18.10.2009 11:46
maksimla   ой совсем забыл про возрастающий порядок   18.10.2009 11:52
maksimla   А может можно сделать так чтобы сама функция к себ...   18.10.2009 12:13
volvo   Рекурсия? Я не думаю, что ты этим улучшишь функцию...   18.10.2009 12:17
maksimla   а мне надо избавится от одной управляемой структур...   18.10.2009 12:19
volvo   А ты не делай поспешных выводов :) Вот в этой функ...   18.10.2009 16:19
maksimla   спасибо все понятно. Я даже так и не думал что та...   18.10.2009 17:07
volvo   Да какие пару часов? Тут все прозрачно: сначала пе...   18.10.2009 17:35
maksimla   спасибо за объяснения   19.10.2009 11:32
maksimla   мне сказали что так нельзя использоватьпеременную ...   3.11.2009 16:20
volvo   Это проблема того, кто тебе это сказал. Не надо пр...   3.11.2009 17:04
maksimla   Написал что эта программа неелегантная . const...   6.11.2009 16:32
Lapp   Написал что эта программа неелегантная . [code=...   7.11.2009 7:22
Lapp   А функция твоя выглядит примерно вот так: function...   7.11.2009 8:40
maksimla   Написал что эта программа неелегантная . cons...   7.11.2009 9:38
Lapp   обсурд ему 8 а мне 4 баллаДа уж, за неправильную п...   7.11.2009 11:01


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.06.2025 14:42
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"