1. 다른 파일의 변수를 사용하고 싶을 때는 전역변수로 선언한 후 사용할 파일에서 extern키워드로 선언한다.
2. 다른 파일의 함수를 사용하고 싶을 때에는 헤더파일에 선언 후 사용할 파일에서 #include키워드로 사용한다.
3. 전역 변수가 먼저 있었고 메모리 관리를 위해 지역 변수가 생김
4. 오늘 실습 코드
1) 헤더파일 선언 후 함수 사용, 다른 파일에 있는 변수 사용하기 예제
** storage_class.c **
#include<stdio.h>
//정적변수는 해당 파일에서만 사용 가능하다.
//static int data = 100;
//전역변수는 다른 파일에서 extern 키워드로 선언하면 사용 가능하다.
int data = 100;
//void main() {
// //function();
// printf("%d\n", data);
//}
** storage_class2.c **
#include<stdio.h>
#include"f.h"
//extern int data;
void main() {
function();
//f.h파일에 data가 선언되어 있고
//위에서 읽고 오기 때문에 data를 사용할 수 있다.
printf("%d\n", data);
}
** f.h **
extern int data;
void function() {
data = 20;
}
2) cafe 만들기(아직 주석 미완성)
** cafe.c **
#include<stdio.h>
#include<string.h>
//사용자 정의 헤더파일 추가
#include"twosomeplace.h"
//상품 최대 개수
#define CNT 100
/*전역변수*/
//상품명 배열
char arName[CNT][100] = { "", };
//가격 배열
int arPrice[CNT] = { 0, };
//추가된 상품 총 개수
int insertCnt;
//검색된 상품의 행번호
int rowNum;
void main() {
//twosomeplace.h 참고
cafe();
}
** twosomeplace.h **
#define CNT 100
/*======함수 선언부======*/
/*재사용의 목적*/
char checkDup(char[]);
void insert(char[], int);
void update(char[], int, int);
void delete();
int select(char[], int[]);
/*소스코드 간결화*/
void printInsert();
void printUpdate();
void printDelete();
void printSelect();
void selectAll();
void cafe();
/*================*/
//extern 사용시 초기값을 넣을 수 없다.
//중복 선언으로 간주된다.
extern char arName[CNT][100];
extern int arPrice[CNT];
extern int insertCnt;
extern int rowNum;
void cafe() {
char title[20] = "♨Twosome place♨";
char menu[100] = "①추가하기\n②수정하기\n③삭제하기\n④검색하기\n⑤목록보기\n⑥나가기\n";
char errMsg[20] = "다시 시도해주세요.";
int choice = 0;
while (1) {
printf("%s\n%s", title, menu);
scanf_s("%d", &choice);
if (choice == 6) { break; }
switch (choice) {
//추가
case 1:
printInsert();
break;
//수정
case 2:
printUpdate();
break;
//삭제
case 3:
printDelete();
break;
//검색
case 4:
printSelect();
break;
//목록
case 5:
selectAll();
break;
//그 외
default:
printf("%s", errMsg);
}
}
}
//중복검사
char checkDup(char temp[]) {
//외부에서 문자열을 전달받아서 arName에 있는지 없는지 검사
char check = '0';
for (int i = 0; i < insertCnt; i++) {
if (!strcmp(arName[i], temp)) {
rowNum = i;
//중복이 있다면 check는 '1'
check = '1';
break;
}
}
return check;
}
//추가
//char insert(char temp[], int price) {
void insert(char temp[], int price) {
//char isDup = checkDup(temp);
//char check = '0';
//if(!(isDup - 48)){
//외부에서 중복검사 진행 후 insert()사용!
strcpy_s(arName[insertCnt], sizeof(arName[insertCnt]), temp);
arPrice[insertCnt] = price;
//총 상품개수 1 증가
insertCnt++;
//check = '1';
//}
//return check;
}
void printInsert() {
char isDup = ' ';
char temp[100] = "";
int price = 0;
printf("상품명 : ");
scanf_s("%s", temp, sizeof(temp));
isDup = checkDup(temp);
//중복이 없다면 참
//문자 - 48 == 정수
if (!(isDup - 48)) {
printf("가격 : ");
scanf_s("%d", &price);
insert(temp, price);
}
else {
printf("중복된 상품명입니다.\n");
}
}
//수정
void update(char temp[], int price, int choice) {
//외부에서 새로운 상품명, 새로운 가격, 수정할 상품의 행번호를 전달 받는다.
strcpy_s(arName[choice], sizeof(arName[choice]), temp);
arPrice[choice] = price;
}
void printUpdate() {
char temp[100] = "";
char isDup = ' ';
int choice = 0;
int price = 0;
printf("수정하실 기존 상품명 : ");
scanf_s("%s", temp, sizeof(temp));
isDup = checkDup(temp);
//수정할 상품이 있는지(1번), 있다면 새로운 상품명이 중복되는지(2번)
//총 checkDup()를 2번 사용하기 때문에 1번 rowNum을 기억해야 한다.
//1번 rowNum이 수정할 행 번호이기 때문이다. 따라서 choice에 1번 rowNum을
//저장한다.
//만약 저장하지 않으면 2번에서 rowNum의 값이 변경될 수 있다.
choice = rowNum;
//1번
if (isDup - 48) {
printf("새로운 상품명 : ");
scanf_s("%s", temp, sizeof(temp));
isDup = checkDup(temp);
//2번
if (!(isDup - 48)) {
printf("새로운 가격 : ");
scanf_s("%d", &price);
update(temp, price, choice);
}
else {
printf("중복된 상품명입니다.\n");
}
}
else {
printf("수정하실 상품이 존재하지 않습니다.\n");
}
}
//삭제
void delete() {
for (int j = rowNum; j < insertCnt; j++) {
strcpy_s(arName[j], sizeof(arName[j]), arName[j + 1]);
arPrice[j] = arPrice[j + 1];
}
insertCnt--;
}
void printDelete() {
char temp[100] = "";
char isDup = ' ';
printf("삭제할 상품명 : ");
scanf_s("%s", temp, sizeof(temp));
isDup = checkDup(temp);
if (isDup - 48) {
delete();
}
else {
printf("삭제하실 상품이 존재하지 않습니다.\n");
}
}
//검색
int select(char temp[], int arIdx[]) {
int cnt = 0;
for (int i = 0; i < insertCnt; i++) {
//사용자가 입력한 키워드가 포함되어 있으면 모두 검색
if (strstr(arName[i], temp) != NULL) {
arIdx[cnt] = i;
cnt++;
}
}
return cnt;
}
void printSelect() {
char temp[100] = "";
int arIdx[100] = { 0, };
int cnt = 0;
printf("검색할 상품명 입력 : ");
scanf_s("%s", temp, sizeof(temp));
cnt = select(temp, arIdx);
for (int i = 0; i < cnt; i++) {
printf("%s(%d원)\n", arName[arIdx[i]], arPrice[arIdx[i]]);
}
if (cnt == 0) {
printf("검색결과 없음\n");
}
}
//목록
void selectAll() {
char temp[100] = "";
strcpy_s(temp, sizeof(temp), insertCnt == 0 ? "목록 없음" : "상품명(가격)");
printf("%s\n", temp);
for (int i = 0; i < insertCnt; i++) {
//총 상품 개수만큼 순서대로 출력
printf("%s(%d원)\n", arName[i], arPrice[i]);
}
}
'웹_프론트_백엔드 > 단과' 카테고리의 다른 글
[단과_C] 2020.03.19 (0) | 2020.03.20 |
---|---|
[단과_C] 2020.03.18 (0) | 2020.03.18 |
[단과_C] 2020.03.16 (0) | 2020.03.17 |
[단과_C] 2020.03.13 (0) | 2020.03.15 |
[단과_C] 2020.03.12 (0) | 2020.03.13 |