웹_프론트_백엔드/단과

[단과_C] 2020.03.12

shine94 2020. 3. 13. 10:49

1. 함수
 : 이름()
   단, 키워드()는 함수가 아니다.
   예) for(), if(), ...는 함수가 아니다.

 

 

 

2. 함수의 정의
    (1)리턴타입 (2)함수명(자료형 (3)매개변수, ...) {
             (4)실행할 문장;
             (5)return 리턴값;
    }

    (1) 리턴값의 타입을 작성한다. 만약 리턴이 없으면 void를 작성한다.
    (2) 동사로 작성한다(연필(매개변수)을 쓴다(함수)).
    (3) 생략이 가능하다. 매개변수가 없으면 외부에서 값을 전달받을 수 없다.
    (4) 생략이 가능하다.
    (5) 생략이 가능하다.

 


3. 함수 정의시 주의사항
 : 선언은 함수 밖에서, 사용은 함수 안에서 한다.
   사용하는 라인보다 위에 선언되어 있어야 한다.
   위에서 아래로 읽기 때문이다.
   만약 사용하는 라인보다 밑에 선언되어 있다면 함수 선언를 위에 해준다.

 


4. 함수의 선언
   리턴타입 함수명(자료형, ...);
   
   int add(int, int);                          //선언, 생략해도 되고
   //int add(int num1, int num2);  //선언, 생략 안해도 되고
                                                 
   void main(){                               
   add(10, 4);                                 //사용
   }
   
   //정의
   int add(int num1, int num2) {
        return num1+ num2;
   }

 


5. 함수 정의 순서
문제) 두 정수의 덧셈 함수 만들기

1) 함수명을 생각한다.
    add, sum, plus, deohagi, addIntandInt, 
    ... getTotal
    add() {} 
   
2) 매개변수를 생각한다.
    add(int num1, int num2) {}

3) 실행할 문장을 생각한다.
    add(int num1, int num2) {
          printf("두 정수의 덧셈 함수입니다.\n");
    }

4) 리턴 값을 생각한다.
    add(int num1, int num2) {
          int result = num1 + num2;
          printf("두 정수의 덧셈 함수입니다.\n");
          return result;
    }

5) 리턴 타입을 결정한다.
    int add(int num1, int num2) {
          int result = num1 + num2;
          printf("두 정수의 덧셈 함수입니다.\n");
          return result;
    }

 

** 오류 방지를 위해 처음에는 void를 리턴 타입 임의로 설정하여 만들고

    최종적으로 리턴타입을 결정하면 변경하면 됨 **

 


6. 함수의 사용
    함수명(값1, ...);
    함수명();
    
    매개변수가 있다면 순서와 타입에 맞게 작성해주고,
    리턴값이 있다면 사용한 부분 통째로를 리턴값으로 보자!!

 

7. 함수는 저장공간, 기능을 담당한다

 


8. 함수의 정의는 없던 것을 만드는 것이고 함수의 선언은 있던 것을 사용하는 것이다.

 

 

9. 메인함수가 없으면 에러 발생

 

 

10. 오늘 실습코드
1) cafe.c

