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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

2232閲覧

c言語の関数の戻り値

naoking

総合スコア4

C

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

1クリップ

投稿2020/11/18 15:09

前提・実現したいこと

C言語において、データを読み込んで番号を探すプログラムの作成をしています。以下が与えられている指定です。
✓ 探索アルゴリズムとして、「二分探索法」と「逐次探索法」を実装
✓ それぞれの探索アルゴリズムの計算時間を比較
✓ 検索キー、キーボードから入力すること
✓ 探索結果、見つからない場合は、その旨を表示

「二分探索法」と「逐次探索法」において、検索キーが見つからなかった場合に、本来であれば"not found."と表示させたいのですが、"found. 0"と表示されます。
BinarySearch関数とFullSearch関数内で最後まで残った場合に、戻り値を0にしているからなのですが、これをどう変えれば目的の表示が得られるかわかりません。一致するものがない(検索キーが見つからない)場合は戻り値をどう設定すればよいのでしょうか?

以下に該当のコードを示しています。念の為、コード全体を示していますが、今回の質問に影響ないと思われる箇所はコメントアウトにしていま
す。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <sys/time.h> 4 5/*int* ReadDataFile(const char *FileName, int *N){ 6 int i; 7 FILE *file; 8 int *Data; 9 10 file = fopen(FileName, "r"); 11 if (file == NULL) { //ファイルを正しく開けなかった場合 12 fprintf(stderr, "cannnot open file: %s\n", FileName); 13 exit(1); //強制終了 14 } 15 16 for (i = 0 ; ; i++){ 17 double dummy; 18 if (fscanf(file, "%lf", &dummy) != 1){ 19 break; //読み込みに失敗したら中断 20 } 21 } 22 23 *N = i; 24 printf("data size is %d\n", i); 25 Data = (int*)malloc(sizeof(int) * i); //メモリの動的確保 26 if (Data == NULL) { //メモリの動的確保失敗の場合 27 fprintf(stderr, "cannnot allocate memory\n"); 28 exit(1); //強制終了 29 } 30 31 rewind(file); //ファイルを最初から読み直す準備 32 for (i = 0; i < *N; i++){ 33 fscanf(file, "%d", &Data[i]); 34 } 35 fclose(file); //ファイルを閉じる 36 return Data; 37} 38 39int compare(const void *a, const void *b){ 40 return *(int*)a-*(int*)b; 41} 42 43double gettimeofday_sec(){ 44 struct timeval tv; 45 gettimeofday(&tv, NULL); 46 47 return tv.tv_sec + tv.tv_usec * 1e-6; 48}*/ 49 50int BinarySearch(int *Data, int N, int key){ 51 int l, r, m; //left,right,middle 52 53 l = 0; 54 r = N-1; 55 56 while(l <= r) { 57 m = (l + r) / 2; /* calc of middle key */ 58 if (Data[m] == key) { 59 break; 60 } else if (Data[m] < key) { 61 l = m + 1; /* adjustment of left key */ 62 } else { 63 r = m - 1; /* adjustment of right key */ 64 } 65 } 66 67 if (Data[l] == key){ //中断された場合 68 return l; 69 } else { //最後まで残った場合 70 return 0; 71 } 72} 73 74int FullSearch(int *Data, int N, int key){ 75 int i; 76 77 for(i = 0; i < N; i++){ 78 if (Data[i] == key) { 79 break; //一致したら中断 80 } 81 } 82 83 if (i < N){ //for文が中断された場合 84 return i; 85 } else { //for文最後まで残った場合 86 return 0; 87 } 88} 89 90 91int main(void){ 92 int N, i1, i2; 93 int *Data; 94 int key; 95 double t1, t2; 96 97 //ファイルからのデータの読み込み 98 Data = ReadDataFile("student.txt", &N); 99 //これ以降、Dataは要素数Nの配列として捉える 100 101 //検索キーを入力 102 printf("key: "); 103 scanf("%d", &key); 104 105 //ソート実行 106 qsort(Data,N,sizeof(Data[0]),compare); 107 printf("Quick sort is done.\n"); 108 109 //二分探索法の実行 110 t1 = gettimeofday_sec(); 111 i1 = BinarySearch(Data, N, key); 112 t2 = gettimeofday_sec(); 113 114 //探索結果の出力 115 if(i1 != -1){ //見つかった場合 116 printf("(Binary) found. %d\n", i1); 117 }else{ //見つからなかった場合 118 printf("(Binary) not found."); 119 } 120 121 printf("BinarySearch: %.6f (sec)\n", t2-t1); 122 123 //逐次探索法の実行 124 t1 = gettimeofday_sec(); 125 i2 = FullSearch(Data, N, key); 126 t2 = gettimeofday_sec(); 127 128 //探索結果の出力 129 if(i2 != -1){ //見つかった場合 130 printf("(Full) found. %d\n", i2); 131 }else{ //見つからなかった場合 132 printf("(Full) not found."); 133 } 134 135 printf("FullSearch: %.6f (sec)\n", t2-t1); 136 137 //使い終わったメモリの開放が必要 138 free(Data); 139 return 0; 140 141} 142

試したこと

戻り値がint型ではありますが、ダメ元でreturn NULL;にしてみましたが、やはりエラーになりました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

if(i1 != -1){ //見つかった場合

と、見つからなかった場合に-1を返すと決めたのに、それを忘れてしまい0を返したからでは?

投稿2020/11/18 15:26

otn

総合スコア84538

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

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

naoking

2020/11/19 01:20

そうでした!ご指摘ありがとうございます! 直したところ、目的の表示が得られました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問