Chapter06 프로그래밍 연습

milpy·2022년 4월 20일
0

C 기초 플러스 6판

목록 보기
9/18

01

26개의 원소를 가지는 배열을 만들고, 그 배열에 26개의 알파벳 소문자를 저장하는 프로그램을 작성하라. 이 프로그램은 배열의 내영도 출력해야 한다.

#include <stdio.h>

#define ALPHABET 26

int main(void)
{
	char chs[ALPHABET] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

	for (int i = 0; i < ALPHABET; i++)
	{
		printf("%c ", chs[i]);
	}
	printf("\n");

	return 0;
}

02

중첩 루프를 사용하여 다음과 같은 패턴을 출력하는 프로그램을 작성하라.

예시

$
$$
$$$
$$$$
$$$$$

답안

#include <stdio.h>

int main(void)
{
	for(int i = 0; i < 5; i++)
	{
		for(int j = 0; j <= i; j++)
			printf("$");
		printf("\n");
	}

	return 0;
}

03

중첩 루프를 사용하여 다음과 같은 패턴을 출력하는 프로그램을 작성하라.

예시

F
FE
FED
FEDC
FEDCB
FEDCBA

답안

#include <stdio.h>

#define ALPHABET 26

int main(void)
{
	char chs[ALPHABET] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	int start_ch = 'F';
	int cnt;

	for(int i = 0; i < ALPHABET; i++)
		if (chs[i] == start_ch)
			cnt = i;

	printf("%d\n", cnt);
	
	for(int i = 0; i <= cnt; i++)
	{
		for(int j = 0; j <= i; j++)
			printf("%c", chs [cnt - j]);
		printf("\n");
	}

	return 0;
}

04

중첩 루프를 사용하여 다음과 같은 패턴을 출력하는 프로그램을 작성하라.

예시

A
BC
DEF
GHIJ
KLMNO
PQRSTU

답안

#include <stdio.h>

#define ALPHABET 26

int main(void)
{
	char chs[ALPHABET] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	int ch_num = 0;
	int line_cnt = 6;

	for (int i = 0; i < line_cnt; i++)
	{
		for(int j = 0; j <= i; j++, ch_num++)
			printf("%c", chs[ch_num]);
		printf("\n");
	}

	return 0;
}

05

프로그램 사용자가 대문자를 입력하도록 한다. 중첩 루프를 사용하여 다음과 같은 피라미드 패턴을 출력하는 프로그램을 작성하라.

    A
   ABA
  ABCBA
 ABCDCBA
ABCDEDCBA

이 패턴은 입력된 문자까지 확장된다. 예를 들어, 앞에서 예로 주어진 패턴은 사용자가 E를 입력했을 때 얻어지는 결과이다. 힌트: 행을 처리하는 나하의 외부루트를 사용하라. 하나의 행에 3개의 내부루프를 사용하라. 하나는 프레이스를 처리하고, 다른하나는 오름차순으로 문자들을 출력하고, 마지막 하나는 내림차순으로 문자들을 출력한다. 사용자의 시스템이 ASCII코드 체계, 또는 연속된 수치 순서로 문자들을 나타내는 비슷한 코드 체계를 사용하지 않는다면, 연습 문제 3번에 있는 설명을 참조하라.

답안

#include <stdio.h>

#define ALPHABET 26

int main(void)
{
	char chs[ALPHABET] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	char inputCh;
	int lineCnt = -1;
	
	while(lineCnt == -1)
	{
		printf("대문자를 입력하시오 : ");
		scanf(" %c", &inputCh);	

		for(int i = 0; i < ALPHABET; i++)
			if(chs[i] == inputCh)
				lineCnt = i;
	}

	for(int i = 0; i <= lineCnt; i++)
	{
		for(int j = (i + 1); j <= lineCnt; j++)
			printf(" ");

		for(int j = 0; j <= i; j++)
			printf("%c", (chs[j]));

		for(int j = (i - 1); j >= 0; j--)
			printf("%c", (chs[j]));

		printf("\n");
	}

	return 0;
}

