반응형

소프티어의 "성적 평균" 문제를 풀다가 "평균을 소수점 셋째 자리에서 반올림하여 표시" 하도록 요구되어 있었다.

printf에서는 "%.2f"엿던가..? 

 

c++에서 iomanip 헤더에 있는 setprecision을 사용하면 소수점 반올림이 가능하다.

 

cout으로 출력을 낼 때는 다음 두가지 경우로 나누어 표현할 수 있다 

 

✔ fixed를 안붙이는 경우

double a = 3.1415
cout<<setprecision(3)<<a<<endl;

//출력 : 3.14

fixed의 역할은 고정 소수점 표기를 해주는 것인데, 위처럼 fixed를 쓰지 않으면, setprecision(3)에 의해서 3번째 자리수에서 반 올림하고, 3.14로 출력된다.

만약 a가 3.000이었다면, 소수점이하의 값은 날라가서 3으로 출력된다.

 

✔ fixed를 붙이는 경우

double a = 3.1415
cout<<fixed<<setprecision(3)<<a<<endl;
//출력 : 3.142

 fixed를 붙이면 3번 째 자리까지 반올림 된 값이 출력이 된다.

 

따라서 문제에서는 3번째 자리에서 반올림하여 둘째 자리까지 표시되도록 (3.00) 하였으므로, fixed를 붙이고 setprecision(2)로 하여 출력하였다.

 

 

반응형
반응형

소프티어의 "성적 평균" 문제를 풀다가 사용했던 2차원 배열 동적 할당에서 어이없는 오류를 냈다.

기본 of 기본인데.. 이 참에 한번 짚고 넘어간다!

 

✅ 배열 동적 할당

✔ 1차원 배열을 동적 할당 시

//int 배열을 받는다고 가정하겠습니다.
int N=100;
int *arr = new int[N];
//크기가 100인 int타입의 배열을 동적 할당해주었습니다. arr이라는 이름으로요.

✔ 2차원 배열을 동적 할당 시

//동일하게 int 타입의 배열을 생성하겠습니다.
int N = 100;
int **arr = new int*[N];
//1차원과 다른 점은 바로 이 부분입니다. arr을 2차원으로 생성한다면, 먼저 1차원 포인터 배열을 가리키도록 해야겠죠?

for(int i=0; i<N; i++){
	arr[i] = new int[N];//그리고 각각의 1차원 포인터에 크기가 N인 배열을 가리키도록 해주어야 2차원 형태가 됩니다.
}

 

어떤 실수를 했었냐면, **arr = new int[N][N]; 이렇게 해버린 것이다.. 뒤에 [N][N]은 정적 배열을 생성할 때 하는 것인데.. 이런 실수를 더이상 하지말자!!!!!

 

 

반응형
반응형

main함수의 맨 위에 다음 세 줄을 적어주면, cin, cout과 같은 입출력 스트림 사용 시 시간을 좀 더 단축할 수 있다.

하지만, n의 크기가 커지면 입출력으로 인한 시간 단축은 별로 의미가 없을 수 있다는 점을 알아두자.

ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

ios_base::sync_with_stdio(false)는 C++ 스트림과 C 스타일 스트림 간의 동기화를 비활성화 해준다.

이렇게하면 C++ 스트림과 C 스타일 스트림이 각각 독립적으로 작동하며 데이터가 교차되지 않는다.

cin.tie(NULL)cout.tie(NULL)는 C++ 스트림의 버퍼와 C 스타일 스트림 간의 결합도를 제거한다.

tie(NULL)은 출력 스트림의 버퍼와 입력 스트림의 버퍼를 연결하지 않도록 설정한다.

따라서 불필요한 교차로 인해 발생하는 시간을 줄일 수 있으므로, 적은 양의 데이터를 이용하는 프로그램에서는 유용할 수 있다.

하지만, 교차가 필요한 경우에는 예기치 못한 상황이 발생할 수 있으니, 사전에 꼭 확인하고 사용하여야 한다.

 

반응형
반응형

1. 'strcpy()' vs '=' / 'assign()' 

 

c++로 문제를 해결하던 중 string 문자열을 복사하는 코드에서 'strcpy()'를 사용해서 문자열을 대입하려고 했더니, strcpy의 인자인 const char* 타입은 string과 어긋나면서 오류가 발생하였다!

 

더보기

strcpy 함수는 C 스타일의 문자열을 복사하는 함수로서, 다음과 같은 형태를 가집니다

: char* strcpy(char* destination, const char* source). 

 

c++에서 string문자열을 복사/대입하려면 std::string멤버 함수인 assign() 또는 = 연산자를 사용하면 해결된다!

확실히 c보다 c++은 문자열에서도 제약을 덜 받는 느낌이다,,

 

2. 'strcmp()' vs '=='

 

strcmp역시 c언어 스타일에서 사용하는 방식이다. 위에서와 동일한 오류가 발생한다.

c++에서는 단순히 ==을 통해 문자열을 비교할 수 있다!

 

3.vector의 맨 앞 원소를 삭제할 때

 

vector.erase(vector.front())

 

4.vector의 원하는 위치에 원소를 삽입할 때

 

vector.insert(vector.begin()+i, temp);

 

인덱스 정보를 넣는 곳에 정수를 입력해서 오류가 발생하였다!

iterator를 인자로 받기 때문에, 위와같이 vector.begin()으로 인덱스 정보를 가져와야 한다.

i는 원하는 인덱스번호라고 생각할 수 있고, temp는 넣고자 하는 값이다.

 

5. auto 자료형 추론

auto는 변수 선언 시 자료형을 명시하지 않아도, 대입된 값을 통해서 컴파일러가 알아서 자료형을 추론한다.

코드가 간결해지고 유지보수에는 좋으나, 가독성이 떨어질 수 있음!

 

 

vector의 기본 쓰임에 대해 복습할 필요가 있음을 느낀 문제..

 

 

 

반응형

+ Recent posts