![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
RathaR |
![]()
Сообщение
#1
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 346 Пол: Мужской Реальное имя: Иван Репутация: ![]() ![]() ![]() |
Вот решил написать прогу "калькулятор".
Вчера ночью еще написал функции на "+" и "-", проверил, всё работало железобетонно, но то что писал не сохранилось ![]() Начал сегодня писать, вроде написал снова на + и -, плюс работает, но с минусом возникла какаято проблема которую я просто немогу осознать ![]() Вот код:
помогите найти ошибку в функции Raznica ![]() и еще... я когда запускаю программу прямо с Fpc 2.2.2. то сначала всё что на екране пишет иероглифами, а после первого нажатия - нормально, а после последнего нажатия, когда должно вывести результат, выводит результат и снова всё слова становятся иероглифами, причом происходит это только в полноекранном режиме, если в окне всё норм, и когда запускаю програму с ексешника, в окне, тоже всё норм И вообще был бы рад выслушать замечания какие есть, как было бы лучше организовать программу... Сообщение отредактировано: RathaR - 25.07.2009 16:31 -------------------- Считающий себя единственым здравомыслящим человеком сумасшедший? Если да, возможно я псих...
Пусть умолкнет всякий критик! Я - системный аналитик! |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата помогите найти ошибку в функции Raznica Как минимум - нужноЦитата If (ORD(S1[I])-48-ORD(S2[I])-48-sub)<0 then begin If ((ORD(S1[I])-48)-(ORD(S2[I])-48)-sub)<0 then beginЕсли теперь открыть скобки, то увидишь, что перед вторым числом 48 будет плюс, а не минус, как у тебя... Но я бы оставил именно в скобках. Цитата И вообще был бы рад выслушать замечания какие есть, как было бы лучше организовать программу... Программу надо для начала нормально отформатировать, чтобы ее можно было читать. То, что ты привел - нечитаемо абсолютно. Где отступы? Зачем пустые строки? Зачем оформление, перемешанное с логикой? Сначала отладь логику, потом добавляй "рюшечки". |
RathaR |
![]()
Сообщение
#3
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 346 Пол: Мужской Реальное имя: Иван Репутация: ![]() ![]() ![]() |
Как минимум - нужно заменить на более правильный вариант: If ((ORD(S1[I])-48)-(ORD(S2[I])-48)-sub)<0 then beginЕсли теперь открыть скобки, то увидишь, что перед вторым числом 48 будет плюс, а не минус, как у тебя... Но я бы оставил именно в скобках. действительно ![]() Программу надо для начала нормально отформатировать, чтобы ее можно было читать. То, что ты привел - нечитаемо абсолютно. Где отступы? Зачем пустые строки? Зачем оформление, перемешанное с логикой? Сначала отладь логику, потом добавляй "рюшечки". пустые строки ставлю когда во FPC работаю... без них мне текст кажется слишком слитным... ну, плохие привычки еще практика исправит ![]() И возник еще один вопрос, на этот раз по поводу умножения... Я думаю следующим образом: в функцию Proizvedenie передаю две строки - числа, функция записывает их следующим образом: 0125 0025 затем вызываеться функция Syma которая находит сумму 5кратного сумирования большего числа, и результат записываеться в первый елемент масива М, далее функция Syma находит результат 2кратного сумирования числа 125, и записывает его во второй елемент масива М, и тд по розрядам, а после этого к каждому елементу масива М дописываеться еше (І-1) ноль, где І - номер елемента масива М. А потом все елементы сумируються всё той же функцией. Но в реализации допустил ошибки, ибо функция Proizvedenie просто вылитает вот эта функция: Function Proizvedenie(A,B:string):string; а эта функция генерирует нужное кол-во нулей которые надо добавить: function O_gen(K:integer):string; просидел довольно долго, но полного успеха над умножением так и не удалось добиться... Сообщение отредактировано: RathaR - 25.07.2009 22:02 -------------------- Считающий себя единственым здравомыслящим человеком сумасшедший? Если да, возможно я псих...
Пусть умолкнет всякий критик! Я - системный аналитик! |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата Но в реализации допустил ошибки, ибо функция Proizvedenie просто вылитает Во-первых:function O_gen(K:integer):string;, иначе у тебя получается что-то типа рекурсии. Не надо делать непереносимые вещи. А во-вторых, что, тебе FPC не сообщает, почему программа вылетает? Мне, например, сообщает: ![]() строка №166 выделена. Беглый просмотр дает ответ: при N = 0 - вылет за нижнюю границу массива. Отладчик для кого? Добавлено через 2 мин. P.S. Если ты думаешь, что тот цикл, в котором находится выделенная строка, отформатирован правильно - ты ошибаешься. Отформатируй, пока не поздно, как положено. Иначе будут проблемы... |
RathaR |
![]()
Сообщение
#5
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 346 Пол: Мужской Реальное имя: Иван Репутация: ![]() ![]() ![]() |
Доделал программу, всё работает
![]() volvo большое спасиба за помощь ![]() -------------------- Считающий себя единственым здравомыслящим человеком сумасшедший? Если да, возможно я псих...
Пусть умолкнет всякий критик! Я - системный аналитик! |
RathaR |
![]()
Сообщение
#6
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 346 Пол: Мужской Реальное имя: Иван Репутация: ![]() ![]() ![]() |
И снова я со всё темеже проблемами, на этот раз там где не ожидал...
Упорно отказываеться работать функция Factorial. function Factorial(A:string):string; Беглый просмотр показал что Fact:=Proizvedenie(Fact,K); считает неправильно,(1*2=3)хотя функция Proizvedenie сама по себе работает правильно. Пробовал и F:=Proizvedenie(Fact,K); Fact:=F; K:=Suma(K,'1'); Где ошибка ума не приложу ![]() Сообщение отредактировано: RathaR - 26.07.2009 20:07 -------------------- Считающий себя единственым здравомыслящим человеком сумасшедший? Если да, возможно я псих...
Пусть умолкнет всякий критик! Я - системный аналитик! |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Показывай реализацию функции Proizvedenie.
|
RathaR |
![]()
Сообщение
#8
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 346 Пол: Мужской Реальное имя: Иван Репутация: ![]() ![]() ![]() |
Показывай реализацию функции Proizvedenie. Function Proizvedenie(A,B:string):string; -------------------- Считающий себя единственым здравомыслящим человеком сумасшедший? Если да, возможно я псих...
Пусть умолкнет всякий критик! Я - системный аналитик! |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата функция Proizvedenie сама по себе работает правильно. Неправда:writeln(Proizvedenie('12', '6')); печатает '00' вместо того, что должно быть напечатано. |
RathaR |
![]()
Сообщение
#10
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 346 Пол: Мужской Реальное имя: Иван Репутация: ![]() ![]() ![]() |
Неправда: writeln(Proizvedenie('12', '6')); печатает '00' вместо того, что должно быть напечатано. эмм...я запускаю программу(полностью) ввожу 12 и 6, действие - умножение, и результат 72.... -------------------- Считающий себя единственым здравомыслящим человеком сумасшедший? Если да, возможно я псих...
Пусть умолкнет всякий критик! Я - системный аналитик! |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Значит, твоя функция имеет побочный эффект, и, что самое ужасное, работает ТОЛЬКО за счет побочного эффекта. А при работе Factorial этот эффект не проявляется, вот тебе и неправильный результат.
Корректно написанная функция должна выдавать правильный результат и при таком вызове, как я показал. |
RathaR |
![]()
Сообщение
#12
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 346 Пол: Мужской Реальное имя: Иван Репутация: ![]() ![]() ![]() |
Значит, твоя функция имеет побочный эффект, и, что самое ужасное, работает ТОЛЬКО за счет побочного эффекта. А при работе Factorial этот эффект не проявляется, вот тебе и неправильный результат. Корректно написанная функция должна выдавать правильный результат и при таком вызове, как я показал. эм... я вот только что ввёл эту строку, в параметры указал '6' , '12' и всё правильно сработало... Наверное я код скопировал неправильный или не весь, вот собственно вся программа, в которой я проверял: program Kalkyl; копировал с блокнота поэтому кодировка другая.... слова уже менять не стал - долго.... -------------------- Считающий себя единственым здравомыслящим человеком сумасшедший? Если да, возможно я псих...
Пусть умолкнет всякий критик! Я - системный аналитик! |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Внутри функции Proizvedenie очищай массив M:
for i := 1 to 256 do m[i] := '';, иначе там у тебя - мусор, он тебе мешает. Это первое. Второе: при вычислении факториала Repeat, если будет "=", то считается факториал (A - 1). |
RathaR |
![]()
Сообщение
#14
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 346 Пол: Мужской Реальное имя: Иван Репутация: ![]() ![]() ![]() |
Внутри функции Proizvedenie очищай массив M: for i := 1 to 256 do m[i] := '';, иначе там у тебя - мусор, он тебе мешает. Это первое. Второе: при вычислении факториала Repeat, если будет "=", то считается факториал (A - 1). действительно, обнуления масива я не делал, но теперь до 8 программа работает, на 9 выдаёт какойто заоблачный результат, а на числа больше 9 реагирует тем, что выдаёт факториал первой цыфры - старшего розряда числа... Но с этим думаю както розберусь ![]() Еще раз спасибо ![]() Сообщение отредактировано: RathaR - 26.07.2009 22:45 -------------------- Считающий себя единственым здравомыслящим человеком сумасшедший? Если да, возможно я псих...
Пусть умолкнет всякий критик! Я - системный аналитик! |
volvo |
![]()
Сообщение
#15
|
Гость ![]() |
Цитата на 9 выдаёт какойто заоблачный результат Нормальный результат: 362880 (видно при пошаговом прогоне). Другое дело, что нельзя сравнивать '9' и '10' между собой как строки, это приведет к неправильному результату ('9' всегда будет больше '10', и цикл продолжится, пока K не станет равно '90'). Теперь понятно, где надо искать проблему? ![]() |
![]() ![]() |
![]() |
Текстовая версия | 19.06.2025 23:09 |