C-C++/쉽게 풀어 쓴 C 언어 EXPRESS

[쉽게 풀어 쓴 C 언어 EXPRESS] 1장 정리 & 이론(Exercise) 답

최옥구 2023. 1. 8. 07:00
반응형

책의 1장의 전체적인 부분을 요약했습니다. 개인 공부 겸 책으로 공부하시는 분들이 리뷰 느낌으로 한번 더 보시면 좋을 것 같아서 작성하였습니다. 


  • 프로그램이란 컴퓨터에게 매우 다양한 작업을 할 수 있게 해주는 명령어들의 리스트이다. 
  • 컴퓨터는 범용적인 기계로서 프로그램에 따라 수행하는 업무의 종류가 매우 다양해진다. 가령 계산기는 연산을 수행하는 기능을 바꿀 수 없지만, 컴퓨터는 연산뿐만 아니라, 워드와 같은 프로그램에서는 문서작성과 처리의 업무를 수행할 수 있다.
  • 프로그램은 찰스 배비지(Charles Babbage)가 설계한 "해석 기관"을 통해 처음 시도되었다. 해석기관은 현대까지도 사용되는 4가지 핵심 부품을 포함하고있다.  (중앙 처리 장치, 메모리, 출력 장치, 입력 장치)
  • 에니악(ENIAC)은 최초의 전자식 컴퓨터로 전시에 탄도 궤적을 계산할 목적으로 구현되었다. 에니악은 10진법을 사용해서 계산하는 최초의 범용 전자 컴퓨터였지만, 설계 목적 때문에 다른 용도로 사용하기에는 매우 어려웠다는 한계가 있다. 
  • 프로그램을 데이터처럼 취급하는 개념인 프로그램 내장 구조(폰 노이만 구조)가 에니악의 결점 극복을 위해 연구되었고, 이를 적용한 최초의 컴퓨터인 에드박(EDVAC)이 탄생했다. ※폰 노이만 구조 : 프로그램과 데이터가 모두 메인 메모리에 저장 -> 메인 메모리에 저장된 프로그램에서 2진수로 되어 있는 명령어들을 순차적으로 가져와 실행.
  • 컴퓨터는 인간의 통상적 언어를 이해하지 못한다. 따라서 지시는 구체적이고 모호하면 안된다.
  • 프로그래밍 언어는 크게 3가지로 구분된다. 고급언어 -> (어셈블리어 -> 기계어) => 저급언어
  • 저급언어는 인간이 이해해서 편하게 사용하기 어려움이 있기에, 인간의 언어와 가까운 고급언어를 사용해 프로그래밍의 편리함을 더했다. 다만 이 고급언어를 기계는 이해하지 못하기 때문에 컴파일러가 이를 번역해서 전달해줘야 한다. (저급함의 저급이 아닌, 인간의 언어와 유사성에 따라 분류한 것이라고 이해하면 된다.)
  • C 언어는 벨 연구소의 데니스 리치(Dennis Ritchie)가 개발했다.
  • C 언어는 간결하고 효율적이며, 이식성이 뛰어나고 저수준과 고수준의 프로그래밍이 가능하다. 다만 언어의 설계부터 전문적인 개발용이었기 때문에 초심자가 배우기 어렵다는 단점이 존재한다. 

문제에서 요구하는 순서도는 글로 대체했습니다. 답은 유사하니 각 상황에 맞게 기호를 첨부하면 됩니다.

 

1. 컴퓨터가 사용하는 진법은 무엇인가? -  1번 2진법

 

2. 고급 언어로 작성된 프로그램을 기계어로 바꿔주는 도구는 무엇인가? - 2번 컴파일러

 

3. 문제를 해결하는 절차를 시각적으로 표현한 것은 무엇인가? - 2번 순서도

 

4. 다음 중 C 언어의 특징으로 적합하지 않은 것은? - 2번 객체지향 프로그래밍이 가능하다. (객체지향 프로그래밍은 C++, JAVA와 같은 C에서 파생된 다른 언어들이 가지고 있는 특징입니다. 객체지향을 사용하면 현대에서 사용하는 기계를 효율적으로 다룰 수 있기 때문에 이 같은 언어들의 수요가 높아지고 있습니다. C++는 설계부터 C를 포함하고 하고자 했기 때문에 상당수가 밀접한 연관을 가지고 있습니다. 따라서 C언어의 공부도 중요합니다.)

 

5. 컴퓨터를 이용하여 문제를 해결하기 위한 절차를 무엇이라고 하는가? - 알고리즘

 

