数字データを高い順に番号を付けて並び替え

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

数字データを高い順に番号を付けて並び替え

#1

投稿記事 by もる » 13年前

初めて利用させて頂きます。
大学の授業中に出た課題で、内容も基礎中の基礎になります。
参考書を読んで自分なりにやってみたのですが、
難しく考えすぎて何から修正すればいいのかよく分からない状態なので、宜しくお願いします。

課題の内容は、
「ファイル(suuzi.txtにしています)に保存している数字のデータを一次元配列に読み込み、
点数の高い順番に番号を割り付けて出力せよ」
と言った、読み込みデータのソートになります。

(出力結果の例) ※左:番号 右:数字データ(中身は「140 87 32 45 54」にしています)
1 140
2 87
3 54
4 45
5 32
6 87


課題として載せられていたプログラムコードは下記になります。

コード:

 
#include <stdio.h>
#include <stdlib.h>
int input_file(int a[]);

void main(void)
{
	int i,N;
	int a[10];
	N=input_file(a);
	for(i=0; i<=N; i++)

//この部分を埋めよ//

}


/*関数の定義 */
int input_file(int a[])
{
	char FileName[20];
	int i,j,N;
	FILE *fp;
	printf("FILE NAME?");
	scanf("%s", FileName);
	printf("File Name is  = %s\n", FileName);

	if((fp=fopen(FileName, "r")) ==NULL)
	{
		printf("Cant't open file \n");
		exit(1);
	}
	i=0;
	while(fscanf(fp, "%d", &a[i]) != EOF){
		i++;
	}
	N=i-1;
	fclose(fp);
	return(N);
}
以上がプログラムコードになります。
「//この部分を埋めよ//」と書かれている部分に
配列データ内の数字を高い順に並び替える処理を追加する所は分かっているのですが
並び替えた際に数字の横に番号も同時に付けないといけないらしいので
それを並び替えの処理にどう組み込めばいいのかで、悩んでいます。

今現在は番号の割り振りだけ行っている状態で、
その部分のコードがこちらになります。

コード:

      int j,w; //追加

	printf("点数の高い順に表示\n");
	for(i=0; i<=N-1; i++){
		printf("%d %d\n",i,a[i]);
			for(j=i+1; j<=N; j++){
			if(a[i] > a[j]){
				w = a[i];
				a[i] = a[j];
				a[j] = w;
			}
		}
この状態で起動させると、番号は無事に振り分けられたのですが
並び替えの処理をまったく組み込んでいないので、数字データは高い順に並びませんでした。
並び替えに関する処理が書いてあるページもいくつか参考にさせて頂いたのですが
関数がどのように動いているのかが分からず、完全に手が詰まってしまいました…。

OSはVistaを使用しており、Visual Vasic stdio2003のC++を使用しています。
プログラミング知識は、まだif文,for文、While文などが使える程度しかありません。
一次元配列に関しても本格的に使用されている課題は今回が初めてです。

現状では、番号を組み込む処理に並び替えをどう組み込めばいいのか悩んでいる状態です。
基礎的な事で申し訳ありませんが、宜しければご回答をお願いします。

box
記事: 2002
登録日時: 15年前

Re: 数字データを高い順に番号を付けて並び替え

#2

投稿記事 by box » 13年前

もる さんが書きました: (出力結果の例) ※左:番号 右:数字データ(中身は「140 87 32 45 54」にしています)
a[0]~a[4]の中身が、並べ替えを行なった後(並べ替えの方法は、いろいろあります)
a[0]=140
a[1]=87
a[2]=54
a[3]=45
a[4]=32
となったのであれば、配列の中身を出力するとき、ついでに、
「配列の添字番号+1]もいっしょに出力すればいいです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

もる

Re: 数字データを高い順に番号を付けて並び替え

#3

投稿記事 by もる » 13年前

ご返答ありがとうございます。
配列の添字番号+1を同時に出力するとの事だったので
並び替え処理後の出力の際に

コード:

printf("%d %d\n",i+1,a[i]);
添字番号「i」を+1としたのですが、この考え方で大丈夫でしょうか?
追加後の変更プログラムは以下になります。

コード:

#include <stdio.h>
#include <stdlib.h>
int input_file(int a[]);
 
void main(void)
{
    int i,j,w,N,s,d;
    int a[10];
    N=input_file(a);
    for(i=0; i<=N; i++)

//この部分を埋めよ//
	for(i=0;i<N-1;i++){
		w=a[i];
		s=i;
		for(j=i+1;j<i;j++){
			if(a[j]<w){
			w=a[j];
			s=j;
			}
		}
	d=a[i]; a[i]=a[s]; a[s]=d;
	}
	for(i=0;i<N;i++)
	//配列の添字番号+数字の表示?
        printf("%d %d\n",i+1,a[i]);
}
 
