singlepost

Задача на паскале – "сравнение отпечатков пальцев" << На главную или назад  

Вот задание :
Текстовый файл содержит данные по отпечаткам пальцев известных преступников. Разработать программу, которая печатает информацию обо всех преступниках, чьи отпечатки совпадают с отпечатками, найденными на месте преступления. Отпечаток пальцев, найденный на месте преступления, вводится с клавиатуры. Отпечаток пальцев может быть представлен кодом из 36 символов и 12 вещественных чисел, полученных в результате измерений отпечатка. Отпечатки пальцев считаются идентичными, если 35 символов из 36 совпадают и множества действительных чисел совпадают. Два действительных числа считаются “равными”, если разница между ними составляет не более 5% от большего числа. Два множества измерений считаются совпадающими, если не менее 9 из 12 пар “равны”

Вот то что у меня уже есть :
На паскале сравнение будет происходит приблизительно следующим образом:
(*
на входе упорядоченные по возрастанию массивы:
sourceChars - массив символов отпечатка из файла
inputChars - массив символов вводимого отпечатка
sourceNumbers - массив вещественных чисел отпечатка из файла
inputNumbers - массив вещественных чисел вводимого отпечатка
*)
var
iChars : integer; //Количество совпадений символов
iNumbers : integer; //количество совпадений вещественных чисел
i,j : integer;
bResult : boolean;
//считаем совпадения символов
iChars := 0;
i := 0;
j := 0;
while ((i < 36) and (j < 36)) do
begin
if (sourceChars[i] > inputChars[j]) then j := j + 1
else if (inputChars[j] > sourceChars[i]) then i := i 1
else begin
iChars := iChars 1;
i := i 1;
j := j 1;
end;
end;
//Считаем совпадения вещественных чисел
iNumbers := 0;
i := 0;
j := 0;
while ((i < 12) and (j < 12)) do
begin
if (sourceNumbers[i] > inputNumbers[j]) then
begin
if (sourceNumbers[i] - inputNumbers[j] <= 0.05 * sourceNumbers[i]) then
begin
iNumbers := iNumbers 1;
i := i 1;
end;
j := j 1;
end
else
begin
if (inputNumbers[j] - sourceNumbers[i] <= 0.05 * inputNumbers[j]) then
begin
iNumbers := iNumbers 1;
j := j 1;
end;
i := i 1;
end;
end;
//Результат
if ((iChars >= 35) and (iNumbers >= 9)) bResult := true;
else bResult := false;

ПОмагите кто нить пожалуста доделать

