본문 바로가기
School Study/2021-2

[week 02] C++ 복습_2장 기본 프로그래밍

by 전전긍긍 2021. 9. 30.

20210909_C++_공부기록

 

[2장 전체적인 기본개념]

  • 변수 (Variable), 식별자(Identifier)
  • 상수(constant)
  • 데이터의 유형(자료형) 
  • 이진수와 십진수
  • 숫자 데이터 유형 (정수/실수)
  • 수 관련 연산자, 수식 계산과 연산자 우선순위
  • 수의 형 변환, 증강 대입 연산자, 증강 연산자

1. 변수

프로그램에서 사용될 값을 저장하기 위해 사용. 값을 변경할 수 있기 때문에 변수라고 한다.

 

변수 선언 : 변수의 이름과 유형을 알려준다

int radius;
//int라는 변수 타입(유형) radius라는 변수 이름

int i = 1, j = 2;
//변수 i에 1을 저장(초기화라고 함)
//선언과 동시에 초기화 가능
//연달아 같은 타입으로 초기화 가능

 

2. 식별자

식별자(Identifier) : 변수나 함수의 이름이다.

 

3. 상수

변수와 다르게 프로그램이 실행하는 동안 변경되지 않는다.

상수는 선언과 초기화가 한 문장에서 이루어져야 함. (관습상 대문자로 작성)

 

4. 데이터 유형(자료향)

 

데이터의 유형

가장 큰 틀인 정수형은 int, 실수형은 double 이다.

오늘 2장에서 다루는 것은 숫자 데이터 유형인 정수형과 실수형이다.

 

+) 

논리형 : 물음의 값이 True 와 False 두가지로 처리되는 자료형

 

5. int(정수)

정수는 내부적으로 이진수로 저장된다.

N비트를 가지고 표현할 수 있는 수 : 0 ~ 2**n-1

(최대 2**n개를 표현할 수 있는데 0부터 시작하니까 1을 빼준다.)

 

6. 이진수와 십진수

십진수는 우리가 평소에 사용하는 숫자. 0~9를 사용하여 값을 표현.

이진수는 0과 1 두 개의 숫자를 이용하여 값을 표현한다.

 

-십진수를 이진수로 변환

10진수를 각 진법의 수로 나누면서 나머지를 차례로 적는다.

 

-2진수와 8진수/16진수

 

7. int(정수)의 양수/음수 표현

8bit = 1byte 중에서 맨 앞에 1bit는 부호를 결정하는 자리(부호비트)이기 때문에

실질적으로는 7bit밖에 쓰지 못함. (정수의 양수, 음수 표현이지 int가 1byte란 소리는 아니다)

 

양수 : 0 ~ 2**(7-1)

음수 : -2**(7-1) ~ -1

 

8. double과 float (실수)

소수점을 사용하여 실수를 표현하며, doube형이 float의 두 배의 크기이기 때문에 더 정확하다.

 

-부동소수점(floating-point number)

컴퓨터는 내부적으로 지수표기법(과학적기수법)을 사용한다.

지수표기법을 정규화라고도 한다.

점 앞에 숫자(1-9)를 한 개만 놓고 나머지는 다 점 뒤로 놓은 다음에 옮겨진 만큼 10의 거듭제곱을 곱하는 것이다.

float형 : 32비트가 부호부(1), 지수부(8), 가수부(23)으로 나뉘어져 있음. 

4byte이다.

double형 : 32비트가 부호부(1), 지수부(11), 가수부(52)으로 나뉘어져 있음.

8bytefloat형보다 정밀도가 높다.

 

 

예시) 6.75를 정규화를 해라

 

6은 이진수로 0110

 

2**3 2**2 2**1 2**0 . 2**1 2**2 2**3 2**4
1 0 0 1 . 1 1 0 1
1×8 0×4 0×2 1×1 . 1×1/2 1×1/4 0×1/8 1×1/16

