728x90

새로운 자료형을 정의할때 쓰인다

#include <stdio.h>

typedef int INT;
typedef int* PTR_INT;

int main()
{
	INT num1 = 120;
	PTR_INT pnum1 = &num1;

	printf("%d \n", num1);
	printf("%d \n", *pnum1);
}

자 여기선 int함수를 INT로 재정의한거임 그니까 int랑 INT랑 똑같다는거ㅇㅇ

재정의는 마음데로 할수있음 그냥 나중에 긴 코드 쓸때 쓰기 쉬우라고 간편하게 만드는거야

 

#include <stdio.h>

typedef struct person
{
	char name[20];
	char phonenum[20];
	int age;

} PERSON;

int main(void)
{
	PERSON p1 = { "김하나","010-2222-3333",23 };
	printf("이름: %s \n", p1.name);
	printf("전번: %s \n", p1.phonenum);
	printf("나이: %d \n", p1.age);
}

이렇게 struct (구조체)도 PERSON으로 간편화-

일일히 쓸때마다 struct 쓰기 커찮잖아

그냥 기존자료형을 새로운 자료형으로 만드는거지

728x90
728x90

- 여러 개의 데이터를 하나로 묶어서 사용할 수 있도록 하기 위해 만들어짐

- 객체지향 프로그램의 모체가 됨

- 기존의 자료형으로 새로운 자료형을 만듬

더보기

자료형: char, int, double..

 

배열(array) : 형(type)이 같은 데이터를 하나의 묶으으로 처리하고자 할 때 사용하는 변수

구조체(structure): 한 개의 자료가 여러 개의 데이터 형(data type)으로 구성되는 복합 데이터형이다

 

#include <stdio.h>

struct person {

	//멤버 변수 : 구조체를 구성하는 요소
	char name[20]; //20바이트
	char phoneNum[20]; //20바이트
	int age; //4바이트
};

int main() {
	struct person stu1 = { "허미유","010-0000-0000", 20 };
	printf("이름 %s\n", stu1.name);
	printf("번호 %s\n", stu1.phoneNum);
	printf("나이 %d\n", stu1.age);

	printf("-------------------\n");

}



person이라는 이름의 구조체를 만들었다. 구조체 안에는 이름과 전화번호, 나이를 나타내는 자료형들이 있다.

메인함수에서 프린트할 사람의 이름, 전번, 나이를 넣고 프린트해보았다

이거 넣을때는 {} 안에 순서대로 이름 전번 나이 넣어주면됨

 

#include <stdio.h>

struct person {

	//멤버 변수 : 구조체를 구성하는 요소
	char name[20]; //20바이트
	char phoneNum[20]; //20바이트
	int age; //4바이트
};

int main() {
	
	
	struct person stu2; //구조체를 사용할수 있도록 변수선언
	strcpy(stu2.name, "허리아");
	strcpy(stu2.phoneNum, "010-1111-1111");
	stu2.age = 14;
	printf("이름 %s\n", stu2.name);
	printf("번호 %s\n", stu2.phoneNum);
	printf("나이 %d\n", stu2.age);

	printf("-------------------\n");


}



 이런 식으로 따로따로 값을 입력받을수도 있다. 

 

나오는 모양은 똑같다 

 

#include <stdio.h>

struct person {

	//멤버 변수 : 구조체를 구성하는 요소
	char name[20]; //20바이트
	char phoneNum[20]; //20바이트
	int age; //4바이트
};

int main() {
	
	//두 사람이 한꺼번에 나오게 하는거

	int i;
	struct person stulist[2] = {
		{"정수아","010-1233-4433",18},
		{"허푸들","010-2222-3333",11}
	};

	for (i = 0; i < 2; i++) {
		printf("이름: %s, 번호: %s, 나이: %d\n",
			stulist[i].name, stulist[i].phoneNum, stulist[i].age);
	}

	printf("-------------------\n");


}



 두 사람을 한꺼번에 출력하기 위해서 for문을 쓴 모습이다.

 

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

struct person {

	//멤버 변수 : 구조체를 구성하는 요소
	char name[20]; //20바이트
	char phoneNum[20]; //20바이트
	int age; //4바이트
};

