본문 바로가기
정처기 실기 문제풀이

C언어 143 58 37

by moca7 2024. 4. 17.

1.

 

- 모든 프로그램은 선언 -> 입력 -> 처리 -> 출력 구조이다. 

- ㄱ은 입력, ㄴ은 처리, ㄷ은 선언, ㄹ과 ㅁ은 출력이다.

- ㄴ은 result 선언이 아니라 처리다. +연산이 있으니까. 

 

2. 

 

- 전컴어링

전처리기 -> 컴파일러 -> 어셈블러 -> 링커 

 

4.

 

2  45

2  22 1

2  11 0

2   5 1

2    2 1

    1   0

     

나눌 때 몫을 아래에, 나머지를 오른쪽에 적는다. 

 

소수는 2로 곱하면서 곱할대마다 0, 1이 되면 1, 1말고 나머지는 또 곱한다. 

 

5. 

 

- main의 a, b, c도 지역변수다. 중괄호 끝나면 사라짐. 

- 처음 a, b, c가 만들어지고, 중괄호에서 b, c가 또 만들어짐 중복으로, 다음 중괄호에서 c가 또 만들어지고 중복으로.

- 세번째 c는 멀리 있는게 아니고 가장 가까운 b를 가져온다. 중괄호 끝나면 세번째 c는 사라짐.

- 출력문이 return 바로 위에 있었다면? 4, 2, 3   한번 값을 집어넣었으면 끝이다 원복 안됨.

 

 

6. 

 

- 프로그래밍 언어에서 규칙이 있음. 정수 나누기 정수는 정수이고 소수점 나머지는 버린다.

실수 나누기 정수나 정수 나누기 실수실수다.

- 보통 버림을 하는 경우는 정수/정수를 한다거나, (int)8.6이런 형변환하면 버립니다. .1f는 반올림입니다. 

- 후위연산

- 1/2.0이었으면 답은 2.        a는 3이됨.

 

8. 

 

- 대입연산자는 우선순위가 가장 낮기 때문에 가장 마지막에 해줘야 한다.

- printf 따옴표 안에 컴마 있으니 컴마까지 써야한다. 

 

9.

 

- 만약 a=b++*c였다면? 

a=b*c;

b=b+1;

- 두 문장 이상이니 세미콜론 해줘야 한다.

 

10. 

 

- int c = ( 10, ( 20, 30) , 40 );

이런 컴마 연산자는 묻지도 따지지도 말고 젤 오른쪽에 있는걸 대입하면 됨.

- 프린트에 컴마 있으니 그거까지 출력하고, 개행문자 없으니 붙여서 출력해야 함. 

 

11.

 

- &&나 II 이거. 왼쪽에서 증감 시키고 오른쪽도 봐야 하면, 왼쪽에서 증감시킨 값으로 계산한다.

- 프린트에 컴마 없고 공백 있으니 그대로 써야한다. 눈으로 풀지말고 꼭 확인. 

- 개행문자는 다음 출력값이 없으면 무의미하다.

- 만약 && 왼쪽이 >=였으면 

4 4

 

13.

 

- II도 왼쪽만으로 이미 참이 나오면 오른쪽은 수행하지 않는다. 쓸데없는 일 안한다. 

- II, &&는 왼쪽 먼저 수행해야 한다. 

 

14.

 

- c언어에서 0이 아니면 다 참이다. 음수도 참이다.

            C언어 JAVA 파이썬

참           1       true    True

거짓        0      false    False

 

 

16.

 

- int f_value하면 그냥 5가 됨. 정수형이 되면 소수점 이하는 버린다.

- 만약 666.1인데 3.1f하면 666이 나오는게 아니고 666.1이 나옴. 정수부분은 다 출력한다.

666.15인데 3.1f하면 666.2나온다. 3.1f하면 반올림이다. 

- 그냥 %f하면 소수점 아래로 6개 나온다. 

 

17.

 

- 16진수는 4개씩 끊고, 8진수는 3개씩 끊는다.

 

18. 

 

- 0x는 16진수라는 표현이다. 0x11은 16진수로 11이니까, 10진수로는 17.

- 15는 16진수로 표현하면 0x0f네.

 

20.

 

- 덧셈 뺄셈 등이 <<, >> 쉬프트연산보다 우선순위가 높다.

즉, a << b + 2 있으면 b+2를 먼저한다. 

 

