2-1 주소록
- 출력이 아니라 애초에 저장할때 크기 제한하기
- 외계문자 출력 안되게 수정하기
- 동적할당 빼기
#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 수강신청
- 기존 Error 함수들 수정하기
- X비트 표시 빼기
- 전역변수는 지역변수로 옮기기
- 비트연산은 pow말고 shift연산으로 하기
- 동적할당 빼기
- 콤마 제대로 찍기
- count 증가 수정하기
- 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;
}