住所録プログラム…

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

住所録プログラム…

#1

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

いつもお世話になっております。
C言語の課題で住所録プログラムを作成中なのですが、課題担当の方に
「ソースのiCntはアドレスにして下さい。
関数の戻り値は正常終了か異常終了を示す指標。
異常応答した際は、プログラムを終了してください。」

と言われてしまい、完成したと思っていたのですが修正しなくてはなりません。
「*」等を付けるだけではいけませんよね?;
修正方法がよくわからなくて困っています;

ソースは添付ファイルをご覧いただけると幸いです。

Mist

Re:住所録プログラム…

#2

投稿記事 by Mist » 16年前

こういうふうに変えればいいんじゃないでしょうか。
/* 関数名: henkou
   引数  : jusyoroku  *data   登録データ先頭アドレス
           int        *iCnt   登録者数
   戻り値: bool               実行結果(true=正常, false=異常)
   説明  : 登録されたデータの変更を行う関数 */
bool henkou(Jusyoroku *data,int *iCnt);
で、関数の実行もとはfalseが返ってきた場合はプログラムを安全に終了するようにする。


あと、他の掲示板で再質問されるなら規約は守ってください。

> マルチポストはOKとしています。複数の掲示板で同じ質問をするときは相互リンクし、
> どこの掲示板で同じ質問をしているか明確にして下さい。

non

Re:住所録プログラム…

#3

投稿記事 by non » 16年前

ファイルのreadとwriteの異常終了はわかりますが、他はどうするのか。
仕様をはっきり決めるべきではありませんか?

ほのか

Re:住所録プログラム…

#4

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

回答ありがとうございます。
申し訳ございません;Yahoo知恵袋の方でも質問させていただいておりました;

全ての関数においてiCntをアドレスにするということでしょうか?;
最初の処理区分のところでそれぞれ正常か異常かを判定すれば良いのでしょうか??;

Mist

Re:住所録プログラム…

#5

投稿記事 by Mist » 16年前

> 全ての関数においてiCntをアドレスにするということでしょうか?;

関数の戻り値を関数の実行結果として使用するのであれば、関数内でiCntの値を変更するような関数(現状でいえばiCntが戻り値の関数かな?)はアドレスを渡すしかないでしょう。
関数内でiCntを参照しかしない関数は値渡しでも問題ありません。(値渡しにすべき)

> 最初の処理区分のところでそれぞれ正常か異常かを判定すれば良いのでしょうか??;

nonさんも指摘されていますが何をもって異常とするかを、ほのかさんが仕様として決定しないとどこで処理すればよいかは答えようがありません。
あと、「最初の処理区分」ってなんですか?

ほのか

Re:住所録プログラム…

#6

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

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

問題なく新規登録・削除・変更等が行えた場合は正常、不具合が起きた場合は異常とするようにしたいのですが…それでも大丈夫でしょうか?;

最初の処理区分というのは、「処理区分を入力してください」のswitch判定の部分です。

Mist

Re:住所録プログラム…

#7

投稿記事 by Mist » 16年前

> 問題なく新規登録・削除・変更等が行えた場合は正常、不具合が起きた場合は異常とするようにしたいのですが…それでも大丈夫でしょうか?;

何が大丈夫かを聞きたいのでしょうか?
仕様として正しいのかどうかを聞きたいのであれば、ここではなく担当官に聞くべきでしょう。
プログラムとしてできるかどうかということであれば、まず組んでみて問題があるなら再度質問してください、としか言えないです。

non

Re:住所録プログラム…

#8

投稿記事 by non » 16年前

例えば、新規登録のint shinki(Jusyoroku *data,int iCnt)の関数ですが、
どうなった場合があなたがいうところの不具合が起きたといえるのでしょうか?

