본문 바로가기

IT&코딩/C

C언어 1주차 복습-2

728x90
반응형

#include<stdio.h>

int main(void)
{
/*printf("\n문자열 표현 : %s\n", "안녕");
printf("문자열 표현: %s\t%s\n", "문자열", "표현방식")*/
printf("%c %c\n", 'a', 'A');
printf("%c %c\n", 97, 65);// 컴퓨터는 문자상수로 인식한다.
printf("%d %d\n", 'a', 'A');
printf("%c %c\n", "a", "A"); // 문자열로 인식 돼서 다른 값이 나온다.
printf("%c %c\n", '한', '글'); // 한글은 문자열로만 쓸 수 있어서 %s 로 사용해야 한다. 단일문자로는 쓸 수가 없다.
return 0;
}

#include<stdio.h>
int main(void)
{
printf("기본값:%d\n", 123);
printf("설정값:%5d\n", 123); // 전체 5칸을 확보합니다. 양수는 우측 끝 정렬, 음수는 좌측 끝 정렬 
printf("설정값:%05d\n", 123); // 5칸을 확보하고 남은 공간을 0으로 채운다.
printf("설정값:%-05d\n", 123); // 좌측 끝정렬을 했기 때문에 좌측에 0을 채울 공간이 없음
printf("설정값:%5d%5d\n", 123, 123);
printf("설정값:%-5d%-5d\n", 123, 123);
return 0;
}

 

1. \t 는 간격이 8칸으로 고정되어있다.
하지만 %숫자d는 내가 숫자를 입력해서 원하는 만큼 간격 조절할 수 있다.

2. 끝정렬을 내가 원하는 대로 맞출 수 있다.

3. \t는 12글자인 경우 16칸 확보 , %숫자d는 칸 확보를 무시해버려서 의미가 없어진다. 글씨나 데이터가 잘리지는 않는다.

 

#include<stdio.h>
int main(void)
{
printf("기본값: %f\n", 123.45678);
printf("설정값: %10.3f\n", 123.45678);// 앞 정수부분은 전체 칸 확보(소수점 포함, 소수점도 한 자리를 차지한다.), 뒤에 실수부분은 소수자릿수 지정(반올림 처리)
printf("설정값: %2.1f\n", 123.45678);// 칸 확보는 무시가 되지만 소수 첫째자리까지는 유지가 된다.
printf("설정값: %.2f\n", 123.45678); // 맨 아래 표시가 제일 많이 사용된다 전체 칸 확보는 신경 안 쓰고, 소수 둘째 짜리까지 확보. 
return 0;

}

 

#include<stdio.h>
int main(void)
{
printf("기본값:%s\n", "clang test");
printf("설정값:%20s\n", "clang test"); // 스무 칸 확보하고 우측 끝 정렬
printf("설정값:%5s\n", "clang test");
printf("설정값:%20.3s\n", "clang test");// 스무 칸 확보하고 3개만 출력, 실무에서 사용할 일은 없지만 최근 정보처리기사에 출제.
printf("12345678901234567890123456789012345678901234567890\n");
printf("%10s%10s\n", "대한민국", "만세");
 //python에서는 한글자가 1칸으로 인식 돼서 7부터 시작해서 밀린다.
return 0;
}

--------------------------------------------------------------------------------------------------------------------------

 <진법>

 2진수도 0b로 이제 표현 가능
 8진수는 앞에 0을 붙여서 10진수와 구분한다
 16진수는 앞에 0x (python과 표현방식 동일)

 

#include<stdio.h>
int main(void)
{
printf("%d*%d=%d\n", 4, 5, 4 * 5);
printf("%d*%d=%d\n", 7, 9, 7 * 9);

return 0;
}

 

#include<stdio.h>
int main(void)
{
printf("========================================\n");
printf("이름\t나이\t주소\n");
printf("========================================\n");
printf("홍길동\t%d\t산골짜기 %d동 %d호\n",20, 102, 205);
printf("이순신\t%d\t명량 수심 %dm\n", 28, 2000);

return 0;
}

 

#include<stdio.h>
int main(void)

{
printf("========== 출력 결과 ==========\n\n");
printf("이름 : %s\n", "홍길동"); // %s 3개를 쓰는 방법도 있다!
printf("나이 : %d\n", 20); // %s, "20" 으로 하는 방법, %c%c, '2', '0' 로 하는 방법도 있다.
printf("Tel : %03d%c%d%s%d\n", 10, '-', 1234, "-", 1234); // 다 그냥 %s로 표현하는 방법도 있고 
printf("키 : %.1f\n", 178.5); // %s 로도 가능하다. 연산할 건 아니기 때문에
printf("몸무게\t:%d\n", 75);
printf("혈액형%3c%c\n", ':', 'O'); // printf("혈액형%3c%c\n", ':', 79); //아스키코드로 79 이기 때문에 A=65 / a=97 / 0=48 

return 0;
}

