ページ 1 / 1
住所録のプログラム
Posted: 2009年5月28日(木) 09:43
by ほのか
いつもお世話になっております。
ソースは添付ファイルをご覧いただきたいのですが、今回多々修正しなくてはならない部分があり、わからないところがいくつかあるので質問させていただきます;
1.最初の処理区分入力や削除・照会・変更でのNo入力で、数字以外の文字列を入力すると無限ループしてしまう。
2.変更関数内で、goto文を使用しないで変更する項目番号入力のところに戻るには…?
3.終了関数について、メイン関数に戻ってから処理を終了するようにするには…?
他にも細かい部分でわからないところはありますが、なんとか自分でやってみようと思うのでどうしてもわからない部分だけ質問させていただきました…;
以前こちらでwhile(1)の使用は良くないと言われたのですが、課題では終了関数を作成しなくてはならないですし、担当の方には使用しても良いと言われたので、そちらは変えさせていただきました。
Re:住所録のプログラム
Posted: 2009年5月28日(木) 10:21
by non
>3.終了関数について、メイン関数に戻ってから処理を終了するようにするには…?
>以前こちらでwhile(1)の使用は良くないと言われたのですが、
正確には、終了関数でexitして終わるのがよくないと言ったのです。
したがって、この3の処理をするように言ったのです。
すると、while(1)にしなくていいでしょってね。
Re:住所録のプログラム
Posted: 2009年5月28日(木) 10:41
by non
1の原因は
scanf("%d",&kubun);にあります。
文字が入力されることを想定していないからです。
ですから、文字で入力するように変更します。
方法1
scanf("%s" に変更する。
方法2
getcharなどを使う
私なら方法2で しかもgetcheを使うでしょうね。
fflushも使わなくてはいけなくなるかも。
Re:住所録のプログラム
Posted: 2009年5月28日(木) 10:59
by ほのか
回答ありがとうございます。
以前の「End_flg」についてなのですが、初めにint型で宣言し、0で初期化しても良いのでしょうか?
また、処理区分入力のswitch文のcase9の部分で、終了関数の後に「End_flg = 1;」という記述をして良いのでしょうか??
「End_flg = 1;」の意味がよくわからないのですが…;
上記のようにした場合終了関数内の「exit」部分はなくしても良いのでしょうか??
Re:住所録のプログラム
Posted: 2009年5月28日(木) 11:08
by non
> 以前の「End_flg」についてなのですが、初めにint型で宣言し、0で初期化しても良いのでしょうか?
いいですよ。っていうより、そうしてください。
> また、処理区分入力のswitch文のcase9の部分で、終了関数の後に「End_flg = 1;」という記述をして良いのでしょうか??
前のプログラムはそうしてましたね。
> 「End_flg = 1;」の意味がよくわからないのですが…;
フラグって言葉わかります?状態を示すための1ビットのデータです。(1ビットでなくてもいいのですが)
今回は、0ならまだ続ける。1なら終了するという状態を示すために使います。
> 上記のようにした場合終了関数内の「exit」部分はなくしても良いのでしょうか??
もちろん、なくしましょう。
Re:住所録のプログラム
Posted: 2009年5月28日(木) 11:19
by ほのか
回答ありがとうございます。
上記の要領でソースを修正したのですが、最初にファイル名を入力した後その次の処理が行われずプログラムが終了されてしまいます;
新しくファイルを添付させていただきました。
Re:住所録のプログラム
Posted: 2009年5月28日(木) 11:37
by pooka
>while(end_flg)
今の状態だとend_flgは0なのでwhile文は実行されません。
以前のようにwhile(!end_flg)とする、while(end_flg == 0)とする、
あるいは初めに1で初期化してwhile(end_flg)とし、終了するときにend_flgを0にするなど変更してみてください。
Re:住所録のプログラム
Posted: 2009年5月28日(木) 11:39
by non
while(end_flg){
の意味はわかりますか?
これはwhile(0)ってことですよ。
今まではwhile(1)だったでしょ。
Re:住所録のプログラム
Posted: 2009年5月28日(木) 11:41
by non
かぶりましたか。
char kubun;
これで、
scanf("%s",kubun);
これは、まずいですね。
Re:住所録のプログラム
Posted: 2009年5月28日(木) 11:45
by 雷
scanf("%s",kubun);
のkubunはいくつまでの文字列を入れるつもりなのでしょうか?
数字だけを扱いたいのか、文字も扱いたいのかで使うものが違うと思います。
見ていて思ったのですが、
case では1~9までしかないのに、文字列を扱う必要があるのでしょうか?
kubunを入力した際に、1~9の範囲でなければ、再入力を求めるようにしてはどうでしょうか?
※int kubun として
Re:住所録のプログラム
Posted: 2009年5月28日(木) 11:53
by ほのか
回答ありがとうございます。
whileの部分は解決いたしました。ありがとうございました^^
scanfの部分なのですが、%sではなく%cに変えてみたのですが、それでも大丈夫でしょうか?
それから、処理区分の部分は%cで問題なかったのですが、削除関数等では入力文字を文字列にしてしまうとそれ以降の処理が型が違うため上手くいきません…;
Re:住所録のプログラム
Posted: 2009年5月28日(木) 12:13
by pooka
>scanf("%s",kubun);
scanf("%c",&kubun);ですかね。(確認のため)
>削除関数等では入力文字を文字列にしてしまうと・・・
atoi関数なんかを使えばできそうですね。
Re:住所録のプログラム
Posted: 2009年5月28日(木) 12:16
by non
%cにするなら、getcharにしようよ。
Re:住所録のプログラム
Posted: 2009年5月28日(木) 13:15
by ほのか
回答ありがとうございます。
scanf("%c",&kubun);です。
atoi関数を使用してみたのですが、エラーが出てしまいました;
Re:住所録のプログラム
Posted: 2009年5月28日(木) 17:21
by pooka
>atoi関数を使用してみたのですが、エラーが出てしまいました;
どのようなエラーが出ましたか?
また、どんなかんじで書きましたか?
Re:住所録のプログラム
Posted: 2009年5月28日(木) 22:21
by ほのか
int no,i;
char *num;
char ans;
char dansei[2]= DANSEI;
char jyosei[2]= JYOSEI;
Jusyoroku *temp;
do{
puts("");
printf("削除するNoを入力してください>>>");
/* 削除するNoの入力 */
scanf(" %c",&num);
no = atoi(num);
if(no>0 && no<=cnt){
temp = &data[no-1];
・
・
・
上記のように書きましたが、入力したNoが不適切だと表示され、削除処理ができませんでした;
Re:住所録のプログラム
Posted: 2009年5月28日(木) 23:55
by pooka
char num;
//省略
no = atoi(&num);
使い方としてはこうですかね。
ただこのままだと削除するNoの入力のときに、例えばabcと入力するとbcがバッファ上に残るので(改行文字も?)
期待した通りの動作をしないと思います。
/* 削除するNoの入力 */
scanf("%c",&num);
fflush(stdin);
no = atoi(&num);
これで期待した動作になると思います。
getcharを使うならscanfの代わりに
num = getchar();
にすればいいと思います。
ちなみに雷さんの書いてある方法でやってみてもいいと思います。
例えば
while(1){
if(scanf("%d",&kubun) != 1){
scanf("%*s");
printf("入力エラー\n");
continue;
}
break;
}
これはmain関数の処理区分の入力の所です。(kubunはint型なのでcase 1:のように変えないといけませんが)
これでいいのかな?fflushとか使ったことないんで違ってたらごめんなさいm(_ _)m
Re:住所録のプログラム
Posted: 2009年5月29日(金) 09:11
by ほのか
回答ありがとうございます!
無事修正できました^^他の関数の部分も同じように修正したいと思います^^
2つ目の質問については自己解決しました。
Re:住所録のプログラム
Posted: 2009年5月29日(金) 10:04
by ほのか
1つ目の質問についてほとんど修正できたのですが、1箇所だけ修正できなかったところがあります;
添付ファイルにてソースを貼らせていただきましたが、変更関数内の項目番号を入力する部分で文字を入力すると、何を入力しても「番号が不適切です」と表示されてしまいます;
他の文字入力のところと同じような処理ではいけないのでしょうか??
Re:住所録のプログラム
Posted: 2009年5月29日(金) 10:07
by ほのか
すみません;
自己解決いたしました。