S 언어는 미국 최대의 전화 통신 회사인 AT&T의 벨 연구소 (Bell Laboratories)에서 존 챔버스 (John Chambers), 릭 베커 (Rick Becker), 앨런 윌크스 (Allan Wilks)에 의해 개발된 프로그래밍 언어입니다. 프로그래밍 언어는 사용 목적에 따라서 수십 가지가 존재합니다. S 언어는 특별히 통계 연산의 연구 목적으로 개발된 프로그래밍 언어 입니다.


S 언어 개발에 참여했던 존 챔버스가 "S 언어의 목적은 아이디어를 빠르고 충실하게 소프트웨어로 전환하는 것이다." 라고 했을 정도로 S 언어는 매우 유연한 자료 조작 및 변환 환경을 제공하며, 매우 뛰어난 그래픽 구현능력도 가지고 있습니다. 참고로 우리가 흔히 알고있는 유닉스 (UNIX) 운영체제와 프로그래밍 언어인 C, C++ 또한 벨연구소에서 개발된 것들입니다.

S 언어는 (S 시스템) 이후 R과 S- Plus로 나뉘어 졌는데, R과 S-Plus는 모두 S 언어를 기반으로 작성된 프로그램이라는 점에서 공통점을 가집니다. 따라서 두 프로그램은 상당 부분 상호 호환이 가능하며 R에서 사용하는 대부분의 기능, 구문들이 S-Plus 에서도 적용 가능합니다.

 


그러나 S-Plus는 상업용 소프트웨어로 그 저작권(license)이 현재 TIBCO software사에 있는 반면에 , R은 GNU 프로젝트의 GPL (General Public License)을 따르는 공개 소스 소프트웨어로 발전하였다는 점에서 차이가 있습니다. GNU 프로젝트란 무료 소프트웨어 재단 (Free Software Foundation, FSF)에서 유닉스 호환의 소프트웨어를 개발하여 무료로 배포하는 프로젝트는 의미하며, GPL은 GNU 프로젝트가 부여하는 일반 공중 사용 허가서 입니다. 따라서 GPL이 부여된 소프트웨어는 무료이며, 프로그램의 사용이나 수정, 재배포에 제약이 없을 뿐만 아니라 수정이나 재배포된 프로그램은 다시 GPL을 부여받게 됩니다. 그렇기 때문에 GPL을 따르는 R을 GNU R이라고 하며, R은 수많은 프로그래밍 기술자들과, 수학자, 통계학자 및 다양한 분야들의 전문가들에 의해 기능이 개선되고 무료로 계속 재배포되면서 발전하고 있습니다.

 

파이썬에서 부동소수점은 float로 나타내며 int와 같이 불변형입니다. 단정도(single precision) 방식에서 32비트 부동소수점을 나타낼 때 1비트는 부호 sign (1:양수, 0:음수), 23비트는 유효 숫자 자릿수 (significant digits), 8비트는 지수(exponent)입니다.

 

 

 

 

예를 들어 십진수 -118.625(10) 를 32비트 단정도로 표현해 보았을때, 먼저 숫자의 절댓값을 이진수로 변환합니다. 부호는 음수이므로 1입니다.

 

118 / 2 = 59 ... 0

59 / 2 = 29 ... 1

29 / 2 = 14 ... 1

14 / 2 = 7 ... 0

7 / 2 = 14 ... 1

3 / 2 = 1 ... 1

0.625 * 2 = 1.250

0.250 * 2 = 0.500

0.500 * 2 = 1.000

 

즉, 1110110.101(2) = 1.110110101(2) * 2^6 입니다.

 

그 다음 변환된 이진수를 다음과 같이 정규화합니다.

 

위의 숫자를 가수부(23비트)에 넣습니다. 부족한 자릿수는 0으로 채웁니다.

 

지수는 6이므로 바이어스(bias)를 더합니다. 즉, 지수 6에 127(0111 1111(2)) 더합니다.

 

6(10) + 127(10) = 133(10) = 10000101(2)

 

이상의 결과를 종합하여 -118.625(10)를 32비트 단정도로 표현한 결과는 다음과 같습니다.

 

 

 

 

