2011년6월8일_C과제8(코드오류수정(배열), 2차원배열연습, 짝수 검색, 2의 배수/3의 배수 검색, swap(문자교체))
C과제8 |
1. 잘못된 부분을 찾아서 고치고, 이유를 설명하세요.
1) int Num[];
int pNum = &Num;
답: int Num[10]; //10개의 저장공간
int *pNum = Num; //포인터변수 pNum에 배열Num의 주소를 넣음.
배열의 크기를 지정하지 않으면 메모리에 얼마나 예약해야 되는지 모르니 다음과 같은 에러가 난다.
일반변수에 주소를 넣으면 다음과 같은 경고가 난다.
주소를 담는 변수는 포인터변수이고 일반변수는 주소를 담아도 쓸 수 없다. 주소는 주소일 뿐...
2) char test[4] = {a, b, c, d};
답: char test[4] = {‘a’, ‘b’, ‘c’, ‘d’};
a~d는 상수가 아닌 변수이다. a~d를 문자상수로 바꾸어 대입.
다르게…
배열 선언 전에 변수 a~d를 선언하지 않았다. a~d를 선언해 주면 된다.
test[0]에는 a의 값, test[1]에는 b의 값, test[2]에는 c의 값, test[3]에는 d의 값이 들어간다.
3) int Arr1[] = {1, 2, 3, 4};
int Arr2[][] = {1, 2, 3, 4, 5, 6, 7};
답: int Arr2[][7] = {1, 2, 3, 4, 5, 6, 7};
배열의 첫 번째 색인은 생략이 가능하나 두 번째 색인부터는 꼭 명시해야 함.
4) int N1 = 3, N2 = 5;
int* const pN1 = &N1;
pN1 = &N2;
답: const int *pN1 = &N1;
pN1이 const(상수)형이라 pN1 초기화 시에 한 번 값을 넣으면 다시 변경할 수 없다.
const를 int앞에 붙이면 포인터pN1이 가리키는 곳의 값이 상수형이라는 뜻이니 pN1에 주소를 다시 넣을 수 있다. 그렇지만 가리키는 곳이 상수니 *pN1에 값을 대입하는 것은 불가능하다.
5) int N1 = 3, N2 = 5;
const int* pN1 = &N1;
pN1 = &N2;
답: 포인터변수 pN1은 N1과 N2 두 변수의 주소값을 참조하여 읽을 순 있으나 쓸 수 없다.
2. 그림을 보고 2차원 배열 선언 및 초기화를 작성해보세요.
1)
4 |
|
|
|
1 | 2 | 3 |
|
7 | 8 | 9 |
|
답: int aArr[3][4] = {{4},
{1, 2, 3},
{7, 8, 9}};
2)
5 |
|
|
|
1 | 2 | 3 |
|
1 | 7 | 9 |
|
8 | 8 |
|
|
|
|
|
|
답: int aArr[5][4] = {{5},
{1, 2, 3},
{1, 7, 9},
{8, 8}};
3) for문 사용
3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 |
답:
1: #include <stdio.h>
2:
3: #define ROW 4 //행
4: #define COL 5 //열
5:
6: int main()
7: {
8: int aArr[ROW][COL]; // 4 by 5 배열 선언
9: int i; // 반복제어변수 (행)
10: int j; // 반복제어변수 (열)
11:
12: //배열에 값을 대입.
13: for(i = 0 ; ROW > i ; ++i)
14: {
15: for(j = 0 ; COL > j ; ++j)
16: {
17: aArr[i][j] = (i * 5) + (j + 3);
18: }
19: }
20:
21: //배열에 있는 값들을 출력
22: for(i = 0 ; ROW > i ; ++i)
23: {
24: for(j = 0 ; COL > j ; ++j)
25: {
26: printf("%-3d", aArr[i][j]); //좌측정렬3자리
27: }
28:
29: printf("\n");
30: }
31:
32: return 0;
33: }
3. 다음과 같은 2차원 배열이 있을 때 다음 물음에 답하세요.
0 |
3 |
6 |
9 |
12 |
30 |
15 |
18 |
21 |
24 |
27 |
105 |
30 |
33 |
36 |
39 |
42 |
180 |
45 |
54 |
63 |
72 |
81 |
315 |
1) 짝수를 모두 출력하세요.
1: /*
2: 3. 다음과 같은 2차원 배열이 있을 때 다음 물음에 답하세요.
3: 0 3 6 9 12 30
4: 15 18 21 24 27 105
5: 30 33 36 39 42 180
6: 45 54 63 72 81 315
7: 1) 짝수를 모두 출력하세요.
8:
9: 2) 2의 배수이면서 3의 배수인 숫자의 합계는 얼마입니까?
10:
11: 3) 전체 합계와 평균 출력(평균은 소수점 두 자리까지).
12:
13: */
14:
15: //1) 짝수
16: #include <stdio.h>
17:
18: int main()
19: {
20: int aArr[4][6] = {{0, 3, 6, 9, 12, 30},
21: {15, 18, 21, 24, 27, 105},
22: {30, 33, 36, 39, 42, 180},
23: {45, 54, 63, 72, 81, 315}};
24: int iRow;
25: int iCol;
26:
27: for(iRow = 0 ; 4 > iRow ; ++iRow)
28: {
29: for(iCol = 0 ; 6 > iCol ; ++iCol)
30: {
31: if(0 == (aArr[iRow][iCol] % 2))
32: {
33: printf("%5d", aArr[iRow][iCol]);
34: }
35: }
36: }
37:
38: return 0;
39: }
2) 2의 배수이면서 3의 배수인 숫자의 합계는 얼마입니까?
1: /*
2: 3. 다음과 같은 2차원 배열이 있을 때 다음 물음에 답하세요.
3: 0 3 6 9 12 30
4: 15 18 21 24 27 105
5: 30 33 36 39 42 180
6: 45 54 63 72 81 315
7: 1) 짝수를 모두 출력하세요.
8:
9: 2) 2의 배수이면서 3의 배수인 숫자의 합계는 얼마입니까?
10:
11: 3) 전체 합계와 평균 출력(평균은 소수점 두 자리까지).
12:
13: */
14:
15: //2의 배수이면서 3의 배수인 숫자의 합계
16:
17: #include <stdio.h>
18:
19: int main()
20: {
21: int aArr[4][6] = {{0, 3, 6, 9, 12, 30},
22: {15, 18, 21, 24, 27, 105},
23: {30, 33, 36, 39, 42, 180},
24: {45, 54, 63, 72, 81, 315}};
25: int iRow;
26: int iCol;
27: int iSum = 0;
28:
29: for(iRow = 0 ; 4 > iRow ; ++iRow)
30: {
31: for(iCol = 0 ; 6 > iCol ; ++iCol)
32: {
33: if(0 == (aArr[iRow][iCol] % 2) && 0 == (aArr[iRow][iCol] % 3))
34: {
35: iSum = iSum + aArr[iRow][iCol];
36: }
37: }
38: }
39:
40: printf("2의 배수이면서 3의 배수인 숫자의 합은 %d입니다.\n", iSum);
41:
42: return 0;
43: }
3) 전체 합계와 평균 출력(평균은 소수점 두 자리까지).
1: /*
2: 3. 다음과 같은 2차원 배열이 있을 때 다음 물음에 답하세요.
3: 0 3 6 9 12 30
4: 15 18 21 24 27 105
5: 30 33 36 39 42 180
6: 45 54 63 72 81 315
7: 1) 짝수를 모두 출력하세요.
8:
9: 2) 2의 배수이면서 3의 배수인 숫자의 합계는 얼마입니까?
10:
11: 3) 전체 합계와 평균 출력(평균은 소수점 두 자리까지).
12:
13: */
14:
15: //전체 합계와 평균 출력
16: #include <stdio.h>
17:
18: int main()
19: {
20: int aArr[4][6] = {{0, 3, 6, 9, 12, 30},
21: {15, 18, 21, 24, 27, 105},
22: {30, 33, 36, 39, 42, 180},
23: {45, 54, 63, 72, 81, 315}};
24: int iRow;
25: int iCol;
26: int iSum = 0;
27: float fAvg;
28:
29: for(iRow = 0 ; 4 > iRow ; ++iRow)
30: {
31: for(iCol = 0 ; 6 > iCol ; ++iCol)
32: {
33: iSum = iSum + aArr[iRow][iCol];
34: }
35: }
36:
37: fAvg = iSum / (float)(iRow * iCol);
38:
39: printf("배열의 전체 합은 %d이고,\n", iSum);
40: printf("배열의 원소들의 평균은 %.2f입니다.\n", fAvg);
41:
42: return 0;
43: }
4. 입력받은 char형 데이터 두 개를 서로 바꾸는 swap 함수를 만들어 다음과 같은 프로그램을 구현하세요.
출력) 문자 입력 ch1 : A
문자 입력 ch2 : C
swap 전 : ch1=A, ch2=C
swap 후 : ch1=C, ch2=A
문자 입력 ch1 : D
문자 입력 ch2 : E
swap 전 : ch1=D, ch2=E
swap 후 : ch1=E, ch2=D
1: /*******************************************************************
2:
3: 4. 입력받은 char형 데이터 두 개를 서로 바꾸는 swap 함수를
4: 만들어 다음과 같은 프로그램을 구현하세요.
5:
6: 출력) 문자 입력 ch1 : A
7: 문자 입력 ch2 : C
8: swap 전 : ch1=A, ch2=C
9: swap 후 : ch1=C, ch2=A
10:
11: 문자 입력 ch1 : D
12: 문자 입력 ch2 : E
13: swap 전 : ch1=D, ch2=E
14: swap 후 : ch1=E, ch2=D
15:
16:
17: 작성자: 김수만
18: 작성일자: 2011년 6월 7일
19:
20: *******************************************************************/
21: #include <stdio.h>
22:
23: void SwapChar(char *, char *);
24:
25:
26: int main()
27: {
28: char cCh1;
29: char cCh2;
30:
31: printf("문자 입력 ch1 : ");
32: scanf(" %c", &cCh1);
33:
34: printf("문자 입력 ch2 : ");
35: scanf(" %c", &cCh2);
36:
37:
38: printf(" swap전 : ch1 = %c, ch2 = %c\n", cCh1, cCh2);
39:
40: SwapChar(&cCh1, &cCh2); //ch1과 ch2를 서로 바꿈.
41:
42: printf(" swap후 : ch1 = %c, ch2 = %c\n", cCh1, cCh2);
43:
44: return 0;
45: }
46:
47: //1Byte자료형의 데이터를 교환하는 함수.
48: void SwapChar(char *pCh1, char *pCh2)
49: {
50: char cTemp;
51:
52: cTemp = *pCh1; //임시저장.
53: *pCh1 = *pCh2; //2를 1으로
54: *pCh2 = cTemp; //1을 2로 바꿈.
55:
56: return ;
57: }
C과제8풀이 |
1. 잘못된 부분을 찾아서 고치고, 이유를 설명하세요.
1) int Num[];
int pNum = &Num;
Num배열의 크기가 없음. Num[3]; 또는 Num[] = {1, 2, 3};
주소를 저장하는 변수는 포인터. int *pNum = Num; (배열이름 자체가 주소)
2) char test[4] = {a, b, c, d};
문자를 넣으려면 작은 따옴표로 둘러싸야함. char test[4] = {‘a’, ‘b’, ‘c’, ‘d’};
3) int Arr1[] = {1, 2, 3, 4};
int Arr2[][] = {1, 2, 3, 4, 5, 6, 7};
Arr2배열의 열 사이즈가 없다.
Arr2[][3] = {{1, 2, 3},
{4, 5, 6},
{7}}; 이 때 행의 크기는 자동으로 3이 된다.
★ 배열의 초기화가 없으면 사이즈를 기입해야 하고 초기화 했으면 사이즈는 자동으로 컴파일러가 계산해 준다.
4) int N1 = 3, N2 = 5;
int* const pN1 = &N1;
pN1 = &N2;
const를 앞에 붙이면 상수라는 의미. pN1이라는 포인터변수자체가 상수가 되어 한 번 초기화되면 다시 쓰는 행위를 할 수 없다.
const를 빼면 pN1은 읽기와 쓰기 모두 가능하다.
★ const
int const a=3;
a=b; <- 에러!!
a라는 const로 선언되어 초기화 후에는 읽기만 가능함.
const double pi = 3.14;
pi에 대입하면 컴파일단계에서 에러가 나니 프로그래머의 실수를 알기 쉽다. (π와 같이 읽기만 원하는 변수에 적용)
5) int N1 = 3, N2 = 5;
const int* pN1 = &N1;
pN1 = &N2;
int*앞에 const가 붙어 pN1이라는 변수가 가리키는 곳(변수)의 값이 상수이다.
상기의 코드는 아무 문제가 없으나 포인터변수pN1를 이용해 N1이나 N2의 주소를 참조하여 쓰면 에러.
N1 = 4; (가능)
*pN1 = 4; (불가능) (N2의 주소를 참조하여 쓰기)
변수 = *pN1; (읽기는 가능.)
const int N1 = 3;
N1 = 4; (에러)
int N1 = 3;
N1 = 4; (읽기/쓰기 모두 가능)
const int *pN = &N1; (포인터 접근시 읽기만 가능)
★ 읽기만 해야 할 변수 접근시 const로 선언하면 안전.
2. 그림을 보고 2차원 배열 선언 및 초기화를 작성해보세요.
1)과 2)는 생략.
3) for문 사용
int num = 3;
중첩for문 내에 arr3[i][j] = num ++;
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
3. 다음과 같은 2차원 배열이 있을 때 다음 물음에 답하세요.
0 |
3 |
6 |
9 |
12 |
30 |
15 |
18 |
21 |
24 |
27 |
105 |
30 |
33 |
36 |
39 |
42 |
180 |
45 |
54 |
63 |
72 |
81 |
315 |
1) 짝수만 필터
if((a[i][j] % 2) == 0)
2) 2의 배수이면서 3의 배수
if((a[i][j] % 2) == 0 && (a[i][j] % 3) == 0)
3) 합과 평균
sum += a[i][j];
평균은 너무 빨리 지나가서 보지 못 하였으나 평균식대로 하면...
avg = sum / 원소의 갯수(60);
★3번 문제는 하나의 프로그램으로 만들 것. 함수사용.
4. 입력받은 char형 데이터 두 개를 서로 바꾸는 swap 함수를 만들어 다음과 같은 프로그램을 구현하세요.
int형 swap( )의 변형 char형으로 바꿈.
N1와 N2의 주소를 *N1과 *N2에 담아…
temp = *N1;
*N1 = *N2;
*N2 = temp;