![]() |
![]() ![]() ![]() | |
|
Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|| Форумы Здесь вы можете задать свой вопрос и наверняка получите ответ |
ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
| ||
![]() | ||
|
Чтобы не потерять эту дискуссию, сделайте закладку
« предыдущая ветвь | форум | следующая ветвь »
Неожиданная задачка на сайте программистов про.. программирование
ВладОшин © (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]
> на что препод "кинул страйк"
> Оптимизировать:
А какова цель оптимизации в данном случае?
Разрешается использование тегов форматирования текста:
версия для печати
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)
|
![]() ![]() ![]() |