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

C言語の動的メモリ確保を使って偶数と奇数を判別し合計を求める方法

問題

動的メモリ確保関数(malloc)を使用して、要素の集合の中から偶数と奇数を判別し、それぞれの合計値を計算するプログラムを作成します。

解決策

このプログラムでは、ユーザーが入力した複数の整数の中から偶数と奇数を見つけ出し、それぞれの合計を求めます。

ポインタ p が指す各要素にアクセスする際は、間接参照演算子 *(p+i) を使用します。2で割った余りが0であれば偶数、そうでなければ奇数と判定できます。

偶数を判定して合計するロジック

for(i=0;i<n;i++){
    if(*(p+i)%2==0) { // 偶数かどうかを判定
        even=even+*(p+i); // リスト内のすべての偶数の合計を計算
    }
}

偶数・奇数を振り分けて合計するロジック

for(i=0;i<n;i++){
    if(*(p+i)%2==0) { // 偶数かどうかを判定
        even=even+*(p+i);
    }
    else { // 奇数の場合はこちらのブロックへ
        odd=odd+*(p+i); // リスト内のすべての奇数の合計を計算
    }
}

サンプルプログラム

#include<stdio.h>
#include<stdlib.h>
void main(){
    // 変数とポインタの宣言 //
    int i,n;
    int *p;
    int even=0,odd=0;
    // 要素数の読み込み //
    printf("Enter the number of elements : ");
    scanf("%d",&n);
    // mallocを使って先頭アドレスpを取得 //
    p=(int *)malloc(n*sizeof(int));
    /* メモリが正常に確保できたかどうかを
       if文で必ずチェックする */
    if (p==NULL){
        printf("Memory not available");
        exit(0);
    }
    // forループで要素を読み込んで格納 //
    printf("The elements are : \n");
    for(i=0;i<n;i++){
        scanf("%d",p+i);
    }
    // 偶数と奇数を振り分けてそれぞれの合計を計算 //
    for(i=0;i<n;i++){
        if(*(p+i)%2==0){
            even=even+*(p+i);
        }
        else{
            odd=odd+*(p+i);
        }
    }
    printf("The sum of even numbers is : %d\n",even);
    printf("The sum of odd numbers is : %d\n",odd);
}

ポイント: 元のコードでは要素数 n を読み込む前に malloc を呼び出していたため、未初期化の変数でメモリサイズを指定してしまう不具合がありました。上記のサンプルでは、n の入力後にメモリを確保するよう順序を修正しています。動的メモリ確保を行う際は、戻り値が NULL でないか(メモリ確保に成功したか)を必ず確認しましょう。

実行結果

Enter the number of elements : 5
The elements are :
34
23
12
11
45
The sum of even numbers is : 46
The sum of odd numbers is : 79

この例では、入力された5つの整数のうち偶数(34と12)の合計が46、奇数(23、11、45)の合計が79として正しく出力されています。

  1. C言語で学ぶリンクリスト(連結リスト)への要素挿入の基本と実装方法

    リンクリスト(連結リスト)は、動的メモリ確保を利用するデータ構造です。そのため、要素の追加や削除に応じて、リストのサイズが柔軟に伸縮します。リンクリストは「ノード」と呼ばれる要素の集合体として定義され、各ノードはデータ部とリンク部(ポインタ)の2つの部分で構成されています。データ・リンク・リンクリスト全体の構造は、以下のように表現されます。リンクリストに対する主な操作C言語において、リンクリストに対して行える基本的な操作は主に次の3種類です。挿入(Insertion)削除(Deletion)走査(Traversing)挿入操作のポイントここでは、ノード2とノード3の間に新しいノード5を挿入する

  2. C言語で文字列⇔数値の相互変換を行う方法|sscanf関数とsprintf関数の使い方

    はじめにC言語のプログラミングにおいて、「文字列から数値への変換」および「数値から文字列への変換」とは何を意味するのでしょうか?本記事では、標準ライブラリ関数を使った双方向の変換方法を、構文・サンプルコード・実行結果とあわせて解説します。解決策:使用する2つの関数C言語には、この変換を実現するための関数が用意されています。sscanf() ― 文字列を数値に変換するsprintf() ― 数値を文字列に変換する文字列から数値への変換(sscanf)sscanf()関数を使うことで、文字列として格納されたデータを、書式指定子に従って解析し、数値として各変数に読み込むことができます。scanf()