Chapter07 프로그래밍 연습

milpy·2022년 4월 26일
0

C 기초 플러스 6판

목록 보기
11/18

01

# 문자를 만날 때까지 입력을 읽고, 읽은 스페이스의 수, 읽은 개행문자의수, 읽은 기타 모든 문자들의 수를 출력하는 프로그램을 작성하라.

#include <stdio.h>

int main(void)
{
	char ch;
	int space = 0;
	int newLine = 0;
	long o_ch = 0;

	while ((ch = getchar()) != '#')
	{
		switch(ch)
		{
			case ' ':
				space++;
				break;
			case '\n':
				newLine++;
				break;
			default:
				o_ch++;
				break;
		}
	}

	printf("공백문자 %d개, 개행문자 %d개, 그 외 문자 %ld개\n",
		space, newLine, o_ch);

	return 0;
}

02

# 문자를 만날 때까지 입력을 읽는 프로그램을 작성하라. 각각의 입력 문자와 그 문자에 해당하는 ASCII 코드값을 10진수로 출력하라. 이 문자-코드쌍을 한 라인당 8개 출력하라. (힌트 : 문자 카운트와 모듈로 연산자(%)를 사용하여 루프의 매 8사이클마다 한 번 개행 문자를 출력하라.)

#include <stdio.h>

int main(void)
{
	char ch;

	for(int i = 1; (ch = getchar()) != '#'; i++)
	{
		if(ch == '\n') continue;

		printf("%c-%d ", ch,ch);

		if(i % 8 == 0)
			putchar('\n');
	}

	return 0;
}

03

0을 입력할 때까지 정수들을 읽는 프로그램을 작성하라. 입력이 종료된 후, 프로그램은 입력된 정수 중에서 짝수(0은 제외)의 개수와 평균, 홀수의 개수와 평균은 보고해야 한다.

#include <stdio.h>

int main(void)
{
	int num;

	int odd = 0, even = 0;
	int oddTotal = 0, evenTotal = 0;

	while (scanf("%d", &num) && num != 0)
	{
		if(num%2)
			odd++, oddTotal += num;
		else
			even++, evenTotal += num;
	}

	printf("홀수의 개수 : %d, 평균 : %.2f\n", 
		odd, (float)oddTotal / odd);
	printf("짝수의 개수 : %d, 평균 : %.2f\n", 
		even, (float)evenTotal / even);

	return 0;
}

04

# 문자를 만날 때까지 입력을 읽고, if else문을 사용하여 마침표는 느낌표로, 느낌표는 두 개로 대체하고, 대체한 횟수를 끝에 출력하는 프로그램을 작성하라.

#include <stdio.h>

int main(void)
{
	char ch;
	int stopConvert = 0;
	int exclamConvert = 0;

	while ((ch = getchar()) != '#')
	{
		if(ch == '.')
		{
			putchar('!');
			stopConvert++;
		}
		else if(ch == '!')
		{
			printf("!!");
			exclamConvert++;
		}
		else putchar(ch);
	}

	printf(". -> !  횟수 : %d\n", stopConvert);
	printf("! -> !! 횟수 : %d\n", exclamConvert); 

	return 0;
}

05

switch를 사용하여 연습04를 다시 작성하라.\

#include <stdio.h>

int main(void)
{
	char ch;
	int stopConvert = 0;
	int exclamConvert = 0;

	while ((ch = getchar()) != '#')
	{
		switch(ch)
		{
			case '.':
				putchar('!');
				stopConvert++;
				break;
			case '!':
				printf("!!");
				exclamConvert++;
				break;
			default:
				putchar(ch);
				break;
		}
	}

	printf(". -> !  횟수 : %d\n", stopConvert);
	printf("! -> !! 횟수 : %d\n", exclamConvert); 

	return 0;
}

06

# 문자를 만날 때까지 입력을 읽고, 문자 시퀸스 ei가 나타난 횟수를 출력하는 프로그램을 작성하라.

#include <stdio.h>

int main(void)
{
	char ch;
	char p_ch = '\n';
	int eiCount = 0;

	while ((ch = getchar()) != '#')
	{
		if(p_ch == 'e' && ch == 'i')
			eiCount++;
		p_ch = ch;
	}

	printf("문자 시퀸스 ei가 나타난 횟수 : %d\n", eiCount);

	return 0;
}

07

사용자에게 일주일 동안 노동한 시간을 입력할 것을 요구하고, 총소득(gross pay), 세금(taxes), 순소득(net pay)을 출력하는 프로그램을 작성하라. 임금 체계는 다음과 같이 계산한다고 가정한다.

예시

