質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

811閲覧

シェルソートの書き方がわかりません

OHASI

総合スコア96

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/12/16 04:47

【質問】学校の課題では実行例が381回なのですが、以下のコードでは実行回数が1349回になってしまいます。「47〜55行目が違います」と返信が来ました。どう直せばいいですか?

【課題】
番号とテストの得点が格納されたデータファイルのファイル名(20 文字以内)をキーボードから入力し,構造体配列 seiseki にファイルのデータを保存してレコード件数を表示する.
その後,実行例の通り得点の降順にシェルソートで整列して表示させ,最後に配列要素の交換回数を表示させること(シェルソート以外の方法でプログラムした場合は受領しません).なお,ギャップは方法1(クヌースの方法)で求めること.

以上、よろしくお願いします。

c

1#include<stdio.h> 2#include<stdlib.h> 3int main(void) 4 5{ 6 char filename[21]; 7 FILE *fp; 8 struct seisekiA{ 9 int bango, tokuten; 10 }; 11 struct seisekiA seiseki[100]; 12 int n=0,cnt=0; 13 int i,j,work,gap,m; 14 15 printf("ファイル名を入力してください\n"); 16 scanf("%s",filename); 17 if((fp=fopen(filename,"r"))==NULL) 18 { 19 printf("FILE OPEN ERROR\n"); 20 exit(1); 21 } 22 printf("番号 得点\n"); 23 24 while(fscanf(fp,"%d%d",&seiseki[n].bango,&seiseki[n].tokuten)!=EOF) 25 { 26 printf("%4d %4d\n",seiseki[n].bango,seiseki[n].tokuten); 27 n++; 28 } 29 printf("レコード件数=%d\n",n); 30 printf("整列結果\n"); 31 32 gap=1; 33 while(gap*3+1 <= n) 34 gap = gap*3+1; 35 36 while(gap>0) 37 { 38 for(cnt=0; cnt<gap; cnt++) 39 { 40 i = gap+cnt; 41 while(i<n) 42 { 43 j = i; 44/************************************************ここから************************************************/ 45 while(j>=gap && seiseki[j-gap].bango<seiseki[j].bango,j>=gap && seiseki[j-gap].tokuten<seiseki[j].tokuten) 46 { 47 work = seiseki[j].tokuten; 48 seiseki[j].tokuten = seiseki[j-gap].tokuten; 49 seiseki[j-gap].tokuten = work; 50 51 work = seiseki[j].bango; 52 seiseki[j].bango = seiseki[j-gap].bango; 53 seiseki[j-gap].bango = work; 54/************************************************ここまで************************************************/ 55 56 j -= gap; 57 cnt++; 58 59 } 60 i += gap; 61 } 62 } 63 gap/=3; 64 } 65 66 for(i=0; i<n; i++) 67 { 68 69 printf("%4d %4d\n",seiseki[i].bango ,seiseki[i].tokuten); 70 } 71 72 fclose(fp); 73 printf("比較回数=%d\n",cnt); 74 75 return 0; 76} 77

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaina

2020/12/16 05:04

「47〜55行目が違います」と返信が来ました。 ということはどう直せばいいか考えなさいという意図で先生は返信されたと思いますが、 ご自分でデバッグ等を行い考えた上での質問でしょうか? また、上記を行ったとしても、質問すべきはネットの掲示板では無く、先生に対してでは無いでしょうか?
tanat

2020/12/16 05:19

先生は割とこういうサイトを見ているので、質問の仕方を具体的にするか、質問の削除依頼をされることをお勧めします。
guest

回答1

0

ベストアンサー

C

1 while(j>=gap && seiseki[j-gap].bango<seiseki[j].bango, 2 j>=gap && seiseki[j-gap].tokuten<seiseki[j].tokuten)

コンマ演算子による A, B は A の値が無視され、B の値となります。
,&& に変えてみたらどうなりますか?
でも、ソートを得点で行うとしたら番号による比較は必要ないから、これが問題とも思えません。

質問をするときは、入力データ(ファイルの内容) を示してください。
データが多いときは、少なくして同じ現象が出るデータにするなど工夫してください。

投稿2020/12/17 03:23

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問