• [컴퓨터] 연습문제 6개 풀어본거..2012.04.01 PM 06:10

게시물 주소 FONT글자 작게하기 글자 키우기

근데 역시 scanf는 단점이 너무 많은듯 -_-

#include
//fflush()를 이용하기 위한 표준 라이브러리 헤더파일 인클루드
#include

//정수 체크 함수
int check_n(char chname[31])
{
//값을 체크하여 0또는, 양의 정수일 때만 값을 반환 아닐때는 계속 다시입력
int chnum=-1;
while(1)
{
fflush(stdin);
printf("%s를 입력하세요 : ",chname);
scanf(" %d",&chnum);

if(chnum>=0)
{
fflush(stdin);
return chnum;
}
else
{
printf("입력한 %s 값이 올바르지 않습니다! 다시 입력하십시오!\n",chname);
chnum=-1;
continue;
}
}
}

//실수 체크 함수
double check_d(char chname[31])
{
//값을 체크하여 0또는, 양의 실수일 때만 값을 반환 아닐때는 계속 다시입력
double chnum=-1.0;
while(1)
{
fflush(stdin);
printf("%s를 입력하세요 : ",chname);
scanf(" %lf",&chnum);

if(chnum>=0.0)
{
fflush(stdin);
return chnum;
}
else
{
printf("입력한 %s 값이 올바르지 않습니다! 다시 입력하십시오!\n",chname);
chnum=-1.0;
continue;
}
}
}


