티스토리 뷰

C | 자료구조

[C] C프로그래밍 실습 (3)

rimo (리모) 2022. 10. 6. 16:35

 

 

[C] C프로그래밍 실습 (2)

[C] C프로그래밍 실습 (1) 'C 프로그래밍 실습'에서는 1학년 때 C를 배우면서 했던 실습 내용들을 모아 볼 예정입니다. 제가 처음 배웠던 언어는 파이썬이었는데요. 대학을 가서 처음으로 프로그래

munak.tistory.com

 

위 글에 이어서 작성되었습니다.


 

함수

함수 선언하기

#include <stdio.h>

void introduction() 
{
	printf("Hi\n");
	printf("MY name is Chaitanya\n");
	printf("How are you?\n");
}


int main(void)
{
	introduction();

	return 0;
}

printf문을 담고 있는 introduction 함수를 실행시키는 프로그램이다. 값을 반환하지 않기 때문에 반환형을 void로 작성하였다. 매개변수 또한 받을 것이 없기 때문에 적지 않았다. 출력할 문장을 printf문 안에 적고 main함수에서 introduction함수를 호출한다.

 

 

 

 

 

로또번호 생성기

#include <stdio.h>
#include <stdlib.h>    
#include <time.h>       

int get_number()
{
	int num = (rand() % 45) + 1; // 1에서 45까지의 난수 발생
	return num;
}


int main(void)
{
	srand((unsigned)time(NULL));            // 시드 설정

	printf("생성된 로또 번호는 ");

	for (int i = 0; i < 5; i++)             // 함수 호출
		printf("%d, ", get_number());
	printf("%d 입니다.", get_number());


	return 0;
}

1부터 45까지의 난수를 발생시키는 함수 get_number을 이용해 로또 번호를 출력하는 프로그램이다. 먼저 rand 함수를 이용해 난수를 반환하는 get_number 정의한다. 정수 값을 반환하기 때문에 int형으로 선언한다. main 함수에서는 for문을 통해 get_number 함수를 호출하고 결과를 출력한다.

 

 

 

 

 

 

원의 면적, 둘레 구하기

#include <stdio.h>
#define Pi 3.14

// 면적 구하기 함수
double area(double r) {
	return r * r * Pi;
}

// 둘레 구하기 함수
double circum(double r) {
	return 2.0 * r * Pi;
}


int main(void)
{
	double r;
	while (1) {
		printf("원의 반지름을 입력하시오: ");
		scanf_s("%lf", &r);

		// 반지름이 0이면 종료
		if (r < 0)
			break;

		printf("원의 면적은 %.2lf입니다.\n", area(r));
		printf("원의 둘레는 %.2lf입니다.\n\n", circum(r));
	}

	return 0;
}

원의 반지름을 입력받아 함수를 호출하여 원의 면적과 둘레를 구하는 프로그램이다.  먼저 define을 통해 파이값인 3.14를 기호 상수 Pi로 정의한다.  이를 이용해 각 함수들을 정의한다. area함수는 반지름 r을 매개변수로 받아 면적을 계산해 반환하고 circum 함수는 마찬가지로 반지름 r을 매개변수로 받아 둘레를 계산해 반환한다.  main 함수에서는 scanf를 사용하여 사용자로부터 반지름 r의 값을 입력 받은뒤 각 함수를 호출해 문자열을 출력한다. 이때 입력된 반지름이 0이라면 while 문을 빠져나와 무한루프가 종료된다.

 

 

 

 

 

 

 

두 점사이의 최단거리 계산하기

#include <stdio.h> 
#include <math.h>

double distance(int x1, int x2, int y1, int y2)
{
	//sqrt = 제곱근(√)   //pow(a,b)= a의 b승
	return sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
}


int main(void)
{
	int x1, x2, y1, y2;
	printf("첫 번째 점의 좌표를 입력하시오 (x,y) : ");
	scanf_s("%d %d", &x1, &y1);
	printf("두 번째 점의 좌표를 입력하시오 (x,y) : ");
	scanf_s("%d %d", &x2, &y2);

	printf("두 점사이의 거리는 %lf입니다.\n", distance(x1, x2, y1, y2));
	return 0;
}

