[C언어 기초]_23.03.09

‍전희주·2023년 3월 9일

🧡 지난 강의 리뷰

  • signed, unsigned 키워드 의미 차이 기억
    • unsigned: 양의 정수만 할당 (0~255)
  • long long int x4; 32비트 환경에서 유의미하게 사용되는 함수, __int64과 동일 기능 수행 - double형의 정밀도는 float보다 높음
    • double 8바이트, float 4바이트

🧡 자료형 변환

  • 묵시적 형 확장
  • cast 연산자를 이용한 명시적 형 확장(변환)
    • 형식: (자료형) 변수

+) 정수 자료형의 크기

  • 컴파일 수행 3단계
    • 컴파일 수행 3단계: 소스파일(원시파일) 마다 object 파일 생성해 library 결합하여 exe 실행파일 생성
      🔽

🧡 콘솔(Console) 입출력의 개념

  • 스트림(stream)
    • C에서는 스트림(Stream) 이라는 개념을 사용하여 일관된 방식으로 입출력을 수행합니다.
      스트림은 모든 입력과 출력을 바이트(byte)들의 흐름으로 생각하는 것을 말합니다.
      즉, 어떤 입출력 장치던 바이트 단위로 입출력이 이루어집니다.

+) 키보드, 터미널(모니터) -> 일반적인 콘솔을 지칭

🔽

  • 표준 입출력 스트림
    • 프로그램 동작에 필수적이고 기본적인 스트림은 프로그램 실행시에 자동으로 생성됩니다.
      이를 표준 입출력 스트림(standard input/output stream)이라고 합니다.
      🔽
  • 표준 출력 함수
  • 백슬래시 문자 상수
  • 표준 입력 함수
    🔽 getchar 수행
  • 외부장치는 버퍼를 통해 cpu에 접근 가능
    • getchar 함수 내 input으로 xabc 문자열 입력시 첫 글자 x 만 버퍼 내 저장됨
    • getchar 추가시 abc 문자열의 첫 글자 a만 버퍼내 저장되고 나머지 문자열 bc는 버려짐
    • 입력 버퍼가 empty 상태일때 입력을 기다림 (즉, 버퍼 내 데이터 값 존재하면 입력 창 뜨지 않음)
      🔽

      cf.
      // ch = getchar(), scanf("%c", &ch); 같은 기능 수행 , 차이점: scanf는 자료형의 유형을 확인
      // putchar('a');, printf("%c", 'a');
      // 많은 양의 문자열 입출력은 getchar(), putchar()함수가 성능 더 좋음. (오버헤드 적음?)
  • 라인 버퍼 사용시 주의 사항
    • 자료형 지정자는 버퍼를 먼저 검사 후 enter 나 tab의 공백을 제거

<정리>

%c ->  자료형 지정자 중, 문자를 받으므로 버퍼에 남은 엔터, 탭, 스페이스를 읽음
%*c-> 한 문자(ex. [enter])  버림
 (버리지 않으면 그 다음 행에 영향을 줄 수 있음, 버퍼를 비워야 값을 입력받을 수 있음)
" [blank] %c" 공백 지정자 -> space, tab, enter을 버린다. 

scanf2.c

//scanf2.c 

#include <stdio.h> 

int main()
{
	// 자료형 변수 선언 
	char ch;
	short int n1; //%hd
	int n2; //%d cf. %ld(long int)
	long long int n3; // 8byte //%lld (long long int)
	float fnum; // 4byte
	double dnum; // 8byte


	printf("input n1 ?"); //100 [enter] // 값을 받아오는 자료형 지정자는 입력 버퍼를 먼저 검사 후 enter 나 tab의 공백을 제거 (empty) 
	scanf("%hd%*c", &n1); // %*c는 한 문자(ex. [enter]) 공백 버림 (버리지 않으면 그 다음 행에 영향을 줄 수 있음, 버퍼를 비워야 값을 입력받을 수 있음)

	printf("input c1 ?"); //키보드(외부장치)로부터 'A'를 입력
	scanf(" %c", &ch); // " %c" 공백 지정자 -> space, tab, enter을 버린다 (문자 자료형 지정자는 space, tab, enter을 기본적으로 읽어옴) 

	printf("input n2 ?"); //200
	scanf("%d ", &n2); //"%d " 공백 지정자를 자료형 지정자 뒤에 입력할 경우 enter로 값을 받아올 수 없음 (위치 중요-> 공백 지정자 사용시 자료형 지정자 앞에 공백 부여 필)

	printf("input n3 ?"); //300
	scanf("%lld", &n3);

	printf("input fnum ?"); //1.1 
	scanf("%f", &fnum);

	printf("input dnum ?"); //5.2 
	scanf("%lf", &dnum);

	printf("\n%c, %hd, %d, %lld, %f, %lf", ch, n1, n2, n3, fnum, dnum); 

	return 0; 
}

