teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

前提・実現したいことの部分の追加

2019/08/29 06:06

投稿

rinringo_88
rinringo_88

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,8 @@
1
1
  }### 前提・実現したいこと
2
+ できるだけバブルソートの部分を入れ替えるのを繰り返すという方法で、年齢を小さい順に表示させたいです。
3
+ 以下の画像に書いた考え方でバブルソートの部分をコーディングしたいです。
4
+ http://s.kota2.net/1567057495.png
5
+ http://s.kota2.net/1567057524.png
2
6
 
3
7
  ここに質問の内容を詳しく書いてください。
4
8
  プログラム初心者です。こちらのサイトで質問をするのも慣れておりませんので失礼があったら申し訳ありません。
@@ -148,7 +152,11 @@
148
152
  ### 試したこと
149
153
 
150
154
  ここに問題に対して試したことを記載してください。
155
+ 双方向リストの入れ替えについて以下の画像のように考えました。
156
+ http://s.kota2.net/1567057495.png
157
+ http://s.kota2.net/1567057524.png
151
158
 
159
+
152
160
  ### 補足情報(FW/ツールのバージョンなど)
153
161
 
154
162
  ここにより詳細な情報を記載してください。

2

バブルソートのコーディング部分を自分なりに考えて変更しました。

2019/08/29 06:06

投稿

rinringo_88
rinringo_88

スコア4

title CHANGED
File without changes
body CHANGED
@@ -35,6 +35,8 @@
35
35
  特に、下の方のポインタ演算子の入れ替えの部分が上手いコードが思いつきません。
36
36
 
37
37
  ### 発生している問題・エラーメッセージ
38
+ バブルソートの部分が上手く入れ替えできず、for文が回らない。
39
+ コンパイルすると「ファイルのオープンに成功しました」という文章しか表示されない。
38
40
 
39
41
  ```
40
42
  エラーメッセージ
@@ -50,9 +52,9 @@
50
52
  struct ST_MEMBER
51
53
  {
52
54
  int number; //社員番号
53
- char name[50]; //名前
55
+ char name[50]; //名前
54
56
  int age; //年齢
55
- char gender[10]; //性別
57
+ char gender[10]; //性別
56
58
  struct ST_MEMBER *prev;
57
59
  struct ST_MEMBER *next;
58
60
  };
@@ -62,7 +64,7 @@
62
64
 
63
65
  FILE *fp;
64
66
  int i, j, max, ret;
65
- struct ST_MEMBER *str, *str2 = 0, *temp, *temp2;
67
+ struct ST_MEMBER *str, *str2 = 0, *str3 = 0, *temp;
66
68
 
67
69
  if(fopen_s(&fp, "Meibo.txt", "r") != 0) //読み取りモードでファイルを開く
68
70
  {
@@ -86,7 +88,7 @@
86
88
  //構造体を数珠つなぎにする
87
89
  if(str2 == 0)
88
90
  {
89
- str2 = str; //アドレス
91
+ str2 = str;
90
92
  str2->prev = 0;
91
93
  str2->next = 0;
92
94
  }
@@ -100,37 +102,47 @@
100
102
 
101
103
  ret = fscanf(fp, "%4d%16s%5d%5s\n", &str->number, str->name, &str->age, str->gender);
102
104
 
105
+
103
106
  if(ret == -1) //EOF
104
107
  break;
105
108
  }
106
-
107
109
 
110
+ //先頭に戻る
108
111
  for(i = 0; str2->prev != 0; i++)
109
112
  str2 = str2->prev;
113
+
114
+ for(i = 0; (str2->next->age) != 0; i++)
115
+ {
116
+
117
+ if((str2->age) > (str2->next->age)) //年齢を小さい順に表示したいので年齢を比較する。
118
+ {
119
+ //全部の構造体を入れ替える(1行ずつ入れ替える)
120
+
121
+ str2->next = str2->next->next;
122
+ str2->prev = str2->next;
123
+
124
+ str->next->next = str2->next->prev;
125
+ str->next->prev = str2->prev;
110
126
 
127
+ }
128
+ }
129
+
111
130
 
112
- for(i = 0; (str2->next->age) != 0; i++)
131
+
113
- {
114
- if((str2->age) > (str2->next->age)) //年齢を昇順に表示したいので年齢を比較する。
115
- { //全部の構造体を入れ替える(1行ずつ入れ替える)
116
- temp = str2;
117
- str2 = (str->next);
118
- (str->next) = temp;
119
- }
120
- }
121
- /*
122
132
  for(i = 0; str2->next != 0; i++)
123
133
  {
124
134
  printf("%4d%16s%5d%5s\n", str2->number, str2->name, str2->age, str2->gender);
125
135
  str2 = str2->next;
126
- }
136
+ }
127
- */
137
+
128
-
129
138
  free(str);
130
139
 
131
140
  fclose(fp);
132
141
 
133
142
  return 0;
143
+ }
144
+
145
+
134
146
  ```