23.

 

- #define VALUE1 1   

매크로다. 앞으로나오는 VALUE1을 1로 바꾸겠다.

- float i; 

i = 100/300;

이거 i가 실수형이여도 0.333이 아니고 0이다. 왜냐? 정수 나누기 정수는 정수다.

계산이 다 끝나고 변수에 대입을 하게 된다. 대입연산자는 우선순위가 가장 낮다

- 1 & 2

이거 0001과 0010인데, 둘이 같으면 1 다르면 0이 아니고, 둘 다 참이면 참 아니면 거짓인거다.

I는 둘 중 하나라도 참이면 참인거.

- if( j && k II i )

이거 그냥 왼쪽부터 순서대로 해주면 됨. &&나 II는 참이나 거짓을 반환. c언어는 참이면 1 거짓이면 0 반환. 

- %.1f

정수는 다 써주고 소수점 한자리까지만. 둘째자리에서 반올림

- %03d

이건 3개의 공간을 만들고 오른쪽부터 채우는데 앞의 빈자리는 0을 채워라.

- 그냥 %3d라면?

__3이다. 근데 내가 몇개 띄워썼는지 애매해서 만약 쓴다면 뭐 공백 위에 v체크해라 이런식으로 나올듯. 

 

24.

 

- 전산직 문제인데 정처기도 점점 어려워지니까 이런 것도 충분히 나올 수 있다.

- char는 문자형이지만 숫자가 들어갈 수도 있음. 실제로 컴퓨터엔 2진수의 숫자가 저장됨. char에 있는 문자 하나도 %d로 출력하면 숫자가 출력이 됨. 

 

- int x = 0x15213f10 >> 4;

16진수 15213F10

16진수는 4개씩 자르는 거니까 (각각의 자리수가 4비트다)

0001 0101 0010 0001 0011 1111 0001 0000 이다. (2진수로)

이걸 10진수로 변환할 순없다. 2의 n승이 엄청 길어지니까.

아무튼 >> 4니까 오른쪽으로 4칸 민다. (4비트 이동)

그럼 16진수로는 15213F1이고 2진수로는 0001 0101 0010 0001 0011 1111 0001 이다.

 

- char y = (char) x;

x의 값을 char 형태로 변환해서 char y에 집어 넣어라.

c언어에서 char는 1바이트 = 8비트. 그럼 8비트를 왼쪽에서부터 취하냐 오른쪽에서부터 취하냐. 오른쪽부터 취함.

그럼 y에는 F1이 들어감. 

c언어 char는 정수형 변수이다. 1바이트, -128 ~ 127

 

- unsigned char z = (unsigned char) x;

char는 1바이트, -128 ~ 127

unsigned char는 1바이트, 0~255

얘도 x에 F1이 들어감.

 

- %u는 %d와 똑같다.

F1은 16진수로 1111 0001

10진수로 하면 1+16+32+64+128 = 241

 

그런데 char는 맨 앞에 비트가 부호비트다. 1은 -를 의미한다.

그럼 얘는 1 111 0001인데, 음수니까 얘를 2의 보수로 표현을 해야한다.

그럼 먼저 1의 보수로 바꾼다. 1 000 1110

여기에 1을 더한다 1 000 1111

이러면 - 15

 

- 16진수 F를 출력할땐 소문자로 해야 함. a b c d e f 

 

26. 

 

- 삼항 연산자를 쓰시오.

? 다음에 : 이다. 

k = i>j ? i-j : i+j      혹은         k = (i>j) ? (i-j) : (i+j)         <- 마지막에 세미콜론까지 붙이기.

 

이렇게 쓰면 틀린다.

i>j ? k=i-j : k=i+j

하나의 식에 두 개의 대입연산자가 들어갈 수 없다. 참항 거짓항을 () () 해주든가. 

 

- for 반복문; ; 세미콜론이다.

 

27.

 

- switch문은 break를 만나는 즉시 "그 하나의" 반복문을 탈출한다. default 안함.

- switch(3)이었을 경우 default만 출력.

- 만약 case 0에 브레이크가 없고, case 1은 아무것도 없으면, case1은 그냥 패스하고 넘기는거다. 아무것도 안함. 

 

31.

 

- char grade = 'C';

printf("%c" , grade);

이러면 'C'가 아닌 C 출력하면 된다. 

대입할 때는 문자라 ' ' 붙이고