06

각 라인에 정수, 정수의 제곱 정수의 세제곱이 나란히 표시되는 표를 출력하는 프로그램을 작성하라. 프로그램은 표를 시작하는 정수와 마감하는 정수를 사용자에게 요청해야 한다. for 루프를 사용하라.

#include <stdio.h>

int main(void)
{
	int start, end;

	printf("표의 시작과 끝은 입력 : ");
	scanf("%d %d", &start, &end);

	for(int i = start; i <= end; i++)
	{
		printf("%d : %d : %d\n", i, (i * i), (i * i * i) );
	}

	return 0;
}

07

단어 하나를 읽어 문자 배열에 저장하고, 그것을 거꾸로 출력하는 프로그램을 작성하라, 힌트: strlen() 함수(4장)를 사용하여, 배열에 들어 있는 마지막 문자의 인덱스를 구하라.

#include <stdio.h>
#include <string.h>

int main(void)
{
	char str[10];
	int len;

	scanf("%s", str);

	len = strlen(str);

	for(int i = len; i >= 0; i--)
		printf("%c", str[i]);
	printf("\n");

	return 0;
}

08

사용자에게 두 개의 부동소수점 수를 요청하여, 그들의 차를 그들의 곱으로 나눈결과를 출력하는 프로그램을 작성하라. 사용자가 수치형이 아닌것을 입력할 때까지 두 수를 계속해서 입력받는 루프를 사용하라.

#include <stdio.h>

int main(void)
{
	float n1, n2;
	while( scanf("%f %f", &n1, &n2) == 2 )
	{
		printf("%f / %f = %f\n", (n1 - n2), (n1 * n2), 
				( (n1-n2) / (n1 * n2) ) );
	}

	return 0;
}

09

연습문제 08을 다시 작성하라. 이번에는 그 계산의 결과를 리턴하는 함수를 사용하라.

#include <stdio.h>

float cal(float , float);

int main(void)
{
	float n1, n2;
	while( scanf("%f %f", &n1, &n2) == 2 )
	{
		printf("%f / %f = %f\n", (n1 - n2), (n1 * n2), 
				( cal(n1, n2) ) );
	}

	return 0;
}

float cal(float n1, float n2)
{
	return (n1 - n2) / (n1 * n2);
}

10

사용자에게 정수로 하한과 상한을 입력하도록 요청하여, 하한의 제곱부터 상한의 제곱까지 제곱들의 합을 계산하여 출룍하는 프로그램을 작성하라. 이 프로그램은 사용자가 하한과 상한을 같게 입력하거나, 상한이 하한보다 작을 때 까지 반복한다. 실행 예는 다음과 같아야 한다.

예시

정수로 하한과 상한을 입력하시오: 5 9
25부터 81까지, 제곱들의 합은 255
다음 하한과 상한을 입력하시오: 3 25
9부터 625까지, 제곱들의 합은 5520
다음 하한과 상한을 입력하시오: 5 5
종료!

답안

#include <stdio.h>

int main(void)
{
	int num1, num2, sum;

	printf("정수로 하한과 상한을 입력하시오: ");
	scanf("%d %d", &num1, &num2);

	while( num1 < num2 )
	{
		sum = 0;
		for(int i = num1; i <= num2; i++)
			sum += i * i;
		
		printf("%d부터 %d까지, 제곱들의 합은 %d\n", 
				(num1 * num1), (num2 * num2), sum);

		printf("다음 하한과 상한을 입력하시오 : ");
		scanf("%d %d", &num1, &num2);
	}

	printf("종료!\n");

	return 0;
}

11

8개의 정수를 읽어 배열에 저장하고, 역순으로 출력하는 프로그램을 작성하라.

#include <stdio.h>

#define SIZE 8

int main(void)
{
	int num[SIZE];

	for(int i = 0; i < SIZE; i++)
		scanf("%d", &num[i]);

	for(int i = SIZE - 1; i >= 0; i--)
		printf("%d ", num[i]);
	printf("\n");
	
	return 0;
}

12

다음과 같은 두 개의 무한 수열이 있다고 가정하자.

1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + ...
1.0 - 1.0/2.0 - 1.0/3.0 - 1.0/4.0 - ...

사용자가 지정하는 항 수 한계까지 두 수열의 누계를 계산하는 프로그램을 작성하라. 힌트: -1의 홀수곱은 -1이고, -1의 짝수곱은 1이다. 항 수 한계는 사용자가 대화식으로 입력한다.; 0 또는 음수로 입력을 종료시키자. 100항, 1,000항, 10,000항까지의 누계를 출력하여, 각 수열이 어떤 값으로 수렴하는지 보여라. 수열이 같은 값으로 합쳐지는 것처럼 보이지 않는가?

답안

#include <stdio.h>

int main(void)
{
	double plus, minus;
	int cnt, i;

	printf("항 수 한계를 입력하라 : ");
	scanf("%d", &cnt);

	while(cnt > 0)
	{
		for(i = 2, plus = minus = 1.0; i <= cnt; i++)
		{
			plus += ((double)i - 1) / (double)i;
			minus -= ((double)i - 1) / (double)i;
		}
	
		printf("%f\n%f\n", plus, minus);

		printf("항 수 한계를 입력하라 : ");
		scanf("%d", &cnt);
	}

	return 0;
}

13

8개의 원소를 가진 int형 배열을 하나 만들고, 처음 8개의까지의 2의 멱승으로 그 배열의 원소들을 설정하고, 그 값들을 출력하는 프로그램을 작성하라. 값들을 설정할 때에는 for 루프를 사용하고, 출력할 때에는 do while 루프를 사용하라.

#include <stdio.h>

#define SIZE 8

int main(void)
{
	int num[SIZE];
	
	num[0] = 2;
	for(int i = 1; i < SIZE; i++)
		num[i] = num[i-1] * 2;
	
	int i = 0;
	do
	{
		printf("%d ", num[i]);
	} while( ++i < 8 );

	printf("\n");

	return 0;
}

14

8개의 double형 값을 원소로 가지는 배열1과 배열2를 만들고, 배열1을 위한 8개의 값을 루프를 통해 사용자로부터 입력받는 프로그램을 작성하라. 배열2의 원소들에는 배열1의 원소들의 누계를 넣는다.
예를 들어, 배열2의 네 번째 원소는 배열1의 네 번째 원소까지의 합이고, 배열2의 다섯 번째 원소는 배열1의 다섯 번째 원소까지의 합니다. (이 작업은 중첩 루프로 처리할 수있다. 그러나, 배열2의 다섯 번째 원소는 배열2의 네 번째 원소에 배열1의 다섯 번째 원소를 더한 것과 같다는 사실을 이용하여, 하나의 루프로도 처리할 수 있다). 마지막으로, 루프를 사용하여 두 배열의 내용을 출력하되, 배열1을 한 라인에 출력하고, 배열2의 각 원소들은 배열1의 대응되는 원소 아래에 출력된다.

#include <stdio.h>

#define SIZE 8

int main(void)
{
	double num1[SIZE], num2[SIZE];
	int i, j;

	for(i = 0; i < SIZE; i++)
	{
		scanf("%lf", &num1[i]);
		
		for(j = 0, num2[i] = num1[i]; j < i; j++)
			num2[i] += num1[j];
	}

	for(i = 0; i < SIZE; i++)
		printf("%8.3f ", num1[i]);
	printf("\n");

	for(i = 0; i < SIZE; i++)
		printf("%8.3f ", num2[i]);
	printf("\n");

	return 0;
}

15