사용자로부터 두 점의 좌표를 입력받아 최단거리를 구하는 프로그램이다. scanf를 이용해 두 점의 위치를 입력받고 함수 distance를 호출해 결과를 출력한다.  distance에서는 매개변수로 두 점의 좌표를 받아 최단거리 공식을 이용해 계산한 결과를 반환한다. 이를 위해 math 라이브러리의 sqrt(제곱근), pow(거듭제곱) 함수를 사용한다. 

 

 

 

 

 

 

자동차 경주

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define CAR 3

HWND hwnd;
HDC hdc;

//화면 초기화
void clear_screen(void)
{
	Rectangle(hdc, 0, 0, 10000, 10000);
}

//차를 그리는 함수
void draw_car(int x, int y)
{
	Rectangle(hdc, x, y, x + 180, y + 40);
	Rectangle(hdc, x + 45, y + 3, x + 130, y + 30);
	Rectangle(hdc, x + 45, y - 30, x + 130, y);
	Rectangle(hdc, x + 48, y - 27, x + 127, y - 3);
	Ellipse(hdc, x + 7, y + 25, x + 47, y + 62);
	Ellipse(hdc, x + 10, y + 25, x + 50, y + 65);
	Ellipse(hdc, x + 127, y + 25, x + 167, y + 62);
	Ellipse(hdc, x + 130, y + 25, x + 170, y + 65);
}


int main(void)
{
	// x, y 좌표
	int x[CAR] = { 20, 20, 20 };
	int y[CAR] = { 100, 250, 400 };
	int win = -1;

	hwnd = GetForegroundWindow();
	hdc = GetWindowDC(hwnd);
	srand((unsigned)time(NULL)); // 시드 설정

	while (1) {

		clear_screen(); // 화면초기화

		for (int i = 0; i < CAR; i++) {
			draw_car(x[i], y[i]); // 자동차 그리기

			if (x[i] > 700) 
				win = i;
			else
				x[i] = (x[i] + (rand() % 50)) + 1;  // 난수 만큼 앞으로 이동
		}
		if (win > -1) {
			printf("%d 번차 승리!", win + 1);
			break;
		}

		getch(); // 다음키 입력 대기
	}

	return 0;
}

 

사용자가 키를 누를때 마다 난수의 크기만큼 자동차를 전진시키며 경주하는 프로그램이다. 먼저 배경 초기화 함수 clear_screen와 자동차를 그리는 함수 draw_car를 정의한다. 화면의 사각형과 원을 그리는 함수 rectange과 ellipse를 이용하여 작성하였다. 그리고 자동차의 좌표를 담은 정수형 배열 x, y를 선언한 뒤, 시작 위치로 초기화한다. 경기의 승패를 결정할 변수 win은 우선 -1로 초기화한다. 

 

화면을 그리기 위해 필요한 정보는 정의된 함수 (GetForegroundWindow, GetWindowDC)들을 이용한다. while문에서는 먼저 화면을 초기화하고 각 차들의 좌표를 갱신한다. x좌표가 700을 넘어서면 win이 해당 자동차의 인덱스로 바뀌며 그 차의 승리가 된다. 아니라면 난수(1~50)만큼 앞으로 전진한다.

 

모두 좌표 이동을 끝냈을 때 x좌표가 700을 넘어 win이 해당 차의 인덱스로 바뀌었다면 결과를 출력하고 무한루프를 빠져나온다. 아니라면 다음 키 입력을 받을 때 까지 대기한다.

 

 

 

 

 

 

구구단

#include <stdio.h>
int main(void)
{
	int n1, n2;
	int arr[9][9] = { 0 };
    
	for (int i = 0; i < 9; i++)
		for (int j = 0; j < 9; j++)
			arr[i][j] = (i + 1) * (j + 1);    // arr배열에 구구단을 입력

	while (1) {
		printf("알고싶은 구구단을 입력하시오(예: 9 3): ");
		scanf("%d %d", &n1, &n2);
		printf("%d X %d = %d\n\n", n1, n2, arr[n1 - 1][n2 - 1]);
	}
	return 0;
}

