Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Неожиданная задачка на сайте программистов про.. программирование


ВладОшин ©   (03.12.20 09:55

))
Дочь кинула вчера - вводят числа, посчитать кол-во меньше нуля и =0

Условно она написала (с++, но какая разница.. никакой, вроде)
while(i++ < 100)
{
cin»x;
if (x<0) s++;
if (x==0) t++;



на что препод "кинул страйк"
Оптимизировать:
if (x<0) s++;
if (x==0) t++;


ну фиг, конечно, знает.. Числа могут и >0 ведь быть
посоветовал
if (x>0) continue;
if (x<0) s++ else t++;

а как тут оптимизировать еще?


manaka ©   (03.12.20 11:35[1]


> if (x<0) s++;
> if (x==0) t++;

В любом случае проверяются два условия. Надо
if (x<0) s++ else
if (x==0) t++;
При х<0 проверка второго условия не выполняется.

Время, блин, у них экономится должно, наверное :)


ВладОшин ©   (03.12.20 12:27[2]


> manaka ©   (03.12.20 11:35) [1]

ну может быть..
Но так менее читабельно, имхо )


manaka ©   (03.12.20 12:58[3]

Давно с++ волнует читабельность?
))))))))))))


manaka ©   (03.12.20 13:01[4]

дело препода - научить правильно писать.
а тов шутка ходит:
Задача. Есть пять пеналов, в каждом по 4 карандаша. Сколько карандашей в пяти пеналах.
5х4=20 - неправильное решение
4х5=20 - правильное решение
:)


Внук ©   (03.12.20 18:05[5]

Наверняка именно else и имелся в виду.
if
elif

Буквально на прошлой неделе своему пояснял, что не надо проверять заведомо лишние условия :)


manaka ©   (03.12.20 21:09[6]


> Внук ©   (03.12.20 18:05) [5]

Я обычно показываю два кода:

a:=1;
for i=1 to 1000000
a:=a+1;

и

a:=1;
for i=1 to 1000000
if a>0 then a:=a+1;

предложив сравнить время выполнения :)


ВладОшин ©   (04.12.20 11:15[7]

чет не вижу разницы

program Project1;
{$APPTYPE CONSOLE}
uses
 SysUtils, Windows;
var
 i, X, C1, C2: Integer;
 N,L1,L11,L2,L22: Cardinal;
begin
 N := 90999999;
 C1 := 0; C2 := 0;
 L1 := GetTickCount;
 for i := 0 to N do
 begin
   X := Random(100) - 50;
   if X < 0 then
     C1 := C1 + 1;
   if X = 0 then
     C2 := C2 + 1;
 end;
 L11 := GetTickCount;
 if C1=C2 then
   write('disable calculate ignor compil');

 C1 := 0; C2 := 0;
 L2 := GetTickCount;
 for i := 0 to N do
 begin
   X := Random(100) - 50;
   if X < 0 then
     C1 := C1 + 1 else
     if X = 0 then
        C2 := C2 + 1;
 end;
 L22 := GetTickCount;
 if C1=C2 then
   write('disable calculate ignor compil');

 Writeln(L11-L1, '  ', L22-L2);
 readln;
end.


ВладОшин ©   (04.12.20 11:18[8]

а вот вариант с

   if X > 0 then
     Continue;
   if X < 0 then
      C1 := C1 + 1 else
      C2 := C2 + 1;


чуть быстрее )


manaka ©   (04.12.20 11:50[9]


> ВладОшин ©   (04.12.20 11:18) [8]

А сколько (С1+С2)/N? То есть, какой процент положительных?
;)


ВладОшин ©   (04.12.20 13:36[10]

>> cколько (С1+С2)/N?
0.509, почти 50%

по числам тиков

840 (+-2 )
вариант
  if X < 0 then
    C1 := C1 + 1;
  if X = 0 then
    C2 := C2 + 1;

и примерно также вариант
  if X < 0 then
    C1 := C1 + 1 else
    if X = 0 then
       C2 := C2 + 1;

825 (+-2 )
вариант
  if X > 0 then
    Continue;
  if X < 0 then
     C1 := C1 + 1 else
     C2 := C2 + 1;


ВладОшин ©   (04.12.20 13:37[11]

ps
антивирус сбесился, два раза удалил уже этот project1.exe.. Видимо, опасным чем-то занимаюсь )


manaka ©   (04.12.20 15:27[12]


> ВладОшин ©   (04.12.20 13:37) [11]

Антивирус пишет "рекламная программа"? Знакомая фигня )))


manaka ©   (04.12.20 15:30[13]

Было такое.
Компилишь - антивирь удаляет программу.
Отключаешь антивирь.
Компилишь.
Включаешь антивирь.
Запускаешь программу - никакой ругани. То есть, удаляет только на моменте компиляции.
У меня это было на free-версии дельфи. Она видимо пытается в экзешник запихнуть рекламу самое себя. ))))


