728x90

time 함수

time(), localtime()을 사용하기 위해선 <time.h>이라는 헤더파일을 추가해야한다.

 

time_t자료형은 unsigned int, unsigned long형으로 재정의 되어 있다

 

  1. time()함수로 얻어 온 값을 time_t형 변수에 저장한다
  2. 경과 시간을 지정할 영역을 지정하지만 보통은 NULL사용
  3. 그리니치 표준시로 1970년 1월 1일 자정부터 현재까지의 경과 시간을 초 단위로 계산한다
#include <stdio.h>
#include <time.h>

int main()
{
	time_t t;
	t = time(NULL);
	printf("1970년 1월 1일 자정부터 흘러온 시간 : %u초 \n", t);

	return;
}

1970년 1월 1일 자정부터 현재까지 흘러온 시간을 알 수 있다

 

local time 함수

localtime 함수로 얻어온 현재 시간 정보는 time.h에 미리 준비되어 있는 tm_구조체 변수에 저장된다

localtime함수에선 그 포인터만 반환함

#include <stdio.h>
#include <time.h>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)

int main()
{
	time_t t;
	struct tm* today;
	t = time(NULL);
	today = localtime(&t);

	int year, month, day;
	year = today->tm_year + 1900;
	month = today->tm_mon + 1;
	day = today->tm_mday;

	printf("오늘은 %d년 %d월 %d일 \n", year, month, day);
	printf("오늘은 %d일째 되는 날\n ", today->tm_yday);
	printf("현재시간 %d시 %d분 %d초 ", today->tm_hour, today->tm_min, today->tm_sec);
	 
	return;
}

 

난수 불러오기

srand()랑 rand()함수를 쓰기위해 stdlib.h 헤더파일 추가

 

- 정해진 난수표에서 순타적으로 수치를 가져온다

- 난수표는 os에 따라 수치의 순서가 다르게 짜여져 있다

- RAND_MAX 수피는 0~32767이다

 

#include <stdio.h>
#include <time.h>
#include <stdlib.h>


int main()
{
	printf("난수의 범위: 0부터 %d까지 \n", RAND_MAX);
	int num1 = rand();
	printf("숫자: %d\n", num1);

	//1에서부터 100사이의 난수 
	//컴퓨터가 제시하는 임의의수 나머지 연산 % 으로 처리
	//임의의 값 %6 => 나머지 계산후 +1
	int num2 = rand() % 100 + 1;
	printf("number:%d\n", num2);

	return;
}

이렇게 하면 RAND_MAX가 32767이기 때문에 0에서 부터 32767까지 숫자중 아무 숫자나 내보낸다. 

(컴터마다 고유의 난수가 있어서 바뀌진 않음)

num2는 %를 사용해서 1에서부터 100까지중 아무 수나 뽑아내라고 만들었는데 68이 나온걸 볼 수 있음.

 

그럼 아무 숫자나 5번 뽑아보자

#include <stdio.h>
#include <time.h>
#include <stdlib.h>


int main()
{
	int i;
	for (i = 0; i < 5; i++)
	{
		printf("random number: %d\n", rand());
	}
}

이렇게 for문을 써서 5개를 뽑으면 이렇게 랜덤한 수가 5개 나오긴 하는데 이 또한 컴터에 저장된 고유값이라 아무리 실행해도 똑같은 값이 계속 출력되는거임...

 

그래서 뭔가 유용하게 쓰려면 실행할때마다 값이 맨날 랜덤으로 바껴야 좋겠지? 

그래서 srand 를 쓰는거임

 

srand((int)time(NULL)); 이렇게 시간을 이용해서 렌덤으로 호출하게 만들거임. 

이때 시간을 seed(시드)값이라 하는데 이걸 심어서 난수를 만드는거임

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int rolldie();

int main()
{
	srand((int)time(NULL));

	int die1 = rolldie();
	int die2 = rolldie();

	printf("die : %d, %d", die1, die2);
	return; 

}

int rolldie()
{
	return rand() % 6 + 1;
}

이렇게 하면 매번 실행할때마다 1에서 6사이의 다른 값 두개가 출력됨 

 

이렇게

이거로 게임을 만들어볼거임

 

Up down game

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>

int random();