- %c는 글자 하나 출력이다.

 

33.

 

- 1부터 2022까지 4의배수의 개수만큼 c를 1씩 증가시켜라.

여기까지 해놓고 계산 실수. 504라고 함. 검산 필수. 

 

34.

 

- int count, sum = 0;

이거 sum은 0이고, count는 아무것도 아니다

- int count=0, sum;

이러면 count는 0이고, sum은 아무것도 아니다. 

 

39.

 

- 이거 틀린 이유. while인 경우 {} 안을 한 다음에 다시 조건문까지 수행하고 반영해야 함. for 반복문 처럼.

 

40. 

 

- 이거 틀린 이유. if 한번만 하고 바로 출력으로 넘어감. while 반복문은 조건이 만족하는 이상 계속 수행해야 한다.

 

41.

 

- 이거 틀린 이유. 

1) sum은 다 더하는건데 그냥 a를 단순 대입함. 눈으로 풀어서 생기는 문제.

2) while 반복문은 조건이 만족하는 이상 계속 수행해야 함. 이거 a가 5일 때 6이 되고 아래도 수행 됨

그리고 또 a는 7이 되고 끝난다. 항상 조건문까지 수행을 해야한다.

 

43.

 

- 이거 틀린 이유. if 두번째도 j인줄 알았는데 i였음. 낚시.

2) i가 4이고 break로 아예 끝인줄 알았는데, break는 반복문 하나만 탈출하고 또 i는 5부터 진행해야 함. 

3) j가 3의 배수일 때 제외하는 건데 3일 때만 제외함. 왜 이런 실수를 했지?

 

46.

 

- []만 있으면 가변배열. char(문자열)는 문자열 끝에 null도 들어감. 숫자는 끝에 null 안들어감.

- char ch[] = "abcde"; 이러면 끝에 null들어가고 6개 공간. 

char ch[5] = "abcde"; 이러면 이건 문자열이어도 끝에 null 안들어감. 5개의 공간으로 정해놔서. 

= 근데 ch[6]이었으면 맨 마지막에 null 값 들어감. 모든 문자열은 뒤에 널값 포함. 공간이 없을뿐.

= 배열의 마지막에 null이 들어가는데, 가변배열일때 char a[]="12345"; 6개 공간이라는 것만 알면 됨. 나머지는 null 신경 ㄴㄴ.

 

- sizeof()는 byte의 수를 구하는 함수다. sizeof(int)는 4다. 

자료형의크기 x 개수.

 

47.

 

- int num[5] = {1, 2, 3};

int 배열, 전역변수, 정적변수는 선언만하고 초기화안해도 자동으로 0값이 들어감. 

 

49.

 

- char msg[50] = "hello world!" 

이거 공백도 한 자리 차지함 ㅇㅇ. 

 

50.

 

- 이거 틀린 이유. char str[7] = "nation"; 

7개 공간으로 크기. 마지막 비어있는 str[6]은 null인데 자동으로 0 들어간다 생각함.

int형 배열일 때만 자동으로 0값이 들어가는 거다.

= 맨 마지막에 null 들어감. 모든 문자열은 뒤에 널값을 하나 포함.

 

%c는 실제 문자를 받아서 그 문자열을 출력. char형 요구

%s는 주소값을 받고 그 주소값에 저장되어 있는 문자를 시작으로 null 이전까지 문자열을 출력. *char형 요구

-

char형은 문자로 하나의 문자를 담을 수 있다. 다만 char a[10]; 같이 배열로 선언할 수 있다.

*char형은 포인터를 통해 문자열을 가리킬 수 있다.

ex) char* a = "hello world!"라고 선언하는 경우, 메모리에 저장된 hello world!의 첫 'h'가 담긴 첫 주소값을 가리키게 된다. 

 

52.

 

- int hist[16] = {0, };

, 하고 공백은 뭐지?

암튼 전부 0으로 채워짐. int 배열은 0으로 채워짐. 

 

- srand(time(NULL));

srand는 랜덤값을 만들어내는 함수. 

 

- n = rand()%6 + 1;

랜덤함수를 돌려서 n값을 추출해내는 그런 거다. 

근데 지금은 뭔지 모른다. 랜덤함수에서 뭐가 나올진 아무도 모름. 

 

54.

 

- 대문자 A의 아스키 코드는 65.

65를 %c하면 대문자 A가 나와야 함.

