본문 바로가기
IT/프로그래밍

C++ ESPRESSO 3장 실습문제 해설

by nutrient 2020. 12. 15.
728x90
728x170

C++ ESPRESSO 3장 실습문제 해설

 

C++ ESPRESSO 3장 실습문제 해설

 

1. 배열 days[]를 아래와 같이 초기화하고 배열 원소의 값을 다음과 같이 출력하는 프로그램을 작성하라.

#include <iostream>



using namespace std;



int main(void)

{

int days[] = {31,29,31,30,31,30,31,31,30,31,30,31}, i;

for(i = 0;i < 12; i++){

cout<<i+1<<"월은 "<<days[i]<<"일까지 있습니다."<<endl;

}

return 0;

}


<!--[endif]-->

 

 

2. 1차원 배열은 벡터라고도 불린다.

#include <iostream>



using namespace std;



void vector_add(int v1[],int v2[]);



int main(void)

{

int vector1[3] = {0}, vector2[3] = {0};

cout<<"벡터 x를 입력하시오(x1 x2 x3) : ";

cin>>vector1[0]>>vector1[1]>>vector1[2];

cout<<"벡터 y를 입력하시오(y1 y2 y3) : ";

cin>>vector2[0]>>vector2[1]>>vector2[2];

vector_add(vector1,vector2);

return 0;

}



void vector_add(int v1[],int v2[])

{

int vector[3] = {0}, i;



cout<<"벡터의 합은 vector ( ";

for(i = 0;i < 3; i++){

vector[i] = v1[i] + v2[i];

cout<<vector[i]<<" ";

}

cout<<")"<<endl;



}

 

 

 

3. 사용자로부터 20개 이하의 실수 자료를 읽어서 평균과 표준 편차를 계산하는 프로그램을 작성하라.

#include <iostream>

#include <cmath>



using namespace std;



void average(double number[]);

void standard(double number[],double ave);



int main(void)

{

double number[20];

int i;



cout<<"실수 20개를 입력하시오"<<endl;

for(i = 0;i < 20; i++){

cout<<">>";

cin>>number[i];

}

average(number);

return 0;

}



void average(double number[])

{

int i;

double ave = 0;



for(i = 0;i < 20; i++){

ave += number[i];

}

ave = ave/20;

cout<<"평균은 "<<ave<<endl;

standard(number, ave);

}

void standard(double number[], double ave)

{

int i;

double stand = 0;



for(i = 0;i < 20; i++){

stand += pow((number[i] - ave),2);



}

stand = sqrt(stand/20);

cout<<"표준편차는 "<<stand<<endl;

}

 

 

4. 0부터 9까지의 난수를 100번 생성하여 가장 많이 생성된 수를 출력하는 프로그램을 작성하시오.

#include <iostream>

#include <ctime>



using namespace std;



void GetNum(int num)

{

int i, chk_num=0, rnd = 0, lot = 0;

int count_arr[10] = {0};



for(i=0; i<num; i++){

rnd = rand() % 9 + 1;

switch(rnd){

case 0:

count_arr[0]++;

break;

case 1:

count_arr[1]++;

break;

case 2:

count_arr[2]++;

break;

case 3:

count_arr[3]++;

break;

case 4:

count_arr[4]++;

break;

case 5:

count_arr[5]++;

break;

case 6:

count_arr[6]++;

break;

case 7:

count_arr[7]++;

break;

case 8:

count_arr[8]++;

break;

case 9:

count_arr[9]++;

break;

}

}



chk_num = count_arr[0];

for(i=0 ; i< 9; i++)

{

if(chk_num < count_arr[i+1]){

chk_num = count_arr[i+1];

lot = i+1;

}

}



cout<<"▶ 수 : "<<lot<<" 총 : "<<chk_num<<" 생성!"<<endl;

}



int main()

