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

и задачки для интервью.
User avatar
timson
Уже с Приветом
Posts: 2148
Joined: 27 Jun 2000 09:01
Location: NC->VA........... можно на "ты"

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

Post by timson »

После интервью (С, Oracle or Sybase) прислали 2 задачки. Долго искал подвох, но видимо они правда простые. Ответ я послал. И тишина [img:d833a9cf41]images/smiles/icon_sad.gif[/img:d833a9cf41] Покритикуйте, что не так...

Question #1
Write the following C function (strtrim):

void strtrim(char * str)
{
/*
* strtrim() modifies a string to no longer have
* any leading or trailing whitespace. The string is
* modified in place, and will obviously be the
* same length or shorter.
*/


}

int main(int argc, char * argv[])
{
char * strtest = " Hello World ";

printf("-%s-\n", strtest);
strtrim(strtest);
printf("-%s-\n", strtest);

return 0;
}


$ gcc test.c
$ ./a.out
- Hello World -
-Hello World-

-------Мой ответ №1---------

#include <ctype.h>

void strtrim(char *str)
{
/*
* strtrim() modifies a string to no longer have
* any leading or trailing whitespace. The string is
* modified in place, and will obviously be the
* same length or shorter.
*/

int i = 0, j; /* Local counters */
j = strlen(str) - 1; /* string length */

/* Delete left blanks */
while (isspace(str[i]) && (i <= j))
i++; /*- Count no of leading blanks */

if (i > 0) { /* leading blanks found */
strcpy(str, &str[i]); /*- copy non-blank string to the left */
j -= i;
}

/* Delete right blanks */
while (isspace(str[j]) && (j >= 0))
str[ j-- ] = '\0'; /*- Replace blank with '\0' */
}

int main(int argc, char * argv[])
{

/* This definition code is not correct, for in-place changes */
/* space allocation should be done first. */
/* I replaced it with my declaration */
/* char * strtest = " Hello World "; */


char strtest1[50] = " Hello World with blanks ";
char strtest2[50] = "Hello World without blanks";
char strtest3[50] = " ";

printf("->%s<-\n", strtest1);
strtrim(strtest1);
printf("->%s<-\n\n", strtest1);

printf("->%s<-\n", strtest2);
strtrim(strtest2);
printf("->%s<-\n\n", strtest2);

printf("Just blanks: ->%s<-\n", strtest3);
strtrim(strtest3);
printf("Just blanks: ->%s<-\n\n", strtest3);

return 0;
}

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:d833a9cf41]images/smiles/icon_smile.gif[/img:d833a9cf41]

Solution for Oracle:
select Account, Owed from
( SELECT Account, Owed FROM SQLTable ORDER BY Owed DESC)
WHERE rownum < 4


Solution for MSSQL:
select top 3 Account, Owed from SQLTable ORDER BY Owed DESC


Solution for Sybase:
set rowcount 3
select Account, Owed from SQLTable ORDER BY Owed DESC


Cursor solution for T-SQL:
declare top3_crsr cursor for SELECT Account, Owed FROM SQLTable ORDER BY Owed DESC
set cursor rows 3 for top3_crsr
open top3_crsr
fetch top3_crsr
close top3_crsr
deallocate top3_crsr
Zaphod
Уже с Приветом
Posts: 992
Joined: 06 Feb 2001 10:01
Location: San Jose, USA

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

Post by Zaphod »

Тяжеловато сишное решение, тяжеловато. Изящества нету. Хотя наверное оно решает данную задачу.
User avatar
timson
Уже с Приветом
Posts: 2148
Joined: 27 Jun 2000 09:01
Location: NC->VA........... можно на "ты"

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

Post by timson »

<BLOCKQUOTE><font size="1" face="Arial, Helvetica, sans-serif">quote:</font><HR>Originally posted by Zaphod:
[b:86ea9888f6]Тяжеловато сишное решение, тяжеловато. Изящества нету. Хотя наверное оно решает данную задачу.[/b:86ea9888f6]<HR></BLOCKQUOTE>

Интересно... Может, правда есть какой-то более изящный подход? Просто интересно, уже 2 дня думаю [img:86ea9888f6]images/smiles/icon_smile.gif[/img:86ea9888f6]