int main()
{
{
//문제1. 입장료를 계산하는 프로그램 if~else문 이용. 어른3만원, 청소년2만원, 어린이1만원,어른이 5명이상이면 어린이 요금은 5천원

//정수형 변수 adult,youth,child,total선언
int adult,youth,child,total=0;

//scanf를 이용해 어른,청소년,어린이의 수를 정수형으로 입력받아 각각 adult,youth,child변수에 저장.
printf("어서오세요 인원수를 안내에 따라 입력해 주세요 : \n");
//printf("어른의 수를 입력하세요 : ");
//scanf("%d",&adult);
adult=check_n("어른의 수");
//printf("청소년의 수를 입력하세요 : ");
//scanf("%d",&youth);
youth=check_n("청소년의 수");
//printf("어린이의 수를 입력하세요 : ");
//scanf("%d",&child);
child=check_n("어린이의 수");

//어른의 수가 5명 이상일때는 total을 구할때 child에 5000을 곱하고 5명 미만일때는 child에 10000을 곱하도록 조건문 if사용.
if (adult>=5)
{
total=30000*adult+20000*youth+5000*child;
}
else
{
total=30000*adult+20000*youth+10000*child;
}

//계산된 total 변수의 값을 %d 서식을 이용해 printf로 출력
printf("입장료는 %d원 입니다. 감사합니다.\n\n\n",total);
}
//입력 버퍼를 비워줌.
fflush(stdin);
{
//문제2. 비만도 평가 프로그램.
//조건: 남녀를 구분하여 키와 몸무게를 입력받는다, 성별에 따른 BMI적용 기준을 따른다, BMI는 체중을 키의 제곱으로 나눈 값으로 정의한다. (체중kg,키m)

//문자형 변수 sex, 실수형 변수 weight, height, BMI를 선언.
char sex;
double weight, height;
double BMI;

//전체를 무한루프 while로 감싸 올바르지 않은 입력값이 검출됐을 경우 continue로 돌려보냄
while(1)
{

//올바르지 않은 성별 입력값으로 continue되었을때, 입력된 값이 문자 2개 이상이었을 경우 scanf에서 변수로 전달한 1개 외에 입력 버퍼에 남은 문자나 특수문자를 비워줌.
fflush(stdin);

//성별을 입력받아 sex 변수로 넘김
printf("성별: 남자면 M 여자면 F를 입력하세요. : ");
scanf(" %c",&sex);

//sex변수 값이 M이거나 F일때만 입력버퍼를 비운 뒤 다음 문장으로 넘어감
if (sex=='M'||sex=='F')
{
fflush(stdin);
}
//sex변수 값이 M,F가 아닌 다른 값일 경우 에러메세지를 띄우면서 반복문 처음 문장으로 돌아감.
else
{
printf("올바르지 않은 입력입니다. 성별을 다시 입력하십시오!\n\n");
continue;
}

//키와 몸무게를 각각 kg, cm로 입력받아 weight,height 변수로 넘김.
//printf("귀하의 몸무게를 입력하세요.(kg) : ");
//scanf(" %lf",&weight);
weight=check_d("귀하의 몸무게");
//printf("귀하의 키를 입력하세요.(cm) : ");
//scanf(" %lf",&height);
height=check_d("귀하의 키");

//BMI산출 공식에 따라 m로 환산한 키의 제곱으로 몸무게를 나눔. 키*키/10000=(키/100)*(키/100)=m로 환산환 키의 제곱
BMI=weight/(height*height/10000);

//환산된 BMI지수를 먼저 출력
printf("귀하의 BMI 지수는 : %.1lf 입니다. \n",BMI);

//다중 if문. 외곽의 if는 sex변수값이 M일경우, F일 경우에 따라 내부 if문으로 이동
if (sex=='M')
{
//내부if문. 남자일 경우 BMI값의 범위에 따라 다르게 판정을 출력
if (BMI>=25.0)
{
printf("귀하는 과체중입니다.\n\n");
}
else if (BMI>=20.1&&BMI<25.0)
{
printf("귀하는 표준체중입니다.\n\n");
}
else
{
printf("귀하는 저체중입니다.\n\n");
}
}
else if (sex=='F')
{
//두번째 내부if문. 여자일 경우 남자와 다른 BMI값 범위에 따라 판정을 출력
if (BMI>=25.0)
{
printf("귀하는 과체중입니다.\n\n");
}
else if (BMI>=18.5&&BMI<25.0)
{
printf("귀하는 표준체중입니다.\n\n");
}
else
{
printf("귀하는 저체중입니다.\n\n");
}
}
//문제없이 if문을 모두 끝냈을때 break로 무한루프를 탈출
break;
}
}
//입력버퍼 비우기.
fflush(stdin);
{
//문제3. 등록금 계산 프로그램. 학년을 입력하면 등록금 계산. 잘못입력하면 에러메세지, 스위치~케이스문 사용
//1학년 400+90만, 2,3학년 400만, 4학년 430만

//정수형 변수 grade, tuition_fees 선언
int grade,tuition_fees;

//잘못 입력했을때 다시 입력받기 위해 무한루프 while문으로 감쌈
while(1)
{
//문자를 입력해 continue로 돌아왔을 경우 남는 줄넘김 문자에 의해 무한루프가 생길 가능성 등을 고려해 입력버퍼를 비워줌.
fflush(stdin);
//학년을 입력받아 grade변수로 넘김
printf("당신의 학년을 입력하세요 : ");
scanf(" %d",&grade);

//switch문으로 grade값에 따라 각 case에서 검사하여 처리. 잘못된 입력은 default에서 처리.
switch(grade)
{
//grade값이 1일 경우 tuition_fees에 490대입하고 switch 분기문 탈출.
case 1:
tuition_fees=490;
break;

//grade값이 2또는 3일 경우 tuition_fees에 400을 대입하고 분기문 탈출.
case 2:
case 3:
tuition_fees=400;
break;

//grade값이 4일 경우 tuition_fees에 430을 대입하고 분기문 탈출.
case 4:
tuition_fees=430;
break;

//grade값이 1~4외의 값일 경우 에러메세지를 출력하고 continue로 while문 첫문장으로 돌아감.
default:
printf("입력된 학년이 올바르지 않습니다. 다시 입력하십시오.\n\n");
continue;
}

//이상없이 switch문을 나왔을 경우 등록금 값을 출력하고 break로 while을 탈출.
printf("등록금은 %d만원입니다.\n\n",tuition_fees);
break;
}
}
//입력 버퍼 비움.
fflush(stdin);
{
//문제4. 알파벳 소문자를 입력받아 대문자로 바꾸는 프로그램.
//조건: 소문자가 아니면 다시 입력받는다. 대문자P를 입력하면 종료한다. 와일,컨티뉴,브레이크 사용.

//문자형 변수 LETTER 선언
char LETTER;

//입력한 값이 소문자가 아닐경우 continue로 돌아가도록 무한루프 while을 사용.
while(1)
{
//continue로 돌아왔을 경우 입력버퍼에 값이 남아있을 경우를 대비해 버퍼를 비움.
fflush(stdin);

//문자를 입력받아 LETTER변수에 전달
printf("소문자를 입력하십시오. : ");
scanf(" %c",&LETTER);

//LETTER 값이 소문자 범위인 97~122 사이에 있을 경우 32를 빼서 대문자로 만듦.
if(LETTER>=97&&LETTER<=122)
{
LETTER-=32;
printf("변환된 대문자는 %c입니다.\n\n",LETTER);
//다음 입력을 받기 위해 continue로 while 첫문장으로 돌아감.
continue;
}
//LETTER가 위 범위에 있지 않으면서 대문자 P일 경우 변환 프로그램을 종료.
else if(LETTER=='P')
{
printf("변환 루틴을 종료합니다.\n\n");
//break로 while을 탈출
break;
}
//LETTER가 위 어느 조건에도 맞지 않을 경우 에러메세지를 띄우고 처음으로 돌아감.
else
{
printf("입력한 값이 소문자가 아닙니다. 다시 입력하십시오. \n\n");
continue;
}
}
}
//입력버퍼를 비움
fflush(stdin);
{
//문제5. 전복을 자동으로 포장해주는 프로그램

//정수형 변수 weight, abalone을 선언하고 abalone은 0으로 초기화.
int weight=-1;
int abalone=0;

//do~while문을 이용해 반복문.
do
{
//만약을 위해 버퍼에 남은 값을 비워줌.
fflush(stdin);
//무게를 입력받아 weight변수에 전달.
printf("전복의 무게를 입력하세요(단위 : g) : ");
scanf(" %d",&weight);

//무게가 500이상일 경우만 abalone수를 1늘림
if(weight>=500)
{
abalone++;
weight=-1;
//문제의 실행예처럼 나오게 하기위해 20마리째는 현재 갯수를 출력하지 않도록 예외 처리.
if(abalone!=20)
{
//20마리 미만에서만 500g이상일 때 현재 전복수를 출력.
printf("현재 왕전복의 갯수 : %d \n",abalone);
}
}
//입력값이 음수일 경우 에러메시지를 출력.
else if(weight<0)
{
printf("입력값이 올바르지 않습니다! 자동적으로 무시됩니다.\n");
}
}
//전복수가 20미만일 때만 do이하 문장들이 반복되도록 설정.
//20마리째에 while문을 탈출하여 결과 메시지를 출력.
while(abalone<20);
printf("전복 한 박스를 포장했습니다!\n\n");
}
//입력버퍼를 비움
fflush(stdin);
{
//문제6. 입력된 정수만큼 $표시 출력 프로그램

//정수형 변수 i,j,value 선언
//value를 음수로 초기화한 이유는 결론에서 다룸.
int i,j, value=-1;

//외부 for문의 카운터i는 0부터 9까지. 카운터 증가는 여기서 하지 않음.
for(i=0;i<10;)
{
//반복문에서 다시 돌아왔을때 입력버퍼를 비움.
fflush(stdin);
//$를 출력할 숫자를 입력받아 value변수에 전달.
printf("숫자를 입력하시오:");
scanf(" %d",&value); //변수 주소로 넘길때 형식에 맞지 않으면 값을 건네지 않고 넘긴다. 이때 받는 변수가 초기화 되지 않은 상태라면 printf등에서 변수를 호출할 때 쓰레기 값이 호출될 것이고 반복문 내에서 쓰인 적이 있다면 그 값이 유지되어 호출될 것이다.

//value에 음수를 입력했을 경우 에러메시지 처리를 위한 if문.
//문자를 입력한 경우 value가 값을 받지못하므로 음수를 그대로 가지고 옴.
if(value<0)
{
printf("잘못된 입력값입니다. 이 결과는 카운트되지 않습니다.\n\n");
continue;
}
//이외의 value는 모두 양의 정수.
else
{
//카운터는 0부터 시작했으므로 i+1로 출력, value의 값 출력.
printf("%d/10번째 시도 $의 갯수: %d \n",i+1,value);
//내부 for문의 카운터 j는 0부터 value-1까지 매회 1씩 증가.
for(j=0;j {
//매 반복마다 $를 출력하여 총 value갯수만큼 $출력.
printf("$");
}
//$출력이 끝난후 줄바꿈을 해줌.
printf("\n");
//value값을 음수로 다시 바꿔 에러에 대비.
value=-1;
//외부 for문의 카운터를 1증가시킴.
i++;
}
}
}
printf("\n모든 프로그램 종료! \n");
return 0;
}
댓글 : 0 개
친구글 비밀글 댓글 쓰기

user error : Error. B.