{

srand(time(NULL));



cout<<"0부터 9까지의 난수를 100번 생성하여 가장많이 생성된 수는 ?\n";

GetNum(100);

return 0;

}

 

 

 

5. 다음 표의 각 행의 합계, 각 열의 합계를 구하는 프로그램을 작성하라.

#include <iostream>



using namespace std;



int main(void)

{

int table[3][5] = {{12,56,32,16,98},{99,56,34,41,3},{65,3,87,78,21}}, col[5] = {0}, row[3] = {0}, i, j;



for(i = 0;i < 3; i++){



for(j = 0;j < 5; j++){

row[i] += table[i][j];

col[j] += table[i][j];

}

}



for(i = 0;i < 3; i++){

cout<<i+1<<"번째 행의 합계 : "<<row[i]<<endl;

}

for(i = 0;i < 5; i++){

cout<<i+1<<"번째 열의 합계 : "<<col[i]<<endl;

}



return 0;

}

 

 

 

6. 2개의 정수 배열 a,b를 받아서 대응되는 배열 원소가 같은지를 검사하는 함수

array_equal(int a[], int b[], int size)를 작성하고 테스트하라.

#include <iostream>

#define ARR_SIZE 5



using namespace std;



int array_equal(int a[], int b[], int size);



int main()

{

int i;

int a[ARR_SIZE] = {1,2,3,4,5};

int b[ARR_SIZE] = {1,2,3,4,5};



cout<<"배열 A: ";

for(i=0; i < ARR_SIZE; i++)

cout<< a[i] <<"\t";

cout<<endl;



cout<<"배열 B: ";

for(i=0; i < ARR_SIZE; i++)

cout<< b[i] <<"\t";

cout<<endl;



if( array_equal(a,b, ARR_SIZE) == 1){

cout<<"배열 A와 배열 B의 전체 원소는 같습니다. "<<endl;

}

else{

cout<<"배열 A와 배열 B의 전체 원소는 같지 않습니다. "<<endl;

}

return 0;



}



int array_equal(int a[], int b[], int size)

{

int i;



for(i=0; i<size; i++){

if(a[i] != b[i])

return 0;

}



return 1;

}

 

 

7. 2차원 배열을 이용하여 tic-tac-toe 게임 프로그램을 작성하여 보시오.

#include <iostream>



using namespace std;



int main()

{

int i,j;

int ttt[3][3]={0};



//ttt[0][1] = 1; ttt[1][0] = 2; ttt[1][1] = 1; ttt[2][1] = 2;



for(i=0 ; i < 3; i++){

for(j=0 ; j < 3; j++){

cout<<"배열에 값을 입력하세요"<<"["<<i<<","<<j<<"] : ";

cin>>ttt[i][j];

}

}



for(i=0 ; i < 3; i++){

for(j=0 ; j < 3; j++){

if( ttt[i][j] == 0){

cout<<"■"<<"\t";

}

else if( ttt[i][j] == 1){

cout<<"○"<<"\t";

}

else if( ttt[i][j] == 2){

cout<<"×"<<"\t";

}

}

cout<<endl;

}

}

 

 

 

8. 학생들의 시험 점수를 통계 처리하는 프로그램을 작성하여 보라.

#include <iostream>

#define MAX_STU 10



using namespace std;



typedef struct Student{

int num;

int test1;

int test2;

int test3;

int h_s;

int l_s;

int sum;

double ave;

}STUDENT;



int MODE(int data[], int n);

void bubble_sort(STUDENT *std, int n);

void bubble_sort(int *a, int n);



int main()

