12주차 c언어 프로그래밍 수업 내용 및 수업 후 과제

2024. 5. 20. 16:43C프로그래밍/수업 내용 및 수업 후 과제

반응형
 
c언어로 콘솔 게임을 만들려고 해 100줄 내외의 게임을 10개만 추천해줘 - 마지막 주 수업시간에 할 내용

 

//7.24
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h >
int main(void)
{
int i, num, sum =0, total; //누적하는 변수 sum은 반드시 초기화할 것
printf("임의 개수의 수 평균을 구하는 프로그램입니다.\n");
printf("계산하려는 수는 몇 개입니까==");
scanf("%d", &total);
for (i =1; i <= total; i ++) {
printf("%d번째 수를 입력하세요=", i);
scanf("%d", &num); // &잘쓰기
sum += num;
}
printf("합은 %d, 평균은 %lf입니다.\n", sum, (double)sum / total);
return 0;
}
------- 아래의 내용을 위의 내용으로 간단하게 바꾸는 것
///for (;;) {}
//printf("1번째 수를 입력하세요=");
//scanf("%d, &num");
//sum = sum + num;
//printf("2번째 수를 입력하세요=");
//scanf("%d, &num");
//sum = sum + num;
//printf("3번째 수를 입력하세요=");
//scanf("%d, &num");
//sum = sum + num;
//7.24 무한루프를 걸어서 반복 될 수 있도록 하고 0를 입력해서 끝내는 프로그램
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h >
int main(void)
{
int i, num, sum =0, number; //누적하는 변수 sum은 반드시 초기화
for (;;) {
sum =0; // 매우 중요함
printf("몇개의 수의 합과 평균을 구하고 싶습니까(끝:0입력)==");
scanf("%d", &number);
if (number ==0) break;
for (i =1; i <= number; i ++) {
printf("%d번째 수를 입력하세요=", i);
scanf("%d", &num);
sum += num;
}
printf("합은 %d, 평균은 %lf입니다.\n", sum, (double)sum / number);
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h >
#include <limits.h >//INT_MIN, INT_MAX가 정의되어 있음
int main(void)
{
int i, num, sum =0, total, max = INT_MIN, min = INT_MAX; //누적하는 변수 sum은 반드시 초기화
// INT_MIN,MAX는 반드시 대문자로
// max는 int형으로 표현할 수 있는 가장 작은 값 INT_MIN으로 초기화
// min은 int형으로 표현할 수 있는 가장 큰 값 INT_MAX로 초기화
for (;;) { // 무한 반복문
sum =0, max = INT_MIN, min = INT_MAX; // 초기화 시키는게 제일 중요하다
printf("\n임의의 수의 평균을 구하는 프로그램입니다.\n");
printf("계산하려는 수는 몇 개입니까(끝내려면 0)==");
scanf("%d", &total); // 사용자로부터 계산할 수의 개수를 입력받음
if (total ==0) break; // 0을 입력하면 반복문 종료
for (i =1; i <= total; i ++) { // 입력받은 수의 개수만큼 반복
printf("%d번째 수를 입력하세요=", i);
scanf("%d", &num); // 사용자로부터 수를 입력받음
sum += num; // 입력받은 수를 sum에 누적
max = (num > max) ? num : max; // 현재 최댓값과 입력받은 수를 비교하여 더 큰 값을 max에 저장
min = (num < min) ? num : min; // 현재 최솟값과 입력받은 수를 비교하여 더 작은 값을 min에 저장
}
printf("합=%d,평균=%.2f, 최댓값=%d, 최솟값=%d\n", sum, (double)sum / total, max, min); // 합, 평균, 최댓값, 최솟값 출력
}
return 0;
}
이 프로그램은 사용자로부터 임의의 수를 입력받아 그 수들의 합, 평균, 최댓값, 최솟값을 계산하고 출력하는 기능을 수행합니다.
#include <limits.h > 헤더 파일을 포함하여 INT_MIN과 INT_MAX를 사용할 수 있게 합니다.
main() 함수에서 필요한 변수들을 선언하고 초기화합니다.
sum: 입력받은 수들의 합을 누적하는 변수
max: 입력받은 수들 중 가장 큰 값을 저장하는 변수
min: 입력받은 수들 중 가장 작은 값을 저장하는 변수
무한 반복문 for (;;)을 사용하여 사용자가 0을 입력할 때까지 계속해서 수를 입력받습니다.
각 반복마다 sum, max, min 변수를 초기화합니다.
사용자로부터 계산할 수의 개수 total을 입력받습니다.
total 개수만큼 반복하여 수를 입력받고, 다음을 수행합니다:
입력받은 수를 sum에 누적합니다.
현재 max와 입력받은 수를 비교하여 더 큰 값을 max에 저장합니다.
현재 min과 입력받은 수를 비교하여 더 작은 값을 min에 저장합니다.
최종적으로 sum, 평균, max, min을 출력합니다.
이 프로그램은 사용자가 0을 입력할 때까지 계속해서 수를 입력받고, 그 수들의 합, 평균, 최댓값, 최솟값을 계산하여 출력하는 기능을 수행합니다.
//7.25
#include <stdio.h >
int main(void)
{
int n, m;
for (n =1; n <=1000; n ++)
{
printf("%d ", n);
for (m =1; m <= n *10000; m ++);//점점 느리게 하는 부분
}
return 0;
}
//7.25 점점 빠르게
#include <stdio.h >
int main(void)
{
int n, m;
for (n =1; n <=1000; n ++)
{
printf("%d ", n);
for (m =1; m <=100000000 / n; m ++);//점점 빠르게 하는 부분
}
return 0;
}
// 점점 느리다가 빨라지게
#include <stdio.h >
int main(void)
{
int n, m;
for (n =1; n <=1000; n ++)
{
printf("사랑해! ");
for (m =1; m <= n *10000; m ++) // 점점 느리게 하는 부분
{
// 루프 내용이 없는 부분을 수정
}
}
for (n =1; n <=1000; n ++)
{
printf("사랑해! ");
for (m =1; m <=10000000 / n; m ++) // 점점 빠르게 하는 부분
{
// 루프 내용이 없는 부분을 수정
}
}
return 0;
}
7.25 변형
#include <stdio.h >
int main(void)
{
int n, m; // 두 개의 정수형 변수 n, m을 선언
puts("작업을 시작합니다."); // "작업을 시작합니다." 메시지를 출력
for (n =1; n <=100; n ++) { // 1부터 100까지 반복
printf("%d%%\b\b\b\b", n); // 현재 진행 상황을 퍼센트로 출력하고,
//백스페이스를 사용하여 퍼센트 출력을 지움
// 내부 루프: 현재 진행 상황에 따라 대기 시간을 설정
for (m =1; m <= n *1000000; m ++) {
// 아무 작업도 하지 않고 단순히 반복만 수행
}
}
puts("작업이 완료되었습니다."); // "작업이 완료되었습니다." 메시지를 출력
return 0; // 프로그램 종료
}
//printf 함수에서 '\b'를 사용하면
//백스페이스(backspace)로
//커서를 한 칸 왼쪽으로 이동
//7.26
#include <stdio.h >
int main(void)
{
int i, j;
for (i =1; i <=10; i ++) {
for (j =0; j < i; j ++) {
printf(" * ");
}
printf("\n");
}
return 0;
}
// p.51 예제
#include <stdio.h >
int main(void)
{
int dan, gop;
dan =2;
for (gop =1; gop <=9; gop ++) {
printf("%dx%d=%2d ", dan, gop, dan * gop);
}
printf("\n");
dan =3;
for (gop =1; gop <=9; gop ++) {
printf("%dx%d=%2d ", dan, gop, dan * gop);
}
printf("\n");
dan =4;
for (gop =1; gop <=9; gop ++) {
printf("%dx%d=%2d ", dan, gop, dan * gop);
}
printf("\n");
return 0;
}
// 위의 내용을 간단하게 19단으로 출력
#include <stdio.h >
int main(void)
{
int dan, gop;
for (dan =2; dan <=19; dan ++) { // 2단부터 19단까지 반복
for (gop =1; gop <=9; gop ++) { // 1부터 9까지 반복
printf("%2dx%d=%3d ", dan, gop, dan * gop); // 구구단 출력
}
printf("\n"); // 한 단 출력이 끝나면 줄바꿈
}
return 0; // 프로그램 종료
}
#include <stdio.h >
int main(void)
{
int dan, gop;
printf(" ◆ 구구단 표 ◆ \n"); //ㅁ한자키
for (dan =2; dan <=9; dan ++) printf(" %d단 │ ", dan);
printf("\n──────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼\n");//ㅂ한자키
for (gop =1; gop <=9; gop ++) {
for (dan =2; dan <=9; dan ++) { //곱
printf("%dx%d=%2d│ ", dan, gop, dan * gop);
}
printf("\n");
}
return 0;
}
○ for문과 while문의 차이
 
- for문은 반복 횟수가 명확할 때 사용하기 좋다.
초기값, 조건식, 증감식을 한 줄에 작성할 수 있어 코드가 간결하다.
- while문은 반복 횟수가 명확하지 않을 때 사용하기 좋다.
조건식을 먼저 작성하고, 초기값과 증감식을 별도로 작성해야 하므로
코드가 상대적으로 길어진다.
- 따라서 시작과 끝이 분명한 경우에는 for문을 사용하는 것이
코드의 가독성과 간결성 면에서 더 좋다.
최대 공약수를 구하는 문제는 (예제 7.28) 건너뜀.
○ while문을 이용한 무한 루프
조건식에 참인 값을 쓴다
0 이외의 어떠한 값도 가능하지만 보통 1을 쓴다
while(1){ //(0을 제외한 어떠한 숫자를 써도 되지만 참을 나타내는 1을 쓰는 것이 좋다)
반복 실행될 문장;
} // 뒤쪽에 ;을 써도 되지만 어색하기 떄문에 안쓰는게 좋다
do~while문
- do~while문은 while문처럼 미리 반복 횟수를 알 수 없고,
최소한 한번은 반복 문장을 실행할 경우에 많이 사용
do{
반복 실행될 문장;
}while(조건식);
- 일단 반복 실행될 문장을 한번 실행하고 while의 조건식을 검사한다.
조건이 참이면 루프 안에 반복 실행될 문장을 계속 실행하고 거짓이면 루프를 벗어남
- while(조건식) 다음에 세미콜론 (;)을 붙여야 하는 것을 조심
//7.29
#include <stdio.h >
#include <conio.h > //_getche()
int main(void)
{
char key;
printf("키 하나를 누르세요.\nq를 누르면 프로그램을 종료합니다 :\n");
// do {
key = _getche();
// } while (key != 'q');
printf("\n바이~~\n");
return 0;
}
//7.29 주석 제거
#include <stdio.h >
#include <conio.h > //_getche()
int main(void)
{
char key;
printf("키 하나를 누르세요.\nq를 누르면 프로그램을 종료합니다 :\n");
do {
key = _getche();
} while (key !='q');
printf("\n바이~~\n");
return 0;
}
소문자 q 혹은 대문자 Q를 입력했을 때 종료 되도록 매우 중요함
//7.29 1번째 방법 기말고사에 자주나오는 예제
#include <stdio.h >
#include <conio.h > //_getche()
int main(void)
{
char key;
printf("키 하나를 누르세요.\nq,Q를 누르면 프로그램을 종료합니다 :\n");
do {
key = _getche();
} while (key !='q'&&key !='Q'); // or(||)이 아닌 and(&&)를 사용해야 한다
printf("\n바이~~\n");
return 0;
}
-----------
while (key =='q' || key =='Q'); // 이렇게 되어 있는 부분을 드모르간의 법칙에 따라
while (key !='q'&&key !='Q'); // 이렇게 쓰거나
while (!(key =='q' || key =='Q')); // 참인 논리를 쓰고 not을 더 붙여서 쓴다
//7.30 0에서 100점 사이의 점수를 입력받아 Pass, Fail를 판단
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h >
int main(void)
{
int score;
printf("당신의 점수를 입력하고 Enter를 누르세요\n");
do {
printf("점수가 0에서 100사이의 값이 아니면 다시 입력해야 합니다:");
scanf("%d", &score);
} while (!(score >=0 && score <=100));
if (score <60) printf("60점 미만이므로 재수강해야 합니다.\n");
else printf("60점 이상이므로 Pass입니다.\n");
return 0;
}
//7.31 메뉴를 가지고 있는 프로그램의 기본 틀
// 게임 소스에서 많이 쓰고 do~while문을 사용한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h >
int main(void)
{
int menu;
do{
printf("1:추가\n");
printf("2:삭제\n");
printf("3:저장\n");
printf("원하는 작업을 선택하세요:");
scanf("%d",&menu);
}while(!(menu >=1 && menu <=3));
printf("%d를 선택했습니다.\n",menu);
return 0;
}
메뉴 추가
// 무한 루프 세가지 방법
#include <stdio.h >
int main(void)
{
for (; ;) {
printf("Hi ");
}
return 0;
}
#include <stdio.h >
int main(void)
{
while (1) {
printf("Hi ");
}
return 0;
}
#include <stdio.h >
int main(void)
{
do {
printf("Hi ");
} while (1); //;을 꼭 쓸 것.
return 0;
}
○ 분기문: break문
- 반복문(for, while, do~while)이나 switch~case문에서
안쪽 루프를 하나 벗어나는데 사용
- 무한 루프에는 특별한 조건에서 루프를 탈출 하도록 반드시 break문을 작성
for( ; ; ){ //무한 루프
printf("끝내려면 0+0을 입력하세요\n");
printf("계산하려는 수식(예:10+20)을 입력하세요:");
scanf("%d%c%d",&num1,&op,&num2);
if(num1==0 && num2==0) break;
:
} //for문 끝
//7.32 1부터 어떤 수까지 더해야 10,000이 넘는가? 기말고사에 나왔었음
#include <stdio.h >
int main(void)
{
int n =1, sum =0;
while (1) {
sum += n;
if (sum >10000) break;
++n;
}
printf("n=%d, sum=%d\n", n, sum);
return 0;
}
// 3의 배수로 하는 것
#include <stdio.h >
int main(void) 아래쪽 //을 지웠을 때 결과 →
{
int n =0;
long long int sum =0;
while (1) {
sum += n;
if (sum >100) break;
n +=3;
//printf("n=%d, sum=%lld\n", n, sum);
//내용을 넣으면 어떻게 더해지는지 출력되어 나온다
}
printf("n=%d, sum=%lld\n", n, sum);
return 0;
}
//을 쓰고 했을 때 결과 ↓
continue문
- for, while, do~while문에서 루프의 조건식을 검사하는 부분으로
다시 되돌아감
- break문처럼 루프를 빠져나가는 것이 아니라 돌던 루프의
continue 아래 부분을 실행하지 않고 다시 조건을 검사하는
부분으로 감
//7.33
#include <stdio.h >
int main(void)
{
int n;
for(n =1;n <=100;n ++)
{
if(n%2 ==0) continue;
printf("%3d ",n);
}
return 0;
}
○ goto문 - 시험에 나오지 않음
goto문은 무조건 해당 레이블로 분기
- goto label;
:
label : 문장;
- goto SS;
SS:
- goto문은 프로그램 어느 곳이라도 레이블을 만들어 바로 이동할 수 있는
편리함이 있지만 프로그램을 이해하기 어렵게 하므로 사용하지 않는 것이
좋음(일반적으로 쓸 일이 없다.)
- 루프가 다중으로 중첩되어 있는 경우 break문을 사용하더라도 루프 밖으로
완전히 빠져 나올 수 없는데 goto문을 사용하면 한 번에 다중 루프를 빠져
나올 수 있음
- 절대 쓰지 말 것
실습문제에서 시험문제 많이 나오니 모두 풀어볼 것
 
 
 
완성된 C 언어 BMI 계산기 코드
#include <stdio.h >
int main(void) {
double weight, height, bmi;
printf("신체질량지수(Body Mass Index:BMI)에 의한 비만도 \n");
printf("계산법으로 비만도를 측정해주는 프로그램입니다.\n");
printf("이 지수가 30 이상 고도비만, 25~29.9 비만, 23~24.9 과체중,\n");
printf("18.6∼22.9 정상, 18.5 이하 저체중으로 판정됩니다다.\n");
printf("체중을 입력하세요(kg)=");
scanf("%lf", &weight);
printf("키를 입력하세요(cm)=");
scanf("%lf", &height);
height = height /100.0; // 키를 m단위로 환산
bmi = weight / (height * height);
printf("당신의 BMI는 %.2f입니다.\n", bmi);
if (bmi >=30.0) {
printf("오 테러블~~고도비만입니다.\n");
} else if (bmi >=25.0 && bmi <30.0) {
printf("오 노우~~비만입니다.\n");
} else if (bmi >=23.0 && bmi <25.0) {
printf("웁스~~과체중입니다.\n");
} else if (bmi >=18.6 && bmi <23.0) {
printf("착한 몸매~~정상입니다.\n");
} else {
printf("야참이 필요한 당신~~저체중입니다.\n");
}
return 0;
}