1단부터 9단까지의 구구단을 arr라는 이차원 배열에 저장했다가 사용자가 알고싶은 구구단을 입력하면 arr에서 값을 찾아 출력하는 프로그램이다. 먼저 크기가 9x9인 이차원 배열 arr을 생성한뒤 이중 for 문을 사용하여 요소들을 해당 행과 열을 곱한 값으로 채운다. while문에서 사용자가 숫자를 입력하면 구구단의 값을 출력한다. 

 

 

+

고친다면 값의 범위를 검사하는 문장을 추가할 것 같네요. (그냥 곱하면 되지 누가 이차원 배열에 저장하조..)

#include <stdio.h>
int main(void)
{

	int n1, n2;
	int arr[9][9] = { 0 };

	for (int i = 0; i < 9; i++)
		for (int j = 0; j < 9; j++)
			arr[i][j] = (i + 1) * (j + 1);    // arr배열에 구구단을 입력

	while (1) {

		printf("알고싶은 구구단을 입력하시오(예: 9 3): ");
		scanf("%d %d", &n1, &n2);

		if (n1 < 1 || n2 < 1 || n1 > 9 || n2 > 9)
			return ;

		printf("%d X %d = %d\n\n", n1, n2, arr[n1 - 1][n2 - 1]);
	}
	return 0;
}

 

 

 

 

 

 

 

소수 (feat. 함수 원형)

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>

int prime(int);    // 함수 원형

int main()
{
	int num, n;
	printf("양의 정수를 입력하시오 : ");      
	scanf("%d", &num);

	for (int i = 2; i <= num / 2; i++) {   // i를 num/2까지 증가시키며 반복
		if (prime(i)) {
			n = prime(i);              // 함수의 결과값을 n에 저장

			if (prime(num - n) != 0)    // num-n값 또한 소수인지 확인
				printf("%d = %d + %d\n", num, n, (num - n));
		}
	}
	return 0;
}

int prime(int num)     // 소수 판별하는 함수
{
	int i;
	for (i = 2; i <= num; i++) {
		if (num % i == 0) {
			if (num == i) return num;
			if (num != i) return 0;
		}
	}
	return 0;
}

 

사용자로부터 한 정수를 입력받고 그 정수를 소수의 합으로 표현하는 프로그램이다. 아래에서 숫자를 소수인지 판별하는 prime이라는 함수를 만들것이기 때문에 먼저 함수 원형으로 선언해 준다. 다음으로 사용자로부터 표현할 정수 num을 입력받는다. 

 

prime 함수는 반복문을 통해 2부터 매개변수로 들어온 숫자까지 나눗셈을 시도하고 나눠 떨어진 숫자가 본인인지 확인한다. 자기 자기 자신이 아니라면 0을 반환하고 맞다면 값을 반환한다. 다시 main함수로 돌아오면, for문에서 입력받은 숫자를 가능한 모든 소수의 합으로 숫자를 표현하기 위해 모든 조합을 확인한다. 조합이기 때문에 num/2의 범위만 검사해 중복한 결과가 나오지 않도록 한다.

 

 

 

 

 

최빈값 구하기

 

#include <stdio.h>
#include <stdlib.h>     
#include <time.h>      
#define SIZE 100   

int main(void)
{
	int num[SIZE] = { 0 };		// num[]을 0으로 초기화
	int x = 0;
	srand((unsigned)time(NULL));  

	for (int i = 0; i < 10000; i++)
		num[rand() % SIZE]++; // 0부터 100까지의 난수를 10000번생성하여 num배열에 카운트
	

	for (int t = 0; t < SIZE; t++)
		if (num[t] > num[x])        
			x = t;
	
	printf("가장 많이 생성된 수는 %d입니다.\n", x);

	return 0;
}

배열을 사용하여 0부터 100까지의 난수를 10000번 생성받은 후 가장 많이 생성된 수를 출력하는 프로그램이다.  num배열을 생성하고 난수로 각 인덱스를 카운트 한다. 다음 for문에서 다시 한번 사용하여 각 인덱스가 카운트된 횟수를 비교한다.

 

 

 

 


 

 

배열

 

배열요소의 합 구하기 

#include <stdio.h>
int array_sum(int* A, int size) {    
	int sum = 0;
	for (int i = 0; i < size; i++)
		sum += A[i];
	return sum;
}

int main()
{
	int A[10] = { 1,2,3 };

	printf("A[] = ");
	for (int i = 0; i < 10; i++)
		printf("%d ", A[i]);
	printf("\n");
	printf("월급의 합=%d", array_sum(A, 10));

	return 0;
}

 

배열에 직원들의 월급을 저장하고 배열안의 값을 모두 더해 월급의 합을 출력하는 프로그램이다. 단 배열을 인수로 받는 함수를 작성해야 한다. array_sum 함수는 매개변수로 전달된 배열 arr의 모든 요소값을 sum에 누적해 더한다음 반환한다. for문은 인수로 전달된 배열의 길이 size만큼 반복한다. main에서는 직원들의 월급을 정수형 배열 A에 저장한 다음 array_sum를 호출한다.

 

 

 

+ 배열의 크기? 길이?

저때는 배열의 길이를 구하는 방법을 몰라 직접 10이라고 넣어주었네요. C언어에서 변수의 크기는 sizeof 함수로 구할 수 있습니다. 단, 할당된 메모리크기(바이트)를 계산해주기 때문에 배열의 경우 '배열의 요소의 수 x  배열의 자료형'으로 출력됩니다. 위의 int A[10]의 경우에는 40 ( = 10 x 4)이 나오게 되죠. 따라서  배열의 길이(배열의 요소의 개수)을 구하고자 한다면 전체 배열의 크기를 해당 배열의 자료형으로 나누어줘야 합니다. 

 

 ++   주의해야할 점은 인자로 넘겨받은 배열로는 배열의 크기를 구할 수 없다는 것입니다. 배열이 아닌 포인터로 인식하기 때문이죠. 수정한다면 이렇게 되겠네요. (하지만 define으로 배열의 길이를 정의한 뒤 사용하는게 가장 간편합니다.)

 

#include <stdio.h>
int array_sum(int* A, int size) {    
	int sum = 0;
	for (int i = 0; i < size; i++)
		sum += A[i];
	return sum;
}

int main()
{
	int A[10] = { 1,2,3 };

	printf("A[] = ");
	for (int i = 0; i < 10; i++)
		printf("%d ", A[i]);
	printf("\n");
	printf("월급의 합=%d", array_sum(A, sizeof(A) / sizeof(int)));

	return 0;
}

 

 

 

 

 

 

 

 

배열 탐색

#include <stdio.h>

int search(int* A, int size, int search_value) {
	int result;
	for (int i = 0; i < size; i++) {
		if (A[i] == search_value)
			result = i;
	}

	return result;
}


int main()
{
	int A[10] = { 1,200,2,3 };
	printf("월급이 200만원인 사람의 인덱스=%d", search(A, 10, 200));

	return 0;
}

 

A 배열에 직원들의 월급이 입력되어있다고 할 때 그 중에서 200(만원)을 찾는 프로그램이다. search는 배열과 찾고 싶은 값을 인수로 입력 받아 for문으로 원하는 값을 찾는 함수이다. 찾았다면 result값에 인덱스 번호를 대입하고 result값을 반환한다. main함수에서는 배열 A, 배열의 크기, 찾는 값을 이용해 함수를 호출하고 그 결과를 printf로 출력한다.

 

 

 

+ 수정한다면 이렇게 할 것 같네요.

#include <stdio.h>
#define SIZE 10
int search(int* A, int val) {

	for (int i = 0; i < SIZE; i++) {
		if (A[i] == val)
			return i;
	}
	return -1;
}


