関数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
愛川

関数

#1

投稿記事 by 愛川 » 15年前

OSはWindows、コンパイラはVisual C++です。

整数配列data の,data[left]からdata[right-1]の最小値がある添字番号を返す
関数int min_ind_ary(const int data[ ], int left, int right)
を作成しなさい。
最小値が複数あるときは,一番小さい添字を返すようにする。

という問題です。
以下のように考えましたが、プログラムに組み込んだ時にうまくいきません。
どなたかお願いいたします。
#include <stdio.h>
int min_ind_ary(const int data[ ], int left, int right){
    int i, work, min;
    scanf("%d", min);
    for(i = left + 1; i <= right - 1; i++){
        if(min > data){
            min = data;
            work = data[min];
        }
    }
    printf("%d\n", work);
    return;
}

sizuma

Re:関数

#2

投稿記事 by sizuma » 15年前

どのような結果を想定してたんだけど、どんな結果になったかを書いてください。

>scanf("%d", min);
これはなんでしょうか?何のために入力させるんですか?
それとscanfの引数の書き方も間違えてますよ。

int型を返さなくてはいけないのに、returnで何も返してません。
というか添字を返すんですよね?ぱっとみ何処にも添字を持ってないようなのですが?

愛川

Re:関数

#3

投稿記事 by 愛川 » 15年前

すみません。
以下のようなプログラムで整数配列dataを小さい順に並び替えるのに
関数int min_ind_ary(const int data[ ], int left, int right)
を使うという問題につながっています。
これだと「7164823594」という結果になりました。
#include <stdio.h>
void print_ary(const int data[/url], int size){
    int i;
    for(i = 0; i < size; i++){
        printf("%d", data);
    }
    printf("\n");
    return;
}

#include <stdio.h>
int min_ind_ary(const int data[ ], int left, int right){
    int i, x, min = 10000, number[100];
    for(i = left; i <= right - 1; i++){
        if(min > number){
            min = number;
            x = i;
        }
    }
    return(0);
}

void sort_ary (int data[ ], int size){
    int i;
    for(i = 0; i < size - 1; i ++ ) {
        int min, work;
        min = min_ind_ary(data, i, size);
        work = data[min];
        data[min] = data;
        data = work;
    }
    return;
}

int main(void){
    int data[10] = {1,6,4,8,2,3,5,9,7,4};
    print_ary(data, 10);
    sort_ary(data, 10);
    print_ary(data, 10);
    return(0);
}

Ma

Re:関数

#4

投稿記事 by Ma » 15年前

チェックしていませんが、参考までに
data配列のleft から right-1 までの中での最小のindexを返します。
#include <stdio.h>
int min_ind_ary(const int data[ ], int left, int right){
    int min_index = left;
    for(int i = left+1; i < right ; i++){
        if(data[min_index] > data){
            min_index = i;
        }
    }
    return min_index;
}


チェックなしなのでミスとかあってもゆるしてください。

たかぎ

Re:関数

#5

投稿記事 by たかぎ » 15年前

最小値の添字を求めたいのなら、
#include <algorithm>
int min_ind_ary(const int data[ ], int left, int right) 
{
  return std::min_element(data + left, data + right) - (data + left);
}
でよいのでは?
言語不明なので、C++でよいのかどうか知りませんが...

閉鎖

“C言語何でも質問掲示板” へ戻る