혼공C 2주차

김기재·2023년 7월 16일
0

혼공C

목록 보기
2/3

기본 미션

Q1. p.81 ~ 82 (Chapter 3)

  1. 다음과 같이 변수가 선언되어 있을 때, scanf 함수의 사용법이 옳은 것을 고르세요.
char ch;
short sh;
int in;
float ft;
double db;

scanf("%d%f", &in, &float);

  1. 다음 프로그램의 빈칸에 알맞은 내용을 채워보세요.

    1) 망고
    2) 3

  2. 키보드로 문자를 입력하여 아스키 코드 값을 출력하는 프로그램을 작성하세요. 어떤 문자가 입력될지는 실행할 때 결정합니다.

#include <stdio.h>

int main(void)
{
char ch;

printf("문자 입력 : ");
scanf("%c", &ch);
printf("%c문자의 아스키 코드 값은 %d입니다.", ch, ch);

return 0;
}

Q2. p.118 ~ 119 (Chapter 4)

  1. short형과 long형의 자료형의 크기를 비교하여 크기가 큰 자료형이 무엇인지 출력하세요.
#include <stdio.h>

int main(void)
{
	int res;

	res = sizeof(short) > sizeof(long);
	printf("%s\n", (res == 1) ? "short" : "long");
	return 0;
}
  1. 야구경기장의 좌석 수가 70개고 입장객 수가 65명일 때 입장률을 출력하세요.
#include <stdio.h>

int main(void)
{
	int seats = 70;
	int audience = 65;
	double rate;

	rate = (double)audience / (double)seats * 100.0;

	printf("입장률: %.1lf\n", rate);
	return 0;
}
  1. 3.76시간은 몇 시간, 몇 분, 몇 초인지 출력하세요.
#include <stdio.h>

int main(void)
{
	int hour, min, sec;
	double time = 3.76;

	hour = (int)time;
	time -= hour;
	time *= 60.0;

	min = (int)time;
	time -= min;
	time *= 60.0;

	sec = (int)time;
	printf("3.76시간은 %d시간 %d분 %d초입니다.\n", hour, min, sec);
	return 0;
}

Q3. 도전 실전 예제 - p.120 - 체중관리 프로그램

#include <stdio.h>

int main(void)
{
	int kg;
	double cm;
	double m;
	double bmi;

	printf("몸무게(kg)와 키(cm) 입력: ");
	scanf("%d%lf", &kg, &cm);
	
	m = cm / 100.0;
	bmi = (double)kg / (m * m);

	if ((bmi >= 20.0) && (bmi < 25.0)) printf("표준입니다.\n");
	else printf("체중관리가 필요합니다.\n");

	return 0;
}

혼공 2주차

  • 변수 선언
    : 메모리에 저장 공간을 확보한 후 필요할 때마다 데이터를 꺼내 사용한다.
    이 때 저장 공간을 변수라고 지칭하여 구분한다.

    : 데이터의 종류에 맞는 자료형과 변수명을 나란히 입력한다.

int a;
double b;
char c;
  • 변수를 선언한 후 변수를 초기화 (변수에 대입연산자 '='를 통해 값을 입력하는 것) 과정이 필수적이다.
a = 10;
b = 3.5;
c = 'A';

: 컴퓨터의 메모리 공간은 여러 프로그램이 사용하는, 즉 재활용되는 공간이다. 따라서 값을 입력하여 초기화하는 과정이 없다면, 이전의 프로그램에서 사용되었던 변수의 값 (현재 실행되고 있는 프로그램의 입장에서는 쓰레기 값, garbage value)으로 인하여 오류를 발생시킬 수 있다.

  • 변수의 특성
  1. 하나의 블록({ }) 내에서 선언되며, 해당 블록 내에서만 변수의 값이 인정된다.

  2. 변수의 자료형이 같으면 동시에, 둘 이상의 변수를 선언할 수 있다.

int a;
int b, c;
int a, b, c;
  1. 컴파일러에 따라 변수의 선언 위치가 제한될 수 있다.

    : 현재 사용하는 VC++ 2019 버전 이상의 컴파일러는 실행되는 코드 중간에 변수를 선언해도 딱히 문제가 발생하지 않으나, C99 버전 이전 및 2012 VC++ 컴파일러의 경우 반드시 맨 앞에 변수를 선언해야 한다.

  2. 대입 연산자는 보통의 수식처럼 변수명의 오른쪽에 쓰이고, 대입 연산자의 오른쪽의 값을 변수에 저장한다.

  3. 변수명이 왼쪽에 쓰일 경우 (대입 연산자의 왼쪽) 저장 공간이 되며, 오른쪽에 쓰일 경우 (대입 연산자의 오른쪽) 값이 된다.

 a = 10; // 이 때의 a는 저장 공간
 c = a; // 이 때의 a는 값

  • 정수 자료형
    : 값의 종류가 정수(integer)인 변수를 선언할 때 입력해주는 자료형이다.
    : 크기가 클수록 더 많은 범위의 값을 저장할 수 있다.
    : 비트의 수에 따라 저장할 수 있는 값의 범위는 다음과 같다.

    n = 비트의 수
    : - 2 ^ n ~ 2^n - 1

