C언어 기초 (C언어 벼락치기)

C언어 기초 (C언어 벼락치기)

/* */ 여러줄 주석
// 한줄주석

◇디버그 – 프로시저단위 실행(F10)

◇ #include <stdio.h> 헤더파일을 포함 스트디오-에이치

◇ int main(void) 메인함수 시작. 인트메인보이드
  {   출력타입int / 함수이름main / (입력타입void)
  }   void는 입력이 없다는 의미다.

◇ return 0;  //외부로 0값 반환

◇ printf(“문장”); 문장을 출력함
   printf(“문장”\n); \n = 줄바꿈
   print(“%d”, x); 변수값 출력

◇ int x;  변수 선언

◇ int x,y,sum;  변수 여러개 선언

◇ int x = 100, y = 200; 변수 선언과 초기화
  ※변수 선언은 위쪽에 해둔다(아니면 오류발생)

◇자료형 (32비트=4바이트!)
정수형변수  short(16비트:3만2천), int(32비트:21억), long(32비트)
실수형 (부동소수점형) float(32비트), double(64비트), long double(64비트)
문자형   char

unsigned int x;  부호없는 int형(마이너스값 없다).
   같은 32비트지만 21억이 42억으로 늘어난다

◇ 10 % 3  나머지 구하기(프로%)

※거듭제곱 연산자는 없다. 곱하기를 두 번해야함 a * a
  거듭제곱 : <math.h> pow(2.0, 3.0) 2의 3제곱
  제곱근(루트) : <math.h> sqrt(값) 값의 제곱근

◇ scanf(“%d”, &x); 변수값 입력받기
  ※&x는 x의 변수주소를 뜻한다. 택배를 받을 때 주소가 필요한 것과 같다.

  ※ scanf(“%c”, &x); 로 2번 받으면 다음 것이 동작하지 않음.
     이유는 엔터키에 의해 버퍼에 줄바꿈문자인 \n이 남았기 때문.
     %d는 괜찮지만 %c는 모든 문자를 다 받기 때문.
     이럴때는
     scanf(” %c”, &c);  //공백 문자는 입력받지 말라는 의미
     또는 사이에
     fflush(stdin); //버퍼 지우기

◇형식지정자  %d 10진 정수 printf(%d, 10);
   %f 실수  printf(%f, 3.14);
   %c 문자  printf(%c, ‘a’);
   %s 문자열  printf(%s, “hello”);

   %lf double형의 실수
   %08X 8자리의 16진수로 출력하라는 형식지정자
    printf(%08X, 3);

   %10.3f float에서 전체 10자리 중 소수는 3자리
   %e 1.2345e10 과 같이 지수부분 표현 
※형식지정자와 변수의 타입은 같아야 한다
※피연산자가 전부 정수면 정수연산(소수점 이하 버림,내림연산)
  피연산자가 하나가 실수면 실수연산

◇형변환
(1)자동 : 연산시 높은 자료형으로 통일됨
(2)명시적 형변환
 (int) (x + y)

◇관계 연산자(크기비교)
x == y
x != y 다르다
x > y
x < y
x >= y 크거나 같다
x <= y 작거나 같다

&& and
|| or
!(조건) Nor (1외의 모든값을 0으로)

※  !-3 1 음수도 참이 된다. 0이 아니면 참
    !100 1
    !0 0
 
 1 && 0 0
 1 || 0 1 하나라도 참이므로 참
 !1 0

(2 < x) && (x < 5)

◇조건 연산자
a = (x > y) ? x : y;

※절대값 계산
a = (x > 0) ? x : -x;

◇비트 연산자
& 비트and
| 비트or  하나라도 1이면 1
^ 비트XOR  두값이 다르면 1(같으면 0)
<< 좌로 이동
>> 우로 이동
~ 비트Not  물결은 반대로. 0->1, 1->0
◇실수비교하기
(fabs(x-y)) < 0.0001
※ fabs() 실수의 절대값구하는 함수

◇변수 선언

float x = 0.0;

x = 100u;  unsigned int
x = 100l;  long
x = 100ul;  unsigned long

x = 3.141592;  부동소수점의 경우 자동 double로 저장됨
x = 3.141592F;  4바이트 부동소수점에서 float형 상수 만들기

◇16진수
0x0
0x1 0x2 0x3 0x4 0x5
1 2 3 4 5

0x6 0x7 0x8 0x9 0xa
6 7 8 9 10

0xb 0xc 0xd 0xe 0xf 0x10
11 12 13 14 15 16

◇기호상수
※(1)디파인
#define EXCHANGE_RATE 1120
※통상 대문자로 함. 디파인은 세미콜론 붙이지않는다(맨위 변수선언부에 씀)

※(2)콘스트
const int EXCHANGE_RATE = 1120;
※후에 값을 변경가능, 변수선언처럼 세미콜론 붙인다(인트메인보이드 안에 쓸수있음)