- 대문자 B는 66, C는 67... 이런식.

 

56.

 

- char *p = "KOREA";

포인터 변수에 이렇게 문자열을 집어넣는게 됨.

p는 100번지를 가지게 됨. 

배열은 물리적으로 연속된 공간이라 101번지는 O가 됨.

- *p는 1차원 배열과 똑같다 보시면 돼요. 포인터는 1차원 배열과 똑같이 쓸 수 있음.

- %s는 주소값을 받아서, 출력은 해당 주소부터 문자열을 널이전까지 쭉 출력함. 

- 만약 3번째꺼, printf("%c", p);면 뭔값이 있을지 몰라서 오류남.

- printf("%c", *p+2);

영어는 아스키 코드로 변환을 하게 됨. K + 2는 M.

 

57.

 

- 배열 a[]에 Art 다음 null도 들어감. sizeof (a[])하면 1*4가 나옴. 

 

58.

 

- scanf("%d", k);는 주소값을 받아서, 그 주소값의 값에 무언갈 집어넣겠다.  

k의 주소값이나 k의 값과는 별 관련이 없음!! (k의 주소값이 아닌, k라는게 주소값을 의미하는 거임.)

저 k는 100번지로 대체되는 거고, 100번지에다가 90을 집어넣는 거니까. 

- k는 100번지 그대로 가지고 있음. i만 바뀐거.

 

 

63.

 

- 마지막에 arr[3] 출력하면 2.  

- *p++는 p의 실제값을 가지고 와서 연산을 하고, 그 다음에 p를 1 증가시킴.  <- 이건 p가 늘어남.

(*p)++는 p의 실제값을 가지고 와서 연산을 하고, 그 다음에 p의 실제값을 1 증가시킴. <- 이건 p의 실제값이 늘어남.

 

65.

 

- *pt+++= 20;

이거 +=연산자임. 

 

68.

 

- int code[] = {10, 20, 30};

int *p = &code;

이거 &code나 code나 주소값 100인거 똑같음.

= 배열은 가지고 있는 값도 100번지이고 주소값도 100번지임. 

 

69.

 

- 각각 문자열 끝에 null이 추가되는건 맞는데 큰 의미를 두진 마세요.

sizeof할때 아니면 쓸데없나.

- strcat(str1, str2);는 str1에다가 str1+str2를 대입한다. str2는 변화없음.

 

70. 

 

- 전역변수하고, main부터 봐라. 위에 함수부터 보지 말고. getname()은 함수다.

- getname으로 문자열이 들어오면 전역변수 n 배열에 저장된다. 

- char*는 주소값이 들어온다. 

그리고 getname보면 return n인데, n은 배열이므로 100번지를 리턴한다.

- 고로 char* n1에 홍길동이 리턴되는게 아니라 100번지가 리턴된다.

- 홍길동, 김철수, 박영희는 차례대로 덮어씌우면서 n[0]에 저장된다. 

근데 n1, n2, n3 변수에 들어가 있는건 값이 아니라 주소값이라 맨 마지막에 저장된 박영희만 리턴된다. 

- scanf나 gets나 모두 주소값을 받게 됨. getchar만 주소값을 받지 않음. 

 

71. 

 

- const는 변수를 바꾸지 않겠다는 의미인데 시험에선 별 의미 없다.

- strstr(pa, pb)는 문자열1에서 문자열2의 첫번째 표시 시작 위치에 대한 포인터(메모리 주소)를 리턴한다. 

strstr(pa, pb)면 pa에서 pb를 찾겠다는 거다.

pa 문자열은 2 K P P 1

pb 문자열은 P P 1

103번지가 pd에 들어가게 된다.

- if (pd != 0) 

pd는 103이니까 참이다.

- strncpy(pd, "77", 3);

문자열을 복사하겠다는 의미.

strcpy는 그냥 복사.

strncpy는 여기 있는 길이(3) 만큼 복사 하겠다.

- pd에다 복사를 한다, 거기다가 77을 복사한다, 3 공간 만큼.

pd부터 3공간만큼 다 밀어버리고, 7과 7을 떼서 넣네. 

 

[복사 전]

 100 101 102 103 104 105

    2     2     K   P    P     1

 

[복사 후]

 100 101 102 103 104 105

    2     2     K    7    7

 

- 만약  strncpy(pd, "77", 2);였으면 7 7 1.

