UNIX C Programming 실습

차 례

1. Introduction to C

2. Starting to C programming

3. Telnet, FTP & VI Editor

4. UNIX C programming 예제(sample1.c ∼ sample16.c)

1. Introduction to C

□벨 연구소의 릿치(Ritchie)가 어셈블리어로 작성된 UNIX를 고급어로 고쳐 쓰기 위해 고안한 언어(1972)로 NB(Next to B)라고 불리기도 했다.

□기존의 C 언어를 표준화하기 위해 ANSI C 공표(1989)

□시스템 기술용 언어 -> 범용 프로그래밍 언어로 발전(C->ANSI C -> C++/C)

□C 의 특징

① 이식하기 편리한 언어

② 범용 목적 언어

③ 프로그램 이해가 쉽다(top-down design, structured programming, 모듈화된 프로그래밍 지원)

④ 융통성(다양한 제어구조와 자료구조, 풍부한 연산자 제공)

⑤ 강력(개발 시스템의 실행 속도)

⑥ 중간수준 언어(고급언어와 어셈블리 언어의 장점만 취함)

2. Starting to C programming

□프로그래밍 4 단계

① editing

② compiling : object file 생성

③ linking

④ executing

□HOW TO in UNIX

① edit : 문서 편집기 vi 이용(vi ex.c)

② compiling : UNIX C 컴파일러 이용(cc ex.c) -> ex.o 생성됨

③ linking : 컴파일시 자동 실행 -> a.out 생성됨(default)

cf.) cc -o ex ex.c -> ex 실행파일 생성

④ executing : a.out 실행시킴

3. Telnet, FTP & VI Editor

□Telnet

① UNIX 의 shell 모드를 원격 터미널에서 흉내내기 위한 service protocol

② TCP 세션을 통해 연결

③ 공개용 프로그램 : NetTerm, 데이터맨프로, 이야기, telnet(Win98) 등

④ Telnet IP : comedu.knue.ac.kr (SunOS 5.8)

⑤ Telnet ID/PWD : test01∼test15/tykim01∼tykim15

□FTP

① Telnet과 동일한 ID/PWD로 접근 가능

② 편집기로 프로그램을 미리 작성한 후 FTP를 통해 UNIX에 전송한 후 컴파일 및 실행

□VI Editor : UNIX에서 사용되는 표준 텍스트 편집기

① 명령모드 : 편집을 위한 명령의 입력이 가능한 상태로 초기 상태

② 입력모드 : 텍스트를 입력할 수 있는 상태

□명령모드□입력모드

① i(insert) : 텍스트가 커서 앞에서 삽입된다.

② a(append) : 텍스트가 커서 뒤에서 삽입된다.

□입력모드□명령모드 : ■■

□명령모드에서의 커서 이동 : 커서이동키 사용/h, j, k, l

□편집 명령

① x 현재 커서위치의 글자 지우기

② dd 현재 커서 위치의 한 행 모두 지우기

③ yy 현재 커서 위치의 한 행 복사해 놓기

④ p 삭제되거나 복사된 행 붙이기

□파일저장

① :q 수정이 안되었을 때 종료 - 수정되었을 때에는 종료 불가

② :q! 저장하지 않고 무조건 종료

③ :w 파일명  정해진 파일명으로 저장

④ :wq 현재의 파일 이름으로 저장하고 종료

□FTP : Telnet과 VI Editor를 통해 프로그래밍하기 어려울 때에는 윈도우에서 윈시 프로그램을 작성하고, 작한한 파일을 FTP를 통해 전송한다.

4. UNIX C programming 예제(sample1.c ∼ sample16.c)

□간단한 프로그램의 구조

① 프로그램은 하나 이상의 함수로 구성

② 이 중 하나는 반드시 main()이라는 함수어야 함.

③ 함수는 머리(header)와 본체(body)로 이루어짐

/* sample1.c */

#include <stdio.h>

main()

{

printf("We are the world!\n");

}

/* sample2.c */

#include <stdio.h>

main () /* 함수의 이름 */

{

int num;

num = 1;

printf("I am a simple");

printf("computer. \n");

printf("My favorite number is %d because it is first.\n"　, num);

}

/* sample3.c */

#include <stdio.h>

main( )

{

printf("I will call the butler function.\n");

butler( );

printf("Yes, Right\n");

}

butler( )

{

printf("This is butler function\n");

}

/* sample4.c */

#include <stdio.h>

main()

{

char sign;

sign =□A□;

printf(□The value of A is %d.\n□, sign);

printf(□The character of A is %c.\n□　, sign);

}

/* sample5.c */

#include <stdio.h>

main ( )

{  /* 자료형의 크기는 sizeof() 사용 */

printf("Type int has a size of %d bytes.\n", sizeof(int));

printf("Type char has a size of %d bytes.\n", sizeof(char));

printf("Type long has a size of %d bytes.\n", sizeof(long));

printf("Type double has a size of %d bytes.\n", sizeof(double));

}

/* sample6.c */

#include <stdio.h>

main()

{

int a, b, c;

scanf("%d %d", &a, &b);

c=a+b-2;

printf("%d + %d - 2 = %d\n", a, b, c);

}

□문자와 문자열

① 문자 : □a'

② 문자열 : "Tom"

③ 문자열의 크기를 재는 함수 : strlen()

④ 배열 : 동일한 자료형의 변수들의 나열(같은 이름을 가지고 첨자(subscript)로 구분)

/* sample7.c */

#include <stdio.h>

#define TELE "your telephone number is"

main()

{

char name[50], num[10];

printf("Input your name \n");

scanf("%s"　, name);

printf("Input your telephone number \n"　);

scanf("%s"　, num);

printf("Hi, %s, %s %s ! \n"　,name, TELE,num);

printf("%s has %d byte length \n", name, strlen(name));

}

/* sample8.c */

#include <stdio.h>

main(){

int a[5],i,sum;

int average;

for(i=0;i<=4;i++)

scanf("%d",&a[i]);

for(i=0,sum=0;i<=4;i++)

sum+=a[i];

average=sum/5.;

printf("The average is %d.\n",average);

}

□printf()의 변환 지정자

변환지정자	변환 작용	인수 형
%d	인수를 10 진수로 변환	정수형
%o	인수를 8 진수로 변환	정수형
%x	인수를 16 진수로 변환	정수형
%u	인수를 부호없는 10 진수로		정수형
%c	인수를 문자로 출력	정수(문자)형
%s	인수를 문자열로 출력(NULL 앞까지 또는 지시된 문자 수만큼)	문자형
%f	인수를 10 진수 실수	부동소수형
%e	인수를 10 진수 지수형	부동소수형
%g	%f 나 %e 의 변환 중 문자수가 적은 쪽으로	부동소수형

□프로그램 흐름의 제어(control)

① 일련된 명령어의 순차적의 실행(Sequence)

② 어떤 조건이 만족될 때까지 반복(Iteration)

③ 조건에 따라 명령문 선택(Selection)

/* sample9.c     실행(if 문) */

#include <stdio.h>

main() {

int num;

printf("Enter your number.\n");

scanf("%d"　,&num);

if(num >= 0 ) {

printf("　%d = zero or positive\n",num);

}

else {

printf("%d = negative\n",num);

}

}

/* sample10.c     반복문(for문) */

#include <stdio.h>

main()

{

int num;

for(num=1;num<=6;num++)

printf("%5d %5d\n"　,num, num*num*num);

}

/* sample11.c      반복문(while문)*/

#include <stdio.h>

main()

{

int a, i;

a=i=0;

while(i<10) {

i++;

a=a+i;

}

printf("1+2+□□+10 = %d\n",a);

}

/* sample12.c      선택문(switch 문)  */

#include <stdio.h>

main()

{

int a;

scanf("%d", &a);

switch(a) {

case 1:

printf("%d was entered.\n"　,a);

break;

case 2:

printf("%d was entered.\n",a);

break;

default:

printf("default\n");

break;

}

}

□포인터(pointer)

① 자료나 함수를 가리키는 메모리의 번지(포인터상수), 이것을 저장하는 변수(포인터변수)

② 메모리 번지 연산자 &를 써서 번지를 알 수 있다.

③ 간접 연산자 *를 써서 포인터가 가리키고 있는 자료(함수)의 내용을 알 수 있다.

④ 포인터 변수의 사용 절차 : 포인터 변수의 선언, 대상객체 지정, 사용

/* sample13.c */

#include <stdio.h>

main() {

int a=3, b=5, *p;

p=&a;

printf("a=%d, b=%d, *p=%d\n", a, b, *p);

}

/* sample14.c */

#include <stdio.h>

main()

{

int x,y;

x=5;

y=10;

printf(□value of x and y in main() before change: %d %d\n　□,x,y);

swap(x,y);

printf(□value of x and y in main() after change: %d %d\n□,x,y);

}

swap(a,b)

int a,b;

{

int temp;

printf(□value of x and y in swap() before change: %d %d\n　□,a,b);

temp=a;

a=b;

b=temp;

printf(□value of x and y in swap() after change: %d %d\n　□,a,b);

}

/* sample15.c */

#include <stdio.h>

main()

{

int x=5,y=10;

printf(□Before change:x=%d,y=%d\n□,x,y);

swap(&x,&y);

printf(□After change:x=%d,y=%d\n□,x,y);

}

swap(px,py)

int *px,*py;

{

int temp;

temp=*px;

*px=*py;

*py=temp;

}

□구조형(구조적 자료형, structured data type) : 기본 자료형을 그룹화하여 하나의 새로운 자료형을 만듦

/* sample16.c */

#include <stdio.h>

main() {

struct pupil {

int no;

char name[20];

};

struct pupil x={10, "lee"}, class[40], *px;

int i, n;

printf("How many?");

scanf("%d", &n);

for(i=1; i<=n; i++) {

scanf("%d %s", &class[i].no, class[i].name);

printf("number is %-10d and name is %-10s\n", class[i].no, class[i].name);

}

px=&class[1];

printf("1st name : %-10s\n", px->name);

}