char ~ 1Byte ~ %c
short ~ 2Byte ~ %d
int ~ 4Byte ~ %d

long ~ 4Byte ~ %ld
: 간혹 가다 int형이 2바이트로 구현된 컴파일러가 존재하는데, 이 때 큰 값을 저장하기 위해 long 자료형을 사용하곤 한다.

long long ~ 8Byte ~ %lld

: 우리가 사용하는 컴파일러는 프로그램에서 사용하는 모든 문자를 0~127 사이의 정수 (아스키 코드 값)로 바꾸어 처리하고, 이러한 문자의 정수값을 가장 효율적으로 저장하는 자료형은 char 형이다.


  • unsigned 정수 자료형
    : 정수형은 보통 양수와 음수를 모두 저장한다.
    : 그러나 양수만을 저장하면 음수를 저장할 때에 비해 두 배 넓은 범위의 값을 저장할 수 있다.
    : 앞의 정수 자료형 앞에 'unsigned'만 붙이면 된다.
unsigned int a;
unsigned double b;
unsigned char c;
  • %d로 출력할 경우 음수로 출력될 경우가 존재한다.
    : %d는 값의 이진수를 판단할 때 맨 앞의 '부호 비트'를 인식하기 때문이다.
  • 따라서 %u로 출력하는 편이 바람직하다.
    : %u는 값의 이진수를 판단할 때 부호 비트를 인식하지 않는다.

  • 실수 자료형
    : 값의 종류가 실수(real types)일 때 입력하는 자료형이다.
    : 정수형과 달리 '유효 숫자 (소수점 아래로 정확한 값을 표출할 수 있는 '를 고려해야 한다.

    float ~ 4byte ~ %f
    : 유효 숫자 = 7
    double ~ 8byte ~ %lf
    : 유효 숫자 = 15
    long double ~ 8byte ~ %lf
    : 유효 숫자 = 15 이상


  • 문자열
    : char 형을 배열(array)형태로 만들어 저장한다.
    : 배열에는 대입연산자를 통해 값을 저장할 수 없다.
char 배열명[문자열 길이+1] = 문자열;

: 이 때 배열의 크기를 문자열의 길이보다 하나 더 크게 잡는 이유는, 문자열의 끝을 나타내는 널 문자(null character, \0)을 자동으로 추가하기 때문이다.

  • 새로운 값을 입력하기 위해선 'strcpy' 함수를 이용한다.
    strcpy 함수는 <string.h> 라는 헤더 파일을 추가해야 한다.
#include <stdio.h>
#include <string.h>

int main(void)
{
	char fruit[20] = "banana";

	printf("%s\n", fruit);
	strcpy(fruit, "melon");
	printf("%s\n", fruit);

	return 0;
}

  • const를 사용한 변수
    : 변수는 저장 공간이므로 언제든지 그 값을 바꿀 수 있다.
    : const를 자료형 앞에 선언하게 되면 그 값을 바꿀 수 없다.
const 자료형 변수명 = 값;
  • 예약어와 식별자
    : 예약어(reserved word, key word)란 컴파일러와 사용 방법이 약속된 단어.
    : 식별자(identifier)란 필요에 따라 만들어 사용하는 단어.

    int, char 과 같은 자료형은 예약어
    a, fruit, tax 등과 같은 변수명은 식별자

  • 식별자를 사용하기 위한 규칙

    1. 알파벳 대소문자 A~Z, a~z / 숫자 0~9 / 밑줄 '_' (underline)로 만든다.
    2. 숫자로 시작할 수 없다.
    3. 대문자와 소문자는 다른 식별자로 인식한다.
    4. 예약어는 식별자로 사용할 수 없다.

  • 데이터 입력
    : 처음부터 초기화 한 값이 아닌 직접 입력받기
    : 'scanf' 함수를 이용한다.
scanf("값을 입력하고자 하는 변수 자료형의 변환문자", &변수명);

scanf("%d", &a); // int형 변수 a