135
147
 
136
148
  ### 試したこと

1

ソースコードを書く場所を間違っていたので訂正しました。ご指摘ありがとうございました。

2019/08/29 05:57

投稿

rinringo_88
rinringo_88

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,48 @@
1
+ }### 前提・実現したいこと
2
+
3
+ ここに質問の内容を詳しく書いてください。
1
- // 11-2.cpp : コンソール アリケーションエントリ ポトを定義しま
4
+ ログラム初心者です。こちらイトで質問するのも慣れておりませんので失礼があったら申訳ありせん
5
+
6
+ C言語で名簿を表示させるプログラムを作成しました。
7
+ 名簿の中身は以下のようになっております。
8
+
9
+ 100 あ 30 男性
10
+ 101 あ 20 女性
11
+ 102 い 40 男性
12
+ 103 う 30 男性
13
+ 104 え 30 女性
14
+ 105 お 20 男性
15
+ 106 か 40 女性
16
+ 107 き 50 男性
17
+ 108 く 30 女性
18
+ 109 け 40 男性
19
+ 110 こ 20 女性
20
+ 111 さ 50 男性
21
+ 112 し 30 女性
22
+ 113 す 40 男性
23
+ 114 せ 20 男性
24
+ 115 そ 30 女性
25
+ 116 た 40 男性
26
+ 117 ち 20 女性
27
+ 118 つ 30 男性
28
+ 119 て 50 男性
29
+ 120 と 40 女性
30
+ 121 な 50 男性
31
+ 122 に 30 女性
32
+ 123 ぬ 20 男性
33
+
34
+ 名簿の年齢が小さい順に並べ替えたいのですが、当方の力不足で上手くできません。
35
+ 特に、下の方のポインタ演算子の入れ替えの部分が上手いコードが思いつきません。
36
+
37
+ ### 発生している問題・エラーメッセージ
38
+
39
+ ```
40
+ エラーメッセージ
41
+ ```
42
+
2
- //
43
+ ### 該当のソースコード
44
+
45
+ ```C
3
46
  #include "stdafx.h"
4
47
  #include <stdio.h>
5
48
  #include <stdlib.h>
@@ -88,54 +131,8 @@
88
131
  fclose(fp);
89
132
 
90
133
  return 0;
91
- }### 前提・実現したいこと
92
-
93
- ここに質問の内容を詳しく書いてください。
94
- プログラム初心者です。こちらのサイトで質問をするのも慣れておりませんので失礼があったら申し訳ありません。
95
-
96
- C言語で名簿を表示させるプログラムを作成しました。
97
- 名簿の中身は以下のようになっております。
98
-
99
- 100 あ 30 男性
100
- 101 あ 20 女性
101
- 102 い 40 男性
102
- 103 う 30 男性
103
- 104 え 30 女性
104
- 105 お 20 男性
105
- 106 か 40 女性
106
- 107 き 50 男性
107
- 108 く 30 女性
108
- 109 け 40 男性
109
- 110 こ 20 女性
110
- 111 さ 50 男性
111
- 112 し 30 女性
112
- 113 す 40 男性
113
- 114 せ 20 男性
114
- 115 そ 30 女性
115
- 116 た 40 男性
116
- 117 ち 20 女性
117
- 118 つ 30 男性
118
- 119 て 50 男性
119
- 120 と 40 女性
120
- 121 な 50 男性
121
- 122 に 30 女性
122
- 123 ぬ 20 男性
123
-
124
- 名簿の年齢が小さい順に並べ替えたいのですが、当方の力不足で上手くできません。
125
- 特に、下の方のポインタ演算子の入れ替えの部分が上手いコードが思いつきません。
126
-
127
- ### 発生している問題・エラーメッセージ
128
-
129
134
  ```
130
- エラーメッセージ
131
- ```
132
135
 
133
- ### 該当のソースコード
134
-
135
- ```ここに言語名を入力
136
- ソースコード
137
- ```
138
-
139
136
  ### 試したこと
140
137
 
141
138
  ここに問題に対して試したことを記載してください。