본문 바로가기
흔한 학교 생활/든든한 C 프로그래밍

[C언어] 든든한 C 프로그래밍 3판 9장 워크북 답 풀이

by 흔한 학생 2023. 7. 8.
반응형

yundu.co.kr

 

 

1. level 1-1

names 배열에 kim lee han park uk 저장

빈 tmp 배열 정의

names 배열에서 tmp에 복사한 후 쉼표 추가

tmp 출력

 

실행결과 

tmp : kim,lee,han,park,uk

2. level 1-2

각 행의 점수 평균을 구하고 출력하는 프로그램

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

int main()
{
	int score[4][5] = { 78,90,34,46,80,98,74,84,76,72,76,48,34,72,89,61,91,67,88,83 };
	int i, j, sum = 0, row, col;
	
	row = sizeof(score)/sizeof(score[0]);
	col = sizeof(score[0])/sizeof(score[0][0]);

	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf("%d, ", score[i][j]);
			sum += score[i][j];
		}
		printf("=> %.2lf\n", (double)sum / col);
		sum = 0;
	}
	return 0;
}

전체 배열의 사이즈 에서 한 행의 사이즈를 나누면 row의 개수

한 행의 사이즈에서 한 행의 원소의 사이즈를 나누면 col의 개수

 

결과

78, 90, 34, 46, 80, => 65.60
98, 74, 84, 76, 72, => 80.80
76, 48, 34, 72, 89, => 63.80
61, 91, 67, 88, 83, => 78.00

 

 

3. level 1-3

성명을 입력받아 문자열에 저장한 후 출력하는 프로그램

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

int main()
{
	char names[10][20];
	int i, Cn;

	for (i = 0; i < 10; i++)
	{
		printf("%d, 성명? (입력종료:end) ", i + 1);
		gets(names[i]);//입력
		if (strcmp(names[i], "end")==0)
			break;//종료 조건
	}
	Cn = i;//입력된 인원수 저장

	printf("\n입력된 성명 =>  \n");
	for (i=0;i<Cn;i++)
		printf("%-10s,", names[i]);
	printf("\n");

	return 0;
}

end를 입력했을 때 종료되어야 한다. 이때 if문을 이용했다.

아무생각없이 names[i]=="end" 를 사용했는데 문자열은 strcmp 를 이용해야한다.

주의할 것


 


결과

1, 성명? (입력종료:end) 길동이
2, 성명? (입력종료:end) 춘향이
3, 성명? (입력종료:end) 까꿍이
4, 성명? (입력종료:end) 몽룡이
5, 성명? (입력종료:end) end

입력된 성명 =>
길동이    ,춘향이    ,까꿍이    ,몽룡이    ,

 

4. level 2-1

정답 배열과 비교해 학생들의 점수를 출력

#include <stdio.h>
#include <string.h>
#define stuSZ 5

int main()
{
	int answer[20] = { 1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4 };

	int student[stuSZ][20] = { {1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,1},
		{1,1,3,1,1,3,3,4,3,2,3,4,1,2,3,4,3,2,3,1},
		{4,3,1,1,1,2,3,4,1,2,2,4,2,2,3,4,4,2,3,2},
		{1,2,4,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4},
		{4,2,3,4,1,4,3,4,1,1,3,4,1,2,3,1,1,2,3,4} };
	int i, j, sum = 0;

	for (i = 0; i < stuSZ; i++)
	{
		for (j = 0; j < 20; j++)
		{
			if (answer[j]== student[i][j])
				sum += 5;
		}
		printf("%d번 점수: %d\n", i + 1, sum);
		sum = 0;
	}
	return 0;
}

 

결과

1번 점수: 95
2번 점수: 70
3번 점수: 60
4번 점수: 95
5번 점수: 80

 

5. level 2-2

#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)
#define STUDENT 4
#define SUBJECT 5
void heading();

