Home
1829 words
9 minutes
【C】C言語の基本
2025-04-14
C

最終更新:2025-04-14

C言語の基本#

概要#

C言語は1972年にデニス・リッチーによって開発された汎用プログラミング言語である。シンプルながらも強力な機能を持ち、システムプログラミングから組み込みソフトウェア、アプリケーション開発まで幅広く利用されている。本稿ではC言語の基本的な構文や特徴について簡潔に解説する。

開発環境#

C言語でプログラムを作成・実行するには以下の環境が必要である。

  • テキストエディタ(Visual Studio Code, Sublime Textなど)
  • Cコンパイラ(GCC, Clang, Visual C++など)

プログラムの基本構造#

C言語のプログラムはmain関数から始まる。以下は最も基本的なプログラム例である。

#include <stdio.h>

int main() {
    printf("Hello, C!\n");
    return 0;
}

この例では:

  • #include <stdio.h>: 標準入出力ライブラリを取り込む
  • int main(): プログラムの実行開始点
  • printf("Hello, C!\n");: 画面に文字列を出力する
  • return 0;: プログラムが正常終了したことを示す

変数とデータ型#

C言語では変数を使用する前に型を宣言する必要がある。主なデータ型は以下のとおりである。

  • int: 整数
  • float, double: 浮動小数点数
  • char: 文字
  • 配列型: 同じ型の値の集まり
#include <stdio.h>

int main() {
    int age = 25;
    float height = 175.5;
    char grade = 'A';
    
    printf("年齢: %d\n", age);
    printf("身長: %.1fcm\n", height);
    printf("成績: %c\n", grade);
    
    return 0;
}

書式指定子:

  • %d: 整数
  • %f: 浮動小数点数
  • %c: 文字
  • %s: 文字列

演算子#

C言語には様々な演算子がある。

  • 算術演算子: +, -, *, /, %(剰余)
  • 比較演算子: ==, !=, <, >, <=, >=
  • 論理演算子: &&(AND), ||(OR), !(NOT)
  • 代入演算子: =, +=, -=, *=, /=
int a = 10, b = 3;
int sum = a + b;        // 13
int diff = a - b;       // 7
int prod = a * b;       // 30
int quot = a / b;       // 3(整数除算)
int rem = a % b;        // 1(剰余)

int isEqual = (a == b); // 0(偽)
int isGreater = (a > b); // 1(真)

条件分岐#

条件に応じて処理を分岐させる構文としてif文とswitch文がある。

if文#

#include <stdio.h>

int main() {
    int score = 0;
    printf("Enter your score:");
    scanf("%d", &score);

    if (score >= 90) {
        printf("成績: A\n");
    } else if (score >= 80) {
        printf("成績: B\n");
    } else if (score >= 70) {
        printf("成績: C\n");
    } else {
        printf("成績: D\n");
    }
    
    return 0;
}

switch文#

#include <stdio.h>

int main() {
    char grade = 'B';
    
    switch (grade) {
        case 'A':
            printf("優秀\n");
            break;
        case 'B':
            printf("良好\n");
            break;
        case 'C':
            printf("普通\n");
            break;
        case 'F':
            printf("頑張りましょう\n");
            break;
        default:
            printf("不正な入力\n");
            break;
    }
    
    return 0;
}

繰り返し文#

同じ処理を繰り返す構文としてfor文、while文、do-while文がある。

for文#

#include <stdio.h>

int main() {
    for (int i = 0; i < 5; i++) {
        printf("%d回目のループ\n", i+1);
    }
    return 0;
}

while文#

#include <stdio.h>

int main() {
    int count = 0;
    while (count < 5) {
        printf("%d回目のループ\n", count+1);
        count++;
    }
    return 0;
}

do-while文#

#include <stdio.h>

int main() {
    int num = 0;
    do {
        printf("%d回目のループ\n", num+1);
        num++;
    } while (num < 3);
    
    return 0;
}

※while文との違いは、1回は必ずループの中身を実行してくれるところにある。

配列#

同じ型のデータをまとめて扱うための構造である。

#include <stdio.h>

int main() {
    int scores[5] = {85, 90, 78, 88, 92};
    
    for (int i = 0; i < 5; i++) {
        printf("点数%d: %d\n", i+1, scores[i]);
    }
    
    return 0;
}

関数#

プログラムを機能ごとに分割するための仕組みである。

#include <stdio.h>

// 関数のプロトタイプ宣言
int add(int a, int b);
void printMessage(const char message[]);

int main() {
    int result = add(5, 3);
    printf("5 + 3 = %d\n", result);
    
    printMessage("C言語の関数");
    
    return 0;
}

// 関数の定義
int add(int a, int b) {
    return a + b;
}

void printMessage(const char message[]) {
    printf("メッセージ: %s\n", message);
}

ポインタ#

変数のメモリアドレスを扱う仕組みである。

#include <stdio.h>

