ここから本文です

長さnの整数配列arrayに筆愛整数が格納されている。大きい順にk個の要素とその添...

yos********さん

2018/11/1116:06:02

長さnの整数配列arrayに筆愛整数が格納されている。大きい順にk個の要素とその添え字を出力する関数をC言語で記述せよ。

整数仕様は
void big(int array[],int n,int k)とする。

例えば int array[8]={3,9,0,5,6,2,1,4}
のとき、big(array,8,3)は以下を出力する。

という問題についての回答を

#include<stdio.h>

struct A{
int key;
int soeji;
};

void big(struct A array[],int n,int k){
int i;
for(i=0;i<k;i++){
printf("%d %d\n",array[i].key,array[i].soeji);
}
}

int bubble(struct A array[],int n){
int i,j;
struct A tmp;
for(i=0;i<n-1;i++){
for(j=n;j>=i;j--){
if(array[j-1].key>array[j].key){tmp=array[j-1];array[j-1]=array[j];array[j]=tmp;

}
}
}

int main(){
int i,n;
scanf("%d",&n);

struct A array[9];
for(i=0;i<n;i++){
scanf("%d",&array[i].key);
array[i].soeji=i;
}
bubble(array,n);
big(array,n,3);
}
}


という感じでバブルソートで書いたのですが
エラーが出てしまいます。
そもそも問題文がint array でとなってるので
これ自体もstruct で指定してしまっているため
間違いなのかもしれませんが、
どなたか回答いただけるかたいらっしゃいますか?

閲覧数:
75
回答数:
4
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

prw********さん

2018/11/1119:33:53

>筆愛整数

こうします

筆愛整数が格納されているので、検査済みのところに非筆愛整数すなわち負の整数を入れればよいです

***

#include<stdio.h>

void big(int array[], int n, int k){
if(k == 0) return;

int i;
int index = 0;
int max = array[index];
for(i=1; i<n; i++){
if(max < array[i]){
index = i;
max = array[index];
}
}
printf("value = %d, index = %d\n", array[index], index);
array[index] = -1;

return big(array, n, k-1);
}

int main(void){
int array[8] = {3,9,0,5,6,2,1,4};
big(array, 8, 3);
return 0;
}

質問した人からのコメント

2018/11/18 14:05:10

文字の変換ミスがあったにもかかわらず、解説していただき
ありがとうございます!

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

har********さん

2018/11/1521:44:31

筆愛整数が何かネットで調べていたら半日潰してしまいました。

prw********さん。良く分かりましたね。ただもんじゃないと思いました。
彼の回答ですけど。再帰を使ってますが return は不要ですね。
?  return big(array, n, k - 1);
◯  big(array, n, k - 1);

私もユニークなものをと思ったのですが気が萎えましたので
質問者様のソースをなるべく変えないようにしてみました。

(1)
構造体でいいと思います。

(2)
bubble() 関数の中に main() 関数があるような形になっています。
C言語は関数に中に関数は定義できません。

(3)
bubble() 関数の中で比較演算子が逆になっています。
左から右へ大きい順に並べたいので(スキャン方向は右から左へ)、右の数値 array[j].key が
左の数値 array[j - 1].key より大きい場合に数値を交換します。

(4)
j の範囲が違います。配列のサイズは 0~n - 1 なので
j の初期値は j = n-1 です。最後は i の一つ右なので
j >= i+1 です。

(5)
bubble() 関数は値を返さないのですから返却値は void にしなければなりません。

(6)
メッセージを追加しました。これがないとユーザーは何を入れればいいかわかりません。

* 修正したものが以下です。

#define _CRT_SECURE_NO_WARNINGS // Visual Studio only
#include <stdio.h>

struct A {
    int key;
    int soeji;
};

void big(struct A array[], int n, int k) {
    int i;
    for (i = 0; i < k; i++) {
        printf("要素:%3d 添え字:%3d\n", array[i].key, array[i].soeji);
    }
}

void bubble(struct A array[], int n) { // int を void に変更
    int i, j;
    struct A tmp;
    for (i = 0; i < n - 1; i++) {
        for (j = n-1; j >= i+1; j--) { // n を n-1 に変更、i を i+1 に変更
            if (array[j - 1].key < array[j].key) { // > を < に変更
                tmp = array[j - 1];
                array[j - 1] = array[j];
                array[j] = tmp;
            }
        } 
    }
} // } を追加

int main() {
    int i, n;

    printf("配列のサイズを入力してください:"); // メッセージを追加
    scanf("%d", &n);

    struct A array[9];
    printf("配列の各数値を入力してください\n"); // メッセージを追加
    for (i = 0; i < n; i++) {
        scanf("%d", &array[i].key);
        array[i].soeji = i;
    }
    bubble(array, n);
    big(array, n, 3);
}
//} を削除

ikt********さん

2018/11/1122:58:59

興味本位でやってみた。
宿題出題者の期待からはほど遠い、ひねくれコード
だろうと思います。 回答にはならず。

既に、異なる考え方での2回答あり。
prw********さん の考え方が題意を満たすには
もっともシンプルだと思いましたが、別解で。

dia********さん ご回答同様、ソート使いますが、
添え字 ではなく 引数配列各要素へのポインタ の配列 としてみた。


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int greater(const void* lhs, const void* rhs) {
    const int **l = (const int**)lhs, **r = (const int**)rhs;
    return **r - **l;
}

void big(int array[], int n, int k) {
    assert(array);
    assert(0 < n && n >= k);

    int **pa = malloc(sizeof(int*) * n);
    assert(pa);
    {
        for (int i = 0; i < n; ++i)
            pa[i] = &array[i];
        qsort(pa, n, sizeof(int*), greater);
        for (int i = 0; i < k; ++i)
            printf("array[%zu] = %d\n", pa[i] - array, *pa[i]);
    }
    free(pa);
}

int main(void) {
    int array[8] = {3, 9, 0, 5, 6, 2, 1, 4};
    big(array, 8, 3);
    return 0;
}


実行結果:
$ gcc -Wall -o me me.c
$ ./me
array[1] = 9
array[4] = 6
array[3] = 5

dia********さん

2018/11/1117:41:40

#include<stdio.h>
void big(int array[],int n,int k){
int i,j,tmp;
int soeji[9]={0,1,2,3,4,5,6,7,8};
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){

if (array[i]<array[j])
{
tmp=array[i];
array[i]=array[j];
array[j]=tmp;
tmp=soeji[i];
soeji[i]=soeji[j];
soeji[j]=tmp;
}
}
}
for(i=0;i<k;i++){
printf("%d %d\n",array[i],soeji[i]);
}
}
int main(){
int i,n;
scanf("%d",&n);

int array[9];
for(i=0;i<n;i++){
scanf("%d",&array[i]);
}
big(array,n,3);

}

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる