ページ 1 / 1
助けてください。
Posted: 2009年1月18日(日) 04:12
by ももにー
入力された10個の整数を小さい順に並べ替えて出力する。
1,学生番号が偶数の人は小さい順(昇順)に並べ替える。
2,学生番号が奇数の人は大きい順(降順)に並べ替える。
という課題が出されました。
ある一部分を各自作成しなくてはならないのですが、
C言語にはまったく自信がありません。
以下のプログラムが何をやっているのかさえ理解できません。
かなりの問題児ですが、よろしくお願いします。
/************
sort 10 data
*************/
#include<stdio.h>
#define MAX 10
void inputnum(int num[/url]);
void sortnum(int num[/url]);
void outputnum(int num[/url]);
main(){
int num[MAX];
inputnum(num);
sortnum(num);
outputnum(num);
return(0);
}
/***********************
input 10 numbers to arry
***********************/
void inputnum(int num[/url]){
int i;
for(i=0;i<MAX;i++){
printf("数値%d"=",i+1);
scanf("%d",&num);
}
printf("数値入力完了\n");
}
/*************
sort 10 number
*************/
#define FON 1
#define FOFF 0
void sortnum(int num[/url]){
int i;
int sflg;/*sort flag*/
int work;/*work area for sorting*/
sflg=FON;/* sort flag on */
while(sflg){
sflg=FOFF;/*sort sflg off */
for(i=0;i<MAX-1;i++){
if(num>num[i+1]){
以下からが各自考えるところです。
自分なりに作ってみましたが、さっぱりです。
手直ししていただけると嬉しいです。
work=num[n];
num[n]=num[n+1];
num[n+1]=work;
}
}
printf("並べ替え完了\n");
}
/*************************
output 10 number from arry
*************************/
void outputnum(int num[/url]){
int i;
for(i=0;<MAX;i++){
printf("数値%d=%d\n",i+1,num);
}
printf("数値出力完了\n");
}
Re:助けてください。
Posted: 2009年1月18日(日) 08:44
by non
>以下からが各自考えるところです。
>自分なりに作ってみましたが、さっぱりです。
>手直ししていただけると嬉しいです。
とりあえず、この部分に
sflag=FON;
と書いて、プログラムをコンパイルし、エラーをなくしてください。
その後、わからないことを質問して下さい。
Re:助けてください。
Posted: 2009年1月18日(日) 08:51
by box
> 入力された10個の整数を小さい順に並べ替えて出力する。
> 1,学生番号が偶数の人は小さい順(昇順)に並べ替える。
> 2,学生番号が奇数の人は大きい順(降順)に並べ替える。
問題文が、仮に
入力された10個の整数を並べ替えて出力する。
1,学生番号が偶数の人は小さい順(昇順)に並べ替える。
2,学生番号が奇数の人は大きい順(降順)に並べ替える。
だったら理解できるのですが、原文だと
学生番号が奇数の人はどうすればいいかわからなくて
苦労するのではないでしょうか。
Re:助けてください。
Posted: 2009年1月18日(日) 12:06
by s-rush
パッと見た感じですが、文法的にも間違いがあるようですよ。
質問前にちゃんとコンパイルしましたか?
>main(){
int main(void){
>printf("数値%d"=",i+1);
printf("数値%d=",i+1);
>work = num[n];
>num[n] = num[n+1];
>num[n+1] = work;
変数nが定義されていません。
>for(i=0; <MAX; i++){
for(i=0; i<MAX; i++){
期待している結果が得られるかどうかは別ですが、(このプログラムではちゃんとソートされませんが^^;)
これでエラーは外れるはずです。
boxさんのおっしゃるように原文の問題だと矛盾があるような気がします。
なので、昇順にソートするということで話を進めさせていただきます。
sortnum関数内のwhile文がありますよね??
ももにーさんの書き方だと、while文の中身は1度しか実行されません。
たとえば入力された値が
3 2 5 4
とします。(面倒なので4入力とさせてください)
それでこのプログラムを実行させると
2 3 5 4
となり、ちゃんとソートされていません。
while内のどこかで、
sflag=FON;
とする必要があります。
それともう1つ。
これも実行例を示した方がいいですかね。
たとえば入力された値が
3 4 1 5 6
とします。
同様にこのプログラムを実行させると、(上記の修正をしたとします)
3 1 4 5 6
となり、ソート不十分です。
>for(i=0;i<MAX-1;i++){
この後にもう1行for文である処理を加える必要があります。
ソートの手法としては様々なアルゴリズムがありますが、一度
“バブルソート”
でググってみてください。
調べるとおそらく何を追加しなければいけないか見えてくると思います。
Re:助けてください。
Posted: 2009年1月18日(日) 12:25
by non
>>for(i=0;i<MAX-1;i++){
>この後にもう1行for文である処理を加える必要があります。
whileがその代わりをしています。
バブルソートに似ていますが、ちょっと違います。
名前はなんと呼ぶか知りません。
Re:助けてください。
Posted: 2009年1月18日(日) 12:27
by s-rush
すいません。
大きな勘違いをしてました。
while文の条件で
>sflg = FON;
は関係ないですね^^;
ここに訂正してお詫びしますm(_ _)m
ソートのアルゴリズムが分かれば、あとは入力された値が
奇数なのか偶数なのかを判断し、それぞれに対応した処理を行うように
すればいいのではないでしょうか?
Re:助けてください。
Posted: 2009年1月18日(日) 12:45
by s-rush
nonさん、ご指摘ありがとうございます。
よく考えてみれば、while文の意味がないですね^^;
sflgを切り替えるのであれば、おっしゃる通りバブルソートではないです。
すいませんでした。
Re:助けてください。
Posted: 2009年1月18日(日) 12:54
by lbfuvab
qsortって使ったら駄目ですか?
無題
Posted: 2009年1月18日(日) 13:30
by ももにー
みなさんこの課題に真剣に取り組んでくださって、
本当にありがとうございます。
みなさんの回答をじっくり読ませていただきましたが、
何から始めたらよいか、また、何を入力したらよいか、
わかりません(´;ω;`)
理解力が乏しいですが、根気強く教えていただけると嬉しいです。
Re:助けてください。
Posted: 2009年1月18日(日) 13:34
by array
> 1,学生番号が偶数の人は小さい順(昇順)に並べ替える。
> 2,学生番号が奇数の人は大きい順(降順)に並べ替える。
ちなみに、この文は直接問題には関係なく、ももにーさんの学籍番号に関係するのでしょうか?
もし、そうだった場合、ももにーさんの学籍番号が奇数か偶数か示していた方が、良い気がします。
問題についていまいち理解してませんが、単純に10個の入力した数値をソートするプログラムにしてみました。
最近C言語に触れてなかったので自身は無なく、元のソートとは多分違う形式のソート方式を使ってると思います。(昇順)でソートしてます。
元のソート、プログラムではwhile文を使っていますが
今回の場合、配列要素は
#define MAX 10
で10個と定義されているのでfor文を使った形の方が良いのでは?って事でforを使って考えました。
※あまり関係ない部分は文字を小さくしています。
/************
sort 10 data
*************/
#include<stdio.h>
#define MAX 10
void inputnum(int num[/url]);
void sortnum(int num[/url]);
void outputnum(int num[/url]);
main(){
int num[MAX];
inputnum(num);
sortnum(num);
outputnum(num);
return(0);
}
/***********************
input 10 numbers to arry
***********************/
void inputnum(int num[/url]){
int i;
for(i=0;i<MAX;i++){
printf("数値%d=",i+1);
scanf("%d",&num);
}
printf("数値入力完了\n");
}
/*************
sort 10 number ソート部分
*************/
void sortnum(int num[/url])
{
int i,j;
int work;/*work area for sorting*/
for(i=0;i<MAX;i++) //配列[0]から比較する
{
for(j=i;j<MAX;j++) //
{
if(num > num[j]) //小さければ
{
work = num[j]; //小さい値を別保存
num[j] = num; //大きい値を入れ替え
num = work; //小さい値を入れ変える
}
}
}
printf("並べ替え完了\n");
}
/*************************
output 10 number from arry
*************************/
void outputnum(int num[/url]){
int i;
for(i=0;i<MAX;i++){
printf("数値%d=%d\n",i+1,num);
}
printf("数値出力完了\n");
}
------------------------------------------------
#####入力情報#####
数値1=5
数値2=6
数値3=4
数値4=2
数値5=2
数値6=3
数値7=9
数値8=1
数値9=8
数値10=7
#####実行結果#####
数値1=1
数値2=2
数値3=2
数値4=3
数値5=4
数値6=5
数値7=6
数値8=7
数値9=8
数値10=9
Re:助けてください。
Posted: 2009年1月18日(日) 14:02
by ももにー
>>arrayさん
ありがとうございます。
私の学生番号は偶数です。
arrayさんの回答を参考に入力してみましたが、
コンパイルに失敗します。
というか、みなさんに助けていただく前から、
コンパイルに失敗しています。
やっぱりコンパイルって正確に入力されないと成功しないものですよね?
Re:助けてください。
Posted: 2009年1月18日(日) 14:10
by array
赤文字のみの修正だけではなく
プログラム全体をコピーして貼り付けてコンパイルしてみて下さい。(白文字の小文字部分)
printfに数か所ミスがあったので修正しておきました。
もしくは、赤文字の//以降を削除してから再度コンパイルしてみて下さい。
//以降はコメントです。
コンパイラ(コンパイルソフト)によって、「//」スラッシュを2個を用いるコメントが使えないものがあるみたいです。(C言語では普通は使えないみたいですけどC++コンパイラなら大丈夫だと思います)
Re:助けてください。
Posted: 2009年1月18日(日) 16:15
by ももにー
>>arrayさん
たびたびありがとうございます。
arrayさんのをコピーさせていただいて、このようになりました。
/************
sort 10 data
*************/
#include<stdio.h>
#define MAX 10
void inputnum(int num[/url]);
void sortnum(int num[/url]);
void outputnum(int num[/url]);
main(){
int num[MAX];
inputnum(num);
sortnum(num);
outputnum(num);
return(0);
}
/***********************
input 10 numbers to arry
***********************/
void inputnum(int num[/url]){
int i;
for(i=0;i<MAX;i++){
printf("数値%d=",i+1);
scanf("%d",&num);
}
printf("数値入力完了\n");
}
/*************
sort 10 number
*************/
void sortnum(int num[/url])
{
int i,j;
int work;/*work area for sorting*/
for(i=0;i<MAX;i++)
{
for(j=i;j<MAX;j++)
{
if(num > num[j])
{
work = num[j];
num[j] = num;
num = work;
}
}
}
printf("並べ替え完了\n");
/*************************
output 10 number from arry
*************************/
void outputnum(int num[/url]){
int i;
for(i=0;i<MAX;i++){
printf("数値%d=%d\n",i+1,num);
}
printf("数値出力完了\n");
}
ソート部分のエラーは無くなったようなのですが、
まだ出力部分にエラーがあるようでコンパイルに失敗します。
どのようにしたらよいのでしょう?
Re:助けてください。
Posted: 2009年1月18日(日) 16:25
by ももにー
>>arrayさん!!
今見なおしたらちょっと抜けてて、直したらできました(感動)!!
arrayさん
s-rushさん
lbfuvabさん
nonさん
boxさん
ご協力本当にありがとうございました。
またの機会がありましたらぜひよろしくお願いします(´;ω;`)
Re:助けてください。
Posted: 2009年1月18日(日) 16:27
by box
sortnum関数がきちんと閉じていないことが原因です。
Re:助けてください。
Posted: 2009年1月18日(日) 16:27
by ももにー
解決です。
Re:助けてください。
Posted: 2009年1月18日(日) 16:32
by array
コンパイル時のエラーはどんなものでしょうか?
一応こちらで確認してみたところ以下の様になっていました。
test.c(56) : error C2143: 構文エラー : ';' が '型' の前にありません。
()の中は行数を示しているので、その56行目付近が怪しいです。
エラーは自分で解決して慣れるのが一番いいと思いますが・・・・
調べてみたところ「}」が抜けてるみたいです。
/* ~省略~ */
}
printf("並べ替え完了\n");
}
/*************************
output 10 number from arry
*************************/
void outputnum(int num[/url]){
/* ~省略~ */
----追記----
解決してましたか♪
C言語は興味持てれば、独学でも理解できるので、ぜひこれからもC言語取得頑張って下さい^^
C言語が分かるようになれば、管理人さんが公開している、ゲームプログラミングの館を参考に
自作のゲームなどが作れて楽しいですよ^^
Re:助けてください。
Posted: 2009年1月18日(日) 17:07
by non
ちょっとみないうちに解決した事になってますが、
課題は while(sflg)を使って解かなければいけないのでしょ!!
forの2重ループにして、選択法(だったかな?)にしてしまったらまずいでは?
一番最初に私が、言ったように、下の1行を加えて、エラーを直せばいいって言ったのに。
while(sflg){
sflg=FOFF;/*sort sflg off */
for(i=0;i<MAX-1;i++){
if(num>num[i+1]){
sflg=FON;
work=num;
num=num[i+1];
num[i+1]=work;
}
}
}
この方法は、呼び方は知らないけどアリですよ。
sflagは並び替えが行われないときはFOFFのままなので、最初から並び替えられているときは
すぐに終わる特徴があります。
通常はforの2重ループとsflagを組み合わせて、両方使いますけど。
Re:助けてください。
Posted: 2009年1月18日(日) 20:18
by ももにー
>>nonさん
わざわざありがとうございます。
折角ですので参考にさせていただきます。
本当に本当にありがとうございます。