a. 기본급 = 시간당 $10.00
b. 초과근무수당(40시간을 초과한 노동) = 노동 시간 X 기본급의 1.5배
c. 소득세율 = 처음 $300까지 15%
			다음 $150까지 20%
            나머지는 25%

답안

#include <stdio.h>

#define HOURLYWAGE 10.0

#define OVERTIMEPAY (HOURLYWAGE * 1.5)

#define INCOME1 300
#define TAXES1 0.15

#define INCOME2 150
#define TAXES2 0.20

#define TAXES3 0.25

int main(void)
{
	int playTime;
	float grossPay = 0, taxes = 0, netPay = 0;

	printf("일주일 동안 노동한 시간을 입력해주세요 : \n");
	scanf("%d", &playTime);

	grossPay = (playTime > 40 ? 
			(playTime - 40) * OVERTIMEPAY 
			: playTime * HOURLYWAGE);
	
	if(grossPay > INCOME1)
		taxes += INCOME1 * TAXES1;
	else
		taxes += grossPay * TAXES1;

	if(grossPay > INCOME1 + INCOME2)
		taxes += (INCOME1 + INCOME2) * TAXES2;
	else
		taxes += (grossPay - INCOME1) * TAXES2;
	
	if(grossPay > INCOME1 + INCOME2)
		taxes += (grossPay - INCOME1 - INCOME2) * TAXES3;

	netPay = grossPay - taxes;

	printf("총소득 : $%.2f\n", grossPay);
	printf("세금 : $%.2f\n", taxes);
	printf("순이익 : $%.2f\n", netPay);

	return 0;
}

08

연습 07에서, 가정 a.를 수정하여 기본급을 선택할 수 있는 메뉴를 사용자에게 제공하라. 기본급 선택에는 switch문을 사용하라. 프로그램의 실행은 다음과 같은 모습으로 시작되어야 한다.

예시

************************************************************
자신의 기본급에 해당하는 번호를 선택하시오(끝내려면 5번을 선택하시오):
1) 시간당 $8.75				2) 시간당 $9.33
2) 시간당 $10.00				4) 시간당 $11.20
5) 종료
************************************************************

사용자가 1, 2, 3, 4 중 하나를 산택하면, 노동한 시간을 다시 요청해야 한다. 이러한 과정은 사용자가 5를 산택할 때까지 계속된다. 1, 2, 3, 4, 5 이외의 것이 입력되면, 바르게 선택하도록, 사용자를 안내하는 메시지를 출력하고, 과정을 다시 반복한다. #define 기호 상수를 사용하여 여러가지 기본소득과 소득세율을 나타내라.

#include <stdio.h>

#define OVERTIMEPAY 1.5

#define INCOME1 300
#define TAXES1 0.15

#define INCOME2 150
#define TAXES2 0.20

#define TAXES3 0.25

int main(void)
{
	float hourlyWage;
	int playTime;
	float grossPay = 0, taxes = 0, netPay = 0;

	while(1)
	{
		printf("************************************************************\n");
		printf("자신의 기본급에 해당하는 번호를 선택하시오(끝내려면 5번을 선택하시오):\n");
		printf("1) 시간당 $8.75				2) 시간당 $9.33\n");
		printf("3) 시간당 $10.00			4) 시간당 $11.20\n");
		printf("5) 종료\n");
		printf("************************************************************\n");

		int n;
		scanf("%d", &n);
		switch(n)
		{
			case 1:
				hourlyWage = 8.75;
				break;
			case 2:
				hourlyWage = 9.33;
				break;
			case 3:
				hourlyWage = 10.00;
				break;
			case 4:
				hourlyWage = 11.20;
			case 5: break;
			default:
				printf("잘못 입력했습니다.\n");
				continue;
		}

		if(n == 5) break;

		printf("일주일 동안 노동한 시간을 입력해주세요 : \n");
		scanf("%d", &playTime);
	
		grossPay = (playTime > 40 ? 
				(playTime - 40) * OVERTIMEPAY
				: playTime) * hourlyWage;
		
		if(grossPay > INCOME1)
			taxes += INCOME1 * TAXES1;
		else
			taxes += grossPay * TAXES1;
	
		if(grossPay > INCOME1 + INCOME2)
			taxes += (INCOME1 + INCOME2) * TAXES2;
		else
			taxes += (grossPay - INCOME1) * TAXES2;
		
		if(grossPay > INCOME1 + INCOME2)
			taxes += (grossPay - INCOME1 - INCOME2) * TAXES3;
	
		netPay = grossPay - taxes;
	
		printf("총소득 : $%.2f\n", grossPay);
		printf("세금 : $%.2f\n", taxes);
		printf("순이익 : $%.2f\n", netPay);	
	}
	printf("종료!\n");

	return 0;
}