int main()
{
	int A[SIZE] = { 1, 200, 2, 3 };
	int val = 200;

	int result = search(A, val);

	if (result > 0)
		printf("월급이 %d 만원인 사람의 인덱스 = %d", val, result);
	else
		printf("월급이 %d 만원인 사람이 없습니다.", val);

	return 0;
}

 

 

 

 

 

배열값 저장하기

#include <stdio.h>
#define SIZE 10
void convert(double* grades, double* scores) {
	for (int i = 0; i < SIZE; i++)
		scores[i] = grades[i] * (100.00 / 4.30);
}


int main()
{
	double grades[SIZE] = { 00.00, 00.50, 01.50, 01.50, 02.00, 02.50, 03.00, 03.50, 04.00, 04.30 };
	double scores[SIZE] = { 0 };


	for (int i = 0; i < SIZE; i++)
		printf("0%.2lf ", grades[i]);
	printf("\n");


	convert(grades, scores);


	printf("0%.2lf ", scores[0]);
	for (int i = 1; i < SIZE; i++)
		printf("%.2lf ", scores[i]);

	return 0;
}

학생들의 학점을 grades 배열에 저장하고 4.3을 100점 만점으로 점수 변환해 scores 배열에 저장하는 프로그램이다. convert 함수는 grades 배열과 scores 배열을 인수로 받아 for문으로 배열의 크기만큼 반복하며, grades 배열의 값을 100점 만점 기준의 값으로 계산해 scores 배열에 저장하는 함수이다.

main 함수에서는 grades 배열과 scores 배열의 값을 초기화하고 covert 함수를 호출한 뒤. 배열의 값을 출력한다. 이때 소수점 두번째 자리까지 출력하기 위해 형식지정자로 %.2lf를 사용한다.

 

 

 

 

 

 

배열 복사하기

#include <stdio.h>
#define SIZE 10
void array_copy(int* arr1, int* arr2) {
	for (int i = 0; i < SIZE; i++)
		arr2[i] = arr1[i];
}


int main()
{
	int A[SIZE] = { 1, 2, 3 };
	int B[SIZE] = { 0 };

	array_copy(A, B);

	// 출력
	printf("A[] = ");
	for (int i = 0; i < SIZE; i++)
		printf("%d ", A[i]);
	printf("\n");

	printf("B[] = ");
	for (int i = 0; i < SIZE; i++)
		printf("%d ", B[i]);
	printf("\n");

	return 0;
}

정수 A 배열의 값을 B 배열에 복사한 뒤 출력하는 프로그램이다. 함수 array_copy 는 두 배열을 인수로받아 for문을 통해 순회하며 배열 arr1의 값을 arr2에 대입한다. mian 함수에서는 배열 A와 B를 초기화 하고 두배열은 인수로 array_copy 함수를 호출한다. 그리고 배열을 각각 출력해 복사 결과를 확인한다.

 

 

 

 

 

 

배열 복사하기 2

#include <stdio.h>
#define SIZE 4

void copy_arr(int* arr1, int* arr2, int* arr3) {

	int i = 0, j = 0, k = 0;
	while (i < SIZE && j < SIZE)
	{
		
		if (arr1[i] <= arr2[j]) {	// arr1 요소가 더 큰경우
			arr3[k] = arr1[i];
			i++;
		}
		else {				// arr2 요소가 더 큰경우
			arr3[k] = arr2[j];
			j++;
		}
		k++;
	}

	// 한개의 배열이 먼저 끝난 경우 나머지 배열 전부 복사
	if (i >= SIZE) {
		for (;  k < SIZE*2; k++) {
			arr3[k] = arr2[j];
			j++;
		}
	}

	if (j >= SIZE) {
		for (; k < SIZE*2; k++) {
			arr3[k] = arr1[i];
			i++;
		}
	}

}

void print_arr(int *arr, int size) {

	for (int i = 0; i < size; i++)
		printf("%d ", arr[i]);
	printf("\n");

}