만약  strncpy(pd, "77", 1);였으면 7 P 1.

- 만약 strcpy(pd, "77")였으면 pd부터 다 지워버리고 그냥 77

 

73.

 

- int data[][3] = {1, 3, 4, 5, 2, 9, 6, 8, 7};

행에 아무것도 없으면 그냥 열 기준으로 잘라주면 됨.

- int *p = data[1];

포인터변수 p에 주소값 들어가야 하는거 아닌가?         저게 주소값 맞음.

data[1]은 3을 의미하지 않음. 3을 의미하는건 data[0][1]이고, data[1]은 103번지를 의미.

data[0]은 100번지를 대표로 자기가 받음(행대표주소로 103번지를 가짐). data[2]는 106번지를 대표로 자기가 받음.

- data는 100번지를 가짐. 

그런데 1을 직접 참조하는게 아니라 data[0]을 참조함. 이걸 유의

 

74.

 

- 틀린 이유. *(*darr+1) 이게 *(100번지+1 = 101번지)가 아니라

*(darr[0]+1)해서 *(darr[1])인줄. 근데 darr[0]은 100번지고, darr[1]은 103번지라 +1해서 저렇게 가는게 말이 안 됨. 

- darr이 100이지만 *darr이 1인건 아님. *darr도 100이다. 

왜? 2차원 배열에서 배열의행대표말고 배열대표는 2번 거쳐야 값으로 간다. 

 

75.

 

- 틀린 이유. 반복문 i가 0부터 시작하는줄 알았는데 1부터 시작이었음. 단순 실수.

- 주의. p + i 는 그냥 백몇번지지만, a + 1은 102번지.

 

76.

 

- %p는 그냥 큰 숫자를 출력한다. 라고 알아두심 돼요.

- a나 &a나 배열은 다 주소값이다. 

- *a 

2차원 배열은 여전히 100번지를 의미한다. 바로 1 참조 못하고 a[0]의 값인 100번지 참조함.

- a+1

2차원 배열은 a+1하면 101번지가 되는게 아니고, a[0]의 다음 행 대표주소인 a[1]의 값인 103번지가 아닌, int형이라 4바이트씩 움직여서 112번지를 의미한다.

(2차원 배열에서 a는 0행 대표주소를 가리키고 있고, a+1을 하면 1행 대표주소를 가리키게 된다.)

- &a는 행대표인 a[0]을 말하는게 아니고 배열대표 a를 말함. 

&a+1하면 배열 a 다음 번지인 124번지를 의미한다.  (이 배열 다 끝난 다음 주소)

- a[0]+1

a[0]의 값은 100번지, 여기에 1 더하는건 104번지를 의미.

+1이어도 int니까 +4다. 

 

77. 

 

- char *c[] = {"aaa", "bbb", "ccc"};

이건 포인터 배열이다. 

c[0]= 100번지, c[1]=101번지, c[2]는 102번지다.

c[0]= 100번지, c[1]=200번지, c[2]는 300번지다.

100번지에는 a가 있고 200번지에는 b가 있고 300번지에는 c가 있다.

- c[0]의 주소값은 1000번지, c[1]의 주소값은 1001번지, c[2]의 주소값은 1002번지이다.

c는 1000번지이다. 

*(c+1)는 1001번지의 실제값인 200번지이다. 

- printf("%s", *(c+1));

- 101번지 a, 102번지 a이다. 

 

78.

 

 

b[0] = 100번지, b[1]= 200번지

b는 1000번지

 

-3, 14, 5가 100번지, 101번지, 102번지

1, -10, 8이 200번지, 201번지, 202번지

 

p는 200번지

 

1

-10

14

 

- 포인터 배열은 100번지, 200번지 값을 가지지만, 

따로 따로 들어오는 게 아니고 2차원 배열을 2개의 행으로 잘라서 가져오는 거면 100번지, 103번지다.

 

80.

 

- 틀린 이유. arr[1]인데 arr[0]으로 봄. 단순실수. 

 

81.

 

- int (*in)[N], *out, sum=0;

#define N 3니까 이거 그냥 포인터배열인가.        배열 포인터다. 

- 배열포인터는 뒤에 있는 숫자 3을 이용해 열을 논리적으로 재구성하여 2차원 배열을 만든다.

배열포인터는 뒤에 있는 숫자로 열을 재구성 하라는 뜻이다. 