6. 알고리즘을 기술할 수 있는 방법을 모두 고르라 - 1번, 2번, 3번 (4번의 디버깅은 프로그램에서 발생하는 버그들을 수정하는 행위를 말합니다.)

 

7. 순서도(flowchart)에서 처리를 나타내는 기호는? - 2번 (1번 == 수행의 시작/종료, 3번 == 판단, 4번 == 입출력)

 

8. 다음 중에서 C언어를 개발한 사람은 누구인가? - 1번

 

9. 컴퓨터에서 이미지와 음악이 어떻게 표현되는지를 인터넷에서 조사하여 보라. 

- 이미지 : 픽셀, 해상도, 레지스터, 벡터 등

- 음악 : 아날로그 형식의 곡선의 음향을 이산데이터로 표현한다.

 

10. 컴퓨터에서 10진법이 아닌 2진법이 사용되는 이유를 설명하라. - 2진법을 사용하면, 오류를 최소화할 수 있으며 효율적인 시스템 구성이 가능하다. 2진법은 0과 1로 구성되어 있는 진법으로 0을 off, 1은 on를 뜻한다. 만약 여기에 그 이상의 수가 들어오면 경우의 수는 더욱 많아져 오류 발생 가능성과 처리에 시간이 더 걸리게 된다. 

 

11. 인텔의 CPU에서 사용되는 명령어 중에서 3가지를 선택하여 무슨 일을 하는 명령어인지를 조사하여 보라.

12. 주판, 계산기, 게시판 등의 고대의 계산하는 기계들하고 현대의 컴퓨터와 결정적인 차이점은 무엇인가? 

- 현대의 컴퓨터는 프로그램에 따라 다양한 업무를 수행할 수 있는 범용적 기계이다.

13. 컴퓨터 부품을 판매하는 인터넷 쇼핑몰을 방문하여서 컴퓨터의 부품에는 어떤 것들이 있고, 어떻게 분류할 수 있는 지를 조사하라.

- 중앙 처리 장치 : CPU, 기억장치 : (주 기억 장치 - HDD, SSD 비휘발성) (보조 기억장치 - RAM 휘발성), 입출력장치 : 모니터, 키보드, 마우스 등

14. 컴퓨터를 이용하여 문제를 해결할 때, 문제를 해결하는 방법을 인간이 구체적으로 고안하여 알려주어야 한다면 왜 컴퓨터를 사용하는 것인가? 인간이 직접 하는 편이 낫지 않을까? 컴퓨터를 사용하는 경우의 장점을 들어 보라. - 컴퓨터는 인간보다 정확하며, 모호한 표현을 사용하지 않는다면 반복된 작업을 수월하게 처리할 수 있다. 또한 전기가 끊기거나 노후 등으로 인한 고장이 나지 않게 유지 보수만 된다면 지속적인 노동이 가능하다. 

 

15. 기계어, 어셈블리어, 고급 언어의 차이점을 정리해 보라. - 기계어는 2진법으로 이루어져 있고, 어셈블리어는 기계어보다 수월하게 프로그래밍하기 위해 만들어진 언어였으나, 쉽게 활용하기 어렵다는 한계가 있었다. 이 둘은 저급언어이다. 다음으로 나오는 고급 언어는 인간의 소통 방식과 와 밀접하게 영어 등의 언어로 구성되어 있으며, 종류로는 C, C++, Java 등이 있다.

 

16. C++와 JAVA는 C에다 어떤 개념을 추가한 것인가? 인터넷에서 검색해서 정리하여 보라. - 위에서 언급한 객체지향 개념을 추가하였다. 객체지향이라 하면, 붕어빵 틀인 클래스에서 붕어빵인 객체를 찍어낸다고 말할 수 있다. 쉽게 설명하면 붕어빵 틀을 여러 번 재사용을 하기도 하고 빌려주기도 하면서 서로 다른 붕어빵들을 생산해내는 것이다. 이는 객체지향 언어를 공부하면 자세하기 알게 된다.

 

17. 임베디드 시스템이란 어떤 것인가? 인터넷에서 자료를 찾아서 정리해 보라. - 임베디드 시스템이란 특정한 목적을 수행하면서 프로그래밍이 가능한 컴퓨터 시스템이라 볼 수 있다. 가령 핸드폰의 MP3, 카메라 등이라고 할 수 있습니다.

 

18. 아이폰과 안드로이드폰에서는 어떤 언어를 사용하여 애플리케이션을 개발하는지 조사하여 보라. - 아이폰은 SWIFT, 안드로이드는 JAVA를 사용했으나, 요즘은 Kotlin을 사용한 프로그래밍이 확대되고 있습니다.

 