int main()
{
	int A[SIZE] = { 2, 5, 7, 8 };
	int B[SIZE] = { 1, 3, 4, 6 };
	int C[SIZE*2] = { 0 };

	copy_arr(A, B, C);

	printf("A[] = ");
	print_arr(A, SIZE);

	printf("B[] = ");
	print_arr(B, SIZE);

	printf("C[] = ");
	print_arr(C, SIZE*2);

	return 0;
}

배열의 값을 비교하여 더 작은 값을 배열 C에 대입하고 한쪽의 배열이 끝난다면 남은 배열의 값을 C에 저장하는 프로그램이다. 먼저 define으로 로 배열의 크기를 기호상수로 저장한다. copy_arr 함수는 세개의 배열(arr1, arr2, arr3)를 인수로 받는다. arr1, arr2 두 배열의 값을 비교하여 작은 쪽의 값을 arr3에 저장한다. 이를 위해 각 배열마다 인덱스 변수(i, j, k)를 따로 사용한다. 한 쪽 배열의 인덱스가 배열의 길이을 넘어가면 while 문이 중단된다. 그리고 남은 다른 배열의 값이 있다면 모두 복사해주기 위해 if문을 작성한다. print_arr 는 배열과 배열의 길이를 인수로 전달받아 콘솔에 출력하는 함수이다.

 

main함수에서는 모든 배열의 값을 초기화하고 정의한 함수들을 호출한다. 이때 배열 C는 두개의 배열값을 모두 복사하기 위해 크기를 2배로 설정한다.

 

 

 

 


 

 

문자열

 

숫자만 출력하기

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
int main()
{
	int i = 0;
	char str[100] = "";

	printf("문자열을 입력하시오 : ");
	scanf("%s", str);

	
	while (i < strlen(str)) {
    
		if ((str[i] >= '0' && str[i] <= '9')) { // 숫자라면 다음 요소 검사
			i++;
		}
		else {	// 문자 라면 한자리씩 당기기
			for (int j = i; j < strlen(str); j++)
				str[j] = str[j + 1];
		}
	}

	printf("결과 : %s\n", str);

	return 0;
}

 

문자열을 입력받은 뒤 숫자가 아닌 다른 문자는 삭제한 뒤 출력하는 프로그램이다. 먼저 문자열을 입력받기 위해 문자형 배열 str과 인덱스 변수 i를 선언한다. 충분히 긴 문자열도 입력 받을 수 있도록 str의 크기는 100으로 선언하고,  scanf로 문자열을 입력받는다. 입력받은 문자열은 while 문을 통해 한 문자씩 검사하게 된다.  str[i]가 '0'과 '9'사이의 값, 즉 숫자인 문자라면 i를 증가시켜 다음 문자를 검사한다. 하지만 문자라면 현재 인덱스인 i부터 끝까지 한자씩 문자들을 당겨 복사한다. 마지막 인덱스까지 검사했다면 while문이 종료되고 결과가 출력 된다.

 

 

+ strlen

strlen은 <string.h>에 포함되어있는 함수로 문자열의 길이를 계산해 반환해줍니다. C 언어에선 문자열의 끝에 '\0'이 오는데요. strlen은 '\0'이 발견되면 카운팅을 멈춥니다. 따라서 '\0'을 제외한 순수문자열의 길이를 알 수 있죠. 문자열 자체에 '\0'이 들어간다면 그 전까지 길이를 반환합니다.

 

 

 

 

 

 

문자 카운팅

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
int main()
{
	char str[100] = "";
	int cnt[200] = { 0 };

	printf("문자열을 입력하시오 : ");
	scanf("%s", str);


	for (int i = 0; i < strlen(str); i++) {
		for (int j = 'a'; j <= 'z'; j++) { // 아스키코드 값 이용
			if (str[i] == j)
				cnt[j]++;
		}
	}

	// 카운팅 결과 출력
	for (int i = 'a'; i <= 'z'; i++)
		printf("%c : %d\n", i, cnt[i]);

	return 0;
}

