LimHanseong / LimHanseong-2022

청주대학교 2022년도 2학기 공학컴퓨터프로그래밍 학습 및 레포트/프로젝트 제출
BSD 3-Clause "New" or "Revised" License
0 stars 0 forks source link

6nd week Problem Solving #6

Open LimHanseong opened 2 years ago

LimHanseong commented 2 years ago
  1. 일정 크기의 배열을 선언하고, 임의의 비밀번호를 배열에 입 력 받아 시스템에 저장되어 있는 비밀번호와 일치하면 “normal termination..” (의미: 정상적인 종료)를 출력하고 일 치하지 않으면 “not matched, retry..” (의미: 다시 입력하세요) 를 출력하여 비밀번호를 재입력받는 프로그램을 작성하시오. Prob_1(flowchart)

문제 해결을 위해 그린 순서도이다. 처음엔 메인문에 모든 코드를 넣어 프로그램을 짰다. 다음은 여기에 함수를 이용해보기 위해 만든 순서도이다. Prob_1(flowchart2)

이 순서도를 기반으로 코드를 마무리 지었다.

Prob_1(실행사진)

이번 문제를 푸는데 처음 막혔던 곳이 조건문을 만드는 것이었다. 문자열 끼리 저장된 값을 비교할 때 기존에 알고 사용하던 연산자로는 계산이 안됐다. 처음에는 이것이 문제인지 모르고 입력한 값이 계속해서 틀렸다는 메세지만 나와 당황했다. 무엇이 문제인지 검색을 해보던 중 string헤더 파일을 가져와서 strcmp()라는 문자열을 비교하는 함수를 사용하면 해결할 수 있다는 것을 알게 되었다. 이 함수는 두 문자열이 같으면 0을, 같지 않으면 0이 아닌 값을 반환하는 함수다. 두번째로 막혔던 것은 문자열로 선언한 배열에는 define으로 선언한 매크로가 저장되지 않는다는 것이었다. 비밀번호 값을 define으로 선언하여 고정하려고 했는데 되지 않아 const를 이용하여 값을 고정했다. 무한반복문을 사용해볼 수 있었던 문제, 포인터를 사용해볼 수 있었던 문제, 새로운 헤더파일과 함수를 알 수 있었던 문제였다.

  1. 일정 크기의 배열을 선언하고 무작위 정수를 자동으로 배열에 저장한 다음, 해당 배열에서 평균, 분산, 표준편차를 계산하는 코드를 작성하시오. Prob_2(floechart) 문제 해결을 위해 작성한 플로우 차트
Prob_2(실행사진)

평균, 분산, 표준편차 함수를 각각 만들어 사용자가 원하는 계산을 입력하면 계산 값을 보여주는 방식의 프로그램을 짰다. 이번 프로그램을 작성하면서 새롭게 알게된 헤더 파일은 math.h이다. 루트 계산(sqrt)을 사용하기 위해 불러온 헤더파일이다. 랜덤넘버 생성을 위해 교수님이 올려주신 코드를 거의 그대로 가져와 사용했지만 코드가 어떤 원리로 돌아가는지 이해하고 사용했다. 그 과정에서 time 헤더 파일을 왜 가져왔는지 알게 됐다. rand함수는 난수를 반환하는 역할을 하는데 시드넘버를 바꿔주지 않는 이상 한 번 선언하면 그 숫자를 계속해서 선언한다. 그래서 srand를 이용해 rand함수를 초기화 시켜주는데 srand에 매초 값이 변하는 time을 시드로 사용하여 rand를 매번 다른 시드넘버로 초기화 시켜주는 방식이었다. time을 사용하여 매번 다른 시드넘버가 생성되는 방식이 기발하다는 생각이 들었다. 플로우 차트를 작성하면서 조건문과 무한반복문이 많아지니 굉장히 복잡하고 그리기 까다로웠다. 함수를 호출하고 값을 반환하는 과정을 어떻게 표현할까 찾아보다가 점선으로 그리기가 어려워 다른 색으로 표현해줬다.

  1. 임의의 nm 정수 행렬 1개, mn 정수 행렬 1개를 자동으로 생성하여, 두 행렬의 곱을 계산하시오. Prob_3(flowchart) 문제 해결을 위해 작성한 플로우 차트
Prob_3(실행사진)

