Задачки для 1 класса

и задачки для интервью.
8K
Уже с Приветом
Сообщения: 5552
Зарегистрирован: Вт мар 20, 2001 4:01 am
Откуда: SFBA

Задачки для 1 класса

Сообщение 8K »

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by timson:
[i:cefc4d3516]Делалось все under pressure, времени все разукрашивать не было
[/i:cefc4d3516]<HR></BLOCKQUOTE>

Ну я про это и говорю. Если вы привыкли писать аккуратно, вы уже не можете писать неряшливо. Оно автоматически получается.

А работать приходится почти всегда under pressure. Так что это не оправдание.
omnibee
Уже с Приветом
Сообщения: 120
Зарегистрирован: Чт мар 15, 2001 4:01 am
Откуда: Belgium

Задачки для 1 класса

Сообщение omnibee »

Originally posted by timson:
[i:6932e4a5f0]
Ну такого безобразия и хакерства я себе и представить не мог [img:6932e4a5f0]images/smiles/icon_smile.gif[/img:6932e4a5f0] А по существу - на моем Линуксе такое скомпилировалось (с неряшливыми warning-ами), но не запустилось:
[/i:6932e4a5f0]

Так это, все-таки gcc кладет текстовый строки в read-only segment, так что функцю main() надо переписать на char str[] вместо char *str. Тогда заработает. А насчет warningов - не знаю, у меня ни одного ворнинга нет (да и не может их там быть, т.к. все написано по стандарту, ну кроме одной закрывющей скобки, но она вызывает ошибку).. Может ты неправильно вбил код, проверь!

[img:6932e4a5f0]images/smiles/icon_biggrin.gif[/img:6932e4a5f0] [img:6932e4a5f0]images/smiles/icon_biggrin.gif[/img:6932e4a5f0]
8K
Уже с Приветом
Сообщения: 5552
Зарегистрирован: Вт мар 20, 2001 4:01 am
Откуда: SFBA

Задачки для 1 класса

Сообщение 8K »

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by omnibee:

[i:d461c1e446] Могло бы неправильно работать в сегментной архитектуре при определенных ключах компиляции. Хотя сейчас, наверное, уже везде память плоская. Но тем не менее...[/i:d461c1e446]

Нет, работает правильно везде по стандарту.
Выражение x[-1] равносильно *(x-1), а из указателя единицу вычитать можно после проверки на то, что он больше чем указатель, указывающий на тот же массив.

Не желания пользваться средствами языка из-за неполного их знания не есть плюс.[/I]<HR></BLOCKQUOTE>

Ну, будем сейчас пузами меряться...

Я не вполне понял насчет неполного знания языка, я с 89-го или 90-го года на С сижу. А вообще программировать начал году так в 80-м.

Это факт, что язык из стандарта не вполне совпадает с конкретной реализацией. Поэтому код бывает портабельный, а бывает и нет.

Хотелось бы проехаться насчет неполного знания компиляторов под MS-DOS, но под рукой нет ни одного из них, так что зуб не отдам - в одной из моделей памяти вычитание происходило только из регистра смещения, а база не трогалась. Таким образом, двигаясь влево, после нуля мы перескакивали сразу на 64К вправо. При присваивании указатель нормализовался так, чтобы регистр смещения был нулевым (точнее, не совсем нулевым, а чтобы база была на границе параграфа). Но зуб все равно не дам! Точно знают только товарищи из МС и Борланда.
8K
Уже с Приветом
Сообщения: 5552
Зарегистрирован: Вт мар 20, 2001 4:01 am
Откуда: SFBA

Задачки для 1 класса

Сообщение 8K »

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by timson:
[i:309988fb23]Кстати, сегодня они откликнулись, будет face-to-face интервью.[/i:309988fb23]<HR></BLOCKQUOTE>

Ну, удачи вам! На интервью старайтесь внимательно слушать, что вам говорят, не упускать деталей.

Не делайте больше, чем просят, не напрягайте их. Решайте в точности ту задачу, что задают, без отсебятины. Беда многих русских программистов не в том, что они слишком много знают, а в том, что они пытаются все это выдать в один присест на несчастного менеджера.

Если хотите показать альтернативный способ решения, спросите - а хотят ли они его увидеть. Обычно, впрочем, на интервью они сами предлагают, "а как бы вы соптимизировали по памяти...", "а по скорости...", "а в чем достоинство именно такого решения...", "а в чем его слабость...".
omnibee
Уже с Приветом
Сообщения: 120
Зарегистрирован: Чт мар 15, 2001 4:01 am
Откуда: Belgium

Задачки для 1 класса

Сообщение omnibee »

