Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語でmalloc()を使い配列を動的に確保し、全要素の合計を計算・表示するプログラム

問題概要

整数 n が標準入力から与えられるとします。このとき、サイズ n の配列を動的に確保し、続いて n 個の数値を1つずつ読み込んで、その合計を求めて出力します。

配列を動的に確保するには、stdlib.h ヘッダーに含まれる malloc() 関数または calloc() 関数を使用します。これにより、コンパイル時にサイズが不明な場合でも、実行時に必要な大きさの配列を用意できます。

例えば、入力が n = 6 で配列の要素が「9, 8, 7, 2, 4, 3」の場合、9 + 8 + 7 + 2 + 4 + 3 = 33 となるため、出力は 33 になります。

解法のアプローチ

  • 合計値を格納する変数 sum を 0 で初期化します。
  • 最初に入力を受け取り、n に格納します。
  • malloc() を使ってサイズ n の int 型配列を動的に確保し、ポインタ arr に代入します。
  • i を 0 から n 未満まで1ずつ増やしながらループし、各入力値を arr[i] に読み込みます。
  • 再び i を 0 から n 未満まで回すループで、sum += arr[i] として全要素を加算します。
  • 最後に sum を出力します。

実装例(C言語)

以下のコードで実際の動作を確認できます。

#include <stdio.h>
#include <stdlib.h>
int main(){
    int *arr;
    int n;
    int sum = 0;

    /* 要素数 n を入力 */
    scanf("%d", &n);

    /* サイズ n の int 型配列を動的に確保 */
    arr = (int*) malloc(n * sizeof(int));

    /* n 個の要素を1つずつ入力 */
    for(int i = 0; i < n; i++){
        scanf("%d", (arr + i));
    }

    /* 全要素の合計を計算 */
    for(int i = 0; i < n; i++){
        sum += arr[i];
    }

    /* 結果を出力 */
    printf("%d", sum);

    free(arr); /* 確保したメモリを解放 */
}

入力例

6
9
8
7
2
4
3

出力例

33

ポイント解説

(int*) malloc(n * sizeof(int)) は、「int型1個分のバイト数 × n個」だけヒープ領域からメモリを確保し、その先頭アドレスを int 型ポインタとして返します。確保された領域は通常の配列と同じように arr[i] でアクセスでき、ポインタ演算 (arr + i) を使ってアドレスを指定して入力することも可能です。

また、動的確保したメモリは使い終わったら free() で解放するのが安全なプログラミングの作法です。メモリリークを防ぎ、長時間動作するプログラムでも安定性を保てます。

  1. Cプログラムで2次元行列の四隅の要素とその合計を出力する方法

    概要 サイズ2×2以上の2次元配列(行列)が与えられたとき、その四隅に格納されているすべての要素を取り出し、合計を求めて出力するのが本記事のテーマです。 四隅の要素とは? 行数「r」、列数「c」(いずれも0から開始)をもつ行列 mat[r][c] を考えると、四隅の要素は次の4つになります。 左上:mat[0][0] 右上:mat[0][c-1] 左下:mat[r-1][0] 右下:mat[r-1][c-1] したがって、求める合計は次の式で表されます。mat[0][0] + mat[0][c-1] + mat[r-1][0] + mat[r-1][c-1]これらの四隅の要素を取得して加算

  2. C++プログラム:配列内の各要素の最後の出現を相対的な順序で出力する方法

    配列 a[] が与えられたとき、リスト内の各要素について最後に出現したものだけを出力するのが本記事の目的です。ここでは単純に重複要素を削除するだけでなく、各要素が配列内で最後に出現したタイミングに基づき、元の相対的な順序を維持したまま出力する必要があります。例えば、6つの要素を持つ配列 {1, 3, 2, 3, 1, 2} には重複した値が含まれています。この場合、期待される結果は「3 1 2」になります。入力例と出力例Input: a[]={4,2,2,4,1,5,1} Output : 2 4 5 1この例では、「2」はインデックス2で最後に出現し、「4」はインデックス3、「5」はインデッ