19. 다음과 같은 일상적 행위에 대한 알고리즘을 작성하여 보라.

(A) 프린터를 이용하여 인쇄를 한다. - 인쇄 프로그램을 작동시킨다. -> 종이 여유가 있는지 확인한다 > 없으면 종이 부족 출력 / else -> 잉크가 부족하지 않는지 확인한다. > 부족하면 충전 알림 출력 / else -> 종이를 인쇄한다. 

(B) 인터넷 쇼핑몰에서 상품을 구입한다. - 쇼핑몰에서 물건을 선택한다. -> 물건의 재고가 있는지 확인한다. -> 물건을 장바구니에 넣는다. -> 배송지와 기타 사항을 입력한다. -> 결제를 진행한다. -> 결제에 오류가 없는지 확인한다.(잔액 부족 등) -> 이상이 없으면 주문을 접수하고 완료 페이지를 로드한다.

 

20. 주어진 두 수의 평균을 구하는 알고리즘을 순서도로 작성하여 보라. - 두 수의 합을 구합니다. -> 두 수의 합을 2로 나눕니다. -> 나눈 수를 평균에 해당하는 변수에 대입합니다. -> 대입한 평균이 들어간 변수를 콘솔창에 출력합니다.

 

21. 사용자로부터 원의 반지름을 입력받고 반지름에 2를 곱하여 지름을 구하고 여기에 3.14를 곱하여 원의 둘레를 계산하는 알고리즘을 순서도를 이용하여 기술하라. - 콘솔창에서 사용자에게 원의 반지름을 입력받습니다. -> 받은 반지름을 정수형으로 저장합니다. -> 반지름에 2를 곱한 값을 다시 대입합니다. -> 실수형 자료형을 가진 변수를 선언하고, 

 

22. 두 개의 숫자 중에서 큰 수를 반환하는 연산만 지원되는 컴퓨터가 있다. 이 컴퓨터에서 3개의 숫자 중에서 제일 큰 수를 찾으려고 한다. 어떤 알고리즘을 사용해야 하는가? 순서도를 그려보자. - 첫 두수 x와 y를 비교한다 -> 큰 수를 리턴한다. -> 큰 수를 새로 입력받은 z와 비교한다. -> 둘 중에 큰수를 리턴한다. -> 마지막에 남아있는 수가 제일 큰 수이다. 이를 저장한다. -> 콘솔창에 출력한다.

 

23. 두 개의 컵에 우유와 주스가 각각 담겨있다. 우유와 주스를 교환하기 위한 알고리즘을 고안하라. 사용가능한 세 번째 컵이 있다고 가정한다. - 우유와 주스 중 하나를 선택한다. (우유라고 가정)-> 우유를 비어있는 세번째 컵에 따른다.(대입) -> (프로그램상에서는 음료를 옮겼다고 해도 남아있습니다.) 우류를 옮겼던 컵에 주스를 따른다.(대입) -> 주스가 있던 컵에 세번째 컵에 있던 우유를 따른다.(대입) -> 처음과 비교했을 때 서로의 컵이 바뀌었다. 

 

24. 다음 알고리즘을 구상하여 보라.

(A) 만약 숫자들의 리스트가 주어지고 이 중에서 특정한 숫자를 찾는 알고리즘을 구상하여 보시오. 숫자들은 정렬되어있지 않다고 가정하라.  - 특정한 숫자가 나올때까지 숫자를 계속 확인한다. -> 숫자가 나오면 이를 출력하고 종료한다.

(B) 만약 숫자들이 크기순으로 정렬되어 있다면 특정한 숫자를 찾는 알고리즘을 어떻게 개선시킬 수 있는가? - 찾고자 하는 숫자의 크가가 위치할만한 곳을 기점으로 숫자를 찾는다. -> (A)번 사례보다 빠르게 숫자를 찾을 확률이 높다.

 

25. 1부터 100 사이의 정수 중에서 소수(Prime number)를 찾는 알고리즘을 생각할 수 있는가? - (소수는 1을 제외하면 나누어지지 않는 수이다. 따라서 2를 제외하고 짝수이면 안되고, 홀수 중에서 1을 제외한 수의 배수이면 안된다.) 1부터 100의 수 중에서 2를 제외한 짝수를 모두 제외한다. -> 먼저 나왔던 소수들의 배수들을 모두 제외한다. -> 남은 수들을 리턴한다.

 

반응형