배정도(double precision) 방식에서는 64비트 부동소수점을 나타낼 때 1비트는 부호, 52비트는 가수, 11비트는 지수로 나타냅니다. (단정도 방식이때 127(2^7-1)을 더하고, 배정도 방식일 때 1023(2^10 - 1) 을 더합니다.)

 

'프로그래밍 > 자료구조' 카테고리의 다른 글

[자료구조 / 파이썬] 정수, int  (0) 2019.11.14

 

 

파이썬에서 정수는 int로 나타내며 불변(immutable)형입니다. 불변형 객체는 변수와 객체 참조 간에 차이가 없습니다. 파이썬 정수 크기는 컴퓨터 메모리에 의해 제한됩니다.

 

파이썬 정수 크기는 적어도 32비트 (4바이트) 입니다. 정수를 나타내는 데 필요한 수를 확인하려면 파이썬 3.1 이상에서 int.bit_length() 메서드를 사용할 수 있습니다.

 

 

 

어떤 문자열을 정수로 변환하거나, 다른 진법의 문자열을 정수(10진법)으로 변환하려면 int(string, base) 메서드를 이용하면 됩니다.

 

 

 

int 메서드의 밑은 2에서 36사이의 선택적 인수(optional argument)입니다. 문자열 s에서 base 범위의 숫자를 벗어나는 값을 입력하면, int 메서드에서 ValueError 예외가 발생하게 됩니다. 

 

 

 

C++은 C 언어를 계승하였기 때문에 기계 지향적인 특징을 가지면서도 클래스를 도입하여 객체 지향 프로그래밍(OOP)이 가능합니다. 그 외에 메타 프로그래밍을 비롯하여 많은 프로그래밍 개념들이 도입되면서 끊임없이 발전되는 언어 중 하나입니다.

 

따라서 C++로 프로그래밍을 하게 되면 기계 지향적인 면으로 고성능, 고효율의 프로그래밍을 할 수 있을 뿐만 아니라 최신의 프로그래밍 개념들도 사용할 수 있게 됩니다.

 

C++은 Java와 C#을 비롯하여 많은 프로그래밍 언어의 탄생에 영향을 주었으며, C++만 제대로 익힌다면 Java와 C#을 비롯한 많은 프로그래밍 언어도 쉽게 배울 수 있습니다.

 

 

 

컴퓨터가 발명되면서 우리는 컴퓨터를 이용한 네트워크를 이용하는 것을 꿈꾸게 되었습니다. 기존의 라디오나 TV등은 정보수신기 역할만 하고 송신역할은 하지 못하였습니다. 직접 정보를 처리할 수는 있지만 정보를 만들어낼 수 있는 능력은 없었습니다.

 

반면에 컴퓨터는 정보처리, 수신, 송신들 이 모든 기능을 다 수행할 수 있었습니다. 이러한 다재다능한 기능덕분에 '실시간 대량 정보 전송'에 대하여 '양방향 정보 통신'의 길이 열리게 되었습니다. 대중매체에서 수용자는 일방적으로 정보를 수용할 수 밖에 없지만 인터넷 매체에서 수용자는 수용자인 동시에 정보 생산자가 될 수도 있습니다. UCC (User Creative Contents)는 정보 수용자임과 동시에 정보 생산자가 될 수 있음을 보여주는 대표적인 예입니다.

 

컴퓨터의 정보처리 기능은 방산, 군사 분야에서 먼저 쓰이기 시작했습니다. 2차 세계대전 시 연합군은 독일의 암호문(애니그마)을 컴퓨터 프로그램(M-209)을 이용하여 암호를 해독하여 승리를 할 수 있었습니다. 이처럼 컴퓨터는 빠른 데이터 처리 능력 덕분에 종전 이후에도 줄곧 군의 핵심 전술기기로 사용되었습니다. 컴퓨터들은 주로 정보처리의 효율성을 위해서 네트워크로 묶이게 되었습니다. 당시 네트워크로 묶기 위해 여러 각도에서 고심한 결과 분산형 네트워크 구조를 채택하게 되었습니다.

 