{

int i;

int tmp=0;

int mid1[MAX_STU]={0}, mid2[MAX_STU]={0}, mid3[MAX_STU]={0};

int mode1 = 0, mode2 = 0, mode3 = 0;

double h_s[3]={0}, l_s[3]={0}, sum[3]={0}, ave[3]={0};

int stu_count = 0;

STUDENT std[MAX_STU];



cout<<"학생 수를 입력하세요 : ";

cin>>stu_count;



for(i=0; i < stu_count; i++)

{

cout<<"학번 시험#1 시험#2 시험#3 (ex 1 30 10 11) : ";

cin>>std[i].num>>std[i].test1>>std[i].test2>>std[i].test3;



sum[0] = sum[0] + std[i].test1;

sum[1] = sum[1] + std[i].test2;

sum[2] = sum[2] + std[i].test3;



mid1[i] = std[i].test1;

mid2[i] = std[i].test2;

mid3[i] = std[i].test3;



std[i].sum = (std[i].test1 + std[i].test2 + std[i].test3);

std[i].ave = std[i].sum / 3;



if(std[i].test1 > std[i].test2){



if( std[i].test1 > std[i].test3 ){

std[i].h_s = std[i].test1;

if( std[i].test2 > std[i].test3 )

std[i].l_s = std[i].test3;

else

std[i].l_s = std[i].test2;

}

else{

std[i].h_s = std[i].test3;

if( std[i].test1 > std[i].test2 )

std[i].l_s = std[i].test2;

else

std[i].l_s = std[i].test1;

}

}

else{

if( std[i].test2 > std[i].test3 ){

std[i].h_s = std[i].test2;

if( std[i].test1 > std[i].test3 )

std[i].l_s = std[i].test3;

else

std[i].l_s = std[i].test1;

}

else{

std[i].h_s = std[i].test3; // test2 <test3

if( std[i].test1 > std[i].test2 )

std[i].l_s = std[i].test2;

else

std[i].l_s = std[i].test1;

}



}



}



mode1 = MODE(mid1, stu_count);

mode2 = MODE(mid2, stu_count);

mode3 = MODE(mid3, stu_count);





bubble_sort(mid1, stu_count);

bubble_sort(mid2, stu_count);

bubble_sort(mid3, stu_count);



h_s[0] = std[0].test1;

h_s[1] = std[0].test2;

h_s[2] = std[0].test3;

l_s[0] = std[0].test1;

l_s[1] = std[0].test2;

l_s[2] = std[0].test3;



for(i=1; i< stu_count; i++){

if(h_s[0] < std[i].test1)

h_s[0] = std[i].test1;

if(h_s[1] < std[i].test2)

h_s[1] = std[i].test2;

if(h_s[2] < std[i].test3)

h_s[2] = std[i].test3;

if(l_s[0] > std[i].test1)

l_s[0] = std[i].test1;

if(l_s[1] > std[i].test2)

l_s[1] = std[i].test2;

if(l_s[2] > std[i].test3)

l_s[2] = std[i].test3;

}



ave[0] = sum[0] / stu_count;

ave[1] = sum[1] / stu_count;

ave[2] = sum[2] / stu_count;





cout<<endl<<endl;

cout<<" + 학생 성적 +"<<endl;

cout<<"-------------------------------------------------------------"<<endl;

cout<<" 학번 시험#1 시험#2 시험#3 최고 최저 평균 총점"<<endl;

cout<<"-------------------------------------------------------------"<<endl;



for(i=0; i < stu_count; i++)

{

cout<<" "<<std[i].num<<"\t"<<std[i].test1<<"\t"<<std[i].test2<<"\t"<<std[i].test3<<"\t"<<std[i].h_s<<"\t"<<std[i].l_s<<"\t"<<std[i].ave<<"\t"<<std[i].sum<<endl;

}



cout<<"-------------------------------------------------------------"<<endl;

cout<<" 시험#1 최대 점수 : "<<h_s[0]<<", 최저 점수 : "<<l_s[0]<<", 평균 점수 : "<<ave[0]<<endl;

cout<<" 시험#2 최대 점수 : "<<h_s[1]<<", 최저 점수 : "<<l_s[1]<<", 평균 점수 : "<<ave[1]<<endl;

cout<<" 시험#3 최대 점수 : "<<h_s[2]<<", 최저 점수 : "<<l_s[2]<<", 평균 점수 : "<<ave[2]<<endl;

cout<<"-------------------------------------------------------------"<<endl;



cout<<"-------------------------------------------------------------"<<endl;

cout<<" 시험#1 산술 평균 : "<<ave[0]<<", 중간값 : "<<mid1[stu_count/2]<<", 모드값(최빈값) : "<<mode1<<endl;

cout<<" 시험#2 산술 평균 : "<<ave[1]<<", 중간값 : "<<mid2[stu_count/2]<<", 모드값(최빈값) : "<<mode2<<endl;

cout<<" 시험#3 산술 평균 : "<<ave[2]<<", 중간값 : "<<mid3[stu_count/2]<<", 모드값(최빈값) : "<<mode3<<endl;

cout<<"-------------------------------------------------------------"<<endl<<endl;;

cout<<" + 학생 성적(총점 석차순) +"<<endl;

cout<<"-------------------------------------------------------------"<<endl;

cout<<" 학번 시험#1 시험#2 시험#3 최고 최저 평균 총점"<<endl;

cout<<"-------------------------------------------------------------"<<endl;





bubble_sort(std, stu_count);



for(i=0; i < stu_count; i++)

{

cout<<" "<<std[i].num<<"\t"<<std[i].test1<<"\t"<<std[i].test2<<"\t"<<std[i].test3<<"\t"<<std[i].h_s<<"\t"<<std[i].l_s<<"\t"<<std[i].ave<<"\t"<<std[i].sum<<endl;

}







return 0;

}



