C++/Report

3-2 연습문제.

gandus 2010. 4. 2. 22:11

 

1. 사용자로부터 일련의 데이터를 입력받아서 산술, 조화, 기하 평균을 구하는 프로그램을 작성하여 보자. 음수가 입력되면 데이터의 끝이라고 간주한다.

 

#include<iostream>

#include <math.h>

using namespace std;

 

int main()

{

int num, i; // 일련의데이터를저장

double temp[3]={0}; // 더한값들을저장

double a_avg=0, g_avg=0, h_avg=0; // 산술, 기하, 조화평균

 

cout << "원하는정수를입력하시오.(0보다작은수입력시종료) : "

cin >> num;cout<<endl;

if(num<=0)

return 0; // 0보다작을시종료

 

for(i=1; i<=num; i++)

{

temp[0] += i;

temp[1] += i*i;

temp[2] += 1/i;

}

a_avg = temp[0] / num; // 산술평균

g_avg = sqrt(temp[1]); // 기하평균

h_avg = num / temp[2]; // 조화평균

 

cout.setf(ios_base::fixed);

cout.precision(2);

 

cout << "산술평균: " << a_avg << endl;

cout << "기하평균: " << g_avg << endl;

cout << "조화평균: " << h_avg << endl;

cout << endl;

return 0;

} 

2. 특정한 정수를 읽어 들여서 0과 이 정수 사이에 있는 모든 3의 배수를 출력하는 프로그램을 작성하라. 만약 입력 정수값이 0보다 작으면 오류 메시지를 출력하라.

 

#include<iostream>

using namespace std;

 

int main()

{

int i, num;

 

cout<<"양의정수를입력하시오. : "

cin>>num; cout<<endl;

 

if(num <= 0)

{

cout<<"양의정수를입력하셔야합니다."

return 0;

}

for(i=3; i<=num; i+=3 )

{

if(i % 3 == 0)

cout<<i<<" "<<endl;

}

return 0;

}

  

 

3. 2와 100사이에 있는 모든 소수(Prime number)를 찾는 프로그램을 작성하라. 소수는 1과 자기 자신외에는 약수를 가지지 않는다.

#include<iostream>

using namespace std;

int main()

{

int i, j;

 

for(i=2; i<=100; i++)// 2 ~ 100 까지검색

{

for(j=2; j<=i; j++) // 2 ~ i값까지검색

{

if(i%j==0)

break

}

if(i==j) // i값을j로나눠서나머지가이면서

{ // 그값이i == j 일때소수이다.

cout << j << " "

}

}

cout<<endl;

return 0;

}

 

3. 기억력 테스트 게임을 작성하여 보자. 짧은 시간 안에 화면에 몇 개의 정수를 표시한다. 일정한 시간이 지나면 정수는 화면에서 사라진다. 게임 참가자는 이 정수들을 기억하고 있어야 한다. 게임 참가자는 정수가 화면에서 사라지면 원래의 순서대로 정수를 입력한다. 정수를 맞추면 다시 새로운 게임을 시작한다. 이 프로그램을 작성할 때 가장 어려운 점은 화면에 표시했던 정수를 지우는 것이다. 이것은 캐리지 리턴을 표시하는 \r문자를 출력하고 스페이스 문자를 연속으로 출력하면 가능하다. 또한 임의의 정수는 rand() 함수를 호출하면 얻을 수 있다.

 

#include<iostream>

#include<time.h>

#include<stdlib.h>

#include<windows.h>

using namespace std;

 

#define TIME 500 // 출력하는시간정의

 

int main()