소문자로 이루어진 문자열을 입력받아  알파벳의 빈도를 세어 출력하는 프로그램이다. 문자가 숫자로도 사용되는 아스키코드를 이용할 것이다. 먼저 문자열을 입력 받기 위해 문자형 배열 str과, 각 알파벳의 빈도를 저장할 정수형 배열 cnt를 선언한다. 충분한 길이의 문자열을 입력받기 위해 str은 크키를 100으로 설정하였으며, cnt는 아스키코드의 수대로 128로 설정하였다. cnt는 0으로 초기화 해주고 scanf 로 문자열을 입력받는다. for문을 통해 문자열의 각 자리수를 순회하며 알파벳을 인덱스로 카운팅한 뒤 결과를 출력한다. ('a'의 경우 cnt[97]의 값이 증가된다.) 

 

 

 

 

 

 

문자열 비교하기 (strcmp)

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[100] = "";
	char str2[100] = "";

	printf("문자열을 입력하시오 : ");
	scanf("%s", str1);
	printf("문자열을 입력하시오 : ");
	scanf("%s", str2);


	if (!strcmp(str1, str2)) // 문자열 비교함수, 동일하다면 0을 반환한다.
		printf("표절입니다!!");
		
	return 0;
}

문자열 두 개를 입력받아 비교하여 문자열이 동일하다면 '표절입니다!!'를 출력하는 프로그램이다. 두 배열을 입력 받기위해 크기가 충분한 문자형 배열 str1, str2를 생성한다. scanf로 두 문자열을 입력받고 if 문과 문자열 처리함수 strcmp를 이용하여 strcmp의 값이 0이 아니라면 '표절입니다!!'을 출력하도록 한다.

 

 

 

 

 

 

 

문자열 복사(strcpy) 와 더하기(strcat)

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

int main()
{
	char str1[100] = "";
	char str2[100] = "";
	printf("문장을 입력하시오: ");
	scanf("%d",str1);
	printf("\n");

	strcpy(str2, "#include <stdio.h>\n");   // 문자열 복사 함수
	strcat(str2, "int main(void) {\n");   // 문자열 붙히기 함수
	strcat(str2, "	");
	strcat(str2, str1);
	strcat(str2, ";\n");
	strcat(str2, "	printf(\"%%d\\n\", i);\n");
	strcat(str2, "}\n");
	printf(str2);


	return 0;
}

 

변수선언(int i = 10)을 입력하면, 세미콜론을 붙여 main 함수에 추가해주는 프로그램이다. 문장을 입력받고 합쳐 출력하기 위해 문자형 배열 str1과 str2를 선언한다. 사용자로부터 str1에 추가하고 싶은 문장을 입력 받고 strcpy, strcat을 사용하여 헤더파일과 함수, printf문을 s2에 추가한 뒤 출력한다. 

 

 

 

 

 

 

 

문자열 계산기

#include <stdio.h>
int main(void)
{
	char str[100];
	char oper[4] = { 0 };
	char result = '0';

	printf("연산을 입력하시오: ");
	gets_s(str, sizeof(str));

	for (int i = 0; i < 3; i++)
		oper[i] = str[i];

	if (!strcmp(oper, "add"))
		result = (str[4] - '0') + (str[6] - '0');

	else if (!strcmp(oper, "sub"))
		result = (str[4] - '0') - (str[6] - '0');

	else if (!strcmp(oper, "mul"))
		result = (str[4] - '0') * (str[6] - '0');

	else if (!strcmp(oper, "div"))
		result = (str[4] - '0') / (str[6] - '0');

	else
		return 0;

	printf("연산의 결과: %d", result);
	
	return 0;

}

연산의 종류(add, sub, mul, div)와 피연산자(한자리수)를 문자열로 입력받은 뒤 계산하여 출력하는 프로그램이다. gets_s를 사용하여 문자열을 입력받고 연산의 종류를 분리하기 위해 배열 oper을 선언하여 s[0], s[1], s[2]의 값을 저장한다. 그 뒤 if문과 strcmp함수를 사용하여 연산의 종류에 따라 result의 값을 계산하여 출력한다. 문자로 되어있기때문에 아스키 코드를 이용하여 계산하도록 한다.

 

