책 흐름 집중 포인트 : 예제 단위로 끊어본다. 핵심이 얕고 넓게 퍼져 있어서 사실만 축약한다. 질질질..글 스타일이라 코드를 치면서 집중도를 높이고 음악 들으며 봐도 되는 책이다. 오히려 그래야 좀 진도가 나간다. 옆에 비고?란에 의외로 중요한게 가끔 나온다. |
4-3
% 연산자의 피연사는 모두 정수형이어야 한다.
4-4 증감연산자
증감 연산자의 피연산자는 상수나 일반 수식을 사용할 수 없다
++ -- 사이에 공백은 넣을 수 없다
증감연산자는 산술연산자, 관계연산자, 논리연산자보다 우선순위가 높다
#include <iostream>
using namespace std;
int main() {
int x, y, p;
x = 3;
y = x++;
cout << "x=" << x << " " << " y=" << y << endl;
x = 10;
y = ++x;
cout << "x=" << x << " " << " y=" << y << endl;
p = ++x + y++;
cout << "x=" << x << " " << " y=" << y;
cout << " p=" << p << endl;
return 0;
}
4-5 감소연산자
(비슷해서 생략)
4-6 관계연산자
두 개의 피연산자 크기를 비교하는 연산자
< > <= => == != 가 있다.
관계연산자 우선순위는 사칙연산자보다 낮다.
조건이 일치하면 참/true/0 외의 정수가 되고 불일치하면 거짓/false/0 이 된다.
각 기호 사이에 공백을 넣으면 오류가 발생한다.
#include <iostream>
using namespace std;
int main() {
int x;
cout << "0이나 1을 입력하세요 : ";
cin >> x;
if (x == 0) {
cout << "10/3=" << 10 / 3 << endl;
}
else {
cout << "10%3=" << 10 % 3 << endl;
}
return 0;
}
4-7 논리 연산자
두 개의 데이터만 비교 가능한 관계연산자의 한계를 극복한다
논리연산자는 두 개 이상의 조건을 조합하여 표현한다.
연산 결과는 true, false 값만 가진다.
NOT(!) 연산 - 전체 조건 부정. 곱셈연산자보다 우선순위가 높고, 증가연산자와 같다
AND(&&) - 모든 조건 만족. || 연산자보다 우선순위가 높다
OR(||) - 일부 조건 만족.
#include <iostream>
using namespace std;
int main() {
int x;
cout << "하나의 정수를 입력하세요 : ";
cin >> x;
if (x >=5 && x<10) {
cout << "5보다 크거나 같고 10미만" << endl;
}
else {
cout << "다른 정수" << endl;
}
return 0;
}
4-8 비트 단위 논리 연산자
임베디드시스템, 암호, 하드웨어 디바이스 제어를 위해 사용된다.
각 비트에서 비트단위논리연산자는 해당 비트에만 적용되고 다른 비트에는 적용되지 않는다
~x
x&y
x|y
비트 단위 보수 (~) - 1의 보수 (0이면 1, 1이면 0으로 변경된 것이 연산결과)
비트 단위 곱 (&) - x와 y의 비트 단위 곱 (AND), 모두 1이면 1, 그 외에는 0가 연산 결과
비트 단위 합 (|) - x와 y의 비트 단위 합(OR), 연산결과 모두 0이면 0, 그 외 1
배타적 비트 단위 합 (^) - 비트 XOR. 다르면1, 모두 같으면 0
~1100=0011
a=1100
b=0110
a&b=0100
0&0=0
0&1=0
1&1=1
1&0=0
// & - 모두 1일때만 1이고 그 외 0
a=1100
b=0110
a|b=1110
0|0=0
0|1=1
1|1=1
1|0=1
// | - 모두 0일때만 0, 그 외에는 모두 1
a=1100
b=0110
a^b=1010
// 0^0=0
// 0^1=1
// 1^0=1
// 1^1=0
// 입력값이 같지 않으면 1을 출력
n개 비트들의 xor 결과는 일반적으로
1의 개수가 홀수 개면 1, 짝수 개면 0이다
#include <iostream>
using namespace std;
int main()
{
int a, b, c;
a = 25;
b = 17;
c = a & b;
cout << "25(00011001) & 17(00010001) ==> " << c << '\n';
c = a | b;
cout << "25(00011001) | 17(00010001) ==> " << c << '\n';
c = a ^ b;
cout << "25(00011001) ^ 17(00010001) ==> " << c << '\n';
c = ~a;
cout << "~00011001 => 11100110 ==> -(0011001+1) 25에 대한 1의 보수";
cout << c << endl;
return 0;
}
// 각각 2진수로 변환한 후 각 비트끼리 연산한다
4-9 shift 연산자
D/A 변환기(디지털/아날로그 전환 회로) 와 같은 외부 장치로부터 입력한 내용을 디코딩(인코딩 반대로, 컴퓨터 언어를 사람용으로 변환)하거나 상태 정보 등을 읽어올 때 주로 사용.
x<<n // x의 값을 2진수로 표시 후 n비트만큼 왼쪽으로 이동하고 이동 위치에 0을 채움
x>>n // // 우측으로 //
원래 있던 것은 절단
#include <iostream>
using namespace std;
int main()
{
int x, y;
x = 9; //1001
y = x << 1; // 10010 (18)
cout << "1비트 왼쪽으로 이동하고 우측 남는 빈칸은 0으로 채움" << y << endl;
y = x << 2; // 100100 (36)
cout << "2비트 왼쪽으로 이동하고 우측 남는 빈칸은 0으로 채움" << y << endl;
return 0;
}
주소 연산자 &
포인터 *
변수 x가 위치한 메모리 시작 주소
포인터 변수 x가 가리키는 곳의 데이터
&x // &주소 변수
*x // *포인터
4-10 조건 연산자
if~then~else 명령문을 간단하게 하여 ?: 이렇게 쓴다
3개의 피연산자를 갖는 삼항 연산자
조건식?식2:식3;
//true면 2, flase 면 3
키보드에서 두 개의 정수값을 입력하고 최대값을 구하는 예
#include <iostream>
using namespace std;
int main()
{
int x, y, max;
cout << "두 개의 정수값을 입력하고 Enter 키 ㄱㄱ";
cin >> x >> y;
max = (x > y) ? x : y;
cout << "최대값: " << max << endl;
return 0;
}
4-11 sizeof 연산자
프로그램에서 사용하는 데이터타입이 현재 사용중인 컴에서 얼마만큼의 메모리를 확보하고 사용되는지 조회
sizeof(data type);
#include <iostream>
using namespace std;
int main()
{
cout << sizeof(int) << endl;
cout << sizeof(char) << endl;
cout << sizeof(double) << endl;
return 0;
}
4-12 형 변환 연산자(캐스트연산자)
묵시적 타입 변환 (자동 타입 변환, implicit)
형 변화는 모두 암시적
명시적 타입 변환
특별한 경우가 아니면 사용하지 않는다
캐스트 연산 후에는 원래의 정수 데이터형을 가진다.
#include <iostream>
using namespace std;
int x = 100;
int main()
{
int x = 10;
int y = 3;
double div;
cout << x/y << endl; //정수/정수는 정수
div = (double)x / y; //캐스트연산자
cout << div << endl;
return 0;
}
4-13 단항 스코프 식별 연산자(::)
::전역변수명
전역변수에 접근하기
#include <iostream>
using namespace std;
int x = 100;
int main()
{
int x = 10;
int y = 3; //지역변수로 스코프 안에서 유효하다
cout << x << endl;
cout << y << endl;
cout << ::x << endl; // 전역
x = y + ::x;
cout << x << endl;
return 0;
}
함수/클래스/네임스페이스 내에서 정의하지 않고 외부에 선언된 이름은 선언 위치부터 파일의 끝까지가 유효 범위
숨겨진 전역변수 이름은 범위지정연산자(::)를 사용해서 참조한다.
연습문제
1. 데이터 2, 3, 5를 정수 변수에 저장하고, 곱셈한 결과를 변수 result에 저장한 후 화면에 출력
#include <iostream>
using namespace std;
int main()
{
int x = 2;
int y = 3;
int z = 5;
int result = x * y * z;
cout << result;
return 0;
}
2. 키보드에서 두 개의 정수를 입력한 후 두 수의 합, 뺄셈, 곱, 몫, 나머지를 구
#include <iostream>
using namespace std;
int main()
{
int x, y;
cout << "두 정수 입력 ";
cin >> x >> y;
cout << x + y <<endl;
cout << x - y << endl;
cout << x * y << endl;
cout << x / y << endl;
cout << x % y << endl;
return 0;
}
3. 키보드에서 세 정수 입력 후 가장 큰 수, 가장 작은 수 출력
#include <iostream>
using namespace std;
int main()
{
int x, y, z;
int min, max;
cout << "3 정수 입력 ";
cin >> x >> y >> z;
// 최소값
min = x;
if (min > y) {
min = y;
}
if (min > z) {
min = z;
}
// 최대값
max = x;
if (max < y) {
max = y;
}
if (max < z) {
max = z;
}
cout << min <<endl;
cout << max << endl;
return 0;
}
4. 가로 4, 세로 7m인 직사각형의 면적(가*세)을 구하는 코드
#include <iostream>
using namespace std;
int main()
{
int width = 4;
int height = 7;
int area = width * height;
cout << area << endl;
return 0;
}
5. 키보드에서 원금, 이율, 일 수를 입력 후 변수에 저장하고,
다음 공식으로 이자를 산출해서 결과를 출력하는 코드
#include <iostream>
using namespace std;
int main()
{
int principal;
int annualInterest;
int days;
int rate;
cin >> principal >> annualInterest >> days;
rate = principal * annualInterest * days / 365;
cout << rate << endl;
return 0;
}
6. 사각형의 가로와 세로의 개수를 입력 후 별로 된 사각형을 출력하는 코드를 작성해보자.
꽉 채운 사각형, 테두리 한 줄 외 속이 빈 사각형 모양으로 출력
#include <iostream>
using namespace std;
int main()
{
int x, y;
cout << "사각형의 가로 세로 개수 입력 : ";
cin >> x >> y;
// 1. 꽉찬
// 세로
for (int j=0; j< y; j++) {
// 가로
for (int i=0; i< x; i++) {
cout << "*";
}
cout << '\n';
}
cout << '\n';
// 2. 빈
for (int j = 0; j < y; j++) {
// 가로
for (int i = 0; i < x; i++) {
if (i == 0 || i == x - 1 || j == 0 || j == y-1) {
// 첫번째나 마지막 가로 전부 찍기
// 그 외 첫번째, 마지막 별만 찍기
cout << "*";
}
else {
cout << " ";
}
}
cout << '\n';
}
return 0;
}
7. 키보드에서 두 수를 입력 후 범위가 -5<x<10이면 참, 그 외의 수이면 거짓으로 출력
#include <iostream>
using namespace std;
int main()
{
int x, y;
cout << "두 정수 입력 (음~양수) : ";
cin >> x >> y;
((x > -5 && x < 10) && (y > -5 && y < 10)) ? cout << "참" : cout << "거짓";
return 0;
}
8. 키보드에서 두 수 입력 후 범위가 -10<=x<=95면 참, 그 외의 수면 거짓으로 출력
#include <iostream>
using namespace std;
int main()
{
int x, y;
cout << "두 정수 입력 (음~양수) : ";
cin >> x >> y;
((x >= -10 && x <= 95) && (y >= -10 && y <= 95)) ? cout << "참" : cout << "거짓";
return 0;
}
9. x>0이거나 y가 100보다 크거나 같으면 정상 출력
#include <iostream>
using namespace std;
int main()
{
int x, y;
cout << "두 정수 입력 (음~양수) : ";
cin >> x >> y;
if(x > 0 || y >= 100) cout << "정상";
return 0;
}
10. 비트단위 연산자를 사용해 65를 2, 8, 16진수로 출력 **
#include <iostream>
using namespace std;
int n = 65;
int ten_to_two(int n);
int ten_to_eight(int n);
int ten_to_sixteen(int n);
int main()
{
// 10진수를 2,8,16진수로 변환
ten_to_two(n);
ten_to_eight(n);
ten_to_sixteen(n);
return 0;
}
int ten_to_two(int n) {
// 재귀함수
cout << "2진수 변환 결과 :";
if (n < 2) { // 0이나 1로 이진법으로 변환할 필요가 없다
cout << n;
}
else {
ten_to_two(n/2);
cout << n%2;
}
cout << '\n';
}
int ten_to_eight(int n) {
cout << "8진수 변환 결과 :";
// 비트연산???? 이따 할거
}
int ten_to_sixteen(int n) {
cout << "16진수 변환 결과 :";
}
11. 13과 9를 2진수로 표현 후 비트 단위의 곱과 합의 결과 출력 **
12. 컴퓨터에서는 RGB로 색상을 표현하고, 16비트의 경우 각각 5비트씩 할당한다.
색상값을 16진수로 입력하고, 초록색에 해당하는 부분만 AND 연산해 마스킹 후 해당 부분의 값만 추출해 출력한다.
13. 비트 이동 연산자를 사용해 16을 곱하고 4로 나누어보자
14. 0~127까지의 문자 코드 중에서 촐력이 가능한 문자 출력
15. 다음과 같은 식을 계산해보자 (x값 입력은 cin 사용, 결과는 화면에 출력)
16. 키보드에서 화씨 온도 입력 후 섭씨 온도로 변환해보자
17. 키보드에서 두 정수 입력 후 합, 차이, 곱, 나누기 구해
18. 다섯자리 정수 입력 후 각 숫자를 하나씩 구분해서 출력
흰트 > 정수 나눗셈과 나머지 연산 사용(24781-> 2 4 7 8 1)
'C, C++ > 예제로 쉽게 풀어쓴 C++' 카테고리의 다른 글
[예제로 쉽게 풀어쓴 C++] 02. 비주얼 C++와 Dev-C++ 사용하기 (0) | 2021.08.23 |
---|---|
[예제로 쉽게 풀어쓴 C++] 01. C++ 시작하기 (0) | 2021.08.18 |