C : 03 변수와 데이터 입력

SOOYEON·2022년 7월 28일
0

변수 선언 방법

정수를 넣을 공간은 int를 사용

int a;
//정수를 저장할 공간을 a라 이름 붙여 메모리에 4바이트를 할당하겠다고 컴파일러에 알려줍

컴퓨터의 메모리 공간은 재활용되며, 프로그램이 종료되면 사용하던 메모리 공간을 반납하고 새로 실행된 프로그램이 그 공간을 사용하는데 이 때 종료된 프로그램이 어떤 값을 메모리에 남겨 놓았는지 알 수 없다.

새 프로그램에서 이 값은 의미가 없으므로 이를 쓰레기 값이라 하고 이 값때문에 오류가 생길 수 있으므로 반드시 원하는 값으로 바꾸는 초기화 과정이 필요하다.


초기화 방법

a = 10;

프로그램에서는 대입 연산자라 부르며, 오른쪽 값을 왼쪽에 저장(할당)한다는 의미

변수 선언과 대입 규칙

  1. 중괄호의 블록({})안에 변수를 선언하며 선언한 위치부터 블록 끝까지 사용할 수 있습니다.

  2. 컴파일러에 따라 변수의 선언 위치가 제한될 수 있습니다.

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

int a;
int a, b, c;
  1. 대입 연산자(=)는 연산자 왼쪽의 변수에 오른쪽의 값을 저장합니다.

  2. 변수는 대입 연산자 왼쪽에서는 저장 공간이 되고, 오른쪽에서는 값이 됩니다.


#include <stdio.h>

int main(void)
{
    //1. int형 변수 a를 선언하세요.
	int a;
	//2. int형 변수 b, c를 한 줄로 선언하세요.
    int b, c;
	double da;        // double형 변수 da 선언
	char ch;          // char형 변수 ch 선언
    //3. int형 변수 a에 10을 초기화하세요.
	a = 10;
	//4. int형 변수 b에 a를 대입하세요.
    b = a;
	//5. int형 변수 c에 a + 20을 대입하세요.
    c = a + 20;
	da = 3.5;         // double형 변수 da에 실수 3.5 대입
	ch = 'A';         // char형 변수 ch에 문자 'A' 대입

	printf("변수 a의 값 : %d\n", a);
	printf("변수 b의 값 : %d\n", b);
	printf("변수 c의 값 : %d\n", c);
	printf("변수 da의 값 : %.1lf\n", da);
	printf("변수 ch의 값 : %c\n", ch);

	return 0;
}

실행 결과

변수 a의 값 : 10
변수 b의 값 : 10
변수 c의 값 : 30
변수 da의 값 : 3.5
변수 ch의 값 : A


정수 자료형

변수의 형태 = 자료형 혹은 데이터형
크게 정수형과 실수형으로 구분
같은 정수형이라도 메모리 저장 공간의 크기에 따라 char, short, int, long, long long으로 구분된다.

ex) 예를 들어 char형은 크기가 1바이트로 8비트
−2^7 ~ 2^7 −1,
결국 -128~127의 값을 저장할 수 있다.

char형은 작은 범위의 정수를 저장할 수 있지만, 그 이름에서 예상할 수 있듯이 주로 문자를 저장하는 용도로 쓰인다.
char형에는 문자, 숫자 모두 저장할 수 있지만 이 값을 문자로 출력하느냐 값으로 출력하느냐는 변환 문자가 결정한다.

char a = 'A';
printf("%d", a);
//출력값은 65
printf("%c", a);
//출력값은 A

char형 변수를 출력할 때 %c를 사용하면 변수에 저장된 값을 아스키 코드 값으로 해석하여 그 값에 해당하는 문자를 출력하고 %d를 사용하면 정수로 출력한다.


QA

#include <stdio.h>

int main(void)
{
    //1. char형 변수 ch1을 선언과 동시에 ‘A’로 초기화하세요.
	char ch1 = 'A';
	//2. char형 변수 ch2을 선언과 동시에 65로 초기화하세요.
    char ch2 = 65;

	printf("문자 %c의 아스키 코드 값 : %d\n", ch1, ch1);
	printf("아스키 코드 값이 %d인 문자 : %c\n", ch2, ch2);

	return 0;
}

여러 가지 정수형 변수