in이 3열짜리 2차원배열(행과 열로 구성된)인 거다. 2차원 배열을 만든다고 보면 된다.

- 그리고 포인터 변수 out 그냥 선언(0 대입 안함).

- in = (int (*)[N]) malloc (N * N * sizeof(int) );

malloc은 공간을 동적으로(가변으로) 할당하라는 뜻.

- int (*)[N]

이건 형변환인데, 그냥 in에다가 2차원 배열 형태로 만들어서 집어 넣으라는 뜻.

중요한건 36바이트. int가 4바이트니까 9개짜리 공간을 만들겠다는 뜻이다.

- out = (int *) in;

이것도 형변환인데, 어렵게 써놓은 거다.

out에다가 1차원배열로 만든다는 말이다. 

대신 주소는 같다. out = in

- 그래서 out에 0~8을 집어넣으면 2차원 배열 in에서도 확인할 수 있다. 주소값이 같으니까 같은 공간인 거다.

 

82.

 

- 틀린 이유. p[1]이랑 p[0][1]이랑 자꾸 헷갈림. 2차원 배열은 값을 표현하려면 행, 열 다 나와야 한다!

- 2차원 배열 p+1하면 행이 바뀌잖아. 112 기억.

그런데 2차원 배열 p+1하면 행이 바뀌는게 그러니까 그걸로 값의 위치가 변동되는게 아니고,

p가 100번지인게 103번지가 된 것 뿐이다. 그러니 거기에 ** 두번을 해야 행렬의 값이 나옴.

 

86.

 

- 85번 문제와 차이점은 구조체가 main 안에 있음. main에서만 쓰겠다는 거. 

- 구조체 포인터로 만들어도 됨. 차이점은 그저 u1.name이 u1->name이 되는 것뿐.

- *(++p->fp)

이게 ++가 p에 되는건지 p.fp에 되는건지. 문맥상 후자긴 함.

 

87.

 

- 구조체를 포인터변수로도, 배열로도 만들 수 있구나.

- 배열로 만들었을 때 구조체의 변수의 개수만큼 한칸에 담을 수 있구나.

- char name[10] = { "Kim" }

이러면 Kim이 한칸에 들어가는 건가 100번지에 K, 101번지에 i, 102번지에 m 이렇게 들어가는 건가. 

 

88.

 

- 이건 왜 87번 문제와 달리 {}를 안에 한번 더 써줬냐. 

안써주면 int형 hab에 "데이터2"라는 문자가 들어가서 오류 발생.

 

89.

 

- union. 공용체라는 게 있음. 구조체는 메모리를 각각 할당받는데 공용체는 메모리를 공유해버림.

- 공용체 내의 각 멤버는 같은 메모리 위치를 공유하므로, 공용체의 크기는 그 중에서 가장 큰 멤버의 크기와 같다.

- 4 4 8 중 가장 큰 공간 하나만 쓰는 거다.

- 8 byte라고 단위까지 꼭 써주기.

 

90.

 

- 틀린 이유. 낚시. 함수 내의 지역변수 a, b만 바꾸고 사라졌을 뿐, main의 k, j는 변한 게 없다.

 

92.

 

- 틀린 이유. if 안에 &&는 왼쪽만 거짓이어도 오른쪽항은 수행 안함.

아래는 또 &라서 다 수행 함. 혼동 주의.

 

93.

 

- 함수 이름만 써놓은거 뭐냐. 아무 의미 없다. 어떤 컴파일러는 main 아래에 있으면 못읽어서 넣어준것뿐.

 

95.

 

- a가 66666인데 %3d하면 66666 다 나옴. 정수는 다 나오나 봄.

- %3d니까 공백공백4가 나와야 함. 띄어쓰기 없어도 사실상 띄어쓰기임.

- main함수에 있는 변수도 지역변수일 뿐이다.

 

97.

 

- 틀린 이유. static 정적변수인데 그냥 무시하고 일반 지역변수로 생각함.

- 정적변수는 한번만 초기화(선언하면서 대입) 되고 그 다음에 또하면 그냥 없는 문장처럼 처리.

- 두번째 func()에서 없는 문장으로 처리를 해도 메모리 상에 func 영역에 a가 남아 있는 거다.

그러니 main변수의 a를 변화시키는게 아님.

 

100.

 

- 틀린 이유. &list[value]가 value의 주소값을 말하는 줄 알았음. 단순실수.

 