Originally posted by 8K:
[i:dd4b5145c8]
Я не вполне понял насчет неполного знания языка, я с 89-го или 90-го года на С сижу. А вообще программировать начал году так в 80-м.
[/i:dd4b5145c8]

Так это ни о чем не говорит [img:dd4b5145c8]images/smiles/icon_smile.gif[/img:dd4b5145c8]
Из указателей можно вычитать целые числа, так что отрицательный индекс никто не запрещал.

[i:dd4b5145c8]
Это факт, что язык из стандарта не вполне совпадает с конкретной реализацией. Поэтому код бывает портабельный, а бывает и нет.
[/i:dd4b5145c8]

Тот, что я написал - портабельный. Придется хорошенько поискать, чтобы найти коимерческий компилятор, который неправильно странслирует этот код.

[i:dd4b5145c8]
Хотелось бы проехаться насчет неполного знания компиляторов под MS-DOS, но под рукой нет ни одного из них, так что зуб не отдам - в одной из моделей памяти вычитание происходило только из регистра смещения, а база не трогалась. Таким образом, двигаясь влево, после нуля мы перескакивали сразу на 64К вправо. При присваивании указатель нормализовался так, чтобы регистр смещения был нулевым (точнее, не совсем нулевым, а чтобы база была на границе параграфа). Но зуб все равно не дам! Точно знают только товарищи из МС и Борланда.[/i:dd4b5145c8]