int main() {

	//for 문으로 받아서 여러개 출력하는거
	struct person stulist1[2];

	for (i = 0; i < 2; i++) {
		printf("이름, 번호, 나이 입력: \n");
		scanf("%s%s%d", stulist1[i].name, stulist1[i].phoneNum, &stulist1[i].age);
	}

	for (i = 0; i < 2; i++) {
		printf("이름: %s, 번호: %s, 나이: %d\n",
			stulist1[i].name, stulist1[i].phoneNum, stulist1[i].age);
	}


}



 이제 직접 사람정보를 입력해서 불러와보자. 똑같이 for문 사용 후 scanf를 사용했다. 

vs특성상 scanf_s를 사용했어야 했는데 이러면 두 값을 받지 못한다.

그래서 scanf를 씀. 그럼 에러가 뜨는데 이 에러를 무시하기 위해서 

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)

를 썼음. 아예 무시되서 잘 출력됨

 

결과

여기서 포인터를 사용해서 값을 바꿀수도 있다.

포인터 형태면 ->를 쓰면됨

 

#include <stdio.h>

struct person {

	//멤버 변수 : 구조체를 구성하는 요소
	char name[20]; //20바이트
	char phoneNum[20]; //20바이트
	int age; //4바이트
};

int main() {

	struct person stu1;
	strcpy(stu1.name, "허리아");
	strcpy(stu1.phoneNum, "010-1111-1111");
	stu1.age = 14;

	struct person* ptr; //구조체 포인터
	ptr = &stu1;
	ptr -> age = 25;
	printf("이름: %s\n", ptr->name);
	printf("전번: %s\n", ptr->phoneNum);
	printf("나이: %d\n", ptr->age);

}


이렇게 age를 포인터를 사용해서 25로 주입했더니 14가 25로 변하는 ㅁㅐ-직을 볼수있다

 

 

728x90
728x90
#include <stdio.h>

void swap(int x, int y);

int main() {

	int a = 100, b = 200;
	swap(a, b);
	printf("a b: %d %d\n", a, b);
}

void swap(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
	printf("x y: %d %d\n", x,y);
}

변수값 두개 위치를 바꿔주고 싶을때는 또다른 임시변수를 만들어서 두 변수중 하나의 값을 임시변수에 넣은 다음 그 변수에 남은 변수를 넣고, 임시 변수를 남은 변수에 채워주면 바꿔짐. 

 

/* 뭔가 변수 수가 늘어나면 알고리즘이 하노이 탑처럼 되지 않을까 조심스럽게 추측중 (아닐수도 있음)

이생각하니까 갑자기 하노이 탑 알고리즘 만들고싶어지네 한번 연구해 봐야겠다 */ (잡소리는 주석처리)

 

암튼 이 방법을 포인트를 써서도 할 수 있다는거지

 

#include <stdio.h>

void swap(int* x, int* y);

int main() {

	int a = 100, b = 200;

	swap(&a, &b);
	printf("a b: %d %d\n", a, b);
}

void swap(int* x, int* y)
{
	int temp = *x;
	*x = *y;
	*y = temp;
	printf("x y: %d %d\n", *x,*y);
}

 

주소값을 올려서 주소 위치로 직접 찾아가서 바꾸게 만드는거임. 

콘솔값은 똑같이 나옴

 

#include <stdio.h>

int main() {

	// 포인터 변수가 가리키는 변수에 담겨진 값의 변경을 허용하지 않는 const 선언
	int num = 20;

	const int* ptr = &num; //ptr위치에 접근해서 값을 바꿔보는
	//*ptr=30; //번경불가능
	num=40; //변경가능.

	printf("%d", num);

}

 

변수값을 못바꾼다

#include <stdio.h>

int main() {

	int num1 = 20;
	int num2 = 30;

	int* const ptr = &num1;
	//ptr = &num2; //주소 변경 불가능 에러뜸
	*ptr = 40; //변경가능

	printf("num1변수값= %d\n", num1);
	printf("num2변수값= %d\n", num2);

}

 

주소를 못바꾼다

728x90

'언어는 과-학인가요? > c언어' 카테고리의 다른 글

