시스템프로그래밍기초 (2주차)

post-thumbnail

프로그래밍과 준비

프로그램 작성

  • $vim sourcename.c

컴파일

  • $gcc sourcename.c
  • 결과 (목적 파일) : a.out
    기본적으로 컴파일은 인간이 알아듣는 code를 binary로 machine이 알아들을수 있게 변환해주는 것이다.

목적 파일명 지정

  • $gcc -o exename sourcename.c

실행

컴파일은 vi 에디터를 통해서 source, C를 만들었으면 $gcc sourcename.c를 컴파일을 하면 binary파일이 만들어 진다. 이후 binary 파일은 $./a.out이 되면 실행이 되서 컴퓨터에서 돌아간다.

프로그램 출력

$gcc sea.c
  • 앞에서 작성한 프로그램을 컴파일
  • 코드에 오류가 없다면 실행 파일 (목적파일)인 a.out이 생성
$./a.out

from sea to shining C

  • 프로그램 수행 결과
/*sea.c*/

이것은 주석을 나타내며, 컴파일러는 이것을 무시한다. 인간이 읽으라는 용도로 존재한다.
주석이 없는 소프트웨어는 개발할때만 이해되고, 개발이 끝나면 아무도 이해할수 없다. 유지보수가 될 수 없다. 항상 모든 코드에 주석을 충분하게 달아야 한다.

#include <stdio.h>

"#" 으로 시작하는 행은 전처리기(Preprocessor)에서 처리 됨. 전처리기는 코드를 여러줄을 반복해서 처리하든지, 안에서 다양한 종류를 귀찮게 워드프로세서 정도의 역할을 하는 게 있다면, 그걸 묶어서 기계가 간단하게 처리할수 있는것이다. 컴파일러 전에, 뭔가 일을 처리하는 역할이다.

prinf() 함수 사용 위해 <stdio.h> 헤더 파일을 복사한다.

int main(void)
  • 식별다 다음에 괄호 ()가 오면 그 식별자는 함수라는 것을 나타냄
  • 프로그램은 함수로 구성됨
  • 프로그램의 수행은 항상 main() 함수로 부터 시작함
  • main() 함수 정의
    -> void : 인수를 받지 않음
    -> int형 return 값을 가짐

입력을 받는것은 void이고, 출력은 int 형을 낸다. 그 함수의 이름은 main 이다.

Dissection of the sea Program

{ }

  • 중괄호는 여러 문장들을 그룹화하기 위해 사용됨
  • 즉, 중괄호로 둘러싸인 것은 하나의 단위로 취급됨
prinf()
  • 화면 출력기능을 가진 library 함수, stdio.h
"from sea to shining C\n"
  • 큰 따옴표로 둘러싸인 일련의 문자들을 문자열 상수(sting)라고 함
    C에서는 string은 단 하나의 배려도 없이, 문자열을 다룬다. 0~255까지의 숫자들을 모아놓은것이다. 이걸 모아서, 제일 마지막에 0으로 틀어 막아 놓는다.
  • 문자열 상수를 이루는 단어들은 그 본래의 의미를 잃어버림
  • \n은 개행(New line) 문자를 나타냄 -> 프로그래머가 직접 지시해야함
  • 프로그램 상에서 일반 문자로 표현할 수 없는 것을 표현하고 싶을 때 역슬래시\와 결합된 문자를 사용함

Dissection of the sea program

prinf("from sea to shining C\n");
  • C에서 모든 문장은 세미클론으로 끝남
return 0;
  • 0 값을 운영체제에 return

prinf()

  • 화면에 출력하는 함수
  • 연속적으로 prinf()가 있을 경우, 뒤에 나오는 Prinf()의 출력은 바로 앞 prinf()의 마지막 출력 위치에서부터 시작하여 출력한다.
  • 즉, 예제의 prinf("from sea to shining C\n");는 다음 코드와 동일한 내용을 출력한다.

C에는 행의 개념이 없다. 그지만, 행을 나누는게 읽기 편하다.

# include <stdio.h>

int main(void)
{
    int miles, yards;
    float kilometers;
    miles = 26;
    yards = 385;
    kilometers = 1.609 * (miles + yards/1760.0);
    printf("\nA marathon is %f kilometers. \n\n", kilometers);
    return 0;
}

