いつもお世話になっております。http://oshiete.goo.ne.jp/qa/5836517.htmlで質問させているものです。
皆さんのアドバイスを頂き、2分探索法で郵便番号から住所を検索するプログラムが出来たのですが、
住所から郵便番号を2分探索法で出すプログラムも同じ方法でやろうとしましたが、比較対象が漢字の為、大きい・小さいの判断できずに上手くプログラムが出来ていません。
csvファイルは読みデータをひとつに繋げてあいうえお順にソートしました
プログラムを一部載せておきます(かなり省略済みですが…)
#define NAME ken_all_address.csv
int main(int argc,char *argv[])
{
struct tb line;
FILE *fp;
char buff[SIZE], string_buff[SIZE];
char *address,*ret;
int flag,linesu,linesu1,sum,count,up,up1,low,low1,center,center1;
int i,j;
long pos[FSIZE];
clock_t start,end;
start = clock();
//引数処理
if((fq=fopen(NAME1,"r")) == NULL){
printf("ファイル%sが開けません\n",NAME1);
return -1;
}
if((fp=fopen(NAME,"r")) == NULL){
printf("ファイル%sが開けません\n",NAME);
return -1;
}
flag = 0;
address = argv[1];
count=0;
sum=0;
if(atoi(address) == 0){
for(i=0; ;i++){
pos[i] = ftell(fq);
ret=fgets( buff, sizeof(buff), fp );
if(ret==NULL){
break;
}
}
linesu = i;
//printf("%d",linesu);
low=0;
up=linesu-1;
while(low <= up){
center=(up+low)/2;
fseek(fq,pos[center-1],SEEK_SET);
fgets( buff, sizeof(buff), fp );
strtok(buff,",\"");
strtok(NULL,",\"");
strcpy(line.now_num,strtok(NULL,",\""));
strtok(NULL,",\"");
strtok(NULL,",\"");
strtok(NULL,",\"");
strcpy(line.kanji1,strtok(NULL,",\""));
strcpy(line.kanji2,strtok(NULL,",\""));
strcpy(line.kanji3,strtok(NULL,",\""));
strcpy(string_buff,line.kanji1);
strcat(string_buff,line.kanji2);
strcat(string_buff,line.kanji3);
printf("%s %s %s\n",line.kanji1,line.kanji2,line.kanji3);
if(strcmp(string_buff,address)==0){
printf("〒%s \n",line.now_num);
flag=1;
}
if(strstr(string_buff,address) ==NULL){
low=center+1;
}
else{
up=center-1;
}
}
}
fclose(fp);
if(flag==0 && atoi(argv[1]) == 0){
printf("「%s」に該当する郵便番号はありませんでした\n",address);
}
if(flag==0 && atoi(argv[1]) != 0){
printf("「%s」に該当する住所はありませんでした\n",address);
}
end = clock();
printf("引数=%s\n",address);
printf("%.30f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
printf("fgetsの実行回数=%d回\n",sum);
printf("比較回数=%d回\n",count);
printf("\n");
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
プログラミングの授業の課題です
-
空白を含んだ文字列がうまく格...
-
C言語でのCSVファイルの読み出...
-
矢印キーを押下してコンソール...
-
C言語のプログラムで、途中で止...
-
printf による16進表示について
-
受信データから必要な部分のみ...
-
char型2つを結合し、short型に...
-
2進数の表示
-
リストの作成と出力(C言語)
-
プログラムC
-
Cでファイルの行数をカウントす...
-
【C言語】文字列による処理の分...
-
#defineが使用するメモリ領域に...
-
エラーについて質問です。
-
マイナスからプラスへ転じた時...
-
fgetsなどのときのstdinのバッ...
-
10個出力で改行したいのですが...
-
C言語での引数の省略方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
printf による16進表示について
-
#defineが使用するメモリ領域に...
-
空白を含んだ文字列がうまく格...
-
char型2つを結合し、short型に...
-
【C言語】全角文字の配列を、全...
-
プログラミングの授業の課題です
-
C言語のプログラムで、途中で止...
-
C++で指定文字列のカウント方法...
-
C言語で複数列のデータを1列の...
-
C言語でのCSVファイルの読み出...
-
構造体メンバの初期化
-
なぜ無限ループになるかが分か...
-
reallocでエラー
-
Ç言語でファイルサイズを変更す...
-
ファイル操作で全角空白を消す
-
矢印キーを押下してコンソール...
-
セグメンテーションエラーの原...
-
static付き宣言の初期化
-
ファイルから数字列を16進数の...
おすすめ情報