2진수로 나타낼 때,  2의 3제곱 / 2의 2제곱 / 2의 1제곱 / 0 / 2의 -1제곱 / 2의 -2제곱 ······ 이런식으로 됨.

0과 1이니까 십의 자리 수면 0이나 1을 두 자리수에 넣을 수 있으니까 2의 2제곱 이런식임.

0을 기준으로 오른쪽은 -1,-2 이렇게 -가 붙음.

-1제곱은 크기가 0.5 , -2제곱은 크기가 0.25 

6.75에서 .75는 -1제곱 0.5 + -2제곱의 0.25를 더한 값이니까

.75는 .11로 표현할 수 있다.

 

즉, 6.75는 110.11로 2진수 변환

정규화는 소수점 앞에 숫자 하나만 남겨놓으니까 1.1011 * 10**2 (지수표기법 : 1.1011e2)

부호에는 양수니까 0

지수부에는 2제곱이니까 2

가수부에는 1011

 

+) 이걸 다시 복원하는 과정

1. 가수부를 가져온다

2. 숫자 하나를 남기고 소수점을 붙인다.

3. 지수부 숫자를 가져와서 (10의 ?제곱) ?에 넣는다.

 

 

9. 숫자 데이터 유형 (정수/실수)

이름 같은 표현 범위 저장 공간 크기
short short int -2**15 ~ 2**15-1 (-32,768 ~ 32,767)
(int형의 절반이다. 16bit)
16bit signed
unsingned short unsingned short int 0 ~ 2**16-1 (66535) 16bit unsingned
int (정수)   -2**31 ~ 2**31-1  (int는 4byte, 즉 32bit) 32bit signed
unsingned unsingned int 0 ~ 2**32-1 (4294967295) 32bit unsigned
long long int -2**31 ~ 2**31- 1 (-2147483648 ~ 2147483647) 32bit signed
unsingned long unsingned long int 0 ~ 2**32-1(4294967295) 32bit unsigned
float (실수)   음수 범위: -3.4028235E+38 ~ -1.4E-45
양수 범위: 1.4E-45 ~ 3.4028235E+38
32bit IEEE 754
double (실수)   음수 범위: -1.7976931348623157E+308 ~ -4.9E-324
양수 범위: 4.9E-324 ~ 1.7976931348623157E+308
64bit IEEE 754
long double   음수 범위: -1.18E+4932 ~ 3.37E-4932
양수 범위: 3.37E-4932 ~ 1.18E+4932
유효숫자 길이: 19
80bit

* unsingned : 부호없음

* 정수로 커버 못하는 수는 대부분 double로 선언. int에 하면 overflow발생 확률 높음.

* 커버를 할 수 있는 컴파일러가 있고 할 수 없는 컴파일러가 있음.

 

 

10. 수 관련 연산자

여기서는 / 만 주의하면 된다.

/ 는 몫을 구한다. 

 

1 / 2 = 0 : 정수의 나눗셈

1.0 / 2.0 = 0.5  : 실수의 나눗셈

 

11. 수의 형 변환

 

- 아래의 코드처럼 암시적인 형변환이 가능하다.

int i = 34.7; //유형축소 i=34
double f = 34.7; //유형확대 f=34.7

- 정수와 실수가 연산에 섞여있다면, 정수는 실수로 자동변환됨.

3 * 4.5 // 3.0 * 4.5 로 계산됨.

- 형변환 연산자 static_cast<> 를 명시적으로 사용할 수도 있다.

cout << static_cast<int>(1.7); //1이 출력된다.
cout << static_cast<double>(1)/2; //0.5가 출력된다.
//double형에서 1이 1.0으로 바뀐다.

- 형변환에 의해 변수의 유형이 변경되지는 않는다.

double d = 4.5;
int i = static_cast<int>(d)
//i는 4, d는 4.5

 

12. 증강 대입 연산자

연산자 동일한 표현
+= i += 8 i = i + 8
-= i -= 8 i = i - 8
*= i *= 8 i = i * 8
/= i /= 8 i = i / 8
%= i %= 8 i = i % 8

 