А то, что объявляют
char * strtest = " Hello World ";
и просят сделать In Place - это прикол что ли такой, как думаете? Или во мне что-то не так: [img:86ea9888f6]images/smiles/icon_smile.gif[/img:86ea9888f6]
Zaphod
Уже с Приветом
Posts: 992
Joined: 06 Feb 2001 10:01
Location: San Jose, USA

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

Post by Zaphod »

<BLOCKQUOTE><font size="1" face="Arial, Helvetica, sans-serif">quote:</font><HR>Originally posted by timson:
[b:2398275f81]Интересно... Может, правда есть какой-то более изящный подход? Просто интересно, уже 2 дня думаю [img:2398275f81]images/smiles/icon_smile.gif[/img:2398275f81]

А то, что объявляют
char * strtest = " Hello World ";
и просят сделать In Place - это прикол что ли такой, как думаете? Или во мне что-то не так: [img:2398275f81]images/smiles/icon_smile.gif[/img:2398275f81][/b:2398275f81]<HR></BLOCKQUOTE>

Что-то я боюсь, что это не прикол, а по некоторому невежеству. Да бог с ним, можно поправить. main - не ваш код. [img:2398275f81]images/smiles/icon_smile.gif[/img:2398275f81]

Подход у Вас нормальный, просто в коде нет изящества.

char* stripped = string;

while (isspace(*stripped) && *stripped++);

int length = strlen(stripped);

