Логин:     Забыли пароль?
 
Пароль:   Регистрация

Форум / Программирование - программа на Delphi : исключения промахов из выборкиизмерительных данных.  

программа на Delphi : исключения промахов из выборкиизмерительных данных.

mancunian
mancunian
Посетитель
Сообщения: 2
[Сообщение #1] 16 декабря 2010, 09:59
Добрый день!
помогите написать программу:

"Разработать программу исключения промахов из выборкиизмерительных данных."

min@y™
min@y™
Доктор наук
Сообщения: 400
[Сообщение #2] 16 декабря 2010, 10:06

Цитата (mancunian):

помогите написать программу

Чем помочь? Что не получается?
И почему это топик в форуме, а не вопрос на эксперте?

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ерёмин А.А.
Ерёмин А.А.
*Администратор
Сообщения: 435
[Сообщение #3] 17 декабря 2010, 12:00
Что подразумевается под промахами?

Думаю, надо вычислить среднее значение, а потом удалить те, которые наиболее далеки от него.

min@y™
min@y™
Доктор наук
Сообщения: 400
[Сообщение #4] 17 декабря 2010, 12:05

Цитата (Ерёмин А.А.):

Думаю, надо вычислить среднее значение, а потом удалить те, которые наиболее далеки от него.

Если распределение равномерное, то да. А если нормальное (лапласово) распределение, тогда как?
Где-то у меня завалялся коспект по матстатистике за 2-й курс, надо поискать... Страшно подумать - 99-й год, ёмаё. Неужели хоть раз эта дурь пригодится?

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™
min@y™
Доктор наук
Сообщения: 400
[Сообщение #5] 17 декабря 2010, 12:06
ой, не 99-й даже, а 97-й!
Какой же я уже старый... :(

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ерёмин А.А.
Ерёмин А.А.
*Администратор
Сообщения: 435
[Сообщение #6] 17 декабря 2010, 12:12

Цитата (min@y™):

А если нормальное (лапласово) распределение, тогда как?

Нормальное — это Гауссово :-) Да точно так же:

А вот если какое-то несимметричное распределение, то да, глупость получится.

В общем, камни как всегда в огород составителя задания.

min@y™
min@y™
Доктор наук
Сообщения: 400
[Сообщение #7] 17 декабря 2010, 14:22

Цитата (Ерёмин А.А.):

Нормальное — это Гауссово

Да, точно. Перепутал.

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
mancunian
mancunian
Посетитель
Сообщения: 2
[Сообщение #8] 20 декабря 2010, 17:43
у меня есть Листинг...но по Ассемблеру ((

ЛИСТИНГ ПРОГРАММЫ НА ЯЗЫКЕ ASSEMBLER
. model small; модель памяти
. stack 100h; сегмент стека
. data; сегмент данных
MAXDIGITSequ16; максимальное количество символов
; для ввода целого числа
BUFFERSIZEequMAXDIGITS + 2 + 1; объем буфера ввода
bufferdbBUFFERSIZE dup(?) ; буфер ввода
ARRAYSIZEequ4; количество элементов массива / 4
dataArraydb4*ARRAYSIZE dup(?) ; массив данных
changeValueNodb? ; номер элемента массива для изменения
changeValuedb? ; новое значение элемента массива
parityCodedd? ; код четности
; переменные для работы генератора случайных чисел
rand_add69621
rand_mdd7FFFFFFFh
seeddd-1
;
; Сообщения для вывода на экран
;
welcomeMsgdb"Welcome to array parity checker. ", 0Dh, 0Ah
db0Dh, 0Ah
db"This program generates array with random values and calculates its parity code. ", 0Dh, 0Ah
db"Then you can change any array value and program will check parity code. ", 0Dh, 0Ah
db"Enjoy! ", 0Dh, 0Ah
db0Dh, 0Ah
db0Dh, 0Ah, "$"
errorMsgdb"Parity check error. ", 0Dh, 0Ah, "$"
okMsgdb"Parity check ok. ", 0Dh, 0Ah, "$"
dataMsgdb"Array data: $"
codeMsgdb"Parity code: $"
numberMsgdb"Enter array item number to change (0. .15): $"
valueMsgdb"Enter new value (0. .255): $"
uncorrectMsgdb"Incorrect number. $"
writelndb0Dh, 0Ah, "$"
byeMsgdb"Bye! ", 0Dh, 0Ah, "$"
itemSeparatordb" $"
. code; сегмент кода
.386; программа для процессора 80386
; - ----------------------------------------------------------------------------------------
; Главная программа
; - ---------------------------------------------------------------------------------------
start: movax, @data
movds, ax; настройка регистров
moves, ax;
andsp, not 3; выравнивание границы стека
; во избежание ошибки доступа к памяти
movax, 0003h; видеорежим 3, очистка экрана и установка курсора
int10h
movdx, offset welcomeMsg; вывести приветствие
callshowString
callfillArray; заполнить массив случайными данными
movcx, ARRAYSIZE * 4; рассчитать контрольное число
; и записать в parityCode
movsi, offset dataArray
movdi, offset parityCode
callsaveParityCode
callshowArray; вывести значения элементов массива
moveax, parityCode
callshowParityCode
callinputValueNo; запросить у пользователя номер
; элемента массива для изменения
callinputValue; запросить у пользователя новое значение
; элемента массива
callchangeItem; изменить значение элемента массива
callshowArray; вывести значения элементов массива
callgetParityCode; рассчитать контрольное число
callshowParityCode
cmpparityCode, eax
jeparityCode_notChanged
parityCode_Changed:
movdx, offset errorMsg; сообщение об изменении кода четности
callshowString
jmpmain_exit
parityCode_notChanged:
movdx, offset okMsg; сообщение о неизменности кода четности
callshowString
main_exit:
callwriteLine; перевод строки
callwriteLine; перевод строки
movdx, offset byeMsg; до свидания
callshowString
callwriteLine; перевод строки
movax, 4c00h; завершение выполнения программы
int21h
; - ---------------------------------------------------------------------------------------
;
; Заполнить массив случайными данными.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [ref] dataArray - массив данных для заполнения
; [in] ARRAYSIZE - размер массива
;
; - ---------------------------------------------------------------------------------------
fillArrayproc
pusheax
pushcx
pushedi
movedi, offset dataArray; указатель на массив данных
movcx, ARRAYSIZE; размер массива
fillArray_loop:
callrand; генерировать случайное число в eax
cld; направление записи - вперед
stosd; записать в очередной элемент массива
loopfillArray_loop
popedi
popcx
popeax
ret
fillArrayendp
; - ----------------------------------------------------------------------------------------
; Генерация случайного числа.
;
; Параметры: нет
;
; Возвращаемое значение:
; eax - случайное положительное 32-битное число (от 0 до 2^31 - 2)
;
; Модификация регистров:
; eax
;
; Глобальные переменные:
; [in] rand_a – коэффициент a
; [in] rand_m – коэффициент m
; [ref] seed – последнее случайное число
;
; Примечание:
; Используется алгоритм, описанный в [Зубков С.В.] на стр.238.
; Линейный конгруэнтный генератор описывается формулой:
;
; I [j + 1] = (a * I [j] + c) mod m
;
; При правильно выбранных числах a и c эта последовательность возвращает
; все числа от нуля до m - 1 псевдослучайным образом и ее периодичность
; сказывается только на последовательностях порядка m.
; Классический стандартный генератор Льюиса, Гудмана и Миллера
; использует a = 16807 (7^5) при m = 2^31 - 1.
; Генераторы Парка и Миллера используют a = 48271 и a = 69621
; при том же m.
; Используем последний вариант.
; Значения a и m задаются в глобальных переменных rand_a и rand_m.
; - ---------------------------------------------------------------------------------------
randproc
pushedx
moveax, dword ptr seed; считать последнее случайное число
testeax, eax; проверить его
jsfetch_seed; если не - 1, функция еще ни разу не вызывалась
; и надо создать начальное значение
randomize:
muldword ptr rand_a; умножить на число a
divdword ptr rand_m; взять остаток от деления на 2^31 - 1
moveax, edx
movdword ptr seed, eax; сохранить для следующих вызовов
popedx
ret
fetch_seed:
pushds
push0040h
popds
moveax, dword ptr ds: 006Ch; считать двойное слово из области данных BIOS
; по адресу 0040: 006C - текущее число тактов таймера
popds
jmpshort randomize
randendp
; - ----------------------------------------------------------------------------------------
; Рассчитать контрольное число элементов массива и сохранить в переменной.
;
; Параметры:
; cx - размер массива
; ds: si - указатель на начало массива
; es: di - указатель на переменную-получатель
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
; - -----------------------------------------------------------------------------------------
saveParityCodeproc
pusheax
callgetParityCode; рассчитать контрольное число
mov [di], eax; сохранить результат
popeax
ret
saveParityCodeendp
; - ----------------------------------------------------------------------------------------
; Рассчитать контрольное число четности элементов массива.
; Если размер массива больше 32 байт, контрольное число
; рассчитывается методом суммирования - см. getParitySum
; Если размер массива не более 32 байт, контрольное число
; рассчитывается методом битовых масок - см. getParityBits
;
; Параметры:
; cx - размер массива
; ds: si - указатель на начало массива
;
; Возвращаемое значение:
; eax - 32-битное контрольное число
;
; Модификация регистров:
; eax
; - ----------------------------------------------------------------------------------------
getParityCodeproc
cmpcx, 32
jagetParityCode_sum
callgetParityBits
ret
getParityCode_sum:
callgetParitySum
ret
getParityCodeendp
; - -----------------------------------------------------------------------------------------
; Рассчитать контрольное число четности элементов массива методом битовых масок.
; Используется для массивов размером не более 32 байт.
; Для каждого байта определяется количество битов. Если оно четное, соответствующий
; бит контрольного числа устанавливается в 1, если нечетное - в 0.
; Нулевому байту массива соответствует нулевой бит контрольного числа и т.д.
;
; Параметры:
; cx - размер массива
; ds: si - указатель на начало массива
;
; Возвращаемое значение:
; eax - 32-битное контрольное число
;
; Модификация регистров:
; eax
; - ----------------------------------------------------------------------------------------
getParityBitsproc
pushebx
pushcx
pushsi
xorebx, ebx; обнулить результат
std; направление чтения - назад
addsi, cx; установить указатель на последний элемент массива
decsi
getParityBits_loop:
lodsb; прочитать байт данных в al
testal, al; проверить четность
jpgetParityBits_parity; если четность, перейти к установке флага cf
clc; сброс флага cf
jmpshort getParityBits_shift; перейти к формированию результата
getParityBits_parity:
stc; установить флаг cf
getParityBits_shift:
rclebx, 1; сдвиг влево на 1 бит с учетом флага cf
loopgetParityBits_loop
moveax, ebx; записать результат в eax
popsi
popcx
popebx
ret
getParityBitsendp
; - -----------------------------------------------------------------------------------------
; Рассчитать контрольное число четности элементов массива суммированием.
; Используется для массивов размером более 32 байт.
; Для каждого байта определяется количество битов. Если оно четное,
; контрольное число увеличиваем на 1.
;
; Параметры:
; cx - размер массива
; ds: si - указатель на начало массива
;
; Возвращаемое значение:
; eax - 32-битное контрольное число
;
; Модификация регистров:
; eax
;
; - ----------------------------------------------------------------------------------------
getParitySumproc
pushebx
pushcx
pushsi
xorebx, ebx; обнулить результат
cld; направление чтения - вперед
getParitySum_loop:
lodsb; прочитать байт данных в al
testal, al; проверить четность
jnpgetParitySum_next; если не четность, продолжить
incebx; увеличить результат на 1
getParitySum_next:
loopgetParitySum_loop
moveax, ebx; записать результат в eax
popsi
popcx
popebx
ret
getParitySumendp
; - -----------------------------------------------------------------------------------------
; Вывод на экран элементов массива.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] dataMsg – сообщение
; [in] dataArray – массив данных
; [ref] buffer – буфер преобразования числа в строку
; [in] itemSeparator – разделитель элементов массива
; [in] ARRAYSIZE - размер массива
; - ----------------------------------------------------------------------------------------
showArrayproc
pusheax
pushcx
pushdx
pushsi
pushdi
movdx, offset dataMsg; сообщение
callshowString

xoreax, eax; обнулить аккумулятор
movsi, offset dataArray; читать данные из массива данных
movdi, offset buffer
movcx, ARRAYSIZE * 4; размер массива, байт
showArray_loop:
cld; направление чтения - вперед
lodsb; прочитать байт данных в al
callint2dec; преобразовать в строку
movdx, offset buffer
callshowString; вывести на экран
movdx, offset itemSeparator
callshowString; вывести пробел
loopshowArray_loop
callwriteLine; перевод строки
popdi
popsi
popdx
popcx
popeax
ret
showArrayendp
; - ---------------------------------------------------------------------------------------
; Вывод на экран контрольного кода четности.
;
; Параметры:
; eax - контрольное число
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] codeMsg – сообщение
; [ref] buffer – буфер преобразования числа в строку
; - -----------------------------------------------------------------------------------------
showParityCodeproc
pushdx
pushdi
movdx, offset codeMsg; сообщение
callshowString
movdi, offset buffer
callint2dec; преобразовать в строку
movdx, di
callshowString; вывести на экран
callwriteLine; перевод строки
popdi
popdx
ret
showParityCodeendp
; - ----------------------------------------------------------------------------------------
; Запросить у пользователя номер элемента массива для изменения.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] ARRAYSIZE - размер массива
; [in] numberMsg – запрос на ввод номера элемента массива
; [in] uncorrectMsg – сообщение об ошибке
; [out] changeValueNo – результат ввода
; - ----------------------------------------------------------------------------------------
inputValueNoproc
pushbx
pushcx
pushdx
pushsi
pushdi
movbx, ARRAYSIZE * 4 - 1; максимально допустимое значение
movcl, 2; максимально допустимое количество символов
movdx, offset numberMsg; запрос на ввод номера элемента массива
movsi, offset uncorrectMsg; сообщение об ошибке
movdi, offset changeValueNo; запомнить результат ввода в changeValueNo
callinputNumber
popdi
popsi
popdx
popcx
popbx
ret
inputValueNoendp
; - -----------------------------------------------------------------------------------------
; Запросить у пользователя новое значение элемента массива.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] valueMsg - запрос на ввод нового значения элемента массива
; [in] uncorrectMsg – сообщение об ошибке
; [out] changeValue – результат ввода
; - -----------------------------------------------------------------------------------------
inputValueproc
pushbx
pushcx
pushdx
pushsi
pushdi
movbx, 255; максимально допустимое значение
movcl, 3; максимально допустимое количество символов
movdx, offset valueMsg; запрос на ввод нового значения элемента массива
movsi, offset uncorrectMsg; сообщение об ошибке
movdi, offset changeValue; запомнить результат ввода в changeValue
callinputNumber
popdi
popsi
popdx
popcx
popbx
ret
inputValueendp
; - -----------------------------------------------------------------------------------------
; Изменить значение элемента массива.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [ref] dataArray – массив данных
; [in] changeValueNo – номер элемента массива для изменения
; [in] changeValue – новое значение элемента массива
; - -----------------------------------------------------------------------------------------
changeItemproc
pushax
pushbx
pushsi
movbx, offset dataArray
xorax, ax
moval, changeValueNo
movsi, ax
moval, changeValue
mov [bx + si], al
popsi
popbx
popax
ret
changeItemendp
; - ----------------------------------------------------------------------------------------
; Запрос у пользователя числа.
; Вводятся беззнаковые целые числа в диапазоне 0. .65535.
;
; Параметры:
; bx - максимально допустимое значение
; cl - максимально допустимое количество символов
; dx - указатель на строку-приглашение для ввода
; si - указатель на сообщение об ошибке
; di - указатель на байтовую переменную-получатель
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [ref] buffer – буфер преобразования строки в число
; - -----------------------------------------------------------------------------------------
inputNumberproc
pushax
pushdi
inputNumber_input:
callshowString; вывод строки-приглашения для ввода
movdi, offset buffer; указатель на буфер ввода
calldo_inputNumber
callwriteLine; перевод строки
jncinputNumber_exit; если нет ошибки ввода, выход
inputNumber_error:
pushdx
movdx, si; сообщение об ошибке
callshowString
popdx
jmpshort inputNumber_input
inputNumber_exit:
popdi
mov [di], al; запомнить результат ввода в переменной-получателе
popax
ret
inputNumberendp
; - -----------------------------------------------------------------------------------------
; Ввод числа.
; Вводятся беззнаковые целые числа в диапазоне 0. .65535.
;
; Параметры:
; bx - максимально допустимое значение
; cl - максимально допустимое количество символов
; es: di - указатель на буфер ввода
; первый байт буфера резервируется для записи максимально допустимого количества символов
; второй байт буфера резервируется для записи количества реально введенных символов
;
; Возвращаемое значение:
; ax - результат ввода
; ch - количество введенных символов
; cf -
; = 0 в случае успешного преобразования
; = 1 в случае ошибки преобразования
;
; Модификация регистров:
; ax, cx, flags. cf
; - -----------------------------------------------------------------------------------------
do_inputNumberproc
pushdx
pushsi
andcx, 0Fh; обнуление ch (длины введенной строки)
clc; сброс флага ошибки
inccl
mov [di], cl; максимальное количество символов для ввода
deccl
movdx, di; настройка указателя на начало буфера ввода
movah, 0Ah; ввод с клавиатуры
int21h
movch, [di + 1] ; количество введенных символов
cmpch, 0; если = 0, ошибка
jedo_inputNumber_error1

movsi, di; подготовим указатель на первый введенный символ
incsi; для последующего преобразования строки в число
incsi
pushcx; преобразование десятичного числа
movcl, ch
andcx, 0Fh
calldec2int
popcx
jcdo_inputNumber_error1; если ошибка преобразования, выход с ошибкой
cmpbx, ax
jcdo_inputNumber_error2; если превышение лимита, выход с ошибкой
; без очистки результата
jmpdo_inputNumber_exit; если не превышает лимит, выход без ошибки
do_inputNumber_error1: ; ошибка преобразования
xorax, ax; обнулить результат
do_inputNumber_error2: ; ошибка преобразования
stc; установить флаг ошибки
do_inputNumber_exit:
popsi
popdx
ret
do_inputNumberendp
; - -----------------------------------------------------------------------------------------
; Вывод строки на экран.
;
; Параметры:
; dx - адрес строки для вывода, строка должна заканчиваться символом $
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
; - ----------------------------------------------------------------------------------------
showStringproc
pushax
movah, 9h; вызов функции DOS
int21h
popax
ret
showStringendp
; - -----------------------------------------------------------------------------------------
; Перевод строки.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] writeln – коды перевода строки
; - -----------------------------------------------------------------------------------------
writeLineproc
pushdx
movdx, offset writeln; вывод символов перевода строки
callshowString
popdx
ret
writeLineendp
; - -----------------------------------------------------------------------------------------
; Преобразование строки, содержащей десятичные символы, в число.
; Строка должна содержать строковое представление целого числа в диапазоне 0. .65535.
;
; Параметры:
; ds: si - указатель на первый обрабатываемый символ исходной строки
; cx - количество символов (беззнаковое число)
;
; Возвращаемое значение:
; ax - результат преобразования
; cf -
; = 0 в случае успешного преобразования
; = 1 в случае ошибки преобразования
;
; Модификация регистров:
; ax, flags. cf
; - -----------------------------------------------------------------------------------------
dec2intproc
pushbx
pushcx
pushdx
pushsi
cmpcx, 0; проверка: количество символов 1. .5
jedec2int_error
cmpcx, 5
jadec2int_error
xorax, ax; обнуление результата
xorbx, bx; обнуление регистра-приемника
clc; сброс флага ошибки
dec2int_loop: ; цикл обработки символов исходной строки
movbl, byte ptr [si] ; читать очередной символ
cmpbl, '0'; если меньше 0, ошибка
jbdec2int_error
cmpbl, '9'; если больше 9, ошибка
jadec2int_error
subbl, '0'; вычесть код символа 0
movdx, ax; умножение на 10 содержимого ax:
shlax, 1; ax = 2x
jcdec2int_error
shlax, 1; ax = 4x
jcdec2int_error
addax, dx; ax = 4x + x = 5x
jcdec2int_error
shlax, 1; ax = 10x
jcdec2int_error
addax, bx; добавить промежуточный результат преобразования
jcdec2int_error
incsi; перейти к следующему символу
loopdec2int_loop
jmpdec2int_exit
dec2int_error: ; ошибка преобразования
xorax, ax; обнулить результат
stc; установить флаг ошибки
dec2int_exit:
popsi
popdx
popcx
popbx
ret
dec2intendp
; - ----------------------------------------------------------------------------------------
; Преобразование числа в десятичное строковое представление.
; Полученная строка завершается символом $.
;
; Параметры:
; eax - исходное число
; es: di - указатель на первый символ буфера для выходной строки
;
; Возвращаемое значение:
; выходная строка
;
; Модификация регистров: нет
; - ----------------------------------------------------------------------------------------
int2decproc
pusheax
pushebx
pushcx
pushedx
pushdi
xorebx, ebx
movbl, 10; множитель
xorcx, cx; обнуление счетчика символов
int2dec_loop: ; начало цикла преобразования
xoredx, edx; обнуление промежуточного результата преобразования
divebx; деление ax на 10, в dl - остаток от деления
adddl, '0'; перевод в ASCII
pushdx; сохранение результата в стеке
inccx; увеличить счетчик символов
testeax, eax; проверить ax на 0
jnzint2dec_loop; если что-то осталось,
; продолжить цикл преобразования
cld; направление обработки строк - вперед
int2dec_store: ; цикл формирования конечного результата
popax; восстановить цифру из стека
stosb; записать в результат
loopint2dec_store; проверка окончания цикла
movbyte ptr [di], '$'; добавить символ завершения строки
popdi
popedx
popcx
popebx
popeax
ret
int2decendp
; - -------------------------------------------------------------------------------------- - end start; конец программы
;

min@y™
min@y™
Доктор наук
Сообщения: 400
[Сообщение #9] 20 декабря 2010, 19:13
Мощно. У меня тоже есть листинг на ассемблере. Модулей 55-60. 727 килобайт. Выложить?

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Всего сообщений: 9 (сейчас показаны: с 1 по 9)

Перейти в раздел:


 © 2004 - 2024, Delphi.int.ru
Версия форума: 1.10 (19.01.2010)
RSS Delphi.int.ru Expert Код
Выполнено за 0.02 сек.
Обратная связь