(#define과 #include의 사용)

#define LIMIT 100
#define PI 3.14159
#define C 299792.458
  • #: 전처리기 지시자 (preprocessing directive)
  • LIMIT, PI, C: 심볼릭 상수(symbolic constant)
# include "my_file.h"
  • 코드에 my_file.h 파일의 사본 포함

  • C에서 제공하는 표준 헤더 파일

  • const : ANSI C에 소개된 한정자, 초기화 이후 값 변경 불가

  • double : 유효숫자 15자리

  • float : 유효숫자 6자리

  • 숫자를 입력 받을때, 여백(공백, 탭, 개행)은 건너뜀

  • 하지만, 문자를 입력 받을 때는 건너뛰지 않음

  • AB C 3 55 77.7로 입력하면 제대로 실행되지 않음

  • 세번째 문자로 ' '(공백문자)를 읽고나서 'C'를 10진 정수로 읽고자 하기 때문에 문제가 됨

Flow of Control

선택

  • if
  • if-else

반복

  • for
  • while
  • do-while

if 문

  • 일반적인 형태

    if (expr)
    statement

-> 조건식 (expr)이 참이면 문장 실행
-> flase : zero, true : non-zero
-> 단문이면 {} 생략

a = 1;
if (b == 3)
	a = 5;
prinf("%d", a);

-> == 는 is equal to
-> b가 3이면 a=5
-> b가 3이 아니면 문장 (a=5) 실행 안함, printf()문 실행 시 1 출력

if-else 문

if (expr)
statement1
else
statement2

-> 조건식이 참이면 (expr이 0이 아니면) 문장1 실행,
그렇지 않으면 문장2 실행

-> 여러 문장을 포함해도 if-else문 전체가 하나의 문장

while 루프

  • 일반적인 형태
while (expr)
	statement

-> 조건식이 참이면 (expr이 0이 아니면) 문장 실행 후, while 루프 처음으로 복귀, expr이 0이 될 때까지 반복

for 루프

  • 일반적인 형태

    for (expr1; expr2; expr3)
    statement

함수

  • C프로그램은 여러 파일들을 가질 수 있으며, 각각의 파일은 여러 함수들을 가질 수 있음
  • main()함수
    -> 이 함수로부터 프로그램 시작, main()함수에서 다른 함수가 호출되어 프로그램이 구성됨
int main(void)
{
	subfunction1(arguments);
}

subfunction1(arguments)
{

}
  • 함수 원형 (function prototype)

함수의 선언과 정의

  • 함수 선언 (function declaration)
float maximum(float x, float y);

-> 컴파일러에게 maximum() 함수가 2개의 float형 인자를 가지고, 리턴 값은 float형이라는 것을 알려줌

배열

  • C에서 문자열(string)은 문자(Character)의 배열이고, 배열 이름 자체가 하나의 pointer임

  • 배열은 동일한 형을 갖고 개수가 많은 변수가 요구될 때 사용

int a[3]

  • 이 배열은 int형 원소 a[0], a[1], a[2]로 구성
  • 배열의 첨자는 항상 0부터 시작
  • C에서 배열, 문자열, 포인터는 밀접하게 관련되어 있음

    char *p, s[100];

  • 'p'가 포인터 변수인데 반해, s는 s[0]을 포인트하는 포인터 상수
  • s[i] 와 *(s+1)은 동등

문자열

  • C에서 문자열은 문자의 배열
  • 다음 프로그램은 문자열에 사용자가 입력한 라인을 저장한 후, 화면에 입력의 역순으로 출력하는 프로그램

포인터

  • 포인터는 메모리에 있는 한 대상의 주소
  • 배열명은 그것 자체가 하나의 포인터
  • 다음에 나오는 프로그램은 배열과 포인터의 관게에 대해 설명하기 위해 설계됨

입출력 재지정

  • 프로그램을 컴파일하고 dbl_out 파일이란 실행 코드를 만들었다면 다음 4가지 방법으로 재지정을 이용하여 프로그램을 호출할 수 있음
  1. dbl_out
  2. dbl_out < infile
  3. dbl_out > outfile
  4. dbl_out < infile > outfile

0개의 댓글