Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
K&R 5.11 ex 5.7 Обратное польское выражение. Преобразование типов. Алгоритм.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. K&RУпражнение 5-7. Напишите программу ADD, вычисляющую обратное польское выражение из командной строки. Например, ADD 2 3 4 + * вычисляет 2*(3+4). Код написал ещё вчера на листочке. Сегодня проверял, возникло несколько вопросов. Программа не дописана до конца. Ещё разбираюсь. Сам код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. У меня возникли следующие вопросы: 1.1 Не нравится алгоритм. Как бы сделали вы ? 1.2 Не нравится реализация. Как бы сделали вы ? 2.1 Как бы её назвать лучше? 2.2 Существует ли другой алгоритм ? Как бы мне вставить в код значение char, или так лучше не делать ? Но в любом случае, как это сделать ? 2.3 Обратите внимание что в функциях 1 и 2 основная часть кода повторяется, как бы от этого избавить, да и проверка на то какой символ на входе происходит дважды. Мне это не нравится. 2.4 Если на входе int то нужно ли явное преобразование к float ? 3. Час потратил пытаясь понять почему argv+argc-1 не указывает на предпоследний элемент (если посл '\0') ! Почему ? . 4. А вот тут начались проблемы с преобразованием, я понял что прибавляю код числа из ASCII. Читать K&R дальше ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 04:31 |
|
||
|
K&R 5.11 ex 5.7 Обратное польское выражение. Преобразование типов. Алгоритм.
|
|||
|---|---|---|---|
|
#18+
SashaMercury, 1. У вас алгоритм неверный. Вычислить польскую запись можно двумя способами. 1) Слева направо с использованием явного стека. 2) Справа налево с использованием рекурсии. Вы пытались реализовать второй, но без рекурсии. Это не работает. Алгоритм для 1) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Алгоритм для 2) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 3. Код: plaintext 1. 2. Это ересь. Нелья уменьшать argv. Это выход за границы массива (перед началом). Изначально argv указывает на 0-й аргумент, которым является имя программы. Обычно это имя никому не нужно, поэтому чтобы не путаться первым действием можно выполнить Код: plaintext 1. 2. После этого argv будет указывать на реальный первый арг, а argc содержать кол-во арг-ов. Если вы идете с конца массива аргументов то, делайте так Код: plaintext 1. 2. 4. Чтобы из строки char* получить float используйте ф-ю atof() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 05:35 |
|
||
|
K&R 5.11 ex 5.7 Обратное польское выражение. Преобразование типов. Алгоритм.
|
|||
|---|---|---|---|
|
#18+
SashaMercury4. А вот тут начались проблемы с преобразованием, я понял что прибавляю код числа из ASCII. Читать K&R дальше ? Тут почитай про преобразования http://www.sql.ru/forum/1077384/kak-pravilno-privesti-tip-v-funkcii-konvertacii-sistemy-ischisleniya Хотя тебе вполне хватит функции strtol() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 08:14 |
|
||
|
K&R 5.11 ex 5.7 Обратное польское выражение. Преобразование типов. Алгоритм.
|
|||
|---|---|---|---|
|
#18+
оййй. указатель на argv был на конце, тк я выше оставил код для вывода массива аргументов на экран, а в нём argv++ была запись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 09:27 |
|
||
|
K&R 5.11 ex 5.7 Обратное польское выражение. Преобразование типов. Алгоритм.
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. вообще бред написал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 09:31 |
|
||
|
K&R 5.11 ex 5.7 Обратное польское выражение. Преобразование типов. Алгоритм.
|
|||
|---|---|---|---|
|
#18+
Написал ! Алгоритм не переделывал, всё работает вроде-бы. Проверьте пожалуйста. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 09:42 |
|
||
|
K&R 5.11 ex 5.7 Обратное польское выражение. Преобразование типов. Алгоритм.
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky 1. У вас алгоритм неверный. фраза "вроде-бы работает", мне не нравится. Вы имели ввиду что он неоптимальный ? Dima T, спасибо. я про них почитаю конечно, но мне хочется сначала понять как бы я сам написал такую функцию, потому пока не буду читать как они уже работают. В том числе и atof, на выходных буду думать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 09:53 |
|
||
|
K&R 5.11 ex 5.7 Обратное польское выражение. Преобразование типов. Алгоритм.
|
|||
|---|---|---|---|
|
#18+
Только вот так должно быть Код: plaintext 1. 2. 3. 4. 5. 6. не окрашивается код ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 10:04 |
|
||
|
K&R 5.11 ex 5.7 Обратное польское выражение. Преобразование типов. Алгоритм.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryфраза "вроде-бы работает", мне не нравится. Вы имели ввиду что он неоптимальный ? Нет, я имел в виду что он вообще неверный. (Хотя в вашем случае работает, но только потому что числа у вас в примере все слева от операций) А например, попробуйте вычислить вашим алго. такое выражение: 3 4 + 2 * по нашему (3+4)*2 SashaMercuryне окрашивается код ( В теге SRC используйте пару >>> <<< для выделения текста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2014, 14:16 |
|
||
|
K&R 5.11 ex 5.7 Обратное польское выражение. Преобразование типов. Алгоритм.
|
|||
|---|---|---|---|
|
#18+
Согласен, не получится. Но и те алгоритмы выше, не вычислят то выражение что я подаю на вход. Разве нет ? Это просто немного разные задачи. Классический задача, и задача в K&R ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2014, 02:25 |
|
||
|
K&R 5.11 ex 5.7 Обратное польское выражение. Преобразование типов. Алгоритм.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryСогласен, не получится. Но и те алгоритмы выше, не вычислят то выражение что я подаю на вход. Разве нет ? Это просто немного разные задачи. Классический задача, и задача в K&R ?Алгоритмы которые показал Анатолий - вычислят. Реализуй первый (он проще) и сам увидишь. Заодно со стеком разберешься. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2014, 03:38 |
|
||
|
K&R 5.11 ex 5.7 Обратное польское выражение. Преобразование типов. Алгоритм.
|
|||
|---|---|---|---|
|
#18+
White OwlАлгоритмы которые показал Анатолий - вычислят. Реализуй первый (он проще) и сам увидишь. Заодно со стеком разберешься. Уезжаю в конце недели на месяц, приеду, изучу структуры и реализую на стеке. Спасибо. Я писал SS Код: plaintext 1. Справа у меня указатель на указатель, потому слева тип переменной имеет такой тип данных. Но по факту я храню адрес памяти размером в 4 байта. Можно ли объявить какой-нибудь указатель общего вида в этом случае, а при использовании сделать приведение типов ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2014, 09:13 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38574891&tid=2019645]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
64ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 295ms |
| total: | 444ms |

| 0 / 0 |