(c언어) typedef  (0) 2020.09.19
(c언어) 구조체(structure)  (0) 2020.09.19
(c언어) 배열과 포인터(array and pointer)  (0) 2020.09.12
(c언어) 배열과 포인터  (0) 2020.09.12
(c언어) 포인터(pointer)뜻  (0) 2020.09.12
728x90

상수 형태의 문자열을 가리키는 포인터

포인터의 주소값을 찾아가서 수정할 수 있다

 

#include <stdio.h>

int main() {

	char str[6] = { 'H','e','l','l','o','\0' }; // /0 : null 값

	//변수 형태의 문자열: 자동으로 문자 개수만큼 배열 크기가 설정됨
	char str1[] = "welcome";

	//상수 형태의 문자열: 문자가 저장되어 있는 시작위치의 주소를 str2 포인터 변수에 돌려줌
	char* str2 = "Hello"; //접근이 아니라 포인터 변수인걸 알려주기 위함 / 변수 앞에 있는건 접근하라는뜻

	printf("%s %s %s \n", str, str1, str2);

	//str1[] = "Good"; //가리키는 대상 변경 불가능
	str2 = "World"; //가리키는 대상 변경 가능
	printf("%s %s %s \n", str, str1, str2);

	str1[0] = 'X'; //문자열 변경 가능
	//str2[0] = 'X'; //문자열 변경 안됨
	printf("%s %s %s \n", str, str1, str2);

}

 

str 배열과 변수의 차이를 한번에 보여주는 코드

1. str배열엔 아무거나 넣을수 있는 것처럼 보이지만 변경이 불가능하다 (그래서 주석친 str1[]부분에서 에러남)

2. 그냥 str변수는 언제나 변경이 가능하다

 

보다시피 str1[0]의 값은 변경이 가능하다. 첫번째 배열의 값을 X로 변경해 Xelcome이 된 것을 볼 수 있다

 

자료형 뒤에 *를 붙이면 포인터 변수란걸 알려주는거임 

 

#include <stdio.h>

void showArray(int arr[], int len) {
	int i;
	for (i = 0; i < len; i++) {
		printf("%d ", arr[i]);
	}
	printf("  \n");
}

int main(){

	int arr1[3] = { 1,2,3 };
	int arr2[5] = { 4,5,6,7,8 };

	showArray(arr1, sizeof(arr1) / sizeof(int));
	showArray(arr2, sizeof(arr2) / sizeof(int));
}

728x90
728x90

배열은 포인터 개념으로 사용할 수 있다

 

int student[5] = {4,3,3,1,0}

#include <stdio.h>

int main() {
	
	int arr[3] = { 0,1,2 };

	printf("배열의 이름: [%p]\n", arr);
	printf("배열의 이름: [%p]\n", &arr);
	printf("첫 번째 요소: [%p]\n", &arr[0]);
	printf("두 번째 요소: [%p]\n", &arr[1]);
	printf("세 번째 요소: [%p]\n", &arr[2]);

	printf("-----------------------------\n");

	printf("배열의 이름: [%p]\n", arr);
	printf("첫 번째 요소: [%d]\n", arr[0]);
	printf("두 번째 요소: [%d]\n", arr[1]);
	printf("세 번째 요소: [%d]\n", arr[2]);

	printf("-----------------------------\n");

	printf("배열의 이름: [%d]\n", *arr);
	printf("첫 번째 요소: [%d]\n", *(arr + 0));
	printf("두 번째 요소: [%d]\n", *(arr + 1));
	printf("세 번째 요소: [%d]\n", *(arr + 2));
}

1. arr이름만 적어주면 배열의 첫번째 위치를 가르킨다

2. arr[n]은 *(arr + n) 으로 나타낼 수 있다 (둘이 같은거임)

3. arr은 포인트라 포인트 선언 안하고 *붙여서 바로 사용가능하다

4. arr이나 &arr[0] 이나 &arr이나 나 똑같은거다 

 

#include <stdio.h>

int main() {

	int arr1[3] = { 1,2,3 };
	double arr2[3] = { 1.1, 2.2 ,3.3 };


	printf("*arr1 배열의 이름: [%d]\n", *arr1);
	printf("*arr2 배열의 이름: [%g]\n", *arr2);

	*arr1 += 100;
	*arr2 += 120.5;
	printf("*arr1 배열의 첫 번째 요소: [%d]\n", arr1[0]);
	printf("*arr2 배열의 두 번째 요소: [%g]\n", arr2[0]);

}