+ 한자리 문자에서 -'0'를 하면 해당 숫자문자의 값을 구할수 있습니다. ( '9' - '0' = 9 )

 

 

+ strncpy

원하는 자리수 만큼만 복사할 수 있는 strncpy(dest, source, count) 함수가 있습니다. 이를 이용해 연산자를 추출할 수도 있겠네요.

 

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
int main(void)
{
	char str[100];
	char oper[4] = { 0 };
	char result = '0';

	printf("연산을 입력하시오: ");
	gets_s(str, sizeof(str));

	strncpy(oper, str, 3);

	if (!strcmp(oper, "add"))
		result = (str[4] - '0') + (str[6] - '0');

	else if (!strcmp(oper, "sub"))
		result = (str[4] - '0') - (str[6] - '0');

	else if (!strcmp(oper, "mul"))
		result = (str[4] - '0') * (str[6] - '0');

	else if (!strcmp(oper, "div"))
		result = (str[4] - '0') / (str[6] - '0');

	else
		return 0;

	printf("연산의 결과: %d", result);
	
	return 0;

}

 

 

 

 

 

대문자로 변환하기

 

#include <stdio.h>
#include <string.h>
int main()
{
	char str[100] = "";

	printf("텍스트를 입력하시오:");
	gets_s(str, sizeof(str));

	for (int i = 0; i < strlen(str); i++) {
		if (str[i] >= 'a' && str[i] <= 'z') { // 소문자라면
			int tmp = str[i];
			str[i] = tmp - ('a' - 'A'); // 대문자로 변환
		}
	}
	printf("대문자 출력 : %s\n", str);
	return 0;
}

문자열을 입력받아 소문자를 모두 대문자로 바꾸어주는 프로그램이다. 문자열을 입력받을 충분한 크기의 배열 str을 선언한뒤 gets_s를 사용하여 문자열을 입력받는다. strlen로 문자열의 길이를 구해 for문으로 순회하며 배열 요소가 소문자인지 검사하고, 소문자라면 대문자로 바꾼다.

 

 

 

 

 

 

 

 

암호 생성하기

#include <stdio.h>
#include <string.h>
int main()
{
	char str[100] = "";
	while (1) {
		printf("암호를 생성하시오 :");
		gets_s(str, sizeof(str));

		char check0 = 0, check1 = 0, check2 = 0;
		for (int i = 0; i < strlen(str); i++){
			if (!check0 && str[i] >= 'a' && str[i] <= 'z')  // 소문자 확인
				check0++;

			else if (!check1 && str[i] >= 'A' && str[i] <= 'Z')	// 대문자 확인
				check1++;

			else if (!check2 && str[i] >= '0' && str[i] <= '9') // 숫자 확인
				check2++;
		}
		// 숫자,소문자,대문자 모두 있을때
		if (check0 && check1 && check2 ) {
			printf("적절한 암호입니다. \n");
			break; // while문 종료
		}
		else
			printf("암호에는 숫자, 소문자, 대문자가 들어가야 합니다. \n\n");

	}
	return 0;
}

숫자, 소문자, 대문자를 다 포함해서 암호를 만들었을 때 암호가 생성되는 프로그램이다. 암호를 입력 받기 위해 배열 str를 선언한 뒤 gets_s로 입력 받는다. 그 뒤에 for문을 사용하여 전체 배열 요소를 검사한다. 소문자의 아스키코드 범위가 들어있다면 check0을 증가시키고 대문자라면 check1, 숫자라면 check2를 증가시킨다. check1~3이 이미 0이 아닌 값을 가지고 있다면 (조건이 만족된 상태라면) 두 번 검사하지 않는다. 모든 배열 요소를 검사한뒤  check1~3가 전부 0이 아니라면 break가 실행되어 while문이 종료된다. 아니라면, 다시 입력해 달라는 문장과 함께 전체 while문을 다시 실행하도록 한다.

 

 

 

감사합니다.

 


공부한 내용을 복습/기록하기 위해 작성한 글이므로 내용에 오류가 있을 수 있습니다.

댓글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday