2-1, 2-2 수정

do·2022년 3월 13일
0

API

목록 보기
7/42

2-1 주소록

  1. 출력이 아니라 애초에 저장할때 크기 제한하기
  2. 외계문자 출력 안되게 수정하기
  3. 동적할당 빼기
#include <stdio.h>
#include <string.h>

enum { MAX_INFO_NUM=5 };

typedef struct {
	char name[13];
	char phone[14];
	char address[151];
} Info;
 
void SetInfo(Info* info)
{
	char temp[50];
 	int j=0;
 	
    printf("이름: ");
 	getchar();
 	fflush(stdin);
 	gets(temp);
 	for (int i=0; i<sizeof(temp); i++)
		if (temp[i]!=' '){
 			temp[j] = temp[i];
 			j++;
 		}
	snprintf(info->name, 13, "%s", temp);
 	j=0;

	printf("전화번호: ");
	fflush(stdin);
	gets(temp);
	snprintf(info->phone, 14, "%s", temp);

	printf("주소: ");
	fflush(stdin);
	gets(temp);
	for (int i=0; i<sizeof(temp)-1; i++)
		if (temp[i]==' ' && temp[i+1]==' ')
			continue;
		else{
			temp[j] = temp[i];
			j++;
		}
	snprintf(info->address, 151, "%s", temp);
}

void GetInfo(Info* info)
{
	puts("-------------------------");
	printf("         ");
	puts(info->name);
	puts("-------------------------");
	printf("전화번호: ");
	puts(info->phone);
	printf("주    소: ");
	puts(info->address);
	puts("-------------------------");
}

int Menu()
{
	int select;
	do {
		puts("1) 주소 입력");
		puts("2) 주소 출력");
		puts("3) 종료");
		printf("select num: ");
		scanf("%d", &select);
	} while(select!=1 && select!=2 && select!=3);
	return select;
}

int main()
{
	Info person[MAX_INFO_NUM];
	int count = 0;

	while (1){
		switch(Menu())
		{
			case 1:
				{
					if (count==5)
						puts("주소를 더이상 등록할 수 없습니다.");
					else{
						count++;
						SetInfo(&person[count-1]);
					}
				}
				break;
 			case 2:
 				{
 					if (!count)
						puts("등록된 주소가 없습니다.");
 					for (int i=0; i<count; i++)
 						GetInfo(&person[i]);
 				}
				break;
			case 3:
				{
					puts("프로그램을 종료합니다.");
					return 0;
				}
				break;
		}
	}
	return 0;
}                

2-2 수강신청

  1. 기존 Error 함수들 수정하기
  2. X비트 표시 빼기
  3. 전역변수는 지역변수로 옮기기
  4. 비트연산은 pow말고 shift연산으로 하기
  5. 동적할당 빼기
  6. 콤마 제대로 찍기
  1. count 증가 수정하기
  2. CountCheck 에러함수 적용하기
#include <stdio.h> 
#include <stdlib.h>

enum { MIN_ID_NUM=1, MAX_ID_NUM=100,
	MAX_INFO_NUM=5, MAX_SUBJECTS_NUM=8 };
    
typedef struct Info {
	int id;
    unsigned char subjects;
} Info;

const char* Sub[MAX_SUBJECTS_NUM] =
{
	"컴퓨터개론", "이산수학", "C언어", "JAVA초급",
	"리눅스구조", "자료구조", "컴파일러", "네트워크개론"
};

int IDRangeCheck(Info* info)
{
	if (info->id < MIN_ID_NUM || info->id > MAX_ID_NUM){
		puts("ID의 범위는 1부터 100입니다.");
		return -1;
	}
 	return 0;
}

int CountCheck(int* num)
{
	if (*num==MAX_INFO_NUM){
		puts("수강 신청 정보가 5개를 초과하였습니다.");
 		return -1;
 	}
 	return 0;
}

int InputCheck(char* c)
{
	if (*c!='O' && *c!='X'){
		puts("O와 X만 입력해주세요.");
		return -1;
	}
	return 0;
}

int Menu()
{
	int select;
	do{
		puts("======================");
		puts("1) 수강 신청 정보 입력");
		puts("2) 수강 신청 정보 출력");
		puts("3) 종료");
		printf("Select ==> ");
		scanf("%d", &select);
	} while (select!=1 && select!=2 && select!=3);
	return select;
}

int SetInfo(Info* info)
{
	char c;
	info->subjects = 0;
	printf("ID: ");
	scanf("%d", &info->id);
	while (getchar()!='\n') {}
	if (IDRangeCheck(info))
		return -1;

	for (int i=0; i<MAX_SUBJECTS_NUM; i++){
		printf("%s: ", Sub[i]);

		c = getchar();
		while (getchar()!='\n') {}
		if (InputCheck(&c))
			return -1;

		if (c=='O')
			info->subjects |= (1 << i);
	}
    return 0;
}

void GetInfo(Info* info)
{
	printf("ID: %d, 수강신청 과목: ", info->id);
	for (int i=0; i<MAX_SUBJECTS_NUM; i++)
		if (info->subjects & (1 << i))
			printf("%s ", Sub[i]);
	puts("");
}
    
int main()
{
	Info data[MAX_INFO_NUM];
	int count = 0;
	while(1)
	{
		switch(Menu())
        {
			case 1:
				{
                	if (CountCheck(&count))
                    	break;
					if(!SetInfo(&data[count]))
                    	count++;
				}
				break;
			case 2:
				{
					if (!count)
						puts("등록된 정보가 없습니다.");
					for (int i=0; i<count; i++)
						GetInfo(&data[i]);
				}
					break;
			case 3:
				{
					puts("프로그램을 종료합니다.");
					return 0;
				}
		}
	}
	return 0;
}                                                                           

0개의 댓글