scanf3.c

#include <stdio.h>
void func_1();
void func_2();
void func_3();

int main(void)
{
	/*func_1();*/
	/*func_2();*/
	func_3();

	return 0 ;
}

void func_1()
{
    int first, second;
	
	printf("두 수를 입력하세요 ? "); // 100 200 [enter] 
	scanf_s("%d%d", &first, &second);

	printf("first : %d, second : %d \n", first, second);
}

void func_2()
{
     int first, second;
	 char op=0;
	 
	 printf("전화번호를 입력하세요 ? "); // 3429-5114 [enter]  3429 5114 일 경우 공백 문자 
	 scanf_s("%d%*c%d", &first, &second); // %*c 
	 //scanf_s("%d%c%d", &first, &op, &second);

	 printf("first : %d, second : %d \n", first, second);
	 printf("op: %d, %c \n", op, op); 
}

void func_3()
{
     int first, second;
	 
	 printf("5자리이상 숫자를 입력하세요 ? "); //123456789 [enter] 
	 scanf_s("%3d%d", &first, &second);
	 
	 printf("first : %d, second : %d \n", first, second);
}

getchar1.c

//getchar1.c

# include <stdio.h>

int main()
{
	char c1, c2; // 1바이트 

	printf("input c1 ? "); // 콘솔창 Xabc 입력시 첫 글자 X만 반환  
	c1 = getchar();
	printf("c1 : %c \n", c1); 

	//getchar();
	while (getchar() != '\n'); //enter일때 까지 한문자씩 읽는다 

	printf("input c2 ? "); 
	c2 = getchar(); 
	printf("c2: %c \n", c2); 

	return 0; 

}

// ch = getchar(), scanf("%c", &ch); 같은 기능 수행 , 차이점: scanf는 자료형의 유형을 확인 
// putchar('a');, printf("%c", 'a'); 
// 많은 양의 문자열 입출력은 getchar(), putchar()함수가 성능 더 좋음. (오버헤드 적음?) 

operator1.c

//operator1.c

#include <stdio.h>


int main()
{
	int x = 10, y = 3, r = 5;
	const float pi = 3.14159F;
	
	
	//산술연산 
	printf("-x : %d \n\n", -x);

	//식 우선순위 변경 
	printf("3+4/3*4=%d \n", 3 + 4 / 3 * 4);
	printf("(3+4) / 3*4 = %d \n\n", (3 + 4) / 3 * 4);

	//수학에 나오는 수식 
	printf("(x+y+x)/3 =%d \n", (x + y + x) / 3);
	printf("3*x*x+4*x+5=%d\n", 3 * x * x + 4 * x + 5);
	printf("2 * pi*r = %f\n", 2 * pi * r);
	printf("pi*r*r=%f\n", pi * r * r); 

	return 0; 
}

operator2.c

// operator2.c
// 증감 연산자 
#include <stdio.h>

int main()
{   
	int x=100, y=200;

	printf("x: %d \n", x);
	++x; // 수식 단독으로 사용시 x++과 동일 기능 
	printf("x: %d \n", x);
	x--;
	printf("x: %d \n", x);

	printf("x:%d, y:%d \n", ++x, y++); // 전위형과 후위형의 차이 기억 
	printf("x:%d, y:%d \n", x, y);
	printf("x:%d, y:%d \n", --x, y--); // 전위형과 후위형의 차이 기억 
	printf("x:%d, y:%d \n", x, y);
	return 0; 
}

operator3.c

// operator3.c
// 관계연산자와 논리연산자 

