안녕하세요 성조입니다.
이전에 풀었던 C언어 문제들을 올려보려 합니다.
문제 ) switch ~case를 이용하여 년, 월을 입력하면 그 월의 마지막 날을 출력하는 프로그램을 작성하라. 단 , 2월이 윤달인지도 계산하여야 한다.
접근 - 그 월의 마지막 날을 구하려면 달마다 마지막 날짜가 며칠인지 알고 있어야 하며 윤달이 있는 년도는 29일의 조건을 줍니다. 윤달의 여부가 필요없는 2월을 제외한 1~12월은 달력에 있는 내용으로 입력해줍니다. 이후 2월에는 연도(year) 를 3가지 조건으로 윤달이 있던 연도인지 확인해줍니다.
1. year 연도를 4로 나누어서 나머지가 0으로 떨어지는 경우 윤달 (참)
2. year 연도를 100으로 나누어서 나머지가 0이 아닌 다른 숫자가 나오는 경우 (참)
3. year 연도를 400으로 나누어서 나머지가 0이 나오는 경우 (참)
3가지 조건을 걸어서 윤달을 확인해줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#include <stdio.h>
int main() {
int year = 0;
int month = 0;
int day = 0;
printf("\n\n\t");
printf(" 연도를 입력하세요 (yyyy) : ");
scanf_s("%d", &year);
printf("\t 월을 입력하세요 : ");
scanf_s("%d", &month);
/*1월 3월 5월 7월 8월 10월 12월은 31일까지
4월 6월 9월 11월은 30일까지*/
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
if ((year % 4) == 0 && (year % 100) != 0 || (year % 400) == 0) {
day = 29;
}
else {
day = 28;
}
break;
default:
printf("잘 못 입력된 값입니다");
}
printf("\t %d년 %d월의 마지막 날은 %d 입니다. ", year, month, day);
}
|
이렇게 입력을 해주면 조건이 나오며 if문을 해석해보면 위에 3가지 조건과 같게 year을 나누어서 나머지가 0인지를 비교하면서 &&의 경우 and연산자 역할을 가지고 있는데 그리고, 이면서, 이고의 의미를 갖습니다. 그렇다면 다시 그리고~ 100으로 나누어서 0으로 안떨어지는 경우가 되겠죠 ( !=은 비교변수와 비교 상수의 값이 다른지를 확인을 의미합니다) ||의 경우는 OR연산을 해주는 연산자인데 year을 400으로 나누어서 0이 떨어진 경우도 윤달을 가지고 있다는 조건을 의미해줍니다. 즉 ( 1 and 2 ) or ( 3 ) 이런 형태의 조건으로 묶이게 된 것입니다.
문제 ) 어떤 공원에 입장을 하는데 7세 이하는 무료입장, 8~12세는 초등학생 요금(500원) 13~19세는 청소년 요금(700원), 20~64세 까지는 성인요금(1500원), 65세 이상은 경로 우대 요금 (1000원)을 받는다. 나이를 입력받아 그 나이에 해당되는 문구를 if ~else 문으로 작성하여 출력하는 프로그램을 작성하라.
접근 - 임의의 값을 입력받고 그에 맞는 입장료를 표시해줘야 합니다. if문을 중첩 else if를 걸어서 절차지향적 C언어인 if문의 조건이 통과가 되는지를 봐줍니다. && 조건을 걸어서 범위를 지정해줄 수 있지만 if조건을 간략화하게 8세미만, 20세미만, 65세미만의 형태로 조건을 걸어줍니다.
C의 경우는 위에서부터 아래로 값을 통과시키면서 값을 확인하므로 0미만의 나이는 존재하지 않는 나이이므로 age<0 0미만 즉 음수의 값이 나오는 경우는 없는 나이임을 출력해줍니다 또는 unsigned int 형을 사용하여 양의 정수만을 가지는 조건의 변수를 선언해도 됩니다. 이후 값을 if문 하나씩 지나가면서 검토해줍니다. 0세 미만보다 크고 8세 미만인 경우는 무료 입장입니다가 호출되며 7세를 초과하며 20세 미만은 700원입니다. 를 호출받으며 65세 이상까지 순차적으로 프로그램이 진행됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#include <stdio.h>
int main()
{
int age = 0;
printf("나이를 입력해주세요 : ");
scanf_s("%d", &age);
if (age < 0)
{
printf("없는 나이입니다.");
}
else if (age <8) // 0~7세 무료
{
printf("\n\t무료 입장입니다.\n");
}
else if (age < 20) //13~19세 700원
{
printf("\n\t700원입니다.\n");
}
else if (age < 65) // 20~64세 1500원
{
printf("\n\t1500원입니다.\n");
}
else if (age >= 65) // 65세 이상 우대요금 1000원
{
printf("\n\t경로 우대 요금 1000원입니다.\n");
}
}
|
문제 ) 대학생의 학년을 입력받아 switch ~ caes를 거쳐 학년별로 다시 학기를 입력받아 학년/ 학기 별로 수강과목을 출력하는 프로그램을 여러분의 교과과정을 참고하여 다중 switch ~case를 이용하여 작성하라.
접근 - 프로그래밍을 공부하고 있는 학교 or 학원 or 특정 커리큘럼을 갖고 있는 분이라면 그 학년 학기를 수강과목으로 넣어야 합니다. 저의 경우는 현재 전과해서 새로운 학과에 적응하는 중이므로 그 학과의 전공들을 함수로 빼서 출력시켰습니다.
우선 학기 학년 순이 아니라 학년 학기 순으로 데이터가 입력될 예정이므로 학년을 먼저 입력받는 값을 메인 문에서 switch~ case를 만들어줘서 학기를 입력 받을 수 있도록 합니다. 이후 1학년 또는 2학년을 입력한 경우에 그 학년의 학기를 입력하는 값을 반환시켜주는 함수를 만들어서 그 함수 내에서는 switch ~case문으로 1학기 2학기로 printf를 사용하여 출력을 받을 수 있도록해줍니다. 이 말 그대로 소스를 짜게되면 아래와 같아집니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
#include<stdio.h>
int semester_1(int seme);
int semester_2(int seme);
int semester_3(int seme);
int semester_4(int seme);
int main() {
int grade = 0; // 학년 변수
int semester = 0; // 학기 변수
printf("학년 입력 : ");
scanf_s("%d", &grade);
switch (grade) {
case 1:
printf("1학년\n");
printf("학기를 입력하세요 :");
scanf_s("%d", &semester);
semester_1(semester);
break;
case 2:
printf("2학년\n");
printf("학기를 입력하세요 :");
scanf_s("%d", &semester);
semester_2(semester);
break;
case 3:
printf("3학년\n");
printf("학기를 입력하세요 :");
scanf_s("%d", &semester);
semester_3(semester);
break;
case 4:
printf("4학년\n");
printf("학기를 입력하세요 :");
scanf_s("%d", &semester);
semester_4(semester);
break;
default:
printf("비정상적인 입력입니다 (종료)");
}
}
int semester_1(int seme) {
switch (seme) {
case 1:
printf("------수강과목------\n");
printf("c프로그래밍\n");
printf("S.W융합개론\n");
break;
case 2:
printf("------수강과목------\n");
printf("C++프로그래밍\n");
printf("Pythom프로그래밍\n");
break;
default:
printf("비정상적인 입력입니다 (종료)");
}
}
int semester_2(int seme) {
switch (seme) {
case 1:
printf("------수강과목------\n");
printf("Java프로그래밍 기초\n");
printf("자료구조론\n");
break;
case 2:
printf("------수강과목------\n");
printf("컴퓨터알고리즘\n");
printf("웹 프로그래밍\n");
break;
default:
printf("비정상적인 입력입니다 (종료)");
}
}
int semester_3(int seme) {
switch (seme) {
case 1:
printf("------수강과목------\n");
printf("컴퓨터 네트워크\n");
printf("데이터 마이닝\n");
break;
case 2:
printf("------수강과목------\n");
printf("운영체제 실습\n");
printf("전공심화프로젝트\n");
break;
default:
printf("비정상적인 입력입니다 (종료)");
}
}
int semester_4(int seme) {
switch (seme) {
case 1:
printf("------수강과목------\n");
printf("센서네트워크\n");
printf("IOT 기반 Android 프로그래밍\n");
break;
case 2:
printf("------수강과목------\n");
printf("SW융합현장실습\n");
printf("클라우드 기반 IOT 프로그래밍\n");
break;
default:
printf("비정상적인 입력입니다 (종료)");
}
}
|
많은 과목수를 넣으면 코드 줄이 너무 길어지기 때문에 2과목의 전공들만 넣었습니다. 이런식으로 학년 switch ~case에 1차로 나눠주고 학기를 입력받아서 2차로 교과목명을 호출해오면 됩니다.
문제 ) 어떤 건물의 층별로 사무실을 안내하는 프로그램을 작성하라. 이 건물은 5층까지 있고, 각 층에는 여러 사무실이 있다. 층을 입력받아 각 층에 있는 모든 사무실을 출력하는 프로그램을 switch ~case를 이용하여 작성하라.
접근 - 층을 5개 만들어줍니다. 이후 사무실 명과 층을 작성해주면 끝나는 문제입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#include<stdio.h>
int main() {
int floor;
printf("층 수를 입력하세요 : ");
scanf_s("%d", &floor);
switch (floor) {
case 1:
printf("1층 사무실\n");
printf("sj사무실\n");
break;
case 2:
printf("2층 사무실\n");
printf("서땡땡 사무실\n");
break;
case 3:
printf("3층 사무실\n");
printf("세무사 사무실\n");
break;
case 4:
printf("4층 사무실\n");
printf("변호사 사무실\n");
break;
case 5:
printf("5층 사무실\n");
printf("법무사 사무실\n");
break;
default:
printf("잘 못 입력하셨습니다.");
break;
}
}
|
문제 ) 다음 식은 신체질량지수(BMI)를 계산하는 식이다.
[ 저체중 20미만, 정상 20~24, 과체중 25~29, 비만 30이상 ]
이 공식을 이용하여 자신의 신체질량지수를 구하고
판정하는 프로그램을 if~else를 이용하여 작성하라. 여기서 몸무게는 kg단위이고, 키는 m단위이다.
키를 입력할 때 175cm이면 1.75m로 바꾸어 입력하여야 한다.
접근 - 위에서도 계속 언급한것과 같이 절차지향 언어이며 중첩if의 경우 위의 조건과 비교해서 아닌 경우 다음 조건을 비교하므로 아래의 식처럼 간략하게 표현이 가능해집니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#include <stdio.h>
int main()
{
int kg, cm = 0;
float BMI, m = 0;
printf("\n\n\n");
printf(" 키를 입력하세요 (cm단위로 입력하세요) : ");
scanf_s("%d", &cm);
printf(" 몸무게를 입력하세요 ");
scanf_s("%d", &kg);
m = cm * 0.01; // cm를 m로 단위환산
BMI = kg / (m * m);
if (BMI < 0)
{
printf("존재하지 않습니다.");
}
else if (BMI < 20)
{
printf(" 저체중 ");
}
else if (BMI < 24)
{
printf(" 정상 ");
}
else if (BMI < 29)
{
printf(" 과체중 ");
}
else if (BMI >= 30)
{
printf(" 비만 ");
}
return 0;
}
|
문제 ) 다음은 과속단속 기준표이다. 시속 100km도로라 가정하고 자동차의 속도를 입력하면 벌금과 벌점을 출력하는
프로그램을 if~else를 이용하여 작성하라.
정속도 (10km/h 이하) 벌금 0, 벌점 0점 ,
속도위반 (10km/h 초과 20km/h이하) 벌금 30,000원, 벌점 0점,
속도위반 (20km/h 초과 40km/h이하) 벌금 60,000원, 벌점 15점,
속도위반 (40km/h 초과 60km/h이하) 벌금 90,000원, 벌점 30점,
속도위반(60km/h 초과) : 면허정지 벌금 120,000원, 벌점 60점,
접근 - 이전과 같이 조건을 주고 출력만 해주면됩니다. 되게 간략하지만 꾸미느라 printf()를 여러번 끊어서 작성했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include <stdio.h>
int main()
{
int speed = 0;
printf("\n\n\t");
printf("속도를 입력하세요 (km/h) : ");
scanf_s("%d", &speed);
if (speed < 11)
{
printf("\n\t");
printf(" 벌금 0원, 벌점 0점");
printf("\n\n\t");
}
else if (speed < 21)
{
printf("\n\t");
printf("벌금 30,000원, 벌점0점");
printf("\n\n\t");
}
else if (speed < 41)
{
printf("\n\t");
printf("벌금 60,000원 벌점 15점");
printf("\n\n\t");
}
else if (speed < 61)
{
printf("\n\t");
printf(" 벌금 90,000원 벌점 30점");
printf("\n\n\t");
}
else if (speed > 60)
{
printf("\n\n\t");
printf("벌금 120,000원 벌점 60점");
printf("\n\n\t");
}
}
|
문제 ) 겨울철의 기온이 t(C)이고 풍속이 ~~~ 일 때 체감온도 T(C)를 구하는 공식이 다음과 같을 때,
이 체감온도를 구하는 프로그램을 작성하라
T= 33-0.047 * (33-t)x(10.45+ 8.69루트v -0.755v)
우선 위의 주어진 공식으로 구하는 값과 기상청에서 구하는 값은 다른 것 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <stdio.h>
#include <math.h> //sqrt 사용을 위해서
int main()
{
double t = 0;; // t(C)
double v = 0; // (m/sec)
double real_t; // 체감온도 T(C)
printf("\n");
printf("기온을 입력하세요 : "); //공식 t값
scanf_s("%lf", &t);
printf("풍속을 입력하세요 : "); //공식 v값
scanf_s("%lf", &v);
// t,v가 입력된 값을 체감온도 공식에 t,v값을 대입 해서 체감온도를 real_t에 저장
real_t = 33 - 0.047 * (33 - t) * (10.45 + (8.69 * sqrt(v)) - (0.755 * v));
printf("체감온도는 %lf입니다", real_t); // 저장된 값을 출력
}
|
오래된 책이라서 그런건지.. 뭔가 어색하네요
언젠가 티스토리 수익을 내서 그돈으로 제가 만들고싶은 어플에 관련된 책들을 구매하고 싶네요. 물론 지금도 사비로 책을 구매해서 공부를 할 수 있으나 조금씩 쌓이는 글로 수익을 내고, 그 수익으로 다시 제가 학습할 수 있다면 너무나도 기분이 좋을 것 같아서 조금씩 데이터를 쌓아 보려합니다. 아무도 봐주지 않겠지만 나중에 시간이 지나고 보면 다시 감성 충만한 도전글도 되며 어려운 문제들을 하나씩 풀어내려가다보면 누군가에게 피드백도 받고 누군가에게는 지식을 전달해줄 수 있는 글이 되면 좋겠네요 오늘 하루도 힘내세요
'C, C++ > C' 카테고리의 다른 글
[C언어] 삼항(조건) 연산자를 이용하여 5개의 데이터를 입력받고 최솟값 구하기 (0) | 2020.11.01 |
---|---|
[C언어] 관계, 논리, 삼항(조건)연산자를 혼합한 C프로그래밍 (0) | 2020.10.31 |
[C언어] 관계(비교)연산자를 사용하여 두 데이터를 비교하기 (0) | 2020.10.30 |
[C언어] C언어 이차방정식 프로그래밍 (0) | 2020.10.14 |
[C언어] C언어 문제풀이02 (0) | 2020.06.11 |