{

srand((unsigned)time(NULL)); // 현시각을기준으로난수생성

 

char restart;

int out1, out2, out3; // 출력변수

int in1, in2, in3; // 입력변수

 

while(1)

{

out1 = rand() %10 + 1; // 난수생성

out2 = rand() %10 + 1;

out3 = rand() %10 + 1;

 

cout << "기억력테스트게임입니다." << endl;

cout << "화면에보이는숫자들을기억하였다가다시쓰면됩니다." << endl;

 

cout << out1 << " " << out2 << " " << out3 ;

 

Sleep(TIME); // 시간지연함수

 

cout << "\r \r" // 포인트를다시원점으로되돌린다.

cout << "입력하시오: "

cin>>in1 >>in2 >>in3;

 

if( out1 == in1 && out2 == in2 && out3 == in3 )

cout << "맞았습니다." << endl;

else

cout << "틀렸습니다." << endl;

 

cout << "다시하시겠습니까?(y/n) : " cin >> restart;cout << endl;

 

if(restart=='N' || restart=='n')

return 0;

else if(restart!='Y' && restart!='y')

continue

}

return 0;

}

 

   

5. 팩토리얼은 확률에서 많이 사용된다. 양의 정수 n의 팩토리얼은 n!은 1부터 n까지의 정수들을 곱한 것이다. 예를 들어서 5!은 다음과 같다.

 

5! = 5 * 4 * 3 * 2 * 1

5-1)for문을 이용하여 팩토리얼값을 출력하는 프로그램을 작성하라. 20!을 넘어가면 어떤 어려움이 있는가?

5-2)while문을 이용하여 팩토리얼값을 출력하는 프로그램을 작성하라. 20!을 넘어가면 어떤 어려움이 있는가?

 

#include<iostream>

using namespace std;

int main()

{

int num, b=1,i=1;

int check=0;

 

cout<<"n! 구하는프로그램입니다. for문(1) while문(2)"<<endl;

cout<<"원하는반복문을선택하시오. : "

cin>>check; cout<<endl;

 

cout << "정수를입력하시오. : "

cin >> num; cout<<endl;

 

switch(check)

{

case 1:

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

cout << " n n! " << endl;

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

 

for(i=1; i<=num; i++)

{

cout << i <<" "

b *= i;

cout << b << endl;

if(num*b/b != num) // 강의시간에배운내용

{

cout <<i << " 오버플로우발생"<< endl;

break

}

}

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

break // case 1 종료

 

 

case 2 :

 

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

cout << " n n! " << endl;

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

 

while(i<=num)

{

cout << i <<" "

b *= i;

cout << b << endl;

i++;

if(num*b/b != num)

{

cout <<i << " 오버플로우발생"<< endl;

break

}

}

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

 

break // case 2 종료

 

default:

cout<<"1과2중선택하시오."<<endl;

break

}

return 0;

}

 

6. 서로 다른 n개에서 r개를 택하여 일렬로 나열하는 방법의 수를 순열(Permuntation)이라 하고 nPr 로 표시한다. 순열은 다음과 같은 식을 이용하여 구할 수 있다. 순열을 구하는 프로그램을 작성하라. n과 r은 사용자가 입력할수 있도록 하라.

 

#include<iostream>

using namespace std;

 

int main()

{

int n, r, i,temp=0;

int p=1;// 순열(Permuntation)

 

cout<<"순열을구하는프로그램. N개중R개를나열하는프로그램입니다."<<endl;

cout<<"N 과R을입력하시오. : "

cin>> n >>r;

 

temp = n;

 

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

{

p *= temp;

temp--;

}

 

cout<<n <<" P "<<r <<"은"<<p <<"입니다."<<endl;

 

return 0;

}

 

7. 피보나치 수열은 다음과 같이 정의되는 수열이다.

피보나치 수열에서는 앞의 2개의 원소를 합하여 뒤의 원소를 만든다. 피보나치 수열에서 처음 멏 개의 원소를 나열하면 다음과 같다.

0,1,1,2,3,5,8,13,21,34,55......

피보나치 수열을 생성하는 프로그램을 작성하여라.

#include<iostream>

using namespace std;

 

int main()

{

int i, num;

int f0=0, f1=1, f2;

cout << "출력하고자하는피보나치수열의수(3이상정수) : "

cin >> num;

 

cout<<f0<<" " <<f1 <<" "

 

for(i=0; i < (num-2); i++)

{

f2=f0+f1;

cout << f2 << " "

 

f0=f1;

f1=f2;

}

cout<<endl;

}