이러한 구조를 선택한 이유는 하나의 지휘 통제소가 공격을 받아서 통신 불능 상태가 되더라도 다른 경로들을 통해서 통신을 할 수 있다는 장점이 있기 때문입니다. 밑의 그림처럼 중앙집중형(centralized)의 네트워크 구조일 때 중앙에 있는 지휘 통제소가 통신 불능이 되면 모든 통신이 마비가 됩니다. 그러나 분산 네트워크(Distributed)로 구성하면 다른 여러 개의 지휘 통제소로 갈 수 있는 여러 경로가 생기기 때문에, 어떠한 공격을 해와도 안정적으로 대응을 할 수 있습니다.

 

 

 

 

 

 

군에서 사용하던 '분산형 네트워크 구조'는 인터넷에 도입되었습니다. 이 기술에 대량의 데이터를 주고받는 상업적인 용도의 네트워크 서비스를 위해서 패킷데이터 전송방식이 도입되는데, 이 기술들이 합쳐져서 최초의 시스템 ARPANET(알파넷)이 개발되었습니다. 일반적으로 알파넷을 인터넷의 전신이라고 합니다. 패킷 데이터 전송방식은 데이터를 통으로 보내지 않고, 작은 조각으로 쪼개고 나누어서 보냅니다. 이러한 방식은 여러 사용자가 동시에 데이터 통신으로 참여할 수 있어 네트워크를 대역폭으로 효율적으로 사용할 수 있습니다.

 

 

Arphanet(알파넷)

 

 


 

 

※ 오늘은 TCP/IP 소켓 프로그래밍에서 '인터넷의 역사 및 발전'에 대하여 알아보았습니다.

 

이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 네트워크 프로그래밍 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 TCP/IP 네트워크프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #TCPIP #소켓프로그래밍 #네트워크프로그래밍 #네트워크 #인터넷

'프로그래밍 > TCP, IP' 카테고리의 다른 글

[TCP/IP 소켓 프로그래밍] 네트워크 프로그램  (0) 2019.09.29

 

 

조건 기호

 

1. 조건 (Condition)

 

주어진 조건에 따라 흐름을 나눌 때 사용하는 기호입니다. 여러 개의 조건 기호를 사용하는 경우, 가능한 '예'와 '아니오'의 흐름 방향을 통일 하는 것이 알고리즘을 이해하는데 유리합니다. 하지만 흐름을 항상 동일한 방향으로 나누면 연결선이 길어지거나 엉킬 수도 있고, 흐름도를 이해하기 어려울 수 있으므로 상황에 맞게 사용해야 합니다.

 

 

서브 루틴 기호(함수)

 

2. 함수 (Function)

 

함수나 서브루티(subroutine)을 표현하기 위해 사용하는 기호입니다. 함수와 서브루틴은 거의 동일한 의미로 사용되지만, C 언어에서는 서브루틴이라는 용어를 사용하지 않습니다. 함수를 시작할 때는 다른 기호와 구별되는 기호를 사용하지만, 함수의 끝에 해당하는 반환(return) 기호는 단말(terminal) 기호를 사용합니다. 함수의 시작뿐만 아니라 함수를 호출하기 위해서는 함수 기호를 사용합니다. 아래의 예제 점선은 실행의 흐름을 나타내기 위해 사용된 것이며, 실제 흐름도에서는 존재하지 않습니다.

 

 

연결자 기호

 

3. 연결자 (Connector)

 

큰 흐름도를 여러 개의 흐름도로 나누어 표시하는 경우, 흐름도를 연결하기 위해 사용하는 기호입니다. 화살표로 연결하면 흐름도가 너무 복잡해지는 경우나 복잡한 흐름도를 여러 페이지에 걸쳐서 작성하는 경우에 사용합니다.

 

 

 

 

 

주석 기호

 

4. 주석 (Comment)

 

알고리즘과는 무관하게 흐름도 기호에 대한 설명을 추가하기 위해 사용하는 기호입니다.

 

 

준비 기호

 

5. 준비

 

기억 장소의 할당, 초깃값 설정 등의 초기화 과정을 나타내기 위해 사용하는 기호입니다.

 

 

