GEN1031 Computer Programming Chapter 2 Kichun Lee Department of Industrial Engineering Hanyang Univesity 1
Name Addr Content Lecture++; Lecture 3 2
2.1 프로그램구조 (Program Structure) 3
/*-----------------------------------------*/ /* Program chapter1_1 */ /* This program computes the */ /* distance between two points. */ #include <stdio.h> #include <math.h> int main(void) { /* Declare and initialize variables. */ double x1=1, y1=5, x2=4, y2=7, side_1, side_2, distance; /* Compute sides of a right triangle. */ side_1 = x2 - x1; side_2 = y2 - y1; distance=sqrt(side_1*side_1 + side_2*side_2); /* Print distance. */ printf("the distance between the two " "points is %5.2f \n", distance); return 0; /* Exit program. */ } /*-----------------------------------------*/ 주석 전처리기, standard C library 모든 C 프로그램은 main 함수를포함하며, 매개변수를이용하지않고, int 값으로반환한다. { 시작 변수선언, 초기값 ( 필요한경우 ) 문장 문장의끝에는 ; 들여쓰기 return 0 들여쓰기 들여쓰기 } 함수의끝 4
일반적형태 (General Form) preprocessing directives int main(void) { declarations statements } main 함수는두가지종류의명령을포함 : 선언과문장 함수내에존재하는각각의선언및문장의끝에는세미콜론 (;) 이필요하다. 전처리기지시자는끝에는세미콜론 (;) 이필요없다. 프로그램을종료하기위해서는, return 0; 문장을사용한다. 5
추가문제 /***************************************************/ /* Program chapter1 */ /* This program computes the sum of two numbers */ #include <stdio.h> int main(void) { /* Declare and initialize variables. */ double number1 = 473.91, number2 = 45.7, sum; /* Calculate sum. */ sum = number1 + number2; /* Print the sum. */ printf( The sum is %5.2f \n, sum); system("pause"); /* keep DOS window on the screen*/ return 0; /* Exit program. */ } /****************************************************/ 6
2.2 상수와변수 수학에서변수는무엇입니까? f(x) = x 2 +x+4 C언어에서는, 변수는어떠한값을가지고있는메모리의위치 식별자또는변수의이름은메모리의위치를참조하는데사용 7
메모리 double x1=1,x2=7,distance; name address Memory - content x1 x2 distance 11 12 13 14 15 1 = 00000001 7 = 00000111? = 01001101 당신의컴퓨터에얼마나많은메모리공간을가지고있습니까? 2Gbyte memory 입니까? 1K=10 3 or 2 10 = 1024 1M=10 6 or 2 20 = 1024 2 1G=10 9 or 2 30 = 1024 3 16 8
메모리스냅샷 (Memory Snapshot) Name Addr Content x1 1 y1 5 x2 4 y2 7 side_1? side_2? distance? 9
유효한식별자를구별하기위한규칙 ( 변수이름 ) 알파벳문자나밑줄표시로시작해야함 (e.g., abcabc_) 오직문자, 숫자, 밑줄표시로만구성 (no special characters ^%@) 대소문자구분 (AbC, abc are different) 식별자로서 C에서사용하는키워드를사용할수없음 (e.g., if, case, while) 10
C 언어의표준키워드? distance 1x x_1 rate% x_sum switch initial_time DisTaNce X&Y 11
C 수치형데이터형태 12
Example 데이터 - 형태의제한 13
C 문자데이터형태 : char char result = Y ; 메모리에서모든것은이진값으로저장되고, 그것은문자또는정수로해석될수있다. 예를들면, ASCII Codes 방식이있다. 14
메모리 어떻게 a 를나타내는가? char My_letter= a ; int My_number = 97 메모리에는항상 1 과 0 값을포함하고있다. 이것은우리가보는관점에따라달라진다. 예를들면, 01100001 는정수로보면은 97 이고문자로보면은 a 가된다. 3 과 3 은같지않다. 2.5 는어떻게처리하는가? name address My_letter My_number 0 1 2 3 4 5 6 Memory - content a = 01100001 97 = 01100001? = 01001101 15
Program to Print Values as Characters and Integers 16
상수 (Constants) 상수는우리의프로그램에서사용하는특정한값이다. 예를들면, 3.14, 97, a, or hello 프로그램에서는, int a = 97; char b = a ; double area, r=2.0; double circumference; area = 3.14 * r*r; circumference = 2 * 3.14 * r; 01100001 01100001?? 2.0 a b area circumf erence r 17
기호상수 (Symbolic Constants) 만약에더정확한 의추정값을사용하고싶다면? 예를들어, 3.14 대신에 3.141593 를사용하자하는경우 여러분은손으로모든것을고쳐야한다. 더좋은해결책을위해, 를기호상수로정의한다. #define PI 3.141593 area = PI * r * r; circumference = 2 * PI * r; 전처리지시자 (preprocessor directive) 로정의한다. 컴파일러는각각의지시식별자가나타났을때상수값으로변환시켜준다. 18
2.3 할당선언 (Assignment Statements) 변수에값을할당하는데사용되어짐 일반적형태 : 식별자 = 수식 ; /* = 는수식에식별자를할당한다는것을뜻함 */ 예 1 double sum = 0; 예 2 int x; x=5; 0 5 sum x 예 3 char ch; ch = a ; a ch 19
할당예제 ( 계속 ) 예 3 int x, y, z; x = y = 0; right to left! x y 0 0 2 5 Z = 1+1; z 2 예 4 y=z; y=5; 20
다른형태의할당예제 int a, b=5; double c=2.3; a=c; /* data loss */ c=b; /* no data loss */? 5 2.3 2 5.0 a b c long double, double, float, long integer, integer, short integer, char 데이터가손실될수도있습니다. 조심하세요 데이터손실이없습니다. 21
연습 : swap 변수 x 와 y 의할당된값을바꿔주는문장을작성합시다. x y 3 5 x y 5 3 Before After 22
연습 : swap 첫번째순서 x=y; y=x; x 3 x 5 x 5 y 5 y 5 y 5 Before After x=y After y=x 23
연습 : swap 솔루션 temp= x; x=y; y=temp; x y temp 3 5? x y temp 3 5 3 x y temp 5 5 3 x y temp 5 3 3 Before after temp=x after x=y after y = temp 다음솔루션도잘작동합니까? temp= y; y=x; x=temp; 두개의변수의값을바꿔주는 C 프로그램코드를작성하세요. 24
Name Addr Content Lecture++; Lecture 4 25
산술연산자 (Arithmetic Operators) 더하기 + sum = num1 + num2; 빼기 - age = 2007 my_birth_year; 곱하기 * area = side1 * side2; 나누기 / avg = total / number; 모듈러스 (moduls) % lastdigit = num % 10; 모듈러스는두개의정수를나눈나머지의값을반환 Example 5%2 는 1 값을반환 이항 vs. 단항연산 위의모든연산자는이항연산자이다. ( 이유 ) - 는단항연산자이다, e.g., a = -3 * -4 26
산술연산자 (Arithmetic Operators) id = exp 는 exp 의결과에 id 를할당한다. X=X+1 다음과같다. 첫째로 X+1 을수행 결과를 X 로할당 X 는 4 라고가정하고, X=X+1 을실행한다. 4 X 5 27
정수나누기 vs 실수나누기 두개의정수사이에서의나누기는결과가정수 결과값은잘려진형태이고, 소수점이생략 Example: int A=5/3; A 는값이 1 int B=3/6; B 는값이 0 소수점값을반환하기 : double A=5.0/3; A 는값이 1.666 double B=3.0/6.0; B 는값이 0.5 28
단순한산술연산을계산 / 출력하는프로그램실행하기 Declare a=2, b=5, c=7, d as int Declare x=5.0, y=3.0, z=7.0, w as double d = c%a Print d d = c/a Print d w = z/x Print w d = z/x Print d w = c/a Print w a=a+1 Print a 다른산술연산도시도해봅시다.. 29
복합연산과산술연산에서의우선순위 int a=4+6/3*2; a=? int b=(4+6)/3*2; b=? a= 4+2*2 = 4+4 = 8 b= 10/3*2 = 3*2= 6 5 assign = Right to left 30
복합산술연산을계산 / 출력하기위해이전의프로그램을확장 Declare a=2, b=5, c=7, d as int Declare x=5.0, y=3.0, z=7.0, w as double d = a+c%a Print d d = b*c/a Print d w = y*z/x+b Print w d = z/x/y*a Print d w = c/(a+c)/b Print w a=a+1+b/3 Print a 다른복합산술연산도시도해봅시다.. 31
증가및감소연산자 증가연산자 ++ 사후증가 x++; 사전증가 ++x; 감소연산자 -- 사후감소 x--; 사전감소 --x; } x=x+1; } x=x-1; 그러나, 다음예제에서차이가있다. X=10 이라고가정한다 ; A = x++ - 5; means A=x-5; x=x+1; so, A= 5 and x=11 B =++x - 5; means x=x+1; B=x-5; so, B=6 and x=11 32
복합대입연산자 (Abbreviated Assignment Operator) 연산자 예 동일연산 += x+=2; x=x+2; -= x-=2; x=x-2; *= x*=y; x=x*y; /= x/=y; x=x/y; %= x%=y; x=x%y;!!! x *= 4+2/3 x = x*4+2/3 거짓 x=x*(4+2/3) 참 33
복합대입연산자 (updated) 34
다음의수학공식을 C 언어로작성 Area of trapezoid base area ( height 1 height 2 * 2 ) area = base*(height1 + height2)/2; How about this Tension 2m1m2 m m 1 2 g 35
연습 Tension 2m1m m m 1 2 2 g Tension = 2*m1*m2 / m1 + m2 * g; wrong Tension = 2*m1*m2 / (m1 + m2) * g 다음을계산하기위해 C언어로작성 3 2 x 2x x 6.3 f 2 x 0.05x 3.14 f = (x*x*x-2*x*x+x-6.3)/(x*x+0.05*x+3.14); 36
연습 : 산술연산 다음의연산후에메모리스냅샷을나타내시오 (by hand). int a, b, c=5; double x, y; a = c * 2.5; b = a % c * 2-1; x = (5 + c) * 2.5; y = x (-3 * a) / 2;?? 5?? a b c x y a, b, c, x, y 의값이출력되도록 C 프로그램을작성하고, 직접계산한값과비교해보시오. a = 12 b = 3 c= 5 x = 25.0000 y = 43.0000 37
연습 : 산술연산자 C프로그램에서는다음의문장이어떻게작동하는지보여주세요. 그리고최종결과물은무엇입니까? int a = 6, b = -3, c = 2; c= a - b * (a + c * 2) + a / 2 * b; printf("value of c = %d \n", c); 38
단계별로 C 에서연산자가어떻게작동하는가 c = 6 - -3 * (6 + 2 * 2) + 6 / 2 * -3; c = 6 - -3 * (6 + 4) + 3 * -3 c = 6 - -3 *10 + -9 c = 6 - -30 + -9 c = 36 + -9 c = 27 output: Value of c = 27 39
단계별로 C 에서연산자가어떻게작동하는가 int a = 8, b = 10, c = 4; c = a % 5 / 2 + -b / (3 c) * 4 + a / 2 * b; printf("new value of c is %d n", c); 40
연습 : 숫자를뒤바꾸기 숫자가 [100 999] 범위내에서주어진다고가정한다. 이것을뒤바꾸는프로그램을작성한다. 예를들면, 숫자 258 을뒤바꾸면 852 d1 = num / 100; d3 = num % 10; reverse = num (d1*100+d3) + d3*100 + d1; int d1, d2, d3, num=258, reverse; d1 = num / 100; d2 = num % 100 / 10; d3 = num % 10; reverse = d3*100 + d2*10 + d1; printf( reverse is %d n, reverse); 41
Name Addr Content Lecture++; Lecture 5 42
2.4 표준입력과출력 출력 : printf 입력 : scanf 두점사이의거리를구하는프로그램을기억합시다! /* Declare and initialize variables. */ double x1=1, y1=5, x2=4, y2=7, side_1, side_2, distance; 우리는다른점사이의거리를어떻게계산할수있습니까? 사용자로부터두점을얻어서이용하면더좋을것입니다. 이것을위해서우리는 scanf 를사용할것입니다. 이함수를사용하기위해서, 우리는다음의문장이필요 #include <stdio.h> 43
표준출력 printf 함수 화면에정보를출력 필요한두가지인자 control string 전달인자, 서식문자 or 모두 출력을위한식별자 Example double angle = 45.5; printf( Angle = %.2f degrees \n, angle); Output: Angle = 45.50 degrees 서식문자 Control String 식별자 44
출력문장을위한 서식문자 (Conversion Specifiers) Frequently Used 45
표준출력 Output of -145 Output of 157.8926 Specifier 출력값 %i -145 %4d -145 %3i -145 %6i -145 %-6i -145 %8i -145 %-8i -145 Specifier 출력값 %f 157.892600 %6.2f 157.89 %7.3f 157.893 %7.4f 157.8926 %7.5f 157.89260 %e 1.578926e+02 %.3E 1.579E+02 46
연습 int sum = 65; double average = 12.368; char ch = b ; 다음의문장을통해나타나는출력물을보여주시오. printf("sum = %5i; Average = %7.1f \n", sum, average); printf("sum = %4i \n Average = %8.4f \n", sum, average); printf("sum and Average \n\n %d %.1f \n", sum, average); printf("character is %c; Sum is %c \n", ch, sum); printf("character is %i; Sum is %i \n", ch, sum); 47
연습 ( 계속 ) 솔루션 Sum = 65; Average = 12.4 Sum = 65 Average = 12.3680 Sum and Average 65 12.4 Character is b; Sum is A Character is 98; Sum is 65 48
표준출력 scanf 함수 키보드를통한입력값 필요한인자 control string control string에서서식문자와일치하는메모리위치 Example: double distance; char unit_length; scanf("%lf %c", &distance, &unit_length); 변수의데이터형태에대한적절한서식문자를사용하는것은매우중요하다. 49
입력문장을위한서식문자 Frequently Used 50
연습 float f; int i; scanf( %f %i, &f, &i); 만약에다음의값이입력되면, scanf 문장뒤에 f 와 i 에저장되는값은무엇입니까? 12.5 1 12 45 12 23.2 12.1 10 12 1 51
Good 실습 scanf 전에 printf 를사용할필요가없지만, 사용자에게무엇을입력할지알려주는것이좋습니다. : printf( Enter x y : ); scanf( %d %d, &x, &y); 그렇지않다면, 사용자는무엇을해야하는지모를것입니다. 만약에여러분이변수이름전에 & 입력을하지않았다면무슨일이발생할까요? 52
연습 : 프로그램을재 - 컴파일없이두개의점을입력하는방법 printf( enter x1 y1: ); scanf( %lf %lf, &x1, &y1); printf( enter x2 y2: ); scanf( %lf %lf, &x2, &y2); 53
프로그래밍연습 double 형변수 (a, b, c, d) 값을사용자가입력하도록요청하고다음의공식을계산하는프로그램을작성해라. 그리고결과 (res) 를소수점 3 자리까지출력시켜라. a b a c c b res c d a b a c 54
Name Addr Content Lecture++; Lecture 6 55
Library Functions 56
2.7 Math 함수 #include <math.h> fabs(x) x의절대값. sqrt(x) x 의제곱근, where x>=0. pow(x,y) 멱제곱, x y. 오류가발생한다면, x=0 이고 y<=0, 또는 x<0 이고 y 가정수가아닐때. ceil(x) 가장가까운정수로올림 ( 방향으로, infinity). Example, ceil(2.01) 는 3 과같다. floor(x) 가장가까운정수로올림 (- 방향으로, negative infinity). Example, floor(2.01) 는 2 와같다. exp(x) e x 을계산한다. log(x) x를밑이 e인로그값으로계산한다. 오류가발생한다면, x<=0. log10(x) x를밑이 10인로그값으로계산한다. 오류가발생한다면, x<=0. 57
삼각함수 sin(x) x의 sine 값계산 (x는라디안값 ) cos(x) x의 cosine 값계산 (x는라디안값 ) tan(x) x의 tangent 값계산 (x는라디안값 ) asin(x) x의 arcsine or sine의역수값계산 (x의범위는 [-1, 1]) [- /2, /2] 범위내이있는값을반환. acos(x) x의 arccosine or cosine의역수값계산 (x의범위는 [-1, 1]) [0, ] 범위내이있는값을반환. atan(x) x의 arctangent or tangent의역수값계산 [- /2, /2] 범위내이있는값을반환. atan2(y,x) x/y 의 arctangent or tangent 의역수값계산 [-, ] 범위내이있는값을반환. 58
함수의매개변수 or 인자 함수는인자를포함하지않을수도있고한개또는그이상의인자를포함할수도있다. 한개이상의인자를포함한다면, 정확한순서로인자를목록화한다. 인자가의미하는것에대하여주의한다. 예를들면, sin(x) 는 x 값이라디안값으로주어진다고가정한다. 그래서 sin 60 도를계산하기위해서는우선 60 도를라디안값으로변환후, sin 함수를사용하여야한다. #define PI 3.141593 theta = 60; theta_rad = theata * PI / 180; b = sin(theta_rad); /* is not the same as sin(theta); */ 59
연습 속도를구하기위해다음의등식을사용해서수식을작성하시오. 변수는선언되었다고가정한다. velocity vo 2 2a( x xo) velocity = sqrt(vo*vo+2*a*(x-xo)); velocity = sqrt(pow(vo,2)+2*a*(x-xo)); 60
연습 속도를구하기위해다음의등식을사용해서수식을작성하시오. 변수는선언되었다고가정한다. center 38.19( r 2 ( r 3 s )sin 2 s ) a 3 a a 값이라디안값인지확인한다 ; 그렇지않다면, 우선이값을라디안값으로변환 center = (38.19*(pow(r,3)-pow(s,3))*sin(a))/ ((pow(r,2)-pow(s,2))*a); center = (38.19*(r*r*r - s*s*s)*sin(a))/((r*r s*s)*a); 61
연습 : 부피계산 반지름이 r 이고, 높이가 h 인실린더의부피를계산하는프로그램을작성하시오. V r 2 h r h 62
솔루션 : 부피계산 문제해결방법 1. 문제설정 2. 입력 / 출력서술 3. 예제작성 4. 알고리즘개발 5. 테스트 63
솔루션 : 부피계산 ( 계속 ) 문제설정 반지름이 r 이고, 높이가 h 인실린더의부피를계산 입력 / 출력서술 radius r volume v height h 64
솔루션 : 부피계산 ( 계속 ) 예제작성 r=2, h =3, v=37.68 알고리즘개발 Read radius Read height Compute Volume Print volume 프로그램으로변환 ( 다음슬라이드..) V r 2 h 65
솔루션 : 부피계산 ( 계속 ) #include <stdio.h> #include <stdlib.h> #define PI 3.141593 int main(void) { /* Declare Variables */ double radius, height, volume; printf("enter radius: "); scanf("%lf",&radius); printf("enter height: "); scanf("%lf",&height); /* Compute Volune */ volume = PI*radius*radius*height; } /* Print volume */ printf("volume = %8.3f \n", volume); system("pause"); exit(0); 66
연습문제 넓이가주어진경우에, 원의반지름을찾는프로그램을작성하시오. 사용자로부터넓이를입력받은후, 반지름을계산하고그값을나타내시오. A r 2 r 67
연습 B c A a b C 사용자가 A의각도, a 와 b의길이 (cm) 를각각입력하도록하고다음을계산하는프로그램을작성하시오. B=? in degrees C=? in degrees c=? in cm area=? in cm 2 a sin A area b c sin B sin C 1 ab sin C 2 1 2 ac 예를들어, 다음과같이주어진다면 A=36 o, a=8 cm, b=5 cm: B=21.55 o, C=122.45 o, c=11.49 cm sin B 1 2 bc sin A 68
두선의교차점과두선사이의각도를구하는프로그램을작성하시오. 69
2.8 문자열함수 #include <ctype.h> putchar( a ); C= getchar(); toupper(ch) ch 가소문자인경우에, 이함수는일치하는대문자로반환 ; 그렇지않으면, ch 로반환 isdigit(ch) ch 가 10진수인경우에, 이함수는 0이아닌값으로반환 ; 그렇지않으면, 0 값으로반환 islower(ch) ch 가소문자인경우에, 이함수는 0이아닌값으로반환 ; 그렇지않으면, 0 값으로반환 isupper(ch) ch 가대문자인경우에, 이함수는 0이아닌값으로반환 ; 그렇지않으면, 0 값으로반환 isalpha(ch) ch 가대문자 or 소문자인경우에, 이함수는 0이아닌값으로반환 ; 그렇지않으면, 0 값으로반환 isalnum(ch) ch 가알파벳 or 숫자인경우에, 이함수는 0이아닌값으로반환 ; 그렇지않으면, 0 값으로반환 70
연습다음프로그램의출력물은무엇입니까? #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main(void) { char ch1='a', ch2; char ch3='x', ch4; char ch5='8'; } ch2 = toupper(ch1); printf("%c %c \n",ch1,ch2); ch4 = tolower(ch3); printf("%c %c \n",ch3,ch4); printf("%d\n",isdigit(ch5)); printf("%d\n",islower(ch1)); printf("%d\n",isalpha(ch5)); system("pause"); return(0); 71