102.

 

- 49를 3.1f하면 49.0이다. %f하면 49.000000이다.

- res는 double형이므로 안에 있는 값은 실수 형태임. 근데 출력에 사용될 때만 정확히 표현하면 됨.

정수/나누기 정수할때 소수점 버린다는거랑.

 

104.

 

- void func라는 함수가 인자가 바뀌어서 main 위에 선언되어 있는데 이게 의미가 있나?

 

105.

 

- num = (int *)malloc(sizeof(int) * n);

num이라는걸 배열로 만들건데 int형으로 3(n)개 공간을 확보하라.

 

107.

 

- static 변수는 선언만하고 대입안해도 자동으로 0이 대입되서 초기화 됨.

고로 초기화 한번 하고, 그 후에 대입은 안하고 선언만 한다는게 없음 그것도 초기화임 무시하면 됨.

 

111.

 

- fork() 함수를 실행시키면 자식프로세스가 생긴다.

 

- 자식프로세스는 부모프로세스의 변수의 값을 복사함.

주소값은 다름. 부모 프로세스의 x의 값을 변경시켜도 자식 프로세스의 x의 값은 변하지 않음.

- 두 개의 프로세스가 동시에 실행됨.

- 자식 프로세스가 생기고 fork(); 이후부터 실행되는거 아니고 첨부터 다 함.

- 여기서는 fork() 함수가 반복문 내에서 호출되지 않았기 때문에 한번만 복제됨.

113번문제 에서는 fork() 함수가 반복문 내에서 호출되서 각 반복에서 자식프로세스를 또 생성함.

 

112. 

 

- 부모 프로세스랑 자식프로세스랑 변수 값 변경한거 공유되지 않는구나.

- pid = fork();

이거 하면 fork() 함수에서 리턴해주는게 값이 3가지가 나옴. 양수(부모), 0(자식), 음수(실패)

- 여기서는 자식부터 수행하는게 아니라 부모부터 수행한다는데?

- fork함수가 리턴하면 부모 프로세스와 자식 프로세스가 동시에 동작하는데, 어느 프로세스가 먼저 실행될지는 알수 없다.

운영체제의 스케쥴링에따라 처리 순서가 달라진다.

- 근데 선생님은 부모가 먼저 수행된다고 함.

- 근데 wait이 있어서 부모에서 양보를 한거. wait은 자식 프로세스가 종료될 때까지 부모 프로세스를 대기시킴.

 

113.

 

- 9번 아님. 생각해보니 그럼 무한 루프네.

fork();는 자식프로세스 생성됐다고 해서 또 수행하진 않는데,

반복문에서는 쓰이나 봄. 

근데 부모프로세스가 다 반복문을 끝내고 자식프로세스가 수행되는 구조가 아니고,

i=0일 때 부모프로세스하고 자식프로세스하고, i=1일 때 부모프로세스하고 자식프로세스하고 이런 식인가 봄. 

 

114.

 

- 재귀함수란거 어케 앎? 함수가 자기자신을 그 안에서 호출하면 재귀함수다. 

 

117.

 

- 틀린이유. j = j - i인데 j-1로 봄. 단순실수.

 

121.

 

- return 0도 아니고 그냥 return;

함수의 반환하는 자료형이 void라 return 0이 아닌 return을 쓴 거.

 

128.

 

- sizeof(char *)

주소값을 가지고 있는 형태는 8바이트가 출력된다. 포인터 변수다. int*이든 뭐든 주소값이면 8.

 

129.

 

- 주소값을 가지니까 8인건, 값으로 가지고 있는거 말고 진짜 주소를 뜻할 때만이다. 

- 배열만 sizeof(a)하면 배열의 자료형 x 값의 개수로 계산한다. 1차원 배열이든, 2차원 배열이든. 

이 때, 배열이 5칸인데 2칸만 채우고 나머지 3칸은 null이어도 4 x 5 = 20이다.

- 포인터변수를 만들고 거기에 배열의 주소값을 넣은 다음, sizeof(포인터)하면 8나온다. 주소값이라.

값 가져오면 4고.

 

- sizeof(a+0)이나 sizeof(a+1)하면 답이 8나옴. 

 

130.

 

- 구조체의 크기 구하는 문제. sizeof.

구조체는 패딩이라는 개념이 있음. 가장 큰 크기에 맞춰버림.

 

131.

 

- char c가 있어도 답은 8, char c와 char d가 있어도 답은 8, char c와 char d와 char e까지 있으면 답은 12.

 

132.

 

- char a, int b, char c 있으면, 가장 큰 거 기준으로 위도 아래도 패딩해줘야 함. 

 

135.

 

- 리틀 엔디안, 빅 엔디안 이런게 있는데 개념은 모르셔도 되고 어떻게 푸는지만 아시면 돼요.

- union 크기 물어본다면, 8바이트 8바이트인데 그냥 가장 큰거 8바이트가 답이다.

- for 반복문에 {} 없으면 1문장만 반복문이다. 이거 놓침.

- 반복문으로 채운 배열은 endian.char_arr인데 출력은 endian.int_arr[1]을 출력하라고 한다.

거기엔 담은게 없는데? 

- 공용체 union이므로 메모리를 공유한다. char이므로 4개가 int 1개가 되어서 2개의 값이 int_arr에 들어간다.

int_arr[0] = 16171819, int_arr[1] = 20212223

- 리틀 엔디안 방식은 근데 출력을 거꾸로 한다. 23222120. 이걸 16진수로 출력한다.

- 빅 엔디안 방식은 그냥 그대로 출력하면 된다. 

- 23을 2진수로 표현하면 0001 0111이다. 이걸 16진수로 표현하면 13이 아니고, 17이다.

 

136.

 

- 틀린 이유. (1)에 "1번 학생"이 나오려면 i+1을 해줘야 하는데 그냥 i만 씀. i는 0부터 시작인데. 실수.

 

137.

 

- 문장 옆에 숫자는 입력이 이거라는 거. 신경쓰지 않아도 됨.

- ~를 출력했을 때, 입력을 완료하고 출력을 해야 한다.

 

141.

 

- 빈칸은 나누기(몫, 나머지)연산자, 부등호, 배열인덱스, 변수이름 같은게 많이 나옴.

- int input = 101110; 

이렇게 그냥 쓰면 이게 10진수인지 2진수인지 구분을 어케 함?

이거 2진수 아니고 10진수임. int는 10진술 정수를 받는다. 

c언어에서 2진수를 표현하는 건 없다. 기본라이브러리에 없다. 

- 020 <- 이거 8진수. 0x20 <- 이거 16진수.

- 그런데 "101110 얘를 2진수 형태로 보는거죠. 실제 2진수는 아니지만.(몰라도됨 그냥 10진수 정수라고 생각)

얘를 10진수로 변환하려면 2의n-1승을 곱해줘야 하죠.

32+8+4+2하면 10진수 값을 낼 수 있어요.

- 정수 나누기 정수는 정수라 계속 10으로 나누면 소수점아래는 사라짐. 

 

142.

 

- (2)에 들어갈 건 배열의 길이이다. nx가 배열의 길이인 5를 갖고 있다.

문제에서 상수값이 아닌 변수명을 쓰라 했으니 변수명으로 써야함. 5도 맞긴 하지만 여기선 ㄴ.

- swap과 sort에서 배열 ary 주소값을 줬는데, 받을 때 ary[]로 받았음.

답변) *ary로 포인터변수로 받아도 됩니다. 배열 형태로 받아도 되구요.

 

143.

 

- 2차원 배열에 문자열 두개를 넣으면 각각 codes[0]과 codes[1]에 들어감. 따옴표로 묶으면 그게 각각의 문자열.

- 2차원 배열은 연속된 공간이라 codes[0][0]이 100번지, codes[0][1]이 101번지이고,

포인터 배열은 codes[0]이 100번지, codes[1]이 200번지.

- strlen(주소값)

이거 하면 그 주소값부터 null 이전까지 문자들의 개수를 셈. 0부터 시작아지고 1부터 셈. 그냥 문자 개수.

- 배열은 2차원이든 3차원이든 물리적으로 연속된 공간이다. 

포인터 배열은 그 값은 다르지만 각각의 주소값이 연속되어있다.

- codes[1]은 여기서 120번지이다.

 

- 1차원 배열 co[2] = {1, 2}일 때, co는 100번지, *co는 1.

2차원 배열 co[2][4]는 co하면 100번지, *co도 100번지, &co도 100번지.

'정처기 실기 문제풀이' 카테고리의 다른 글

자바 58  (0) 2024.04.18