Q&A

  • 문자를 배열을 이용해 대응시키는 방법좀 알려주세요.
안녕하세요.

제가 구현하고 싶은내용은 'ㄱ' 에서 'ㅎ' 까지의 한글문자를 선언하고

'ㄱ'에는 '.-..' 를 'ㄴ'에는 '..-.' 등을 대응시켜 문자에 해당되는

ㄱ 이나 ㄴ 등등의 값이 들어 올때 비교를 해서 해당되는 문자에 대응되는 문자를

출력하는 소스를 구현하고 싶습니다.

지금은 if문을 사용하고 있는데 ㄱ부터 ㅎ까지 그리고 모음까지 전부를

if 문으로 사용하니까 불필요할것 같은 소스가 너무길어지더군요.



array 같은 배열을 이용하거나 포인터를 이용해서 쉽고 빠르게

불러와 사용할 수 있는 좋은 방법이 없을까요?



현재 소스는 이렇게 되어있습니다.



Var

hantmp: String;

Begin



for n :=1 to m do

begin

hantmp := Edit2.Text;



ch := copy(hantmp,o,2);



if ch ='ㄱ' then

Temp := Temp + ' .-..'

else if ch = 'ㄴ' then

Temp := Temp + ' ..-.'

else if ch = 'ㄷ' then

Temp := Temp + ' -...'

else if ch = 'ㄹ'then

Temp := Temp + ' ...-'

......

else if ch = 'ㅎ' then

Temp := Temp + ' .---'

......

else if ch = 'ㅏ' then

Temp := Temp + ' .'

.......

Temp := Temp + ' .... -.--'

else if ch = 'ㅒ' then

Temp := Temp + ' .. ..-'

else if ch = 'ㅖ' then

Temp := Temp + ' ... ..-';

end;



edit1.Text := temp;

end;



효율적인 좋은방법도 있으면 꼭 좀 알려주세요.







