블로그 이미지
송시혁

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

 

이 프로그램을 분석하면,

첫째줄 "the"는 화면에 출력되며,

둘째줄인 first는 위의 그림에서는 띄우지 않았으나 괄호(" 다음에 한 칸 띄어서 작성한다. 그러니깐 (" first~ 이다. 출력을 하면

아래 그림과 같이 the first 라고 띄어져 나온다.

그리고 C program은 한 칸 아래에서 나오게 되는데 그 이유는 뒤에 있는 \n때문이다.

\n은 줄을 바꾸다라는 의미이다. 그래서  C program이라는 글자가 한칸 아래에서 출력이 된다.

그런데  다음 printf문에서 C program뒤에 \n이 붙이지 않았다. 하지만 4번째 줄에서 ("다음에, 그러니까 example. 앞에 \n을 붙였기 때문에 아래 문장에서 출력이 된다. 그래서 아래와 같은 출력이 나온다.

\n은 한 문장으로 취급해야 한다. \이것만 쓰면 이것도 같이 출력된다!!

참고

 // 주석문

주석문이란 문장을 설명할 때 쓰는 것, // 입력하고 다음에 쓰는 문장은 컴파일 되지 않는다.

C언어 교재에는 프로그램을 설명을 하기 때문에 주석문을 많이 볼 수 있다.

 

 

 

 

 

정수형 변수, %d,%x, %X를 다루는 프로그램.

 

 

이번에는 %d와 %x를 알아보겠다.

%d는 정수형을 받는 연산자이다. 연산자는 나중에 배우니 여기에서는 따로 설명하지 않겠다. 그냥 %d가 정수를 대신해서 받아서 화면에 볼 수 있게 나온다고 할 수 있다. 위의 그림에서 int number; 를 선언하였다. int는 정수형 변수이다. 여기서, 변수란 어떠한 값을 저장하는 메모리내에 저장장소라고 정의 되어있다.

int는 정수 integer의 약자이다. 이것을 선언해야 정수 값을 넣을 수 있다.

즉, int number;는 정수를 number에 넣겠다는 뜻이 된다. 당연히 int a, int test등....

여러가지 문자로 반환할 수 있다. 단, 조건이 있다. 위에서 사용하다시피 변수는 영어로 되어있다. 조건이 있기 때문이다.

변수조건

1. 영어

2.처음 글자가 '_' 나 영어가 되어야한다. 이 조건을 만족시키면 뒤에 숫자나 기호를 써도 된다.

예를 들어서 int 1;은 선언되지 않는다. 하지만, int _1;l이나 int a1등은 선언할 수 있다.

조건 2번이 그러한 말이다. 그러나 되도록이면 영어를 쓰는 것이 좋고 나중에 프로그램이 길어지면, 작성자 본인이 변수를 선언한 것이 어떤 것을 선언했는지 찾기 어려운 점이 많아 되도록이면, 알기 쉽게 단어를 사용한다. 예를 들어 합계 = sum,  int sum; 이런식으로 하는 것이 좋다.

3. 함수명은 사용 불가능.

 그 예로 printf문은 사용불가, 그 밖에 프로그램 소스시 다른 명령어와 중복되는 단어는 변수로 사용하지 않는 것이 좋다.

4. 예약어 사용 금지 (if, else...등)

그리고 number = 3; 오른쪽의 3을 number에 대입하겠다는 뜻이다.

그리고 2번째 줄을 보면 number대신에 13이라는 숫자를 넣었다. 필자는 int number =3; 선언문 때문에 혼돈하였다. 그러나 숫자를 써도 number와는 아무런 상관이 없다. 그대신에 정수형을 변환하는 연산자 반드시 %d는 있어야한다. 실수라면 당연히 실수형인 %f가 있어야 한다. 연산자는 아직 본격적으로 들어가지 않았으므로 다음에 자세히 정리하겠다.

 

%x는 헥스의 약자로서 16진수를 대신한다.

3번째 줄은 13을 16진수로 변환한 값이다. 그런데 그 다음줄에는 바로 대문자 D로 출력이 된다. %x는 소문자, %X는 대문자이기 때문에 출력도 대소문자에 맞게 나온다.

그 아래에 것도 숫자만 바꿨을 뿐 동일하게 출력된다.

 

 

 

 

 

다음 프로그램은  길이를 3으로 선언하여 정사각형 넓이를 계산한 값을 출력하는 프로그램이다.

 

 

 

마찬가지로 각각 length와 area를 정수형으로 선언한다.

그리고 길이를 3으로 대입시킨다.

area = 길이 * 길이(length * length)로 대입한다.

그러면 메모리에 int length, int area가 각각의 위치에 먼저 기억되고 다음 lengt에 3을 대입하고 area를 length * length 대입하게 된다. 그리고 나서 3을 대입하게 되며, 결국에는 9라는 값이 출력하게 된다.

 

 

 

 

 

다음은 원주율을 구하는 프로그램이다.

 

#define에 대해서 알아보자

#define문은 정의한다 라는 전처리 문이다. #include가 어떤 것을 포함하는 전처리 문이라면,

#defined은 어떤 수를 정의한다.

위의 #define PI 3.1416;은 PI는 3.1416이라고 완전히 못박아 놓은 것이다.

변수는 어떠한 값을 자유롭게 변할 수 있지만, 상수는 한 번 정하면 절대적이다.

예를들어 위에서 정의한 int number;는 number =3 ;이라고 대입시켜서 3이라고 할 수 있다.그러나  다음문장에 다시 number =4;라고 선언한 뒤, printf("~~", number);라고 명령문을 만들면 위에는 3이였으나, 지금 문장에는 4가 출력된다.

number =3;

printf("%d\n", number); -> 출력시 3

number =4;

printf("%d\n", number); -> 출력시 4

 

 

위의 프로그램을 잘보자. 변수 number =3;은 아래 printf문에 3을 출력한다.

그러나 아래에 다시 4라고 선언한뒤, 아래 printf문은 4라고 출력된다. 이렇듯 number는 상황에 따라 값을 주면, 출력을 달리 할 수 있다. 이것이 변수.

 

 아래그림 참고.

 

 

위의 그림에서 number = 3;선언뒤에 프린트문은 당연히 3이다. 그런데 나중에 number =4;라고 했는데 sum = 3 + 3;(결과값 6)만 출력이 되었다. 3이 넘버에 지정되고 섬에 계산되었는데 나중에 4라고 지정해도 8이 출력되지 않는다. 물론 프린트문 뒤에 sum 대신 number라고 쓰면, 4가 나온다.  하지만, sum은 그대로 6이다. 아래그림을 보자.

 

 

 

이 같은 경우는 넘버를 먼저 4로 지정하고 썸에 계산되어 8이 나왔다. 이처럼 변수 프로그램 작성시에는 무엇이 순서대로 메모리에 저장되는지 아는 것이 중요하다.

메모리에 변수가 선언되고 알맞은 위치에 저장된다.

그리고 3이 넘버에 저장되고 그 값을 갖는다.

다시 4를 선언하여 넘버에 저장된다.

마지막으로 그 4가 썸에 저장되어 비로서 8이 나온다.

위의 잘못된 예는 이 개념을 이해하지 못하여 6이 나온것이다.

 반대로 상수는 변하지 않는 값이다. #define PI 3.1416으로 선언하면 PI는 무조건 3.1416이다. PI를 PI =4;라고 선언해도 다른 수가 출력되지 않는다.  만약에 바꾸고 싶으면, #define PI 4.10으로 수정하면 프로그램 내에 PI는 4.10으로 된다. 이것은 프로그램을 구성시에 같은 숫자가 많이 들어갈 때 쓰면 용이하다. 암튼 이것이 상수와 변수의 차이이다.

 

float이라는 변수는 실수를 선언하는 실수형 변수이다. 프로그램을 보면 알겠지만 원주율 파이는 3.14XXXXX이므로 최종값이 소수점인 형태로 나올 수 밖에 없다. 그래서 실수형 변수인 float을 선언한다.

그리고 아래 프린트문은 위에 설명한 length와 area와  동일하다.

마지막 줄에 %7.2f는 원래 %f이다. 이것은 실수를 표현하는 것으로 %f 앞에 7.2가 붙었다.

이것은  실수를 전제 7자리까지 나타내고 그 중에 소수점 2째자리 까지만 표현하라는 의미이다.

 

 

 

 

 

아래 그림들을 비교해보자!!

 

 

위의 파일은 프로그램 소스이다.

 

 

이것은 어제 배운 순수C파일인 d.i파일이다. int main()위에 전처리문이 없어졌다는 것을 확인 할 수 있다. 즉 #define 또한 전처리문이다. 실제로 스샷위의 이상한 글자가 많이 적혀있다. 그러나 #include나 #define은 나타나지 않는다.

 

 

 

 

 

 

 

 

 

참고사항

C언어는 기본형식을 익히는것 또한 중요하다.

따라서 오늘 가장 기초적인 것을 했지만, 필자에게는 정말로 머리 아프다ㅜㅜ 형식을 익히기 위해 적겠음

#include <stdio.h> -> 전처리 include 에서 함수인 <stdio.h>를 가져온다. 실제로 C언어가 설치된 경로를 확인하면 include안에 <stdio.h>가 들어있는 것을 확인 할 수 있다. 전처리문을 가장 처음에 쓴다. 컴파일 4단계과정을 안다면, 쉽게 이해가능함.

그 다음은 함수 선언.

보통은 void main() 이나 int main()을 주로 쓴다. 이거 말고도 많은 함수가 있다. 전처리문 다음에 무조건 적이다. C 언어 새로운 버전 문법에서는 void보단 int가 많이 쓰인다.

다음 {

이 중괄호가 프로그램 작성 내용을 담는 시작의 괄호이다. 나중에 가장 밑에 }는 닫는 괄호.

어쨌든 { ~ }사이에 내용이 실제 프로그램 내용이 되겠다.

그리고 가장 많이 쓰는 프린트문

pritntf(" 내용\n", 변수);

위와 같이 프린트 명령어를 쓰고 (를 열어 "~"에 출력하고자 하는 내용을 적는다.

\n은 줄을 바꾸다. 출력시 보기가 좋다. 그리고 ,를 찍고 변수등을 뒤에 사용한다는 것을 알아두자. 2장에서 배울 연산자에서 다시 언급하겠음.

 

 

 

 

 

posted by 송시혁
2013. 3. 6. 09:40 2월 수업정리

진법

2 - 0,1

8- 0,1,2,3,4,5,6,7

16 - 0,1,2,3,4,5,6,7,8,9,A,B,C,D,D,E,F

ex) 십진수 10

2진수로 변환

2진법

2의 세제곱 = 8진법 =2진수 3자리가 8진수

2의 네제곱 = 16진법 = 2진수 4자리가 16진수

ex) 110101

1. 8진수

위에서 말했듯이 2진수 3자리가 8진수이므로 3자리를 쪼개어 생각한다

110 /101

110 = 6

101=  5

따라서 110101의 8진수는 65

2.16진수

11 /0101

11=B

0101 =5

따라서 B5가 16진수이다.

 

2진수 계산 = 생략, 다아니깐ㅎㅎㅎ

8진법 계산 ex)76+2 = 100

