Accelerated C++_Chapter03

gyeon·2021년 12월 24일
0

Accelerated C++

목록 보기
5/5

문제

3-0

#include <algorithm>	// sort
#include <string>
#include <ios>			// streamsize
#include <iostream>
#include <iomanip>		// setprecision 정의
#include <vector>

using std::cin; using std::cout;
using std::sort; using std::endl;
using std::string; using std::setprecision;
using std::vector; using std::streamsize;

int main() {
	cout << "What is your name? : ";	// cin이 stream버퍼를 사용 -> 버퍼가 flush되어 출력됨.
	string name;
	cin >> name;

	cout << "Wirte your midtrem and final exam grades ex)88 100 : ";
	double mid, final;
	cin >> mid >> final;

	cout << "Wirte your homework grades, "
			"followd by EOF : ";	// 연속된 string들은 하나로 합쳐진다.
	vector<double> hw_grades;
	double hw_grade;
	// >>연산은 연속적인 연산을 위해 왼쪽의 피연산자를 반환한다.
	// 따라서 istream을 반환하는데, 이는 조건문에서는 false / true로 변환된다.
	// 변환될 때 istream은 객체내부의 값을 반영하므로, 입력받은게 없으면 false로 된다.
	while (cin >> hw_grade)
		hw_grades.push_back(hw_grade);

	// vector<double>::size_type형을 vec_size로 정의.
	// size_type : 벡터 및 컨테이너를 정의한 라이브러리에서 크기를 표현할때 쓰는 자료형. unsigned타입.
	typedef vector<double>::size_type vec_size;
	vec_size size = hw_grades.size();
	if (size == 0) {
		cout << "YOU DIDN'T WRITE GRADE!!!!!\n";
		return 1;
	}
	sort(hw_grades.begin(), hw_grades.end());
	double median;
	vec_size idx_mid = size / 2;
	median = (size % 2 == 0 ? (hw_grades[idx_mid] + hw_grades[idx_mid - 1])/2 : hw_grades[idx_mid]);

	// cout의 맴버함수 precision은 스트림이 부동소수점에서 사용하는 정밀도를 반환한다.
	// 인수가 없으면 정밀도를 바꾸지 않고, 있으면 그 값으로 정밀도를 변환한다(바뀌기 전의 값 반환).
	// streamsize : I/O 작업에서 전송된 문자 수 또는 I/O 버퍼의 크기를 나타내는 데 사용되는 부호 있는 정수 형식.  unsigned형
	streamsize prec = cout.precision();
	// setprecision은 조작어이다. 이어서 발생하는 출력 스트림의 정밀도를 설정한다.
	cout <<  "Your grade is " << setprecision(3)
		<< 0.2 * mid + 0.4 * final + 0.4 * median
		// 출력이 끝나고 정밀도를 원래대로 되돌려놓는다.
		<< setprecision(prec) << endl;
	return 0;

3-1 ??문제의 의도가 뭘까... 중앙값은 n개의 데이터 중, 중앙에 있는 값을 선택하는 것이다. 이를 위해서는 읽은 데이터의 개수와, 그 값들(정확히는 중앙부에 위치한 값들)을 필요로 하므로, 일단 모든 데이터를 저장하고, 그 개수를 세야하므로 값들을 버릴수 없다... 수식적으로 증명하라는 말인가...
3-2

#include <iostream>
#include <vector>

int main () {
	int element;
	std::vector<int> vec_int;
	std::vector<int>::size_type size;

	while (std::cin >> element) {
		vec_int.push_back(element);
	}
	size = vec_int.size();
	if (size <= 3)
		return 1;
	else
		std::cout << vec_int[size / 4];
	return 0;
}

3-3 각 단어가 등장하는 횟수를 세는 프로그램... 입력을 벡터로 받고, 단어 : 횟수형태로 한 줄씩 출력되게 만드는 프로그램

#include <iostream>
#include <vector>

using std::string;

int main() {
	string word;
	std::vector<string> vec_words;

	while (std::cin >> word) {
		vec_words.push_back(word);
	}
	if (vec_words.empty()) {
		std::cout << "입력된 문자가 없습니다.";
		return 1;
	}
	typedef std::vector<string>::size_type vec_leng;
	vec_leng leng = vec_words.size();
	vec_leng i = 0, j, cnt;
	std::vector<bool> flg(leng, false);
	while (i < leng) {
		cnt = 0;
		j = i;
		if (!flg[i]) {
			while (j < leng) {
				if (vec_words[i].compare(vec_words[j]) == 0 && !flg[j]) {
					++cnt;
					flg[j] = true;
				}
				++j;
			}
			std::cout << vec_words[i] << ": " << cnt << "\n";
		}
		++i;
	}
	return 1;
}

-> 생각해보니, 위의 코드에서 whilefor로 바꾸고 if문 안에 내용을 넣을게 아니라 if문을 만족시키면 continue를 시켜면 코드를 더 가독성 좋게 만들수 있을거 같다.
3-4 개행까지 쭉 입력을 받는 프로그램 작성, 그리고 각 원소별로 string의 길이를 바탕으로 가장 긴 녀석을 구함.

#include <iostream>
#include <vector>

using std::cin; using std::string;
using std::vector;

int main() {
	string str;
	vector<string> vec_strs;

	// white space단위가 아니라, 개행 단위로 문자를 입력받을때
	while (getline(cin, str)) {
		vec_strs.push_back(str);
	}
	if (vec_strs.empty()) {
		std::cout << "입력된 문자가 없습니다.";
		return 1;
	}
	string str_max;
	typedef string::size_type str_size;
	str_size max = 0, temp;
	for (vector<string>::iterator iter = vec_strs.begin(); iter != vec_strs.end(); iter++) {
		temp = iter->size();
		if (temp > max) {
			// iterator 내부의 데이터 사용시 포인터처럼 * 사용.
			str_max = *iter;
			max = temp;
		}
	}
	std::cout << "max string : " << str_max << std::endl;
	return 0;
}

3-5/3-6 학생들의 이름을 화이트스페이스로 구분지어서 받음. 그리고 각 학생당 성적을 입력 받는다. 과목 입력은 공백단위로 정수를 임의의 개수만큼 입력 받되, 그 개수를 항상유지하고, 다른개수의 입력이 들어오면 1을 반환하여 main을 끝낸다.

profile
백엔드와 서버 in 42Seoul

0개의 댓글