arr1 배열에 값을 더해서 집어넣는 모습이다 (첫번째 배열에 값은 넣었다)

 

728x90
728x90

L value (Left value) - 이름이 있고 지속되는 값

R value (Right value) - 해당 줄에서만 존재하는 임시값

 

초기화(initialize)와 대입(assignment)

 

int a =100; (왼쪽이니까 L value)

int b = a + 200; (오른쪽 R value)

b=100;

 

포인터 pointer 

메모리의 주소값을 저장하기 위한 목적으로 선언되는 변수

 

char ch1 = 'F', ch2 = 'K';

int num = 20;

 

주소값 대신에 이름을 넣어주는것

 & : 주소연산자 //변수의 위치 알려줌

#include <stdio.h>

int main() {
	char ch1 = 'F', ch2 = 'G';
	int num = 20;

	printf("%d %c\n", ch1, ch1);
	printf("%d %c\n", ch2, ch2);
	printf("%d\n", num);
	printf("----------------------\n");

	printf("ch1 변수가 저장되어 있는 주소: [%d], [%x], [%p], [Ox%x]\n", &ch1, &ch1, &ch1, &ch1);
	printf("ch2 변수가 저장되어 있는 주소: [%d], [%x], [%p], [Ox%x]\n", &ch2, &ch2, &ch2, &ch2);
	printf("num 변수가 저장되어 있는 주소: [%d], [%x], [%p], [Ox%x]\n", &num, &num, &num, &num);



}

10진수 형태의 메모리 주소 : %d

16진수 형태의 메모리 주소 : %x

