C・C++で配列の要素の合計を求める
このレッスンでは、ループと累積用の変数を使って、配列のすべての値を合計します。
はじめに
累積変数(accumulator)は、ループの各ステップで結果を集めていく変数です。配列の合計を求めるには、累積変数を0から始め、要素を1つずつ足していきます。
大切なポイント
- コンパイラの警告(compiler warning)を有効にして、すべての警告を直しましょう。
- それぞれの値のデータ型と寿命(lifetime)をしっかり理解しましょう。
- 入力データと配列のインデックスの範囲は必ずチェックしましょう。
動きで理解する
ステップを押すと、ループが1手ずつ進みます。条件の確認、本体の実行、トレース表が1行ずつ増えていく様子を見ましょう。
CとC++のコード例
C
main.c
#include <stdio.h>
int main(void) {
int values[] = {2, 4, 6, 8, 10}; int total = 0;
// sizeof determines the local array length.
for (size_t i = 0; i < sizeof values / sizeof values[0]; ++i) total += values[i];
printf("sum=%d\n", total);
}
sum=30
C++
main.cpp
#include <iostream>
#include <numeric>
#include <vector>
int main() {
std::vector values{2, 4, 6, 8, 10};
// accumulate folds the range into one total.
std::cout << "sum=" << std::accumulate(values.begin(), values.end(), 0) << '\n';
}
sum=30
CとC++の比較
変数totalを0で初期化し、ループで各要素をtotalにちょうど1回ずつ足します。式sizeof values / sizeof values[0]が配列の要素数を計算するので、要素を増やしたり減らしたりしてもループは正しく動きます。結果はsum=30です。
C
Cは小さな手続き型の関数を使い、データがメモリ上でどう表されるかをそのまま見せます。
C++
C++は低レベルの操作もできるまま、ライブラリの型やより安全な抽象化を加えます。
発展問題
両方のバージョンを実行し、コードを書き換えて、それぞれの言語がもたらす安全性の違いを観察しましょう。
- 不正な入力や境界の値で試しましょう。
- 警告を増やすフラグ-Wall -Wextra -Wpedanticを付けてコンパイルしましょう。
- 共通の宣言はヘッダーファイルに、実装は別のファイルに分けましょう。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
すべてのチャレンジ