/*関数の定義 */
int input_file(int a[])
{
    char FileName[10];
    int i,j,N,s;
    FILE *fp;
    printf("FILE NAME?");
    scanf("%s", FileName);
    printf("File Name is  = %s\n", FileName);
 
    if((fp=fopen(FileName, "r")) ==NULL)
    {
        printf("Cant't open file \n");
        exit(1);
    }
    i=0;
    while(fscanf(fp, "%d", &a[i]) != EOF){
        i++;
    }
    N=i-1;
    fclose(fp);
    return(N);
}
教科書を参考にして並び替えの処理を作ったので、今回は降順ではなく昇順になっています。
VBS2003が家のパソコンに入っていないので、まだコンパイルして確認出来ていません。
プログラムを見て明らかにおかしい所があれば、
お手数をお掛けして申し訳ありませんがご指摘をお願いします。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 数字データを高い順に番号を付けて並び替え

#4

投稿記事 by みけCAT » 13年前

もる さんが書きました:課題の内容は、
「ファイル(suuzi.txtにしています)に保存している数字のデータを一次元配列に読み込み、
点数の高い順番に番号を割り付けて出力せよ」
と言った、読み込みデータのソートになります。

(出力結果の例) ※左:番号 右:数字データ(中身は「140 87 32 45 54」にしています)
1 140
2 87
3 54
4 45
5 32
6 87
点数の高い順番になっていない(最後の87が不自然)のですが、どういうことでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 15年前

Re: 数字データを高い順に番号を付けて並び替え

#5

投稿記事 by box » 13年前

みけCAT さんが書きました: 点数の高い順番になっていない(最後の87が不自然)のですが、どういうことでしょうか?
単なる打ち間違い(最後の87は不要)でありましょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

non
記事: 1097
登録日時: 15年前

Re: 数字データを高い順に番号を付けて並び替え

#6

投稿記事 by non » 13年前

10行目の

コード:

for(i=0; i<=N; i++)
は、何でしょうね。元々、先生から使うように指示された行ですよね。
Nはデータ個数でしょうから、データ個数+1回繰り返して何をしたいのでしょう?
わからんなぁ。
non

かずま

Re: 数字データを高い順に番号を付けて並び替え

#7

投稿記事 by かずま » 13年前

もる さんが書きました: 今現在は番号の割り振りだけ行っている状態で、
その部分のコードがこちらになります。

コード:

      int j,w; //追加

	printf("点数の高い順に表示\n");
	for(i=0; i<=N-1; i++){
		printf("%d %d\n",i,a[i]);
			for(j=i+1; j<=N; j++){
			if(a[i] > a[j]){
				w = a[i];
				a[i] = a[j];
				a[j] = w;
			}
		}
ほぼできていますね。不等号を逆にすることと、printf を最後にすることだけですよ。

コード:

    {
        int j,w;  //追加

        for(j=i+1; j<=N; j++){
            if(a[i] < a[j]){
                w = a[i];
                a[i] = a[j];
                a[j] = w;
            }
        }
    }
    printf("点数の高い順に表示\n");
    for(i=0; i<=N; i++){
        printf("%d %d\n",i+1,a[i]);
    } 
input_file で一つ少ないデータ数を返すのが変ですが。

もる

Re: 数字データを高い順に番号を付けて並び替え

#8

投稿記事 by もる » 13年前

皆さんご返答ありがとうございます。
本日学校にて一部修正した物をコンパイルした所、無事正常に起動してくれました。
最終的な修正内容は下記の物になります。

コード:

#include <stdio.h>
#include <stdlib.h>
int input_file(int a[]);
void main(void)
{
    int i,j,w,N;
    int a[10];
    N=input_file(a);

    for(i=0; i<=N; i++)
	{
		for(j=i+1; j<=N; j++){
			if(a[i] < a[j]){
				w = a[i];
                a[i] = a[j];
                a[j] = w;
			}
		}
	}
    printf("点数の高い順に並び替え\n");
    for(i=0; i<=N; i++)
	{
        printf("%d %d\n",i+1,a[i]);
    }
}
/*関数の定義*/
int input_file(int a[])
{
    char FileName[10];
    int i,j,N,s;
    FILE *fp;
    printf("FILE NAME?");
    scanf("%s", FileName);
    printf("File Name is  = %s\n", FileName);
 
    if((fp=fopen(FileName, "r")) ==NULL)
    {
        printf("Cant't open file \n");
        exit(1);
    }
    i=0;
    while(fscanf(fp, "%d", &a[i]) != EOF){
        i++;
    }
    N=i-1;
    fclose(fp);
    return(N);
}

コード:

 
for(i=0; i<=N; i++)

この部分に関しては、この課題の追加問題にデータ個数の表示や昇順にする等の問題がありましたので
その関係で最初から問題文にそのような処理が追加されていたのではないかなと思っています。
かなり長い間悩んでいた問題でしたが、最終的に仕組みもようやく理解できました。
今回は本当にありがとうございます!

閉鎖

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