티스토리 뷰
위 글에 이어서 작성되었습니다.
조건문과 반복문
짝수 홀수 구별하기
#include <stdio.h>
int main(void)
{
int num;
printf("정수를 입력하시오: ");
scanf("%d", &num);
if (num % 2 == 0) // num을 2로 나눈 나머지가 0일 때
printf("%d 는 짝수입니다.", num);
else
printf("%d 는 홀수입니다.", num);
return 0;
}
정수를 입력받아 짝수와 홀수로 구별하는 프로그램이다. 먼저 정수형 변수 num을 선언한뒤 scanf로 사용자로부터 값을 입력받는다. if문을 사용하여 num을 2로 나눈 나머지가 0 이라면 짝수라고 출력하고 아니라면 홀수라고 출력한다.
간단한 신호등 구현하기
#include <stdio.h>
int main(void)
{
char light; // char = 문자형변수 선언
printf("신호등의 색깔 입력(R, G, Y): ");
scanf("%c", &light);
if (light == 'R') // " " 가 아닌 ' '를 사용한다
printf("정지!\n");
else if (light == 'G')
printf("주의!\n");
else
printf("진행!\n");
return 0;
}
신호등의 색깔(R, G, Y)을 입력받아 각각의 색마다 다른 문장을 출력하는 프로그램이다. 문자형 변수 light를 선언한 뒤, scanf로 문자를 입력받는다. light에 R을 입력받을시에는 ‘정지!’를 출력하고, G를 입력 받을시에는 ‘주의!’를 그외에는 ‘진행!’이 나타나도록 조건문을 짠다.
두수의 합/차 계산하기
#include <stdio.h>
int main(void)
{
int num1, num2, sum, minus;
printf("정수를 입력하시오:");
scanf("%d", &num1);
printf("정수를 입력하시오:");
scanf("%d", &num2);
sum = (num1 + num2);
printf("두수의 합은 %d입니다.\n", sum);
minus = (num1 - num2);
if (minus >= 0)
printf("두수의 차는 %d입니다.\n", minus);
else
printf("두수의 차는 %d입니다.\n", -minus);
return 0;
}
사용자로부터 두 정수를 입력받아, 두수의 합과 차를 출력하는 프로그램이다. 정수형 변수 num1, num2, sum, minus를 선언한 뒤, scanf로 num1, num2의 값을 입력받는다. 두 수의 합을 계산해 변수 sum에 저장하고 출력한다. 두 수의 차는 minus 일단 num1에서 num2를 빼고 양수면 그냥 출력하고 음수면 -minus값을 출력한다.
+ 지금이라면 이렇게 짰을것 같네요.
#include <stdio.h>
int main(void)
{
int num1, num2;
printf("정수를 입력하시오:");
scanf("%d", &num1);
printf("정수를 입력하시오:");
scanf("%d", &num2);
printf("두수의 합은 %d입니다.\n", num1 + num2);
if (num1 >= num2)
printf("두수의 차는 %d입니다.\n", num1 - num2);
else
printf("두수의 차는 %d입니다.\n", num2 - num1);
return 0;
}
삼각형의 종류 출력하기
#include <stdio.h>
int main(void)
{
int side1, side2, side3;
printf("삼각형의 세변을 입력하시오:\n");
scanf("%d %d %d", &side1, &side2, &side3);
if (side1 == side2 && side2 == side3)
printf("정삼각형\n");
else if (side1 == side2 || side2 == side3 || side3 == side1)
printf("이등변 삼각형\n");
else
printf("일반 삼각형\n");
return 0;
}
사용자로부터 삼각형의 세변을 입력받고 정삼각형, 이등변 삼각형, 일반 삼각형으로 구별하는 프로그램이다. 세변의 길이를 저장할 정수현 변수를 scanf를 사용하여 사용자로부터 값을 입력받는다. 조건문으로 세변이 같은 경우(side1 == side2 && side2 == side3)에는 ‘정삼각형’ 이라고 출력하고 세변 중 두변이 같을 경우에는( side1 == side2 || side2 == side3 || side3 == side1) ‘이등변 삼각형이라고 출력하도록 하였으며, 앞의 두 조건에 해당되지 않는 경우에는 ‘일반삼각형’을 출력하도록 하였다.
과세표준에 따른 소득세 계산
아래 과세표준을 참고하여 금액에따라 소득세를 계산하는 문제이다.
과세표준 | 세율 |
1000만원 이하 | 8% |
1000만원 초과 4000만원 이하 | 17% |
4000만원 초과 8000만원 이하 | 26% |
8000만원 초과 | 35% |
#include <stdio.h>
#include <math.h>
int main(void)
{
int money, tax;
printf("과세 표준을 입력하시오(만원): ");
scanf_s("%d", &money);
if (money <= 1000)
tax = (money * 8 / 100);
else if (money > 1000 && money <= 4000)
tax = 80 + ((money - 1000) * 17 / 100);
else if (money > 4000 && money <= 8000)
tax = 590 + ((money - 4000) * 26 / 100);
else
tax = 1550 + ((money - 8000) * 35 / 100);
printf("소득세는 %d만원 입니다\n", tax);
return 0;
}
이 문제의 핵심은 소득세 계산 방식을 이해하는 것인데, 과세표준의 기준금액에서와 초과금액의 세율이 달라지기 때문에 유의해야 한다. 먼저 과세표준을 입력받을 money와 소득세 tax를 정수형 변수로 선언한 뒤 사용자가 입력한 과세표준에 따라 조건문을 작성한다.
시험 평균 계산하기
#include <stdio.h>
int main(void)
{
int midterm, final;
float average;
char score;
printf("중간 고사 점수를 입력하시오 :");
scanf("%d", &midterm);
printf("기말 고사 점수를 입력하시오 :");
scanf("%d", &final);
average = (midterm + final) / 2.0;
if (average >= 90.0)
score = 'A';
else if (average >= 80.0)
score = 'B';
else if (average >= 70.0)
score = 'C';
else if (average >= 60.0)
score = 'D';
else
score = 'F';
printf("당신의 학점은 %c입니다.", score);
return 0;
}
중간고사와 기말고사의 평균을 기준으로 학점을 나타내는 프로그램이다. scanf를 사용해 사용자로 부터 두개의 점수를 입력받아 평균을 계산해 average에 저장한다. 이어서 조건문을 이용해 평균 점수에 따라 score에 A, B, C.. 의 문자를 저장하고 출력한다.
다항식의 실근 계산하기
#include <stdio.h>
#include <math.h>
int main(void)
{
int a, b, c;
double answer1, answer2;
printf("계수 a를 입력하시오 : ");
scanf("%d", &a);
printf("계수 b를 입력하시오 : ");
scanf("%d", &b);
printf("계수 c를 입력하시오 : ");
scanf("%d", &c);
if (a == 0) {
answer1 = -c / b;
printf("위의 이차방정식의 실근은 %lf입니다.", answer1);
}
else if (sqrt(b*b - 4 * a*c) < 0)
printf("실근이 존재 하지 않습니다.");
else {
answer1 = (-b + sqrt((b*b) - (4 * (a*c)))) / (2 * a); //sqrt :제곱근
answer2 = (-b - sqrt((b*b) - (4 * (a*c)))) / (2 * a);
printf("위의 이차 방정식의 실근은 %.2lf과 %.2lf입니다.", answer1, answer2);
}
return 0;
}
다항식의 계수를 입력받아 실근을 출력하는 프로그램이다. 먼저 정수형 변수 a, b, c를 입력받는다. 실근을 저장할 answer1, answer2는 실수 형태로 출력하기 위해 double로 선언한다. scanf를 사용하여 계수 a, b, c를 입력받은 후 if문, else if, else 문을 사용하여 조건문에 따라 다른 결과값이 출력 되도록하였다.
계수 a가 0일때에는 -c/b의 값을 출력하고, 판별식이 음수일때는 실근이 존재하지 않습니다 를 출력한다. 그외에는 근의 공식을 사용해 실근을 계산해 출력한다. 이 때 소수점은 2자리까지만 표시한다.
제곱의 합 구하기
#include <stdio.h>
int main(void)
{
int n, answer = 0;
printf("n의 값을 입력하시오 : ");
scanf_s("%d", &n);
for (int i = 1; i <= n; i++)
answer = answer + (i * i);
printf("계산값은 %d입니다.", answer);
return 0;
}
n까지의 제곱의 합을 구하는 프로그램이다. scanf로 사용자로부터 정수형 변수 n의 값을 입력 받는다. 이를 이용해 반복문으로 i가 1부터 n까지 증가하며 answer에 \( i^2\)이 누적해 더해지도록 한다.
for문 무한루프
#include <stdio.h>
int main(void)
{
int i = 1, sum = 0;
for (;;)
{
sum = sum + i;
if (sum > 10000) break;
i++;
}
printf("1부터 %d까지의 합이 %d입니다.", i - 1, sum - i);
return 0;
}
1부터 n까지의 합 중 10,000을 넘지 않으면서 가장 큰 값을 구하는 프로그램이다. 정수형 변수 sum을 0으로 초기화 하고, for문에서 i를 1부터 증가시키며 누적해 더한다. 10,000을 초과할 때 for문을 빠져나오면서 종료된다.
+ for 문 생략??
for문은 for( 초기식 ; 조건식 ; 증감식 )의 구조를 가지고 있다. 각각의 식은 생략할 수 있는데, 그냥 참값으로 인식하기 때문이다. 그래서 위처럼 완전히 비우게 되면 무한루프문으로 사용할 수 있다. 단 세미콜론은 꼭! 입력해야 한다.
Gregory-Leibniz 무한수열로 파이 구하기
#include <stdio.h>
int main(void)
{
int x;
int y = 1; // 분모
int z = 1; // 부호 변환
double Pi = 0;
printf("반복횟수 : ");
scanf("%d", &x);
for (int i = 1; i <= x; i++) {
Pi += (4.0 / y) * z;
y += 2;
z *= -1;
}
printf("Pi = %lf", Pi);
return 0;
}
Gregory-Leibniz의 무한수열을 사용하여 파이(π)를 계산하는 프로그램이다. 사용자로부터 반복횟수 x의 값을 입력받은뒤 for문을 사용하여 수식을 계산한다. 분모 y의 값은 2씩 커지게 하고 z에는 -1 곱해 부호를 반전시키며 x번만큼 Pi값에 누적해 더한다.
약수 구하기
#include <stdio.h>
int main(void)
{
int i, input;
printf("Enter a positive integer : ");
scanf_s("%d", &input);
printf("Factors of %d are:", input);
for (i = 1; i <= input; i++) {
if (input % i == 0)
printf("%d ", i);
}
return 0;
}
정수를 입력받아 그 정수의 모든 약수를 출력하는 프로그램이다. 먼저 scanf를 이용해 정수 input을 입력받는다. 그리고 for 문을 통해 1부터 input까지 i를 증가 시키며 나머지가 0인 숫자들을 출력한다.
뉴턴법으로 제곱근 구하기
#include <stdio.h>
int main(void)
{
int input;
double result = 2;
printf("어떤 수의 제곱근을 알고싶으신가요? : ");
scanf_s("%d", &input);
for (int i = 1; i <= 10000; i++)
result = (result + (input / result)) / 2;
printf("제곱근은 %lf", result);
return 0;
}
정수를 입력받아 뉴턴의 방법을 이용해 제곱근을 구하는 프로그램이다. 먼저 scanf_s를 이용해 정수 input을 입력 받는다. double형 변수 result는 먼저 2로 초기화 한 뒤 뉴턴법으로 제곱근이 구해지도록 공식을 작성한다. 10,000번 반복해 값을 구하도록 한다.
rand( )
도박 목표금액 도달 확률 계산
#include <stdio.h>
#include <stdlib.h> // rand() 사용
#include <time.h> // time() 사용
#include <Windows.h> // 윈도우와 관련된 헤더파일을 불러옴
#pragma warning (disable : 4996)
int main(void)
{
srand(GetTickCount64());
// srand() : rand() 함수의 시드를 부여
// GetTickCount64: Windows부팅할 때부터 지나간 시간을 msec 단위로 돌려주는 함수
int wins = 0;
for (int k = 0; k < 1000; k++) {
int cash = 50;
while (cash >= 0 && cash < 250) {
if (rand() % 2 == 0) cash++;
else cash--;
}
if (cash >= 250) wins++;
}
printf("초기 금액:$50\n");
printf("목표 금액:$250\n");
printf("1000번 중의 %d번 승리\n", wins);
printf("이긴 확률= %lf%% ", (double) wins / 1000 * 100);
return 0;
}
이길수 있는 확률이 0.5인 도박에서 도박사가 목표금액에 도달하는 확률이 얼마나 되는지 계산해보는 프로그램이다. 확률이 0.5인 것을, 난수를 불러와 그 난수가 짝수(2로 나누었을 때 나머지가 0)거나 홀수인 것을 판별하는 것으로 표현하였다. 난수의 시드값은 srand 함수를 사용해 GetTickCount64( )로 부여하었다. while문을 사용하여 cash가 0부터 250사이에서만 증가/감소하도록 루프를 생성했으며 목표금액인 cash가 250보다 크게 되었을때는 이긴것으로 win을 증가시키고 반복문이 종료된 후 확률로 출력였다.
배열
난수 카운트
#include <stdio.h>
#include <stdlib.h> // rand() 헤더파일
#include <time.h>
#define SIZE 10 // 기호상수로 SIZE 정의
int main(void)
{
int num[SIZE] = { 0 }; // num[]을 0으로 초기화
int x = 0;
srand((unsigned)time(NULL)); // 실행될 때마다 다른 난수를 제공
for (int i = 0; i < 100; i++)
num[rand() % SIZE]++; // 0부터 9까지의 난수를 인덱스로 카운트
for (int j = 0; j < SIZE; j++)
if (num[j] > num[x]) // 배열이 카운트 된 횟수를 비교
x = j;
printf("가장 많이 생성된 수= %d\n", x);
return 0;
}
배열을 사용하여 0부터 9까지의 난수를 100번 생성한 후 가장 많은 수를 출력하는 프로그램이다. num 배열을 생성하고 0으로 초기화 한다. 첫번재 for 문에서 rand 함수를 사용해 0부터 9까지의 각 인덱스를 난수로 발생시킨다. 그 인덱스의 값을 증가시킴으로서 각 난수가 몇 번 발생했는지 num 배열에 저장되게 된다. 다음 for문에서 num 배열에 저장된 값을 비교해 가장 큰 값이 들어있는 인덱스를 x에 저장한 뒤 출력한다.
+ 사담
처음에 문제를 받고 저는 난수를 먼저 100개 저장한 뒤, 그걸 카운트 할 생각이었는데요. 그럼 불필요한 연산이 다수 발생하게 되죠. 당시에 코딩을 먼저 배웠던 친구가 이렇게 푸는 모습을 보고 충격 받았던 기억이 있습니다 ㅎ.. 지금도 노력하고 있지만 코딩은 너무 어려운 것 같아요.
배열의 최대 최소값 찾기
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int num[10] = { 0 };
int max = 0,min = 0;
srand((unsigned)time(NULL));
for (int i = 0; i < 10; i++)
num[i] = rand();
for (int i = 0; i < 10; i++) {
if (num[i] > num[max]) // 비교하여 값이 가장 큰 요소을 찾아냄
max = i;
if (num[i] < num[min]) // 값이 가장 작은 요소을 찾아냄
min = i;
}
printf("최대값은 %d\n", num[max]);
printf("최소값은 %d\n", num[min]);
return 0;
}
배열에 난수를 저장한 다음 최대값과 최솟값을 출력하는 프로그램이다. 먼저 배열을 만들어 첫번째 for 문에서 rand을 사용해 각 배열요소를 난수로 입력 받는다. 다음 for문에서는 각 배열 요소를 비교해 가장 큰 값, 작은 값이 들어있는 인덱스를 찾아 그 값을 max와 min에 저장한다. 마지막으로 저장된 인덱스를 사용해 값을 출력한다.
배열 초기화
#include <stdio.h>
int main(void)
{
int days[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 }; // 배열에 값을 저장
for (int i = 0; i < 12; i++)
printf("%d월은 %d까지 있습니다.\n", i + 1, days[i]);
return 0;
}
배열 원소를 초기화하고 원소의 값을 문장에 출력하는 프로그램이다. 먼저 day배열을 생성하고 중괄호를 열어 배열요소를 저장한다. for문을 사용해 i를 0부터 11까지 증가 시키며 문자열을 출력한다. 월은 1월부터 12월까지 출력하기 위해 i+1로 입력한다.
주사위 굴리기
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int dice[6] = { 0 }; // dice배열의 배열요소를 0으로 초기화
srand((unsigned)time(NULL));
for (int i = 0; i < 10000; i++)
dice[rand() % 6]++; // 0부터 5까지의 난수를 10000번 발생시켜 dice배열에 카운트
printf("=====================\n");
printf(" 면\t빈도\n");
printf("=====================\n");
for (int i = 0; i < 6; i++)
printf(" %d\t%d\n", i + 1, dice[i]);
return 0;
}
주사위를 10,000번 던져 그 결과를 배열로 정리하는 프로그램이다. 먼저 dice배열을 선언하고 값을 0으로 초기화 한 뒤 0부터 5까지의 난수를 발생시켜 이를 인덱스로 카운트 한다. 카운트한 결과를 for문으로 출력한다. 주사위의 눈은 1~6 사이 값을 가지기 때문에 i+1로 작성한다.
배열 비교하기
#include <stdio.h>
#define size 10
int main(void)
{
int a[size], b[size];
printf("비교할 숫자 배열을 입력해주세요 (크기 10) :\n");
for (int i = 0; i < size; i++)
scanf_s("%d", &a[i]); // a 배열요소 입력 받기
for (int i = 0; i < size; i++)
scanf_s("%d", &b[i]); // b 배열요소 입력 받기
for (int i = 0; i < size; i++){
if (a[i] == b[i]) {
printf("2개의 배열은 같음");
return ;
}
else
printf("2개의 배열은 다름");
}
return 0;
}
사용자로부터 a 배열과 b 배열의 배열요소를 입력받아 비교 결과를 출력하는 프로그램이다. 먼저 a 배열과 b 배열의 크기를 기호상수를 size 사용해 선언하고 scanf_s로 값을 입력받는다. 세번째 for문으로 배열의 모든 값을 비교하고 다른값이면 “2개의 배열은 다름”을 출력하고 바로 반환한다.
Random Walk Game
#include <stdio.h>
#include <stdlib.h> //rand를 사용하기위한 헤더파일
#include <time.h> //time을 사용하기위한 헤더파일
int main(void)
{
srand((unsigned)time(NULL)); //실행시마다 다른 난수를 불러온다.
char title[10] = "__________"; //char title[10] : title은 크기가 10인 문자형 배열이다.
int start = 5; //start = 벌레의 위치
title[start] = '*'; //title[5]='*'
for (int i = 0; i < 10; i++)
printf("%c", title[i]); //시작문장 출력
printf("\n");
for (int i = 0; i < 10; i++)
{
char title[10] = "__________"; // 배열을 언더바로 초기화
int direction = rand() % 2; //0과 1을 랜덤으로 출력
if (direction == 0)
{
start += 1; //direction가 0일때 start = start + 1
if (start > 9) //start가 9보다 커질 때에는 start=8
start = 8;
title[start] = '*';
for (int i = 0; i < 10; i++)
printf("%c", title[i]); //이동한 결과 출력
}
else
{
start -= 1; //direction가 0이 아닐때 start = start - 1
if (start < 0) //start가 0보다 작아질 때에는 start=1
start = 1;
title[start] = '*';
for (int i = 0; i < 10; i++)
printf("%c", title[i]); //이동한 결과 출력
}
printf("\n"); //커서위치
}
return 0;
}
배열을 이용하여 random walk를 만드는 프로그램이다. 단, 벌레가 같은 위치에 연속해 머무를 수 없다. 먼저 문자형 배열 board을 만들어 요소를 언더바(_)로 채운다. 벌레의 시작 인덱스 now를 5로 초기화 하고 출력한 뒤 for문을 이용해 10번 반복하며 게임이 진행되도록 한다. 다음 for문에선 rand함수를 이용해 direction 변수에 0 또는 1 난수를 저장한다. 난수가 0이면 오른쪽으로 1이면 왼쪽으로 벌레가 이동할 수 있도록 인덱스를 증감시킨다. 이때 범위를 벗어나 10이나 -1이 된 경우, 인덱스를 8과 1로 조정해 허용된 인덱스를 벗어나거나 같은 자리에 머무는 것을 방지한다.
감사합니다.
공부한 내용을 복습/기록하기 위해 작성한 글이므로 내용에 오류가 있을 수 있습니다.
'C | 자료구조' 카테고리의 다른 글
[C/자료구조] 순환을 이용해 셀 채우기 (0) | 2023.10.27 |
---|---|
[C/자료구조] Ackermann 함수 (0) | 2023.10.27 |
[C] 지뢰 찾기 게임 구현하기 (0) | 2022.10.07 |
[C] C프로그래밍 실습 (3) (0) | 2022.10.06 |
[C] C프로그래밍 실습 (1) (0) | 2022.09.22 |