#include<stdio.h>
#include<string.h>
#define CNT 100
void main() {
	//Create Read Update Delete 
	//추가, 수정, 삭제, 검색, 목록
	//상품명-가격
	//twosome place
	char title[20] = "♨Twosome place♨";
	char menu[100] = "①추가하기\n②수정하기\n③삭제하기\n④검색하기\n⑤목록보기\n⑥나가기\n";
	char errMsg[20] = "다시 시도해주세요.";

	//사용자가 입력한 상품명을 임시로 저장할 공간
	char temp[100] = { "", };

	//상품명을 저장할 문자열 배열
	char arName[CNT][100] = { "", };
	//상품 가격을 저장할 정수 배열
	int arPrice[CNT] = { 0, };

	int choice = 0;
	//추가한 상품의 총 개수
	int insertCnt = 0;

	//for문 밖에서도 i를 사용해야하므로 여기에 i를 선언
	int i = 0;

	//Flag
	char check = '0';

	while (1) {
		check = '0';
		printf("%s\n%s", title, menu);
		scanf_s("%d", &choice);

		if (choice == 6) { break; }

		switch (choice) {
		//추가
		case 1:
			printf("상품명 : ");
			scanf_s("%s", temp, sizeof(temp));

			//만약 상품이 한 개도 없다면 중복검사를 할 필요가 없다.
			if (insertCnt != 0) {
				//상품이 하나라도 있다면 들어옴
				//추가된 상품개수만큼 반복
				for (i = 0; i < insertCnt; i++) {
					//사용자가 추가할 상품명과 일치하는 상품명이 존재하면 break
					if (!strcmp(arName[i], temp)) {
						break;
					}
				}
			}
			//위에서 break를 만났다는 것은 중복된 상품이 있다는 뜻!
			//따라서 i가 insertCnt까지 증가하기 위해서는 중복이 없어야 한다.
			if (i == insertCnt) {
				//중복이 없으면 들어옴
				printf("가격 : ");
				scanf_s("%d", arPrice + insertCnt);
				strcpy_s(arName[insertCnt], sizeof(arName[insertCnt]), temp);
				//추가 완료시 총 상품개수 1증가
				insertCnt++;
			}
			else {
				printf("중복된 상품명입니다.\n");
			}
			break;
		//수정
		case 2:
			printf("수정하실 기존 상품명 : ");
			scanf_s("%s", temp, sizeof(temp));
			for (i = 0; i < insertCnt; i++) {
				//수정할 상품이 존재하면 참
				if (!strcmp(arName[i], temp)) {
					printf("새로운 상품명 : ");
					scanf_s("%s", temp, sizeof(temp));
					//새로운 상품명 중복검사
					for (int j = 0; j < insertCnt; j++) {
						//새로운 상품명이 중복되면 참
						if (!strcmp(arName[j], temp)) {
							printf("중복된 상품명\n");
							check = '1';
							break;
						}
					}
					//새로운 상품명 중복이 없을 때 참
					if (!(check - 48)) {
						strcpy_s(arName[i], sizeof(arName[i]), temp);
						printf("새로운 가격 : ");
						scanf_s("%d", arPrice + i);
					}
					break;
				}
			}
			if (i == insertCnt) {
				printf("수정하실 상품이 존재하지 않습니다.\n");
			}
			break;
		//삭제
		case 3:
			printf("삭제할 상품명 : ");
			scanf_s("%s", temp, sizeof(temp));

			//총 상품개수만큼 반복
			for (i = 0; i < insertCnt; i++) {
				//삭제할 상품이 있는지 검사
				if (!strcmp(temp, arName[i])) {
					//삭제할 상품이 있다면 그 상품행에 다음 행을 덮어씌운다.
					//insertCnt번째방까지 반복한다.
					for (int j = i; j < insertCnt; j++) {
						//상품명 삭제
						strcpy_s(arName[i], sizeof(arName[i]), arName[i + 1]);
						//가격 삭제
						arPrice[i] = arPrice[i + 1];
					}
					//삭제 완료 후 총 상품 개수 1감소
					insertCnt--;
					break;
				}
			}
			//삭제할 상품이 없다면 오류 메세지 출력
			if (i == insertCnt) {
				printf("삭제하실 상품이 존재하지 않습니다.\n");
			}
			break;
		//검색
		case 4:
			printf("검색할 상품명 입력 : ");
			scanf_s("%s", temp, sizeof(temp));

			for (i = 0; i < insertCnt; i++) {
				//strstr 앞에 있는 arName[i]에서 뒤에 있는 temp를 찾는 거
				//일치하는 값이 없으면 NULL값
				//사용자가 입력한 키워드가 포함되어 있으면 모두 검색
				if(strstr(arName[i], temp) != NULL){
				//사용자가 입력한 키워드와 정확히 일치하면 검색
				//if (!strcmp(arName[i], temp)) {
					printf("%s(%d원)\n", arName[i], arPrice[i]);
					check = '1';
					//break;
				}
			}

			if (!(check - 48)) {
				printf("검색하신 상품이 존재하지 않습니다.\n");
			}
			//if (i == insertCnt) {
			//	printf("검색하신 상품이 존재하지 않습니다.\n");
			//}
			break;
		//목록
		case 5:
			//만약 총 상품개수가 0개라면 "목록 없음"이 출력되고
			//1개라도 있다면 "상품명(가격)"이 출력된다.
			strcpy_s(temp, sizeof(temp), insertCnt == 0 ? "목록 없음" : "상품명(가격)");
			printf("%s\n", temp);
			for (i = 0; i < insertCnt; i++) {
				//총 상품 개수만큼 순서대로 출력
				printf("%s(%d원)\n", arName[i], arPrice[i]);
			}
			break;
		//그 외
		default:
			printf("%s", errMsg);
		}
	}
}


2) function.c

#include<stdio.h>

//2015버전에는 선언을 안해도 자동으로 되나 하위 버전에서는 선언을 하지 않으면 에러가 발생
//왜냐하면 위에서 아래에서 코드를 읽기 때문에 선언을 하지 않으면 컴파일러는 모름!
//선언을 함으로써 밑에 정의 부분을 읽고 지나감
int f(int);

//main() : 실행프로그램을 만들어주는 기능
void main() {
	f(10);				//21 출력 안됨, 값이기 때문에 
	printf("%d\n", f(10));		//출력함수를 사용해야 값이 출력 가능
	printf("%d\n", f(10)+3);	//f(10)은 값이기 때문에 연산 가능
    
	//f(10)은 값이기 때문에 변수에도 저장 가능
	int result = f(10) + 3;
	printf("%d\n", result);

}

//함수의 정의
int f(int x) {
	printf("f함수입니다.\n");
	return 2 * x + 1;
}

'웹_프론트_백엔드 > 단과' 카테고리의 다른 글

[단과_C] 2020.03.16  (0) 2020.03.17
[단과_C] 2020.03.13  (0) 2020.03.15
[단과_C] 2020.02.27  (0) 2020.02.27
[단과_C] 2020.02.26  (0) 2020.02.27
[단과_C] 2020.02.25  (0) 2020.02.26