#include <stdio.h>

int main()
{
	int x = 80, y = 200; 

// 관계연산자: 두 값을 비교하여 참(1)이나 거짓(0)을 반환.
	printf("%d \n", x < y);
	printf("%d \n", x >= y);
	printf("%d \n", x == y);
	printf("%d \n", x != y); 

//논리연산자: 두 논리값을 비교하여 새로운 참(1)이나 거짓(0)을 반환
//  &&(and), ||(or), !(not)
// 비교할 대상이 여러개일 때 주로 사용 
	printf("%d \n", x <= 100 && y <= 100); //관계가 논리연산보다 우선 순위 
	printf("%d \n", x <= 100 || y <= 100); //하나만 참이면 참임. 
	x = 0; 
	printf("!x:%d, !y:%d \n", !x, !y); 

	return 0; 

}

operator4.c

//operator4.c

#include <stdio.h>

int main()
{
	int x;

	/*printf("성별 ? (0:남, 1:여)");
	scanf("%d", &x);*/


	//제어문 -> 구문안에 포함되지 않음. cf) 3항 연산자의 경우 구문 안에 포함 가능
	//printf("%s \n", x == 0 ? "남성" : "여성"); // 3항 연산자 형식: [형식: 조건식? 식1:식2] ->다른 구문 내 입력 가능 
	
	/*printf("%s \n", x == 0 ? "남성" : x == 1 ? "여성" : "입력 오류!!!!"); */

	int n1 = 100, n2 = 200, sum = 0;

	sum +=  n1; //sum = sum + n1
	sum += n2; //sum = sum + n2 
	printf("sum: %d \n", sum); // ++x 표기 = x=x+1 표기
	return 0;
}

printf1.c

#include <stdio.h>

int main(void)
{
    printf("%d %c",555, 9); // 탭키 기능을 아스키 문자 표현을 통해 사용 
    printf("%d %c%c", 555, 10, 13); // 탭키 기능을 아스키 문자 표현을 통해 사용 , LF + CR = \n 
    printf("/%d/ \n",555);
    printf("/%10d/ \n",555); // 오른쪽 정렬 
    printf("/%-10d/ \n",555); // 왼쪽 정렬 
    printf("/%010d/ \n",555); 
    printf("/%.10d/ \n\n", 555);  

    printf("/%f/ \n",8192.1978);
    printf("/%13f/ \n",8192.1978);
    printf("/%13.2f/ \n",8192.1978); // f는 기본적으로 소숫점 이하 6자리까지 출력, '.0f' 는 출력x  
    printf("/%-13.2f/ \n\n",8192.1978);

    printf("%c %d %c %d \n",'A','A',97,97);
    printf("%s \n", "C Language...");
    printf("%5s\n", "C Language..."); // 5는 문자열 길이를 의미 
    printf("%.5s \n\n", "C Language...");

    printf("%d %o %x \n",67,67,67); // 67 -> 10진수 데이터를 의미 , '%o'-> 8진수 변환 , '%x' -> 16진수 변환 
    printf("%d %#o %#x \n",067,067,067); // 067-> 8진수 데이터를 의미 
    printf("%d %#o %#x \n",0x67,0x67,0x67); //0x67-> 16진수 데이터를 의미  

	 return 0 ;
}

4_8.c

//4_8.c

# include <stdio.h>
# include <ctype.h> 

int main()
{
	char celsius;
	int tmp, out; 

	printf("화씨이면 F, 섭씨이면 C 입력");
	scanf("%c", &celsius); 
	celsius = toupper(celsius);

	printf("%s 온도 ?", celsius == 'F' ? "화씨" : "섭씨"); 
	scanf("%d", &tmp); 

	// 화씨, 섭씨 구분하여 온도 계산
	out = (celsius == 'F' ? (tmp - 32) / 1.8 : (tmp * 1.8) + 32); 

	// 섭씨, 화씨 구분하여 출력 
	printf("\n%s를 %s로 변환 : %d \n",
		celsius == 'F' ? "화씨" : "섭씨",
		celsius == 'F' ? "섭씨" : "화씨", out); 


	return 0; 
}
profile
heejoojeon@daou.co.kr

0개의 댓글