[C] 혼공단_2주차_Chapter 03~04

Haeun Noh·2022년 7월 15일
0

0715


2주차 미션

기본 미션 : 확인 문제 풀고, 풀이 과정 설명하기

선택 미션 : Ch.04 도전 실전 문제 풀고 인증샷

끝나지 않을 듯 했던 기말고사가 끝났습니다!!
기말고사도 무사히 마친 만큼 이제부터는 더욱 혼공단 활동에 활발히 참여할 수 있겠네요.
그럼 긴 말 없이 확인문제부터 풀어보겠습니다.



Ch.03-1 확인 문제

1. 다음 자료형 중에서 실수형에 O표를 하세요.

  • float - [ o ]
  • long - [ x ]
  • char - [ x ]
  • double - [ o ]
  • int - [ x ]
  • unsigned - [ x ]
  • short - [ x ]

2. 다음 프로그램의 실행결과를 예상해보세요.

#include <stdio.h>

int main(void) {
	int a = 0;
    
    a = a + 1;
    a = a + 2;
    a = a + 3;
    printf("a : %d", a );
    
    return 0;
}
출력 결과 : 6

int a의 초깃값은 0입니다.

  1. aa+1을 저장하면 a에는 1의 값이 저장됩니다.
  2. aa+2을 저장하면 1+2이기 때문에 a에는 3의 값이 저장됩니다.
  3. aa+3을 저장하면 3+3이기 때문에 a에는 6의 값이 저장됩니다.
  4. a의 값을 출력하므로 a에 저장된 값인 6이 출력될 것입니다.


Ch.03-2 확인 문제

1. 다음과 같이 변수가 선언되어 있을 때, scanf 함수의 사용법이 옳은 것을 고르세요.

  • char ch; - scanf("%c", &ch );
  • short sh; - scanf("%d", &sh );
  • int in; - scanf("%d", &in );
  • float ft; - scanf("%f", &ft );
  • double db; - scanf("%lf", &db );

2. 다음 프로그램의 빈칸에 알맞은 내용을 채워보세요.

#include <stdio.h>

int main(void) {
	char fruit[20];
    int cnt;
    
    printf("좋아하는 과일 : ");
    scanf("%s", ? );	//?에 들어갈 내용 채우기
    printf("몇 개 : ");
    scanf("%d", ? );	//?에 들어갈 내용 채우기
    printf("%s를 %d개 드립니다.", fruit, cnt);
    
    return 0;
}

첫 번째 ?에는 %s가 있으므로 문자열형태의 변수인 fruit가 들어갑니다.
두 번째 ?에는 %d가 있으므로 정수형의 변수인 cnt가 들어갑니다.
그리고 fruitcnt는 모두 scanf으로 입력받기 때문에 변수명 앞에 &를 붙여주어야 합니다.

답 : (순서대로) &fruit &cnt

3. 키보드로 문자를 입력하여 아스키 코드 값을 출력하는 프로그램을 작성하세요. 어떤 문자가 입력될지는 실행할 때 결정합니다.

#include <stdio.h>

int main(void) {
    char ch;

    printf("문자 입력 : ");
    scanf("%c", &ch);
    printf("%c문자의 아스키 코드 값은 %d입니다.", ch, ch);

    return 0;
}
출력 결과

문자 입력 : A
A문자의 아스키 코드 값은 65입니다.

위 코드는 문자를 입력받아 아스키코드값을 출력하는 프로그램입니다.

  1. char ch의 값을 입력받아야 하기 때문에 scanf를 사용합니다.
  2. 아스키 코드 값을 출력해야 하기 때문에 %c를 정수표현인 %d로 바꿔 출력합니다.
  3. A를 입력하면 아스키 코드 값인 65가 출력됩니다.


Ch.04-1 확인 문제

1. 4.0과 1.2의 덧셈, 뺄셈, 곱셈, 나눗셈을 한 값을 소수점 이하 첫째 자리까지 출력하세요.

#include <stdio.h>

int main(void) {
    double a = 4.0, b = 1.2;

    printf("%.1lf + %.1lf = %.1lf\n", a, b, (a + b));
    printf("%.1lf - %.1lf = %.1lf\n", a, b, (a - b));
    printf("%.1lf * %.1lf = %.1lf\n", a, b, (a * b));
    printf("%.1lf / %.1lf = %.1lf\n", a, b, (a / b));

    return 0;
}
출력결과

4.0 + 1.2 = 5.2
4.0 - 1.2 = 2.8
4.0 * 1.2 = 4.8
4.0 / 1.2 = 3.3
  1. 변수 abdouble타입이기때문에 %lf을 사용합니다.
  2. 소수점 이하 첫째 자리까지 나타내야 하므로 % 뒤에 .1을 추가합니다.
  3. 덧셈은 +, 뺄셈은 -, 곱셈은 *, 나눗셈은 /으로 연산하여 나타냅니다.

2. 두 과목의 점수를 입력하여 평균을 출력하는 프로그램을 작성하세요. 평균은 소수점 이하 첫째 자리까지 출력하세요.

#include <stdio.h>

int main(void) {
	int a, b, tot;
    double avg;
    
    printf("두 과목의 점수 : ");
    scanf("%d %d", &a, &b );
    tot = a + b;
    avg = tot/2.0;
    
    printf("평균 : %.1lf\n", avg );
    
    return 0;
}
출력 결과

두 과목의 점수 : 90 89
평균 : 89.5
  1. 두 과목의 점수는 정수형이므로 %d를 사용하고 ab의 값을 입력받기 때문에 &를 사용합니다.
  2. 두 과목의 점수의 합계를 의미하는 tot변수에 합계를 입력합니다.
  3. 두 과목의 평균을 의미하는 avg변수에 tot/2.0를 저장합니다. 이 때 tot2로 나누게 되면 소수점 자리까지 계산을 하지 않기 때문에 반드시 2.0으로 나누어 주어야 합니다.
  4. 평균을 나타내는 avg변수는 double타입이므로 %lf를 사용합니다.

3. 태희가 신청한 전체 학점과 평점을 게산하여 신청 학점이 10학점 이상이고 평점 평균이 4.0을 넘는 경우 1을 출력하고, 그렇지 않으면 0을 출력하는 프로그램을 작성하세요. 태희가 이전 학기에 신청한 과목당 학점과 얻은 점수는 아래와 같습니다.

  • 국어 - 3학점 - 3.8
  • 영어 - 5학점 - 4.4
  • 수학 - 4학점 - 3.9

각 변수명은 다음과 같습니다.

국어영어수학전체 학점결과 저장국어 평점영어 평점수학 평점평점 평균
korengmatcreditsreskscoreescoremscoregrade
#include <stdio.h>

int main(void) {
	int kor = 3, eng = 5, mat = 4;	//국어, 영어, 수학의 학점 초기화
    int credits;	//전체 학점을 저장할 변수
    int res;		//연산 결과를 저장할 변수
    double kscore = 3.8, escore = 4.4, mscore = 3.9; //각 과목의 평점 초기화
    double grade;	//평점의 평균을 저장할 변수
    
    credits = (kor + eng + mat);	//전체 학점 계산
    grade = (kscore + escore + mscore);	//평점의 평균 계산
    
    if ( (credits >= 10 ) && (grade > 4.0) ) res = 1;	
    else res = 0;
    
    printf("%d", res );	//결과 출력
    
    return 0;
}
출력 결과 : 1
  1. kor eng mat는 학점을 나타내므로 int형으로 나타냅니다.
  2. credits은 학점의 총 합계이므로 int형으로 나타냅니다.
  3. res1또는 0을 저장하므로 int형으로 나타냅니다.
  4. kscore escore mscore은 평점을 나타내므로 double형으로 나타냅니다.
  5. grade는 평점의 평균이므로 double형으로 나타냅니다.
  6. credits >= 10 grade > 4.0의 두 가지 조건을 모두 만족해야만 res1이 저장되기 때문에 && 또는 &를 사용합니다.
  7. 조건에 하나라도 충족이 되지 않으면 아래의 else문으로 이동해 res0이 저장됩니다.


Ch.04-2 확인 문제

1. short형과 long형의 자료형의 크기를 비교하여 크기가 큰 자료형이 무엇인지 출력하세요.

#include <stdio.h>

int main(void) {
    int res;

    res = (sizeof(short) > sizeof(long)) ? 1 : 0;

    if (res == 1) printf("short");
    else printf("long");

    return 0;
}
출력결과 : long
  1. sizeof의 연산자를 사용하여 short의 크기를 계산합니다.
  2. sizeof의 연산자를 사용하여 long의 크기를 계산합니다.
  3. short형의 크기가 클 경우 res1을 저장합니다.
  4. long형의 크기가 클 경우 res2을 저장합니다.
  5. 앞에서 저장한 res의 값이 1일 경우 short를 출력합니다.
  6. res의 값이 2일 경우 long을 출력합니다.

2. 야구경기장의 좌석 수가 70개고 입장객 수가 65명일 때 입장률을 출력하세요.

#include <stdio.h>

int main(void) {
	int seats = 70;		//경기장의 좌석 수 초기화
	int audience = 65;	//관중 수 초기화
	double rate;		//입장률을 저장할 변수

	rate = (double)audience / (double)seats * 100.0;
	printf("입장률 : %.1lf%", rate);		//입장률 출력

	return 0;
}
출력 결과

입장률 : 92.9%
  1. 좌석 수와 관중 수는 정수이므로 seatsaudience변수는 int로 지정합니다.
  2. 입장률은 소수가 나올 수 있으므로 ratedouble로 지정합니다.
  3. seats / audience는 그대로 계산하면 정수형이기 때문에 0이 출력됩니다. 따라서 double로 캐스팅을 해주어야 올바른 값이 나올 수 있습니다.
  4. 출력 결과 창에 소수점 첫 째 자리까지 나타내어져 있기 때문에 %.1lf로 나타냅니다.

3. 3.76시간은 몇 시간, 몇 분, 몇 초인지 출력하세요.

#include <stdio.h>

int main(void) {
	int hour, min, sec;		//시, 분, 초를 저장할 변수
	double time = 3.76;		//시간 초기화

	hour = (int)time;		//형 변환으로 정수 부분만을 골라낸다.
	time -= hour;			//한 시간이 안 되는 부분만을 다시 저장한다.
	time *= 60;				//분 단위로 환산
	min = (int)time;		//정수 부분만 분으로 저장한다.
	time -= min;			//1분이 안 되는 부분만을 다시 저장한다.
	time *= 60;				//초 단위로 환산
	sec = (int)time;		//정수 부분만 초로 저장한다.

	printf("3.76시간은 %d시간 %d분 %d초입니다.",hour, min, sec);
}
출력결과

3.76시간은 3시간 45분 35초입니다.
  1. 3.76시간3시간 n분 n초이기 때문에 time변수를 int로 캐스팅하여 3시간hour변수에 저장합니다.
  2. 0.76* 60로 분으로 변환하고 time변수를 int로 캐스팅하여 정수부분인 45min변수에 저장합니다.
  3. 이제 hourmin변수에 쓰인 것을 제한 나머지를 * 60로 초로 변환하고 time변수를 int로 캐스팅하여 정수부분인 35sec변수에 저장합니다.
  4. hour min sec은 모두 정수형이므로 %d를 사용하여 나타냅니다.


Ch.04-2 도전 실전 예제

체중관리 프로그램

체중(kg)과 키(cm)를 입력하여 BMI(신체질량지수)를 구한 후에 BMI의 값이 20.0 이상 25.0 미만이면 "표준입니다"를 출력하고 그렇지 않으면 "체중관리가 필요합니다"를 출력합니다.

BMI는 표준체중, 저체중, 과체중을 판변하는 수치로 몸무게를 키의 제곱으로 나누어 구합니다. 이 때 키는 미터(m)단위로 계산합니다.

#include <stdio.h>

int main(void) {

	double kg, cm;

	printf("몸무게(kg)와 키(cm) 입력 : ");
	scanf_s("%.1lf %.1lf", &kg, &cm);

	cm /= 100;
	double bmi = kg / (cm * cm);
	if (bmi >= 20.0 && bmi < 25.0) printf("표준입니다"); 
    else printf("체중관리가 필요합니다");

	return 0;
}
출력결과

몸무게(kg)와 키(cm) 입력 : 66 185.6
체중관리가 필요합니다.
  1. kg cm은 소수일 수도 있으므로 double로 선언해줍니다.
  2. 실행결과에 소수점 첫 째 자리까지 표현되어 있으므로 %.1lf로 나타내줍니다.
  3. 입력받은 키는 cm단위이므로 m단위로 바꿔 저장하기 위해 cm / 100cm에 저장합니다.
  4. BMI 계산은 몸무게 / 키의 제곱이므로 kg / ( cm * cm )bmi변수에 저장합니다.
  5. bmi >= 20.0 bmi < 25.0의 조건이 모두 일치하면 표준입니다.를 출력합니다.
  6. 그 이외의 조건인 경우 체중관리가 필요합니다를 출력합니다.


profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글