16진수 형태의 메모리 주소 (앞쪽에 0x 붙여서 표시 : 0x%d

포인터 주소 형태의 메모리 주소 (16진수 형태) : %p

 

 

* : *연산자 //포인터가 가르키는 메모리 공간에 접근할 때 사용하는 연산자

 

#include <stdio.h>

int main() {
	
	//기본자료형의 변수 선언과 초기화
	int num = 20;

	//포인터 변수 선언
	int* pnum;

	//포인터 변수에 주소값 대입시키기
	pnum = &num;

	printf("num 변수에 저장되어 있는 값 = [%d]\n", num);
	printf("num 변수의 주소값 = [%x]\n", &num);
	printf("pnum 변수에 저장되어 있는 값 = [%x]\n", pnum);
	printf("pnum 변수에 저장되어 있는 주소에 담겨있는 값 = [%d]\n", *pnum);
	printf("pnum 포인터 변수의 주소 = [%x]\n", &pnum);




}

보이다시피 pnum변수에 num변수의 주소값이 들어간 것을 볼 수 있다. 

그리고 *pnum을 사용하여 그 주소값에 어떤 값(num값) 이 저장되어 있는지 찾아가서 불러올수 있다

포인트 변수의 주소는 불러온 주소값과 다르다는걸 보여준다.

 

#include <stdio.h>

int main() {
	
	int num = 20;
	int* pnum;
	pnum = &num;
	*pnum = 30;

	printf("num 변수에 저장되어 있는 값 = [%d]\n", num);
	printf("pnum 변수에 저장되어 있는 값 = [%d]\n", *pnum);

	printf("num 변수에 저장되어 있는 주소값 = [%p]\n", &num);
	printf("pnum 포인터 변수에 저장되어 있는 주소값 = [%p]\n", pnum);

}

 다음은 num 이 포인트 변수 주소에 접근해 값으로 바꾸고 둘을 비교하는 코드이다

 

num에 저장되어있던 값 20이 30으로 바뀐 것을 볼 수 있다.

pnum의 주소값이 num의 주소값과 같아졌다는걸 볼 수 있다.

728x90
728x90

7개까지 들어가는 상자 안에 7개의 값이 들어간 배열 b가 있고 4개의 값이 들어간 배열 c가 있다.

(근데 c는 몇개들어가는지는 안정해졌음)

 

배열 b에 있는 값들을 다 더하고 싶었다. 

i는 b배열의 번째수? 이다 i가 1일땐 첫번째, 2일땐 2번째 이런식.

각각 번째수에 있는 수를 프린트하고 for문을 사용해 차례로 더했다.

 

이제 c배열의 사이즈를 알아보자 

sizeof(c)는 c의 자료형 크기를 구하는거임. 몇바이튼지 보여주는거지.

그래서 sizeof(int)로 나누면 int는 4바이트 짜리니까 자동으로 쪼개지겠지?

그럼 총 몇개가 배열에 들어갔는지 알수있는거임

 

#include <stdio.h>

int main() {

	int i;
	int x;
	int sum = 0;
	int sumc = 0;
	int b[7] = { 10,20,30,40,50,60,70 };
	int c[] = { 100,200,300,400 };

	for (i = 0; i < 7; i++) {
		printf("array [%d] has the value of = \t", i);
		printf("%d \t\n", b[i]);
		sum = sum + b[i];
	}
	printf("sum of all array : %d\n", sum);
	printf("----------------------------------\n");

	printf("size of array c: %d\n", sizeof(c));
	printf("number of array c: %d\n", sizeof(c) / sizeof(int));

}

 

 

이 아이는 이차원 배열임. int stu[a][b] 에서 a는 배열의 수(차원)을, b는 배열 안에 있는 수의 개수? 를 말하는거임(아 wording 못하겠다)

그래서 지금 for문을 돌려서 몇번째 배열의 몇번째 숫자에 뭐가 들어있나를 낱낱히 까발릴거임

일단 보면 배열은 2차원이니까 1, 2로 나눠서 출력하게 만들거야.

일단 첫번째 배열에서 첫번째부터 5번째까지 뭐가 들었는지 하나하나 까발려줌

그리고 두번째 배열한테도 똑같은짓을 하면 

 

이런식으로 출력이됨

#include <stdio.h>

int main() {


	int stu[2][5] = { {0,1,2,3,4},
					  {5,6,7,8,9} };

	int sum = 0;
	int i, j;

	for (i = 0; i < 2; i++) {
		for (j = 0; j < 5; j++) {
			printf("array [%d][%d] =\t", i, j);
			printf("%d\t\n", stu[i][j]);
			sum += stu[i][j];
		}
	}
	printf("sum of the 2-dimensional array: %d", sum);


}

 

728x90
728x90

문자형태를 아스키코드로 바꾸는거임. char 을 %d로 출력하니까 아스키코드가 나옴 

 

#include <stdio.h>

int main() {
	char ch = 'a';
	char ch1 = 'b';
	char ch2 = 'c';
	char ch3 = '가';
	char ch4 = "Good Morning!!!";

	printf("문자형태: %c\n",ch);
	printf("문자형태: %c\n",ch1);
	printf("문자형태: %c\n",ch2);
	printf("문자형태: %c\n", ch3);
	printf("아스키코드: %d\n", ch);
	printf("아스키코드: %d\n", ch1);
	printf("아스키코드: %d\n", ch2);
	printf("아스키코드: %d\n", ch3);

}

결과

728x90
728x90

일단 for문이라는건 반복문임. 즉 반복적으로 무언가를 실행시킬수 있다는거임!

기본적인 for문은

for(어디서부터, 어디까지, 얼마나) 가 다임

 

저 밑에서 i=0 에 int를 붙여준 이유는 i 가 선언이 안되있어서 선언하는거임 위에서 이미 말했으면 또 안말해도됨

그럼 저걸 해석하면 0에서부터 10보다 작을때까지, 즉 9까지 i를 하나씩 늘리란거임

그리고 i를 늘릴때마다 *를 출력하라고 적어놈

#include <stdio.h>

int main() {

	for (int i=0; i < 10; i++) {
		printf("*\n");
	}

}

그럼 이렇게 *이 10개 출력됨

 

응용해서 구구단을 만들어보자

#include <stdio.h>

int main() {
	int x, y, z, p;
	printf("how many u want to stack:");
	scanf_s("%d", &x);
	
	for (y = 1; y <= x; y++)
	{
		for (z = 1; z <= x; z++) {
			printf("%d x %d = %d", z, y, y * z);
			if (y * z < 10) {
				printf("             ");
			}
			else {
				printf("            ");
			}
	
		}

		printf("\n");


	}

}

결과

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