2013-06-19 3 views
1

문자열이 하나의 문자 만 다른 경우 이 함수를 코딩합니다.이 맞으면 +1을 반환하고 그 이상인 경우 -10을 반환합니다. 1 문자.델파이의 결과 값 논리?

내가 '100''101' 또는으로 할 때 그냥 '010''110' 또는 '100''110' 작동 0과 1을 각각 반환, 좋은 ...주고 예를 들어

그러나 '110''111'내가 얻을 결과가 -1 일 때 2! 필자는 데스크탑 테스트를 수행했으며 실수를 볼 수 없습니다.

function combine (m1, m2 : string) : integer; 
var 
dash : integer; 
distinct : integer; 
i : integer; 

begin 
distinct := 0; 
dash := -1; 

for i := 0 to Length(m1)-1 do 
begin 
    if m1[i] <> m2[i] then 
    begin 
     distinct := distinct+1; 
     dash := i; 
     if distinct > 1 then 
     begin 
      result:= -10; 
      exit; 
     end; 
    end; 
end; 
result := dash; 
end; 

난 항상지고있어 동일한 길이 문자열, 내가 잘못 뭐하는 거지 ?

답변

4

주요 문제는 델파이 문자열이 1 기반이라는 것입니다. 루프를 1에서 Length(m1)까지 실행해야합니다.

컴파일러 옵션에서 범위 검사를 사용하도록 설정 한 경우 컴파일러는 런타임에 오류를 발생시켜 오류를 발생시킬 수 있습니다. 범위 검사를 사용하도록 충분히 강조 할 수는 없습니다. 컴파일러에서 코드의 오류를 찾아냅니다.

또한 이는 반환 값이 1을 기반으로한다는 것을 의미합니다. 따라서 '100', '101'의 입력은 결과가 3 일 때 첫 번째 차이점의 인덱스이므로 결과를 제공합니다.

또한 m1m2이 같은 길이인지 확인해야합니다. 그렇지 않으면 예외가 발생합니다.

다른 팁. 1 변수를 증가하는 관용적 인 방법과 같이이다 :

inc(distinct); 

다른 값을 쓰기로 증가 할 경우 : 그래서

inc(distinct, n); 

, 나는이 같은 기능을 작성합니다

function combine(const m1, m2: string): integer; 
var 
    i: integer; 
    dash: integer; 
    distinct: integer; 
begin 
    if Length(m1)<>Length(m2) then begin 
    raise EAssertionFailed.Create('m1 and m2 must be the same length'); 
    end; 

    distinct := 0; 
    dash := -1; 

    for i := 1 to Length(m1) do 
    begin 
    if m1[i] <> m2[i] then 
    begin 
     inc(distinct); 
     dash := i; 
     if distinct > 1 then 
     begin 
     result := -10; 
     exit; 
     end; 
    end; 
    end; 
    result := dash; 
end; 
+0

Pfff, 정말 감사합니다. 많은 사람들이 제 질문에 대해 불평 할 것입니다. 그러나 나는 결코 그렇게하지 않은 언어로 코딩하는 것을 서둘러야합니다. 질문이 하나 더 있습니다. 문자열의 0 인덱스에 액세스 할 때 어떤 일이 발생했는지, 왜 예외가 발생하지 않았을까요? – diegoaguilar

+1

나는 그 사람들에 동의한다. 서두르지 마. 시간을내어 도구를 올바르게 배우십시오. –

+1

인덱스 0은 문자열 메타 데이터를 나타냅니다. 그것은 문자열의 참조 횟수, 길이, 코드 페이지 등을 포함하는 블록입니다. 물론 구현 세부 사항이며 인덱스 0에 액세스하면 정의되지 않은 동작이 발생합니다 (해당 용어의 C/C++ 해석을 사용하고 있습니다). 컴파일러 옵션에서 범위 검사를 활성화해야합니다. –