int main()
{
	srand((int)time(NULL));

	int num = random();//1에서 100까지의 렌덤한 숫자를 num에 저장
	int get = 0;
	int chance = 5;

	printf("what will be the number?:");

	while (chance > 0) {

		scanf_s("%d", &get);
		printf("chance left: %d\n", chance--);

		if (get > num) {
			printf("down\n");
		}
		else if (get < num) {
			printf("up\n");
		}
		else if (get = num) {
			printf("U got it!\n"); 
			break;
		}
		else
		{
			printf("error\n");
		}

		if (chance == 0)
		{
			printf("u use up all ur chances\n");
			break;
		}

		printf("try again:");

	}
	
}

int random()
{
	return rand() % 50 + 1;
}

2트클
5트클

1부터 50까지의 숫자 사이에 하나의 렌덤한 수를 num에 저장시킴.

num에 들어있는 숫자가 뭘까 맞추면 됨

이때 chance가 5번 주어지는데 이 chance안에 수를 맞춰야 함 

어떤 값을 넣으면 그 값이 num보다 작은지 큰지 if문을 써서 알려주는거임

728x90
728x90

대충 인수값이 없으면 void 있으면 int 씀 

 

#include <stdio.h>

/*void star() {
	printf("*************************\n");
	return;
}
void line() {
	printf("------------------\n");
}
*/
int addNum(int a, int b) {
	return a + b;
}

void star2(int type) {
	if (type == 1) {
		printf("*****************\n");
	}
	else if (type == 2) {
		printf("-----------------\n");
	}
	else {
		printf("그럼뭐임");
	}
}
 
int main() {
	printf("안녕하세요\n");

	for (int i = 0; i < 3; i++) {
		star2(1);
		star2(2);
	}
	int a;
	int b;
	int c;
	printf("함수\n");
	printf("숫자 2개 입력\n");
	printf("a=");
	scanf_s("%d", &a);
	printf("b=");
	scanf_s("%d", &b);

	c= addNum(a, b);
	printf("a+b= %d\n",c);
	star2(2);
}

 

 

 

대충 수를 받으면 돌려주는 코드

 

#include <stdio.h>

int star(int type) {
	printf("main에서 전달받은 값은 %d임\n", type);

	if (type >= 4) {
		printf("이거 안됨");
		exit(1);
	}
	else if (type == 1) {
		return type;
	}
	else if (type == 2) {
		return type;
	}
	else {
		printf("choose either 1 or 2");
		return type;
	}
}

int main() {

	int num;
	printf("type to print:");
	scanf_s("%d", &num);
	int c;
	c = star(num);
	printf("%d",c);
}

 

1. 숫자를 스켄해서 num에 넣음

2. star라는 함수에 들어감 키라키라도키도키

3. num이 4보다 같거나 크면 나가지고 1이면 1 돌려주고 2면 2돌려주고 3이면 1이나 2중에 고르라는 말을 내보낼거임

4. 결과가 c에 들어감

5. c를 프린트함

 

계산을 해주는 함수를 만들어보자

 

극한의 비효율 코드의 예시

나도 이거 쓰면서 처음 코드에서 조금 바꾼건데 그게 비효율적이였던거임

근데 이미 많이 써놔서 그걸 바꿀바에야 딴걸 바꾸겠다 해서 이래적었는데

코드상으로는 극한의 비효율인거임 나도 쓰면서 아차싶었음ㅋㅋ 위에서 다 프린트 하고 밑에선 호출만 하면 될것을..

나누기할때 double인 이유는 값이 float로 나와서 int쓰면 안나옴ㅋㅋ

 

#include <stdio.h>


int add(int a, int b) {
	return a + b;
}
int sub(int a, int b) {
	return a - b;
}
double div(double a, double b) {
	return a / b;
}
int mult(int a, int b) {
	return a * b;
}



int main() {

	int a,b,c,d,e;
	double f;

	printf("함수\n");
	printf("숫자 2개 입력\n");
	printf("a=");
	scanf_s("%d", &a);
	printf("b=");
	scanf_s("%d", &b);

	c = add(a, b);
	printf("a+b= %d\n", c);
	d = sub(a, b);
	printf("a-b= %d\n", d);
	e = mult(a, b);
	printf("a*b= %d\n", e);
	f = div(a, b);
	printf("a/b= %lf\n", f);


}

 

