안녕하세요
프로그래밍 언어 개념 연습문제 6장 본문
01. 몇몇의 프로그래밍 언어에서는 특별한 언급이 없는 한 식별자의 길이를 제한하고 있다. 그 이유가 무엇인지를 알아보아라. 또한, 식별자의 첫 번째 문자를 영문자로 시작하도록 제한하고 있는 이유도 밝혀라.
그 이유는 각 프로그래밍 언어의 컴파일러 때문이다. 컴파일러가 소스코드를 실행 가능한 기계어로 번역한다. 식별자의 길이가 무제한이라면 프로그래밍 하는데 있어서(코드작성) 너무 긴 식별자를 사용함으로써 불편을 야기 시키며, 긴 식별자의 사용으로 인한 오타로 인해서 컴파일시 에러가 발생할수 있으며, 디버깅에 많은 문제점을 야기시킨다. 식별자의 첫 문자를 숫자로 시작하면, 이 식별자가 식별자인지 숫자인지 컴파일러가 구별하기 어렵기 때문에 첫 번째 문자를 영문자로 시작하도록 제한한다고 할수 있겠다.
02. Pascal, C, Java에서 다음과 같이 속성들의 정확한 바인딩 시간을 조사하고, 그 이유를 논하라.
(1) 실수의 자릿수
언어의 구현 시간에 바인딩 된다. 실수의 유효숫자나 한곕 값에 관한 것은 언어를 구현할 때 바인딩이 된것이다.
(2) 문자형의 의미
문자의 자료형이 프로그램 작성시에 확정되는데 이 경우 기계에서는 번역시에 알게되어 변수의 형은 번역시간에 바인딩 된다.
(3) 배열 변수의 크기
해당 기억장소의 확정은 언어의 번역시간에 바인딩 된다.
(4) 배열 매개변수의 크기
형식 매개 변수와 실매개 변수간의 바인딩은 실행시간에 바인딩 된다.
(5) 지역 변수의 영역
실행시간 바인딩
(6) 상수의 값
가령 숫자 10은 언어의 정의시간에 바인딩 된것이고, 이상수10이 실제 기계에 어떻게 표현되는지는 언어의 구현 시간에 바인딩된 것이다. 또 한 그 방법에 따라 해당 기억 장소에 상수 10의 값을 넣는 바인딩은 대다수의 프로그래밍 언어에서는 번역 시간에 이루어진다.
(7) 함수의 영역
실행시간 바인딩
03. 다음 문장에 대한 여러분의 생각을 논하라.
"바인딩이 번역 시간에 발생하는 언어는 언어의 안전성(security)과 효율성(efficiency)을 보장하고 실행 시간에 바인딩이 발생하는 언어는 언어의 유연성(flexibility)과 표현력(expressiveness)을 보장한다."
바인딩은 프로그램의 기본 단위인 실체에 부여될 수 있는 여러가지 속성 중 일부를 결정해 주는 행위이다. 실체에 속성이 언제 부여되는지 시간에 따라 바인딩은 구분된다. 주로 번역기 언어(compiling language)의 중요한 속성은 번역시간에 바인딩(compile time binding)이 일어나는데, 번역시간은 번역, 링크, 로드시간을 포함한다. 바인딩에는 주로 변수나 자료구조의 형과 크기, 레코드 항목들의 형 확정과 기억장소의 할당 등이 속한다. 변수의 값을 확정 해 주거나, 변수나 자료구조의 기억장소 할당 행위, 형식매개변수나 실매개변수 간의 관계와 지역변수의 기억장소 할당 등 대부분 실행시간(run time)에 바인딩(dynamic binding) 된다.
예를 들면 int a[10];은 번역시간에 자료형을 정수로, 자료의 크기는 10개의 정수형 크기로, 참조주소 address를 0≤address≤9로 바인딩하고, a[9]=10; 은 실행시간에 할당된 정수형 메모리 a[9]에 정수값 10을 배정한다. 변수 a의 생성 및 소멸시기는 선언 블록이 활성화되는 시기와 종료되는 시점에 결정된다. 이 밖에 언어의 정의시간과 구현시간에 언어의 속성을 바인딩하는 경우도 있다.
그렇기 때문에 “바인딩이 번역 시간에 발생하는 언어는 언어의 안정성(security)과 효율성(efficiency)을 보장하고 실행 시간에 바인딩이 발생하는 언어는 언어의 유연성(flexibility)과 표현력(expressiveness)을 보장한다“고 생각한다.
04. 동적 자료형 바인딩의 장단점은 무엇인가?
장점 - ① 타입이 선언문에 명세되지 않는다. - 배정문에서 값이 변수에 배정될 때 타입
이 변수에 바인딩된다.즉 실행될 때 배정받는 변수는 배정문의 우변의 값인,
변수,식의 타입에 바인딩된다.
② 상당한 양의 프로그래밍의 유연성 - 어떠한 타입의 데이터가 입력되더라도 처
리 할 수 있다.
단점 - ① 컴파일러의 오류 탐지 능력이 정적 타입 바인딩보다 낮다.
② 실행시간에 비용이 많이 소요
05. 프로그래밍 언어를 구현하는 데 있어서 주요 속성들에 대한 바인딩 시간이 달라짐에 따라 언어가 가질 수 있는 장단점을 비교 설명하라.
① 실행시간의 바인딩되는 경우
- 장점은 메모리 사용이 적으며,적응성이 좋다.
- 단점은 실행시간이 느리다는 것이다.
② 번역시간의 바인딩되는 경우
- 장점은 실생시간이 빠르며,효율성이 좋다.
- 단점은 메모리 사용이 크다.
06. 선언문의 사용할 때의 장점과 단점을 설명하고, 각 프로그램 언어에서 정의하고 있는 선언문의 형식을 조사하라.
① 선언문을 사용할 때
- 장점 : 주기억 장치 사용과 접근 방법의 효율성 증가하고, 주기억 장치 경영의 효
율성이 증가한다.
-단점: 프로그래밍의 복잡성이 증가한다.
② 선언문을 사용하지 않았을 때
-장점: 선언을 생략함으로써 획득할 수 있는 유연성 부족, 프로그래밍 단순화 자료
구조를 구축하고 처리하는데 큰 유연성이 허용된다.
-단점: 프로그램 실행 시간 지연(동적 형 검사), 자료 표현상의 효율 저하, 복잡한 기 억 장소 경영 기법을 사용한다.
③ Lisp,APL, Snobol 4 는 선언문을 전혀 사용하지 않는다.
④ Java,C,Fortran,Algol,Pascal 등은 모든 자료에 관해서 선언을 해야한다.
07. 묵시적 선언의 장단점은 무엇인가?
① 묵시적선언 - 변수 선언 없이 즉시 사용(사용하는 순간에 자동적으로 인식)
장점: 변수선언 없이 사용함으로써 프로그래밍(코드작성)하는데 편하다.
단점: 선언문에서 선언하지 않을 경우 철자 오류나 오류를 탐지하는 것을 방해하므로
신뢰성이 낮다.
② 명시적 선언 - 사용 전에 변수 선언
장점: 코드 알기 쉽고, 버그 감소
단점: 선언 없이 변수를 사용하면 오류가 발생한다.
08. 프로그래밍 언어별로 사용하고 있는 배정 연산문을 나열하고, 그 배정문에서 허용되는 형변환 연산을 설명하라.
-단순배정문 : Fortran, Basic, PL/I, C, C++, Java - 배정 연산자에 대해서 동등기호 사용
PL/I, Basic: 동등기호가 관계 연산자로 사용시 혼돈된다.
ex) A =B =C
C, Java : = 대신에 ==등을 사용하여 중복문제를 피함
Algol : := 처음 사용
-다중 목적지 배정문 : 식 값을 한 개 이상의 목적지 변수에 배정하는 것을 허용
ex) PL/I
-조건 목적지 배정문: C++, Java
-복합 배정 연산자 : Algol 68 도입, C: 필요한 이항 연산자를 = 연산자에 접합시킨 형태
C, C++, Java : 이항 연산자에 대해서 복합 배정 연산자를 제공
-단항 배정 연산자, 식으로서의 배정문 : C, C++, Java
-혼합형 배정문 : Fortran, C, C++ - 묵시적 형 변환 규칙을 혼합형 배정에서 사용한다.
Pascal : 배정문에 몇 개의 묵시적 형 변환을 제공.
integer 값은 real변수에 배정 될 수 있으나 반대는 허용 안된다.
Ada, Modula-2 : 혼합형 배정을 허용하지 않음
Java : 요구된 변환이 확장 형 변환인 경우에만 혼합형 배정을 허용
혼합형 배정문을 허용하는 모든 언어에서 묵시적 형 변환은 우변 식이 평가된 후에 일어난다.우변에 있는 모든 피연산자를 평가하기 전에 목적지 형으로 묵시적 형 변환된다.
09. C의 배정 연산(예를 들면, +)이 다른 언어에서 제공되어야 하는가? 그 이유를 제시하시오.
제공되면 좋을것같다. 제공됨으로써 코드의 단편화가 기대되며, 프로그래밍 코드작성이 용이하다.
10. C의 단일 피연산자 배정 형태(예를 들면, ++count)가 다른 언어에서 제공되어야 하는가? 그 이유를 제시하시오.
단일 배정 연산자라 함은 앞에 오는 전위 연산자와 후위의 연산자로 사용되는데 예를 들어서 sum=++count라는 구문이 있을 count의 값은 1만큼 증가된후에 sum에 배정된다. 이는 프로그램의 언어 설계 기준에서 효율성을 생각한다면 다른 언어에서도 제공되어야 할것 같다.
11. 다음 C 프로그램을 생각해보자.
int fun (int *i) {
*i += 5:
return 4:
}
void main() {
int x = 3:
x = x + fun(&x):
}
다음의 각 경우에, main에 포함된 배정문이 실행된 후 x의 값은 무엇인가?
(a) 피연산자가 왼쪽에서 오른쪽 순서로 평가된다.
3 + 8 이 계산되어 x의 값이 11이 된다.
(b) 피연산자가 오른쪽에서 왼쪽 순서로 평가된다.
8 +8이 계산되어 x의 값이 16이 된다.
12. Ada와 Java에서 허용되는 혼합형 배정에 관해 논하라.
Ada는 혼합형 배정을 허용하지 않으나 Java는 요구된 형 변환이 확장형 변환인 경우에만 혼합형 배정을 허용하게된다.
13. ℓ-value와 r-value의 의미를 설명하라.
예를 들어서
①A가 배열이라면
ℓ-value는 A[i]의 배열A에서 I번째 원소의 위치를 의미.
r-value는 A[i]의 그 위치에 저장되어 있는 값을 의미한다.
②P가 포인터인 경우,
ℓ-value는 P자신의 값이 들어 있는 위치를 의미
r-value는 P가 지적하는 위치
14. 복합 배정 연산자의 목적은 무엇인가?
목적 : 배정문의 일반적으로 필요한 형태를 축약하여 표현.
산술 연산자의 복합 배정 연산자
+= ===> a += b == a = a + b
-= ===> a -= b == a = a - b
*= ===> a *= b == a = a * b
/= ===> a /= b == a = a / b
%= ===> a %= b == a = a % b
15. 변수의 초기화를 행하는 방법을 프로그래밍 언어별로 조사하여 보아라.
① pascal : 본질적으로 초기화의 특징을 제공하지 않는다
② Algol 68 : real root := 1.4142135에서 root2를 실수 속성을 갖는 변수로 선언한 뒤 1.4142135의 값으로 초기화한다.
③ Fortran : DATA문들 번역 시간에 변수들에 주어진 값을 저장한다.
④ Ada : 초기화가 선언된 블록이 실행될 때마다 매번 초기화시키는 특징을 제공, 패키지 를 사용하여 오직 한 번의 초기화만을 행하는 방법 제공, 상수와 변수의 초기값
선언 방법에 단일화된 표기법 제공한다.
⑤ Java : 예악어로 const는 확보했으나 사용하지 않고 기억 장소 속성을 가지고 상수 선
언을 한다. 초기값 선언시 Java의 배열은 객체로 취급하여 생성문 new의 사용
이 요구된다.
16. 상수명 사용의 장점은 무엇인가?
장점: 판독성과 프로그램 신뢰성을 향상된다.
17. 프로그래밍 언어에서 상수의 개념을 일반화하면 단일배정 변수(single-assignment variable)이다: 값이 어느 지점에서든지 계산될 수 있지만 단 한번밖에 배정되지 못하여 계산된 값이 상수로 남아 있는 변수로 생각할 수 있다. Pascal, Modula-2, Ada에서의 상수 선언과 비교하여 이러한 일반화의 유용성에 대해서 논하라. 이러한 개념은 단일 모듈에 진입할 때마다 다시 정의되는 동적 상수와 어떤 관련이 있는가?
상수의 바인딩이 프로그램 언어 번역시간에 일어 나는 대신에 진입할 때 마다 다시 선언되어지는 동적 상수는 실행시간에 바인딩이 일어 나기 때문에, 상대적으로 실행 횟수와 효율성에서 차의가 나게 된다.
18. 연산자 우선순위 규칙과 연산자 결합 법칙을 정의하시오.
① 연산자 우선순위 규칙: 우선 순위가 같은 연산자들이 함께 사용했을 때 어떤 연산자를
먼저 선택할 것인가를 결정해 주는 규칙
② 연산자 결합 법칙 : 결합 법칙은 같은 순위를 갖는 연산자가 여러 개 나타날 때 왼쪽
에서 오른쪽으로 계산해 가는 좌측 결합(left associativity)과 오른
쪽에서 왼쪽으로 계산해 가는 우측 결합(right associativity)이 있
다. 대부분의 연산자는 식에서 먼저 나타난 순서대로 계산하는 좌
측 결합을 만족하나 우측결합을 만족하는 연산자도 여러 개 있다.
우측 결합을 하는 연산자는 그 의미에 주의해서 프로그램을 작성해
야 한다.
19. 피연산자 평가 순서와 함수적 부수효과가 어떻게 서로간에 영향을 미치는가?
① 함수의 리턴 값에 의해서 연산 순서에 따라 전체 식의 결과가 달라지게 된다
② 함수 인자나 전역 변수의 변경에 대해 인자 중 하나가 변경되거나 전역 변수가 변경될
때 부작용을 가진다.
function change(var x: integer) : integer
begin
a := 10; (* 전역 변수의 변경 *)
x : = x + 1; (* 실인자의 대치 *)
return (x);
end
따라서, 다음은 결과 y := 3 또는 y := 4를 낼 수 있다.
z : =1;
y := z + change(z);
또 다른 예에서 a의 값이 검색될때에 따라 그 결과 y := 13 또는 y:=4를 리턴할 수 있다.
a := 1;
z := 2;
y := a + change(z)
<부작용의 해결방법>
① 언어는 부작용을 갖는 함수의 사용을 금지하거나 부작용을 일으키는 식의 결과값은 정의되지 않게 하는 것이다. 또는 함수가 자신의 매개변수를 변경하는 것이나 전역 변수를 바꾸는 것을 금한다. 즉, 부작용 자체를 근본적으로 막는 것이다.
② 언어는 부작용의 존재에도 불구하고 결과를 일정하게 결정하는 식의 평가 순서를 정의하는 방법이다. 부작용의 결과를 프로그래머가 예측할 수 있게 하는 이 방법은 여러 최적화 기법을 포기하게 하는 문제가 있다.
20. 단락회로 평가란 무엇인가?
식의 결과가 모든 피연산자와 또는 연산자를 평가하지 않고도 결정되는 평가를 말한다. 예를 들어 (13*A)*(b/13-1) 에서 A가 0이면 (b/13-1)의 값에 관계없이 식의 값이 결정되는것이다.
21. 불리안 식에 대해서 단락회로 평가를 항상 수행하는 언어를 제시하시오? 불리안 식에 대해서 단락회로 평가를 수행하지 않은 언어를 제시하시오. 프로그래머가 이름 선택하도록 허용하는 언어를 제시하시오.
C언어에서는 수치값이 불리안 값을 표현한다. 즉, 0이면 거짓, 그 외는 모두 참이 되는 것이다.
Pascal에서는 불리안 식에 대해서 단락회로 평가를 수행하지 않는다. 예를 들면,
index:=1 while (index<=listlen) and (list[index]<>key) do index:=index+1;
-> while문의 불리안식에서 두 관계식이 첫번째식의 값에 관계없이 모두 평가되어 key 가 list에 포함되어 있지 않으면, 위의 프로그램은 점차 영역이탈 오류가 발생
-> 단락회로 평가를 제공하고 단락회로 평가가 사용되면 위의 코드는 문제를 야기하지 않음
Ada에서는 프로그래머가 단락회로 평가를 지정
Ada 는 and then 과 or then 연산자를 사용하여 단락회로 평가를 지정할수 있음
INDEX:=1; while(INDEX<=LISTLEN) and then (LIST(INDEX)/=KEY) loop INDEX:=INDEX+1; end loop;
-> 위 코드는 KEY 가 LIST에 포함되어 있지않고 INDEX 가 LISTLEN 보다 클경우에도 오류를 발생하지 않음
22. C가 관계식과 불리안 식을 어떻게 지원하는가?
C의 관계식 <,>,<=,>=,==,!=,!,&&,||를 제공하고 있다.
C에서는 0은 거짓을 의미하며, 0이외의 모든 값은 참을 의미 한다.
23. 모든 연산자 우선순위 규칙을 제거하고, 괄호를 사용하여 식에서 요구된 우선순위를 표현하는 것이 좋은 생각인가? 그 이유를 제시하시오.
좋지 않은 생각이라고 생각한다.
예를 들어
① 2 + 5 * 3 = 17
② (2 + 5) * 3 = 21 식이 있다고 하자.
연산자 우선순위 규칙에 의하면 ①번 식의 결과가 17이라는 결과가 나온고 ②번은 21이라는 결과가 나온다.
하지만 이러한 연산자 우선순위 규칙을 제거한다고 했을때 가령 ②번식처럼 괄호를 사용해서 표현을 했을때 연산자 우선순위 규칙을 제거했기 때문에 괄호안의 식이 우선인지 괄호밖의 *3이 우선인지 구분할 수 없다.
24. 표준 Pascal은 불리안 연산자에 대해 단락회로 평가를 하지 않도록 정의되어 있지만, 몇몇 Pascal 컴파일러는 불리안 식에 대해 단락회로 평가를 사용한다. 당신이 가진 Pascal 컴파일러가 and와 or에 대해서 단락회로 평가를 하는지 하지 않는지 를 검사하는 프로그램을 작성하라. 또한 C의 논리 연산자에서 단락회로 평가가 사용되었는지를 검사하는 프로그램을 작성하라.
풀이 5.21에서 예시 제시.
25. C++의 for 문과 Java의 for 문간의 차이점은 무엇인가?
자바의 for문은 C 또는 C++과 유사하고, 조건이 부합될 때까지 계속해서 반복 수행 한다.
차이점:
① 자바의 for문은 지역변수 설정하고, 그 값을 초기화하여 for문장을 사용한 후 for문 벗
어나면 그 지역변수는 삭제.
② 특히 중첩된 반복문을 한번에 탈출하기 위해 continue나 break에 레이블을 달아서
사용할 수 있습니다.
아래의 예제처럼
for(int i = 1; i < 10; ++i) { sum = sum + i; }
이처럼 for 반복문의 제어 변수를 for 문 안에서 초기화하여 사용할 수 있습니다.
26. ALGOL 60에서 for 문의 어떤 특성이 프로그램을 읽기 어렵게 하는가?
반복 변수와 최종값 먼저 비교
초기값, 최종값, 증분값(임의 수식)
자료형 : 실수형, 정수형, 혼합형 연산 허용
최종값, 증분값은 비교시 매번 재평가
예
a step b until c v := a L1 : if (v - c) * sign(b) > 0 then goto exit ; <statements> v := v + b goto L1; exit :
반복문 정상 종료시 반복 변수 값 정의되지 않음
goto문 탈출시 반복 변수 값 유지
for 문 내부로 제어 이동시 결과 미정의
27. 반복문의 구조와 반복문을 벗어나는 방법을 조사하고 여러분이 가장 좋다고 생각하는 방법과 이유를 논하라.
① For문
For문은 전형적인 반복문 구조로서 자주 사용되는 편이다.비주얼베이직의 경우 For문은 Next문으로 반복문의 범위를 지정하여 그 사이에 있는 모든 스크립트를 반복해서 실행한다. 일반적으로 반복 횟수가 이미 결정되어 있는 경우에 사용한다. 반복문을 실행하는 도중에 반복을 중단하려면 Exit For를 사용한다.
② While문
For문은 반복할 횟수를 미리 알고 있는 경우에 유용하다. 그러나 경우에 따라서는 반복할 횟수를 사전에 결정할 수 없는 경우가 발생할 수 있는데 이런 경우에 특정 조건을 만족하는 동안만 문장을 반복하도록 하는 While문 또는 Do ... Loop 문을 이용하여 구성한다.
While문은 바로 뒤에 쓰여진 조건이 True 값을 갖는 동안 반복, 실행하며 조건이 False가 되는 순간 반복을 종료한다.
③ Do ... Loop문
Do는 반복문의 시작을 나타내고 Loop는 반복문의 끝을 나타낸다. 그래서 Loop를 만나는 순간 다시 Do로 이동해서 다시 처음부터 반복해서 실행하게 된다. 반복의 조건은 While 또는 Until과 함께 쓰여지며 While 문은 주어진 조건에 만족하는 동안 반복, Until 문은 주어진 조건을 만족할 때까지 반복한다.
비주얼베이직에서는 Do로 시작하는 반복문에서 중간에 반복을 종료하고 벗어나려고 할 때 Exit Do를 사용한다. 무한 루프가 아닌 일반 Do 반복문에서도 반복 실행을 중단하고 벗어나려고 할 때 Exit Do를 이용할 수 있으며, 보통 If문과 같이 사용하여 어떤 조건에 만족할 때 반복을 벗어나 종료하게 만든다.
여러개의 다양한 모든 형식의 반복문을 사용하기에는 다소 혼란스러울 뿐만 아니라 어느 반복구조를 사용하더라도 원하는 결과를 얻을 수 있으므로, 이 중에서 가장 익숙한 형태의 반복문 형식을 한 개 선택하여 자기 것으로 익숙하게 쓸 수 있도록 하는 것이 훨씬 바람직할 것이다.
28. 프로그래밍 언어에서 반복문의 구현할 때에 고려되어야 할 사항들을 나열하라.
반복문의 고려사항
①type mix
②부등호(범위값) 사용
③순환변수 값 변화
<for문의 경우 주의사항>
- for 루프의 처리문이 2 개 이상의 문장이면 { } 로 둘러싼다.
- 무한 for 루프 (Endless for loop)
조건으로 0 이외의 수치 지정하거나 조건을 생략하면 무한 반복 실행
- 중단하려면 Ctrl + Break 누름
<while문의 경우 주의사항>
- while 루프의 처리문이 2 개 이상이면 { } 로 묶는다
- while 무한 루프
(조건) 으로 0 이 아닌 수치(1 or -1) 를 지정 하면 조건이 항상 만족되는 것으로 평가 하여 해당 루프가 무한 반복 실행
29. Pascal, Java, Ada에서 while 구문, repeat 구문, loop-exit 구문을 어떻게 사 용하며 장단점을 비교 논하시오.
30. 다음과 같은 두 프로그램이 있을 때, 이 두 프로그램은 동일한가, 또 S는 어떠한 순 서로 실행되는가?
for i = 1 to A(x) by i do
S
end
i := 1
while i <= A(x) do
S
I := i+1
end
31. C++의 break 문과 Java의 break 문간의 차이점은 무엇인가?
자바에서는 break문이 레이블을 가질 수 있다.
레이블이 없는 경우에는 C++과 동일한 역할을 하지만 레이블을 인자로 가지는 경우에는 해당 레이블로 분기하게 된다. 다음 예를 보자.
begin: // begin이라는 레이블을 가지고 있다. break begin 문은 여기로 분기 for (int i=0; i<10; i++) { // 레이블이 없으면 break는 switch문을 벗어나 이 곳으로 분기 switch(value) { case 1: value++; break; case 5: break begin; // begin이라는 레이블로 분기한다. default : value--; break; } }
32. Pascal의 goto문 제한이 갖는 주요 문제점은 무엇인가?
Goto문 제거에 따라서 다양한 순서 제어문을 요구하게 된다. 따라서 택일문, 반복문, 되부름등의 복잡한 구조를 가지게 된다.
33. PL/I의 레이블 변수가 갖는 두 가지 단점은 무엇인가?
키워드나 예약어를 변수로 사용할수 있음을 허용하게 됨으로써 두 사이의 관계가 모호하게 된다. 그렇기 때문에 프로그램의 판독성이 떨어지게 되고 컴파일러 작성이 어렵게 된다.
'Study_exam > 프로그래밍 언어 개념 연습문제' 카테고리의 다른 글
프로그래밍 언어 개념 연습문제 8장 (0) | 2023.06.05 |
---|---|
프로그래밍 언어 개념 연습문제 7장 (0) | 2023.06.05 |
프로그래밍 언어 개념 연습문제 5장 (0) | 2023.04.20 |
프로그래밍 언어 개념 연습문제 4장 (0) | 2023.04.20 |
프로그래밍 언어 개념 연습문제 3장 (0) | 2023.04.20 |