while (length > 0 && isspace(stripped[--length]);

strncpy(stripped, string, length);
string[length] = '\0';

/* Давно на си не писал, мог где-то и ошибиться */
[Безденежный Дон]
Уже с Приветом
Posts: 857
Joined: 09 Jan 2001 10:01
Location: LA, CA, USA

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

Post by [Безденежный Дон] »

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by Zaphod:
[b:82042f65c5]Что-то я боюсь, что это не прикол, а по некоторому невежеству. Да бог с ним, можно поправить. main - не ваш код. [img:82042f65c5]images/smiles/icon_smile.gif[/img:82042f65c5]

Подход у Вас нормальный, просто в коде нет изящества.

char* stripped = string;

while (isspace(*stripped) && *stripped++);

int length = strlen(stripped);

while (length > 0 && isspace(stripped[--length]);

strncpy(stripped, string, length);
string[length] = '\0';

/* Давно на си не писал, мог где-то и ошибиться */[/b:82042f65c5]<HR></BLOCKQUOTE>

"Взад" тоже хорошо бы черз char*. Ну и результирующую длину строки проверить не худо бы.
P.S. Честно говоря - загадка - чего они проверить-то хотели етим тестом?

[ 20-03-2001: Message edited by: [Безденежный Дон] ]
omnibee
Уже с Приветом
Posts: 120
Joined: 15 Mar 2001 10:01
Location: Belgium

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

Post by omnibee »

Решение неправильное. Нельзя пользоваться strcpy для сдвига строки. Также в main() никаких проблем не было, не надо было ее трогать. Вот правильное решение:

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><HR><pre>

void strtrim(char *str)
{
char *ptr, *end;
int len;
ptr = str;
while ( isspace(*ptr) ) ptr++;
end = strchr(ptr, 0);
while ( end > ptr && isspace(end[-1] )
end--;
len = end - ptr;
memmove(str, ptr, len);
str[len] = '\0';
}

</pre><HR></BLOCKQUOTE>
8K
Уже с Приветом
Posts: 5540
Joined: 20 Mar 2001 10:01
Location: SFBA

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

Post by 8K »

Поддерживаю насчет memmove(), но идея использовать отрицательное смещение вызвала некоторое недоумение. Кстати, зачем нужна эта эквилибристика с указателем для движения назад? Длина работала удовлетворительно и смотрелась понятнее.

Проблема в main() вполне конкретная (компилятор мог бы разместить строку в readonly memory, не C++ ведь), но это оставим на совести авторов задачки.

P.S. Испытываю отвращение к коду с плохой "индентацией".
8K
Уже с Приветом
Posts: 5540
Joined: 20 Mar 2001 10:01
Location: SFBA

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

Post by 8K »

Добавлю еще пару слов по поводу оригинального решения (С-задача).

Комментарии должны использоваться со смыслом и, как минимум, не противоречить коду программы:

1) Переменная j в strtrim() не содержит длину строки - комментарий неверный и вводит в заблуждение тех, кто потом будет этот код сопровождать. Тем более, что комментарии такого сорта вообще не нужны и только захламляют текст. Все знают, что strlen() возвращает длину C-строки.

2) "Delete left blanks" - на самом деле не удаляются, а пропускаются, причем не пробелы, а whitespace (т.е. в том числе переводы строки, табуляции и иже с ними, включая UNICODE, а также locale-specific вариации).

Замечу, что &str[i] - это довольно сильно сказано, проще надо быть.

Далее, в новой версии main() неправильно отводится память под тестовые строки. Надо использовать [], а не фиксированный размер [50].

Авторы примера использовали дефис как ограничитель и я не вижу смысла менять его на что-либо новое (вроде стрелок влево/вправо). Не надо усложнять задачу тем, кто будет проверять ваше решение.

Общее впечатление от решения - крайне неряшливая работа. Дело даже не в отсутствии изящества - оно практически недостижимо в реальной работе над проектом.

Не думаю, что timson писал на C что-либо серьезное.
omnibee
Уже с Приветом
Posts: 120
Joined: 15 Mar 2001 10:01
Location: Belgium

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

Post by omnibee »

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by 8K:
[i:a98e2124e5]Поддерживаю насчет memmove(), но идея использовать отрицательное смещение вызвала некоторое недоумение. Кстати, зачем нужна эта эквилибристика с указателем для движения назад? Длина работала удовлетворительно и смотрелась понятнее. [/i:a98e2124e5]

<HR></BLOCKQUOTE>


На вкус и цвет. Отрицательных смещений там нет.

[i:a98e2124e5]
P.S. Испытываю отвращение к коду с плохой "индентацией".[/i:a98e2124e5]

Я тоже.
8K
Уже с Приветом
Posts: 5540
Joined: 20 Mar 2001 10:01
Location: SFBA

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

Post by 8K »

Я не слишком большой знаток SQL, но несколько идей все же есть.

В SQL-задаче фишка могла быть в том, что имя одной из колонок содержит пробел (и оба имени содержат как прописные, так и строчные буквы). Надо использовать кавычки. Вы создали таблицу и выполнили ваш оператор, чтобы проверить решение? Если же имена колонок не совпадают с "Account" и "Amount Owed", то нужно использовать алиасы. Ваши результаты должны совпасть, включая не только данные, но и заголовок. Хотя, конечно, кто его знает, "что им надо". Тут не хочется до фанатизма доходить.

Кстати, не пробовали написать пример, который будет работать независимо от типа базы данных (ORACLE, MS SQL, DB2)?

Снова обращу внимание на неряшливость кода. Если вы пишете ключевые слова прописными буквами - делайте это всегда, если строчными - тоже будьте последовательны (и в этом случае будьте готовы к проблемам, строчные буквы работают не везде).
8K
Уже с Приветом
Posts: 5540
Joined: 20 Mar 2001 10:01
Location: SFBA

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

Post by 8K »

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by omnibee:
[i:8a28bb7a32]
<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:8a28bb7a32]<HR></BLOCKQUOTE>

Не переведена строчка в первом while, и отрицательно смещение (минус один) во втором. Могло бы неправильно работать в сегментной архитектуре при определенных ключах компиляции. Хотя сейчас, наверное, уже везде память плоская. Но тем не менее...
User avatar
timson
Уже с Приветом
Posts: 2148
Joined: 27 Jun 2000 09:01
Location: NC->VA........... можно на "ты"

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

Post by timson »

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><HR><pre>

