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;
}
-> 생각해보니, 위의 코드에서 while
을 for
로 바꾸고 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을 끝낸다.