Я могу дать зуб. Так оно и было (почти [img:dd4b5145c8]images/smiles/icon_smile.gif[/img:dd4b5145c8], все компиляторы так делали, если модель = large.
Только при присваивании никаких нормализаций не делалось, для этого надо было (huge*) написать.

Но к моему коду это отношения не имеет. Я не перехожу ноль.
8K
Уже с Приветом
Сообщения: 5552
Зарегистрирован: Вт мар 20, 2001 4:01 am
Откуда: SFBA

Задачки для 1 класса

Сообщение 8K »

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by omnibee:
[i:1ae114360c]
Я могу дать зуб. Так оно и было (почти [img:1ae114360c]images/smiles/icon_smile.gif[/img:1ae114360c], все компиляторы так делали, если модель = large.
Только при присваивании никаких нормализаций не делалось, для этого надо было (huge*) написать.

Но к моему коду это отношения не имеет. Я не перехожу ноль.[/i:1ae114360c]<HR></BLOCKQUOTE>

OK, мир. Я был неправ. Если нормализация при присваивании происходит только в huge-модели, то проблемы нет. Там и вычитание производится корректно.
Аватара пользователя
timson
Уже с Приветом
Сообщения: 2148
Зарегистрирован: Вт июн 27, 2000 4:01 am
Откуда: NC->VA........... можно на "ты"

Задачки для 1 класса

Сообщение timson »

Конечно, ничего личного [img:ab52694ac5]images/smiles/icon_smile.gif[/img:ab52694ac5] Мы ж не в песочнице. Замечания принял с благодарностью. Правильно, сам просил.

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by 8K:
[i:ab52694ac5]
strtrim() в версии omnibee содержит синтаксическую ошибку (описка, естественно) - так что я не вполне понимаю, как линух ее скомпилировал. Будем считать, что вы подредактировали. Warning почти наверняка означает, что вы не подключили соответствующие .h файлы. По умолчанию, если нет прототипа, С-функция (в нашем случае это strchr) считается возвращающей int.[/i:ab52694ac5]<HR></BLOCKQUOTE>

Теперь по существу.

Да, конечно подредактировал.
Угу, правильно, варнинг я уже сам понял отчего.
Но работать это все равно не будет, если объявить

char * strtest = " Hello World ";

Или?

Кстати, сегодня они откликнулись, будет face-to-face интервью.
Аватара пользователя
timson
Уже с Приветом
Сообщения: 2148
Зарегистрирован: Вт июн 27, 2000 4:01 am
Откуда: NC->VA........... можно на "ты"

Задачки для 1 класса

Сообщение timson »

To 8K:

Перечитал все еще раз. Большое спасибо, правда. Подробный и по делу разбор полетов.
omnibee
Уже с Приветом
Сообщения: 120
Зарегистрирован: Чт мар 15, 2001 4:01 am
Откуда: Belgium

Задачки для 1 класса

Сообщение omnibee »

Originally posted by 8K:
[i:79c9e8c548]<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><HR><pre>

void strtrim(char *str)
{
...
while ( isspace(*ptr) ) ptr++;
...
while ( end > ptr && isspace(end[-1] )
end--;
...
}

</pre><HR></BLOCKQUOTE>[/i:79c9e8c548]<HR></BLOCKQUOTE>

Не переведена строчка в первом while,
[/i]

Так сделано специально. Незачем тратить строку и портить текст мелким циклом.
Я уже сказал, что это - дело вкуса и стиля.

[i:79c9e8c548]
и отрицательно смещение (минус один) во втором.
[/i:79c9e8c548]

Это не смещение, а индекс.

[i:79c9e8c548] Могло бы неправильно работать в сегментной архитектуре при определенных ключах компиляции. Хотя сейчас, наверное, уже везде память плоская. Но тем не менее...[/i:79c9e8c548]

Нет, работает правильно везде по стандарту.
Выражение x[-1] равносильно *(x-1), а из указателя единицу вычитать можно после проверки на то, что он больше чем указатель, указывающий на тот же массив.

Не желания пользваться средствами языка из-за неполного их знания не есть плюс.
Zaphod
Уже с Приветом
Сообщения: 992
Зарегистрирован: Вт фев 06, 2001 4:01 am
Откуда: San Jose, USA

Задачки для 1 класса

Сообщение Zaphod »

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by 8K:
[i:44e1fd0d87]Хотелось бы проехаться насчет неполного знания компиляторов под MS-DOS, но под рукой нет ни одного из них, так что зуб не отдам - в одной из моделей памяти вычитание происходило только из регистра смещения, а база не трогалась. Таким образом, двигаясь влево, после нуля мы перескакивали сразу на 64К вправо. При присваивании указатель нормализовался так, чтобы регистр смещения был нулевым (точнее, не совсем нулевым, а чтобы база была на границе параграфа). Но зуб все равно не дам! Точно знают только товарищи из МС и Борланда.[/i:44e1fd0d87]<HR></BLOCKQUOTE>

Не шутите так. Ни товарищи из МС, ни господа из Ваткома, ни dudes из Борланда такую дешевую глупость сделать не могли, чтобы сишные правила работы с пойнтерами нарушать.

Вот с применением виртуальных деструкторов к стековым объектам могли ошибиться - да кто угодно может!
gab
Уже с Приветом
Сообщения: 491
Зарегистрирован: Вт окт 31, 2000 4:01 am
Откуда: Москва.su->Bs.As.ar->SP.br->Bs.As.ar->dallas.us

Задачки для 1 класса

Сообщение gab »

Для тех кто не понял:
gcc начиная (если не ошибаюсь) с версии 2.8.0
память выделяему компилятором для констант , определяет как read only. Любая попытка изменения - приведет к segmentation fault.
Поэтому, задача поставлена некорректно .

У компилятора есть ключ для отключения этого - читай документацию .
3D_Killer
Новичок
Сообщения: 35
Зарегистрирован: Сб июл 29, 2000 4:01 am
Откуда: UZ->Andizhan, RU->Kazan, CZ->Prague
Контактная информация:

Задачки для 1 класса

Сообщение 3D_Killer »

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by timson:
[i:bc674bccf0]Question #2
We have a SQL table that shows how much money people owe:

Account Amount Owed
------- -----------
...
4532 $21.95
4533 $22.95
4534 $22.95
4535 $10.00
4536 $ 8.00
4537 $11.50
...

Write a query that shows the three accounts that owe us the most money:
(sample output)
Account Amount Owed
------- -----------
4533 $22.95
4534 $22.95
4532 $21.95

-------Мой ответ №2---------
Тут беда в том, что я так и не понял, кто им нужен - Ораклист или Sybase-овец. На всякий случай написал все, что вспомнил [img:bc674bccf0]images/smiles/icon_smile.gif[/img:bc674bccf0]

Solution for Oracle:
select Account, Owed from
( SELECT Account, Owed FROM SQLTable ORDER BY Owed DESC)
WHERE rownum < 4
[/i:bc674bccf0]<HR></BLOCKQUOTE>
тоже в голову не приходит ничего кроме как поставить уловие WHERE ROWNUM < 4 (в Oracle). А можно такое "толстое" решение [img:bc674bccf0]images/smiles/icon_wink.gif[/img:bc674bccf0]
SELECT account, owed FROM sqltable WHERE owed >=
(SELECT MAX(owed) FROM sqltable WHERE owed <
(SELECT MAX(owed) FROM sqltable WHERE owed <
(SELECT MAX(owed) FROM sqltable)))
ORDER BY owed DESC;

Удачи.
8K
Уже с Приветом
Сообщения: 5552
Зарегистрирован: Вт мар 20, 2001 4:01 am
Откуда: SFBA

Задачки для 1 класса

Сообщение 8K »

Ну нельзя же так задачки решать, еще в школе учили - в конце решения делается проверка. Потому что и на старуху бывает проруха.

Специально ведь в примере были два совпадающих значения (причем они больше остальных).
Ответить

Вернуться в «Головоломки»