質問編集履歴

5

回答を参考にして少し変更しました

2023/07/16 15:06

投稿

tkgoisii
tkgoisii

スコア2

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
  これらを使ったプログラム
5
5
 
6
6
  ### 前提
7
- ファイルから数値のデータを読み取り、二分探索するプログラムを「ファイルからデータを読み込む」「データの整列」「二分探索」の3つの関数を使用してプログラムを作成したいのですが、作成して実行すると読み取ったファイル内にない数値が出きて困っています。ファイルから読み取って二分探索するプログラムはできていです、関数にけて作成しようとするとうまく動なくなったため、質問しした
7
+ ファイルから数値のデータを読み取り、二分探索するプログラムを「ファイルからデータを読み込む」「データの整列」「二分探索」の3つの関数を使用してプログラムを作成したいのですが、どの数値を探索しも-1を返されます。コンパイルはできますが、コアダンプが出ていてどこを直せばいいが分かせん
8
8
 
9
9
 
10
10
  ### 該当のソースコード
@@ -14,16 +14,17 @@
14
14
  #include <stdlib.h>
15
15
  #define MAXDATA 10000
16
16
 
17
- int file(int a[MAXDATA], int n){
17
+ int fileopen(int a[MAXDATA]){
18
18
 
19
19
  char filename[20];
20
20
  FILE *fin;
21
+ int n;
21
22
 
22
23
  printf("file name = ");
23
24
  scanf("%s", filename);
24
25
  if ((fin=fopen(filename, "r"))==NULL) {
25
26
  printf("ファイルをオープンできません\n");
26
- return 1;
27
+ return (-1);
27
28
  }
28
29
  n=0;
29
30
 
@@ -33,12 +34,13 @@
33
34
  return n;
34
35
  }
35
36
 
36
- int sort(int n, int a[MAXDATA], int max){
37
+ void sort(int a[MAXDATA], int n){
37
38
 
38
39
  int i, j, k;
39
40
  int tmp;
41
+ int max;
40
42
 
41
- for (i = 0; i < n-1; i++) {
43
+ for (i = 0; i < n-1; i++) {
42
44
  j = i;
43
45
  for (k = i+1; k < n; k++) {
44
46
  if (a[j] > a[k]) { j = k; }
@@ -47,25 +49,28 @@
47
49
  a[j] = a[i];
48
50
  a[i] = tmp;
49
51
  }
52
+
50
- for (i = 0; i < n; i++) {
53
+ for (i = 0; i < n; i++) {
51
54
  printf("%d\n", a[i]);
52
55
  }
53
56
  max = i;
54
57
  }
55
58
 
56
- int binary(int position, int n, int max, int x, int a[MAXDATA]){
59
+ int binarysearch(int n, int x, int a[MAXDATA]){
57
60
 
58
61
  int min = 0;
59
- int mid = (max+min)/2;
62
+ int mid;
60
63
  int i = 0;
64
+ int position;
65
+ int max = n-1;
61
66
 
62
67
  while (position==-1 && i<n) {
63
68
 
64
69
  mid = (max+min)/2;
65
70
 
66
- if (a[mid]==x) position=mid+1;
71
+ if (a[mid]==x) position=mid+1;
67
72
 
68
- else if (a[mid] < x){
73
+ else if (a[mid] < x){
69
74
  min = mid+1;
70
75
  i++;
71
76
  }
@@ -81,18 +86,20 @@
81
86
 
82
87
  int a[MAXDATA];
83
88
  int n;
89
+ int x;
90
+ int position;
84
91
  int max;
85
- int position;
86
- int x;
87
92
 
88
- file(&a[MAXDATA], n);
93
+ n = fileopen(&a[MAXDATA]);
89
94
 
90
- sort(n, &a[MAXDATA], max);
95
+ max = n;
91
96
 
97
+ sort(&a[MAXDATA], n);
98
+
92
- while (scanf("%d", &x)==1) {
99
+ while (scanf("%d", &x)==1) {
93
100
  position=-1;
94
101
 
95
- binary(position, n, max, x, &a[MAXDATA]);
102
+ binarysearch(n, x, &a[MAXDATA]);
96
103
 
97
104
  printf(" x=%d ---> %d\n", x, position);
98
105
  }
@@ -102,7 +109,7 @@
102
109
  ```
103
110
 
104
111
  ### 試したこと
105
- 関数にけて引数使用し作成したのですが、色々いじっらコンパイルエラー多く出たため、一度デフォルトにもどしました
112
+ binarysearchの部分をいじっみましたが、どこを変えればきちんと位置値が出るのか分かりません。ソートは昇順にはなるのが、一部数値がおかくなり
106
113
 
107
114
  ### 補足情報(FW/ツールのバージョンなど)
108
115
 

4

説明の増加

2023/07/16 13:31

投稿

tkgoisii
tkgoisii

スコア2

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
  これらを使ったプログラム
5
5
 
6
6
  ### 前提
7
- ファイルから数値のデータを読み取り、二分探索するプログラムを「ファイルからデータを読み込む」「データの整列」「二分探索」の3つの関数を使用してプログラムを作成したいのですが、うまくで困っています。ファイルから読み取って二分探索するプログラムはできているのですが、関数に分けて作成しようとするとうまく動かなくなったため、質問しました。
7
+ ファイルから数値のデータを読み取り、二分探索するプログラムを「ファイルからデータを読み込む」「データの整列」「二分探索」の3つの関数を使用してプログラムを作成したいのですが、作成して実行すると読み取ったファイル内にない数値が出て困っています。ファイルから読み取って二分探索するプログラムはできているのですが、関数に分けて作成しようとするとうまく動かなくなったため、質問しました。
8
8
 
9
9
 
10
10
  ### 該当のソースコード

3

修正しました

2023/07/16 13:29

投稿

tkgoisii
tkgoisii

スコア2

test CHANGED
File without changes
test CHANGED
@@ -9,6 +9,7 @@
9
9
 
10
10
  ### 該当のソースコード
11
11
  c言語で、関数に分けてみたプログラムです。
12
+ ```
12
13
  #include <stdio.h>
13
14
  #include <stdlib.h>
14
15
  #define MAXDATA 10000
@@ -98,7 +99,7 @@
98
99
  printf("またお会いしましょう\n");
99
100
  return 0;
100
101
  }
101
-
102
+ ```
102
103
 
103
104
  ### 試したこと
104
105
  関数に分けて引数を使用して作成したのですが、色々いじったらコンパイルでエラーが多く出たため、一度デフォルトにもどしました。

2

関数に分けました

2023/07/16 09:56

投稿

tkgoisii
tkgoisii

スコア2

test CHANGED
File without changes
test CHANGED
@@ -4,25 +4,17 @@
4
4
  これらを使ったプログラム
5
5
 
6
6
  ### 前提
7
- ファイルから数値のデータを読み取り、二分探索するプログラムを「ファイルからデータを読み込む」「データの整列」「二分探索」の3つの関数を使用してプログラムを作成したいのですが、うまくできず困っています。ファイルから読み取って二分探索するプログラムはできているのですが、関数に分けて作成しようとするとうまく動かなくなってしまい、色々いじっていらより分からなくなってしまっめ、質問しました。
7
+ ファイルから数値のデータを読み取り、二分探索するプログラムを「ファイルからデータを読み込む」「データの整列」「二分探索」の3つの関数を使用してプログラムを作成したいのですが、うまくできず困っています。ファイルから読み取って二分探索するプログラムはできているのですが、関数に分けて作成しようとするとうまく動かなくなったため、質問しました。
8
8
 
9
9
 
10
10
  ### 該当のソースコード
11
- c言語で、関数に分けていないプログラムです。
11
+ c言語で、関数に分けてみたプログラムです。
12
-
13
12
  #include <stdio.h>
14
13
  #include <stdlib.h>
15
14
  #define MAXDATA 10000
16
15
 
17
- int main(void)
18
- {
19
- int x, a[MAXDATA];
16
+ int file(int a[MAXDATA], int n){
20
- int n, i, position;
17
+
21
- int j, k;
22
- int tmp;
23
- int min = 0;
24
- int max;
25
- int mid;
26
18
  char filename[20];
27
19
  FILE *fin;
28
20
 
@@ -37,7 +29,15 @@
37
29
  while (fscanf(fin, "%d", &a[n])==1) n++;
38
30
  fclose(fin);
39
31
 
32
+ return n;
33
+ }
34
+
35
+ int sort(int n, int a[MAXDATA], int max){
36
+
37
+ int i, j, k;
38
+ int tmp;
39
+
40
- for (i = 0; i < n-1; i++) {
40
+ for (i = 0; i < n-1; i++) {
41
41
  j = i;
42
42
  for (k = i+1; k < n; k++) {
43
43
  if (a[j] > a[k]) { j = k; }
@@ -48,28 +48,50 @@
48
48
  }
49
49
  for (i = 0; i < n; i++) {
50
50
  printf("%d\n", a[i]);
51
- max = i;
52
51
  }
52
+ max = i;
53
+ }
53
54
 
55
+ int binary(int position, int n, int max, int x, int a[MAXDATA]){
56
+
57
+ int min = 0;
58
+ int mid = (max+min)/2;
59
+ int i = 0;
60
+
61
+ while (position==-1 && i<n) {
62
+
63
+ mid = (max+min)/2;
64
+
65
+ if (a[mid]==x) position=mid+1;
66
+
67
+ else if (a[mid] < x){
68
+ min = mid+1;
69
+ i++;
70
+ }
71
+ else if (a[mid] > x){
72
+ max = mid-1;
73
+ i++;
74
+ }
75
+ }
76
+ return position;
77
+ }
78
+
79
+ int main(void){
80
+
81
+ int a[MAXDATA];
82
+ int n;
83
+ int max;
84
+ int position;
85
+ int x;
86
+
87
+ file(&a[MAXDATA], n);
88
+
89
+ sort(n, &a[MAXDATA], max);
90
+
54
- while (scanf("%d", &x)==1) {
91
+ while (scanf("%d", &x)==1) {
55
92
  position=-1;
56
- i=0;
57
93
 
58
- while (position==-1 && i<n) {
94
+ binary(position, n, max, x, &a[MAXDATA]);
59
-
60
- mid = (max+min)/2;
61
-
62
- if (a[mid]==x) position=mid+1;
63
-
64
- else if (a[mid] < x){
65
- min = mid+1;
66
- i++;
67
- }
68
- else if (a[mid] > x){
69
- max = mid-1;
70
- i++;
71
- }
72
- }
73
95
 
74
96
  printf(" x=%d ---> %d\n", x, position);
75
97
  }
@@ -77,8 +99,9 @@
77
99
  return 0;
78
100
  }
79
101
 
102
+
80
103
  ### 試したこと
81
- 関数に分けて引数を使用して作成して見たのですが、うまくかずいくり回していたらぐちゃぐちゃになってしまい、さらにうま動かなくなってしまったため、ゼロからすることにしました。
104
+ 関数に分けて引数を使用して作成したのですが、色々いじたらコンパイルでエラーが多たため、一度デフォルトもどしました。
82
105
 
83
106
  ### 補足情報(FW/ツールのバージョンなど)
84
107
 

1

変えました

2023/07/16 09:17

投稿

tkgoisii
tkgoisii

スコア2

test CHANGED
File without changes
test CHANGED
@@ -1,13 +1,11 @@
1
- ここに実現したいことを箇条書きで書いてください。
2
1
  ファイルから数値のデータを読み取る関数
3
2
  数値のデータを選択ソートして昇順にする関数
4
3
  二分探索する関数
5
4
  これらを使ったプログラム
6
5
 
7
6
  ### 前提
7
+ ファイルから数値のデータを読み取り、二分探索するプログラムを「ファイルからデータを読み込む」「データの整列」「二分探索」の3つの関数を使用してプログラムを作成したいのですが、うまくできず困っています。ファイルから読み取って二分探索するプログラムはできているのですが、関数に分けて作成しようとするとうまく動かなくなってしまい、色々いじっていたらより分からなくなってしまったため、質問しました。
8
8
 
9
- ここに質問の内容を詳しく書いてください。
10
- ファイルから数値のデータを読み取り、二分探索するプログラムを「ファイルからデータを読み込む」「データの整列」「二分探索」の3つの関数を使用してプログラムを作成したいのですが、うまくできず困っています。ファイルから読み取って二分探索するプログラムはできているのですが、関数に分けて作成しようとするとうまく動かなくなってしまい、色々いじっていたらより分からなくなってしまったため、質問しました。
11
9
 
12
10
  ### 該当のソースコード
13
11
  c言語で、関数に分けていないプログラムです。