◇고정소수점
◇부동소수점 : 부동은 “떠다니는” 소수점. 움직이지 않는다는게 아님! 32비트(float)에서도 값을 나타내기위해 부호(1비트) 가수 부분(23비트)과 지수부분(8비트)으로 나눠 표현

123.45  = 1.2345e2
12345.0  = 1.2345e4
0.000023  = 2.3e-5
2000000000  = 2.0e9
※부동소수점 연산엔 오차가 발생. 오차줄이려면 float보다 double을.

◇아스키코드로 변수선언
(1) char code = 65;
(2) code = ‘A’;

◇아스키코드로 계산하기
char code = ‘A’;
printf(“%d %d %d”, code, code+1, code+2); //65,66,67 출력
printf(“%c %c %c”, code, code+1, code+2); //A,B,C 출력
※따라서

◇경고음(비프음 내기)
(1) char beep = 7; printf(“%c”, beep);
(2) char beep = ‘\a’; printf(“%c”, beep);

◇이스케이프 시퀀스
\0 널문자
\a 비프음이 남
\b 백스페이스
\t 수평탭(다음 탭위치로 감)
\n 줄바꿈
\v 수직탭
\f 폼피드(프린터에서 다음 페이지로 넘길때 등)
\r 캐리지 리턴. 커서를 현재 라인의 시작위치로
\” 큰따옴표 자체
\’ 작은따옴표 자체
\\ 역슬래시 자체

◇sizeof(변수)  변수크기를 바이트로 표현

◇반올림하기
(1) round_x = (int) (x + 0.5); //원리는 0.5를 더한후 정수로 형변환
(2) round_x = (int) (x < 0 ? x – 0.5 : x + 0.5); //음수도 포함할경우

◇증감 연산자   ※대입시
a = x++; x값 대입 후 증가
b = ++x; x값 증가 후 대입

y = x = 3; 우측부터 수행

◇조건문

(1)
if (조건)
 결과;

x가 0이 아닐때 if(x != 0) ★ if(i)  i가 0이 아닐때
x가 0일때 if(x == 0) ★ if(!i) i가 0일때

(2)
if(조건)
 결과;
else if(조건)
 결과;
else
 결과;

◇다중분기문 switch

switch(number)
{
case 0:
 문장;
 break;
case 1:
 문장;
 break;
case 2:
 문장;
 break;
default:  예외를 생각한 default. 생략해도 무방하다.
 문장;
 break;
}

※break가 없으면 그 다음줄로 넘어간다

※case 뒤는 반드시 정수상수

※5개 이상일시 써보자

◇goto문

goto gameover;
   .
   .
   .
gameover:  //레이블을 붙인다
 printf(“오류발생”);

◇반복문 while 조건식이 참이면 반복실행
while (조건식)
 문장;

while(i) i가 0이 아닐때

◇반복문 do..while

do
{
 반복문장;
}
while(조건식)

※실행후 검사, 그러므로 적어도 1번은 실행된다!

◇for문(초기식; 조건식; 증감식)

for(i=0; i<10; i++)
반복문장;

반복할게 없다면 null문장도 된다.
for(i=0; i<10; i++)
; //널 문장

※ sum += i //sum에 i가 더해진다.
※ 초기식에서 2개 이상 초기화가능 for(i=0, sum=0; i<100; i++)
※ 초기식은 기타문장도 가능  for(printf(“반복시작”), i=0; i<100; i++)

◇반복문 나가기
break;

◇반복문 재시작
continue;
뒤의 과정을 생략하고 조건식으로 돌아감

◇키입력 : _kbhit() 키를 누르면 1을 반환
if(_kbhit())

◇1의 자리수구하기 : n % 10
  10의 자리수구하기 : n을 10으로 나누고 n%10
  100의 자리수구하기 : n을 100으로 나누고 n%10

◇함수만들기
void func_tion()
{
 문장;
}

※함수호출
func_tion(); //함수이름만 적으면 됨

※함수원형
만약 함수를
int calc_sum(int n)
{
문장;
}
으로 만들어뒀다면

main(void)전 맨 위에
int calc_sum(int); 라고 원형을 밝혀둬야 정확히 컴파일한다.
   함수원형 뒤에는 세미콜론을 붙인다
 함수정의를 하기 싫다면, 함수정의가 호출보다 먼저 위치하면 되지만,
 간단한 프로그램에서나 먹히는 방법이고 항상 함수원형을 사용하자.

◇헤더파일(.h)
텍스트 에디터로 파일을 편집하고 확장자만 .h로 해주면 된다.

◇라이브러리 함수◇
◇난수
stdlib.h rand()  0부터 RAND_MAX까지(32767)
  rand()%45 0~44
  1+rand()%45 1~45
※시드값(난수의 씨앗)
#include <time.h>
scrand( (unsigned)time(NULL) );     //scrand는 시드를 설정하는 함수. 현재시간으로 정하기

◇절대값
abs(int x)
fabs(double x)

◇수학
조합(순서를 고려하지 않는것) : c(n,r) = n! / (n-1)!r!
팩토리얼 : n! = n*(n-1)*(n-2)*…*1

원넓이 : 파이r제곱