-
[정보처리기사 실기] 과목6 - 프로그래밍 언어 활용, 오답노트CS/정보처리기사 2023. 7. 15. 00:04반응형
Chapter ① 기본 문법 활용하기
- 거품 정렬 C언어 코드
#include <stdio.h> void main() { int i, j; // 이중 for문을 위한 변수 i, j int temp; // 임시 저장 변수 int a[5] = {75, 95, 85, 100, 50}; // 정렬되지 않은 배열 for(i=0; i<4; i++) { // (요소의 개수 - 1) 만큼 반복 for(j=0; j<4-i; j++) { // (요소의 개수 - i) 만큼 반복 if(a[j] > a[j + 1]) { // 현재 요소의 값과 다음 요소의 값을 비교하여 큰 값을 다음 요소로 보냄 temp = a[j]; a[j] = j[j+1]; a[j+1] = temp; } } } for(i=0; i<5; i++) { printf("%d ", a[i]); // 0번째에서 4번째 값을 출력: 50 75 85 95 100 } }
- Switch case문의 break가 없는 자바 코드
public class Soojebi { public static void main(String[] args) { int i = 3; int k = 1; switch(i){ // i가 3이므로 case 3으로 이동 case 0: case 1: case 2: case 3: k = 0; // case 3에서 k = 0을 실행 case 4: k += 3; // break가 없으므로 k += 3 실행(k는 3) case 5: k-= 10; // break가 없으므로 k -= 10 실행(k는 -7) default: k--; // break가 없으므로 k-- 실행(k는 -8) } System.out.print(k); // k가 저장하고 있는 값인 -8을 출력 } }
- 세트 파이썬 코드
세트는 집합이므로 출력 순서가 상관없다.
a = {'일본', '중국', '한국'} # a라는 세트형 변수에 '일본', '중국', '한국'을 초기화 a.add('베트남') # '베트남'이라는 값을 추가 a.add('중국') # '중국'이라는 값을 추가하는데 이미 '중국'이 존재하므로 무시 a.remove('일본') # '일본'이라는 값을 제거 a.update({'홍콩', '한국', '태국'}) # update를 통해 '홍콩', '한국', '태국'을 추가하는데, '한국'은 이미 있으므로 '홍콩', '태국'이 추가됨 print(a) # 세트 값을 출력 : 홍콩 태국 한국 중국 베트남
- 식별자 표기법
▼ 변수 설정 기법
표기법 설명 카멜 표기법
(Camel Case)- 식별자 표기 시에 여러 단어가 이어지면 첫 단어 시작만 소문자로 표시하고, 각 단어의 첫 글자는 대문자로 지정하는 표기법
예) inputFunction파스칼 표기법
(Pascal Case)- 식별자 표기 시에 여러 단어가 이어지면 각 단어의 첫 글자는 대문자로 지정하는 표기법
예) InputFunction스네이크 표기법
(Snake Case)- 식별자 표기 시에 여러 단어가 이어지면 단어 사이에 언더바를 넣는 표기법
예) input_function헝가리안 표기법
(Hungarian Case)- 식별자 표기 시 두어에 자료형을 붙이는 표기법
- 식별자 표기 시에 int형일 경우 n, char형일 경우 c, 문자열일 경우 sz를 붙임
예) nScore → 정수형
- 반복문 자바 코드
public class Soojebi{ public static void main(String[] args) { int i=0; int sum=0; while(i<10) { i++; // 처음에 i가 0인 상태에서 i++을 만나게 되면 i가 1이 되고, if(i%2==1) // i%2==1은 참이 되어 continue; // continue를 실행한다 sum += i; // i가 1인 상태에서 i++을 만나게 되면 i는 2가 되고, i%2==1은 거짓이 되어 sum += i를 실행하게 된다. } // 이런 패턴으로 i가 10이 될때까지 반복적으로 sum에 짝수들을 더한다. System.out.println(sum); // i가 2,4,6,8,10일 때 더해진 30이 출력된다. } }
- C++에서 생성자
- 생성자는 일반적으로 클래스의 멤버 변수를 초기화하거나 클래스를 사용하는 데 필요한 설정이 필요한 경우 사용한다.
- C++, 자바에서는 클래스 명과 동일한 메서드명을 가지고, 반환 값이 없다.
- 10진수를 2진수로 변환하는 자바 코드
class Soojebi { public static void main (String[] args) { // 십진수 n을 a의 배열을 이용해 2진수 값으로 저장한 후 출력하는 프로그램이다. int[]a = new int[8]; int i=0; int n=10; while( ① ) { // a[i++] 을 보면 while문이 a의 갯수인 8번 이내로 반복해야 한다. 그렇기 위해서는 i<8 또는 i<=7로 동작시키면 된다. a[i++] = ②; // while문 안에서는 a[i]에는 0과 1의 값만을 넣어야 한다.(a는 2진수 값을 저장하기 때문에 0과 1만 넣어야 함) n /= 2; // n을 2로 나눴을 때 나머지가 이진수 변환하는데 필요로 하는 값이므로 ②에는 n%2을 넣거나 비트 연산자를 사용한 n&1을 넣으면 된다. } for(i=7; i>=0; i--) { // a[7] 번지부터 a[0] 번지 순으로 출력하기 때문에 a[0] 번지가 1의 자리가 된다. System.out.print(a[i]); } } }
- 리스트 파이썬 코드
lol=[[1, 2, 3], [4, 5], [6, 7, 8, 9]] print(lol[0]) # lol[0]이라고 하면 첫 번째 행이 모두 출력된다: [1, 2, 3] print(lol[2][1]) # lol[2][1]은 세 번째 행의 두 번째 요소가 출력된다: 7 for sub in lol: # 이중 for문인데, lol에서 행의 갯수만큼 반복한다. for item in sub: # 안쪽 for문은 sub 안에 있는 요소만큼 반복한다. print(item, end='') # sub 안의 요소들이 item이고, 안쪽 반복문이 반복될 때마다 하나씩 출력한다: 123 \n 45 \n 6789) print() # 행에 있는 값들을 다 출력하고 한 줄 개행한다.
- 포인터 C언어 코드
#include <stdio.h> void main() { char *p = "KOREA"; // p라는 포인터에 KOREA라는 저장공간이 할당된 곳을 가리키게 된다. (문자열은 마지막에 NULL이라는 값이 자동으로 생성됨) printf("%s\n", p); // 포맷 스트링이 %s로 되어 있어 p주소부터 NULL을 만날 때까지 문자열 값을 읽어 출력한다.: KOREA printf("%s\n", p+3); // 포맷 스트링이 %s로 되어 있어 p+3라고 지정하면 p+3부터 NULL을 만날 때까지 문자열 값을 읽어 출력한다.: EA printf("%c\n", *p); // 포맷 스트링이 %c로 되어 있어 p가 가리키는 (*p)의 문자 값을 읽어 출력한다.: K printf("%c\n", *(p+3)); // 포맷 스트링이 %c로 되어 있어 (p+3)가 가리키는 *(p+3)의 문자 값을 읽어 출력한다.: E printf("%c\n", *p+2); // 포맷 스트링이 %c로 되어 있어 p가 가리키는 (*p)의 값인 K에 +2를 했으므로 다다음 문자를 출력한다.: R }
- 오버라이딩 자바 코드
class Parent { public int compute(int num) { if(num <= 1) return num; return compute(num-1)+compute(num-2); } } class Child extends Parent { public int compute(int num) { if(num <= 1) return num; return compute(num-1)+compute(num-3); // num } } // num이 4일 때 if문이 거짓이므로 compute(3) + compute(1)을 반환한다. // num이 3일 때 if문이 거짓이므로 compute(2) + compute(0)을 반환한다. // num이 2일 때 if문이 거짓이므로 compute(1) + compute(-1)을 반환한다. // num이 1일 때 if문이 참이므로 1을 반환하고, num이 -1일 때 if문이 참이되어 -1을 반환하므로 1+(-1)은 0이 된다. // compute(3)은 compute(2) + compute(0)이었는데, compute(2)는 0이고, compute(0)도 0이므로 0이 된다. // compute(4)는 compute(3) + compute(1)이었는데, compute(3)은 0이고, compute(1)은 1이므로 최종 출력값은 1이 된다. class Soojebi{ public static void main(String[] args) { Parent obj = new Child(); // obj는 Child 인스턴스를 가지고 있다. System.out.print(obj.compute(4)); // Child에 있는 compute 함수가 실행된다.(오버라이딩) } }
- 리스트 파이썬 코드
class Soojebi: # Soojebi 클래스를 선언하고 리스트 li를 초기화한다. li = ["Seoul", "Kyeonggi", "Inchon", "Daejeon", "Daegu", "Pusan"] s = Soojebi() # Soojebi() 클래스 객체 s를 생성한다. str01 = '' # str01은 ''로 초기화한다. for i in s.li: # s.li만큼 반복한다. str01 = str01 + i[0] # str01에 i[0](리스트의 맨 앞글자)를 계속 더한다. print(str01) # 출력결과: SKIDDP
- 구조체 포인터 C언어 코드
#include <stdio.h> struct Soojebi { // 크기가 10인 char 타입의 name 필드와 정수형 변수 age를 가지는 Soojebi라는 구조체를 선언한다. char name[10]; int age; }; void main() { struct Soojebi s[] = {"Kim", 28, "Lee", 38, "Seo", 50, "Park", 35}; // Soojebi형 구조체 배열 s를 선언하고 필드를 초기화한다. struct Soojebi *p; // 구조체 포인터 타입의 변수 p를 선언한다. p = s; // p에 s의 주솟값을 대입한다. 배열의 경우 배열명은 주솟값을 의미한다. p++; // 포인터 값을 1 증가시킨다. printf("%s\n", p->name); // 출력결과: Lee printf("%d\n", p->age); // 출력결과: 38 // p의 1 증가로 s[1] 번째에 있는 name과 age를 출력한다. }
- 시프트 연산자 파이썬 코드
a=100 i=0 result=0 for i in range(1, 3): # i가 1부터 2까지 동작 result = a >> i # i가 1일 때 a >> i는 100 >> 1이므로 result 에는 50이 저장됨(2진수 비트로 오른쪽 한번 이동때마다 2로 나누기, 반대는 2로 곱하기) # i가 2일 때 a >> i는 100 >> 2이므로 result 에는 25가 저장됨 result += 1 # result 값에 1을 증가시키므로 26이 됨 print(result) # 결과값 출력: 26
- static 메서드 자바 코드
. 객체 생성 없이 메서드를 사용하기 위해서는 static이라는 키워드를 사용하여 메서드를 선언한다.
public class Soojebi { public static void main(String[] args) { System.out.print(Soojebi.check(1)); } _______ String check(int num) { // 정답: static return (num >= 0) ? "positive" : "negative"; } } // 출력값: positive
- 비트 연산자 자바 코드
▼ 비트 연산자: 0과 1의 각 자리에 대한 연산을 수행하는 연산자
연산자 내용 & 두 값을 비트로 연산하여 같은 비트의 값이 모두 1이면 해당 비트 값이 1이 되고, 그렇지 않으며 0이 되는 연산자(AND 연산자) | 두 값을 비트로 연산하여 같은 비트의 값이 하나라도 1이면 해당 비트 값이 1이 되고, 그렇지 않으면 0이 되는 연산자(OR 연산자) ^ 두 값을 비트로 연산하여 같은 비트의 값이 서로 다르면 해당 비트 값이 1이 되고, 그렇지 않으면 0이 되는 연산자(XOR 연산자) ~ 모든 비트의 값을 반대로 바꾸는 반전 기능을 하는 연산자(NOT 연산자) ※ '=='는 두 값을 비교할 때 사용하는 연산자
public class Soojebi { public static void main(String[] args) { int a = 3, b = 4, c = 3, d = 5; if((a == 2 | a == c) & !(c > d) & (1 == b ^ c != d)) { // 비트 연산 결과로 1이 되어 참이므로 실행한다. a = b + c; // a는 7이 된다. if(7 == b ^ c != a) { // 비트 연산 결과로 1이 되어 참이므로 실행한다. System.out.println(a); // a 값을 출력한다.: 7 } else { System.out.println(b); } } else { a = c + d; if(7 == c & d != a) { System.out.println(a); } else { System.out.println(d); } } } }
- 포인터 배열 C언어 코드
#include <stdio.h> void main() { int *arr[3]; // arr라는 포인터 배열 선언 int a = 12, b = 24, c = 36; arr[0] = &a; // arr[0]에 a 변수의 주솟값을 저장 arr[1] = &b; // arr[1]에 b 변수의 주솟값을 저장 arr[2] = &c; // arr[2]에 c 변수의 주솟값을 저장 printf("%d\n", *arr[1] + **arr + 1); // arr[1]에 b변수의 주솟값이 저장되어 있으므로 *arr[1]은 b변수의 값인 24가 되고, // **arr은 *arr[0]과 같으므로 a 변수의 값인 12가 되어 24+12+1을 더한 결과값이 출력 // 출력값: 37 }
**arr은 *(*arr)과 같고, *arr은 arr[0]과 같으므로 **arr은 *arr[0]으로 바꿀 수 있다.
- 구조체 포인터 C언어 코드
#include <stdio.h> struct Soojebi { char name[20]; int os, db, hab1, hab2; }; void main() { struct Soojebi s[3] = {{"데이터1", 95, 88}, {"데이터2", 84, 91}, {"데이터3", 86, 75}}; // 크기가 3인 Soojebi 구조체 배열 변수 s를 선언하고 초기화 함 struct Soojebi *p; // 구조체 포인터 변수 p를 선언함 p = &s[0]; // s[0]의 주소를 가져오기 위해 '&'를 붙이고 p에 대입하여 주솟 값을 가리키게 함 (p+1)->hab1 = (p+1)->os+(p+2)->db; // (p+1)->os 값 84와 (p+2)->db 값 75를 합한 159를 (p+1)->hab1 변수에 대입함 (p+1)->hab2 = (p+1)->hab1 + p->os + p->db; // (p+1)->hab1 변숫값 159와 p->os 값은 95, p->db 값 88을 합한 값 342를 (p+1)->hab2에 대입함 printf("%d\n", (p+1)->hab1 + (p+1)->hab2); // 위에서 구한 두 값을 합한 결과값을 출력함: 501 }
- break 없는 switch case문 C언어 코드
#include <stdio.h> void main() { int a = 5; int s = 0; switch(a/2) { // a가 5이므로 5/2=2.5이지만, C언어에서는 정수/정수는 정숫값이 나오므로 소수점은 버림 처리되어 2가 된다. case 2: s++; // case 2로 들어가게 되어, s++가 실행되어, s는 1이 된다. case 3: a += s; // break가 없으므로 case 3이 실행된다. a는 6이 된다. default: a++; // a++이 실행되면서 a는 7이 된다. } printf("%d %d", s, a); // 출력결과: 1 7 }
- 복합 대입 연산 C언어 코드
#include <stdio.h> void main() { int a = 2; int b = 5; int c = 3; b /= a; // b = b/a;와 동일하며, 5를 2로 나누면 2.5이지만 정수와 정수를 연산ㄴ하면 정수이므로 소수점은 버림이 되어 b는 2가 됨 c %= a; // c = c%a;와 동일하며, 3을 2로 나눴을 때 나머지는 1이 되므로 c는 1이 됨 printf("%d %d", b, c); // 출력결과: 2 1 }
- break없는 switch case문 자바 코드
public class Soojebi { public static void main(String[] args) { int k = 10; int a = 3; switch(k++) { // k=10이므로 case10으로 가고, ++에 의해 k 값이 11이 된다. 만약 ++k였다면 ++에 의해 값이 11이 된 후에 case11로 이동하게 된다. case 10: a += 2; // a는 5가 된다. case 11: a *= k; // break가 없으므로 a+=k가 실행되어 k는 11이므로 a는 55가 된다. case 8: break; // break를 만나 탈출하게 된다. case 9: a %= 2; } System.out.println(a); // 55출력 System.out.println(k); // 11출력 } }
- 논리 연산자 C언어 코드
#include <stdio.h> void main() { int i = 3, j = 4; printf("%d", 2 && 3); // 참이므로 1 출력, 개행문자 없음! printf("%d", i<2 || j<3); // 거짓이므로 0 출력 // 출력값: 10 }
- 증감 연산자 자바 코드
public class Soojebi { public static void main(String[] args) { int x = 5, y = 0, z = 0; y = x++; // x를 먼저 y에 대입한 후에 x가 1 증가됨(x=6, y=5, z=0) z = --x; // x를 1 감소시킨 후에 z에 대입(x=5, y=5, z=5) System.out.println(x + ", " + y + ", " + z); // 출력결과: 5, 5, 5 } }
- 생성자, 오버라이딩 자바 코드
class A { private String s; A() {} A(String s) { this.s = s + "A"; } public void fn(String s) { System.out.println(this.s + s); } } class B extends A { private String s; B(String s) { this.s = s + "B"; // "Hello"와 "B"를 합쳐서 "HelloB"를 this.s에 저장한다. } public void fn(String s) { System.out.println(this.s + s); // 클래스 변수 s에 저장된 "HelloB"와 매개변수로 받은 "Hi"를 합쳐서 출력한다.: HelloBHi } } public class Soojebi { public static void main(String[] args) { A a = new B("Hello"); // new B("Hello")라는 생성자에 String이 매개변수로 들어가 있으므로 B(String s)가 호출된다. a.fn("Hi"); // 오버라이딩된 B 클래스의 fn을 호출한다. } }
- 재귀함수 C언어 코드
#include <stdio.h> int fn(int n) { if (n<=0) return 1; else printf("%d ", n); fn(n-1); // fn(5)가 실행되면 if문은 거짓이 되어, else문의 printf가 실행되며 5가 출력되고 fn(4)가 호출된다. // 재귀함수이므로 이런 패턴으로 1씩 작아지면 1이 출력되고 0이 실행됐을 때 1을 반환하고 함수가 끝난다. } int main() { fn(5); // 출력결과: 5 4 3 2 1 return 0; }
- 배열 포인터 C언어 코드
#include <stdio.h> int main(int argc, char *argv[]) { int a[2][2] = {{11, 22}, {44, 55}}; // 2x2 크기의 정수형 배열 변수 a를 선언과 동시에 초기화 int i, sum = 0; // i와 sum에 동시에 0을 대입함 int *p; p = a[0]; // 정수형 포인터 변수 p에 배열 a[0]의 주솟값을 대입함 for(i = 1; i < 4; i++) // i는 1부터 3까지 반복 수행함 sum += *(p+i); // *(p+1)는 22, *(p+2)는 44, *(p+3)는 55이며, 더한 값을 변수에 대입함 printf("%d", sum); // 출력결과: 121 return 0; }
Chapter ② 언어 특성 활용하기
- 명령형 언어 개념
- 컴퓨터에 저장된 명령어들이 순차적으로 실행되는 프로그래밍 방식
- 절차형 언어라고도 불림
- 예) - FORTRAN, COBOL, PASCAL, C
- 함수형 언어 개념
- 수학적 수식과 같은 함수들로 프로그램을 구성하여 호출하는 방식
- 예) - LISP
- 모듈과 패키지
구성 설명 예시 모듈(Module) 전역변수, 함수 등을 모아둔 파일 import 모듈명 패키지(Package) 모듈을 디렉터리 형식으로 구조화한 라이브러리 import 패키지명.모듈명
- strcat 함수 C언어 코드
#include <stdio.h> #include <string.h> void main() { char str[50] = "nation"; char *p2 = "alter"; strcat(str, p2); // p2가 가리키고 있는 문자열을 str 변수에 이미 저장된 "nation" 뒤에 붙여 str에 저장 printf("%s", str); // 출력결과: nationalter }
Reference
2022 수제비 정보처리기사 실기 (1권+2권 합본세트) - YES24
NCS 기반으로 재구성한 합격비법서로 NCS 기반 반영 문제(예상문제, 단원종합문제, 모의고사, 2021년 기출문제)를 수골하였다. 2022년 합격을 위한 NCS 기반 모의고사, 궁극의 암기비법(두음 쌤)과 학
www.yes24.com
반응형'CS > 정보처리기사' 카테고리의 다른 글
[정보처리기사 실기] 과목8 - 서버 프로그램 구현, 오답노트 (0) 2023.07.17 [정보처리기사 실기] 과목7 - SQL 응용, 오답노트 (0) 2023.07.16 [정보처리기사 실기] 과목5 - 인터페이스 구현, 오답노트 (0) 2023.07.10 [정보처리기사 실기] 과목4 - 통합 구현, 오답노트 (0) 2023.07.09 [정보처리기사 실기] 과목3 - 데이터 입출력 구현, 오답노트 (0) 2023.07.06