반복 기호

 

6. 반복

 

특정 문장을 반복하여 수행하기 위해 사용하는 기호로, 표준 기호는 아닙니다. 반복 수행은 처리 기호와 조건 기호의 조합으로 나타낼 수도 있지만, 이 경우 반복 과정을 간단하게 나타낼 수 없는 경우가 많습니다. 반복 기호는 특히 C언어의 for 문장을 표시하기 위해 많이 사용됩니다.

또 다른 반복 문장인 while 문장이나 do-while문장의 경우에는 처리 기호와 조건 기호의 조합을 사용하는 것이 일반적입니다. 반복 기호의 위쪽 사각형에는 반복을 위한 조건을 기록하고, 아래쪽 사각형에는 반복적으로 수행할 문장을 기록합니다. 아래의 예제는 1부터 100까지의 정수를 더하는 알고리즘을 반복 기호를 사용하여 나타낸 예입니다.

 

 


 

 

이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #C언어 #C언어프로그래밍 #프로그램 #알고리즘 #컴퓨터의문제해결 #프로그래밍언어 #공대공부 #알고리즘이해 #흐름도 #flowchart #순서도 #의사코드

 

 

 


 

'흐름도'는 작업의 흐름을 의미합니다. 즉, 알고리즘을 표현하기 위한 다이어그램의 일종으로, 여러 가지 종류의 기호들을 화살표로 연결하여 나타냅니다. 흐름도는 알고리즘이 그러하듯이 프로그램을 위해 만들어진 것은 아닙니다.

 


 

프랭크 길브레스(Frank Gilbreth)

 

프로세스(Process) 또는 작업의 흐름을 구조적으로 표현하기 위한 방법인 흐름도는 1921년 프랭크 

길브레스(Frank Gilbreth)에 의해 소개되었습니다. 소개될 당시에는 '프로세스 흐름도(Process Flow Chart)라는 이름로 불렸습니다. 이후 흐름도는 1940년대에 이루어 허먼 골드스틴(Herman Goldstine)과 존 폰 노이만(John Von Neumann)에 의해 컴퓨터 프로그램 개발을 위한 도구로 사용되기 시작하였습니다.

프로그램을 위한 흐름도가 처음 사용되기 시작할 때는 어셈블리 언어로 프로그램을 작성하기 위한 전단계로 알고리즘을 기술하기 위해 사용되었습니다. 하지만 흐름도는 C언어와 같은 구조적 프로그래밍 언어가 등장하기 이전에 만들어졌기 때문에 문장의 실행 순서가 뒤얽혀있는 스파게티 코드(Spaghetti code)를 만들어 내는 문제점이 있었습니다.

 



 

flowchart symbol / 흐름도 기호

 



흐름도에서는 다양한 기호를 사용합니다. 마이크로소프트 사의 파워포인트를 비롯하여 흐름도 작성을 지원하는 프로그램에서는 흐름도의 표준 기호들을 제공하고 있습니다. 



단말 기호(가장 자리가 둥글다)

단말 기호


1. 단말 (Terminal)

알고리즘의 시작과 끝을 나타내기 위해 사용하는 기호입니다. 흐름도에서 시작과 끝은 반드시 존재하는 것이 좋으며, 가능한 시작과 끝은 하나만 사용하는 것이 알고리즘의 흐름을 파악하는데 용이합니다.

또한, "시작과 끝이 없는 프로그램도 존재할까?" 생각이 들 수도 있습니다. 

 

프로그램의 시작은 반드시 존재합니다. 하지만 끝이 존재하지 않는 프로그램, 동일한 동작을 무한히 되풀이하는 프로그램은 어렵지 않게 찾아볼 수 있습니다. 예를 들면 백화점의 자동문 시스템에는 전원을 내리기 전까지 사람의 접근을 검사하고 문을 여는 동작을 반복하는, 끝나지 않는 프로그램이 설치되어있습니다.

 

 

처리 기호


※ 처리 기호

2. 처리 (Process)

알고리즘의 특정 처리 단계를 나타내기 위해 사용하는 기호입니다. 기호의 내부에는 처리 과정을 기술합니다. 기술되는 내용은 흐름도의 상세 정도에 따라 '100보다 큰 첫 번째 홀수를 구한다.'와 같이 작은 단위의 작업을 표시할 수도 있습니다. 전화로 약속시간을 정하는 경우, 전화번호를 누르는 동작이나 약속시간을 정하기 위해 통화하는 과정 역시 처리 기호로 나타낼 수 있습니다.

데이터 기호



※ 데이터 기호

3. 데이터 (input / output)

입출력이라고도 불리며, 데이터 입출력을 나타내기 위해 사용하는 기호입니다. 현금 인출을 위한 알고리즘에서 비밀번호를 입력하는 과정이나 명세표가 출력되는 과정이 이에 해당합니다.



※ 오늘은 C언어 프로그래밍에서 '흐름도=알고리즘을 표현하는 도구'에 대하여 알아보았습니다.


이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.


#컴퓨터공학 #C언어 #C언어프로그래밍 #프로그램 #알고리즘 #컴퓨터의문제해결 #프로그래밍언어 #공대공부 #알고리즘이해 #흐름도 #flowchart #흐름도기호

 

 

 

 

 

TCP/IP 소켓 프로그래밍에서는 주로 네트워크 프로그램의 개발에 대한 내용을 설명합니다.정보 전달은 정보의 종류와 처리하는 방식에 상관없이 수신자, 송신자, 전령 3 가지 구성요소를 가지고 있습니다. 이중에 전령은 매체의 역할을 하며 송신자와 수신자는 정보를 만들고 해석하는 역할을 하게 됩니다. 예를 들자면 방송은 방송죽 (송신자), 전파 (전령), TV (수신자)가 있어야 합니다.

 

일반적으로 매체는 전령의 역할을 할 뿐 그 자체가 정보를 생산하거나 정보를 해석하지는 않습니다. 그러므로 매체를 통해서 전달된 정보를 저장하고, 분석하고, 분류하기 위한 프로그램이 필요합니다. 인터넷이 생기기 이전의 매체에서는 사람이 중심이 되어 프로그램의 역할을 맡아서 진행하였습니다.

 

 

 

그러나 인터넷 시대인 현재는 사람 대신에 컴퓨터가 그 역할을 맡아서 하고 있습니다. (인간의 역할 100%를 대신 한다는 것은 아닙니다.) 즉 인터넷에서는 네트워크 프로그램이 사람을 대신해서 네트워크로 전달된 정보를 저장, 분석, 처리하고 있습니다.

 

 


 

 

네트워크는 주로 '여러 객체가 얽혀서 정보를 교환하는 시스템' 이라고 말할 수 있습니다. 우리는 주로 사회 혹은 기술적인 분야에서 네트워크란 단어를 많이 듣습니다. 때문에 네트워크는 사람이 만든 인공적인 것이라고 생각할 수 있겠지만, 네트워크는 원래 자연에서 찾아볼 수 있습니다. 네트워크의 예는 생명체의 최소 단위라고 할 수 있는 세포 수준에서도 찾아볼 수 있습니다.

 

 

 

위의 그림을 자세히 보면 각 점은 하나의 정보를 저장할 수 있습니다. 네트워크를 이루지 않을 경우 저장할 수 있는 정보는 매우 한정적이지만, 여섯 점이 모두 서로 연결되어 이를 조합하면 매우 많은 정보를 저장할 수 있습니다. 한 점에서 다른 점으로 갈 수 있는 경로가 매우 다양하기 때문입니다. 또한 경로 하나가 차단되더라도 다른 경로를 이용해서 정보에 접근할 수 있으므로 안정성을 높일 수도 있습니다. 사람의 뇌를 구성하는 뉴런도 이러한 네트워크의 형태로 구성되어 있습니다. 덕분에 그렇게 크지 않은 뇌 (약 1300g)로 엄청난 양의 정보를 안정적으로 저장하고 분석까지 할 수 있습니다.

 

