住所録のプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ほのか

住所録のプログラム

#1

投稿記事 by ほのか » 16年前

いつもお世話になっております。
ソースは添付ファイルをご覧いただきたいのですが、今回多々修正しなくてはならない部分があり、わからないところがいくつかあるので質問させていただきます;


1.最初の処理区分入力や削除・照会・変更でのNo入力で、数字以外の文字列を入力すると無限ループしてしまう。

2.変更関数内で、goto文を使用しないで変更する項目番号入力のところに戻るには…?

3.終了関数について、メイン関数に戻ってから処理を終了するようにするには…?


他にも細かい部分でわからないところはありますが、なんとか自分でやってみようと思うのでどうしてもわからない部分だけ質問させていただきました…;

以前こちらでwhile(1)の使用は良くないと言われたのですが、課題では終了関数を作成しなくてはならないですし、担当の方には使用しても良いと言われたので、そちらは変えさせていただきました。

non

Re:住所録のプログラム

#2

投稿記事 by non » 16年前

>3.終了関数について、メイン関数に戻ってから処理を終了するようにするには…?
>以前こちらでwhile(1)の使用は良くないと言われたのですが、

正確には、終了関数でexitして終わるのがよくないと言ったのです。
したがって、この3の処理をするように言ったのです。
すると、while(1)にしなくていいでしょってね。

non

Re:住所録のプログラム

#3

投稿記事 by non » 16年前

1の原因は
scanf("%d",&kubun);にあります。
文字が入力されることを想定していないからです。
ですから、文字で入力するように変更します。

方法1
scanf("%s" に変更する。

方法2
getcharなどを使う

私なら方法2で しかもgetcheを使うでしょうね。
fflushも使わなくてはいけなくなるかも。

ほのか

Re:住所録のプログラム

#4

投稿記事 by ほのか » 16年前

回答ありがとうございます。

以前の「End_flg」についてなのですが、初めにint型で宣言し、0で初期化しても良いのでしょうか?
また、処理区分入力のswitch文のcase9の部分で、終了関数の後に「End_flg = 1;」という記述をして良いのでしょうか??
「End_flg = 1;」の意味がよくわからないのですが…;
上記のようにした場合終了関数内の「exit」部分はなくしても良いのでしょうか??

non

Re:住所録のプログラム

#5

投稿記事 by non » 16年前

> 以前の「End_flg」についてなのですが、初めにint型で宣言し、0で初期化しても良いのでしょうか?

いいですよ。っていうより、そうしてください。

> また、処理区分入力のswitch文のcase9の部分で、終了関数の後に「End_flg = 1;」という記述をして良いのでしょうか??

前のプログラムはそうしてましたね。

> 「End_flg = 1;」の意味がよくわからないのですが…;

フラグって言葉わかります?状態を示すための1ビットのデータです。(1ビットでなくてもいいのですが)
今回は、0ならまだ続ける。1なら終了するという状態を示すために使います。


> 上記のようにした場合終了関数内の「exit」部分はなくしても良いのでしょうか??

もちろん、なくしましょう。

ほのか

Re:住所録のプログラム

#6

投稿記事 by ほのか » 16年前

回答ありがとうございます。

上記の要領でソースを修正したのですが、最初にファイル名を入力した後その次の処理が行われずプログラムが終了されてしまいます;


新しくファイルを添付させていただきました。

pooka

Re:住所録のプログラム

#7

投稿記事 by pooka » 16年前

>while(end_flg)
今の状態だとend_flgは0なのでwhile文は実行されません。
以前のようにwhile(!end_flg)とする、while(end_flg == 0)とする、
あるいは初めに1で初期化してwhile(end_flg)とし、終了するときにend_flgを0にするなど変更してみてください。

non

Re:住所録のプログラム

#8

投稿記事 by non » 16年前

while(end_flg){
の意味はわかりますか?
これはwhile(0)ってことですよ。
今まではwhile(1)だったでしょ。

non

Re:住所録のプログラム

#9

投稿記事 by non » 16年前

かぶりましたか。

char kubun;
これで、
scanf("%s",kubun);
これは、まずいですね。

Re:住所録のプログラム

#10

投稿記事 by » 16年前

scanf("%s",kubun);
のkubunはいくつまでの文字列を入れるつもりなのでしょうか?
数字だけを扱いたいのか、文字も扱いたいのかで使うものが違うと思います。

見ていて思ったのですが、
case では1~9までしかないのに、文字列を扱う必要があるのでしょうか?
kubunを入力した際に、1~9の範囲でなければ、再入力を求めるようにしてはどうでしょうか?
※int kubun として

ほのか

Re:住所録のプログラム

#11

投稿記事 by ほのか » 16年前

回答ありがとうございます。
whileの部分は解決いたしました。ありがとうございました^^

scanfの部分なのですが、%sではなく%cに変えてみたのですが、それでも大丈夫でしょうか?
それから、処理区分の部分は%cで問題なかったのですが、削除関数等では入力文字を文字列にしてしまうとそれ以降の処理が型が違うため上手くいきません…;

pooka

Re:住所録のプログラム

#12

投稿記事 by pooka » 16年前

>scanf("%s",kubun);
scanf("%c",&kubun);ですかね。(確認のため)

>削除関数等では入力文字を文字列にしてしまうと・・・
atoi関数なんかを使えばできそうですね。

non

Re:住所録のプログラム

#13

投稿記事 by non » 16年前

%cにするなら、getcharにしようよ。

ほのか

Re:住所録のプログラム

#14

投稿記事 by ほのか » 16年前

回答ありがとうございます。

scanf("%c",&kubun);です。
atoi関数を使用してみたのですが、エラーが出てしまいました;

pooka

Re:住所録のプログラム

#15

投稿記事 by pooka » 16年前

>atoi関数を使用してみたのですが、エラーが出てしまいました;
どのようなエラーが出ましたか?
また、どんなかんじで書きましたか?

ほのか

Re:住所録のプログラム

#16

投稿記事 by ほのか » 16年前

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が不適切だと表示され、削除処理ができませんでした;

pooka

Re:住所録のプログラム

#17

投稿記事 by pooka » 16年前

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:住所録のプログラム

#18

投稿記事 by ほのか » 16年前

回答ありがとうございます!
無事修正できました^^他の関数の部分も同じように修正したいと思います^^

2つ目の質問については自己解決しました。

ほのか

Re:住所録のプログラム

#19

投稿記事 by ほのか » 16年前

1つ目の質問についてほとんど修正できたのですが、1箇所だけ修正できなかったところがあります;
添付ファイルにてソースを貼らせていただきましたが、変更関数内の項目番号を入力する部分で文字を入力すると、何を入力しても「番号が不適切です」と表示されてしまいます;
他の文字入力のところと同じような処理ではいけないのでしょうか??

ほのか

Re:住所録のプログラム

#20

投稿記事 by ほのか » 16年前

すみません;
自己解決いたしました。

閉鎖

“C言語何でも質問掲示板” へ戻る