한 라인의 입력을 읽고 그것을 거꾸로 출력하는 프로그램을 작성하라. 그 입력을 char형 배열에 저장할 수 있다. 입력 라인은 255문자보다 길지 않다고 가정한다. 입력으로부터 한 번에 한 문자씩 읽는 데에는 %c 포맷지정자와 함께 scanf() 함수를 사용할수 있고, 사용자가 Enter키를 누르면 개행 문자(\n)가 만들어진다는 것을 상기하라.

#include <stdio.h>

int main(void)
{
	char str[257];
	int cnt;

	for(cnt = 0; scanf("%c",&str[cnt]) && str[cnt] != '\n'; cnt++);

	for(int i = cnt - 1; i >= 0; i--)
		printf("%c", str[i]);
	printf("\n");

	return 0;
}

16

Daphne은 10% 단리로 100달러를 저축한다. (즉, 매년 원금의 10%에 해당하는 금액을 이자로 받는다.) Deirdre는 매년 5% 복리로 100달러를 저축한다. (즉, 이전에 받은 이자가 포함된, 현 잔고의 5%에 해당하는 금액을 이자로 받는다.) Deirdre의 저축액이 Daphne의 저축액을 초과하는 데 몇 년이 걸리는지 구하는 프로그램을 작성하라. 또한, 그 시점에서의 두 값을 출력하라.

#include <stdio.h>

#define SIMPLE_INTEREST 10.0f
#define COMPOUND_INTEREST 5.0f

int main(void)
{
	double dapn = 100.0f;
	double deir = 100.0f;

	double dapnTotal = dapn;
	double deirTotal = deir;

	int year = 0;

	while ( dapnTotal >= deirTotal )
	{
		year++;

		dapnTotal += (dapn * ( SIMPLE_INTEREST / 100.0f ) );
		deirTotal += (deir * ( COMPOUND_INTEREST / 100.0f ) );
		deir += ( deir * ( COMPOUND_INTEREST / 100.f ) );

		printf("%7.2f %7.2f\n", dapnTotal, deirTotal);
	}
	printf("\nyear : %d\n", year);


	return 0;
}

17

Chuckie Lucky는 로또 당첨으로 받은 백만 달러를 연이율 8%의 예금 계좌에 넣어두고, 매년 마지막 날에 $100,000를 인출하여 쓰려고 한다. 계좌에 잔고가 없어지려면 몇 년이 걸리는지 계산하는 프로그램을 작성하라.

#include <stdio.h>

#define INTEREST 8.0f

int main(void)
{
	long money = 1000000;
	int year = 0;

	while(money >= 0)
	{
		money -= 100000;
		money += money * (INTEREST / 100.0f);

		year++;
	}

	printf("\nyear : %d\n", year);

	return 0;
}

18

Rabnud 교수는 소셜 미디어 그룹에 합류했다. 초기에 그는 친구가 5명이었다. 그는 다음과 같은 방식으로 친구 수가 증가했다는 것을 알았다. 첫주에 한 친구가 그룹에서 탈퇴했고 남은 친구 수는 두 배가 됐다. 두 번째 주에서 친구 두 명이 그룹에서 탈퇴했고 남은 친구 수는 두 배가 됐다. 일반적으로 N번째 주에 친구 N명이 떨어져 나갔고, 남은 친구 수는 두 배가 됐다. 각 주별 친구의 수를 계산하여 나타내는 프로그램을 작성하라. 프로그램은 Dunbar의 수(Dunbar's number)를 초과할 때까지 계속되어야 한다. Dunbar의 수는 모든 구성원이 서로를 알고 관계를 맺을 수 있는 안정적인 사회적 대인 관계 수로 응집력 있는 사회적 집단의 최대 크기를 대략적으로 추정한 수이며 약 150이다.

#include <stdio.h>

int main(void)
{
	int friend = 5;
	int week;

	for(week = 1; friend <= 150; week++)
	{
		friend -= week;
		friend *= 2;
		
		printf("%d주 친구 수 : %d\n", week, friend);
	}

	return 0;
}

0개의 댓글