scanf("%d%lf", &a, &b) // int형 변수 a와 실수형 변수 b 동시 입력
  • '&'sms 앰퍼샌드(ampersand)라고 불리며, 주소 연산자(address operator)에 해당한다.

    : 문자열의 경우, 배열명 앞에는 &를 붙이지 않는다.
    : 스페이스나 엔터, 탭 등을 입력하기 바로 전까지만 입력하는 값으로 저장된다.


  • 연산자
  1. 산술 연산자
  • 덧셈(+), 뺼셈(-), 곱셈(*), 대입(=)
  • 나누기 연산자 (/)
    : 정수끼리의 연산에는 몫을 구하고, 실수끼리의 연산은 소수점까지 구한다.
5 / 2; --> 2
5.0 / 2.0; --> 2.5
  • 나머지 연산자 (%)
    : 실수에는 나머지의 개념이 없으므로 정수 연산에만 사용한다.
5 % 2; --> 1
  1. 증감 연산자
    : 덧셈과 뺄셈의 표현 단순화
++a; // = ( a = a + 1)
--a; // = ( a = a - 1)
  • 전위 표기와 후위 표기
    : 전위 표기는 (++a)와 같이 증감 연산자가 피연산자 앞에 놓이는 표현법

    : 다른 수식과 섞여 있을 때, 먼저 피연산자의 값을 1 증가시킨 후 계산된다.

: 후위 표기는 (a++)와 같이 증감 연산자가 피연산자 뒤에 놓이는 표현법

: 다른 수식과 섞여 있을 때, 1이 증가되기 이전의 피연산자 값으로 계산이 진행된 후 끝에 피연산자의 값을 1 증가시킨다.

  1. 관계 연산자
    : 연산의 결과값은 1(참) 또는 0(거짓)이다.

    • 대소 관계 연산자 : > , <, >=, <=
    • 동등 관계 연산자 : == (같다), != (다르다)
  2. 논리 연산자
    : 참과 거짓을 판단할 때 사용된다.

    • && (and) : 두 개의 피연산자가 모두 참일 때만 참
    • || (or) : 두 개의 피연산자 중 하나만 참일 때에도 참
    • ! (not) : 피연산자를 하나 사용하며, 그 값의 참과 거짓을 뒤바꿀 때 사용
  • &&와 || 연산자는 숏 서킷 룰(short circuit rule)이 적용된다.
    : 연산의 좌항만으로 연산의 결과를 판별하는 기능.
    : 좌항의 값이 인식되어 결과가 판별된다면, 우항은 인식하지 않는다.
  • &&의 경우 연산의 좌항이 거짓이라면 우항의 값과 상관없이 거짓 출력
  • ||의 경우 연산의 좌항이 참이라면 우항의 값과 상관없이 참 출력

  • 형 변환 연산자

    (자료형)피연산자

int a  = 10;
double b = (double)a;

: 컴파일러는 컴파일 과정에서 피연산자의 자료형이 다르면 자동으로 형태를 일치시키는 자동 형 변환 과정을 진행한다.
: 자동 형 변환 과정이 진행될 경우, 일반적으로 크기가 작은 값이 다른 쪽의 크기가 큰 값으로 변환된다.
: 자동 형 변환을 통해 결과값의 자료형이 변하였더라도, 무조건 변수형의 크기에 맞게 저장되므로 예기치 못한 오류가 발생할 수 있다.

  • sizeof 연산자
    : 피연산자를 하나만 사용하며, 피연산자의 크기를 바이트 단위로 계산한다.
    : 결과값은 피연산자의 값이 아닌 피연산자의 바이트 크기가 된다.
    : 피연산자는 변수, 상수, 수식, 자료형 등이 된다.
sizeof(int) --> 4
sizeof(a) --> 4
sizeof(10.0) --> 8
  • 복합대입 연산자
    : 연산 결과를 다시 피연산자에 저장한다.
    : 연산의 결과를 다시 변수에 저장해야 할 필요가 있을 때 사용하면 편리하다.
    : 대입 연산자와 산술 연산자를 혼합한 형태.
int a = 10;
a += 1;
  • 콤마 연산자(,)
    : 한 번에 여러 개의 수식을 차례로 나열할 때 사용한다.

  • 조건 연산자
    : 유일한 삼항 연산자이다.
    : 첫 항에는 조건식을 입력하며, 해당 조건식이 참일 경우 두 번째 항의 값을, 거짓일 경우 세 번째 항의 값을 출력한다.

(조건식)?(값1):(값2);
  • 비트 연산자
    : 데이터를 비트 단위로 계산할 때 사용한다.
    : 비트 논리 연산자 (&, |, ^)와 비트 이동 연산자(>>, <<)로 구성된다.
profile
군대

0개의 댓글