이처럼 네트워크를 구성하면 한정된 공간에서 정보를 더 많이 그리고 더 안정적으로 운용할 수 있습니다. 인류의 문명의 발전에 있어서도 네트워크의 활용이 지대한 영향을 미쳤습니다. 인류의 발전은 네트워크와 함께 하고 있다고 해도 과언이 아닙니다. 인간은 다른 동물에게서 볼 수 없는 사회라는 고도의 정보 네트워크를 구축해서,문화를 일구었습니다. 또한 상하수도망과 도로망도 만들었습니다. 모든 길은 로마로 통한다는 말은 네트워크의 중심이 즉 로마에 있었고, 때문에 로마가 문명의 중심에 있었기 때문입니다.

 

네트워크는 보통 정보를 전달하는 매체에 의해서 한계가 주어집니다. 이러한 한계는 대체로 물리적인 요소들 이었습니다. 도로망, 우편망은 도로 및 차량이 가지는 물리적인 한계가 있습니다. 더 좋은 도로와 더 크고 빠른 교통수단들 덕에 상당히 완화되긴 하였지만 여전히 공간과 시간의 정보전달을 방해하고 있습니다.

 

이런 공간과 시간의 한계는 전기/전자 정보통신 기술의 발전과 함께 허물어지기 시작했습니다. 전화, 라디오, TV로 이어지는 매체의 발전은 대량의 정보를 거의 실시간으로 전송할 수 있게 해줬습니다. 방송망 즉 대중매체가 탄생했기 때문입니다. 그러다가 드디어 컴퓨터를 사용하는 컴퓨터의 네트워크인 '인터넷'이 발명되었고, 20세기 후반에 나타난 인터넷은 '제 3의 물결', '정보통신 혁명'이 일어나며 새로운 산업으로 급성장했습니다.

 


 

※ 오늘은 TCP/IP 소켓 프로그래밍에서 '네트워크 프로그램'에 대하여 알아보았습니다.

 

이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 네트워크 프로그래밍 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 TCP/IP 네트워크프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #TCPIP #소켓프로그래밍 #네트워크프로그래밍 #네트워크 #인터넷

 

 

알고리즘을 이해하기 어려운 이유는 컴퓨터가 이해하는 명령을 표현하기 위한 특별한 표기법을 사용하기 때문입니다. 알고리즘은 프로그래밍 언어와 독립적이므로 알고리즘을 구성하는 문장들을 표현하기 위해서는 별도의 표기법이 필요합니다.

혼자만 이해할 수 있는 방법으로 알고리즘을 나타내는 것도 방법 중 하나이지만, 기록해두었던 내용을 시간이 흐른 후 다시 보면 기억이 나지 않는 불상사가 일어날 수도 있습니다. 프로그래밍 경험이 쌓이면 알고리즘을 생각하면서 생각한 내용을 바로 프로그래밍 언어로 나타낼 수 있습니다. 하지만 프로그램을 처음 배울 때는 바로 효과가 나타나지 않습니다. 따라서 먼저 알고리즘을 표준화하는 방법을 이용하여 기술하고, 이를 프로그래밍 언어를 사용하여 구현하는 하향식으로 프로그램을 작성하는 것이 바람직합니다.

알고리즘을 나타내는 표준화된 방법에는 여러 가지가 있지만, 알고리즘은 궁극적으로 프로그래밍 언어로 표현되어야 하므로 알고리즘 표현 방법과 프로그래밍 언어는 떼려야 뗄 수 없는 관계에 있습니다. 일상적인 언어를 사용한 문장의 나열로 나타내는 방법도 알고리즘을 기술하는 방법 중 한 가지이며, 이를 '의사 코드(pseudo code)'라고 합니다. 하지만 프로그램을 염두에 둔 의사 코드는 일상적인 언어가 아니라 프로그래밍 언어에서 사용되는 간단한 영어 단어와 기호를 사용하여 컴퓨터가 이해할 수 있는 문장으로 알고리즘을 표현합니다.

 

 


 

 

현금 인출 흐름도

 

 

A와 B의 통화를 위한 흐름도

 

 