09

하나의 정수를 입력으로 받아들여, 그 정수보다 작거나 같은 모든 소수(prime number)들을 출력하는 프로그램을 작성하라.

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
	int num;
	_Bool flag;

	printf("정수를 입력하세요 : ");
	scanf("%d", &num);

	for(int i = 1; i <= num; i++)
	{
		flag = false;
		for(int j = 2; (j * j) <= i; j++)
			if(i % j == 0) 
				flag = true;

		if(flag == false)
			printf("%d ", i);
	}
	printf("\n");

	return 0;
}

10

1988년의 미연방 소득 과세표는 아주 단순했다. 이 과세표에는 4가지 과세구분이 있고, 각각의 과세 구분은 두 가지 세율이 지정되어 있다. 다음은 이를 요약한 것이다. (달러 수치는 과세 대상 소득이다.)

예시

----------------------------------------------------
과세 구분				세율
----------------------------------------------------
독신					$17,850까지 15%, 초과분은 28%
가장					$23,900까지 15%, 초과분은 28%
맞벌이, 합산			  $29,750까지 15%, 초과분은 28%
맞벌이, 벌산			  $14,875까지 15%, 초과분은 28%
----------------------------------------------------

예를 들면, 연간 $20,000의 과세 대상 소득이 있는 독신 임금 노동자의 소득세는 0.15 X $17,850 + 0.28 X ($20,000 - $17,850)이다. 사용자에게 과세 구분과 과세 대상 소득을 입력하도록 요청하여, 소득세를 계산하는 프로그램을 작성하라. 여러 가지 세금 상황을 계산할 수 있도록 루프를 사용하라.

#include <stdio.h>

#define SINGLE 17850L
#define SINGLETAXES 0.15f
#define SINGLEOVERTAXES 0.28f

#define HOUSEHOLD 23900L
#define HOUSEHOLDTAXES 0.15f
#define HOUSEHOLDOVERTAXES 0.28f

#define DUALSUM 29750L
#define DUALSUMTAXES 0.15f
#define DUALSUMOVERTAXES 0.28f

#define DUALSEPARATE 14875L
#define DUALSEPARATETAXES 0.15f
#define DUALSEPARATEOVERTAXES 0.28f

int main(void)
{
	int num;
	long money;

	long income;
	float taxes, overTaxes;

	long totalTaxes;

	while(1)
	{
		printf("-------------------------------------------------------------\n");
		printf("과세 구분		세율\n");
		printf("-------------------------------------------------------------\n");
		printf("1) 독신			$%ld까지 %2.0f%%, 초과분은 %2.0f%%\n", 
			SINGLE, (SINGLETAXES * 100), (SINGLEOVERTAXES * 100));
		printf("2) 가장			$%ld까지 %2.0f%%, 초과분은 %2.0f%%\n",
			HOUSEHOLD, (HOUSEHOLDTAXES * 100), (HOUSEHOLDOVERTAXES * 100));
		printf("3) 맞벌이, 합산		$%ld까지 %2.0f%%, 초과분은 %2.0f%%\n",
			DUALSUM, (DUALSUMTAXES * 100), (DUALSUMOVERTAXES * 100));
		printf("4) 맞벌이, 벌산		$%ld까지 %2.0f%%, 초과분은 %2.0f%%\n",
			DUALSEPARATE, (DUALSEPARATETAXES * 100), (DUALSEPARATEOVERTAXES * 100));
		printf("5) 종료\n");
		printf("-------------------------------------------------------------\n");

		printf("과세 구분을 입력해주세요 : ");
		scanf("%d", &num);

		switch(num)
		{
			case 1: 
				income = SINGLE;
				taxes = SINGLETAXES;
				overTaxes = SINGLEOVERTAXES;
				break;
			case 2:
				income = HOUSEHOLD;
				taxes = HOUSEHOLDTAXES;
				overTaxes = HOUSEHOLDOVERTAXES;
					break;
			case 3: 
				income = DUALSUM;
				taxes = DUALSUMTAXES;
				overTaxes = DUALSUMOVERTAXES;
				break;
			case 4:
				income = DUALSEPARATE;
				taxes = DUALSEPARATETAXES;
				overTaxes = DUALSEPARATEOVERTAXES;
			case 5:
				break;
			default: 
				printf("잘못 입력했습니다.\n");
				continue;
		}
		if(num == 5) break;

		printf("소득을 입력해주세요 : ");
		scanf("%ld", &money);

		totalTaxes = (money > income ? (income * taxes) + 
				((money - income) * overTaxes)
				: (money * taxes));
		
		printf("총 소득세 : $%ld\n\n", totalTaxes);
	}
	printf("종료!\n");

	return 0;
}