void strtrim(char *str)
{
char *ptr, *end;
int len;
ptr = str;
while ( isspace(*ptr) ) ptr++;
end = strchr(ptr, 0);
while ( end > ptr && isspace(end[-1] )
end--;
len = end - ptr;
memmove(str, ptr, len);
str[len] = '\0';
}

</pre><HR></BLOCKQUOTE>
Ну такого безобразия и хакерства я себе и представить не мог [img:130060bdb0]images/smiles/icon_smile.gif[/img:130060bdb0] А по существу - на моем Линуксе такое скомпилировалось (с неряшливыми warning-ами), но не запустилось:

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><HR><pre>
bash-2.03$ cc strtrim2.c
strtrim2.c: In function `strtrim':
strtrim2.c:15: warning: assignment makes pointer from integer without a cast
bash-2.03$ ./a.out
-> Hello World with blanks <-
Bus error (core dumped)
bash-2.03$
</pre><HR></BLOCKQUOTE>

На какой платформе это проходит, интересно???

[ 21-03-2001: Message edited by: timson ]
User avatar
timson
Уже с Приветом
Posts: 2148
Joined: 27 Jun 2000 09:01
Location: NC->VA........... можно на "ты"

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

Post by timson »

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by 8K:
Комментарии должны использоваться со смыслом и, как минимум, не противоречить коду программы:

1) Переменная j в strtrim() не содержит длину строки - комментарий неверный и вводит в заблуждение тех, кто потом будет этот код сопровождать. Тем более, что комментарии такого сорта вообще не нужны и только захламляют текст. Все знают, что strlen() возвращает длину C-строки.
<HR></BLOCKQUOTE>
Согласен полностью, это моя оплошность, которая никак не влияет на поведение программы, замечу.

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by 8K:
2) "Delete left blanks" - на самом деле не удаляются, а пропускаются, причем не пробелы, а whitespace (т.е. в том числе переводы строки, табуляции и иже с ними, включая UNICODE, а также locale-specific вариации).

Замечу, что &str[i] - это довольно сильно сказано, проще надо быть.

Далее, в новой версии main() неправильно отводится память под тестовые строки. Надо использовать [], а не фиксированный размер [50].

Авторы примера использовали дефис как ограничитель и я не вижу смысла менять его на что-либо новое (вроде стрелок влево/вправо). Не надо усложнять задачу тем, кто будет проверять ваше решение.
<HR></BLOCKQUOTE>
Да, но существа дела по-моему не меняет [img:af1a5635e1]images/smiles/icon_smile.gif[/img:af1a5635e1] Ну... придирки же, а?

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by 8K:
Общее впечатление от решения - крайне неряшливая работа. Дело даже не в отсутствии изящества - оно практически недостижимо в реальной работе над проектом.
<HR></BLOCKQUOTE>
1) Все отступы, какие надо, были в оригинале, но к сожалению, потерялись при переносе сюда.
2) Все надо было делать очень быстро.

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by 8K:
Не думаю, что timson писал на C что-либо серьезное.
<HR></BLOCKQUOTE>
Хм... А можете дать ваше определение "серьезного"? Тогда я смогу как-то на это ответить [img:af1a5635e1]images/smiles/icon_smile.gif[/img:af1a5635e1] Может и правда, стоит задуматься о жизни по-серьезному [img:af1a5635e1]images/smiles/icon_rolleyes.gif[/img:af1a5635e1]
User avatar
timson
Уже с Приветом
Posts: 2148
Joined: 27 Jun 2000 09:01
Location: NC->VA........... можно на "ты"

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

Post by timson »

<BLOCKQUOTE><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><HR>Originally posted by 8K:
Я не слишком большой знаток SQL, но несколько идей все же есть.

В SQL-задаче фишка могла быть в том, что имя одной из колонок содержит пробел (и оба имени содержат как прописные, так и строчные буквы). Надо использовать кавычки. Вы создали таблицу и выполнили ваш оператор, чтобы проверить решение? Если же имена колонок не совпадают с "Account" и "Amount Owed", то нужно использовать алиасы. Ваши результаты должны совпасть, включая не только данные, но и заголовок. Хотя, конечно, кто его знает, "что им надо". Тут не хочется до фанатизма доходить.

Кстати, не пробовали написать пример, который будет работать независимо от типа базы данных (ORACLE, MS SQL, DB2)?

Снова обращу внимание на неряшливость кода. Если вы пишете ключевые слова прописными буквами - делайте это всегда, если строчными - тоже будьте последовательны (и в этом случае будьте готовы к проблемам, строчные буквы работают не везде).[/I]<HR></BLOCKQUOTE>

Спасибо за замечания (про неряшливость как ни прискорбно, тоже принимается [img:43fe3dbf91]images/smiles/icon_smile.gif[/img:43fe3dbf91].
Делалось все under pressure, времени все разукрашивать не было (хотя прежде чем сюда вешать, я должен был подумать, что все именно на это и обратят внимание. И под рукой не было базы данных - проверить. Все это только по-памяти. Опять же - по-моему код правильный.

Теперь про standard SQL. Конечно думал. И идеи есть. Но проверить негде, боюсь ошибиться [img:43fe3dbf91]images/smiles/icon_smile.gif[/img:43fe3dbf91]

Вот, точно, SQL-гуру - подскажите, пожалуйста, как сделать?

[ 21-03-2001: Message edited by: timson ]
8K
Уже с Приветом
Posts: 5540
Joined: 20 Mar 2001 10:01
Location: SFBA

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

Post by 8K »

(Убивает меня это малюсенькое окошко для ввода текста. Не могу нормально цитировать).

Timson, просьба была - покритиковать, что не так. Именно это я и делаю. НЕ придираюсь, а говорю по существу. У меня нет такого императива разбирать по косточкам код своих коллег по работе (ну, или чей-то еще код), однако, если они спрашивают совета - я, как пионер, "всегда готов". Конечно, если вижу плохой код, который мне приходится исправлять - ругаюсь, но чисто абстрактно. Одних уж нет, а те далече.

Но ближе к телу...

Программа состоит не только из собственно кода. Не последнюю роль играют комментарии и оформление того самого кода. Написать программу не сложно, сложно ее поддерживать в работоспособном состоянии спустя месяц, два, год. Даже автору.

По сути, задачка на C была призвана проверить вас на знание C-runtime библиотеки (отличие memcpy от memmove). Но если смотреть на дело шире, любая такая короткая задачка показывает, насколько серьезно человек относится к программированию вообще. Это позволяет довольно быстро составить мнение о квалификации человека, причем практически безошибочно. Я думаю, вы согласитесь, что по количеству брызг можно отличить опытного пловца от начинающего.

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

Насчет "серьезных проектов" - это не был наезд.

Под серьезным проектом я понимаю команду из нескольких десятков программистов, работающих над продуктом и сопровождающих его в течение длительного времени (несколько лет). Сам продукт должен состоять из нескольких компонент, компоненты от нескольких десятков тысяч строк.

Я верю, что если долго плавать (бегать) на длинные дистанции, то вырабатывается умение правильно - т.е. экономно - грести (дышать). Соответственно, если человек поднимает много брызг, "неряшливо" плывет, я не считаю его находящимся в этом бизнесе достаточное количество времени.

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

strtrim() в версии omnibee содержит синтаксическую ошибку (описка, естественно) - так что я не вполне понимаю, как линух ее скомпилировал. Будем считать, что вы подредактировали. Warning почти наверняка означает, что вы не подключили соответствующие .h файлы. По умолчанию, если нет прототипа, С-функция (в нашем случае это strchr) считается возвращающей int.
8K
Уже с Приветом
Posts: 5540
Joined: 20 Mar 2001 10:01
Location: SFBA

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

Post by 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
Уже с Приветом
Posts: 120
Joined: 15 Mar 2001 10:01
Location: Belgium

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

Post by 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
Уже с Приветом
Posts: 5540
Joined: 20 Mar 2001 10:01
Location: SFBA

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

Post by 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
Уже с Приветом
Posts: 5540
Joined: 20 Mar 2001 10:01
Location: SFBA

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

Post by 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
Уже с Приветом
Posts: 120
Joined: 15 Mar 2001 10:01
Location: Belgium

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

Post by 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
Уже с Приветом
Posts: 5540
Joined: 20 Mar 2001 10:01
Location: SFBA

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

Post by 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-модели, то проблемы нет. Там и вычитание производится корректно.
User avatar
timson
Уже с Приветом
Posts: 2148
Joined: 27 Jun 2000 09:01
Location: NC->VA........... можно на "ты"

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

Post by 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 интервью.
User avatar
timson
Уже с Приветом
Posts: 2148
Joined: 27 Jun 2000 09:01
Location: NC->VA........... можно на "ты"

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

Post by timson »

To 8K:

Перечитал все еще раз. Большое спасибо, правда. Подробный и по делу разбор полетов.
omnibee
Уже с Приветом
Posts: 120
Joined: 15 Mar 2001 10:01
Location: Belgium

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

Post by 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
Уже с Приветом
Posts: 992
Joined: 06 Feb 2001 10:01
Location: San Jose, USA

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

Post by 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 из Борланда такую дешевую глупость сделать не могли, чтобы сишные правила работы с пойнтерами нарушать.

Вот с применением виртуальных деструкторов к стековым объектам могли ошибиться - да кто угодно может!

Return to “Головоломки”