이름 국어 영어 수학 점수를 입력받아 총점과 평균을 구하는 프로그램을 작성하시오!
(이름, 국어, 수학, 총점, 평균 순으로 출력한다.)
#include <stdio.h>
void main()
{
char name[10];
int kor, eng, mat, tot;
float ave;
printf("이름 국어 영어 수학 순으로 입력하세요\n");
scanf("%s%d%d%d", name, &kor, &eng, &mat);
tot = kor + eng + mat;
ave = tot / 3.0f;
printf("이름: %s kor(%d) eng(%d) mat(%d) tot(%d) ave(%.1f)\n",
name, kor, eng, mat, tot, ave);
}
<생각해보기>
1명의 학생이 아니라 5명의 학생에 대해 처리하는 프로그램으로 수정해야 한다면?
#include <stdio.h>
void main()
{
char name1[10];
int kor1, eng1, mat1, tot1;
float ave1;
printf("이름 국어 영어 수학 순으로 입력하세요\n");
scanf("%s%d%d%d", name1, &kor1, &eng1, &mat1);
tot1 = kor1 + eng1 + mat1;
ave1 = tot1 / 3.0f;
char name2[10];
int kor2, eng2, mat2, tot2;
float ave2;
printf("이름 국어 영어 수학 순으로 입력하세요\n");
scanf("%s%d%d%d", name2, &kor2, &eng2, &mat2);
tot2 = kor2 + eng2 + mat2;
ave2 = tot2 / 3.0f;
char name3[10];
int kor3, eng3, mat3, tot3;
float ave3;
printf("이름 국어 영어 수학 순으로 입력하세요\n");
scanf("%s%d%d%d", name3, &kor3, &eng3, &mat3);
tot3 = kor3 + eng3 + mat3;
ave3 = tot3 / 3.0f;
char name4[10];
int kor4, eng4, mat4, tot4;
float ave4;
printf("이름 국어 영어 수학 순으로 입력하세요\n");
scanf("%s%d%d%d", name4, &kor4, &eng4, &mat4);
tot4 = kor4 + eng4 + mat4;
ave4 = tot4 / 3.0f;
char name5[10];
int kor5, eng5, mat5, tot5;
float ave5;
printf("이름 국어 영어 수학 순으로 입력하세요\n");
scanf("%s%d%d%d", name5, &kor5, &eng5, &mat5);
tot5 = kor5 + eng5 + mat5;
ave5 = tot5 / 3.0f;
printf("이름: %s kor(%d) eng(%d) mat(%d) tot(%d) ave(%.1f)\n",
name1, kor1, eng1, mat1, tot1, ave1);
printf("이름: %s kor(%d) eng(%d) mat(%d) tot(%d) ave(%.1f)\n",
name2, kor2, eng2, mat2, tot2, ave2);
printf("이름: %s kor(%d) eng(%d) mat(%d) tot(%d) ave(%.1f)\n",
name3, kor3, eng3, mat3, tot3, ave3);
printf("이름: %s kor(%d) eng(%d) mat(%d) tot(%d) ave(%.1f)\n",
name4, kor4, eng4, mat4, tot4, ave4);
printf("이름: %s kor(%d) eng(%d) mat(%d) tot(%d) ave(%.1f)\n",
name5, kor5 ,eng5, mat5, tot5, ave5);
}
배열(Array)이란?
연속된 동일한 자료형의 집합이다.
배열은 가장 기본이 되는 자료구조이기도 하며, 정말 유용하게 쓰인다.
자료형 배열명[크기];
<주의> 크기는 항상 상수가 되어야 한다. 즉 변수가 올 수 없다.
예1)
char a[4] = "Neo"; // 문자열일 경우에만 ""로 초기화 시킬수 있으며
// 아래처럼 초기화 시키면 문자열일 경우 불편하다.
char a[4] = {'N', 'e', 'o'}; // 수학의 집합처럼 초기화 시킬 수 있다.
|
| a &a[0] |
&a[1] |
&a[2] |
&a[3] |
|
|
|
| 1000 | 1001 | 1002 | 1003 |
|
|
|
| N | e | o | \0 |
|
|
|
| a[0] | a[1] | a[2] | a[3] |
|
|
배열명 a 는 배열의 시작주소(변수가 아니라 상수)이다.
문자열을 나타내는 char 형의 배열일 경우 문자열의 끝을 알리는
'\0'(NULL)이 항상 배열내에 존재해야한다.
인덱스(첨자)를 이용해서 내용을 수정할 수 있다.
배열의 인덱스는 0 부터 시작한다. a[n] 의 경우 a[0]~a[n-1] 로 이루어져 있다.
a[0] = 'J';
a[1] = 'o';
a[2] = 'e';
<주의사항>
a = "xyz"; // 가능할까?
예2)
int b[4] = {0, 4,1,5};
|
| b &b[0] | &b[1] |
&b[2] |
&b[3] |
|
|
|
| 2000 | 2004 | 2008 | 2012 |
|
|
|
| 0 | 4 | 1 | 5 |
|
|
|
| b[0] | b[1] | b[2] | b[3] |
|
|
배열명 b 는 배열의 시작주소이다.
인덱스(첨자)를 이용해서 내용을 수정할 수 있다.
b[0] = 9;
b[1] = 8;
b[2] = 7;
b[3] = 6;
<주의사항>
b = {1, 2, 3, 4}; // 가능할까?
<예제>
MAX 명의 점수를 입력받아 역순으로 출력하는 프로그램
#include <stdio.h>
#define MAX 5
void main()
{
int iScore[MAX], i;
for (i = 0; i < MAX; ++i)
{
scanf("%d", &iScore[i]);
}
for (i = MAX - 1; i >= 0; --i)
{
printf("%d ", iScore[i]);
}
}
<실습1>
MAX 명의 이름 국어 영어 수학 점수를 입력받아 총점과 평균을 구하는 프로그램을 작성하시오!
(이름, 국어, 수학, 총점, 평균 순으로 출력한다.)
<실습2>
실습1 + 등수 포함
(이름, 국어, 수학, 총점, 평균, 등수 순으로 출력한다.)
자신 다른사람
i j
[0] [0,1,2,3,4]
if (tot[0] < tot[0,...4])
{
++rank[0];
}
[1] [0,1,2,3,4]
if (tot[1] < tot[0,...4])
{
++rank[1];
}
[2] [0,1,2,3,4]
if (tot[2] < tot[0,...4])
{
++rank[2];
}
[3] [0,1,2,3,4]
if (tot[3] < tot[0,...4])
{
++rank[3]
}
[4] [0,1,2,3,4]
if (tot[4] < tot[0,...4])
{
++rank[4]
}
for (int i = 0; i < 5; ++i) // 자기 자신 i
{
for (int j = 0; j < 5; ++j)// 비교대상 다른사람 j
{
}
}
<실습3>
실습2 + 등수순으로 출력
(이름, 국어, 수학, 총점, 평균, 등수 순으로 출력한다) + 등수를 오름차순(1등부터 차례대로 출력)
다차원 배열
지금까지 배운 배열은 1차원 배열이라고 하고 첨자를 두개 사용하면 2차원배열 세개 사용하면 3차원 배열 n개를 사용하면 n차원 배열이 된다.
int c[2][3] = { 1, 2, 3, 4, 5, 6};
또는
int c[2][3] = { {1, 2, 3}, {4, 5, 6} };
c[0][0] | c[0][1] | c[0][2] |
c[1][0] | c[1][1] | c[1][2] |
예1)
#include <stdio.h>
void main()
{
int c[2][3] = { 1, 2, 3, 4, 5, 6};
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 3; ++j)
{
printf("%d ", c[i][j]);
}
printf("\n");
}
}
<출력결과>
1 2 3
4 5 6
Press any key to continue
개념상 2차원배열은 n*m 박스의 형태를 보여주고 있으나,
메모리는 선형적이기 때문에 실제로는 아래와 같이 메모리에 위치해 있다.
c c[0] &c[0][0] | 3004
c[0]+1 &c[0][1] | 3008
c[0]+2 &c[0][2] | 3012 c+1 c[1] &c[1][0] | 3016
c[1]+1 &c[1][1] | 3020
c[1]+2 &c[1][2] |
1 | 2 | 3 | 4 | 5 | 6 |
c[0][0] | c[0][1] | c[0][2] | c[1][0] | c[1][1] | c[1][2] |
c+1 => c+1*sizeof(int)*3
c[0]+1 => c[0]+1*sizeof(int)
예2)
#include <stdio.h>
void main()
{
int c[2][3] = {1, 2, 3, 4, 5, 6};
unsigned int idx = 0;
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 3; ++j)
{
printf("%p:%p[%d][%d]=%d ",
&c[i][j], &c[0][0] + idx,
i, j,
*(c[0] + idx));
++idx;
}
printf("\n");
}
}
<출력결과>
0013FEC0:0013FEC0[0][0]=1 0013FEC4:0013FEC4[0][1]=2 0013FEC8:0013FEC8[0][2]=3
0013FECC:0013FECC[1][0]=4 0013FED0:0013FED0[1][1]=5 0013FED4:0013FED4[1][2]=6
Press any key to continue
<실습4>
반 3명, 학년 2학급 (전체등수 추가 및 전체등수순으로 출력)