基本入出力と制御構造
初期学習段階では、標準入出力と基本的な制御フローをマスターすることが重要です。
#include <stdio.h>
int main() {
// 飛行機のASCIIアート
printf(" ** \n");
printf(" ** \n");
printf("************\n");
printf("************\n");
printf(" * * \n");
printf(" * * \n");
return 0;
}
整数除算と剰余演算の実装例:
#include <stdio.h>
int main() {
int dividend, divisor;
scanf("%d %d", ÷nd, &divisor);
printf("%d %d", dividend/divisor, dividend%divisor);
return 0;
}
配列とアルゴリズム
配列操作と基本アルゴリズムの実装パターンを示します。
// バブルソートの実装
void bubble_sort(int arr[], int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
二分探索の効率的な実装:
int binary_search(int arr[], int size, int target) {
int left = 0, right = size - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
ポインタとメモリ管理
ポインタの核心概念と安全な使用方法について解説します。
// 値の交換関数(ポインタ使用)
void swap_values(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 安全な文字列長計算
int safe_strlen(const char* str) {
if (!str) return 0;
int count = 0;
while (*str++) count++;
return count;
}
再帰と関数設計
再帰的アプローチによる問題解決手法を紹介します。
// 再帰による階乗計算
long factorial(int n) {
return (n <= 1) ? 1 : n * factorial(n - 1);
}
// ハノイの塔問題
void hanoi(int n, char from, char to, char aux) {
if (n == 1) {
printf("%c → %c\n", from, to);
return;
}
hanoi(n-1, from, aux, to);
printf("%c → %c\n", from, to);
hanoi(n-1, aux, to, from);
}
ビット操作と最適化テクニック
低レベル操作における効率的な実装方法を示します。
// ビットカウント(Brian Kernighan's Algorithm)
int count_set_bits(int n) {
int count = 0;
while (n) {
n &= (n - 1);
count++;
}
return count;
}
// 二進数の異なるビット数を計算
int hamming_distance(int a, int b) {
return count_set_bits(a ^ b);
}
構造体とデータ構造
複雑なデータ構造の設計と操作方法について解説します。
typedef struct {
char name[50];
int age;
float score;
} Student;
// 構造体ポインタを使用した安全な操作
void update_student(Student* s, const char* name, int age) {
if (s && name) {
strcpy(s->name, name);
s->age = age;
}
}
ゲーム開発実践例
三目並べゲームのコアロジックを簡潔に実装します。
#define BOARD_SIZE 3
char board[BOARD_SIZE][BOARD_SIZE];
void init_board() {
for (int i = 0; i < BOARD_SIZE; i++)
for (int j = 0; j < BOARD_SIZE; j++)
board[i][j] = ' ';
}
int check_winner() {
// 行・列・対角線のチェックロジック
for (int i = 0; i < BOARD_SIZE; i++) {
if (board[i][0] != ' ' &&
board[i][0] == board[i][1] &&
board[i][1] == board[i][2])
return 1;
if (board[0][i] != ' ' &&
board[0][i] == board[1][i] &&
board[1][i] == board[2][i])
return 1;
}
if (board[1][1] != ' ' &&
((board[0][0] == board[1][1] && board[1][1] == board[2][2]) ||
(board[0][2] == board[1][1] && board[1][1] == board[2][0])))
return 1;
return 0;
}