Inovet ©   (04.12.20 16:16[14]

> [2] ВладОшин ©   (03.12.20 12:27)
> ну может быть..
> Но так менее читабельно, имхо )

Вообще вполне типично, только вот так лучше

if (x<0) s++;
else if (x==0) t++;


Inovet ©   (04.12.20 16:17[15]

> [4] manaka ©   (03.12.20 13:01)
> 5х4=20 - неправильное решение
> 4х5=20 - правильное решение

Это не шутка, увы.


ВладОшин ©   (04.12.20 17:51[16]


> manaka ©   (04.12.20 15:30) [13]

интересно )

но нет, у меня просто рапортует, что "все сделано!" Угроза устранена!
Дебила кусок ))

Просто, как понял, если не сохранять проект куда-то(типа, c:\delphi_prog\), то он в program files пытается компилить. А это важная папка, повышенный ахтунг )


ВладОшин ©   (04.12.20 17:52[17]


> if (x<0) s++;
> else if (x==0) t++;

ну так пишу же - по скорости никакого прибытка получается


Inovet ©   (04.12.20 18:01[18]

> [17] ВладОшин ©   (04.12.20 17:52)

Я про читабельность - это вполне нормально читается, и с сотваными операторами {} тоже. Лучше чем с else на строчку выше. Только не надо форматировать отступами. Короче - типичный шаблон.

if () {
 //
}
else if() {
 //
}
else if() {
 //
}
else {
 //
}


Inovet ©   (04.12.20 18:03[19]

> [16] ВладОшин ©   (04.12.20 17:51)
> но нет, у меня просто рапортует, что "все сделано!" Угроза
> устранена!

Я в исключания добавляю саму студию и всю папку с проектами. А то задалбывают не тем так другим.


ВладОшин ©   (05.12.20 07:51[20]


> Inovet ©   (04.12.20 18:01) [18]

меня все равно в тоску вгоняет )
и знаю, что надо си изучать, и даже требуется иногда по работе, и даже что-то правлю иногда.. но, блин, это как иностранный язык ) А паскаль - как родной, как... носитель языка с носителем языка разговор )
Глаза отдыхают!

и да

manaka
> Давно с++ волнует читабельность?

Хотя и некоторые видят своё прекрасное в этом..
Но я всегда буду против!(с) ))


Внук ©   (05.12.20 17:40[21]


> но, блин, это как иностранный язык

Delphi, C++, C#, Python, с этим жить можно. А вот объявлять, например, приватное поле класса через параметр конструктора не хотите (TypeScript):

class Foo {
   constructor(private bar: string) {}
}

:))


manaka ©   (05.12.20 19:05[22]

В свое время писала на Clipper87, а потом увидела программу на Clipper5. Блиииииин!!! Ну зачем ТАК гадить родной и понятный досовский FoxPro синтаксическими конструкциями с++?


Внук ©   (05.12.20 19:10[23]

А добавим слово static и заменим в описании параметра private на this - и уже получим класс-хелпер, но не на TypeScript, а на С#

static class Foo
{
   public static void Bar(this string bar) {}
}

Так что без контекста сложно воспринимать, пока сообразишь, на каком языке оно.


manaka ©   (05.12.20 19:26[24]

offtop

очень похоже на "новоукраинский" )))

end offtop


manaka ©   (05.12.20 19:43[25]


> public static void Bar(this string bar)

смешно
надо так же в дельфи

var
i (this integer);
s (this string);

:)


картман ©   (16.01.21 15:16[26]

int arr[2] = {0,0};


Картман ©   (16.01.21 15:17[27]


>
> ВладОшин ©   (03.12.20 09:55)
>
> ))
> Дочь кинула вчера - вводят числа, посчитать кол-во меньше
> нуля и =0
>
> Условно она написала (с++, но какая разница.. никакой, вроде)
> while(i++ < 100)
> {
> cin»x;
> if (x<0) s++;
> if (x==0) t++;


int r = 1 << 31;
int arr[2] = {0,0};
while(i++ < 100)
{
cin»x;
arr[(x & r - 1) & 1]++;


Картман ©   (16.01.21 15:19[28]

if (x > 0) continue;


Картман ©   (16.01.21 15:38[29]

int r = 1 << 31;
int arr[3] = {0,0,0};
while(i++ < 100)
{
cin»x;
arr[bool(x & r) + bool(x)]++;


чуть обгоняет c if


Dimka Maslov ©   (16.01.21 16:23[30]

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

long N[100];
for (auto &d : N)
d = RAND_MAX / 2 - rand();

long Counter[3] = { 0 }; // 2 - количество отрицательных чисел, 1 - количество нулей, 0 – количество положительных
for (auto &d : N)
Counter[((d & (1ul << 31)) >> 30) | (unsigned long)(d == 0)]++;


SergP ©   (18.01.21 11:25[31]


> на что препод "кинул страйк"
> Оптимизировать:


А какова цель оптимизации в данном случае?


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо