방송대 컴퓨터과학과/파이썬 프로그래밍 기초

방송대 파이썬 프로그래밍 기초 - 5강. 제어구조

꼽파 2023. 4. 8. 18:19


  • 1. 제어구조의 이해

  • 2. 순차구조

  • 3. 원뿔 계산 프로그램 개선

  • 1. 제어구조의 이해

    제품 생산 공정

    제품 생산 공정 (출처: 강의록)

    설계 → 생산 → 조립 → 검사 → (정상) → 재생 → 배송 → .... 반복 

    설계 → 생산 → 조립 → 검사  (불량) → 재생 → 배송 → .... 반복 

     

    • 우리 일상에서 일어나는 일을 보면 순서대로 처리되는 구조, 상황이나 조건에 따라 다르게 진행되는 구조, 전체를 반복하는 형태의 구조를 갖고 있음.

    • 인간의 일상에서 만들어지는 구조는 프로그래밍 언어에서도 마찬가지임.


    구조적 프로그래밍 패러다임

     구조적 프로그래밍 패러다임

    - 절차적 프로그래밍 패러다임의 하위 개념

    - 네덜란드 과학자인 에츠허르 다익스트라가 처음 제안함.

    - goto문을 사용하지 않고 프로그램을 3가지 제어 구조만으로 구성하는 프로그래밍 패러다임

    - 프로그램 실행 흐름이 간결하고 작은 규모로 조직화하기 쉬움.

    · 순차구조(sequence) 구조 

    · 선택구조(selection) 구조 : if-else, switch 등

    · 반복(iteration) 구조 : for, while 등

     

     순차 구조 → [본 강의 5강]
    - 실행의 흐름을 주어지는 명령의 위치적 흐름에 따라 수행하는 구조
    - 명령 라인 위에서 아래로 흐르는 가장 직관적인 구조

     선택 구조 → [본 강의 6강]
    특정 영역 내의 명령문에 대한 실행 여부를 프로그램 실행 과정 중 결정하는 구조
    실행 여부는 조건에 따라 결정

     반복 구조 → [본 강의 7강]
    특정 영역의 명령문을 여러 번 재실행하는 구조
    반복 횟수를 조건에 따라 결정

     

    Edsger W. Dijkstra(에츠허르 다익스트라) [참고]

     "go to Statement Considered Harmful"

    - 1968년에 미국의 IT 관련 조직인 ACM(Association for Computing Machinery)에서 발표한 논문

    - goto문이 프로그램의 가독성과 유지보수를 어렵게 만든다는 이유로 goto문의 남용을 비판하는 내용을 담음.
    - 프로그램의 실행 흐름이 복잡하게 얽혀있는 '스파게티 코드(Spaghetti code)'라는 형태의 프로그램을 비판함.

    - 더 간결하고 구조화된 프로그래밍을 위한 패러다임의 필요성을 강조함.

    → 1972년 튜링상 수상, 프로그래밍의 발전과 현대적인 소프트웨어 개발 방법론의 기반 마련에 큰 영향을 미침.


    2. 순차구조

    순차 구조

    - 실행의 흐름을 주어지는 명령의 위치적 흐름에 따라 수행하는 구조
    - 명령 라인 위에서 아래로 흐르는 가장 직관적인 구조


    삼각형 출력하기

    다음과 같이 삼각형 모양으로 *을 출력하는 프로그램을 작성하시오.

    별 삼각형 (출처: 강의록)

    input함수는 사용자로부터 값을 입력받으면 그대로 출력함.


    사용자 입력

     input : 사용자로부터 데이터를 입력받는 함수
    - 입력 데이터를 문자 데이터 타입으로 반환
    - 함수의 파라미터는 입력 안내문의 목적으로 사용

    input으로 받은 숫자(문자)와 input으로 받은 숫자를 정수형으로 변환(정수)해준 결과가 다름.

    인용부호('')의 유무에서 차이가 나는 걸 볼 수 있음.

    사용자 입력을 통해 받아들인 데이터는 전부 문자형으로 들어온다

    type함수를 통해 입력한 숫자 10은 str(문자)임을 알 수 있음.

    숫자 10이 아니고 문자 1,0이 나란히 있는 걸로 인식하기 때문임.


    프로그래밍 에러

    설계 미숙, 결함 또는 문법 오류로 프로그램이 의도한 대로 결과를 생성하지 못하는 문제

     

    구문 오류(syntax error) :

    - 문법 체계에 적합하지 않는 명령문 입력 시 발생

    - 가장 찾기 쉬운 오류임. 프로그램 자체에서 오류를 표시하는 기능이 있음.

    ex. print()함수에서 소괄호 하나를 빼먹은 경우

    SyntaxError

     

     실행 오류(runtime error) :

    - 논리적으로 실행 불가능한 명령문 작성 시 발생

    - 문법적인 오류는 없으나 값을 처리할 수 없어서 오류가 난 경우

    ex. TypeError(자료형의 불일치), ZeroDivisionError(0으로 나눔), NameError(설정하지 않은 변수 처리), IndexError(리스트에 존재하지 않는 값을 입력함) 등

    ZeroDivisionError
    NameError
    TypeError
    IndexError

     

     의미 오류(semantic error) : 

    - 의미적으로 잘못 해석되는 명령문 작성 시 발생
    - 정상적으로 결과값이 나오긴 했지만 작성자가 원하는 답이 아님.

    → 사람이 직접 검출해야 하므로 찾기 어려움.

    ex. 1부터 10까지 더해야하는데 1부터 9까지 더한 경우


    데이터 타입 변환

    데이터 타입을 다른 타입으로 전환
    - 문자열 타입으로 변환 : str함수
    - 정수 타입으로 변환 : int 함수
    - 소수 타입으로 변환 : float 함수


    print 함수의 확장

    여러 개의 데이터를 단일 함수로 출력 가능
    콤마(,)로 파라미터를 구분하여 입력
    - 데이터 사이에 공백(기본값)이 자동으로 추가 
    - sep 옵션을 변경하여 공백 변경 가능

    콤마와 파라미터 사이의 공백을 없애고 붙여서 씀.

    → 콤마로 구분되는 곳마다 공백이 자동으로 출력되어 나옴.

     

    • sep 옵션

    - print() 함수에서 출력되는 파라미터들 사이에 삽입되는 구분자(separator)를 지정하는 옵션
    - 기본적으로 sep은 공백 문자열(" ")로 설정되어 있어서, 파라미터들 사이에 공백이 자동으로 추가됨.

    - sep을 사용하여 다양한 구분자를 지정할 수 있음.

    print()함수에서 sep옵션

     

    • end 옵션 [참고, 수업X]

    - print() 함수에서 출력의 에 추가되는 문자열을 지정하는 것
    - 기본적으로 print() 함수는 출력 후에 줄바꿈(newline)을 추가함.
    - end 옵션을 사용하면 줄바꿈 대신 다른 문자열을 지정할 수 있음.

    print()함수에서 end옵션
    5강 연습문제 예시 (출처: 사이트)
    5강 연습문제 출력결과

    보기 3번은 print함수를 한 줄만 적어 놓았기 때문에 사용하는 의미가 없음.

    sep="" 큰따옴표 안에 있는 그대로 구분자가 생성됨.

    → 공백을 없애려면 큰따옴표 사이의 공백을 없애면 되므로 답은 4번임.

     

    • documentation은 프로그래밍에서 크게 필요없는 듯 보이지만 보기 좋은 결과를 만들기 위한 중요한 요소


    3. 원뿔 계산 프로그램 개선

  • 1) input 함수 사용

  • 2) 자료형 변환, 함수의 중첩

  • 3) print함수 확장, sep옵션으로 구분자 변경

  • 1) input 함수 사용

    실행 오류의 예시

    사용자로부터 반지름과 높이를 입력받아서 계산하고 싶음.
    → input 함수를 사용하여 입력받는 것을 성공함.
    → 실행 결과 오류가 남.

     

    input 함수를 통해 정수 30을 입력함

    → rad에 들어가는 변수값은 (숫자가 아닌) 문자 형태 30

    → 정수 30으로 변환해주는 것이 필요함 (데이터 타입 변환의 필요성)


    2) 자료형 변환, 함수의 중첩

    rad = input("반지름의 길이를 입력하세요") ---------- input으로 숫자를 입력받아 rad에 넣음.
    rad = int(rad)  ---------- 입력 받은 rad값을 다시 int를 통해 정수형으로 바꿔줘야 함.

     

    함수의 중첩을 통해 두 줄짜리 코드를 한 줄로 바꿀 수 있음.

    rad - int(input("반지름의 길이를 입력하세요: "))

     

    입력한 값대로 계산은 잘 되는데, 어떤 값이 무엇을 의미하는지 모르겠음.

    → 출력된 값에 대한 설명이 나오도록 하고 싶음.

    → print함수에 여러 개의 파라미터를 넣어서 친절한 보고서 만들기


    3) print함수 확장, sep옵션으로 구분자 변경

    print 함수에서 각 파라미터 값은 콤마(,)로 구분됨.

    콤마 사이에 들어가는 구분자는 sep옵션으로 변경해서 파라미터 사이의 공백을 없앤 후 필요한 곳에만 공백을 넣음.

    원하는대로 결과가 나왔음.

    728x90