배열은 집합 데이터를 저장하기 위해 사용
int a; //변수 하나에는 값을 하나만 저장
int b[3]; //하나의 배열에 크기 만큼 값 저장
배열의 특징
- 지정한 타입의 값만 저장.
- 크기 선언할 때 정함.
- 각 방이 인접
1. 생성
int a[크기];
void main(){ int a[5]; a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5; printf("a[0]=%d\n", a[0]); printf("a[1]=%d\n", a[1]); printf("a[2]=%d\n", a[2]); printf("a[3]=%d\n", a[3]); printf("a[4]=%d\n", a[4]); } |
void main(){ int a[5]; int i; for(i=0;i<5;i++){ a[i]=i+1; } for(i=0;i<5;i++){ printf("%d\n", a[i]); } } |
2. 초기화
void main(){ int a[3]={1,2,3};//배열 초기화 int b[]={10, 20};//배열 초기화 시 크기 생략. //초기화 값의 개수만큼 방만듬. int i; //배열 a출력 for(i=0;i<3;i++){ printf("a[%d]=%d\n", i, a[i]); } //배열 b출력 for(i=0;i<2;i++){ printf("b[%d]=%d\n", i, b[i]); } } |
3. 배열 키보드 입력
void main(){ int a[5]; int i; printf("숫자 5개를 입력하라"); for(i=0;i<5;i++){ scanf("%d", &a[i]); } for(i=0;i<5;i++){ printf("%d\t", a[i]); } } |
4. 예제
수학점수 3개를 입력받아 총점, 평균 출력 | 형변환 |
void main(){ int score[3]; int i, sum=0; float avg; printf("점수 3개를 입력하라"); for(i=0;i<3;i++){ scanf("%d", &score[i]); sum+=score[i]; } //sum = score[0]+score[1]+score[2]; avg = (float)sum/3; printf("sum:%d, avg=%f\n", sum, avg); } |
#자동형변환 int+int: int
|
1~100사이의 짝수 저장1 | 1~100사이의 짝수 저장2 |
void main(){ int a[50]; int i, cnt=2; for(i=0;i<50;i++){//배열의 인덱스 a[i]=cnt; cnt+=2; } for(i=0;i<50;i++){ printf("%d\t", a[i]); } } |
void main(){ int a[50]; int i, cnt=0;//cnt:배열에 입력 시 사용할 인덱스 for(i=1;i<101;i++){//만들 숫자 범위 if(i%2==0){//i가 짝수이면 a[cnt]=i; cnt++; if(cnt==50){ printf("배열이 꽉찼다.\n"); break; } } } for(i=0;i<50;i++){ printf("%d\t", a[i]); } } |
최대, 최소, 합 구하기 |
void main(){ int a[10]; int i, max, min, sum; printf("숫자 10개를 입력하라\n"); for(i=0;i<10;i++){ scanf("%d", &a[i]); } printf("전체 요소\n"); for(i=0;i<10;i++){ printf("%d\t", a[i]); } max=a[0];//max:최대값 for(i=1;i<10;i++){ if(max<a[i]){ max=a[i]; } } printf("max:%d\n", max); min=a[0];//max:최대값 for(i=1;i<10;i++){ if(min>a[i]){ min=a[i]; } } printf("min:%d\n", min); sum = 0; for(i=0;i<10;i++){ sum+=a[i]; } printf("sum:%d\n", sum); } |
실수 타입 배열 및 초기화 |
void main(){ float a[2]={3.45f}; int b[3]={1}; float c[]={3.45f, 45.567f}; int i; for(i=0;i<2;i++){ printf("a[%d]=%f\t", i, a[i]); } printf("\n"); for(i=0;i<3;i++){ printf("b[%d]=%d\t", i, b[i]); } printf("\n"); for(i=0;i<2;i++){ printf("c[%d]=%f\t", i, c[i]); } printf("\n"); } |
실수 타입 배열 입력 받아서 요소 할당 |
void main(){ float arr[3]; int i; for(i=0;i<3;i++){ scanf("%f", &arr[i]); } for(i=0;i<3;i++){ printf("%.3f\t", arr[i]); } } |
배열 활용 |
void main(){ //3명의 국, 영, 수 점수를 처리(총점, 평균) int kor[]={56,87,67}; int eng[] = {78,90,56}; int math[] = {45,85,96}; //<total[0]:국어총합/total[1]:영어총합/total[2]:수학총합> int total[3]={0}; //<avg[0]:국어평균/avg[1]:영어평균/avg[2]:수학평균> float avg[3]; int i; for(i=0;i<3;i++){ total[0]+=kor[i]; total[1]+=eng[i]; total[2]+=math[i]; } for(i=0;i<3;i++){ avg[i]=(float)total[i]/3; } for(i=0;i<3;i++){ printf("total:%d, avg=%f\n", total[i], avg[i]); } } |
문자 배열 |
void main(){ //문자:스펠링 하나. 문자하나.'a'=>char //문자열:문자의 나열. "asdfsdf" //'\0': 널문자. 문자열의 끝을 인식시킨다. char a[6]={'h','e','l','l','o','\0'}; char b[10]="hello";//'\0'는 자동으로 들어감 int i; for(i=0;i<6;i++){ printf("%c", a[i]); } printf("\n"); //%s: 문자열 출력 서식 printf("a=%s\n", a); for(i=0;i<5;i++){ printf("%c", b[i]); } printf("\n"); printf("b=%s\n", b); } |
문자 배열 입력받아 초기화 |
void main(){ char name[10]; printf("name:"); //%s 문자열 입력 서식 scanf("%s", name); printf("당신의 이름은 %s이다.\n", name); } |
과제-성적처리 프로그램 |
void main(){ char name[10]; int score[5];//번호, 국,영,수,총 float avg; int i, j; printf("name:"); scanf("%s", name); printf("num, kor, eng, math를 순서대로 입력하라\n"); score[4]=0;//총점방을 0으로 초기화 for(i=0;i<4;i++){ scanf("%d", &score[i]); if(i!=0){//번호를 제외한 score[4]+=score[i];//국,영,수를 총점방에 누적 } } avg = (float)score[4]/3;//평균계산 printf("name\tnum\tkor\teng\tmath\ttotal\tavg\n"); printf("%s\t", name); for(i=0;i<5;i++){ printf("%d\t", score[i]); } printf("%f\n", avg); } |
5. 2차원 배열
2차원 배열 선언 / 값 할당 / 값 일기 |
void main(){ int a[2][3];//2줄 3칸 int i; a[0][0]=1; a[0][1]=2; a[0][2]=3; a[1][0]=4; a[1][1]=5; a[1][2]=6; printf("%d\t", a[0][0]); printf("%d\t", a[0][1]); printf("%d\n", a[0][2]); printf("%d\t", a[1][0]); printf("%d\t", a[1][1]); printf("%d\n", a[1][2]); } |
2줄3칸 배열에 1~6 저장 및 읽기 |
void main(){ int a[2][3];//2줄 3칸 int i, j, cnt=1; for(i=0;i<2;i++){ for(j=0;j<3;j++){ //a[i][j]=3*i+j+1; a[i][j]=cnt++; } } for(i=0;i<2;i++){ for(j=0;j<3;j++){ printf("%d\t", a[i][j]); } printf("\n"); } } |
2차원 배열 초기화 |
void main(){ int a[2][4]={{1,2,3,4}, {5,6,7,8}}; int b[][4]={{10,20,30,40}, {50,60,70,80}}; int c[][4]={{1,}, {5,6},{23,5,8}}; int i, j; for(i=0;i<2;i++){ for(j=0;j<4;j++){ printf("%d\t", a[i][j]); } printf("\n"); } for(i=0;i<2;i++){ for(j=0;j<4;j++){ printf("%d\t", b[i][j]); } printf("\n"); } for(i=0;i<3;i++){ for(j=0;j<4;j++){ printf("%d\t", c[i][j]); } printf("\n"); } } |
2차원 배열 키보드 입력으로 초기화 |
void main(){ int a[2][2]; int i, j; for(i=0;i<2;i++){ printf("숫자 2개를 입력하라\n"); for(j=0;j<2;j++){ scanf("%d", &a[i][j]); } } for(i=0;i<2;i++){ for(j=0;j<2;j++){ printf("%d\t", a[i][j]); } printf("\n"); } } |
3명의 번호, 국,영,수를 입력받아 총점과 평균을 출력하시오 |
void main(){ int score[3][5]; float avg[3]; int i, j; for(i=0;i<3;i++){ printf("num,kor,eng,math입력\n"); score[i][4]=0; for(j=0;j<4;j++){ scanf("%d", &score[i][j]); if(j!=0){ score[i][4]+=score[i][j]; } } avg[i]=(float)score[i][4]/3; } printf("num\tkor\teng\tmath\ttotal\tavg\n"); for(i=0;i<3;i++){ for(j=0;j<5;j++){ printf("%d\t", score[i][j]); } printf("%f\n", avg[i]); } } |
문자열 1개 저장 |
void main(){ //배열 1줄에 문자열 한개 밖에 저장 안됨 char str1[10]={'a', 'b', 'c', '\0'};//문자열 1개 저장 char str2[10]="abc"; char str3[10]; printf("문자열 입력하라\n"); scanf("%s", str3); printf("str1:%s\n", str1); printf("str2:%s\n", str2); printf("str3:%s\n", str3); } |
문자열 여러 개 저장 |
void main(){ char str1[3][10]={{'a','a','a','\0'}, {'b','b','b','\0'},{'c','c','c','\0'}}; char str2[3][10]={"abc", "def", "ghi"}; char str3[2][10]; int i; printf("문자열 2개 입력\n"); for(i=0;i<2;i++){ scanf("%s", str3[i]); } for(i=0;i<3;i++){ printf("str1[%d]:%s\n",i, str1[i]); } for(i=0;i<3;i++){ printf("str2[%d]:%s\n",i, str2[i]); } for(i=0;i<2;i++){ printf("str3[%d]:%s\n",i, str3[i]); } } |
3명의 이름, 번호, 국,영,수를 입력받아 총점과 평균을 출력하시오 |
void main(){ char name[3][10]; //번호,국,영,수,총 int score[3][5]; //평균 3개 float avg[3]; int i, j, k; char title[7][10]={"이름", "번호", "국어", "수학", "영어", "총점", "평균"}; for(i=0;i<3;i++){ k=0; printf("%s:", title[k++]); scanf("%s", name[i]); score[i][4]=0; for(j=0;j<4;j++){ printf("%s:", title[k++]); scanf("%d", &score[i][j]); if(j!=0){ score[i][4]+=score[i][j]; } } avg[i] = (float)score[i][4]/3; } for(i=0;i<7;i++){ printf("%s\t", title[i]); } printf("\n"); for(i=0;i<3;i++){ printf("%s\t", name[i]); for(j=0;j<5;j++){ printf("%d\t", score[i][j]); } printf("%f\n", avg[i]); } } |
4명의 이름, 학과, 학년을 입력받고 출력 |
void main(){ char name[4][10]; char dept[4][20]; int grade[4]; int i; for(i=0;i<4;i++){ printf("name:"); scanf("%s", name[i]); printf("dept:"); scanf("%s", dept[i]); printf("grade:"); scanf("%d", &grade[i]); } for(i=0;i<4;i++){ printf("%s\t%s\t%d\n", name[i], dept[i], grade[i]); } } |
6. 상수
1) 매크로 상수
#include <stdio.h> #define MAX 100 //매크로 상수=>치환 #define SIZE 6 //매크로 상수 void main(){ int x = 20; //변수 int arr[SIZE]; //매크로 상수로 배열의 크기 지정 //MAX=500; 에러. 상수는 값 변경 안됨 printf("MAX:%d\n", MAX); printf("SIZE:%d\n", SIZE); if(x>MAX){ printf("x는 %d 보다 크다\n", MAX); }else{ printf("x는 %d 보다 크지 않다\n", MAX); } printf("숫자 %d개 입력:", SIZE); for(x=0;x<SIZE;x++){ scanf("%d", &arr[x]); } for(x=0;x<SIZE;x++){ printf("%d\t", arr[x]); } printf("\n"); } |
2) const 상수
#include <stdio.h> #define STR "HELLO" //매크로는 타입 지정 없음 #define SIZE2 10 void main(){ const int MAX = 100; //타입을 지정하여 상수정의 const int SIZE = 3; const char STR2[SIZE2]="hello2"; int x; int arr[SIZE]; printf("MAX:%d\n", MAX); printf("SIZE:%d\n", SIZE); printf("STR:%s\n", STR); printf("STR2:%s\n", STR2); for(x=0;x<SIZE;x++){ arr[x]=x+1; } for(x=0;x<SIZE;x++){ printf("%d\t", arr[x]); } //MAX=400; //상수이므로 변경불가 } |
7. 배열 활용
1)버블정렬
#include <stdio.h> for(i=0;i<SIZE;i++){ |
2)삽입정렬
#include <stdio.h> for(i=0;i<SIZE;i++){ |
3)선택정렬
#include <stdio.h>
for(i=0;i<SIZE;i++){ |
4)순차탐색
#include <stdio.h> #define SIZE 10 void main(){ int a[]={8,3,6,9,5,10,4,1,2,7}; int i, j=1, tmp; printf("검색할 숫자를 입력하라"); scanf("%d", &tmp); for(i=0;i<SIZE;i++){ if(tmp==a[i]){ printf("%d방에 있다\n", i); //j=0; break; } } if(i==10){ printf("없다"); } /* if(j==1){ printf("없다"); } */ } |
5)이진탐색
이진 탐색은 먼저 정렬이 선행되어야 함
#include <stdio.h> void main(){ int a[]={1,2,3,4,5,6,7,8,9,10}; int i, j, f=0, l=9, mid; printf("검색할 값:"); scanf("%d", &j); while(f<=l){ mid=(f+l)/2; if(j==a[mid]){ printf("%d위치에 있음\n", mid); break; }else if(j>a[mid]){ f = mid+1; }else{ l = mid-1; } } if(f>l){ printf("not found\n"); } } |
8. 배열의 단점
객체를 구현 하면 복잡도 올라감
#include <stdio.h> #include <string.h> void main(){ char name[3][10]; int score[3][5]={{0,},{0,},{0,}}; float avg[3]; char title[][10]={"name", "num", "kor", "eng","math", "total", "avg"}; int i,j,cnt=0, tmp_i; float tmp_f; char tmp_c[10]; for(i=0;i<3;i++){ cnt=0; printf("%s:", title[cnt++]); scanf("%s", name[i]); for(j=0;j<4;j++){ printf("%s:", title[cnt++]); scanf("%d", &score[i][j]); if(j!=0){ score[i][4]+=score[i][j]; } } avg[i]=(float)score[i][4]/3; } for(i=0;i<2;i++){ for(j=0;j<2-i;j++){ if(score[j][4]<score[j+1][4]){ //이름 swap strcpy(tmp_c, name[j]); strcpy(name[j], name[j+1]); strcpy(name[j+1], tmp_c); //score swap for(cnt=0;cnt<5;cnt++){ tmp_i = score[j][cnt]; score[j][cnt] = score[j+1][cnt]; score[j+1][cnt] = tmp_i; } //avg swap tmp_f = avg[j]; avg[j] = avg[j+1]; avg[j+1] = tmp_f; } } } for(i=0;i<7;i++){ printf("%s\t", title[i]); } printf("\n"); for(i=0;i<3;i++){ printf("%s\t", name[i]); for(j=0;j<5;j++){ printf("%d\t", score[i][j]); } printf("%f\n", avg[i]); } } |
배열 장점:집합데이터를 처리. 메모리인접. 포인터에 비해 접근속도 빠르다
배열 단점: 한 타입저장. 크기가 정해있다.
배열로 객체 표현 힘듦=>보완=>구조체
구조체: 타입 정의
1)타입정의
struct 타입명{
변수들...
};
struct Student{
int num; //멤버변수
char name[10]; //멤버변수
};
2)변수선언
struct 타입명 변수명;
struct Student s1, s2;
s1.num=10;
strcpy(s1.name, "aaa");
#include <stdio.h> #include <string.h> //타입 정의. 기본 타입으로만 객체 묘사 어려움. struct Student{ int num; char name[10]; }; void main(){ struct Student s1, s2; s1.num = 1; strcpy(s1.name, "aaa"); s2.num = 2; strcpy(s2.name, "bbb"); printf("s1.num=%d, s1.name=%s\n", s1.num, s1.name); printf("s2.num=%d, s2.name=%s\n", s2.num, s2.name); } |
'c' 카테고리의 다른 글
6. 포인터 (0) | 2020.02.17 |
---|---|
5. 함수 (0) | 2020.02.12 |
3. 제어문 (3) | 2020.01.08 |
2. 변수와 연산자 (0) | 2020.01.05 |
1. 개발환경구축 - 코드블럭설치 (0) | 2019.12.21 |
댓글