알고리즘을 표현하는 또 다른 방법은 문제 해결의 순서와 흐름을 약속된 기호로 이용하여 그림으로 나타내는 방법으로, 이를 흐름도(flowchart, 또는 순서도)라고 부릅니다. 흐름도는 영어 단어 대신 시각적인 기호를 사용하므로 알고리즘을 직관적으로 이해할 수 있다는 장점이 있습니다. 하지만 복잡한 알고리즘의 경우, 한 페이지 내에 알고리즘을 모두 표현할 수 없고, 그림으로 나타내기가 번거로운 단점도 있습니다. 이러한 단점으로 인해 최근 흐름도를 많이 사용하지는 않지만 프로그래밍을 처음 접하는 경우에는 흐름도가 의사 코드에 비해 알고리즘을 이해하고 작성하기에는 더 쉬운 방법입니다.

 


※ 오늘은 C언어 프로그래밍에서 '알고리즘을 이해하는 법'에 대하여 알아보았습니다.

 

이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #C언어 #C언어프로그래밍 #프로그램 #알고리즘 #컴퓨터의문제해결 #프로그래밍언어 #공대공부 #알고리즘이해 #흐름도 #flowchart #순서도 #의사코드

 

 

 

알고리즘은 컴퓨터 프로그램에만 관련된 것은 아니며, 일상적인 사람의 행동 역시 알고리즘으로 표현할 수 있습니다. 즉, 컴퓨터가 문제를 해결하는 방식뿐만 아니라 사람이 문제를 해결하는 방식 역시 알고리즘으로 표현할 수 있습니다. 알고리즘은 '간단하고도 엄밀히 정의된 방식'으로 표현되어야 합니다. 현금 인출기에서 5만 원을 인출하는 경우로 예를 들겠습니다.


 

 

[현금 인출 알고리즘]

1. 카드를 넣는다

2. 비밀번호 4자리를 입력한다

3. 만약 비밀번호가 틀렸다면 카드를 받고 1번부터 다시 시작한다

4. 서비스 항목 중에서 현금 지급을 선택한다

5. 5만 원을 입력한다

6. 현금과 카드, 그리고 명세표를 받는다.

한 번도 현금 인출기를 이용해지 보지 않은 사람에게 5만 원을 찾아오라고 하였을 때 현금 인출 알고리즘을

만들었다고 생각해봅시다. 간단하고 명확하게 현금을 인출하는 과정을 알려 주어야 실수 없이 현금 인출이라는 목적을 완수하고 되돌아올 수 있습니다.

 


 

[통화 알고리즘]

1. B에게 전화를 건다

2. 통화 중이면 전화를 끊고 [1단계로 돌아간다 / 다시 전화를 건다]

3. 전화가 연결되면 B를 찾는다

4. B가 전화를 받으면 장소를 말하고 [6단계로 넘어간다]

5. B가 전화를 받지 않으면 약속 장소를 메모로 남긴다.

6. 전화를 끊는다.

상황은 A가 B에게 약속을 정하기 위해 전화를 거는 것을 알고리즘화하였습니다. B와의 통화 알고리즘에서 첫 번째 단계인 'B에게 전화를 거는 부분'을 살펴보겠습니다. B에게 전화를 거는 방법은 쉽습니다.

전화기를 들고 B에게 바로 번호를 누르면 됩니다. 하지만 컴퓨터는 'B에게 전화를 거는 문장을 알아듣지 못합니다. 따라서 '전화기를 들고', 'B의 전화번호를 누르는' 단순한 문장의 나열로 명령을 내려야 합니다. 어쩌면 '전화기를 드는' 명령 자체도 컴퓨터에게 복잡한 명령일 수도 있습니다. '손을 전화기로 가져가서', '수화기를 잡고', '수화기를 들어 올리는' 여러 개의 문장들로 나누어 명령을 내려야 전화기를 들라는 명령을 이해할 수 있을지 모르며, 이보다도 단순한 명령으로 다시 나누어야 할지도 모릅니다.

 


※ 오늘은 C언어 프로그래밍에서 '일상생활에서 알고리즘 적용'에 대하여 알아보았습니다.

 

이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #C언어 #C언어프로그래밍 #프로그램 #알고리즘 #컴퓨터의문제해결 #프로그래밍언어 #공대공부 #일상생활에서의알고리즘 #알고리즘화

+ Recent posts