2  COMMENTS
  • Profile
    최용일 2000.04.06 01:47
    안녕하세요. 최용일입니다.



    중첩된 if문보다는 case문이 훨씬 효율적입니다.



    Var

    hantmp: String;

    HanStrings: TStrings;

    Begin

    HanStrings := TStrings.Create;

    HanStrings.Add('ㄱ');

    HanStrings.Add('ㄴ');

    HanStrings.Add('ㄷ');

    HanStrings.Add('ㄹ');



    for n :=1 to m do

    begin

    hantmp := Edit2.Text;

    ch := copy(hantmp,o,2);

    case HanStrings.IndexOf(HanTmp) of

    0: // 'ㄱ'

    ...

    1: // 'ㄴ'

    ...

    2: // 'ㄷ'

    ...

    3: // 'ㄹ'

    ...

    ...

    end;

    edit1.Text := temp;

    end;

    end;



    >

    > for n :=1 to m do

    > begin

    > hantmp := Edit2.Text;

    >

    > ch := copy(hantmp,o,2);

    >

    > if ch ='ㄱ' then

    > Temp := Temp + ' .-..'

    > else if ch = 'ㄴ' then

    > Temp := Temp + ' ..-.'

    > else if ch = 'ㄷ' then

    > Temp := Temp + ' -...'

    > else if ch = 'ㄹ'then

    > Temp := Temp + ' ...-'

    > ......

    > else if ch = 'ㅎ' then

    > Temp := Temp + ' .---'

    > ......

    > else if ch = 'ㅏ' then

    > Temp := Temp + ' .'

    > .......

    > Temp := Temp + ' .... -.--'

    > else if ch = 'ㅒ' then

    > Temp := Temp + ' .. ..-'

    > else if ch = 'ㅖ' then

    > Temp := Temp + ' ... ..-';

    > end;

    >

    > edit1.Text := temp;

    > end;

    >

    > 효율적인 좋은방법도 있으면 꼭 좀 알려주세요.

    >

    >

    >



    박근성 wrote:

    > 안녕하세요.

    > 제가 구현하고 싶은내용은 'ㄱ' 에서 'ㅎ' 까지의 한글문자를 선언하고

    > 'ㄱ'에는 '.-..' 를 'ㄴ'에는 '..-.' 등을 대응시켜 문자에 해당되는

    > ㄱ 이나 ㄴ 등등의 값이 들어 올때 비교를 해서 해당되는 문자에 대응되는 문자를

    > 출력하는 소스를 구현하고 싶습니다.

    > 지금은 if문을 사용하고 있는데 ㄱ부터 ㅎ까지 그리고 모음까지 전부를

    > if 문으로 사용하니까 불필요할것 같은 소스가 너무길어지더군요.

    >

    > array 같은 배열을 이용하거나 포인터를 이용해서 쉽고 빠르게

    > 불러와 사용할 수 있는 좋은 방법이 없을까요?

    >

    > 현재 소스는 이렇게 되어있습니다.

    >

    > Var

    > hantmp: String;

    > Begin

    >

    > for n :=1 to m do

    > begin

    > hantmp := Edit2.Text;

    >

    > ch := copy(hantmp,o,2);

    >

    > if ch ='ㄱ' then

    > Temp := Temp + ' .-..'

    > else if ch = 'ㄴ' then

    > Temp := Temp + ' ..-.'

    > else if ch = 'ㄷ' then

    > Temp := Temp + ' -...'

    > else if ch = 'ㄹ'then

    > Temp := Temp + ' ...-'

    > ......

    > else if ch = 'ㅎ' then

    > Temp := Temp + ' .---'

    > ......

    > else if ch = 'ㅏ' then

    > Temp := Temp + ' .'

    > .......

    > Temp := Temp + ' .... -.--'

    > else if ch = 'ㅒ' then

    > Temp := Temp + ' .. ..-'

    > else if ch = 'ㅖ' then

    > Temp := Temp + ' ... ..-';

    > end;

    >

    > edit1.Text := temp;

    > end;

    >

    > 효율적인 좋은방법도 있으면 꼭 좀 알려주세요.

    >

    >

    >

  • Profile
    조규춘 2000.04.05 02:56
    박근성 wrote:

    > 안녕하세요.

    > 제가 구현하고 싶은내용은 'ㄱ' 에서 'ㅎ' 까지의 한글문자를 선언하고

    > 'ㄱ'에는 '.-..' 를 'ㄴ'에는 '..-.' 등을 대응시켜 문자에 해당되는

    > ㄱ 이나 ㄴ 등등의 값이 들어 올때 비교를 해서 해당되는 문자에 대응되는 문자를

    > 출력하는 소스를 구현하고 싶습니다.

    > 지금은 if문을 사용하고 있는데 ㄱ부터 ㅎ까지 그리고 모음까지 전부를

    > if 문으로 사용하니까 불필요할것 같은 소스가 너무길어지더군요.

    >

    > array 같은 배열을 이용하거나 포인터를 이용해서 쉽고 빠르게

    > 불러와 사용할 수 있는 좋은 방법이 없을까요?

    >

    > 현재 소스는 이렇게 되어있습니다.

    >

    > Var

    > hantmp: String;

    > Begin

    >

    > for n :=1 to m do

    > begin

    > hantmp := Edit2.Text;

    >

    > ch := copy(hantmp,o,2);

    >

    > if ch ='ㄱ' then

    > Temp := Temp + ' .-..'

    > else if ch = 'ㄴ' then

    > Temp := Temp + ' ..-.'

    > else if ch = 'ㄷ' then

    > Temp := Temp + ' -...'

    > else if ch = 'ㄹ'then

    > Temp := Temp + ' ...-'

    > ......

    > else if ch = 'ㅎ' then

    > Temp := Temp + ' .---'

    > ......

    > else if ch = 'ㅏ' then

    > Temp := Temp + ' .'

    > .......

    > Temp := Temp + ' .... -.--'

    > else if ch = 'ㅒ' then

    > Temp := Temp + ' .. ..-'

    > else if ch = 'ㅖ' then

    > Temp := Temp + ' ... ..-';

    > end;

    >

    > edit1.Text := temp;

    > end;

    >

    > 효율적인 좋은방법도 있으면 꼭 좀 알려주세요.

    >

    >

    >



    ---- 아래에 있는 내용은 제가 예전에 얀님의 질문을 답변한겁니다. - 참고하셔요!









    얀 wrote:

    > 한글입력시 만약

    > exe) '한메일'이라고 입력시 'ㅎ'을 가져오고 싶습니다 그리고 'ㅎ'을 가져와서 '하'로 치환할려고 합니다

    > '까마귀' 라고 입력해도 '가'로 치환하는 것이죠

    > '빵구' 라고 입력해도 '바'로 치환, 즉 처음 입력되는 한글키를 잡아서 가,나,다,라,마,바,사......로 만들려는 것이죠

    >

    > 어떤방법이 있을까여 꼭 좀 부탁합니다

    > 나의 머리에 한계는 이렇게도 빨리 오는군여...흑흑 3일밤을 지샌 후 올립니다....

    >

    > 꼭좀 처방을 내려주세염...



    제가 도움이 될만한 것을 찾아서 올립니다. 이것을 참조하시면 나을거여요!

    그럼 얀님 파이팅!





    코드에 앞서 잠깐 설명하자면 다음 코드에는 두가지 함수가 있습니다.



    1. HanDiv

    2. HanCom



    HanDiv는 '강'을 'ㄱㅏㅇ'으로 변환하는 함수이며 HanCom은 그 반대입니다.

    각 함수의 파라메터인 Han, Han3는 각각 한글의 한 글자, 그리고 초,중,종성

    으로 나누

    어진 글자들입니다. Han은 최소

    2바이트, Han3은 6바이트의 메모리가 할당되어 있어야 합니다.

    (함수내에서는 null-terminated처리를 하지 않습니다.)



    -------코드--------



    const

    ChoSungTbl: PChar = 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ';

    JungSungTbl: PChar = 'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ';

    JongSungTbl: PChar = ' ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ



    ';

    // ^^요기는 꼭 2칸을 띄어야 합니다.





    UniCodeHangeulBase = $AC00;

    UniCodeHangeulLast = $D79F;



    function HanDiv(const Han: PChar; Han3: PChar): Boolean;

    var

    UniCode: Integer;

    ChoSung, JungSung, JongSung: Integer;

    begin

    Result := False;

    // if StrLen(Han) < 2 then Exit;



    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, Han, 2, @UniCode, 1);



    if (UniCode < UniCodeHangeulBase) or

    (UniCode > UniCodeHangeulLast) then Exit;



    UniCode := UniCode - UniCodeHangeulBase;

    ChoSung := UniCode div (21 * 28);

    UniCode := UniCode mod (21 * 28);

    JungSung := UniCode div 28;

    UniCode := UniCode mod 28;

    JongSung := UniCode;



    StrLCopy(Han3, ChoSungTbl + ChoSung * 2, 2);

    StrLCopy(Han3 + 2, JungSungTbl + JungSung * 2, 2);

    StrLCopy(Han3 + 4, JongSungTbl + JongSung * 2, 2);



    Result := True;

    end;



    function HanCom(const Han3: PChar; Han: PChar): Boolean;

    var

    UniCode: Integer;

    ChoSung, JungSung, JongSung: Integer;

    ChoSungPos, JungSungPos, JongSungPos: Integer;

    begin

    Result := False;

    // if StrLen(Han3) < 6 then Exit;



    ChoSungPos := Pos(Copy(String(Han3), 1, 2), ChoSungTbl);

    JungSungPos := Pos(Copy(String(Han3), 3, 2), JungSungTbl);

    JongSungPos := Pos(Copy(String(Han3), 5, 2), JongSungTbl);



    if (ChoSungPos and JungSungPos and JongSungPos) = 0 then Exit;



    ChoSung := (ChoSungPos - 1) div 2;

    JungSung := (JungSungPos - 1) div 2;

    JongSung := (JongSungPos - 1) div 2;



    UniCode := UniCodeHangeulBase +

    (ChoSung * 21 + JungSung) * 28 + JongSung;



    WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK,

    @UniCode, 1, Han, 2, nil, nil);



    Result := True;

    end;



    -------코드 끝---------



    참고로 이 함수를 불러 쓰는 예제를 보내드립니다.



    -------코드----------



    procedure TForm1.Button1Click(Sender: TObject);

    var

    Dest: array[0..6] of Char;

    begin

    if HanDiv(PChar(Edit1.Text), @Dest) then begin

    Dest[6] := Char(0);

    Edit2.Text := String(Dest);

    end else

    Edit2.Text := '?';



    end;



    procedure TForm1.Button2Click(Sender: TObject);

    var

    Dest: array[0..2] of Char;

    begin

    if HanCom(PChar(Edit1.Text), @Dest) then begin

    Dest[2] := Char(0);

    Edit2.Text := String(Dest);

    end else

    Edit2.Text := '?';

    end;



    -------코드 끝--------



    bye~



    --------------------------------------------------------------------------