ページ 11

関数

Posted: 2009年12月17日(木) 01:56
by 愛川
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;
}

Re:関数

Posted: 2009年12月17日(木) 02:16
by sizuma
どのような結果を想定してたんだけど、どんな結果になったかを書いてください。

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

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

Re:関数

Posted: 2009年12月17日(木) 02:53
by 愛川
すみません。
以下のようなプログラムで整数配列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);
}

Re:関数

Posted: 2009年12月17日(木) 04:56
by Ma
チェックしていませんが、参考までに
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:関数

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