반응형

먼저 복학했습니다. 

그래서 아무래도 블로그 운영에 소홀해지는 감이 없지 않아있네요 ㅎㅎ

 

C언어를 많이 잊어먹기도 하고 그래서 이렇게 기록하려고 합니다. 

 

거두절미하고 바로 오늘 과제 리포트 시작하겠습니다.

 


 

Textbook Problem 15, pp.513은 아래와 같은 문제입니다.

제가 생각한 흐름대로 보여드리겠습니다.


먼저 사용자가 입력한 두 수를 num1, num2에 integer형식으로 저장할 것입니다. 그리고 add면 더하기, sub면 빼기, mul이면 곱하기, div면 나누기를 해주기 위해서 char 형식으로 문자열을 선언했습니다. 마지막으로 user값에 사용자가 입력한 값을 넣어주기 위해 user 문자열을 선언했습니다. 지금 다시보니 굳이 7만큼 크게 해줄 필요가 없을 것 같네요, 4정도면 딱 맞을 것 같습니다.

(중요 : user[3]하면 안되는 이유 => 3하면 크기가 안맞습니다. 후에 스캔할 때 add를 입력하고 user[3]에 저장하면 add(엔터)를 하기 때문에 총 4의 크기가 필요하게 되기 때문입니다.)

 

그리고 "연산을 입력하시오 : "라는 멘트를 출력하고 총 세가지 user가 add, sub, mul, div할 지 선택한 후 user에 저장하고 어떤 수를 갖고 연산할 지 두 수를 입력받고 num1과 num2에 저장합니다. user는 배열이기 때문에 &가 없고 num1과 num2는 배열이 아니라 integer(인티져)형식이기 때문에 &가 있습니다.

 

 먼저 strcmp사용하시는 것을 보고싶은 분은 아래로 내려가서 strcmp부분으로 넘어가시면 됩니다. (-strcmp으로 하는 방법) 이라고 적혀져 있는 부분으로 가시면 될 것 같습니다.

 

-strcmp사용하지 않고 문제를 푸는 법

 위 scanf("%s") 이 부분에서 add라고 사용자가 입력하여 user에 저장되었을 때, 첫 번째 이프문에서 user와 add가 일치하는지 확인한 후 일치한다면 두 값을 더해주는 방식입니다. 

 그러면 왜 여기서 포인터를 사용해야 하냐, 만약 if(user == add)와 같이 했다면, 주소 값을 비교하게 됩니다. 맨 위에서 add를 선언할 때, 배열로 선언했기 때문에 배열의 첫 인덱스, 즉 add[0]의 주소와, scanf로 받은 user의 첫 인덱스 user[0]의 주소를 비교하게 됩니다. 둘의 주소는 같아질 수가 없기 때문에 if(user==add)는 틀린 값이 나와서 if문을 그냥 지나가게 되버립니다. (이것때문에 고생했네요)

 그래서 *user와 *add를 사용해주어야 하는 것입니다. 그렇게 네 가지의 연산자와 비교해주고 일치하는 것이 있을 때 출력하게 되는 프로그램이 완성되었습니다.

 

-strcmp를 사용하고 문제를 푸는 법

 사실 위의 방식대로 문제를 풀고 보니 문제 아래 힌트에 문자열을 비교할 때 strcmp를 사용하라고 되어 있어서, 다시 풀었습니다. 위의 방식도 결과값이 다르게 나오지는 않는데 왠지 힌트대로 풀어야할 것 같아서 다시 풀었네요ㅋㅋ 

 먼저 코드부터 보여드리도록 하겠습니다.

 strcmp의 사용법은 strcmp(s1, s2)라 할 때, s1의 문자열(string)과 s2의 문자열(string)이 일치하면 0, 일치하지 않으면 1 또는 -1을 출력합니다. 조금 더 깊게 들어가면 ASCII코드로 s1이 s2보다 크면 1, s1이 s2보다 작으면 -1을 출력합니다. 그래서 위 if문에서는 단순이 같은지만 비교하면 되기 때문에 0이거나, 아니거나로 판별하시면 됩니다. user와 add가 일치하면 아래 연산의 결과를 나타내는 방식입니다.

 

그렇게 코드를 마무리 할 수 있습니다.

 

전체 코드는 아래와 같습니다.

 

끝까지 읽어주셔서 감사합니다.

 

공감, 클릭은 작성자에게 큰 도움이 됩니다!

반응형

+ Recent posts