int main()
{
	char names[STUDENT + 1][20] = {"홍길동","성춘향","진달래","개나리","한송이"};
	int score[STUDENT][SUBJECT + 2] = { 
		{78,90,34,46,80}, 
		{98,74,84,76,72},
		{76,48,34,72,89},
		{61,91,67,88,83} };
	int i, j, sum = 0, row, col;

	row = sizeof(score)/sizeof(score[0]);
	col = sizeof(score[0]) / sizeof(score[0][0]);

	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col - 2; j++)
		{
			sum += score[i][j]; //점수 합
		}
		score[i][5] = sum;
		score[i][6] = sum / (col - 2);//점수 평균
		sum = 0;
	}

	heading(); //타이틀 출력

	for (i = 0; i < row; i++)
	{
		printf("%5s, ", names[i]);
		for (j = 0; j < col; j++)
		{
			printf("%3d, ", score[i][j]);
		}
		printf("\n");
	}
	return 0;
}
void heading()
{
	printf("===========================================\n");
	printf("성명   국어 영어 수학 과학 사회 총점 평균\n");
	printf("===========================================\n");
}

결과

===========================================
성명   국어 영어 수학 과학 사회 총점 평균
===========================================
홍길동,  78,  90,  34,  46,  80, 328,  65,
성춘향,  98,  74,  84,  76,  72, 404,  80,
진달래,  76,  48,  34,  72,  89, 319,  63,
개나리,  61,  91,  67,  88,  83, 390,  78,

 

 

 

 

 

 

 

 

 


 

6. level 3-1

그저 노가다 문제로 보이는 문제

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

int main()
{

	int mat1[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int mat2[4][3] = { 13,14,15,16,17,18,19,20,21,22,23,24 };
	int matrix[3][3] = { 0 };
	int i, j, sum1 = 0, sum2 = 0, sum3 = 0;

	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 4; j++)
		{//행렬계산
			sum1 += mat1[i][j] * mat2[j][0];
			sum2 += mat1[i][j] * mat2[j][1];
			sum3 += mat1[i][j] * mat2[j][2];
		}
		matrix[i][0] = sum1;
		matrix[i][1] = sum2;
		matrix[i][2] = sum3;
		//matrix 배열에 합 대입
		sum1 = 0, sum2 = 0, sum3 = 0;

	}
	printf("3*4 mat1 행렬 \n");
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 4; j++)
			printf("%3d, ", mat1[i][j]);
		printf("\n");
	}
	printf("\n4*3  mat2 행렬 \n");
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 3; j++)
			printf("%3d, ", mat2[i][j]);
		printf("\n");
	}
	printf("\nmat1 * mat2을 곱하여 3*3을 구한 matrix 행렬 \n");
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
			printf("%3d, ", matrix[i][j]);
		printf("\n");
	}
	return 0;
}

결과

3*4 mat1 행렬
  1,   2,   3,   4,
  5,   6,   7,   8,
  9,  10,  11,  12,

4*3  mat2 행렬
 13,  14,  15,
 16,  17,  18,
 19,  20,  21,
 22,  23,  24,

mat1 * mat2을 곱하여 3*3을 구한 matrix 행렬
190, 200, 210,
470, 496, 522,
750, 792, 834,

 

7. level 3-2

 

전체 코드(일부 생략)

#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
int dayStartFunc(int year, int mon, int day);

int main()
{
	int inputDate, year, month, day;
	int dayStart;
	char days[7][10] = { "일","월","화","수","목","금","토" };

	scanf("%d", &inputDate);

	year = inputDate / 10000;
	month = inputDate % 10000 / 100;
	day = inputDate % 10000 % 100;

	dayStart = dayStartFunc(year, month, day);

	printf("\n%d년 %d월 %d 일은, %s요일\n", year, month, day, days[(dayStart) % 7 ==0? 0 : (dayStart) %7]);


	return 0;
}
int dayStartFunc(int year, int mon, int day)
{
	int yearMonth[] = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
	int i, t_day;

	t_day = 365 * (year-1);
	for (i = 1; i < year; i++)
		if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
			t_day++;

	for (i = 1; i < mon ; i++)
	{
		if (((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) && i == 2)
			t_day += 29;
		else
			t_day += yearMonth[i];
	}
	return t_day + day;
}

 

결과

20200609

2020년 6월 9 일은, 화요일
20200705

2020년 7월 5 일은, 일요일

 

 

반응형