김서형 : 010 9320-8604
30 분전시간 시간을입력받아 30분전의시간을출력하시오. 예 ) 시간을입력하세요. ex) 00:00 ( 출력 ) 11:5 ( 입력 ) 30분전의시간은 10:35입니다. ( 변수값출력 ) 알고리즘 (30 분보다크다면시간변동 x, 현재분에서 -30) (30 분보다작다면, 현재시간 -1, 현재분에서 +30)
30 분전시간 #include <stdio.h> int main() int a,b; printf(" 시간입력하세요. ex) 00:00\n"); scanf("%d:%d",&a,&b); if(b>=30) b -= 30; else --a; b += 30; printf("30 분전의시간은 %d:%d 입니다.",a,b); return 0;
영어서수 영어에서서수를나타낼때다음과같이나타낸다. 1st 2nd 3rd 4th 5th 6th... 11th 12th 13th 14th 15th... 21st 22nd 23rd 24th 25th... 31st 32nd 33rd 34th 35th... 41st 42nd 43rd 44th 45th...... 91st 92nd 93rd 94th 95th... 99th 1 부터 99 까지의숫자가입력되면영어서수표현으로출력하시오.
영어서수 ex) 1~99 사이의수를입력하세요 : 13 ( 입력 ) 서수로나타내면 13th 입니다. ( 변수값출력 ) 알고리즘 ( 일의자리가 1 일때 +st / 2 일때 +nd / 3 일때 +rd / 그외 th) (10 의자리가 1 일때는무조건 th)
영어서수 #include <stdio.h> int main() int a; printf("1~99 사이의수를입력하세요 :"); scanf("%d",&a); if((0<a)&&(a<100)) printf(" 서수로나타내면 %d",a); if(a/10 == 1) printf("th 입니다."); else switch(a % 10) case 1 : printf("st 입니다."); break; case 2 : printf("nd 입니다."); break; case 3 : printf("rd 입니다."); break; default : printf("th 입니다."); break; //switch 끝 // else 끝 //if 끝 else printf(" 범위를초과하였습니다."); return 0;
대소문자변경 주어지는문장의대문자를소문자로, 소문자를대문자로변경하는프로그램을작성하라. ex) 문장을입력하세요. ( 출력 ) Good Luck!! Thank You ^^ ( 입력 ) good luck!! thank you ^^ ( 변수값출력 ) 알고리즘 ( 아스키코드를이용, 대문자 : 65~90, 소문자 : 97~122) ( 문자가대문자일때 + 32, 문자가소문자일때 - 32)
대소문자변경 #include <stdio.h> int main() char c; printf("- 대소문자변경 -\n"); printf(" 문장을입력하세요.\n"); for(;;) scanf("%c",&c); if((65 <= c)&&(c <= 90)) c = c + 32; printf("%c",c); else if((97 <= c)&&(c <= 122)) c = c - 32; printf("%c",c); else if(c == '\n') break; else printf("%c",c); // for 문의끝 return 0;
역삼각형 길이 n 이입력되면다음과같은역삼각형을출력합니다. ex) 삼각형의높이를입력하세요 : 5 ( 입력 ) 높이가 5 인역삼각형을출력합니다. ( 변수값출력 ) ***** **** *** ** * 알고리즘 ( 첫줄에는빈칸 : 0 개, * : a( 입력한수 ) 개 ) ( 둘째줄에는빈칸 : 1 개, * : a-1 개 ) ( 마지막줄에는빈칸 : a-1 개, * : 1 개 )
역삼각형 #include <stdio.h> int main() int a, i, j, k; printf(" 삼각형의높이를입력하세요 : "); scanf("%d",&a); printf(" 높이가 %d 인역삼각형을출력합니다.\n",a); for(i=1;i<=a;i++) for(j=1;j<i;j++) printf(" "); for (k = a-i; k >= 0; k--) printf("*"); printf("\n"); return 0;
대각선이있는사각형 n 이입력된다.(3<=n<=100) 대각선이포함된 n*n 사각형을출력합니다. ex) 사각형의높이를입력하세요.(3<=n<=100) : 9 ( 입력 ) 높이가 9 인사각형을출력합니다. ( 변수값출력 ) ********* ** ** * * * * * * * * * * * * * * * * * * * ** ** ********* 알고리즘 ( 아스키코드를이용, 대문자 : 65~90, 소문자 : 97~122) ( 문자가대문자일때 + 32, 문자가소문자일때 - 32)
배열의필요성 학생이 10 명이있고이들의평균성적을계산한다고가정하자. 개별변수를사용하는방법은학생수가많아지면번거로워집니다. 방법 #1 : 개별변수사용 int s0; int s1; i nt s9; 방법 #1 : 배열사용 int[10];
배열이란? 배열 (array) : 동일한타입의데이터가여러개저장되어있는데이터저장장소배열안에들어있는각각의데이터들은정수로되어있는번호 ( 첨자, index) 에의하여접근배열을이용하면여러개의값을하나의이름으로처리할수있다.
배열의선언 자료형 : 배열원소들이 int형라는것을의미 배열이름 : 배열을사용할때사용하는이름이 s 배열크기 : 배열원소의개수가 10개 인덱스 ( 배열번호 ) 는항상 0부터시작한다.
배열선언의예 int score[60]; // 60 개의 int 형값을가지는배열 s float cost[12]; // 12 개의 float 형값을가지는배열 cost char name[50]; // 50 개의 char 형값을가지는배열 name
배열원소접근 80 s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9] s[5] = 80 인덱스 s[5] = 80; s[1] = s[0]; s[i] = 100; // i는정수변수 s[i+2] = 100; // 수식이인덱스가된다. s[index[3]] = 100; // index[] 는정수배열
배열과반복문 배열의가장큰장점은반복문을사용하여서배열의원소를간편하게처리할수있다는점 grade[0] = 0; grade[1] = 0; grade[2] = 0; grade[3] = 0; grade[4] = 0; #define SIZE 5... for(i=0 ; i<size ; i++) grade[i] = 0;
배열요소출력 #include <stdio.h> #define STUDENTS 5 int main(void) int score[students]; int i; score[0] = 90; score[1] = 80; score[2] = 70; score[3] = 80; score[4] = 70; 0 번째학생의점수는 90 입니다. 1 번째학생의점수는 80 입니다. 2 번째학생의점수는 70 입니다. 3 번째학생의점수는 80 입니다. 4 번째학생의점수는 70 입니다. for (i = 0; i < STUDENTS; i++) printf("%d 번째학생의점수는 %d 입니다. \n", i, score[i]); return 0;
배열요소출력 #include <stdio.h> #define STUDENTS 5 int main(void) int score[students] = 90, 80, 70, 80, 70; int i; // 바로넣어도됨 for (i = 0; i < STUDENTS; i++) printf("%d 번째학생의점수는 %d 입니다. \n", i, score[i]); return 0;
사용자입력을배열요소에저장 #include <stdio.h> #define STUDENTS 5 int main(void) int i, sum=0; int score[students]; double average; 성적을입력하시오 :10 성적을입력하시오 :20 성적을입력하시오 :30 성적을입력하시오 :40 성적을입력하시오 :50 성적평균 = 30.000000 for(i = 0; i < STUDENTS; i++) printf(" 성적을입력하시오 :"); scanf("%d", &score[i]); for(i = 0; i < STUDENTS; i++) sum += score[i]; average = (double)sum / STUDENTS; printf(" 성적평균 = %f\n", average); return 0;
잘못된인덱스문제 인덱스가배열의크기를벗어나게되면프로그램에치명적인오류를발생시킨다. int score[5]; score[5] = 60; // 치명적인오류!
배열의초기화 int grade[5] = 10,20,30,40,50 ; int grade[5] = 10, 20, 30, 40, 50 ; grade[0] grade[1] grade[2] grade[3] grade[4] int grade[5] = 10,20,30 ; int grade[5] = 10, 20, 30 ; 초기값을일부만주면나머지원소들은 0 으로초기화됩니다. 0 0 grade[0] grade[1] grade[2] grade[3] grade[4]
배열의초기화 배열의크기가주어지지않으면자동적으로초기값의개수만큼이배열의크기로잡힌다. 6 int grade[ ] = 10, 20, 30, 40, 50, 60 ; grade[0] grade[1] grade[2] grade[3] grade[4] grade[5]
배열원소의개수계산 int score[] = 10, 20, 30, 40, 50 ; int i, size; size = sizeof(score) / sizeof(score[0]); 배열원소개수자동계산 2 0 / 4 이므로원소는 5 개 for(i = 0; i < size ; i++) pri ntf("%d ", score[i]);
기본예제 5 개숫자배열에입력하고, 그대로출력하기
기본예제 #include <stdio.h> int main() int a[5], i; printf("5 개의숫자를입력하세요.\n"); for(i=0;i<5;i++) scanf("%d",&a[i]); printf(" 배열값을출력합니다.\n"); for(i=0;i<5;i++) printf("a[%d] = %d\n",i,a[i]); return 0;
핵심예제 : 평균득점계산 농구게임에서특정선수의평균득점을계산하는프로그램을작성해보자. 사용자는최근 3 게임에서의득점을입력한다. 평균은실수로계산하여출력한다.
사용자입력을배열요소에저장 #include <stdio.h> int main() int scores[3]; int sum = 0; int i; double average; 배열은 0 부터, 게임은 1 회부터 for (i = 0; i < 3; i++) printf(" 게임 %d 에서선수의득점은? ", i + 1); scanf("%d", &scores[i]); for (i = 0; i < 3; i++) sum += scores[i]; average = ((double)sum / 3); printf(" 평균득점은 %f 입니다.\n", average); return(0);
배열에서최소값찾기 첫번째요소를최소값 minium 이라고가정한다. for(i=1; i< 배열의크기 ; i++) if ( s[i] < minimum ) minimum = s[i]; 반복이종료되면 minimum 에최소값이저장된다.
실습 : 최소값찾기
실습 : 극장예약시스템 배열을이용하여간단한극장예약시스템을작성 좌석은 10개 먼저좌석배치표를보여준다. 예약이끝난좌석은 1로, 예약이안된좌석은 0으로나타낸다.
실행결과 좌석을예약하시겠습니까?(y 또는 n) y ------------------------------- 1 2 3 4 5 6 7 8 9 10 ------------------------------- 0 0 0 0 0 0 0 0 0 0 몇번째좌석을예약하시겠습니까?1 예약되었습니다. 좌석을예약하시겠습니까?(y 또는 n) y ------------------------------- 1 2 3 4 5 6 7 8 9 10 ------------------------------- 1 0 0 0 0 0 0 0 0 0 몇번째좌석을예약하시겠습니까?1 이미예약된자리입니다. 다른좌석을선택하세요좌석을예약하시겠습니까?(y 또는 n) n
알고리즘 while(1) else 사용자로부터예약여부 (y 또는 n) 를입력받는다. if 입력 == 'y' 현재의좌석배치표 seats[] 를출력한다. 좌석번호 i 를사용자로부터입력받는다. if 좌석번호가올바르면 seats[i]=1 else 에러메시지를출력한다. 종료한다.
실습 : 극장좌석예약 #include <stdio.h> #define SIZE 10 int main() int seat_number, i; i nt seats[size] = 0 ; while(1) printf("-------------------------------\n"); printf(" 1 2 3 4 5 6 7 8 9 10\n"); printf ("-------------------------------\n"); for(i = 0; i < SIZE; i++) printf(" %d",seats[i]); printf("\n"); printf(" 원하시는좌석번호입력 ( 종료 -1): "); scanf("%d", &seat_number); if(seat_number == -1 ) break; if(seat_number <= 0 seat_number > SIZE) pr intf("1 부터 10 사이의숫자를입력하세요 \n"); c ontinue; if(seats[seat_number-1] == 0) else seats[seat_number-1] = 1; pri ntf(" 예약되었습니다.\n\n"); // 성공 // 이미예약된자리경우 printf(" 이미예약된자리입니다.\n\n"); // while 끝 return 0;
순차탐색 순차탐색은배열의원소를순서대로하나씩꺼내서탐색키와비교하여원하는값을찾아가는방법 비교 50 성공 10 20 30 40 50 10 grade[0] grade[1] grade[2] grade[3] grade[4] grade[5]
실습 : 순차탐색
핵심예제 : 히스토그램그리기 배열에데이터가들어있다고가정하고데이터의값에따라서막대그래프를그려보자. 배열초기값 : 12, 3, 19, 6, 18, 8, 12, 4, 1, 19
막대그래프예제
2 차원배열 int s[10]; // 1차원배열 int s[3][10]; // 2차원배열 int s[5][3][10]; // 3차원배열
2 차원배열의초기화 int s[3][5] = 0, 1, 2, 3, 4, // 첫번째행의원소들의초기값 10, 11, 12, 13, 14, // 두번째행의원소들의초기값 20, 21, 22, 23, 24 // 세번째행의원소들의초기값 ;
2 차원배열채우기 n 이입력되면크기가 n 인다음과같은 2 차원배열을출력하시오. ex) n*n 행렬의 n 값을입력하세요 ( 최대 100) : 3 3*3 행렬에값을채웁니다. 1 2 3 4 5 6 7 8 9
#include <stdio.h> int main() int a[100][100], n, i, j, num = 1; printf("n*n 행렬의 n 값을입력하세요 ( 최대 100) : "); scanf("%d",&n); printf("%d*%d 행렬에값을채웁니다.\n",n,n); for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j] = num++; for(i=0;i<n;i++) for(j=0;j<n;j++) printf("%3d ",a[i][j]); printf("\n"); return 0; 소스
다차원배열을이용한행렬의표현 중첩 for 루프를이용하여행렬 A 의각원소들과행렬 B 의각원소들을서로더하여행렬 C 에대입한다.
문자의중요성 인간한테텍스트는대단히중요하다. 많은컴퓨터작업이텍스트를사용하여서이루어진다. 컴퓨터 사용자
문자열표현방법 문자열 (string): 문자들이여러개모인것 "A" "Hello World!" " 변수 score 의값은 %d 입니다 문자열변수 변경가능한문자열을저장할수있는변수 어디에저장하면좋은가? H 하나의문자는 char 형변수로저장 H E L L o \0 문자열은 char 형배열로저장
NULL 문자 NULL 문자 : 문자열의끝을나타낸다. 끝 NULL 문자는문자열의끝을나타냅니다. S E O U L \0 문자열은어디서종료되는지알수가없으므로표시를해주어야한다. seou, seoul, seoul#, seoul#%,...??? 쓰레기값 s e o u l # %? & $ str[0] str[1] str[2] str[3] str[4] str[5] str[6] str[7] str[8] str[9]
문자열예제 abc
문자배열의초기화 char str[4] = 'a', 'b', 'c', '\0' ; char str[ 4] = "abc"; char str[ 4] = "abcdef"; char str[ 6] = "abc"; char str[ 4] = ""; char str[] = "abc";
문자열입출력 a u pretty?(y or n)y 맞았습니다.
실습 : 문자열길이계산
동적할당메모리의개념 프로그램이메모리를할당받는방법정적 (static) 동적 (dynamic)
정적메모리할당 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 ( 예 ) int score_s[100]; 처음에결정된크기보다더큰입력이들어온다면처리하지못함 더작은입력이들어온다면남은메모리공간은낭비
동적메모리할당 동적메모리할당 실행도중에동적으로메모리를할당받는것 운영 체제 사용이끝나면시스템에메모리를반납 score = (int *) malloc(100*sizeof(int)); 요구 할당 필요한만큼만할당을받고메모리를매우효율적으로사용 malloc() 계열의라이브러리함수를사용 # i n c l u d e < s t d # i n c l u d e < s t d i # i o n # i o c. n c. l h u l h d > u d > e < s t d l i b. h > e < s t d l i b. h > i n t m a i n ( v i n t m a i n ( v o i d ) o i d ) i n t * p i n t * p ; p ; = ( i n t * ) m a l l o c ( s i z e o f ( p = ( i n t * ) m a l l o c ( s i z e o f ( i... n t ) ) ; i... n t ) ) ; 프로그램
동적메모리할당절차
함수의필요성
함수의필요성 --------------------- --------------------- 0 의제곱은 0 1 의제곱은 1 2 의제곱은 4 3 의제곱은 9 4 의제곱은 16 --------------------- ---------------------
함수의개념 함수 (function): 특정한작업을수행하는독립적인부분 함수호출 (function call): 함수를호출하여사용하는것 함수는입력을받으며출력을생성한다.
함수를이용하는과정
함수의정의
함수의이름 int square(void) // 정수를제곱하는함수 double compute_average(void) // 평균을구하는함수 void set_cursor_type(void) // 커서의타입을설정하는함수 동사 명사 함수이름
함수호출
매개변수
인수와매개변수 인수 (argument): 실인수, 실매개변수라고도한다. 매개변수 (parameter): 형식인수, 형식매개변수라고도한다. int main(void)... sum = add(2, 3);... 인수 매개변수 int add(int x, int y)......... 2 3 x y
반환값 반환값 (return value): 호출된함수가호출한곳으로작업의결과값을전달하는것 인수는여러개가가능하나반환값은하나만가능 3 return 0; return(0); return x; return x*x+2*x+1;
함수예제 덧셈결과 =5 덧셈결과 =14
함수작성의예 5 n 25 result
함수원형 함수원형 (function prototyping): 컴파일러에게함수에대하여미리알리는것 int compute_sum(int n); int main(void) int sum; sum = compute_sum(100); printf( sum=%d \n, sum); int compute_sum(int n) compute_sum() 은함수이름이랬지 // 여기채워보세요 컴파일러
함수원형의형식 반환형함수이름 ( 매개변수 1, 매개변수 2,... ); ( 예 ) int get_integer(void); int combination(int n, int r); ( 예 ) int get_integer(void); int combination(int, int); 자료형만적어주어도됨!
함수원형을사용하지않는예제 int compute_sum(int n) int i; int result = 0; for(i = 1; i <= n; i++) result += i; return result; 함수정의가함수호출보다먼저오면함수원형을정의하지않아도된다. 그러나일반적인방법은아니다. int main(void) int sum; sum = compute_sum(100); printf( sum=%d \n, sum);
핵심예제 : 0 을입력할때까지합계 [ Do while 사용 ] 사용자로부터양수를받아서합계를한다. 사용자가 0 을입력하면반복을중단하고이제까지의합계를화면에출력한다.
예제소스 ( 정수합계 ) #include <stdio.h> int main() int x, sum = 0; do printf(" 정수를입력하시오 (0이면종료 ) : "); scanf("%d", &x); sum = sum + x; while (x!= 0); printf(" 정수의합계 : %d \n", sum); return 0;
예제소스 ( 함수사용 ) #include <stdio.h> int scan(void); int main() printf(" 정수의합계 : %d \n", scan()); return 0; int scan(void) int x, sum = 0; do printf(" 정수를입력하시오 (0 이면종료 ) : "); scanf("%d", &x); sum = sum + x; while (x!= 0); return sum;
a 의 b 승예제 두개의정수를입력하시오 : 2 3 2 의 3 승은 8 입니다.
두수중에서큰수찾기예제
소수찾기알고리즘 사용자로부터정수를입력받아서변수 n 에저장. 약수의개수를 0 으로초기화. for( i=1; i<=n ; i++ ) n 을 i 로나누어서 나머지가 0 이면약수의개수를증가. 약수의개수가 2 이면정수 n 은소수.
#include <stdio.h> int is_prime(int); int get_integer(void); main() int n, result; n = get_integer(); result = is_prime(n); if ( result == 1 ) else return 0; int get_integer(void) // 각함수당오류 1 개씩있음. 일단눈으로찾아보세요 printf("%d 은소수입니다.\n", n); printf("%d 은소수가아닙니다.\n", n); int n; printf(" 정수를입력하시오 : "); scanf("%d", n); return n; int is_prime(int n) int i; for ( i = 1 ; i < n ; i++ ) if ( n%i == 0 ) return 0; // 하나라도약수발견하면소수아니므로리턴 return 1; // for 문끝날때까지못찾았으므로소수맞음
라이브러리함수 라이브러리함수 (library function): 컴파일러에서제공하는함수 표준입출력 수학연산 문자열처리 시간처리 오류처리 데이터검색과정렬
난수함수 난수 (random number) 는규칙성이없이임의로생성되는수이다. 난수는암호학이나시뮬레이션, 게임등에서필수적이다. rand() : 난수를생성하는함수 [ 0 부터 RAND_MAX 까지의난수를생성 ]
난수 6 개발생
예제 : 로또번호생성하기 1 부터 45 번사이의난수발생
1 부터 45 사이로제한 printf("%d ", 1+(rand()%45)); 42 18 35 41 45 20 하지만실행할때마다항상똑같은난수가발생된다.
실행할때마다다르게하려면 매번난수를다르게생성하려면시드 (seed) 를다르게하여야한다. srand( (unsigned)time( NULL ) );
수학라이브러리함수
삼각함수예제
변수의범위 변수의범위 전역변수 지역변수 함수 함수 전역변수 지역변수 지역변수
전역변수와지역변수
지역변수의범위 void sub1(void) y = 4; int y;... 지역변수는선언된블록을떠나면안됩니다.
이름이같은지역변수
지역변수는블록에서도선언 #include <stdio.h> const double tax_rate = 0.05; int main(void) int income = 100; if (tax_rate > 0) int tax; tax = income * tax_rate; income -= tax; printf(" 실제소득 =%d \n", income); return 0;
지역변수의초기값 #include <stdio.h> int main(void) int temp; printf("temp = %d\n", temp); 초기화되지않았으므로쓰레기값을가진다. temp = -858993460
지역변수의생존기간 int x; x 생성 블록 생존시간 소멸
전역변수의초기값과생존기간 #include <stdio.h> int counter; 전역변수의범위 void sub1() counter++; void sub2() counter++; int main(void) sub1(); sub2(); printf("counter=%d\n", counter); return 0; 전역변수초기값은 0
static ( 정적 ) 변수 #include <stdio.h> void sub(void); int main(void) int i; sub(); sub(); sub(); return 0; 자동지역변수 void sub(void) int auto_count = 0; static int static_count = 0; auto_count=1 static_count=1 auto_count=1 static_count=2 auto_count=1 static_count=3 정적지역변수로서 static 을붙이면지역변수가정적변수로된다. auto_count++; static_count++; printf("auto_count=%d\n", auto_count); p rintf("static_count=%d\n", static_count);