c 배열 , 전처리기, 버블정렬, 선택정렬
전처리기(preprocessor)
1. Macro Constant
- 단순히 어떤 이름이나 단어 또는 문자열 그리고 명령어를 대신해서 다른이름으로 대치할 때 사용.
- Syntax
#define 대치할이름 원래값
ex) #define PI 3.14
#define MAX 100
#define P printf
- 매개변수가 있는 매크로
#define 매크로이름(변수1, 변수2, 변수3...) 원래어떤값
ex) #define P(x) printf("%d\n", x) //출력을 간단하게 P(변수)를 쓰면 결과값이 나오게 한다. P(2+4) 안에 상수를 넣어도 결과값이 잘 나옴.
#define JEGOB((x)) x*x
#define HAP(x, y) (x)+(y))
- 매개변수가 있는 반복처리
ex) #define HAB(n) for(i = 1 ; i <= n; i++) hap+=i //이런식으로 1~n까지의 합을 정의할 수 있다.
- macro function 과 일반 function 과의 차이점
1) 일반함수는 매개변수에 데이타타입을 넣고, 매크로 함수는 매개변수에 타입을 기재하지 않는다.
void hap(int a, int b){}
#define HAP(a, b) a + b
2) 매크로 함수는 일반함수에 비해 컴파일 속도가 더 떨어진다. 하지만, 실행 속도는 더 빠르다
3) 매크로 함수는 전처리기에 의해 처리 되고, 일반함수는 컴파일러에 의해 처리된다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
#define PI 3.14
int main()
{
const double pi = 3.14; //const를 통해 상수처리를 한다.
pi = 3.15; //에러발생. pi=3.15가 안된다. const는 오직 읽기전용이기 때문이다. 그래서 const로 정의한 값에 다른 값이 들어오면 거부한다.
printf("pi = %.2f\n", pi);
printf("PI = .2f\n", PI); //printf("PI = .2f\n", 3.14)를 의미한다. PI값을 PI 로 받아들이는 것이 아니라 3.14자체로 받아들인다.
return 0;
}
다른점 : const는 컴파일 단계에서 처리하고, define은 전처리 수행한다. const는 데이터 타입을 주고, 매크로타입은 데이터 타입이 없다.
define은 리터럴 값, const는 value 값이다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
#define JEGOB(n) n*n
#define P(x) printf("%d\n", x)
int main()
{
int gab = JEGOB(5); //int gab = 5 * 5;
P(gab);
return 0;
}
문제점 : 이런식으로 출력하면 값은 잘나온다.하지만 JEGOB(5+7)을 해준다면 5 + 7 * 5 + 7 이렇게 연산을 수행하기 때문에 47이 나온다.
그래서 #define JEGOB(n) (n)*(n) 이런식으로 괄호로 묶어줘야 한다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
#define HAB(n) for(i=1;i<=n;i++) hap += i
#define P(n) printf("%d\n", n)
int main()
{
int i, hap=0;
HAB(100); //-->for(i=1;i<=100; i++ ) hap += i;
return 0; //--> printf("%d\n", hap);
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
========================================================
2. 다른 파일 첨부할 때
- Syntax
#include <xxx.h> --> compiler 가 인식하는 위치
#include "xxx.h" --> compiler 가 인식 못하는 위치
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
//#include "/home/mino/Downloads/mylib.h" //다른 위치에 있는 헤더파일을 읽을 때.
#include "mylib.h" //작업하는 위치와 같은 폴더에 있는 헤더파일을 참조 할 때.
main.c
int main()
{
int a = 5, b = 9;
int result = gob(a,b);
P(result);
return 0;
}
mylib.h
#define MAX 100
#define JEGOB(x) (x)*(x)
#define P(x) printf("%d\n", x)
int hap(int x, int y){
return x + y;
}
int gob(int x, int y){
return x * y;
}
int mok(int x, int y){
return x / y;
}
int rest(int x, int y){
return x % y;
}
int cha(int x, int y){
return x - y;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
=================================================================
3. 기타기능
#if ~ #else ~ #endif
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
#define YEAR 2
#if (YEAR == 1)
#define MAX 50 //보기편하라고 일부러 띄어서 썼음.
#include <stdlib.h> //YEAR가 1이면 stdlib.h만 포함하고, string.h는 포함하지 않음.
#else
#define MAX 60
#include <string.h>
#endif
int main()
{
printf("최대 인원수는 %d\n", MAX);
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#undef 지시자로 define을 무효로 할 수 있다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
============================================================
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Array
1. 1차원 배열
1) 성격, 크기, 구조가 같은 여러 데이터들의 집합체
2) 배열을 구성하고 있는 각 데이터들을 요소(element)라 하며, 각 element 들의 표현을 첨자(index)라고 한다.
3) 첨자는 상수나 수식 혹은 변수를 사용할 수 있고, 실수형이나, 실수형 변수는 사용할 수 없다.
4) 1차원 배열은 첨자가 한개이다.
5) 첨자는 0부터 시작한다.
6) Syntax
[기억류] datatype array_name[방개수]
ex. auto int array[3];
[기억류] datatype array_name = {요소1, 요소2, 요소3...}
7) C-언어에서는 무한차원까지 배열 생성 가능.
cf) BASIC: 255차원, COBOL: 3차원, ASEMBLE은 배열이 없다. C, PASCAL 은 무한차원
8) 초기화할 때 각 방의 값
- auto int array[3]; ? ? ? // ?는 쓰레기 값이라고 하자.
- static int array[3]; 0 0 0 // static을 써서 각 배열의 값이 0으로 초기화
- auto int array[3] = {1, 2, 3}; 1 2 3 //1, 2, 3으로 초기화
- static int array [3] = {1, 2, 3}; 1 2 3
- auto int array[] = {1, 2, 3}; 1 2 3 //1, 2, 3으로 초기화
- static int array [] = {1, 2, 3}; 1 2 3
- auto int array[4] = {1, 2, 3}; 1 2 3 ? //1, 2, 3, 쓰레기 값으로 초기화
- static int array [4] = {1, 2, 3}; 1 2 3 0 // 1, 2, 3, 0으로 초기화
- auto int array[4] = {1, 2, 3, }; 1 2 3 0 // 끝의 콤마(,)로 0으로 초기화 해줌. 1, 2, 3, 0으로 초기화
- static int array [4] = {1, }; 1 0 0 0 //끝의 콤마(,)로 1, 0, 0, 0으로 초기화
//배열의 선언
int su[3];
//배열의 할당
su[0] = 4; su[1] = 5; su[2] = 6;
//배열의 초기화 (선언과 할당을 동일라인에)
int su[3] = {4, 5, 6}; // 중괄호를 이용해 배열의 공간의 값을 초기화 시켜줌.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
#define MAX 5
int main()
{
int array[] = {4, 5, 6, 7, 8}, i;
// for(i = 0; i<sizeof(array) / sizeof(int); i++) //방의 개수를 정하는 방법1
puts("<<요소값>>");
for(i=0 ; i< MAX ; i++) //방의 개수를 정하는 방법2. define MAX로 방의 개수를 정한다.
{
printf("array[%d] = %d\n", i, array[i]); //array에 있는 값.
}
putchar('\n');
for(i=0 ; i< MAX ; i++)
{
printf("array[%d] = %d\n", i, *(array+i)); //array의 주소에 *을 해주어, 주소에 있는 값이 무엇인지.
}
putchar('\n');
for(i=0 ; i< MAX ; i++) //방의 개수를 정하는 방법2. define MAX로 방의 개수를 정한다.
{
printf("array[%d] = %d\n", i, *(&array[0] + i)); //세개의 for문의 출력값은 모두 같다.
}
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
#define MAX 5
int main()
{
int array[MAX] = {9, 8, 7, 6, 5}, i;
puts("<<주소값>>");
for(i=0 ; i<MAX ; i++)
printf("array[%d] = %u\t", array + i); //array의 주소
putchar('\n');
for(i=0 ; i<MAX ; i++)
printf("array[%d] = %u\t", &array[i]); //array의 주소
putchar('\n');
for(i=0 ; i<MAX ; i++)
printf("array[%d] = %u\t", &(*(array + i))); //array의 주소
return 0;
} //결과 값은 모두 array의 주소를 가리킨다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
#define MAX 4
void output(int *);
int main()
{
int array[] = {4, 5, 6, 7};
output(array);
return 0;
}
void output(int * ptr)
{
int i;
for(i=0; i < MAX ; i++) printf("ptr[%d] = %d\t", i, ptr[i]);
putchar('\n');
for(i=0; i < MAX ; i++) printf("ptr[%d] = %d\t", i, *(ptr + i));
putchar('\n');
for(i=0; i < MAX ; i++) printf("ptr[%d] = %d\t", i, *(&ptr[0] + i));
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
#define COL 3
#define ROW 2
void input(int *);
void output(int *);
int main()
{
int array[ROW][COL];
input(array[0]);
output(&array[0][0]);
return 0;
}
void input(int *ptr)
{
int i, j;
for(i = 0; i <ROW; i++)
{
printf("여러 데이터 입력(국어, 영어, 수학) : ");
for(j = 0; j<COL; j++)
{
scanf("%d", ptr + (i * COL) + j);
}
}
}
void output(int *ptr)
{
int i = 0;
while(i < ROW)
{
int j = 0;
while( j < COL)
{
printf("%d\t", *(ptr + (i * COL) + j));
j++;
}
putchar('\n');
i++;
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
버블정렬, 선택정렬
#include <stdio.h>
#define MAX 4
void input(int *);
void output(int *);
//void bubbleSort(int *);
void selectionSort(int *);
int main()
{
int array[4];
input(array);
puts("소팅전");
output(array);
// bubbleSort(array);
selectionSort(array);
puts("소팅후");
output(array);
return 0;
}
/*
void bubbleSort(int * ptr)
{
int i, j;
for(i = 0 ; i < MAX-1 ; i++)
for(j = 0 ; j < MAX -1 ; j++)
{
if(ptr[j] < ptr[j+1])
{
int imsi = ptr[j];
ptr[j] = ptr[j+1];
ptr[j+1] = imsi;
}
}
}
*/
void selectionSort(int * ptr)
{
int i, j;
for(i = 0; i < MAX-1; i++)
for(j=i+1 ; j<MAX; j++)
{
if(ptr[i] < ptr[j])
{
int imsi = ptr[j];
ptr[j] = ptr[i];
ptr[i] = imsi;
}
}
}
void input(int * ptr)
{
int i;
for(i=0 ; i<MAX ; i++) scanf("%d", ptr + i);
}
void output(int * ptr)
{
int i;
for(i=0 ; i<MAX ; i++) printf("array[%d] = %d\t", i, ptr[i]);
putchar('\n');
}
출력 : 4 7 9 1 입력하면
소팅전
array[0] = 4 array[1] = 7 array[2] = 9 array[3] = 1
소팅후
array[0] = 9 array[1] = 7 array[2] = 4 array[3] = 1
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
=====================================================================================================
성적: 파일에서 읽고 총점 평균을 출력하는 프로그램
mylib.h
#define ROW 12
#define COL 6