int main() {
    int num = 10;
    int *ptr = &num;  // numのアドレスをptrに格納
    
    printf("numの値: %d\n", num);
    printf("numのアドレス: %p\n", &num);
    printf("ptrの値(numのアドレス): %p\n", ptr);
    printf("ptrが指す値: %d\n", *ptr);
    
    *ptr = 20;  // ポインタを通じてnumの値を変更
    printf("変更後のnumの値: %d\n", num);
    
    return 0;
}

構造体#

異なる型のデータをまとめて扱うための仕組みである。

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

// 構造体の定義
struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    // 構造体変数の宣言と初期化
    struct Student student1;
    strcpy(student1.name, "山田太郎");
    student1.age = 20;
    student1.gpa = 3.5;
    
    // 構造体の情報を表示
    printf("名前: %s\n", student1.name);
    printf("年齢: %d\n", student1.age);
    printf("GPA: %.1f\n", student1.gpa);
    
    return 0;
}

ハンズオン:すべての要素を組み合わせた例#

以下ではC言語の基本要素を組み合わせた学生成績管理プログラムを示す。

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

// 構造体の定義
struct Student {
    char name[50];
    int scores[5];
    int numScores;
    float average;
    char grade;
};

// 関数のプロトタイプ宣言
void inputStudentInfo(struct Student *student);
void calculateAverage(struct Student *student);
void determineGrade(struct Student *student);
void displayStudentInfo(struct Student student);
void displayMenu();

int main() {
    struct Student student;
    student.numScores = 0;
    int choice = 0;
    
    printf("===== 学生成績管理システム =====\n");
    printf("学生の名前を入力してください: ");
    fgets(student.name, 50, stdin);
    
    // 改行文字を削除
    student.name[strcspn(student.name, "\n")] = 0;
    
    while (choice != 4) {
        displayMenu();
        scanf("%d", &choice);
        
        switch (choice) {
            case 1:
                // 点数の追加
                if (student.numScores >= 5) {
                    printf("これ以上点数を追加できません(最大5科目)\n");
                } else {
                    inputStudentInfo(&student);
                }
                break;
            case 2:
                // 成績計算と表示
                if (student.numScores == 0) {
                    printf("点数が登録されていません\n");
                } else {
                    calculateAverage(&student);
                    determineGrade(&student);
                    displayStudentInfo(student);
                }
                break;
            case 3:
                // 点数のリセット
                student.numScores = 0;
                printf("すべての点数がリセットされました\n");
                break;
            case 4:
                printf("プログラムを終了します\n");
                break;
            default:
                printf("無効な選択です。再度選択してください\n");
                break;
        }
        
        // 入力バッファをクリア
        while (getchar() != '\n');
    }
    
    return 0;
}

// メニューを表示する関数
void displayMenu() {
    printf("\n===== メニュー =====\n");
    printf("1. 点数を追加する\n");
    printf("2. 成績を表示する\n");
    printf("3. 点数をリセットする\n");
    printf("4. 終了する\n");
    printf("選択 (1-4): ");
}

// 学生の点数を入力する関数
void inputStudentInfo(struct Student *student) {
    printf("科目%dの点数を入力 (0-100): ", student->numScores + 1);
    scanf("%d", &student->scores[student->numScores]);
    
    // 入力値の検証
    if (student->scores[student->numScores] < 0 || student->scores[student->numScores] > 100) {
        printf("無効な点数です。0から100の間で入力してください\n");
    } else {
        student->numScores++;
        printf("点数が追加されました\n");
    }
}

// 平均点を計算する関数
void calculateAverage(struct Student *student) {
    int sum = 0;
    for (int i = 0; i < student->numScores; i++) {
        sum += student->scores[i];
    }
    student->average = (float)sum / student->numScores;
}

// 成績を判定する関数
void determineGrade(struct Student *student) {
    if (student->average >= 90) {
        student->grade = 'A';
    } else if (student->average >= 80) {
        student->grade = 'B';
    } else if (student->average >= 70) {
        student->grade = 'C';
    } else if (student->average >= 60) {
        student->grade = 'D';
    } else {
        student->grade = 'F';
    }
}

// 学生情報を表示する関数
void displayStudentInfo(struct Student student) {
    printf("\n===== 学生情報 =====\n");
    printf("名前: %s\n", student.name);
    printf("登録科目数: %d\n", student.numScores);
    
    for (int i = 0; i < student.numScores; i++) {
        printf("科目%d: %d\n", i+1, student.scores[i]);
    }
    
    printf("平均点: %.1f\n", student.average);
    printf("成績: %c\n", student.grade);
    
    // 成績に応じたメッセージを表示
    switch (student.grade) {
        case 'A':
            printf("評価: 優秀です!\n");
            break;
        case 'B':
        case 'C':
            printf("評価: よく頑張りました\n");
            break;
        case 'D':
            printf("評価: もう少し努力しましょう\n");
            break;
        case 'F':
            printf("評価: 次回に向けて基礎から復習しましょう\n");
            break;
    }
}

参考サイト: C言語入門 - 7日間かけて学ぶC言語

【C】C言語の基本
https://ss0832.github.io/posts/20250414_c_basics/
Author
ss0832
Published at
2025-04-14