void bubble_sort(int *a, int n)

{

int temp;

int i, j;



for(i=0; i < n-1 ; i++){

for(j=0; j < n-i-1; j++){

if(a[j] > a[j+1])

{

temp = a[j];

a[j] = a[j+1];

a[j+1] = temp;

}

}

}



}



void bubble_sort(STUDENT *std, int n)

{

STUDENT temp;

int i, j;



for(i=0; i < n-1 ; i++){

for(j=0; j < n-i-1; j++){

if(std[j].sum > std[j+1].sum)

{

temp = std[j];

std[j] = std[j+1];

std[j+1] = temp;

}

}

}



}



int MODE(int data[], int n)

{

int i, j;

int count;

int Max_C = 0;

int Max_I = 0;



for(i=0; i< n; i++){

count = 0;

for(j=0; j< n; j++)

{

if(data[i] == data[j])

count++;

}

if(count > Max_C)

{

Max_C = count;

Max_I = i;

}

if(count > n / 2)

break;

}

return data[Max_I];

}

 

 

9. 배열 A[]를 배열 B[]에 복사하는 함수를 작성하고 테스트하라.

#include <iostream>



using namespace std;

void copy(int *A, int *B, int n);



int main ()

{

int A[] = {1,2,3,4,5}, B[] = {6,7,8,9,10}, n = 0;

cout<<"A[] = {1,2,3,4,5}"<<endl;

cout<<"B[] = {6,7,8,9,10}"<<endl;

cout<<endl;

copy(A,B,5);

return 0;

}

void copy(int *A, int *B, int n)

{

int *C = NULL, i;

C = B;

B = A;

A = C;



cout<<"A[] = {";

for(i = 0;i < n; i++){

if(i == n-1)

cout<<A[i];

else

cout<<A[i]<<",";



}

cout<<"}"<<endl;

cout<<"B[] = {";

for(i = 0;i < n; i++){

if(i == n-1)

cout<<B[i];

else

cout<<B[i]<<",";

}

cout<<"}"<<endl;

}

 

 

 

10. 배열 A[]에서 주어진 숫자를 탐색하여 숫자를 가리키는 포인터를 반환하는 다음과 같은 원형을 가지는 함수를 작성하고 테스트하라.

#include <iostream>

#define MAX_SIZE 10



using namespace std;