정수형 자료형에는 char, short, int, long, long long 등이 있다.
각 자료형은 저장 값의 범위가 다르지만 출력할 때는 모두 %d를 사용한다.
단, long형은 소문자 l(엘)을 붙여서 %ld로 출력하고 long long형은 2개 붙여서 %lld로 출력한다.


  1. 특별한 경우가 아니면 정수형은 int를 사용한다.
    int형은 연산의 기본 단위로 컴퓨터에서 가장 빠르게 연산된다. short형은 int형보다 크기가 작아 메모리를 적게 사용하지만, 연산 과정에서는 int형으로 변환되므로 실행 속도가 느려질 수 있다.

long long형은 크기가 8바이트이므로 int형으로 저장할 수 없는 큰 범위의 값을 저장할 수 있지만 메모리의 낭비가 큼

  1. long형은 큰 값을 저장할 때 사용한다.
    보통 컴파일러에서 int형은 4바이트이지만, int형이 2바이트로 구현된 컴파일러가 간혹 있다.
    이 때 큰 값을 저장하기 위해 long형을 사용합니다.
    자료형의 크기가 궁금하다면 sizeof연산자로 확인할 수 있다.
printf("long long형의 크기 : %d바이트\n", sizeof(long long));

QA

#include <stdio.h>

int main(void)
{
    //1. short형 변수 sh를 선언과 동시에 32767로 초기화하세요.
	short sh = 32767;
	//2. int형 변수 in를 선언과 동시에 2147483647로 초기화하세요.
    int in = 2147483647;
	//3. long형 변수 ln를 선언과 동시에 2147483647로 초기화하세요.
    long ln = 2147483647;
	//4. long long형 변수 lln를 선언과 동시에 123451234512345로 초기화하세요.
    long long lln = 123451234512345;

	printf("short형 변수 출력 : %d\n", sh);
	printf("int형 변수 출력 : %d\n", in);
	printf("long형 변수 출력 : %ld\n", ln);
	printf("long long형 변수 출력 : %lld\n", lln);   // long long형은 lld로 출력
    //printf("long long형의 크기 : %d바이트\n", sizeof(long long));
    printf("long long형의 크기 : %d바이트\n", sizeof(lln));
	return 0;
}

실행 결과

short형 변수 출력 : 32767
int형 변수 출력 : 2147483647
long형 변수 출력 : 2147483647
long long형 변수 출력 : 123451234512345

//long long형의 크기 : 8바이트 


unsigned 정수 자료형

정수형은 보통 양수와 음수를 모두 저장하지만, 양수만을 저장하면 두 배 더 넓은 범위의 값을 저장할 수 있다.

따라서 나이와 같이 음수가 없는 데이터를 저장할 때는 unsigned를 사용한다.
unsigned가 없으면 자동으로 signed로 선언된다.


unsigned 자료형을 사용할 때는 출력시 변환 문자 사용에 주의해야 합니다. unsigned 변수에 큰 양수를 저장하고 %d로 출력하면 음수로 출력될 가능성이 있으며, 음수를 저장하고 %u로 출력하면 양수가 출력된다.

그 이유는 메모리에 저장되는 형태는 같으나 printf()함수가 데이터를 해석해서 보여주는 방법이 다르기 때문


unsigned형 변수에 음수도 저장하고 출력할 수 있지만 연산하거나 대소를 비교할 때는 부호 비트를 고려하지 않고 항상 양수로 처리하므로 결과가 예상과 다를 수 있다.

따라서 unsigned 자료형은 항상 양수만 저장하고 %u로 출력하기를 권합니다.


QA

#include <stdio.h>

int main(void)
{
    //1. unsigned int형 변수를 a를 선언하세요.
	unsigned int a;
    //2. a를 4294967295로 초기화하세요.
	a = 4294967295;
	printf("%d\n", a);     // %d로 출력
	//3. a를 -1로 초기화하세요.
    a = -1;
	printf("%u\n", a);     // %u로 출력

	return 0;
}


실수 자료형

실수는 데이터를 구현하는 방법이 정수와 다르므로 별도의 자료형을 사용한다. 크기에 따라 float, double, long double로 구별하며, 값을 저장할 수 있는 범위가 다르다.

가장 작은 float도 4바이트이므로 저장 범위가 큰 편,
실수 자료형은 값의 범위보다 유효 숫자의 개수에 주목할 필요가 있다.

실습에서 다루겠지만 초깃값을 1.234567890123456789로 저장을 해도 출력값이 다르게 나오는 것을 확인할 수 있다.