랜덤 넘버를 사용하는 것은 2번 문제와 동일한 방법을 사용하였다. 2차 배열에 정수를 입력해주기 위해서 어떻게 해야될지가 가장 큰 고민이었다. 해결해보고 보니 그렇게 큰 고민이 필요했나 싶긴 했지만 꽤 오랜 시간을 여기에 사용한 것 같다. 하지만 2차 배열의 구조를 그림으로 그려보니 어려운 문제가 아니었다. 열을 하나 정해주고 행을 채워주면 되는 문제였다. 중첩 for문을 통해 쉽게 해결할 수 있었다. 그 이후는 꽤 수월했다. 중간에 한가지 어려웠던 점은 2차배열을 포인터로 가리키는 방법을 몰랐던 것이 문제였다. 이것은 인터넷 검색을 통해 공부하였고 방법을 알게 되었다. 2번 문제를 해결하면서 결과값을 매번 printf를 활용해 출력하니 코드 길이가 쓸데없이 길어지는 느낌이었다. 그래서 강의자료를 참고해 print함수를 따로 선언하여 프린트를 했다.

  1. 임의의 1차원 정수배열을 입력 받아 이것을 내림차순, 오름차순으로 정렬하는 프로그램을 작성하시오. Prob_4(flowchart) 문제 해결을 위해 작성한 플로우 차트
Prob_4(실행사진)

처음에 코드를 구상할 때 숫자를 비교하고 더 작은 수로 판별되면 그 숫자를 출력하는 식으로 해결해보려고 했는데, 그렇게 되면 가장 작은 수가 먼저 출력되고 하는 식이 아니었다. 그래서 고민하면서 강의 자료를 찾아보던 찰나에 스왑하는 함수를 보게 되었다. 그래서 그 함수를 이용하여 이 문제를 해결하게 되었다. 그리고 이것도 역시 오름차순을 출력할지 내림차순을 출력할지 선택한 것을 입력 받아 보여주는 식으로 작성하였다.

  1. 당신은 공군 방공포병 기지에서 복무하고 있다. 어느 날, 상부로부터 특정 미사일의 예상 명중률을 계산하라는 명 령을 지시받았다. 해당 값을 구하기 위해 필요한 정보는 아래와 같으며, 정보를 활용하여 지시 받은 예상 명중률을 계산하는 프로그램을 작성하시오. Prob_5 순서도 최종 문제 해결을 위해 작성한 플로우 차트
Prob_5(실행사진)

여러 번 실행해보았다. 작게는 40% 초중반, 크게는 60%중후반 까지 나온다.

이 문제를 해결하면서 math.h에서 사용할 수 있는 다양한 연산함수들(sqrt, pow, log 등등)을 사용해볼 수 있었고, M_PI값을 쓰기 위해 math.h를 선언하기 전에 #define _USE_MATH_DEFINES을 선언해줘야 한다는 사실도 알게 되었다. 문제 해결을 위해 세운 수식이나 조건문이 맞는지 실행하고 확인하는 과정에서 main소스 파일을 훼손하지 않기 위해 코드창을 두 개 띄워놓고 문제를 해결했다. 많은 우여곡절이 보조 실행파일에도 담겨있어 Github에 같이 업로드 해놓았다. 어려웠던 부분은 수식들을 코드로 구현해 내는 것이 첫 번째였다. 정규분포를 얻기 위해 몇가지 수식이 필요했는데 여러 연산 함수들이 필요했고, 식이 복잡했다. 적어놓고 제대로 적었나 확인해보기 위해 공학계산기를 이용해서 여러번 검토했다. 두 번째는 문제를 해석하고 어떻게 코드를 짤 것인지 결정하는 것이었다. 그 전에는 해결해야할 문제들이 누가 봐도 코딩문제이고, 어떤 것을 활용해서 구현해야되는지 문제에 답이 있엇다면, 이번 문제는 처음부터 끝까지 스스로 생각하고 결정해서 해야했다. 구해야 하는 값과 조건들만 주어지고 코드에 대한 힌트는 거의 없어서 어려웠다. 많은 부분에서 구글링이 필요했다. 이 점이 나에게 문제가 어려웠다는 것을 보여주기도 했지만, 구글링을 통해 따로 추가적인 공부하는 느낌도 들어서 좋았다.

@swcho84