void print(int *A, int size);

int *search(int *A, int n);



int main ()

{

int a[MAX_SIZE] = {1,2,3,4,5,6,7,8,9,10}, n =0, *ps = NULL;

print(a,MAX_SIZE);



cout<<"탐색할 수를 입력하시오 : ";

cin>>n;



ps = search(a,n);



if(*ps == -1){

cout<<"못찾았습니다."<<endl;

}

else{

cout<<"찾았습니다 : "<<*ps<<endl;

}



return 0;

}



int *search(int *A, int n)

{

int x = -1;

for(int i = 0;i < MAX_SIZE;i++){

if(*A+i == n){

return A+i;

}

}



return &x;

}

void print(int *A,int size)

{

cout<<"A[] = { ";

for(int i = 0;i < size;i++){

cout<<A[i]<<" ";

}

cout<<"}"<<endl;

}

 

 

11. 실수값들이 저장되어 있는 double형 배열 A{]에서 평균값, 최대값, 전체의 합을 계산하여 포인터 인수를 통하여 반환하는 함수 get_stat(double A[], double *p_avg, double *p_max, double *p_sum)을 구현하라.

#include <iostream>

#define MAX_SIZE 10



using namespace std;



void get_stat(double A[], double *p_avg, double *p_sum, double *p_max);



int main ()

{

double a[MAX_SIZE] = {1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.3}, sum = 0, avg = 0, max = 0;

double *p_sum = &sum;

double *p_avg = &avg;

double *p_max = &max;



cout<<"A[] = { ";

for(int i = 0;i < MAX_SIZE;i++){

cout<<a[i]<<" ";

}

cout<<"}"<<endl;



get_stat(a,p_avg,p_sum,p_max);



cout<<"총합 : "<<sum<<endl;

cout<<"총 평균 : "<<avg<<endl;

cout<<"최대값 : "<<max<<endl;



return 0;

}

void get_stat(double A[], double *p_avg, double *p_sum, double *p_max)

{



for(int i = 0;i < MAX_SIZE;i++){

*p_sum += A[i];

if(*p_max < A[i]){

*p_max = A[i];

}

}

*p_avg = (*p_sum) / MAX_SIZE;

}

 

 

12. 간단한 철자 교정 프로그램을 작성하여 보자.

#include <iostream>

#define SIZE 100



using namespace std;



void ChangeText(char *str, int size);



int main()

{

char input[SIZE];



cin.getline(input, SIZE);

cout<<" 입력문 : "<<input<<endl;

ChangeText(input, SIZE);

cout<<" 변경문 : "<<input<<endl;



}

void ChangeText(char *str, int size)

{

int i;



if(str[0] >= 'a' && str[0] <= 'z')

str[0] = str[0] - 32;



for(i=0; i<size;i++){

if(str[i] == NULL){

if(str[i-1] != '.'){

str[i] = '.';

str[i+1] = NULL;

}

break;

}

}



}

 

 

13. 간단한 “찾아 바꾸기” 기능을 구현하여 보자.

#include <iostream>

#define SIZE 81



using namespace std;



int main()

{

char str[SIZE], tmp[SIZE];

char findStr[SIZE], replaceStr[SIZE];



char* pStr;



cout<<"문자열을 입력하시오: ";

cin.getline(str, 81);



cout<<"찾을 문자열: ";

cin.getline(findStr,81);



cout<<"바꿀 문자열: ";

cin.getline(replaceStr,81);

pStr = strstr(str, findStr);



if(findStr == NULL)

cout<<"입력하신 문자열을 찾을 수 없습니다."<<endl;



strncpy(tmp, str, (pStr-str));

tmp[pStr-str] = NULL;

strcat(tmp, replaceStr);

strcat(tmp, pStr+strlen(findStr));



strcpy(str, tmp);



cout<<"결과: "<<str<<endl;



return 0;

}
728x90
그리드형

댓글