13. 증감 연산자

연산자 이름 설명 예(i = 1로 가정)
++var 전위 증가 var의 값을 1만큼 증가 시킨 후,
문장에서 새로운 값의 var를 사용
int j = ++i;
// j는 2, i는 2
var++ 후위 증가 var의 값을 1만큼 증가 시키지만,
문장에서는 증가시키기 전의 원래 var 값을 사용
int j = i++;
// j는 1, i는 2
--var 전위 감소 var의 값을 1만큼 감소 시킨 후,
문장에서 새로운 값의 var를 사용
int j = --i;
// j는 0, i는 0
var-- 후위 감소 var의 값을 1만큼 감소 시키지만,
문장에서는 감소 시키기 전의 원래 var 값을 사용
int j = i--;
// j는 1, i는 0

 

 


[실습]

 

실습 1. 원의 면적 계산

 

//원의 면적 계산
#include <iostream>
using namespace std;

int main()
{
	int radius;
	double area;

	radius = 20;
	area = radius * radius * 3.14159;

	cout << "원의 면적은 :" << area << endl;
	return 0;
}

//원의 면적은 :1256.64

실습 2. 원의 면적 계산 + 3.14값을 상수로 저장

//위의 실습과 다르게 파이값을 상수로 설정
#include <iostream>
using namespace std;

int main()
{
	const double PI = 3.14159;
	double radius;
	cout << "반지름을 입력하세요 : ";
	cin >> radius;

	double area = radius * radius * PI;
	cout << "원의 면적은 :" << area << endl;
	return 0;
}

//반지름을 입력하세요 : 3
//원의 면적은 :28.2743

실습 3. 수 관련 연산자 (/ % 연습)

#include <iostream>
using namespace std;

int main()
{
	int seconds;
	cout << "초를 정수로 입력해주세요 ; ";
	cin >> seconds;

	int minutes = seconds / 60; //분을 구함 - 몫
	int remainingSec = seconds % 60; //남은 초를 구함 - 나머지

	cout << minutes << "분" << remainingSec << " 초 입니다. \n";
	return 0;
}

//초를 정수로 입력해주세요 ; 470
//7분50 초 입니다.

실습4. 수식 계산과 연산자 우선순위

화씨를 섭씨로 변경하는 프로그램

* celsius를 상수로 정의할 때 정수를 실수로 써야하는데 그냥 정수로 써서 

프로그램을 돌리는데 계속 0이 나왔다. 그래서 감점을 당했다. 주의해야겠다.

#include <iostream>
using namespace std;

int main()
{
	double fahrenheit;
	double celsius;
	cout << "온도를 화씨로 입력하시오:";
	cin >> fahrenheit;

	celsius = (5.0 / 9.0) * (fahrenheit - 32) ;

	cout << "화씨온도" << fahrenheit << "는" <<
		"섭씨온도로" << celsius << "입니다." << endl;

	return 0;
}

//온도를 화씨로 입력하시오:60
//화씨온도60는섭씨온도로15.5556입니다.

실습5. 증강 대입 연산자

#include <iostream>
using namespace std;

int main()
{
	int a = 10, b = 2;
	double c = 12.0;

	a += b;
	cout << "a = " << a << endl; //a=12

	a -= b;
	cout << "a = " <<  a << endl; //a=10 
	//위에서 a += b를 했기 때문에 a=12인 상태에서 계산됨.

	c /= 2 + 5 *2.0;
	cout << "c = " << c << endl; //c=1
	// /= 뒤에서 계산을 전부 한 다음에 c를 나눈다.

	return 0;
}

//a = 12 a = 10 c = 1

실습6. 증감 연산자

#include <iostream>
using namespace std;

int main()
{
	int x = 1;
	int y = 5;
	x++; //x=2
	y--; //y=4
	int z = x-- + (++y); //y=5 z=7 x=1
	cout << " x = " << x << " y = " << y << " z = " << z << endl;

	return 0;
}
// x = 1 y = 5 z = 7