関数の最初に
if(data!=NULL){
と、書かれていますから、data==NULLのときが不具合ということなのでしょうか?
しかし、dataがそもそもNULLなんてことがあるのでしょうか。担当教官はよく指摘しませんね。

では、最大文字数を超えた場合再入力を促すようになっていますが、これを再入力しないように
して不具合が起きたと判断することもできるでしょう。

また、printf("データを登録します。\nよろしいですか?(Y/N)>>>");で登録しなかった時を
不具合が起きたと判断することもできます。

このように仕様によって、何が不具合か変わってきます。仕様は課題を出した人か、本人が
決めなければ、私たち外野が口を出すことではありません。

ほのか

Re:住所録プログラム…

#9

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

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

それぞれの関数が正常に動作してiCntの値が変動した場合は正常、登録や削除をしたのにiCntの値が変わらなかった場合は異常という形にしたいです;

ほのか

Re:住所録プログラム…

#10

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

すみません;
引数で渡された値が、現在保持しているメンバ変数の値と同じであればTRUE、違った場合FALSEを返すという感じの方が良いでしょうか…
仕様は特に決められていないため自分で考えているのですが、どのようにすれば1番良いものなのかよくわからないので…;

Mist

Re:住所録プログラム…

#11

投稿記事 by Mist » 16年前

仕様の解釈なんて人それですから、ここで誰かの回答でこれが一番といっても担当官がどう評価するかなんてわかりません。
研修なんだから無理に最高のものを作ろうとせず自分の思いつく範囲、できる範囲の仕様で作ったほうがいいと思いますよ。
第一、ここで言われたとおりの仕様で作ってもあなたの勉強にはならないでしょう。

ほのか

Re:住所録プログラム…

#12

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

回答ありがとうございます。
引数で渡された値が、現在保持しているメンバ変数の値と同じであればTRUE、違った場合FALSEを返すという形にしたいと思います…

iCntをアドレスに変えてみたのですが、ただ「*」や「&」をつけるだけではだめなのでしょうか?;
また、それぞれの関数だけでなく、main関数で宣言しているiCntもアドレスにするべきなのでしょうか?

Mist

Re:住所録プログラム…

#13

投稿記事 by Mist » 16年前

> iCntをアドレスに変えてみたのですが、ただ「*」や「&」をつけるだけではだめなのでしょうか?;

どこをどう変えたのかが分からないと答えようがありません。
現在のソースを見せてください。

> それぞれの関数だけでなく、main関数で宣言しているiCntもアドレスにするべきなのでしょうか?

意味不明です。
ポインタの概念が理解できていないのか、もしくは何か思いっきり勘違いしているように思います。

ほのか

Re:住所録プログラム…

#14

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

現在のソースを添付しました。
このソースだと新規登録や削除等がうまくいきません…;

non

Re:住所録プログラム…

#15

投稿記事 by non » 16年前

>iCnt = shinki(&data[iCnt],&iCnt);

戻り値がiCntに入ったらまずいでしょう。
関数内では、異常終了の処理をしていませんし、iCnt++;なんてのが、まだ残ってます。
関数から戻ってからの処理もありません。

Mist

Re:住所録プログラム…

#16

投稿記事 by Mist » 16年前

> ただ「*」や「&」をつけるだけではだめなのでしょうか?

これの言いたいことが何となくわかりました。
横着しようとしてもダメです。
そんなに簡単には修正できません。

各関数の引数、戻り値はNo:34482での私の回答を元に修正してください。
アドレスとわかるように変数名はpiCntとかにしたほうがいいかもしれませんが。
あと、iCntをアドレスで渡すのであれば関数の中も修正する必要があります。

ほのか

Re:住所録プログラム…

#17

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

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

Mist様の回答を元に修正を行っているのですが、「bool shinki(Jusyoroku *data,int *piCnt);」と宣言すると下記エラーが出ました;

c:42: error: 構文解析エラー が "shinki" の前にあります
c:42: 警告: データ定義が型や記憶クラスを持っていません

ほのか

Re:住所録プログラム…

#18

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

申し訳ございません;
includeしていなかっただけでした;

Mist

Re:住所録プログラム…

#19

投稿記事 by Mist » 16年前

質問するなら規約ぐらい守りましょうよ。

http://detail.chiebukuro.yahoo.co.jp/qa ... 1026890545

ほのか

Re:住所録プログラム…

#20

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

申し訳ございません;
No:34484の記事でURLを載せていたのですが…コメント部分に記載していませんでした;

Mist

Re:住所録プログラム…

#21

投稿記事 by Mist » 16年前

ああ、そういうことでしたか。
ただ、URLのところは発言者のHPアドレスが入っている事がほとんどなので、何か書いておいてもらわないとわかりにくいですね。

ほのか

Re:住所録プログラム…

#22

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

今後はコメント欄に掲載させていただきます。申し訳ございませんでした;

ソースを全体的に修正したのですが、ファイル読み込み関数もカウンタをアドレスにした方が良いのでしょうか??;
ファイル読み込み関数はiCntでなく人数が戻り値なのですが…

Mist

Re:住所録プログラム…

#23

投稿記事 by Mist » 16年前

> ソースを全体的に修正したのですが、ファイル読み込み関数もカウンタをアドレスにした方が良いのでしょうか??;

担当が「関数の戻り値は正常終了か異常終了を示す指標。」と言ってるのにそれを無視するのはまずいんじゃないですか?

あと、「異常応答した際は、プログラムを終了してください。」も全然できてないし。
shinki関数とかsakujo関数の戻り値はboolなのに「return *piCnt;」とか書いてるし。
こことか知恵袋で指摘されたことだけを鵜呑みで直してる感じがするんですが・・・。
修正する以前にソースコード全体を理解できていますか?

ほのか

Re:住所録プログラム…

#24

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

すみません…;
とりあえず修正しました。

Mist

Re:住所録プログラム…

#25

投稿記事 by Mist » 16年前

shinki(&data[iCnt],&iCnt);
					if(shinki==false){
						exit(1);
					}
ここは完全に間違っています。
また、shinki関数とかsakujo関数はfalseを返す所がないしdata=NULLのときは何も返していません。
どちらも、コンパイル時にエラーか警告になっていると思いますが。

今までの流れを見て思ったのは、ほのかさんは基礎的な部分でのC言語でのプログラミングが理解できておられないようですので担当官に正直に言ってもうすこし簡単なことからやり直したほうがいいと思います。

ほのか

Re:住所録プログラム…

#26

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

コンパイルエラー等は出ていないのですが、では戻り値がfalseだった場合はどうやって判定すれば良いのでしょうか?;

先週までの課題ですし、来週からは違う言語をやることになっているので、やり直すことは難しいです…;

Mist

Re:住所録プログラム…

#27

投稿記事 by Mist » 16年前

> では戻り値がfalseだった場合はどうやって判定すれば良いのでしょうか?;

私は会社で研修担当していたことがあるのでよくわかるのですが、こういう質問をすること自体基本が理解できていない証拠なんです。
関数の戻り値をどうやってチェックするかなんて基礎中の基礎です。

担当官がどこまでの完成度を求めているかはわかりませんが、私が指摘していないだけで間違いはほかにもたくさんあります。
現状では誰かに完璧な答えをもらわないと、ほのかさんの今の実力だと担当官からの指摘は解決できないと思います。
だから、「自分にはできません」と正直に報告して担当から答えを教えてもらって、それを理解するほうがよっぽどほのかさんのためになると思いますよ。


私からの回答はこれで最後にします。

閉鎖

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