결과

 

조금은 더 효율적인..코드

 

#include <stdio.h>


int add(int a, int b) {
	printf("a+b= %d\n", a+b); 
	return;
}
int sub(int a, int b) {
	printf("a-b= %d\n", a-b);
	return;
}
double div(double a, double b) {
	printf("a/b= %fl\n", a/b);
	return;
}
int mult(int a, int b) {
	printf("a*b= %d\n", a*b);
	return;
}



int main() {

	int a, b;

	printf("함수\n");
	printf("숫자 2개 입력\n");
	printf("a=");
	scanf_s("%d", &a);
	printf("b=");
	scanf_s("%d", &b);

	add(a, b);
	sub(a, b);
	div(a, b);
	mult(a, b);



}

 

 

지역변수가 뭐냐 (local variable)

함수 내에만 존재하고 접근이 가능함

중괄호 내에 선언됨

지역 내에서만 유효함

해당 지역을 벗어나면 소멸됨

지역이 다르면 이름이 같아도 됨

 

전역변수가 뭐냐 (global variable)

전역한 변수임

중괄호 내에 선언안됨

프로그램 어디서든 접근가능

종료할때까지 존재

초기화 안하면 0값

전역이랑 지역이랑 겹치면 지역이 먼저임

 

정적 지역 변수가 뭐냐 (static local variable)

static 이 붙어있으면 값이 고정되어서 사용됨

선언됨 함수 내에서만 접근가능

 

#include <stdio.h>

int a, b;//전역변수

int main() {
	
	printf("입력:");
	scanf_s("%d%d", &a, &b);
	printf("결과 %d",add(a,b));
}

int add() {
	static int a = 10;
	return a + b;
}

a값을 입력 받아도 이미 10이 정적지역변수에 들어가있어서 계산은 10으로됨. 

즉 20이랑 5가 스켄되더라도 10이랑 5로 계산되는거임

 

초를 시간으로 바꾸는걸 짜보자

#include <stdio.h>

const int H = 60 * 60;
const int M = 60;

void StoHMS(int sec);

int main(void) {
	int sec;

	printf("초:");
	scanf_s("%d", &sec);
	StoHMS(sec);

	return 0;
}

void StoHMS(int sec) {
	int h, m, s;

	h = sec / H;
	sec = sec % H;

	m = sec / M;
	sec = sec % M;

	s = sec;
	printf("[%d 시간],[%d 분],[%d 초]\n", h, m, s);
}

 

const int 는 선언할때 말고는 값을 더 못넣어서 특정한 값 하나를 지정해서 계속 쓰고 싶을때 쓰면 되는거임. 

 

자 일단 1시간은 1초의 60*60배니까 저렇게 선언해놓고

M는 1초의 60배니까 저래 해 놨음

 

메인함수에는 함수만 호출하도록 할거임. 

자 그럼 Second 를 M이랑 H로 바꾸는 함수를 만들어보자. 일단 sec를 H로 나누면 몇시간이 나오는지 보여주겠지?

그리고 남는 s값(나머지)를 sec에 다시 넣는거임. 이제 그 나머지로는 더이상 H가 안나오니까

나누기 M(60)해서 몇분인지를 구하는거임

그리고 또 남는값을 구해서 분으로도 못만드는 나머지들을 구해서 그걸 sec에 넣고 출력하면 되는거야 (사실 그래보면 s라는 변수선언 안해도 되긴 해 그냥 sec 프린트 하면 되지)

 

그래서 나온 값을 프린트하면 몇시간 몇분 몇초인지 나온답니다-

 

#include <stdio.h>

const int H = 60 * 60;
const int M = 60;

void StoHMS(int sec);

int main(void) {
	int sec;

	printf("초:");
	scanf_s("%d", &sec);
	StoHMS(sec);

	return 0;
}

void StoHMS(int sec) {
	int h, m;

	h = sec / H;
	sec = sec % H;

	m = sec / M;
	sec = sec % M;

	printf("[%d 시간],[%d 분],[%d 초]\n", h, m, sec);
}

극한의 효율충...?

사실 저거 함수 배울려고 하는거라 코드 자체가 비효율적임 아ㅋㅋ

728x90

+ Recent posts