상세 컨텐츠

본문 제목

2-1 2차원배열의 행정렬

과제

by 근성 2021. 7. 14. 11:25

본문

이번 2차과제의 첫 문제는

1부터 20사이의 자연수를 난수로 배열에 넣은 후, 4*5배열값에 넣은 후, 행끼리 정렬을 시켜야합니다.

단 이문제에서는 메모리할당은 1번만 일어나야하고, 배열도 하나만 사용해야하고, 추가적인 배열을 사용하면 안됩니다.

 

예시

이 문제의 조건을 만족하기위해 제가 사용한것은

랜덤함수사용, 시간관련함수사용, 메모리 할당 및 해제, 정렬입니다.

#include<iostream>
#include<stdlib.h>//랜덤
#include<time.h>//매시도 마다 다른값

using namespace std;

int main()
{
	int* array_2D;
	int* row[4] = { 0,0,0,0 };
	array_2D = new int[20];

	srand((unsigned int)time(NULL));//매시도마다 다른값

	for (int i = 0; i < 20; i++)
	{
		*(array_2D + i) = rand() % 20 + 0;//랜덤값
	}

	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			cout << *(array_2D + 4 * i + j + i) << "\t";//랜덤값 출력
		}cout << "\n";
	}
	cout << "\n";

	row[0] = &array_2D[0];
	row[1] = &array_2D[5];
	row[2] = &array_2D[10];
	row[3] = &array_2D[15];

	for (int i = 0; i <= 3; i++)//행 오름차순
	{
		for (int j = 1; j <= 4; j++)//정렬
		{

			for (int k = j; k >= 1; k--)
			{
				int save;
				if (*(row[i] + k) < *(row[i] + k - 1))
				{
					save = *(row[i] + k);
					*(row[i] + k) = *(row[i] + k - 1);
					*(row[i] + k - 1) = save;
				}
			}
		}
	}
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			cout << row[i][j] << "\t";
		}cout << "\n";
	}
	cout << "\n";

	delete[]array_2D;//메모리 해제

}

이번에는 저번 1차과제에서 했던 할당과 다르게 malloc free가 아닌 new delete를 사용한것을 볼 수 있습니다.

 

저는 0~20까지의 랜덤값을 array_2D에 int값 20개가 들어가게 할당을 해주었습니다.

그리고 array_2D에 0, 5,10,15번째 주소값을 각행을 나타내는 row[0],row[1],row[2],row[3]을 준 후, 각 행마다 정렬을 시켰습니다.

여기서 제가 힘들어 했던 부분은 array_2D에 0, 5,10,15번째 주소값을 각행 을 나타내는 row[0],row[1],row[2],row[3]을 주는 부분입니다. (ex : row[0] = &array_2D[0];)

포인터 배열에 관한 자료를 조금 더 찾아보고 공부하겠습니다.

 

정렬은 구현하기 간단한 버블정렬을 사용했습니다.

 

결과화면 입니다.

결과화면

 

#이 문제의 출처는 kw대학교 컴퓨터정보공학부 2021년 1학기 객체지향 프로그래밍 과제 문제입니다.

 

 

'과제' 카테고리의 다른 글

2-3 함수포인터 void(*fp)() 사용  (0) 2021.07.20
2-2 단어장 만드는 프로그램  (0) 2021.07.15
1-8 뱀게임  (0) 2021.07.13
1-7 1차나 상수식을 검증하는 프로그램  (0) 2021.07.12
1-6 체크섬을 구하는 문제  (0) 2021.07.09

관련글 더보기

댓글 영역