名前と年齢を入力したあとに、1人の名前を入力して2分探索で探索する
プログラムを書いたのですが、これにクイックソート法の整列手続き(辞書式順序)を加えたいのですが、どこに何を加えたら動くのか教えていただけないでしょうか。
まだプログラムを習い始めたばかりでプログラム自体も、字下げもろくにできてませんが、どうかよろしくお願いします。
#include<stdio.h>
#include<string.h>
#include<conio.h>
struct record{
char key[20]
int dat;
};
struct record A[100];
int n=0;
void insert(char x[],int y){
n++;
strcpy(A[n].key,x);
A[n].dat=y;
}
int binarysearch(char target[],int *pos){
int top,bottom,found,pt;
top=n;
bottom=1;
found=0;
while(top>=bottom&&!found){
pt=(top+bottom)/2;
if(strcmp(A[pt].key,target)>0)
top=pt-1;
else if (strcmp(A[pt].key,target)<0)
bottom=pt+1;
else
found=1;
}
*pos=pt;
return found;
}
int main(void){
char name[100],sname[100];
int old,ptr;
scanf("%s",name);
while(strcmp(name,"0")){
scanf("%d",&old);
insert(name,old);
scanf("%s",name);
}
printf("指定する名前を入力してください\n");
scanf("%s",name);
if(binarysearch(sname,&ptr)){
printf("%s %d\n",A[ptr].key,A[ptr].dat);
}
else
printf("いません。\n");
getch();
return0;
}
No.5ベストアンサー
- 回答日時:
qsort関数を使うのであればこんな感じ?(全角空白文字を半角にしてください)
qsort用の比較関数を追加して、Aの添え字をn=0から使うように変更しています。。
#include <stdio.h>
#include <string.h>
#include <stdlib.h> /* qsort */
struct record{
char key[20];
int dat;
};
struct record A[100];
int n=0;
void insert(char x[],int y) {
strcpy(A[n].key,x);
A[n].dat=y;
n++; /* n=0から使うので登録後にインクリメント */
}
int binarysearch(char target[],int *pos) {
int top,bottom,found,pt;
top=n-1; /* 登録の最大はA[n-1] */
bottom=0; /* 登録の最小はA[0] */
found=0; /* 見つかったら1 */
while (top>=bottom&&!found) {
pt=(top+bottom)/2;
if (strcmp(A[pt].key,target)>0) {
top=pt-1;
} else if (strcmp(A[pt].key,target)<0) {
bottom=pt+1;
} else {
found=1;
}
}
*pos=pt;
return found;
}
/* qsort用比較関数 */
int reccmp(const void *a, const void *b) {
struct record *aa = (struct record *)a; /* 型をあわせる */
struct record *bb = (struct record *)b; /* 型をあわせる */
return strcmp(aa->key, bb->key);
}
int main(void){
char name[100],sname[100];
int old,ptr;
int i;
/* データ入力 */
scanf("%s",name);
while(strcmp(name,"0")) {
scanf("%d",&old);
insert(name,old);
scanf("%s",name);
}
/* ソート */
printf("入力データ\n"); for (i=0; i<n; i++) printf("%d %s %d\n",i,A[i].key,A[i].dat);
qsort(A, n, sizeof(struct record), reccmp);
printf("ソート\n"); for (i=0; i<n; i++) printf("%d %s %d\n",i,A[i].key,A[i].dat);
/* 検索入力 */
printf("指定する名前を入力してください\n");
scanf("%s",sname);
/* 検索結果(1個だけ)表示 */
if (binarysearch(sname,&ptr)) {
printf("%s %d\n",A[ptr].key,A[ptr].dat);
} else {
printf("いません。\n");
}
return 0;
}
No.4
- 回答日時:
「C言語」「アルゴリズム」「クイックソート」などでgoogleで検索してみて下さい。
http://oku.edu.mie-u.ac.jp/~okumura/algo/archive/
などにサンプルのソースコードなどもありました。
No.3
- 回答日時:
C言語のソートアルゴリズムは検索すれば山ほどヒットすると思いますが、ヒントになるような情報は何も見つからなかったのでしょうか?
> まだプログラムを習い始めたばかりで
3ヶ月も前にこれくらいのプログラムが書けるなら、クイックソートぐらい楽勝だと思いますが...
参考URL:http://okwave.jp/qa3981332.html
No.2
- 回答日時:
>どこに何を加えたら動くのか
データの入力が終わった後,事前にソートが必要な処理の前ですよね?
クィックソートを加えたいと言っているのに「何を加えたら」という表現が不可解ですね.
クィックソート関数を挿入するのではないのですか?
>クイックソート法
たぶん,何かの課題だと思います.
それだと自力でクィックソートを書かないと駄目ですので
教科書等を調べて自分で書いてみましょう.
その上でどうすればよいのかわからないという質問をしてください.
この質問は,ここでの禁止事項である「丸投げ」に近い形です.
No.1
- 回答日時:
>プログラムを書いたのですが、これにクイックソート法の整列手続き(辞書式順序)を加えたいのですが、
>どこに何を加えたら動くのか教えていただけないでしょうか。
このプログラムは自分でコーディングしたのですか?
自分で作成したのなら、何処に何を追加しなければならないか分かると思うのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
if と配列の組み合わせ
-
複数桁10進数の*桁目だけを抽出...
-
シグマ公式・・・C言語
-
「指定されたキャストは有効で...
-
c言語の配列を使ってサイコロを...
-
Win32APIで作るコンボボックス...
-
std::set<int> で、ある値が何...
-
#define _CRT_SECURE_NO_WARNIN...
-
単語の出現回数を数え、出現回...
-
実数の整数部,小数部の取得
-
C言語 エラーの原因がわからな...
-
HANDLEて何ですか?
-
C2601 ローカル関数の定義について
-
double型の値を、一桁ずつint型...
-
構造体の勉強中です 合計点の高...
-
関数について
-
C言語初心者です、、、お助けく...
-
ポインタ配列
-
比較回数と交換回数表示について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
AtCoderABC135の問題Cについて
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
ラップ関数とはどんなものですか?
-
if と配列の組み合わせ
-
return 1L
-
read関数をノンブロッキングで...
-
(int *)の意味
-
std::set<int> で、ある値が何...
-
Win32APIで作るコンボボックス...
-
C++でvectorにテキストファイル...
-
「{ } で囲むだけ」は正しい?
-
足して100になるような乱数のア...
-
Arduinoのプログラムにエラーが...
-
課題でつまってます・・・
おすすめ情報