10 ответов в теме “Задача на паскале – "сравнение отпечатков пальцев"”

  1. 1
    Максим Вальтер ответил:

    Это мой код, я уже кому-то его кидал. Поищи по темам, у кого-то точно уже готовое есть. А полный исходник писать честно говоря лень.

  2. 2
    Дмитрий Ушанов ответил:

    ну я это и писал ага эт твоя прога) прост закончить нада её =) а я вапще не пойму про что там :)

  3. 3
    Максим Вальтер ответил:

    program Project1;

    {$APPTYPE CONSOLE}

    uses
    SysUtils;

    type
    TArrChars = array[0 .. 35] of char;
    TArrNumbers = array[0 .. 11] of real;
    (* Процедура сравнения отпечатков
    на входе упорядоченные по возрастанию массивы:
    sourceChars – массив символов отпечатка из файла
    inputChars – массив символов вводимого отпечатка
    sourceNumbers – массив вещественных чисел отпечатка из файла
    inputNumbers – массив вещественных чисел вводимого отпечатка
    *)
    function CompareImpress(var sourceChars : TArrChars; var inputChars : TArrChars;
    var sourceNumbers : TArrNumbers; var inputNumbers : TArrNumbers) : boolean;
    var
    iChars : integer; //Количество совпадений символов
    iNumbers : integer; //количество совпадений вещественных чисел
    i,j : integer;
    begin
    //считаем совпадения символов
    iChars := 0;
    i := 0;
    j := 0;
    while ((i < 36) and (j < 36)) do begin
    if (sourceChars[i] > inputChars[j]) then j := j + 1
    else if (inputChars[j] > sourceChars[i]) then i := i + 1
    else begin
    iChars := iChars + 1;
    i := i + 1;
    j := j + 1;
    end;
    end;
    //Считаем совпадения вещественных чисел
    iNumbers := 0;
    i := 0;
    j := 0;
    while ((i < 12) and (j < 12)) do begin
    if (sourceNumbers[i] > inputNumbers[j]) then begin
    if (sourceNumbers[i] – inputNumbers[j] <= 0.05 * sourceNumbers[i]) then begin
    iNumbers := iNumbers + 1;
    i := i + 1;
    end;
    j := j + 1;
    end
    else begin
    if (inputNumbers[j] – sourceNumbers[i] <= 0.05 * inputNumbers[j]) then begin
    iNumbers := iNumbers + 1;
    j := j + 1;
    end;
    i := i + 1;
    end;
    end;
    //Результат
    if ((iChars >= 35) and (iNumbers >= 9)) then result := true
    else result := false;
    end;
    //Сравнение отпечатков
    {Пример входного файла:
    1
    AACDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'abcd
    0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6
    2
    0023456789:;<=>?@ABCDEFGHIJKLMNOPQRS
    0.005 0.105 0.195 0.305 0.385 0.5 0.6 0.7 0.8 1.0 2.0 2.1
    3
    0003456789:;<=>?@ABCDEFGHIJKLMNOPQRS
    0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1
    4
    0023456789:;<=>?@ABCDEFGHIJKLMNOPQRS
    0.005 0.105 0.195 0.305 0.375 0.5 0.6 0.7 0.8 1.0 2.0 2.1
    }
    var f : TextFile;
    sourceChars, inputChars : TArrChars;
    sourceNumbers, inputNumbers : TArrNumbers;
    i, k, num : integer;
    ch : char;
    begin
    //Создание простого отпечатка
    writeln('Original impress:');
    ch := '0';
    for i := 0 to 35 do begin
    sourceChars[i] := ch;
    inc(ch);
    write(sourceChars[i], ' ');
    end;
    writeln;
    k := 0;
    for i := 0 to 11 do begin
    sourceNumbers[i] := k * 0.1;
    inc(k);
    write(sourceNumbers[i]:2:1, ' ');
    end;
    writeln;
    writeln;
    //Считывание отпечатков из файла
    AssignFile(f, 'E:\\source.txt');
    Reset(f);
    while (not eof(f)) do begin
    readln(f, num);
    for i := 0 to 35 do read(f, inputChars[i]);
    for i := 0 to 11 do read(f, inputNumbers[i]);
    if CompareImpress(sourceChars, inputChars, sourceNumbers, inputNumbers) then begin
    writeln('Original impress = impress N', num);
    end;
    end;
    CloseFile(f);
    writeln('Process finished.');
    readln;
    end.

  4. 4
    Дмитрий Ушанов ответил:

    Агромное спасиба чувак спас меня)

  5. 5
    frost lord ответил:

    вот по задачке,
    компилил под досом
    #include <conio.h>
    #include <stdio.h>
    FILE *A;
    FILE *B;
    FILE *C;
    FILE *D;

    void main()
    {
    int q,w,e;
    clrscr();
    if((A=fopen("A.txt","r"))==NULL){printf("error A");getch();}
    if((B=fopen("B.txt","r"))==NULL){printf("error B");getch();}
    if((C=fopen("C.txt","r"))==NULL){printf("error C");getch();}
    if((D=fopen("D.txt","w"))==NULL){printf("error D");getch();}
    while (!feof(A))
    {
    fscanf(A,"%i",&q);
    while (!feof(B))
    {
    fscanf(B,"%i",&w);
    if (q==w)
    {
    while (!feof(C))
    {
    fscanf(C,"%i",&e);
    if (w==e) fprintf(D,"%i \n",q);
    }
    rewind(C);
    }
    }
    rewind(B);
    }
    printf("vse sdelano");
    getch();
    fclose(A);
    fclose(B);
    fclose(C);
    fclose(D);
    }

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.