그 이유는 컴퓨터에서 실수를 표현하는 방식이 오차를 갖고 있기 때문
따라서 float형은 유효 숫자 7자리, double형은 15자리의 범위 내의 값을 사용하는 것이 좋다.

유효 숫자의 개수를 계산해가며 프로그래밍하는 것이 걱정이라면 다음 두 가지 방법을 따라 사용하면 됩니다.

  1. 정수형을 기본으로 사용하고 실수형은 꼭 필요한 경우만 사용한다.

  2. 실수형은 유효 숫자가 많은 double형을 기본으로 사용합니다.

QA

#include <stdio.h>

int main(void)
{
    //1. float형 변수 ft를 선언과 동시에 1.234567890123456789로 초기화하세요.
	float ft = 1.234567890123456789 ;
	//2. double형 변수 db를 선언과 동시에 1.234567890123456789로 초기화하세요.
    double db = 1.234567890123456789 ;
    //3. “float형 변수의 값 : ft\n” 이 문장을 출력하려고 합니다. 서식문자 %f를 사용하되 소수점 이하 20자리까지만 출력하세요.
	printf("float형 변수의 값 : %.20f\n", ft);
	//4. “double형 변수의 값 : db\n” 이 문장을 출력하려고 합니다. 서식문자 %lf를 사용하되 소수점 이하 20자리까지만 출력하세요.
    printf("double형 변수의 값 : %.20lf\n", db);

	return 0;
}


문자열 저장 (1)

문자열은 char형을 배열 형태로 만들어 저장

char 배열명[문자열길이 + 1] = 문자열;
// ex 문자열 “apple”을 저장
char fruit[6] = "apple";

문자열의 길이보다 배열의 크기를 하나 더 크게 잡는 이유는 컴파일러가 문자열의 끝에 \0(널 문자)를 자동으로 추가하기 때문

※ 널 문자는 문자열의 끝을 표시하는 특별한 문자
※ 기본 자료형을 여러 개 묶어 사용하는 것을 배열이라 함

char 배열은 문자열을 저장하는 변수의 역할을 하며 %s로 출력

QA

#include <stdio.h>

int main(void)
{
    //1. 길이가 20인 char형 배열 fruit을 선언과 동시에 “strawberry”로 초기화하세요.
	char fruit[20]= "strawberry";

    //2. “딸기 : fruit\n” 이 문장을 출력하려고 합니다. 서식문자 %s를 사용해서 출력하세요.
	printf("딸기 : %s\n", fruit);

	//3. “딸기쨈 : fruit "jam"\n” 이 문장을 출력하려고 합니다. 서식문자 %s를 두 번 사용해서 출력하세요.
    char j[4] = "jam";
    printf("딸기쨈 : %s %s\n" , fruit, j);

	return 0;
}

실행 결과

딸기 : strawberry
딸기쨈 : strawberry jam


문자열 저장 (2)

배열에는 대입 연산자(=)를 사용할 수 없다.

대입 연산은 대상 자료형의 크기가 일정해야 하는데 선언에 따라 크기가 달라지는 char 배열은 대입 연산을 사용할 수 없습니다.

char배열에 새로운 문자열을 저장하는 방법

  • char배열에 초기화 이외에 문자열을 저장할 때는 strcpy함수를 사용
  • strcpy를 사용하기 위해서는 string.h헤더파일을 불러와야 한다.
#include <string.h>
// 문자열을 다룰 수 있는 string.h 헤더 파일 포함
int main(void)
{
    char a[20] = "abcdef";
    // abcdef로 초기화
    strcpy(a, "ghijkl");
    // a에 ghijkl 복사
}

QA

#include <string.h>
//1. 헤더파일 string.h를 추가하세요.


int main(void)
{
	char fruit[20] = "strawberry";   // strawberry로 초기화
	
	printf("%s\n", fruit);           // strawberry 출력
	//2. strcpy()를 사용해서 fruit에 “banana”를 저장하세요.
    strcpy(fruit, "banana");
	//3. fruit을 서식문자를 사용하고 개행을 포함해서 출력하세요.
    printf("%s\n", fruit);

	return 0;
}

실행 결과

strawberry
banana


const를 사용한 변수

변수는 저장 공간이므로 언제든지 그 값을 바꿀 수 있지만 const를 사용한 변수는 예외
const를 사용한 변수는 다음과 같은 형식으로 선언한다.

const 자료형 변수명 =;

const를 사용하면 이후에는 값을 바꿀 수 없으므로 반드시 선언과 동시에 초기화해야 한다.

초기화하지 않으면 변수의 쓰레기 값이 계속 사용되며, 만약 초기화 이후에 값을 바꾸고자 하면 컴파일 과정에서 에러가 발생한다.

QA

#include <stdio.h>

int main(void)
{
	int income = 0;                   // 소득액 초기화
	double tax;                       // 세금
	//1. const를 사용해서 double형 변수 tax_rate를 선언하고 0.12로 초기화하고 실행하세요.
    const double tax_rate = 0.12;
    //2. tax_rate를 0.15로 초기화하고 실행을 눌러 에러가 뜨는 것을 확인하세요.
    // tax_rate = 0.15
    // strcpy(tax_rate, 0.15);

	income = 456;                     // 소득액 저장
	tax = income * tax_rate;          // 세금 계산
	printf("세금은 : %.1lf입니다.\n", tax);

	return 0;
}

실행 결과

지시사항 1번 실행결과입니다.
세금은 : 54.7입니다.

지시사항 2번 실행결과입니다.
main.c: In function ‘main’:
main.c:10:14: error: assignment of read-only variable ‘tax_rate’
     tax_rate = 0.15;
              ^
/elice/runner.sh: line 2: ./main: No such file or directory

scanf 함수의 사용법

scanf() 함수는 키보드에서 입력한 값을 변수에 저장할 때 사용

  • 변수의 형태에 맞는 변환 문자를 사용하고 입력할 변수 앞에 &기호를 붙인다.
scanf("%d", &a);

예를 들어 int형 변수 a에 정수를 입력하는 방법은 다음과 같습니다. 변환 문자와 변수 사이는 콤마로 구분합니다.

scanf("%d", &a);

scanf() 함수를 사용 시 유의할 점

  • scnaf() 함수에서 변수명을 지정할 때는 &을 붙여야 한다.
  • scanf() 함수에서 사용한 변환 문자와 맞는 형태의 데이터를 입력해야 한다.
#include <stdio.h>

int main(void)
{
	int a;
    //1. scanf()를 사용해서 값을 입력받아 a에 저장하세요.
	scanf("%d", &a);
	printf("입력된 값 : %d\n", a);  // 입력한 값 출력

	return 0;
}

실행 결과

10 //10 입력
입력된 값 : 10

scanf 함수의 응용

scanf 함수는 여러 개의 변환 문자를 나열하여 한 번에 2개 이상의 변수에 값을 입력할 수 있다.

ex) int형 변수 a와 double형 변수 b에 입력

scanf("%d%lf", &a, &b);

QA

#include <stdio.h>

int main(void)
{
	int age;                               // 나이는 정수형
	double height;                         // 키는 실수형

	printf("나이와 키를 입력하세요 : ");   // 입력 안내 메시지 출력
	//1. scanf()를 사용해서 나이와 키를 입력 받아 age와 height에 저장하세요.
    scanf("%d%lf", &age, &height);
    
	printf("나이는 %d살, 키는 %.1lfcm입니다\n", age, height);   // 입력값 출력

	return 0;
}

실행 결과

나이와 키를 입력하세요 : 
>> 17, 187.5

나이는 17, 키는 187.5cm입니다

문자와 문자열의 입력

char형 변수에 문자를 입력할 때는 키보드로 입력하는 모든 문자가 대상이 된다. 즉, 스페이스(공백 문자)나 엔터(개행 문자)도 하나의 문자로 전달된다.

문자열은 char 배열에 %s 변환 문자를 사용하여 입력하는데, 문자열을 입력할 때는 배열명에 & 기호를 붙이지 않는다.

char a[20];
scanf("%s", a);

또한 스페이스나 엔터, 탭 등을 만나면 바로 전까지만 저장되므로 공백 없이 연속으로 입력해야 한다.


QA

#include <stdio.h>

int main(void)
{
    //1. char형 변수 grade와 길이가 20인 char형 배열 name을 선언하세요.
	char grade;
    char name[20];
	

	printf("학점 입력 : ");
    //2. scanf()를 사용해서 학점을 입력받아 grade에 저장하세요.
	scanf("%c", &grade);
	printf("이름 입력 : ");
	//3. scanf()를 사용해서 이름을 입력받아 name에 저장하세요.
    scanf("%s", name);
	printf("%s의 학점은 %c입니다.\n", name, grade);

	return 0;
}

실행 결과

학점 입력 : A
이름 입력 : 홍길동
홍길동의 학점은 A입니다.

0개의 댓글