두 정수의 합 구하기
두 정수의 합 구하기 (C#)
이 프로그램은 사용자로부터 입력받은 두 정수의 합을 계산하고 출력합니다.
소스 파일: SumOfTwoIntegers.cs
using System;
class SumOfTwoIntegers
{
static void Main()
{
int a, b;
Console.WriteLine("두 정수를 입력하세요: ");
a = Convert.ToInt32(Console.ReadLine());
b = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("합: " + (a + b));
}
}
예시 출력:
두 정수를 입력하세요:
3
5
합: 8
코드는 두 정수 a
와 b
를 입력받아, 이들의 합을 계산한 후 출력합니다.
배열의 최댓값과 최솟값 찾기
이 예제에서는 배열의 최댓값과 최솟값을 찾는 방법을 알아봅니다.
코드: max_and_min_of_array.c
#define _CRT_SECURE_NO_WARNINGS // 보안 경고를 무시하기 위한 정의
#include <stdio.h>
#define SIZE 3 // 배열의 크기를 3으로 설정
int main(void)
{
int arr[SIZE], max, min; // 크기가 SIZE인 정수 배열과 최댓값, 최솟값을 저장할 변수 선언
printf("3개의 정수를 입력하세요:\n"); // 사용자에게 입력 안내 메시지 출력
for (int i = 0; i < SIZE; i++)
{
scanf("%d", &arr[i]); // 사용자로부터 SIZE 개의 정수를 입력받음
}
max = min = arr[0]; // 최댓값과 최솟값을 배열의 첫 번째 원소로 초기화
for (int i = 1; i < SIZE; i++)
{
if (arr[i] > max) // 현재 원소가 최댓값보다 크다면
{
max = arr[i]; // 최댓값을 현재 원소로 갱신
}
if (arr[i] < min) // 현재 원소가 최솟값보다 작다면
{
min = arr[i]; // 최솟값을 현재 원소로 갱신
}
}
printf("최댓값: %d, 최솟값: %d\n", max, min); // 최댓값과 최솟값 출력
return 0;
}
3개의 정수를 입력하세요:
1
2
3
최댓값: 3, 최솟값: 1
이 간단한 프로그램은 사용자로부터 입력받은 3개의 정수 배열을 순회하며 최댓값과 최솟값을 찾아 출력해 봅니다.
섭씨를 화씨로 변환하기
온도 변환 프로그램은 일상 생활에서 자주 사용되는 기능 중 하나입니다. 섭씨를 화씨로 변환하는 간단한 예제를 작성해 보겠습니다.
코드: celsius_to_fahrenheit.c
#define _CRT_SECURE_NO_WARNINGS // 보안 경고를 무시하기 위한 정의
#include <stdio.h>
int main(void)
{
float celsius, fahrenheit; // 섭씨 온도와 화씨 온도를 저장할 변수 선언
printf("섭씨 온도를 입력하세요: ");
scanf("%f", &celsius); // 사용자로부터 섭씨 온도를 입력받음
// 섭씨 온도를 화씨 온도로 변환
fahrenheit = (celsius * 9 / 5) + 32;
// 화씨 온도를 소수점 둘째 자리까지 출력
printf("화씨 온도: %.2f\n", fahrenheit);
return 0;
}
섭씨 온도를 입력하세요: 24
화씨 온도: 75.20
위 코드는 사용자로부터 섭씨 온도를 입력받아, 이를 화씨 온도로 변환하여 출력하는 간단한 프로그램입니다. 사용자가 입력한 값을 변수에 저장한 후, 변환식을 사용하여 계산한 다음, printf 함수를 사용하여 결과를 출력합니다.
숫자 거꾸로 출력하기
이 아티클에서는 C 언어를 사용하여 사용자가 입력한 정수를 거꾸로 출력하는 프로그램을 작성하는 방법을 설명합니다. 아래에 제시된 소스 코드를 참고하세요.
#define _CRT_SECURE_NO_WARNINGS // Visual Studio에서 안전하지 않은 함수 경고를 무시하기 위한 매크로 정의
#include <stdio.h>
// num이라는 정수를 거꾸로 출력하는 함수
void reverse_number(int num)
{
// 숫자가 0보다 클 동안 반복
while (num > 0)
{
printf("%d", num % 10); // 숫자의 가장 오른쪽 자릿수를 출력
num /= 10; // 숫자를 10으로 나누어 자릿수를 줄임
}
printf("\n"); // 출력을 완료한 후 개행 문자 출력
}
int main(void)
{
int num; // 사용자로부터 입력받을 숫자를 저장할 변수
printf("거꾸로 출력할 숫자를 입력하세요: "); // 사용자에게 숫자를 입력하도록 안내
// 숫자를 입력받고 반환 값이 1이 아닌 경우 입력 오류 처리
if (scanf("%d", &num) != 1)
{
fprintf(stderr, "숫자를 입력해주세요.\n"); // 오류 메시지 출력
return 1; // 프로그램을 오류 코드 1과 함께 종료
}
printf("거꾸로 출력한 결과: "); // 결과 출력 시작을 알리는 메시지 출력
reverse_number(num); // 입력받은 숫자를 거꾸로 출력하는 함수 호출
return 0; // 프로그램 정상 종료
}
거꾸로 출력할 숫자를 입력하세요: 13579
거꾸로 출력한 결과: 97531
이 프로그램은 reverse_number 함수와 main 함수로 구성되어 있습니다. reverse_number 함수는 정수를 인자로 받아 그 정수를 거꾸로 출력하는 역할을 합니다. main 함수에서는 사용자로부터 정수를 입력받고, reverse_number 함수를 호출하여 결과를 출력합니다.
프로그램을 작성할 때 주의할 점은 사용자가 입력한 데이터를 검증하는 것입니다. 이 예제에서는 scanf 함수의 반환 값이 1이 아닌 경우를 확인하여 입력 오류를 처리합니다. 이렇게 입력 검증을 수행하면 프로그램의 안정성이 향상됩니다.
예제: 안녕, 세상!
코드: hello_world.c
#include <stdio.h>
int main() {
printf("안녕, 세상!\n");
return 0;
}
화씨를 섭씨로 변환하기
온도 변환은 섭씨에서 화씨로, 화씨에서 섭씨로 변환이 가능합니다. 따라서, 이번에는 화씨를 섭씨로 변환하는 코드를 작성해 보겠습니다.
코드: fahrenheit_to_celsius.c
#define _CRT_SECURE_NO_WARNINGS // 보안 경고를 무시하기 위한 정의
#include <stdio.h>
int main(void)
{
float celsius, fahrenheit; // 섭씨 온도와 화씨 온도를 저장할 변수 선언
printf("화씨 온도를 입력하세요: ");
scanf("%f", &fahrenheit); // 사용자로부터 화씨 온도를 입력받음
// 화씨 온도를 섭씨 온도로 변환
celsius = (fahrenheit - 32) * 5 / 9;
// 섭씨 온도를 소수점 둘째 자리까지 출력
printf("섭씨 온도: %.2f\n", celsius);
return 0;
}
화씨 온도를 입력하세요: 75.2
섭씨 온도: 24.00
위 코드는 사용자로부터 화씨 온도를 입력받아, 이를 섭씨 온도로 변환하여 출력하는 간단한 프로그램입니다. 사용자가 입력한 값을 변수에 저장한 후, 변환식을 사용하여 계산한 다음, printf 함수를 사용하여 결과를 출력합니다.
온도 변환 프로그램은 기상 예보나 난방, 냉방 시스템 등에서 매우 유용하게 활용됩니다. 섭씨와 화씨 간의 변환을 자유자재로 할 수 있으면, 다양한 상황에서 유용하게 활용할 수 있을 것입니다.
예제: 반지름을 입력받아 원의 넓이 구하기
코드: area_of_circle.c
#include <stdio.h>
#define PI 3.14159
int main() {
float radius, area;
printf("반지름을 입력하세요: ");
scanf("%f", &radius);
area = PI * radius * radius;
printf("원의 넓이: %.2f\n", area);
return 0;
}
예제: 구구단 출력하기
코드: multiplication_table.c
#include <stdio.h>
int main() {
int num, i;
printf("구구단을 출력할 숫자를 입력하세요: ");
scanf("%d", &num);
for (i = 1; i <= 9; i++) {
printf("%d * %d = %d\n", num, i, num * i);
}
return 0;
}
예제: 자연수 합 구하기
코드: sum_of_natural_numbers.c
#include <stdio.h>
int main() {
int n, sum = 0;
printf("자연수를 입력하세요: ");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
sum += i;
}
printf("1부터 %d까지의 합: %d\n", n, sum);
return 0;
}
예제: 팩토리얼 계산하기
코드: factorial_calculation.c
#include <stdio.h>
int main() {
int n, fact = 1;
printf("팩토리얼을 계산할 정수를 입력하세요: ");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
fact *= i;
}
printf("%d! = %d\n", n, fact);
return 0;
}
예제: 소수 판별하기
코드: prime_number_check.c
#include <stdio.h>
#include <stdbool.h>
int main() {
int n, i;
bool isPrime = true;
printf("소수인지 판별할 정수를 입력하세요: ");
scanf("%d", &n);
for (i = 2; i * i <= n; i++) {
if (n % i == 0) {
isPrime = false;
break;
}
}
if (isPrime && n > 1) {
printf("%d은(는) 소수입니다.\n", n);
} else {
printf("%d은(는) 소수가 아닙니다.\n", n);
}
return 0;
}
예제: 이진수로 변환하기
코드: decimal_to_binary.c
#include <stdio.h>
void decimalToBinary(int n) {
if (n / 2 != 0) {
decimalToBinary(n / 2);
}
printf("%d", n % 2);
}
int main() {
int n;
printf("이진수로 변환할 정수를 입력하세요: ");
scanf("%d", &n);
printf("이진수: ");
decimalToBinary(n);
printf("\n");
return 0;
}
예제: 피보나치 수열 출력하기
코드: fibonacci_sequence.c
#include <stdio.h>
int main() {
int n, a = 0, b = 1, next;
printf("피보나치 수열의 항 개수를 입력하세요: ");
scanf("%d", &n);
printf("피보나치 수열: ");
for (int i = 1; i <= n; i++) {
printf("%d ", a);
next = a + b;
a = b;
b = next;
}
printf("\n");
return 0;
}
예제: 문자열 뒤집기
코드: reverse_string.c
#include <stdio.h>
#include <string.h>
int main() {
char str[100], temp;
int length;
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin);
length = strlen(str) - 1;
for (int i = 0; i < length / 2; i++) {
temp = str[i];
str[i] = str[length - 1 - i];
str[length - 1 - i] = temp;
}
printf("뒤집힌 문자열: %s", str);
return 0;
}
예제: 이차 방정식의 근 구하기
코드: quadratic_roots.c
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c, discriminant, root1, root2;
printf("이차 방정식의 계수를 입력하세요(a, b, c): ");
scanf("%lf %lf %lf", &a, &b, &c);
discriminant = b * b - 4 * a * c;
if (discriminant > 0) {
root1 = (-b + sqrt(discriminant)) / (2 * a);
root2 = (-b - sqrt(discriminant)) / (2 * a);
printf("실근: %.2lf, %.2lf\n", root1, root2);
} else if (discriminant == 0) {
root1 = -b / (2 * a);
printf("중근: %.2lf\n", root1);
} else {
printf("허근이 존재합니다.\n");
}
return 0;
}
예제: 별찍기 - 직각삼각형
코드: right_triangle_pattern.c
#include <stdio.h>
int main() {
int n;
printf("직각삼각형의 높이를 입력하세요: ");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
printf("*");
}
printf("\n");
}
return 0;
}
예제: 별찍기 - 등변삼각형
코드: isosceles_triangle_pattern.c
#include <stdio.h>
int main() {
int n;
printf("등변삼각형의 높이를 입력하세요: ");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i; j++) {
printf(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {
printf("*");
}
printf("\n");
}
return 0;
}
예제: 배열 정렬하기 (오름차순)
코드: array_sort_ascending.c
#include <stdio.h>
#define SIZE 10
int main() {
int arr[SIZE], temp;
printf("10개의 정수를 입력하세요: ");
for (int i = 0; i < SIZE; i++) {
scanf("%d", &arr[i]);
}
for (int i = 0; i < SIZE; i++) {
for (int j = i + 1; j < SIZE; j++) {
if (arr[i] > arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
printf("오름차순 정렬: ");
for (int i = 0; i < SIZE; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
예제: 배열 정렬하기 (내림차순)
코드: array_sort_descending.c
#include <stdio.h>
#define SIZE 10
int main() {
int arr[SIZE], temp;
printf("10개의 정수를 입력하세요: ");
for (int i = 0; i < SIZE; i++) {
scanf("%d", &arr[i]);
}
for (int i = 0; i < SIZE; i++) {
for (int j = i + 1; j < SIZE; j++) {
if (arr[i] < arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
printf("내림차순 정렬: ");
for (int i = 0; i < SIZE; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
예제: 이진 탐색 알고리즘
코드: binary_search.c
#include <stdio.h>
#define SIZE 10
int main() {
int arr[SIZE], key, low = 0, high = SIZE - 1, mid, index = -1;
printf("정렬된 10개의 정수를 입력하세요: ");
for (int i = 0; i < SIZE; i++) {
scanf("%d", &arr[i]);
}
printf("찾을 숫자를 입력하세요: ");
scanf("%d", &key);
while (low <= high) {
mid = (low + high) / 2;
if (arr[mid] == key) {
index = mid;
break;
} else if (arr[mid] < key) {
low = mid + 1;
} else {
high = mid - 1;
}
}
if (index != -1) {
printf("찾은 숫자 %d의 인덱스: %d\n", key, index);
} else {
printf("찾지 못했습니다.\n");
}
return 0;
}
예제: 문자열 길이 구하기
코드: string_length.c
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
int len;
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin);
len = strlen(str) - 1; // 개행 문자 제외
printf("문자열의 길이: %d\n", len);
return 0;
}
예제: 문자열 복사하기
코드: string_copy.c
#include <stdio.h>
#include <string.h>
int main() {
char src[100], dest[100];
printf("문자열을 입력하세요: ");
fgets(src, sizeof(src), stdin);
strcpy(dest, src);
printf("복사된 문자열: %s", dest);
return 0;
}
예제: 문자열 뒤집기
코드: string_reverse.c
#include <stdio.h>
#include <string.h>
int main() {
char str[100], temp;
int len, i;
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin);
len = strlen(str);
for (i = 0; i < len / 2; i++) {
temp = str[i];
str[i] = str[len - i - 2];
str[len - i - 2] = temp;
}
printf("뒤집힌 문자열: %s", str);
return 0;
}
예제: 문자열 비교하기
코드: string_compare.c
#include <stdio.h>
#include <string.h>
int main() {
char str1[100], str2[100];
printf("첫 번째 문자열을 입력하세요: ");
fgets(str1, sizeof(str1), stdin);
printf("두 번째 문자열을 입력하세요: ");
fgets(str2, sizeof(str2), stdin);
if (strcmp(str1, str2) == 0) {
printf("두 문자열이 같습니다.\n");
} else {
printf("두 문자열이 다릅니다.\n");
}
return 0;
}
예제: 문자열 연결하기
코드: string_concatenate.c
#include <stdio.h>
#include <string.h>
int main() {
char str1[200], str2[100];
printf("첫 번째 문자열을 입력하세요: ");
fgets(str1, sizeof(str1), stdin);
printf("두 번째 문자열을 입력하세요: ");
fgets(str2, sizeof(str2), stdin);
str1[strlen(str1) - 1] = '\0'; // 첫 번째 문자열의 개행 문자 제거
strcat(str1, str2);
printf("연결된 문자열: %s", str1);
return 0;
}
예제: 문자열에서 특정 문자 찾기
코드: string_find_char.c
#include <stdio.h>
#include <string.h>
int main() {
char str[100], ch;
int index = -1;
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin);
printf("찾을 문자를 입력하세요: ");
scanf("%c", &ch);
for (int i = 0; i < strlen(str); i++) {
if (str[i] == ch) {
index = i;
break;
}
}
if (index != -1) {
printf("찾은 문자 '%c'의 인덱스: %d\n", ch, index);
} else {
printf("찾지 못했습니다.\n");
}
return 0;
}
예제: 문자열에서 특정 문자열 찾기
코드: string_find_substr.c
#include <stdio.h>
#include <string.h>
int main() {
char str[100], substr[100];
char *ptr;
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin);
printf("찾을 문자열을 입력하세요: ");
fgets(substr, sizeof(substr), stdin);
ptr = strstr(str, substr);
if (ptr != NULL) {
printf("찾은 문자열: %s", ptr);
} else {
printf("찾지 못했습니다.\n");
}
return 0;
}
예제: 파일 복사하기
코드: file_copy.c
#include <stdio.h>
int main() {
FILE *srcFile, *destFile;
char srcFileName[100], destFileName[100];
char ch;
printf("원본 파일명을 입력하세요: ");
scanf("%s", srcFileName);
printf("복사할 파일명을 입력하세요: ");
scanf("%s", destFileName);
srcFile = fopen(srcFileName, "r");
destFile = fopen(destFileName, "w");
if (srcFile == NULL || destFile == NULL) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
while ((ch = fgetc(srcFile)) != EOF) {
fputc(ch, destFile);
}
fclose(srcFile);
fclose(destFile);
printf("파일이 복사되었습니다.\n");
return 0;
}
예제: 구조체 사용하기
코드: struct_example.c
#include <stdio.h>
#include <string.h>
struct Student {
char name[100];
int age;
float score;
};
int main() {
struct Student s1;
strcpy(s1.name, "홍길동");
s1.age = 20;
s1.score = 90.5;
printf("이름: %s, 나이: %d, 성적: %.2f\n", s1.name, s1.age, s1.score);
return 0;
}
예제: 큐 사용하기
코드: queue_example.c
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
typedef struct {
int front, rear;
int data[MAX];
} Queue;
void enqueue(Queue *q, int num) {
if (q->rear < MAX - 1) {
q->data[++q->rear] = num;
} else {
printf("큐가 가득 찼습니다.\n");
}
}
int dequeue(Queue *q) {
if (q->front <= q->rear) {
return q->data[++q->front];
} else {
printf("큐가 비어있습니다.\n");
return -1;
}
}
int main() {
Queue q;
q.front = q.rear = -1;
int num;
printf("정수를 입력하세요(0을 입력하면 종료): ");
while (scanf("%d", &num) && num != 0) {
enqueue(&q, num);
printf("정수를 입력하세요(0을 입력하면 종료): ");
}
printf("큐에서 정수를 꺼냅니다: ");
while ((num = dequeue(&q)) != -1) {
printf("%d ", num);
}
printf("\n");
return 0;
}
예제: 동적 메모리 할당을 이용한 이차원 배열
코드: dynamic_2d_array.c
#include <stdio.h>
#include <stdlib.h>
int main() {
int rows, cols;
int **arr;
printf("행의 개수를 입력하세요: ");
scanf("%d", &rows);
printf("열의 개수를 입력하세요: ");
scanf("%d", &cols);
arr = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {
arr[i] = (int *)malloc(cols * sizeof(int));
}
printf("배열의 원소를 입력하세요:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
scanf("%d", &arr[i][j]);
}
}
printf("입력한 배열:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
for (int i = 0; i < rows; i++) {
free(arr[i]);
}
free(arr);
return 0;
}
예제: 포인터를 이용한 함수 인자 전달
코드: pointer_function_argument.c
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 10, y = 20;
printf("swap 전: x = %d, y = %d\n", x, y);
swap(&x, &y);
printf("swap 후: x = %d, y = %d\n", x, y);
return 0;
}
예제: 함수 포인터 사용하기
코드: function_pointer.c
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int (*funcPtr)(int, int) = add;
int result = funcPtr(10, 20);
printf("결과: %d\n", result);
return 0;
}
예제: 포인터를 이용한 문자열 입력 및 출력
코드: pointer_string_input_output.c
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
char *ptr;
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin);
ptr = str;
printf("입력한 문자열: ");
while (*ptr != '\0') {
putchar(*ptr);
ptr++;
}
return 0;
}
예제: 문자열 포인터 배열
코드: string_pointer_array.c
#include <stdio.h>
int main() {
char *strings[] = {"사과", "바나나", "딸기", "포도"};
for (int i = 0; i < 4; i++) {
printf("%s\n", strings[i]);
}
return 0;
}
예제: 문자열 포인터 배열 정렬
코드: string_pointer_array_sort.c
#include <stdio.h>
#include <string.h>
void swap(char **a, char **b) {
char *temp = *a;
*a = *b;
*b = temp;
}
void sort(char *arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (strcmp(arr[j], arr[j + 1]) > 0) {
swap(&arr[j], &arr[j + 1]);
}
}
}
}
int main() {
char *strings[] = {"딸기", "바나나", "사과", "포도"};
int n = sizeof(strings) / sizeof(strings[0]);
sort(strings, n);
printf("정렬된 문자열 포인터 배열:\n");
for (int i = 0; i < n; i++) {
printf("%s\n", strings[i]);
}
return 0;
}
예제: 구조체 포인터 사용하기
코드: struct_pointer.c
#include <stdio.h>
#include <string.h>
typedef struct {
char name[100];
int age;
float score;
} Student;
void printStudent(Student *s) {
printf("이름: %s, 나이: %d, 성적: %.2f\n", s->name, s->age, s->score);
}
int main() {
Student s1;
strcpy(s1.name, "홍길동");
s1.age = 20;
s1.score = 90.5;
printStudent(&s1);
return 0;
}
예제: 구조체 배열 사용하기
코드: struct_array.c
#include <stdio.h>
#include <string.h>
typedef struct {
char name[100];
int age;
float score;
} Student;
int main() {
Student students[3] = {
{"홍길동", 20, 90.5},
{"김철수", 22, 80.5},
{"이영희", 19, 95.0},
};
for (int i = 0; i < 3; i++) {
printf("이름: %s, 나이: %d, 성적: %.2f\n", students[i].name, students[i].age, students[i].score);
}
return 0;
}
예제: 파일에서 구조체 배열 읽기
코드: struct_array_file_read.c
#include <stdio.h>
typedef struct {
char name[100];
int age;
float score;
} Student;
int main() {
FILE *file = fopen("students.txt", "r");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
Student students[3];
for (int i = 0; i < 3; i++) {
fscanf(file, "%s %d %f", students[i].name, &students[i].age, &students[i].score);
}
fclose(file);
for (int i = 0; i < 3; i++) {
printf("이름: %s, 나이: %d, 성적: %.2f\n", students[i].name, students[i].age, students[i].score);
}
return 0;
}
예제: 파일에 구조체 배열 쓰기
코드: struct_array_file_write.c
#include <stdio.h>
typedef struct {
char name[100];
int age;
float score;
} Student;
int main() {
Student students[] = {
{"홍길동", 20, 90.5},
{"김철수", 22, 80.5},
{"이영희", 19, 95.0},
};
FILE *file = fopen("students.txt", "w");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
for (int i = 0; i < 3; i++) {
fprintf(file, "%s %d %.2f\n", students[i].name, students[i].age, students[i].score);
}
fclose(file);
printf("파일에 구조체 배열 저장 완료\n");
return 0;
}
예제: 함수에서 구조체 반환하기
코드: struct_return_from_function.c
#include <stdio.h>
#include <string.h>
typedef struct {
char name[100];
int age;
float score;
} Student;
Student createStudent(char *name, int age, float score) {
Student s;
strcpy(s.name, name);
s.age = age;
s.score = score;
return s;
}
int main() {
Student s1 = createStudent("홍길동", 20, 90.5);
printf("이름: %s, 나이: %d, 성적: %.2f\n", s1.name, s1.age, s1.score);
return 0;
}
예제: 구조체 포인터를 반환하는 함수
코드: struct_pointer_return_from_function.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[100];
int age;
float score;
} Student;
Student *createStudent(char *name, int age, float score) {
Student *s = (Student *)malloc(sizeof(Student));
strcpy(s->name, name);
s->age = age;
s->score = score;
return s;
}
int main() {
Student *s1 = createStudent("홍길동", 20, 90.5);
printf("이름: %s, 나이: %d, 성적: %.2f\n", s1->name, s1->age, s1->score);
free(s1);
return 0;
}
예제: 연결 리스트 기본 구조
코드: linked_list_basic.c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node *createNode(int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
int main() {
Node *head = createNode(10);
head->next = createNode(20);
head->next->next = createNode(30);
Node *current = head;
while (current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
return 0;
}
예제: 연결 리스트의 원소 추가와 삭제
코드: linked_list_insert_delete.c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node *createNode(int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void insert(Node *prevNode, int data) {
if (prevNode == NULL) {
printf("이전 노드가 존재하지 않습니다.\n");
return;
}
Node *newNode = createNode(data);
newNode->next = prevNode->next;
prevNode->next = newNode;
}
void delete(Node *prevNode) {
if (prevNode->next == NULL) {
printf("삭제할 노드가 존재하지 않습니다.\n");
return;
}
Node *temp = prevNode->next;
prevNode->next = temp->next;
free(temp);
}
int main() {
Node *head = createNode(10);
head->next = createNode(20);
head->next->next = createNode(30);
insert(head, 25);
delete(head);
Node *current = head;
while (current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
return 0;
}
예제: 동적 배열 생성 및 초기화
코드: dynamic_array.c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 5;
int *arr = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
arr[i] = i * 10;
}
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr);
return 0;
}
예제: 동적 배열 크기 변경
코드: dynamic_array_resize.c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 5;
int *arr = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
arr[i] = i * 10;
}
int newSize = 10;
arr = (int *)realloc(arr, newSize * sizeof(int));
for (int i = n; i < newSize; i++) {
arr[i] = i * 10;
}
for (int i = 0; i < newSize; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr);
return 0;
}
예제: 두 개의 동적 배열 합치기
코드: merge_dynamic_arrays.c
#include <stdio.h>
#include <stdlib.h>
int *mergeArrays(int *arr1, int size1, int *arr2, int size2) {
int *result = (int *)malloc((size1 + size2) * sizeof(int));
for (int i = 0; i < size1; i++) {
result[i] = arr1[i];
}
for (int i = 0; i < size2; i++) {
result[size1 + i] = arr2[i];
}
return result;
}
int main() {
int arr1[] = {1, 2, 3};
int arr2[] = {4, 5, 6};
int size1 = sizeof(arr1) / sizeof(arr1[0]);
int size2 = sizeof(arr2) / sizeof(arr2[0]);
int *mergedArray = mergeArrays(arr1, size1, arr2, size2);
for (int i = 0; i < size1 + size2; i++) {
printf("%d ", mergedArray[i]);
}
printf("\n");
free(mergedArray);
return 0;
}
예제: 두 개의 파일 내용 합치기
코드: merge_files.c
#include <stdio.h>
int main() {
FILE *file1 = fopen("file1.txt", "r");
FILE *file2 = fopen("file2.txt", "r");
if (file1 == NULL || file2 == NULL) {
printf("파일 열기 실패\n");
return 1;
}
FILE *mergedFile = fopen("mergedFile.txt", "w");
if (mergedFile == NULL) {
printf("파일 생성 실패\n");
return 1;
}
char ch;
while ((ch = fgetc(file1)) != EOF) {
fputc(ch, mergedFile);
}
while ((ch = fgetc(file2)) != EOF) {
fputc(ch, mergedFile);
}
fclose(file1);
fclose(file2);
fclose(mergedFile);
printf("파일 합치기 완료\n");
return 0;
}
예제: 문자열 뒤집기
코드: reverse_string.c
#include <stdio.h>
#include <string.h>
void reverseString(char *str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
}
int main() {
char string[] = "Hello, World!";
reverseString(string);
printf("%s\n", string);
return 0;
}
예제: 문자열 팰린드롬 확인
코드: check_palindrome.c
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
bool isPalindrome(char *str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
if (str[i] != str[len - i - 1]) {
return false;
}
}
return true;
}
int main() {
char string[] = "racecar";
if (isPalindrome(string)) {
printf("팰린드롬입니다.\n");
} else {
printf("팰린드롬이 아닙니다.\n");
}
return 0;
}
예제: 문자열에서 특정 문자 개수 세기
코드: count_char_in_string.c
#include <stdio.h>
#include <string.h>
int countChar(char *str, char target) {
int count = 0;
for (int i = 0; i < strlen(str); i++) {
if (str[i] == target) {
count++;
}
}
return count;
}
int main() {
char string[] = "Hello, World!";
char target = 'l';
int count = countChar(string, target);
printf("문자 '%c'는 문자열에서 %d번 등장합니다.\n", target, count);
return 0;
}
예제: 문자열 내 단어 개수 세기
코드: count_words_in_string.c
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
int countWords(char *str) {
int count = 0;
bool isWord = false;
for (int i = 0; i < strlen(str); i++) {
if (isalnum(str[i])) {
isWord = true;
} else if (isWord) {
count++;
isWord = false;
}
}
if (isWord) {
count++;
}
return count;
}
int main() {
char string[] = "Hello, World! This is a C language program.";
int count = countWords(string);
printf("문자열에는 %d개의 단어가 있습니다.\n", count);
return 0;
}
예제: 문자열 내 숫자 덧셈
코드: sum_numbers_in_string.c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int sumNumbers(char *str) {
int sum = 0;
int temp = 0;
for (int i = 0; i < strlen(str); i++) {
if (isdigit(str[i])) {
temp = temp * 10 + (str[i] - '0');
} else {
sum += temp;
temp = 0;
}
}
sum += temp;
return sum;
}
int main() {
char string[] = "12abc34def56";
int sum = sumNumbers(string);
printf("문자열 내 숫자의 합은 %d입니다.\n", sum);
return 0;
}
예제: 문자열 내에서 문자열 찾기
코드: find_string_in_string.c
#include <stdio.h>
#include <string.h>
char *findString(char *str, char *target) {
int len1 = strlen(str);
int len2 = strlen(target);
for (int i = 0; i <= len1 - len2; i++) {
int j;
for (j = 0; j < len2; j++) {
if (str[i + j] != target[j]) {
break;
}
}
if (j == len2) {
return str + i;
}
}
return NULL;
}
int main() {
char string[] = "Hello, World!";
char target[] = "World";
char *found = findString(string, target);
if (found) {
printf("문자열을 찾았습니다: %s\n", found);
} else {
printf("문자열을 찾을 수 없습니다.\n");
}
return 0;
}
예제: 문자열 치환하기
코드: replace_string.c
#include <stdio.h>
#include <string.h>
void replaceString(char *str, char oldChar, char newChar) {
for (int i = 0; i < strlen(str); i++) {
if (str[i] == oldChar) {
str[i] = newChar;
}
}
}
int main() {
char string[] = "Hello, World!";
char oldChar = 'l';
char newChar = 'L';
replaceString(string, oldChar, newChar);
printf("치환된 문자열: %s\n", string);
return 0;
}
예제: 문자열에서 특정 문자열 삭제하기
코드: remove_string.c
#include <stdio.h>
#include <string.h>
void removeString(char *str, char *target) {
int len1 = strlen(str);
int len2 = strlen(target);
int idx = 0;
for (int i = 0; i < len1; i++) {
int j;
for (j = 0; j < len2; j++) {
if (str[i + j] != target[j]) {
break;
}
}
if (j != len2) {
str[idx++] = str[i];
} else {
i += len2 - 1;
}
}
str[idx] = '\0';
}
int main() {
char string[] = "Hello, World!";
char target[] = "World";
removeString(string, target);
printf("문자열 삭제 후: %s\n", string);
return 0;
}
예제: 구조체 사용하기
코드: use_struct.c
#include <stdio.h>
struct Point {
int x;
int y;
};
int main() {
struct Point p1;
p1.x = 10;
p1.y = 20;
struct Point p2 = {30, 40};
printf("p1 좌표: (%d, %d)\n", p1.x, p1.y);
printf("p2 좌표: (%d, %d)\n", p2.x, p2.y);
return 0;
}
예제: 구조체와 함수 사용하기
코드: struct_and_function.c
#include <stdio.h>
struct Point {
int x;
int y;
};
struct Point addPoints(struct Point p1, struct Point p2) {
struct Point result;
result.x = p1.x + p2.x;
result.y = p1.y + p2.y;
return result;
}
int main() {
struct Point p1 = {10, 20};
struct Point p2 = {30, 40};
struct Point p3 = addPoints(p1, p2);
printf("p1 + p2 좌표: (%d, %d)\n", p3.x, p3.y);
return 0;
}
예제: 동적으로 구조체 할당하기
코드: dynamic_struct.c
#include <stdio.h>
#include <stdlib.h>
struct Point {
int x;
int y;
};
int main() {
struct Point *p = (struct Point *)malloc(sizeof(struct Point));
if (p == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
p->x = 10;
p->y = 20;
printf("좌표: (%d, %d)\n", p->x, p->y);
free(p);
return 0;
}
예제: 구조체 배열 사용하기
코드: struct_array.c
#include <stdio.h>
struct Point {
int x;
int y;
};
int main() {
struct Point points[3] = {
{10, 20},
{30, 40},
{50, 60}
};
for (int i = 0; i < 3; i++) {
printf("좌표 %d: (%d, %d)\n", i + 1, points[i].x, points[i].y);
}
return 0;
}
예제: 구조체 포인터 배열 사용하기
코드: struct_pointer_array.c
#include <stdio.h>
#include <stdlib.h>
struct Point {
int x;
int y;
};
int main() {
struct Point *points[3];
for (int i = 0; i < 3; i++) {
points[i] = (struct Point *)malloc(sizeof(struct Point));
if (points[i] == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
points[i]->x = (i + 1) * 10;
points[i]->y = (i + 1) * 20;
}
for (int i = 0; i < 3; i++) {
printf("좌표 %d: (%d, %d)\n", i + 1, points[i]->x, points[i]->y);
}
for (int i = 0; i < 3; i++) {
free(points[i]);
}
return 0;
}
예제: 구조체 내부에 구조체 사용하기
코드: nested_struct.c
#include <stdio.h>
struct Date {
int year;
int month;
int day;
};
struct Person {
char name[20];
struct Date birth;
};
int main() {
struct Person person = {"John Doe", {2000, 1, 1}};
printf("이름: %s\n", person.name);
printf("생년월일: %d년 %d월 %d일\n", person.birth.year, person.birth.month, person.birth.day);
return 0;
}
예제: 공용체(union) 사용하기
코드: use_union.c
#include <stdio.h>
union Data {
int integer;
float decimal;
char character;
};
int main() {
union Data data;
data.integer = 42;
printf("정수: %d\n", data.integer);
data.decimal = 3.14f;
printf("실수: %.2f\n", data.decimal);
data.character = 'A';
printf("문자: %c\n", data.character);
return 0;
}
예제: 공용체와 구조체 혼합 사용하기
코드: union_and_struct.c
#include <stdio.h>
typedef enum { INTEGER, FLOAT, CHARACTER } DataType;
struct Data {
DataType type;
union {
int integer;
float decimal;
char character;
} value;
};
int main() {
struct Data data1 = {INTEGER, .value.integer = 42};
struct Data data2 = {FLOAT, .value.decimal = 3.14f};
struct Data data3 = {CHARACTER, .value.character = 'A'};
printf("data1: 정수 %d\n", data1.value.integer);
printf("data2: 실수 %.2f\n", data2.value.decimal);
printf("data3: 문자 %c\n", data3.value.character);
return 0;
}
예제: 파일에서 문자열 읽기
코드: read_string_from_file.c
#include <stdio.h>
int main() {
FILE *file = fopen("input.txt", "r");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
char buffer[100];
fgets(buffer, sizeof(buffer), file);
printf("파일에서 읽은 문자열: %s\n", buffer);
fclose(file);
return 0;
}
예제: 파일에서 숫자 읽기
코드: read_numbers_from_file.c
#include <stdio.h>
int main() {
FILE *file = fopen("input.txt", "r");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
int num1, num2;
fscanf(file, "%d %d", &num1, &num2);
printf("파일에서 읽은 숫자: %d, %d\n", num1, num2);
fclose(file);
return 0;
}
예제: 파일에 문자열 쓰기
코드: write_string_to_file.c
#include <stdio.h>
int main() {
FILE *file = fopen("output.txt", "w");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
char buffer[] = "Hello, World!";
fputs(buffer, file);
printf("파일에 문자열이 쓰여졌습니다.\n");
fclose(file);
return 0;
}
예제: 파일에 숫자 쓰기
코드: write_numbers_to_file.c
#include <stdio.h>
int main() {
FILE *file = fopen("output.txt", "w");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
int num1 = 42, num2 = 55;
fprintf(file, "%d %d", num1, num2);
printf("파일에 숫자가 쓰여졌습니다.\n");
fclose(file);
return 0;
}
예제: 파일 복사하기
코드: copy_file.c
#include <stdio.h>
int main() {
FILE *src = fopen("input.txt", "r");
FILE *dest = fopen("output.txt", "w");
if (src == NULL || dest == NULL) {
printf("파일 열기 실패\n");
return 1;
}
char c;
while ((c = fgetc(src)) != EOF) {
fputc(c, dest);
}
printf("파일이 복사되었습니다.\n");
fclose(src);
fclose(dest);
return 0;
}
예제: 이진 파일에서 구조체 읽기
코드: read_struct_from_binary_file.c
#include <stdio.h>
struct Person {
char name[20];
int age;
};
int main() {
FILE *file = fopen("input.bin", "rb");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
struct Person person;
fread(&person, sizeof(struct Person), 1, file);
printf("이름: %s\n", person.name);
printf("나이: %d\n", person.age);
fclose(file);
return 0;
}
예제: 이진 파일에 구조체 쓰기
코드: write_struct_to_binary_file.c
#include <stdio.h>
struct Person {
char name[20];
int age;
};
int main() {
FILE *file = fopen("output.bin", "wb");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
struct Person person = {"John Doe", 30};
fwrite(&person, sizeof(struct Person), 1, file);
printf("구조체가 이진 파일에 쓰여졌습니다.\n");
fclose(file);
return 0;
}
예제: 파일의 특정 위치로 이동하기
코드: move_file_position.c
#include <stdio.h>
int main() {
FILE *file = fopen("input.txt", "r");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
fseek(file, 5, SEEK_SET);
char buffer[100];
fgets(buffer, sizeof(buffer), file);
printf("파일의 5번째 위치부터 읽은 문자열: %s\n", buffer);
fclose(file);
return 0;
}
예제: 함수 포인터 사용하기
코드: function_pointer.c
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int (*addFunc)(int, int) = add;
int result = addFunc(3, 4);
printf("3 + 4 = %d\n", result);
return 0;
}
예제: 함수 포인터를 사용한 콜백 함수
코드: callback_function.c
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int performOperation(int a, int b, int (*operation)(int, int)) {
return operation(a, b);
}
int main() {
printf("3 + 4 = %d\n", performOperation(3, 4, add));
printf("3 - 4 = %d\n", performOperation(3, 4, subtract));
return 0;
}
예제: 함수 포인터를 이용한 배열 정렬
코드: sort_array_with_function_pointer.c
#include <stdio.h>
#include <stdbool.h>
bool ascending(int a, int b) {
return a < b;
}
bool descending(int a, int b) {
return a > b;
}
void sort(int *arr, int length, bool (*compare)(int, int)) {
for (int i = 0; i < length - 1; i++) {
for (int j = 0; j < length - 1 - i; j++) {
if (compare(arr[j], arr[j + 1])) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void printArray(int *arr, int length) {
for (int i = 0; i < length; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {5, 2, 8, 4, 1};
int length = sizeof(arr) / sizeof(arr[0]);
printf("오름차순 정렬:\n");
sort(arr, length, ascending);
printArray(arr, length);
printf("내림차순 정렬:\n");
sort(arr, length, descending);
printArray(arr, length);
return 0;
}
예제: 동적 메모리 할당 크기 변경
코드: realloc_memory.c
#define _CRT_SECURE_NO_WARNINGS // Visual Studio에서 경고 메시지를 무시하도록 하는 매크로
#include <stdio.h> // 표준 입출력 함수를 사용하기 위해 stdio.h 헤더 파일을 포함
#include <stdlib.h> // malloc, realloc 등의 메모리 관리 함수를 사용하기 위해 stdlib.h 헤더 파일을 포함
int main(void)
{
int* arr = (int*)malloc(5 * sizeof(int)); // 정수형 포인터 arr를 선언하고, 동적 메모리 할당을 통해 int형 변수 5개 크기만큼의 메모리를 할당
if (arr == NULL) // 메모리 할당이 실패한 경우
{
printf("메모리 할당 실패\n"); // 에러 메시지 출력
return 1; // 프로그램 종료
}
for (int i = 0; i < 5; i++) // arr 배열에 0부터 8까지의 2의 배수를 저장
{
arr[i] = i * 2;
}
int* newArr = (int*)realloc(arr, 10 * sizeof(int)); // arr의 크기를 10개의 int 크기로 늘리는 realloc 함수 사용
if (newArr == NULL) // 메모리 재할당이 실패한 경우
{
printf("메모리 재할당 실패\n"); // 에러 메시지 출력
free(arr); // 원래 할당한 메모리 해제
return 1; // 프로그램 종료
}
arr = newArr; // arr 포인터에 재할당된 메모리의 주소 할당
for (int i = 5; i < 10; i++) // 새롭게 할당된 arr 배열의 나머지 부분에 10부터 18까지의 2의 배수를 저장
{
arr[i] = i * 2;
}
for (int i = 0; i < 10; i++) // arr 배열에 저장된 모든 원소 출력
{
printf("%d ", arr[i]);
}
printf("\n");
free(arr); // 동적으로 할당했던 메모리 해제
return 0; // 프로그램 정상 종료
}
0 2 4 6 8 10 12 14 16 18
예제: 동적 메모리 할당을 사용한 문자열 입력
코드: dynamic_string_input.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *readString() {
int bufferSize = 10;
char *buffer = (char *) malloc(bufferSize * sizeof(char));
if (buffer == NULL) {
printf("메모리 할당 실패\n");
return NULL;
}
int position = 0;
char c;
while ((c = getchar()) != '\n') {
buffer[position++] = c;
if (position == bufferSize - 1) {
bufferSize *= 2;
char *newBuffer = (char *) realloc(buffer, bufferSize * sizeof(char));
if (newBuffer == NULL) {
printf("메모리 재할당 실패\n");
free(buffer);
return NULL;
}
buffer = newBuffer;
}
}
buffer[position] = '\0';
return buffer;
}
int main() {
printf("문자열을 입력하세요: ");
char *inputString = readString();
if (inputString == NULL) {
return 1;
}
printf("입력한 문자열: %s\n", inputString);
free(inputString);
return 0;
}
예제: 동적 메모리 할당을 사용한 2차원 배열
코드: dynamic_2d_array.c
#include <stdio.h>
#include <stdlib.h>
int main() {
int rows = 3, cols = 4;
int **arr = (int **) malloc(rows * sizeof(int *));
if (arr == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
for (int i = 0; i < rows; i++) {
arr[i] = (int *) malloc(cols * sizeof(int));
if (arr[i] == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
arr[i][j] = i * cols + j;
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
for (int i = 0; i < rows; i++) {
free(arr[i]);
}
free(arr);
return 0;
}
예제: 링크드 리스트 구현
코드: linked_list.c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node *createNode(int data) {
Node *newNode = (Node *) malloc(sizeof(Node));
if (newNode == NULL) {
printf("메모리 할당 실패\n");
return NULL;
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void printList(Node *head) {
Node *current = head;
while (current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
}
void freeList(Node *head) {
Node *current = head;
while (current != NULL) {
Node *temp = current;
current = current->next;
free(temp);
}
}
int main() {
Node *head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
printList(head);
freeList(head);
return 0;
}
예제: 스택 구현
코드: stack.c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
typedef struct Stack {
Node *top;
} Stack;
Stack *createStack() {
Stack *stack = (Stack *) malloc(sizeof(Stack));
if (stack == NULL) {
printf("메모리 할당 실패\n");
return NULL;
}
stack->top = NULL;
return stack;
}
int isEmpty(Stack *stack) {
return stack->top == NULL;
}
void push(Stack *stack, int data) {
Node *newNode = (Node *) malloc(sizeof(Node));
if (newNode == NULL) {
printf("메모리 할당 실패\n");
return;
}
newNode->data = data;
newNode->next = stack->top;
stack->top = newNode;
}
int pop(Stack *stack) {
if (isEmpty(stack)) {
printf("스택이 비어있습니다.\n");
return -1;
}
int data = stack->top->data;
Node *temp = stack->top;
stack->top = stack->top->next;
free(temp);
return data;
}
void freeStack(Stack *stack) {
Node *current = stack->top;
while (current != NULL) {
Node *temp = current;
current = current->next;
free(temp);
}
free(stack);
}
int main() {
Stack *stack = createStack();
push(stack, 1);
push(stack, 2);
push(stack, 3);
printf("pop: %d\n", pop(stack));
printf("pop: %d\n", pop(stack));
printf("pop: %d\n", pop(stack));
freeStack(stack);
return 0;
}
예제: 큐 구현
코드: queue.c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
typedef struct Queue {
Node *front;
Node *rear;
} Queue;
Queue *createQueue() {
Queue *queue = (Queue *) malloc(sizeof(Queue));
if (queue == NULL) {
printf("메모리 할당 실패\n");
return NULL;
}
queue->front = NULL;
queue->rear = NULL;
return queue;
}
int isEmpty(Queue *queue) {
return queue->front == NULL;
}
void enqueue(Queue *queue, int data) {
Node *newNode = (Node *) malloc(sizeof(Node));
if (newNode == NULL) {
printf("메모리 할당 실패\n");
return;
}
newNode->data = data;
newNode->next = NULL;
if (isEmpty(queue)) {
queue->front = newNode;
queue->rear = newNode;
} else {
queue->rear->next = newNode;
queue->rear = newNode;
}
}
int dequeue(Queue *queue) {
if (isEmpty(queue)) {
printf("큐가 비어있습니다.\n");
return -1;
}
int data = queue->front->data;
Node *temp = queue->front;
queue->front = queue->front->next;
if (queue->front == NULL) {
queue->rear = NULL;
}
free(temp);
return data;
}
void freeQueue(Queue *queue) {
Node *current = queue->front;
while (current != NULL) {
Node *temp = current;
current = current->next;
free(temp);
}
free(queue);
}
int main() {
Queue *queue = createQueue();
enqueue(queue, 1);
enqueue(queue, 2);
enqueue(queue, 3);
printf("dequeue: %d\n", dequeue(queue));
printf("dequeue: %d\n", dequeue(queue));
printf("dequeue: %d\n", dequeue(queue));
freeQueue(queue);
return 0;
}
예제: 이진 탐색 트리 구현
코드: binary_search_tree.c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *left;
struct Node *right;
} Node;
Node *createNode(int data) {
Node *newNode = (Node *) malloc(sizeof(Node));
if (newNode == NULL) {
printf("메모리 할당 실패\n");
return NULL;
}
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
Node *insert(Node *root, int data) {
if (root == NULL) {
return createNode(data);
}
if (data < root->data) {
root->left = insert(root->left, data);
} else if (data > root->data) {
root->right = insert(root->right, data);
}
return root;
}
Node *search(Node *root, int data) {
if (root == NULL || root->data == data) {
return root;
}
if (data < root->data) {
return search(root->left, data);
} else {
return search(root->right, data);
}
}
void inorder(Node *root) {
if (root == NULL) {
return;
}
inorder(root->left);
printf("%d ", root->data);
inorder(root->right);
}
void freeTree(Node *root) {
if (root == NULL) {
return;
}
freeTree(root->left);
freeTree(root->right);
free(root);
}
int main() {
Node *root = NULL;
root = insert(root, 5);
root = insert(root, 3);
root = insert(root, 7);
root = insert(root, 2);
root = insert(root, 4);
root = insert(root, 6);
root = insert(root, 8);
printf("Inorder traversal: ");
inorder(root);
printf("\n");
Node *searchNode = search(root, 4);
if (searchNode) {
printf("Node found: %d\n", searchNode->data);
} else {
printf("Node not found\n");
}
freeTree(root);
return 0;
}
예제: 힙 정렬 구현
코드: heap_sort.c
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void heapify(int arr[], int n, int i) {
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left] > arr[largest]) {
largest = left;
}
if (right < n && arr[right] > arr[largest]) {
largest = right;
}
if (largest != i) {
swap(&arr[i], &arr[largest]);
heapify(arr, n, largest);
}
}
void heapSort(int arr[], int n) {
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(arr, n, i);
}
for (int i = n - 1; i > 0; i--) {
swap(&arr[0], &arr[i]);
heapify(arr, i, 0);
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {12, 11, 13, 5, 6, 7};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Unsorted array: ");
printArray(arr, n);
heapSort(arr, n);
printf("Sorted array: ");
printArray(arr, n);
return 0;
}
예제: 퀵 정렬 구현
코드: quick_sort.c
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return i + 1;
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Unsorted array: ");
printArray(arr, n);
quickSort(arr, 0, n - 1);
printf("Sorted array: ");
printArray(arr, n);
return 0;
}
예제: 병합 정렬 구현
코드: merge_sort.c
#include <stdio.h>
#include <stdlib.h>
void merge(int arr[], int left[], int left_size, int right[], int right_size) {
int i = 0, j = 0, k = 0;
while (i < left_size && j < right_size) {
if (left[i] < right[j]) {
arr[k++] = left[i++];
} else {
arr[k++] = right[j++];
}
}
while (i < left_size) {
arr[k++] = left[i++];
}
while (j < right_size) {
arr[k++] = right[j++];
}
}
void mergeSort(int arr[], int size) {
if (size < 2) {
return;
}
int mid = size / 2;
int *left = (int *) malloc(mid * sizeof(int));
int *right = (int *) malloc((size - mid) * sizeof(int));
for (int i = 0; i < mid; i++) {
left[i] = arr[i];
}
for (int i = mid; i < size; i++) {
right[i - mid] = arr[i];
}
mergeSort(left, mid);
mergeSort(right, size - mid);
merge(arr, left, mid, right, size - mid);
free(left);
free(right);
}
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {12, 11, 13, 5, 6, 7};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Unsorted array: ");
printArray(arr, n);
mergeSort(arr, n);
printf("Sorted array: ");
printArray(arr, n);
return 0;
}
예제: 삽입 정렬 구현
코드: insertion_sort.c
#include <stdio.h>
void insertionSort(int arr[], int n) {
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {12, 11, 13, 5, 6};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Unsorted array: ");
printArray(arr, n);
insertionSort(arr, n);
printf("Sorted array: ");
printArray(arr, n);
return 0;
}
예제: 이진 탐색
코드: binary_search.c
#include <stdio.h>
int binarySearch(int arr[], int l, int r, int x) {
if (r >= l) {
int mid = l + (r - l) / 2;
if (arr[mid] == x) {
return mid;
}
if (arr[mid] > x) {
return binarySearch(arr, l, mid - 1, x);
}
return binarySearch(arr, mid + 1, r, x);
}
return -1;
}
int main() {
int arr[] = {2, 3, 4, 10, 40};
int x = 10;
int n = sizeof(arr) / sizeof(arr[0]);
int result = binarySearch(arr, 0, n - 1, x);
if (result == -1) {
printf("Element is not present in array\n");
} else {
printf("Element is present at index %d\n", result);
}
return 0;
}
예제: 동적 메모리 할당
코드: dynamic_memory_allocation.c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("Enter the number of elements: ");
scanf("%d", &n);
int *array = (int *)malloc(n * sizeof(int));
if (array == NULL) {
printf("Memory not allocated.\n");
return 1;
}
printf("Memory successfully allocated using malloc.\n");
for (int i = 0; i < n; ++i) {
array[i] = i + 1;
}
printf("The elements of the array are: ");
for (int i = 0; i < n; ++i) {
printf("%d ", array[i]);
}
printf("\n");
free(array);
return 0;
}
예제: 구조체 포인터 사용
코드: struct_pointer.c
#include <stdio.h>
typedef struct {
int id;
char name[20];
int age;
} Person;
void printPersonInfo(Person *p) {
printf("아이디: %d\n", p->id);
printf("이름: %s\n", p->name);
printf("나이: %d\n", p->age);
}
int main() {
Person person = {1, "홍길동", 30};
printPersonInfo(&person);
return 0;
}
예제: 문자열 연결
코드: string_concat.c
#include <stdio.h>
#include <string.h>
int main() {
char str1[100], str2[100];
printf("첫 번째 문자열을 입력하세요: ");
fgets(str1, sizeof(str1), stdin);
printf("두 번째 문자열을 입력하세요: ");
fgets(str2, sizeof(str2), stdin);
str1[strlen(str1) - 1] = '\0'; // 개행 문자 제거
strcat(str1, str2);
printf("연결된 문자열: %s", str1);
return 0;
}
예제: 배열 합계와 평균 구하기
코드: array_sum_average.c
#include <stdio.h>
int main() {
int n, i;
printf("배열의 크기를 입력하세요: ");
scanf("%d", &n);
int arr[n];
printf("배열의 요소를 입력하세요: ");
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int sum = 0;
for (i = 0; i < n; i++) {
sum += arr[i];
}
double average = (double)sum / n;
printf("합계: %d\n", sum);
printf("평균: %.2f\n", average);
return 0;
}
예제: 소수 판별
코드: prime_check.c
#include <stdio.h>
#include <stdbool.h>
bool isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int main() {
int n;
printf("소수 판별할 숫자를 입력하세요: ");
scanf("%d", &n);
if (isPrime(n)) {
printf("%d는 소수입니다.\n", n);
} else {
printf("%d는 소수가 아닙니다.\n", n);
}
return 0;
}
예제: 포인터와 배열
코드: pointer_array.c
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int *ptr = arr;
printf("배열의 첫 번째 요소: %d\n", *ptr);
ptr++;
printf("배열의 두 번째 요소: %d\n", *ptr);
return 0;
}
예제: 문자열 대소문자 변환
코드: toggle_case.c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main() {
char str[100];
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin);
for (int i = 0; i < strlen(str); i++) {
if (islower(str[i])) {
str[i] = toupper(str[i]);
} else if (isupper(str[i])) {
str[i] = tolower(str[i]);
}
}
printf("변환된 문자열: %s", str);
return 0;
}
예제: 2차원 배열 합계
코드: two_dimensional_array_sum.c
#include <stdio.h>
int main() {
int rows, cols;
printf("행과 열의 크기를 입력하세요: ");
scanf("%d %d", &rows, &cols);
int arr[rows][cols];
printf("배열의 요소를 입력하세요:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
scanf("%d", &arr[i][j]);
}
}
int sum = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
sum += arr[i][j];
}
}
printf("배열의 합계: %d\n", sum);
return 0;
}
예제: 동적 메모리 할당
코드: dynamic_memory_allocation.c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("동적으로 할당할 배열의 크기를 입력하세요: ");
scanf("%d", &n);
int *arr = (int *)malloc(n * sizeof(int));
printf("배열의 요소를 입력하세요: ");
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
printf("입력된 배열: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr);
return 0;
}
예제: 문자열 뒤집기
코드: reverse_string.c
#include <stdio.h>
#include <string.h>
void reverseString(char *str) {
int len = strlen(str);
char temp;
for (int i = 0; i < len / 2; i++) {
temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
}
int main() {
char str[100];
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin);
str[strlen(str) - 1] = '\0'; // 개행 문자 제거
reverseString(str);
printf("뒤집힌 문자열: %s\n", str);
return 0;
}
예제: 다항식의 합 구하기
코드: polynomial_sum.c
#include <stdio.h>
#include <math.h>
double polynomialSum(double x, int n) {
double sum = 0;
for (int i = 0; i <= n; i++) {
sum += pow(x, i);
}
return sum;
}
int main() {
double x;
int n;
printf("x 값을 입력하세요: ");
scanf("%lf", &x);
printf("다항식의 최고차항을 입력하세요: ");
scanf("%d", &n);
printf("다항식의 합: %.2f\n", polynomialSum(x, n));
return 0;
}
예제: 파일에서 문자열 읽기
코드: read_string_file.c
#include <stdio.h>
int main() {
FILE *file = fopen("input.txt", "r");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
char str[100];
fgets(str, sizeof(str), file);
printf("읽은 문자열: %s", str);
fclose(file);
return 0;
}
예제: 구조체 사용하기
코드: use_struct.c
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
int main() {
Point p1;
printf("점의 x, y 좌표를 입력하세요: ");
scanf("%d %d", &p1.x, &p1.y);
printf("입력한 좌표: (%d, %d)\n", p1.x, p1.y);
return 0;
}
예제: 소수 판별하기
코드: prime_number_check.c
#include <stdio.h>
#include <stdbool.h>
bool isPrime(int num) {
if (num <= 1) {
return false;
}
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
int main() {
int num;
printf("소수인지 판별할 숫자를 입력하세요: ");
scanf("%d", &num);
if (isPrime(num)) {
printf("%d은(는) 소수입니다.\n", num);
} else {
printf("%d은(는) 소수가 아닙니다.\n", num);
}
return 0;
}
예제: 팩토리얼 구하기
코드: factorial.c
#include <stdio.h>
int factorial(int num) {
if (num == 0) {
return 1;
}
return num * factorial(num - 1);
}
int main() {
int num;
printf("팩토리얼을 구할 숫자를 입력하세요: ");
scanf("%d", &num);
printf("%d! = %d\n", num, factorial(num));
return 0;
}
예제: 배열에서 최댓값 찾기
코드: find_max_in_array.c
#include <stdio.h>
int findMaxInArray(int arr[], int size) {
int max = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int main() {
int arr[] = {3, 5, 2, 8, 1};
int size = sizeof(arr) / sizeof(arr[0]);
printf("배열에서의 최댓값: %d\n", findMaxInArray(arr, size));
return 0;
}
예제: 배열에서 최솟값 찾기
코드: find_min_in_array.c
#include <stdio.h>
int findMinInArray(int arr[], int size) {
int min = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
int main() {
int arr[] = {3, 5, 2, 8, 1};
int size = sizeof(arr) / sizeof(arr[0]);
printf("배열에서의 최솟값: %d\n", findMinInArray(arr, size));
return 0;
}
예제: 구조체와 함수 사용하기
코드: struct_and_functions.c
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
Point addPoints(Point p1, Point p2) {
Point result;
result.x = p1.x + p2.x;
result.y = p1.y + p2.y;
return result;
}
int main() {
Point p1 = {3, 4};
Point p2 = {2, 6};
Point sum = addPoints(p1, p2);
printf("두 점의 합: (%d, %d)\n", sum.x, sum.y);
return 0;
}
예제: 문자열 길이 구하기
코드: string_length.c
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin);
int length = strlen(str) - 1; // 줄바꿈 문자 제외
printf("문자열의 길이: %d\n", length);
return 0;
}
예제: 문자열 뒤집기
코드: reverse_string.c
#include <stdio.h>
#include <string.h>
void reverseString(char *str) {
int length = strlen(str);
for (int i = 0; i < length / 2; i++) {
char temp = str[i];
str[i] = str[length - i - 1];
str[length - i - 1] = temp;
}
}
int main() {
char str[100];
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin);
str[strlen(str) - 1] = '\0'; // 줄바꿈 문자 제거
reverseString(str);
printf("뒤집힌 문자열: %s\n", str);
return 0;
}
예제: 1부터 n까지의 합 구하기
코드: sum_of_1_to_n.c
#include <stdio.h>
int sumOf1ToN(int n) {
return (n * (n + 1)) / 2;
}
int main() {
int n;
printf("1부터 n까지의 합을 구할 정수 n을 입력하세요: ");
scanf("%d", &n);
printf("1부터 %d까지의 합: %d\n", n, sumOf1ToN(n));
return 0;
}
예제: 1부터 n까지의 곱 구하기
코드: product_of_1_to_n.c
#include <stdio.h>
long long productOf1ToN(int n) {
long long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
int main() {
int n;
printf("1부터 n까지의 곱을 구할 정수 n을 입력하세요: ");
scanf("%d", &n);
printf("1부터 %d까지의 곱: %lld\n", n, productOf1ToN(n));
return 0;
}
예제: 배열 원소의 합 구하기
코드: array_element_sum.c
#include <stdio.h>
int arrayElementSum(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}
int main() {
int arr[] = {3, 5, 2, 8, 1};
int size = sizeof(arr) / sizeof(arr[0]);
printf("배열 원소의 합: %d\n", arrayElementSum(arr, size));
return 0;
}
예제: 배열 원소의 곱 구하기
코드: array_element_product.c
#include <stdio.h>
long long arrayElementProduct(int arr[], int size) {
long long product = 1;
for (int i = 0; i < size; i++) {
product *= arr[i];
}
return product;
}
int main() {
int arr[] = {3, 5, 2, 8, 1};
int size = sizeof(arr) / sizeof(arr[0]);
printf("배열 원소의 곱: %lld\n", arrayElementProduct(arr, size));
return 0;
}
예제: 이차방정식의 해 구하기
코드: quadratic_equation.c
#include <stdio.h>
#include <math.h>
void solveQuadraticEquation(int a, int b, int c) {
double discriminant = b * b - 4 * a * c;
if (discriminant > 0) {
double x1 = (-b + sqrt(discriminant)) / (2 * a);
double x2 = (-b - sqrt(discriminant)) / (2 * a);
printf("실근: x1 = %.2lf, x2 = %.2lf\n", x1, x2);
} else if (discriminant == 0) {
double x = -b / (2 * a);
printf("중근: x = %.2lf\n", x);
} else {
printf("허근: 실제 해가 없습니다.\n");
}
}
int main() {
int a, b, c;
printf("이차방정식의 계수 a, b, c를 입력하세요: ");
scanf("%d %d %d", &a, &b, &c);
solveQuadraticEquation(a, b, c);
return 0;
}
예제: 팩토리얼 구하기 (재귀 사용)
코드: factorial_recursive.c
#include <stdio.h>
long long factorial(int n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
int main() {
int num;
printf("팩토리얼을 구할 숫자를 입력하세요: ");
scanf("%d", &num);
printf("%d! = %lld\n", num, factorial(num));
return 0;
}
예제: 피보나치 수열 구하기 (반복문 사용)
코드: fibonacci_iterative.c
#include <stdio.h>
long long fibonacci(int n) {
long long a = 0, b = 1, temp;
for (int i = 1; i <= n; i++) {
temp = a;
a = b;
b = temp + b;
}
return a;
}
int main() {
int num;
printf("피보나치 수열의 n번째 항을 구할 숫자 n을 입력하세요: ");
scanf("%d", &num);
printf("피보나치 수열의 %d번째 항: %lld\n", num, fibonacci(num));
return 0;
}
예제: 피보나치 수열 구하기 (재귀 사용)
코드: fibonacci_recursive.c
#include <stdio.h>
long long fibonacci(int n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
int main() {
int num;
printf("피보나치 수열의 n번째 항을 구할 숫자 n을 입력하세요: ");
scanf("%d", &num);
printf("피보나치 수열의 %d번째 항: %lld\n", num, fibonacci(num));
return 0;
}
예제: 삼각수 구하기
코드: triangular_number.c
#include <stdio.h>
int triangularNumber(int n) {
return (n * (n + 1)) / 2;
}
int main() {
int num;
printf("삼각수를 구할 숫자를 입력하세요: ");
scanf("%d", &num);
printf("%d번째 삼각수: %d\n", num, triangularNumber(num));
return 0;
}
예제: 문자열 길이 구하기
코드: string_length.c
#define _CRT_SECURE_NO_WARNINGS // Visual Studio에서 안전하지 않은 함수 경고를 무시하도록 함
#include <stdio.h>
#include <string.h>
int main(void)
{
// 길이 80을 가진 문자 배열을 선언합니다.
char str[80];
// 사용자에게 문자열을 입력받기 위한 안내 메시지를 출력합니다.
printf("문자열을 입력하세요: ");
// 입력된 문자열을 str 배열에 저장합니다.
scanf("%s", str);
// 문자열의 길이를 계산하고 출력합니다.
printf("문자열의 길이: %lu\n", strlen(str));
return 0;
}
문자열을 입력하세요: 안녕하세요.
문자열의 길이: 11
예제: 문자열 복사하기
코드: string_copy.c
#include <stdio.h>
#include <string.h>
int main() {
char src[100], dest[100];
printf("복사할 문자열을 입력하세요: ");
scanf("%s", src);
strcpy(dest, src);
printf("복사된 문자열: %s\n", dest);
return 0;
}
예제: 문자열 뒤집기
코드: string_reverse.c
#include <stdio.h>
#include <string.h>
void reverseString(char *str) {
int length = strlen(str);
char temp;
for (int i = 0; i < length / 2; i++) {
temp = str[i];
str[i] = str[length - 1 - i];
str[length - 1 - i] = temp;
}
}
int main() {
char str[100];
printf("뒤집을 문자열을 입력하세요: ");
scanf("%s", str);
reverseString(str);
printf("뒤집은 문자열: %s\n", str);
return 0;
}
예제: 알파벳 대소문자 변환
코드: case_conversion.c
#include <stdio.h>
#include <ctype.h>
void caseConversion(char *str) {
for (int i = 0; str[i]; i++) {
if (isupper(str[i])) {
str[i] = tolower(str[i]);
} else if (islower(str[i])) {
str[i] = toupper(str[i]);
}
}
}
int main() {
char str[100];
printf("대소문자 변환할 문자열을 입력하세요: ");
scanf("%s", str);
caseConversion(str);
printf("대소문자 변환된 문자열: %s\n", str);
return 0;
}
예제: 문자열에서 특정 문자 개수 세기
코드: count_char_in_string.c
#include <stdio.h>
#include <string.h>
int countCharInString(char *str, char ch) {
int count = 0;
for (int i = 0; str[i]; i++) {
if (str[i] == ch) {
count++;
}
}
return count;
}
int main() {
char str[100], ch;
printf("문자열을 입력하세요: ");
scanf("%s", str);
getchar(); // 버퍼에서 개행문자를 없애기 위해 사용
printf("세고자 하는 문자를 입력하세요: ");
scanf("%c", &ch);
printf("문자열에서 '%c'의 개수: %d\n", ch, countCharInString(str, ch));
return 0;
}
예제: 문자열에서 특정 단어 개수 세기
코드: count_word_in_string.c
#include <stdio.h>
#include <string.h>
int countWordInString(char *str, char *word) {
int count = 0;
char *temp = strstr(str, word);
while (temp) {
count++;
temp = strstr(temp + 1, word);
}
return count;
}
int main() {
char str[100], word[100];
printf("문자열을 입력하세요: ");
scanf("%s", str);
printf("세고자 하는 단어를 입력하세요: ");
scanf("%s", word);
printf("문자열에서 \"%s\"의 개수: %d\n", word, countWordInString(str, word));
return 0;
}
예제: 동적 메모리 할당 (int 배열)
코드: dynamic_memory_allocation_int_array.c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, *arr;
printf("배열의 크기를 입력하세요: ");
scanf("%d", &n);
arr = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
printf("arr[%d]의 값을 입력하세요: ", i);
scanf("%d", &arr[i]);
}
printf("입력한 배열의 값: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr);
return 0;
}
예제: 구조체 사용하기
코드: using_struct.c
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
int main() {
Point p1;
printf("점의 좌표를 입력하세요 (x, y): ");
scanf("%d %d", &p1.x, &p1.y);
printf("입력한 점의 좌표: (%d, %d)\n", p1.x, p1.y);
return 0;
}
예제: 구조체 포인터 사용하기
코드: using_struct_pointer.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
typedef struct
{
int x;
int y;
} Point;
int main(void)
{
Point p1;
Point* ptr = &p1;
printf("점의 좌표를 입력하세요 (x, y): ");
scanf("%d %d", &ptr->x, &ptr->y);
printf("입력한 점의 좌표: (%d, %d)\n", ptr->x, ptr->y);
return 0;
}
점의 좌표를 입력하세요 (x, y): 10 20
입력한 점의 좌표: (10, 20)
예제: 구조체 배열 사용하기
코드: using_struct_array.c
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
int main() {
int n;
printf("점의 개수를 입력하세요: ");
scanf("%d", &n);
Point points[n];
for (int i = 0; i < n; i++) {
printf("점 %d의 좌표를 입력하세요 (x, y): ", i + 1);
scanf("%d %d", &points[i].x, &points[i].y);
}
printf("입력한 점의 좌표:\n");
for (int i = 0; i < n; i++) {
printf("(%d, %d)\n", points[i].x, points[i].y);
}
return 0;
}
예제: 구조체 안에 구조체 사용하기
코드: nested_struct.c
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
typedef struct {
Point topLeft;
Point bottomRight;
} Rectangle;
int main() {
Rectangle rect;
printf("왼쪽 상단 좌표를 입력하세요 (x, y): ");
scanf("%d %d", &rect.topLeft.x, &rect.topLeft.y);
printf("오른쪽 하단 좌표를 입력하세요 (x, y): ");
scanf("%d %d", &rect.bottomRight.x, &rect.bottomRight.y);
printf("사각형의 좌표:\n");
printf("왼쪽 상단: (%d, %d)\n", rect.topLeft.x, rect.topLeft.y);
printf("오른쪽 하단: (%d, %d)\n", rect.bottomRight.x, rect.bottomRight.y);
return 0;
}
예제: 구조체와 함수 사용하기
코드: struct_and_function.c
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
Point createPoint(int x, int y) {
Point p;
p.x = x;
p.y = y;
return p;
}
void printPoint(Point p) {
printf("(%d, %d)\n", p.x, p.y);
}
int main() {
int x, y;
printf("점의 좌표를 입력하세요 (x, y): ");
scanf("%d %d", &x, &y);
Point p1 = createPoint(x, y);
printf("입력한 점의 좌표: ");
printPoint(p1);
return 0;
}
예제: 연결 리스트 기본 구조
코드: basic_linked_list.c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
int main() {
Node *head = (Node *)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;
Node *second = (Node *)malloc(sizeof(Node));
second->data = 2;
second->next = NULL;
head->next = second;
Node *third = (Node *)malloc(sizeof(Node));
third->data = 3;
third->next = NULL;
second->next = third;
Node *temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
free(third);
free(second);
free(head);
return 0;
}
예제: 연결 리스트에 노드 추가하기
코드: add_node_linked_list.c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node* createNode(int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void printList(Node *head) {
Node *temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
Node *head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
printList(head);
free(head->next->next);
free(head->next);
free(head);
return 0;
}
예제: 연결 리스트에서 노드 삭제하기
코드: delete_node_linked_list.c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node* createNode(int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void printList(Node *head) {
Node *temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
void deleteNode(Node **head, int data) {
Node *temp = *head, *prev;
if (temp != NULL && temp->data == data) {
*head = temp->next;
free(temp);
return;
}
while (temp != NULL && temp->data != data) {
prev = temp;
temp = temp->next;
}
if (temp == NULL) return;
prev->next = temp->next;
free(temp);
}
int main() {
Node *head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
printList(head);
deleteNode(&head, 2);
printList(head);
free(head->next);
free(head);
return 0;
}
예제: 연결 리스트 뒤집기
코드: reverse_linked_list.c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node* createNode(int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void printList(Node *head) {
Node *temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
Node* reverseList(Node *head) {
Node *prev = NULL, *current = head, *next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
head = prev;
return head;
}
int main() {
Node *head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
printList(head);
head = reverseList(head);
printList(head);
free(head->next->next);
free(head->next);
free(head);
return 0;
}
예제: 파일에서 문자 읽어오기
코드: read_char_from_file.c
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
char ch;
while ((ch = fgetc(file)) != EOF) {
printf("%c", ch);
}
fclose(file);
return 0;
}
예제: 파일에 문자 쓰기
코드: write_char_to_file.c
#include <stdio.h>
int main() {
FILE *file = fopen("output.txt", "w");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
char ch;
printf("문자를 입력하세요: ");
scanf("%c", &ch);
fputc(ch, file);
fclose(file);
printf("파일에 문자를 저장했습니다.\n");
return 0;
}
예제: 파일에서 문자열 읽어오기
코드: read_string_from_file.c
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
char str[100];
while (fgets(str, 100, file) != NULL) {
printf("%s", str);
}
fclose(file);
return 0;
}
예제: 파일에 문자열 쓰기
코드: write_string_to_file.c
#include <stdio.h>
int main() {
FILE *file = fopen("output.txt", "w");
if (file == NULL) {
printf("파일 열기 실패\n");
return 1;
}
char str[100];
printf("문자열을 입력하세요: ");
fgets(str, 100, stdin);
fputs(str, file);
fclose(file);
printf("파일에 문자열을 저장했습니다.\n");
return 0;
}
예제: 동적 메모리 할당
코드: dynamic_memory_allocation.c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("동적 할당할 배열의 크기를 입력하세요: ");
scanf("%d", &n);
int *arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
printf("배열 요소 출력: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr);
return 0;
}
예제: 동적 메모리 할당 크기 변경
코드: realloc_memory.c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("동적 할당할 배열의 크기를 입력하세요: ");
scanf("%d", &n);
int *arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
printf("첫 번째 배열 요소 출력: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
int new_size;
printf("변경할 배열 크기를 입력하세요: ");
scanf("%d", &new_size);
arr = (int *)realloc(arr, new_size * sizeof(int));
printf("두 번째 배열 요소 출력: ");
for (int i = 0; i < new_size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr);
return 0;
}
예제: 문자열 길이 구하기
코드: string_length.c
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
printf("문자열을 입력하세요: ");
fgets(str, 100, stdin);
int length = strlen(str);
printf("문자열 길이: %d\n", length);
return 0;
}
예제: 문자열 복사하기
코드: string_copy.c
#include <stdio.h>
#include <string.h>
int main() {
char src[100], dest[100];
printf("원본 문자열을 입력하세요: ");
fgets(src, 100, stdin);
strcpy(dest, src);
printf("복사된 문자열: %s", dest);
return 0;
}
예제: 문자열 이어붙이기
코드: string_concat.c
#include <stdio.h>
#include <string.h>
int main() {
char str1[100], str2[100];
printf("첫 번째 문자열을 입력하세요: ");
fgets(str1, 100, stdin);
printf("두 번째 문자열을 입력하세요: ");
fgets(str2, 100, stdin);
strcat(str1, str2);
printf("이어 붙인 문자열: %s", str1);
return 0;
}
예제: 문자열 비교하기
코드: string_compare.c
#include <stdio.h>
#include <string.h>
int main() {
char str1[100], str2[100];
printf("첫 번째 문자열을 입력하세요: ");
fgets(str1, 100, stdin);
printf("두 번째 문자열을 입력하세요: ");
fgets(str2, 100, stdin);
int result = strcmp(str1, str2);
if (result == 0) {
printf("두 문자열은 같습니다.\n");
} else if (result > 0) {
printf("첫 번째 문자열이 두 번째 문자열보다 큽니다.\n");
} else {
printf("첫 번째 문자열이 두 번째 문자열보다 작습니다.\n");
}
return 0;
}
예제: 대문자로 변환하기
코드: to_uppercase.c
#include <ctype.h>
#include <stdio.h>
int main() {
char str[100];
printf("문자열을 입력하세요: ");
fgets(str, 100, stdin);
for (int i = 0; str[i]; i++) {
str[i] = toupper(str[i]);
}
printf("대문자로 변환된 문자열: %s", str);
return 0;
}
예제: 소문자로 변환하기
코드: to_lowercase.c
#include <ctype.h>
#include <stdio.h>
int main() {
char str[100];
printf("문자열을 입력하세요: ");
fgets(str, 100, stdin);
for (int i = 0; str[i]; i++) {
str[i] = tolower(str[i]);
}
printf("소문자로 변환된 문자열: %s", str);
return 0;
}
예제: 문자열에서 특정 문자 찾기
코드: find_char_in_string.c
#include <stdio.h>
#include <string.h>
int main() {
char str[100], ch;
printf("문자열을 입력하세요: ");
fgets(str, 100, stdin);
printf("찾을 문자를 입력하세요: ");
scanf("%c", &ch);
char *pos = strchr(str, ch);
if (pos == NULL) {
printf("문자 '%c'가 문자열에 없습니다.\n", ch);
} else {
printf("문자 '%c'는 문자열의 %ld 번째 위치에 있습니다.\n", ch, pos - str + 1);
}
return 0;
}
예제: 문자열에서 특정 문자열 찾기
코드: find_string_in_string.c
#include <stdio.h>
#include <string.h>
int main() {
char str[100], target[100];
printf("문자열을 입력하세요: ");
fgets(str, 100, stdin);
printf("찾을 문자열을 입력하세요: ");
fgets(target, 100, stdin);
char *pos = strstr(str, target);
if (pos == NULL) {
printf("문자열 '%s'가 문자열에 없습니다.\n", target);
} else {
printf("문자열 '%s'는 문자열의 %ld 번째 위치에 있습니다.\n", target, pos - str + 1);
}
return 0;
}
예제: 문자열 뒤집기
코드: reverse_string.c
#include <stdio.h>
#include <string.h>
void reverse_string(char *str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
}
int main() {
char str[100];
printf("문자열을 입력하세요: ");
fgets(str, 100, stdin);
reverse_string(str);
printf("뒤집힌 문자열: %s", str);
return 0;
}
예제: 문자열 토큰화
코드: string_tokenize.c
#include <stdio.h>
#include <string.h>
int main() {
char str[100], delim[10];
printf("문자열을 입력하세요: ");
fgets(str, 100, stdin);
printf("구분자를 입력하세요: ");
fgets(delim, 10, stdin);
char *token = strtok(str, delim);
while (token != NULL) {
printf("토큰: %s\n", token);
token = strtok(NULL, delim);
}
return 0;
}
예제: 정수 배열 오름차순 정렬
코드: integer_array_sort_asc.c
#include <stdio.h>
void sort_asc(int arr[], int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = i + 1; j < size; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
int main() {
int arr[] = {34, 12, 45, 8, 21, 17};
int size = sizeof(arr) / sizeof(arr[0]);
sort_asc(arr, size);
printf("오름차순으로 정렬된 배열: ");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
예제: 정수 배열 내림차순 정렬
코드: integer_array_sort_desc.c
#include <stdio.h>
void sort_desc(int arr[], int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = i + 1; j < size; j++) {
if (arr[i] < arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
int main() {
int arr[] = {34, 12, 45, 8, 21, 17};
int size = sizeof(arr) / sizeof(arr[0]);
sort_desc(arr, size);
printf("내림차순으로 정렬된 배열: ");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
예제: 배열 합계 구하기
코드: array_sum.c
#include <stdio.h>
int array_sum(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}
int main() {
int arr[] = {34, 12, 45, 8, 21, 17};
int size = sizeof(arr) / sizeof(arr[0]);
int sum = array_sum(arr, size);
printf("배열의 합계: %d\n", sum);
return 0;
}
예제: 배열 평균 구하기
코드: array_average.c
#include <stdio.h>
float array_average(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return (float)sum / size;
}
int main() {
int arr[] = {34, 12, 45, 8, 21, 17};
int size = sizeof(arr) / sizeof(arr[0]);
float avg = array_average(arr, size);
printf("배열의 평균: %.2f\n", avg);
return 0;
}
예제: 배열에서 최댓값 찾기
코드: array_max.c
#include <stdio.h>
int array_max(int arr[], int size) {
int max = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int main() {
int arr[] = {34, 12, 45, 8, 21, 17};
int size = sizeof(arr) / sizeof(arr[0]);
int max = array_max(arr, size);
printf("배열의 최댓값: %d\n", max);
return 0;
}
예제: 배열에서 최솟값 찾기
코드: array_min.c
#include <stdio.h>
int array_min(int arr[], int size) {
int min = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
int main() {
int arr[] = {34, 12, 45, 8, 21, 17};
int size = sizeof(arr) / sizeof(arr[0]);
int min = array_min(arr, size);
printf("배열의 최솟값: %d\n", min);
return 0;
}
예제: 선형 검색 알고리즘
코드: linear_search.c
#include <stdio.h>
int linear_search(int arr[], int size, int target) {
for (int i = 0; i < size; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
int main() {
int arr[] = {34, 12, 45, 8, 21, 17};
int size = sizeof(arr) / sizeof(arr[0]);
int target;
printf("찾을 숫자를 입력하세요: ");
scanf("%d", &target);
int idx = linear_search(arr, size, target);
if (idx == -1) {
printf("숫자 %d는 배열에 없습니다.\n", target);
} else {
printf("숫자 %d는 배열의 %d번째 인덱스에 있습니다.\n", target, idx);
}
return 0;
}
예제: 이진 검색 알고리즘
코드: binary_search.c
#include <stdio.h>
int binary_search(int arr[], int size, int target) {
int left = 0;
int right = size - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) {
return mid;
}
if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
int main() {
int arr[] = {8, 12, 21, 34, 45, 50, 67, 81};
int size = sizeof(arr) / sizeof(arr[0]);
int target;
printf("찾을 숫자를 입력하세요: ");
scanf("%d", &target);
int idx = binary_search(arr, size, target);
if (idx == -1) {
printf("숫자 %d는 배열에 없습니다.\n", target);
} else {
printf("숫자 %d는 배열의 %d번째 인덱스에 있습니다.\n", target, idx);
}
return 0;
}