11

인터넷 야채 쇼핑몰 총각네 야채가게는 아티초크(artichokes)를 파운드당 $2.05에, 비트(beets)를 파운드당 $1.5에, 당근(carrots)을 $1.09에 판매한다. 배송비를 제외하고 $100 또는 그 이상을 주문하면 5% 할인된다. 5파운드 미만의 주문은 배송비가 $6.50이다. 5파운드 이상 20파운드 미만의 주문은 배송비가 $14.00이다. 20파운드 이상의 주문은 기본 배송비 $14.00에 파운드당 $0.50씩 추가 배송비가 부과된다. 루프에서 사용자가 a를 입력하여 아티초크를, b를 입력하여 비트를, c를 입력하여 당근을 파운드 단위로 주문할 수 있게 하고, 마지막으로 q를 입력하여 주문을 끝낼 수 있는 프로그램을 switch문을 사용하여 작성하라. 즉, 비트 4파운드를 입력하고 나서 비트 5파운드를 입력하면 프로그램은 비트 9파은드를 보고해야 한다. 그러고 나서 프로그램은 총 구매 합산 비용, 할인 가격이 있다면 배송비를 포함한 총 청구 금액을 계산하여야 한다. 그러고 나서 프로그램은 총 구매 정보를 나타내야 한다. : 각 야채별 파은드당 가격, 주문 양, 각 야채당 주문 비용, 총 구매 합산, 할인가격(있을경우), 배송비, 총 청구 금액을 출력해야 한다.

#include <stdio.h>

#define ARTICHOKES 	2.05f
#define BEETS 		1.15f
#define CARROTS 	1.09f

#define DISCOUNTMONEY	100.0f
#define DISCOUNTPER	0.05f

#define DELIVERYPOUND1 	5
#define DELIVERYMONEY1	6.50f

#define DELIVERYPOUND2	20
#define DELIVERYMONEY2	14.00f

#define DELIVERYMONEY3	0.50f

int main(void)
{
	int artichokes = 0;
	int beets = 0;
	int carrots = 0;
	int sumpound = 0;

	float delivery;
	float totalsum;
	float discount;
	float totalclaim;

	int pound;
	char ch;

	while (1)
	{
		printf("=================================\n");
		printf("a) 아티초크(artichokes)\n");
		printf("b) 비트(beets)\n");
		printf("c) 당근(carrots)\n");
		printf("q) 주문 종료\n");
		printf("구매할 야채를 입력해주세요 : ");
		ch = getchar();
		switch(ch)
		{
			case 'a': 
			case 'b': 
			case 'c':
				printf("구매할 양을 파운드 단위로 입력 : ");
				scanf("%d", &pound);
				while(getchar() != '\n');
				break;
			case 'q':
				break;
			default:
				printf("잘못된 입력입니다.\n");
				continue;
		}
		if(ch == 'q') break;
		
		switch(ch)
		{
			case 'a':
				artichokes += pound;
				break;
			case 'b':
				beets += pound;
				break;
			case 'c':
				carrots += pound;
				break;
		}

		sumpound += pound;

		switch(sumpound)
		{
			case DELIVERYPOUND1:
				delivery = DELIVERYMONEY1;
				break;
			case DELIVERYPOUND2:
				delivery = DELIVERYMONEY2;
			default:
				delivery = DELIVERYMONEY2;
				delivery += 
					(sumpound - DELIVERYPOUND2) * DELIVERYMONEY3;
				break;
		}
	}
	printf("주문 결과\n");

	printf("아티초크 : %d파운드($%.2f) $%.2f\n", 
		artichokes, ARTICHOKES, artichokes * ARTICHOKES);
	printf("비트     : %d파운드($%.2f) $%.2f\n", beets, BEETS, 
		beets * BEETS);
	printf("당근 	 : %d파운드($%.2f) $%.2f\n", carrots, CARROTS,
		carrots * CARROTS);
	printf("총 구매 파운드 : %d\n", sumpound);

	totalsum = 0.0f;
	totalsum += artichokes * ARTICHOKES;
	totalsum += beets * BEETS;
	totalsum += carrots * CARROTS;
	printf("총 구매 합산 $%.2f\n", totalsum);

	totalclaim = totalsum;

	if(totalsum > DISCOUNTMONEY)
	{
		discount = totalsum * DISCOUNTPER;
		totalclaim -= discount;
		printf("할인 가격 : %.2f\n", discount);
	}
	
	printf("배송비 : %.2f\n", delivery);
	totalclaim += delivery;

	printf("총 청구 금액 : $%.2f\n", totalclaim);

	return 0;
}

0개의 댓글