76

+

2

100

그 이유는 6+2 =0 8진법에서는 0~7이다. 8이 되면 10진법의 에서 9+1이 10이고 한 자리수에 올라가듯이 8진법에서도 6+2에서 0이되고 1이 올라간다. 그리고 7과 더해져서 7+1이 되어 0이 되고 한자리가 올라가서 100이 된다.

반대로 2진수로 변환

8진수 165

1/ 6/ 5

1= 1

6 = 110

5 = 101

1110101이된다.

16진수 75

7=111

5=101

1110101 여기서 잠깐 111101이 아님!!!

위의 글을 잘보면 16진수는 네자리가 2진수 한 자리라고 되어있다

이점을 놓치지 않아야 한다. 111 101의 공백부분의 0을 써야한다

따라서 0111 /0101이 된다. 그래서 붙이면 1110101이 된다. 제일 앞에

0은 아무의미 없으니 안써도 된다. 보기좋으니깐

ㅎㅎ

소수점 2진수로 변환하기

 

예) 1.5를 2진수로 변환하면, 1.1이 된다.

위의 소수인 1.5는 당연히 그대로 놔둔다. 소수점만 생각하는데

0.5를 2로 곱한다. 그러면1.0이 된다

10진수를 2진수로 변환시에는 2로 계속 나누지만 반대로 소수점을 2로 곱한다.

곱해서 0이 되면 멈추고 그의 숫자를 기입하면 된다. 위의 0.5를 2로 곱하여 1.0이 나왔다.

그 1.0의 1을 적으면 된다. 그래서 1.5의 2진수는 앞에 1.5의 1은 그대로 적고 뒤에 0.5를 곱하여 나온 1.0에 1을 소수점 자리에 적게 되면은 1.1이 되는 것이다.

그런데 1.4를 예를 들어보자.

1.4도 마찬가지로 1은 그대로 놔두고 0.4를 2로 곱해보자

0.4*2 = 0.8 ->0

0.8 * 2 =1.6 ->1

여기서 1.6의 0.만 곱한다. 1은 없다고 친다.

0.6*2 =1.2 -> 1

0.2*2 =0.4 -> 0

여기서 낌새를 챈다. 0.4가 다시 나왔다.

그래서 곱해도 계속 같은 형식으로 반복이 될것이다

0, 1, 0, 0, 1, 0.......

이런식으로 반복이 된다. 따라서 1.4를 2진수는 1.010010010......

이런식으로 반복되어 완벽히 표현할 수 없다.

8비트 연산개념

부호가 1이면 - , 0이면 + 이것을 부호비트라고 한다.

부호

숫자

-

1

1

1

1

1

1

1

1

+

0

1

1

1

1

1

1

1

 

 

 

 

                        0                         127    128                                 255

 

 

     0                             127    128                      255

오른쪽 128에서 255를 왼쪽으로 옮기면, 아래 그림처럼 된다.

              128    129  130.....            255  0 1  2.....

               (-128) (-127) (-129)                (-1)

8비트 10진수 변환시 1111 1111 255이다. 그러나 이것은 -1로 나온다.

 

부호비트를 잘생각해보자.

0000 0001 -> 앞에 0이 붙으면 +

1111 1111 -> 앞에 1이 붙으면 -

1의 2진수 = 0000 0001 -> 1

255의 2진수 = 1111 1111 -> -1

1은 0000 0001.

 

보수법

10진수의 10의 보수와 9의보수.

1. 9의 보수

연산을 했을 때 각자리수가 9가 되게 하는 수이다.

예를 들어서 371이라는 숫자가 있는데 371의 9의 보수는 다음과 같다.

   3    7     1

+ 6    2     8 

 

  9     9     9

더셈해서 9가 되게 하는수 이것이 9의 보수!

371의 9의 보수는 628이다.

10의 보수는 얼마인가??

10의 보수는 9의 보수에서 +1을 해주면 된다.

따라서, 371의 10의 보수는 629가 된다.

2진수.

2진수에서는 1의 보수와 2의 보수가 존재한다. 1의 보수는 더해서 1이 나오게 하는 값이다

2진수는 1과 0 밖에 존재하지 않으므로 2진수의 1의 보수는 반대로 쓰기만 하면 더해서 1이나오게 하는 값이 나온다.

다시 말해서, 어떤 수가 있으면 반대로 쓰면 된다. 0이면 1, 1이면 0.

   1 0 1

+ 0 1 0 -> 이것이 101의 1의 보수.

2의 보수 = 1의 보수 + 1

010 + 1은 011 이것이 2의 보수이다.

 

 

음수 찾기.

 

128    129                       255  0    1

-128  -127 -126                 -1  0   1 2  3                            127           

이것을 보고 이해해야 한다. 일단 가장쉬운 1과 -1관계.

8비트에서 2진수는 1은 0000 00001 이거의 1의 보수는

1111 1110이 된다. 여기에서 1을 더하여 2의 보수를 만들면 1111 1111이된다.

10진수로 변환하면 255가 된다. 255는 실제로 -1이된다.

1과 -1은 2의 보수 관계

따른 숫자도 마찬가지로 2의 보수관계에 놓여있다.

73과 -73

73 = 01001001

역으로 쓰면 10110110 여기서  +1하면

10110111 10진수 변환하면 183 하지만 183은 -73이다. 255 - 183 = 72 이것은 255로 부터 72만큼 떨어져 있다. 255가 -1이니 -72가 아니라 -73이 나온다. 이것을 증명하기 위해 역으로 보수법을 취해보자.

10110111을 1의 보수 01001000이다. 다시 1을 더하면 01001001이된다. 73과 동일한 숫자로 나온다. 73의 음수 -73은 서로 2의 보수관계이며 10진수로 183이된다.

이것을 이용하면 뺄셈이 가능하다. 기본적으로 컴퓨터는 뺄셈을 못한다.

그러나 위의 보수법으로 빼고자 하는 수를 음수로 만들면 가능하다. 예를 들어 3-2 =1

여기서 2를 -2로 고치면 된다.

0000 0010의 역수 1111 1101 +1 = 1111 1110 이것이 -2이다.

3의 2진수 0000 0011

   0000 0011

+ 1111 1110

 10000 0001이된다. 9자리가 된다.

앞에 1은 8비트에서 표현을 못하여 0000 0001이된다.

3-2 = 1과 같은 동일한 값이 나온다.

 

'2월 수업정리' 카테고리의 다른 글

2월 20일 수업정리  (0) 2013.03.04
2월 28일 수업정리  (0) 2013.02.28
2월 27일 수업정리  (0) 2013.02.27
2월 19일 수업정리  (0) 2013.02.26
2월18일 수업정리  (0) 2013.02.26
posted by 송시혁

C언어 기본 작성 방법

위에 보이는 경로에 내 문서- 수업(새 폴더 만들기) - C언어수업(새 폴더 만들기)- 날짜 (2013-03-05)

 

위의 경로를 복사하여 아래 그림과 같이 메모장 에 복사한다. 참고로 위의 main.c, main.exe, main.obj는 내가 프로그램을 완성시켜서 그런것이다. 처음 할 때는 없다!!

 

 

위에서 enter를 친다. 그렇게 되면 아래 그림처럼

 

 

 바로 생성한 파일의 경로에 저장할 수 있게 된다.

 

프로그램을 메모장에 작성한뒤 저장한다

 

main.c로 저장한다. 확장자 반드시 .c!!!!

 

 

 

아까 만들었던 폴더에 우클릭해서 프롬프트 실행한다. 아이콘에 우클릭 아님.

 

프롬프트에 cl main.c를 친다

잠시 기다리다가 글자가 나오다가 멈춘다

그리고 D:\내문서\C언어 수업\2013-03-15>라는 필자가 지정한 경로가 나오는데 여기에서 main이나 main.exe로 입력한다. tab키를 눌러도 된다!!

그러면 pritntf문에서 작성하였던 내용이 출력되는것을 확인 할 수 있다.

그리고 main.exe와 main.obj가 생성되는 것을 볼 수 있다. 참고로 위의 생성되어 있는 것은 먼저 실행해서 만들어 놓은 것을 스크린 샷 햇다. 처음부터 하려니 귀차니즘이 ㅎㅎ

 

자 이번엔 위의 그림에서 아이콘 3개를 보자!!! 그리고 아래에 추가된 아이콘들을 잘보자!!!

 

main.c와 main.asm파일이 추가 된것을 알 수 있다. 이 파일들을 만드는 특정한 명령어가 있다.

main.i= cl /P 파일명.c, cl 파일명.c /P

main.asm= cl /Fa 파일명.c, cl 파일명.c /FA

입력한다. 반드시 대소문자를 구분하며 띄어쓰기도 해야한다. 파일명이 main이므로 명령어 뒤에 main.c를 입력한다. 만약에 test.c라면 cl /P test.c라고 입력한다. 그러면 test.i라는 파일이 생성 될것이다.

그러면 위의 그림처럼 각각의 아이콘이 나온다.

처음에 보이지 않는 이유는 원래는 이 파일을 만든다. 그런데 컴파일 과정에서 이 두 개의 파일을 지우는데 대신에 temp라는 파일에 저장이 된다. 그러니깐 위의 경로상에서 보이지 않을 뿐이다. 위의 명령어로 파일을 생성한 것은 2개의 파일을 temp라는 파일에서 명령어로 강제로 복사하여 가져온 것이다.

 

 

자, 그럼 다음으로 이 두개의 파일을 열어 보겠다. 일단 main.i를 C프로그램으로 열어보겠다.

 

이렇게 뜬다. 스클롤을 내려서 가장 아래 부분으로 가면은

우리가 프로그램한 문장이 보인다. 그런데 #include <stdio.h>가 보이지 않는다. 위그림에서 보이는 빨간네모 위에 여러 글자가 보이는데 #include 가 전처리 되어 나온것이다. 그래서 .i를 순순 C파일이라고 한다.

그러면 main.asm은 메모장으로 열어보겠다

 

이런 화면이 나타난다. 위의 C프로그램으로 열었던 것보다 촘촘하게 글자가 붙어있다.이 asm파일은 순수 파일인 main.i를 어셈블리어로 바꾼 파일이다. 이 어셈블리를 완벽하게 다룬다면 C언어가 필요없다. 그러나 어셈블리를 모르므로....... 보기만 해도 머리가...

이것을 나중에 만든다던데 ㄷㄷ;

 

암튼 이제는 아래그림과 같이 main.c를 복사하여 사본파일을 뒤에 확장자 .dat로 바꾼다.

 

이것을 C언어 프로그램을 연결하던지 C언어 프로그램을 직접열고 드래그해서 끌어오면 다음과 같은 화면이 생성된다.

16진수 코드로 되어 있는 코드를 볼 수 있다. 제일 앞에 4D 5A를 마우스로 드래그 하면 오른쪽에 MZ로 해석이 된다. 이것은 main.exe 파일 고유의 000이다.

다음음 bmp파일과 jpg파일을 C언어로 연결한 모습이다. 당연히 확장자를 각각 .dat로 바꾼 뒤 연결한다.

 

bmp파일

 

 

 

jpg파일

 

이론 수업!!

ALU

CU

Register

Register에서 Alu로 명령을 하는데 이것을 프로그램이라고 부른다.

cpu안에 이 3대 구성요소가 존재하며, 이것을 통합하여 core라고 부른다

 

컴파일은 간단히 말해서 기계어 -> 컴퓨터 언어로 바꾸는 과정을 통틀어 컴

파일이라고 한다.

컴파일 과정을 살펴보자.

실행.exe <- 0101011101<- mov ax.bx <- ax=bx<- 프로그램.c

0101011101은 어셈블리어를 통합하여 기계어로 바꾸어 놓은 상태. 즉, 컴퓨터 언어로 바꾸어 놓은 상태이다.

mov ax.bx는 어셈블리어이다.

실행.exe는 기계어를 링크시켜서 만들어내 실행 파일. 우리 인간이 컴퓨터 화면으로 볼 수 있게 윈도우에 맞춰서 연결하는 것을 링크이며 이 프로그램을 링커라고 한다.

 

ax=bx 전처리된 순수한 파일.i이다. ax=bx, mov ax.bx, 0101011101은 다 똑같은 말이다. 그런데 그것을 순수 C파일, 어셈블리어, 목적파일인 기계어로 바꾸어진 형태로 서로가 달리 보인다. 여기서, 알 수 있는 사실은 우리가 0101011101처럼 기계어를 알면 C언어를 배울 필요가 없다. 그러나 0101011101을 다알기는 전문가가 아니면, 거의 불가능하므로 C언어를 통하혀 컴파일 하여 프로그램을 작성을 하는 것이다.

 

 

컴퓨터의 구조(미완성)

ppt 참고

 

컴퓨터 구성.ppt

 

posted by 송시혁