

学校の課題で質問です。  
最大値を消去する関数プログラム「deleteidx」を作成したいのですが、どうやって作成したらいいのかがわかりません。  
とりあえず、私が現時点でプログラムした箇所を以下に示します

[code]

    #include <stdio.h>
    
    void readIntArray(int a[], int size)
    {
    
        int i;
        for(i=0;i<10;i=i+1) {
            printf("Input A[%d]:",i);
            scanf("%d" ,&a[i]);
        }
    }
    
    void printIntarray(int data[],int size)
    {
       int i;
       printf("{");
       for(i=0;i<size;i++){
          printf(" %3d",data[i]);
          if(i+1!=size) printf(",");
         }
        printf("}\n");
    }
    
    void getMaxIdx(int data[], int size,int *maxidx)
    {
        int i,index;
        *maxidx=data[0];
        for(i=0;i<size;i++){
            if(data[i]>*maxidx){
                *maxidx=data[i];
                index=i;
            }
        }
    }
    
    //ここにdeleteidxを挿入するのだとは思う
    
    int main(void)
    {
        int size,d[100];
        int i, max;
    
        readIntArray(d,size);
        printf("Before:");
        printIntarray(d,size);   
    
        printf("After :");
    
        return 0;
    }
    
[/code]

期待する実行結果

[code]

    Input A[0]:1
    Input A[1]:2
    Input A[2]:3
    Input A[3]:4
    Input A[4]:5
    Input A[5]:6
    Input A[6]:7
    Input A[7]:8
    Input A[8]:9
    Input A[9]:10
    Before:{1,2,3,4,5,6,7,8,9,10}
    After :{1,2,3,4,5,6,7,8,9}
    
[/code]

先生から頂いた「deleteidx」の機能とアルゴリズムの説明  
deleteidxの説明  
引数：int data[],int size,int idx  
要素数*sizeである整数の配列dataについて、idxの添字番号の要素を削除する  
要素削除後にsizeの値も変更する。

＜プログラムのアルゴリズム＞  
１．長さ10のデータ用の配列を入力させる。  
２．削除前の配列を表示する。  
３．getMaxIdxを呼び出し、最大値をもつ要素の添字番号を求める  
４．deleteidxを呼び出し、最大値を持つ要素を削除する。  
５．削除の後の配列を表示。

とりあえずこれらのヒントを頂いて、アルゴリズム１はクリアしたのですが、  
それ以降はどうやって処理していいのかがわかりません。

どうプログラムをしたら期待している実行結果となるのでしょうか。  
よろしくお願いします。


CC BY-SA 4.0
2020-12-20T11:10:25.923
72770
2020-12-21T08:15:47.127
2020-12-21T06:45:52.210
3060
41837
question
c
配列から最大値を消すプログラムを作りたい


考え方としては、指定されたインデックス番号よりも後ろにデータがあるなら、それらのデータを全て1つ前のインデックスに移動させて、サイズ値を1つ減らすことで実現できます。

後ろにデータが無いなら、サイズ値を1つ減らすだけで済むでしょう。

**追記**  
なお @cubick さんがコメントされたように最大値が複数存在することを許すなら、また考え方は変わって例えば以下のようになります。  
以下の変数を定義・初期化します。

  * v:指定されたインデックスに格納された最大値をセーブしておく作業用変数(初期値:配列中の最大値)
  * i:配列の先頭から最後までチェックするループ用のインデックス値変数(初期値:0)
  * n:最大値があった以後の最大値ではない数値をコピーする先を示すインデックス値変数(初期値:0)

そして以下の処理を行います。

  * ループ用のインデックス値 i を 0 番目から size - 1 番目まで繰り返し、その位置の値をセーブした最大値 v と比較していく
  * チェック対象の i 番目の値が最大値でなければ、コピー先インデックス n の位置にコピーし、n を +1 する
  * 最後までチェックした後の n の値を新しいサイズの値とする

* * *

ちなみに以下のdeleteidxの説明の書き方だと、`size`パラメータが`値`なのか、`size変数へのポインタ`なのか混乱します。  
どちらなのか確かめて修正してください。

> 引数：int data[],int size,int idx  
>  要素数*sizeである整数の配列dataについて、idxの添字番号の要素を削除する

それによっては以下の処理が変わります。

> 要素削除後にsizeの値も変更する。

* * *

それと、質問時点でのソースには、以下の問題があります。

  * main()の`size`変数が初期化されていない
  * main()の`d`配列の要素数が`10`ではなく`100`になっている
  * `void readIntArray(int a[], int size)`の`int size`パラメータが何も使われておらず、意味が無い。
  * `void getMaxIdx(int data[], int size,int *maxidx)`の処理後の`int *maxidx`の値(main()の`max`)が最大値をもつ要素のインデックス値ではなく数値の最大値そのものになっている。  
つまり`最大値をもつ要素の添字番号を求める`処理になっていない。


CC BY-SA 4.0
2020-12-20T15:50:08.020
72777
2020-12-21T08:15:47.127
2020-12-21T08:15:47.127
26370
26370
72770
answer