1829 words
9 minutes
【C】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のアドレスを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言語