--------------------------------------------------------------------------------------------------------------------------

변수와 입력함수

 

변수 : 한 가지 값으로 고정되어있지 않고 변하는 수

상수 : 하나의 값으로 고정되어있는 변하지 않는 수

 

<computer에서 변수의 의미>

우리가 작성한 코드는 메모리에 저장이 된다. 이때 메모리에 랜덤하게 공간을 할당받고 저장이 된다. (위치를 알 수가 없음)

그런데 우리가 재가공을 해야 할 데이터를 변수를 다시 가져다가 재가공을 할 수가 없다.

왜? 데이터가 저장된 위치를 알 수가 없기 때문이다.

그래서 메모리 공간에 할당되는 위치에 이름을 붙여 필요시에 저장된 값을 다시 가져다가 재가공을 해야 한다.

- 한줄요약 : 메모리 공간에 붙인 이름

 

// 창고가 있다고 하자. 탁구공, 농구공, 축구공 등... 박스에다가 이름을 붙이지 않으면 뭐가 어디에 있는지 모른다.
// 그림을 보면 담을 수 있다는 공통점이 있다. 보통 박스나 바구니, 그릇으로 비유를 많이 한다.

 

python은 managed 면서 인터프리터 언어 
c언어는 시작하자마자 변수에 공간부터 할당을 한다. 그리고 변하지 않는다.
num이란 변수의 유형을 선언하면 바꿀 수 없다. 

변수는 반드시 초기화가 되지 않으면 연산을 할 수 없다.
초기화 : 변수랑 메모리 공간에 붙인 이름, 값이 들어가 있지 않으면 연산을 할 수 없다. 
초기화는 최초의 시작값을 의미. 최초의 값을 넣어주는 것. 
모든 변수는 반드시 값이 존재해야 한다. 최초의 값을 넣어주는 것을 초기화, 또는 할당이라고 한다.

 

// 선언 : 바구니에 담을 수 있는 데이터 속성을 지정해주는 것.
#include<stdio.h>
int main(void)
{
int num = 70;
// int num;
// num=70; 과 같은 의미

}

 

#include<stdio.h>
int main(void)
{
int num; // 선언하는 순간 메모리 공간에 할당을 받아. num이라는 이름을 붙인다. 하지만 실제로 num이라는 변수는 20을 가지고 있지 않다.
// 변수는 이미 메모리 공간을 할당을 받았고 그 공간의 이름은 num이야. num이라는 변수에 이 주소번지를 저장해 놓을게 라는 의미.
// 20을 이 번지에 저장해놓을게 
// num을 출력할게 -> (ex. 112번지)에 있는 값을 출력해줘
num = 20; // 대입연산자 : 우측에 있는 피연산자를 좌측에 대입한다.
printf("%d\n", num);

return 0;
}

 

// 변수명 작명 규칙

변수명으로는 영문자, 숫자, 그리고 밑줄만을 사용한다.
변수명의 첫 문자는 반드시 영문자나 밑줄(_)이어야 한다.
C언어의 예약어(reserved word)는 변수명으로 사용할 수 없다. - 사용하면 안 된다가 올바른 표현
예를 들어 - printf를 변수이름으로 설정했을 때. printf라는 함수는 더이상 사용할 수 없다.
영어 대문자와 소문자는 서로 다른 문자로 간주된다. / Name과 name은 다른 변수다.
변수명 내에 공백을 둘 수 없다. / 컴퓨터는 변수가 하나인지 두개인지 구분을 할 수 없다. 변수와 변수를 구분할 때는 콤마로 구분해줘야 한다. 공백효과를 주고 싶으면 언더바 사용.
변수명의 길이는 보통 256자리까지 가능하다.

 

7A는 불가능 _7A 는 가능
숫자돌림을 쓰고 싶을 때 앞에 _를 붙이는 경우가 많다.

변수명의 작명 요령
1) 변수명은 그 프로그램 내에서 어떤 데이터를 저장하는지 또는 어떤 역할을 하는지 누가봐도 쉽게 연상할 수 있도록 지어주는 것이 바람직하다.
2) 한글 변수는 사용가능하다. 하지만 프로그램 작성시 가급적 한글변수 사용을 삼가하는 것이 바람직하다.

 

1.

#include<stdio.h>
int main(void)
{
int num1;
int num2;
num1 = 10;
num2 = 20;
}
 /*정석 문법*/

2.

#include<stdio.h>
int main(void)
{
int num1;
num1 = 10;
int num2;
num2 = 20;
}

// 두 번째는 정석문법이 아니다. C언어는 무조건 도입부에서 변수란 변수는 다 선언해야 한다. 
// C++ 에서 사용하는 문법
// visual studio 2017 이후 버전(컴파일러)에서는 가능하다. 

 


자료형
범위를 외우지는 말고 21억 정도만 기억해두자
Byte-> 메모리 공간에 할당할 때 차지하는 공간의 크기
정수 int 4Byte 
실수 double 8Byte
실수 float 4Byte
문자 char 1Byte

--------------------------------------------------------------------------------------------------------------------------

#include<stdio.h>
int main(void)
{
int age = 21;
double weight = 50.0, height = 163.5; // 자료형 선언 하나 쓰고 변수 여러 개 콤마로 해서 선언 가능. 단 세미콜론(;)으로 마무리를 지으면 다시 선언해야 한다.

printf("나의 나이는 %d세 입니다.\n", age);
printf("나의 몸무게는 %f(kg)입니다.\n", weight);
printf("나의 신장은 %f(cm)입니다.\n", height);

}

--------------------------------------------------------------------------------------------------------------------------

#include<stdio.h>
int main(void)
{
int num = 123;
char ch = 'D';

num = num + 1; // = 우변의 연산식의 결과를 좌변의 num 변수에 할당  123 / + / 1 각각이 메모리 공간을 할당받음. 대신 1은 위치정보가 없기 떄문에 재가공 불가능.
// 123에 1을 더해서 124가 되는 것 -> 수학적 원리 // 123이 저장되어있던 자리에 124를 갈아끼는 것 -> 프로그래밍적 개념
// 쉽게 말하면 갱신이 되는 것.
ch = 'G';
printf("num=%d\n", num);
printf("ch=%c\n", ch);

}

--------------------------------------------------------------------------------------------------------------------------

 

#include<stdio.h>
int main(void)
{
double height_inch=70; // float으로 선언하면 0.000003이라는 오차가 발생한다. 따라서 double로 선언해준다.
double height_cm = height_inch * 2.54; // 초기화에 연산식을 사용함

printf("나의 신장은%f(cm)입니다.\n", height_cm);
}

--------------------------------------------------------------------------------------------------------------------------

#include<stdio.h>
int main(void)
{
char ch = 'A';
int num = 5, ret;
ret = ch + num; // 형변환 발생
printf("ret=%d\n", ret);
}

// 서로다른 자료형이 연산하고자 할 때 메모리의 공간을 작게 차지하는 자료형이 메모리 공간에 할당을 크게 차지하는 자료형으로 강제 형변환이 발생한다.
// 문자형도 사실 4Byte 공간을 할당받는다. (문자상수) 단 1Byte를 사용해서 그런 것.

// 자료형변환 주기억장소 = RAM

 

--------------------------------------------------------------------------------------------------------------------------

<자료형 변환>

 

1. 연산식에서의 자료형 변환

- 서로 다른 자료형이 연산을 하려고 할 때 주기억 장소에 차지하는 기억 공간의 크기가 작은 자료형이 기억 공간의 크기가 큰 자료형으로 변환하는 것.

2. 대입문에 의한 자료형 변환

- 연산자 우측에 위치한 피연산자의 자료형이 연산자 좌측에 위치한 피연산자의 자료형으로 전환

3. cast 연산자에 의한 자료형 변환

- (자료형) 변수 & 상수

 


// 예제
// 실수형이라도 정수형으로 변환 가능

# include<stdio.h>
int main(void)
{
int num1;
float num2 = 367.78;

num1 = num2;
printf("num1=%d\n", num1);
}

// num2의 값은 367.78로 변하지 않는다.
// 실제 메커니즘 
// num1 할당받고 비워둠
// num2 367.78
// num1 = num2; 복사해주는데 정수만큼만 들어갈 수 있다. 소수자리는 버려버린다. 

 

 

// 강제 형변환 예제(cast연산자의 형변환)

#include<stdio.h>
int main(void)
{
int num1 = 25, num2 = 3;

printf("num1/num2=%d\n", num1 / num2); // 정수 나누기 정수의 결과는 정수 - C언어 나눗셈의 규칙
printf("num1/num2=%f\n", (float)num1 / (float)num2); // 정수와 실수의 연산 -> 실수
// cast연산자를 통해 실수형으로 계산해서 완전연산 가능, cast 연산자를 붙인 연산식에서만 유효한 일회성임.
printf("num1*num2=%d\m", num1 * num2);
}

// cast 연산자는 간헐적으로, 일회성으로 원하는 결과는 출력하고자 할 때만 사용. 그렇지 않은 경우에는 번거롭기 때문이다.

 

--------------------------------------------------------------------------------------------------------------------------
scanf()
표준 입력 장치인 키보드를 통하여 프로그램 실행에 필요한 자료를 입력 받는 것을 의미한다.

형식 : scanf("형식 지정 제어 문자열", 인수1, 인수2...);
& -> 엠퍼센트 -> 엠퍼센트를 사용하면 메모리의 주소값(번지) 반환?

 

char str[10]; [10]은 배열 -> 배열변수 메모리공간에 연속적으로 [10] :연속적으로 할당받은 개수, 얘는 &를 생략가능
str : 배열변수이면서 포인터 변수, 따로 & 기호를 사용하지 않는다.

 

//// 에러 발생 case
//#include<stdio.h>
//int main(void)
//{
// int num1, num2, sum;
//
// printf("정수 2개를 입력하세요...");
// scanf("%d%d", &num1, &num2); // 우리가 엔터를 치기 전까지 버퍼에 저장, 한번에 전송. 오버플로우 현상 발생
// sum = num1 + num2;
// printf("두 수의 합은 %d 입니다.", sum);
//}

 

<에러 발생 case>


#include<stdio.h>
int main(void)
{
int num1, num2, sum;

printf("정수 2개를 입력하세요...");
scanf("%d%d", &num1, &num2); // 우리가 엔터를 치기 전까지 버퍼에 저장, 한번에 전송. 오버플로우 현상 발생
sum = num1 + num2;
printf("두 수의 합은 %d 입니다.", sum);
}

 

// 1. 첫 번째 방법
#include<stdio.h>
int main(void)
{
int num1, num2, sum;

printf("정수 2개를 입력하세요...");
scanf_s("%d%d", &num1, &num2, sizeof(int));
sum = num1 + num2;
printf("두 수의 합은 %d 입니다.", sum);
}
// 호환성 문제로 사용되지 않습니다. 정석문법이긴 하지만

 

// 2. 두 번째 방법
#define _CRT_SECURE_NO_WARNINGS // 무조건 최상단에 위치해야 함 헤더파일 밑으로 빼버리면 적용이 되지 않는다.
#include<stdio.h>

int main(void)
{
int num1, num2, sum;

printf("정수 2개를 입력하세요...");
scanf("%d%d", &num1, &num2);
sum = num1 + num2;
printf("두 수의 합은 %d 입니다.", sum);
}

 

// 3.  세 번째 방법

#pragma warning(disable:4996) // 4996 에러를 사용하지 않겠다. 얘는 헤더파일 밑으로 들어가도 상관없이 적용된다.
#include<stdio.h>
int main(void)
{
int num1, num2, sum;

printf("정수 2개를 입력하세요...");
scanf("%d%d", &num1, &num2);
sum = num1 + num2;
printf("두 수의 합은 %d 입니다.", sum);
}

 

// 4. 네 번째 방법

#include<stdio.h>
int main(void)
{
int num1, num2, sum;

printf("정수 2개를 입력하세요...");
scanf("%d%d", &num1, &num2); // 오로지 서식지원문만 들어가야 한다. 공백 넣으면 안 된다. scanf 는 공백이나 엔터로 구분지어진다. 데이터 엔터가 실수할 확률이 낮다
sum = num1 + num2;
printf("두 수의 합은 %d 입니다.", sum);
}
 디버그 - 디버그 속성 - c/c++ / SDL 검사 예->아니오로 바꿔주면 된다.

 

--------------------------------------------------------------------------------------------------------------------------

#include<stdio.h>

int main(void)
{
char name1[30], name2[30]; // [6]으로 하면 \0(null)이라는 문자열의 끝을 알려주는 기능을 하는 게 존재. 얘는 1Byte를 차지한다. 모든 문자열은 1Byte를 먹고간다.
// 공간을 널널하게 잡아주면 된다. 어차피 null문자가 있기 때문에 컴퓨터가 공간 끝까지 확인하지는 않기 때문에(?)
printf("이름을 입력하세요!");
scanf("%s", name1);
printf("별명을 입력하세요!");
scanf("%s", name2);
printf("나의 이름은 %s입니다.\n", name1);
printf("나의 별명은 %s입니다.\n", name2);
}

728x90
반응형

'IT&코딩 > C' 카테고리의 다른 글

C언어 2주차 복습-2  (0) 2022.08.24
C언어 2주차 복습-1  (0) 2022.08.19
C언어 1주차 복습-4  (0) 2022.08.17
C언어 1주차 복습-3  (0) 2022.08.12
C언어 1주차 복습-1  (0) 2022.08.09