ページ 1 / 1
住所録プログラム…
Posted: 2009年6月04日(木) 09:56
by ほのか
いつもお世話になっております。
C言語の課題で住所録プログラムを作成中なのですが、課題担当の方に
「ソースのiCntはアドレスにして下さい。
関数の戻り値は正常終了か異常終了を示す指標。
異常応答した際は、プログラムを終了してください。」
と言われてしまい、完成したと思っていたのですが修正しなくてはなりません。
「*」等を付けるだけではいけませんよね?;
修正方法がよくわからなくて困っています;
ソースは添付ファイルをご覧いただけると幸いです。
Re:住所録プログラム…
Posted: 2009年6月04日(木) 10:06
by Mist
こういうふうに変えればいいんじゃないでしょうか。
/* 関数名: henkou
引数 : jusyoroku *data 登録データ先頭アドレス
int *iCnt 登録者数
戻り値: bool 実行結果(true=正常, false=異常)
説明 : 登録されたデータの変更を行う関数 */
bool henkou(Jusyoroku *data,int *iCnt);
で、関数の実行もとはfalseが返ってきた場合はプログラムを安全に終了するようにする。
あと、他の掲示板で再質問されるなら規約は守ってください。
> マルチポストはOKとしています。複数の掲示板で同じ質問をするときは相互リンクし、
> どこの掲示板で同じ質問をしているか明確にして下さい。
Re:住所録プログラム…
Posted: 2009年6月04日(木) 10:27
by non
ファイルのreadとwriteの異常終了はわかりますが、他はどうするのか。
仕様をはっきり決めるべきではありませんか?
Re:住所録プログラム…
Posted: 2009年6月04日(木) 10:45
by ほのか
回答ありがとうございます。
申し訳ございません;Yahoo知恵袋の方でも質問させていただいておりました;
全ての関数においてiCntをアドレスにするということでしょうか?;
最初の処理区分のところでそれぞれ正常か異常かを判定すれば良いのでしょうか??;
Re:住所録プログラム…
Posted: 2009年6月04日(木) 11:24
by Mist
> 全ての関数においてiCntをアドレスにするということでしょうか?;
関数の戻り値を関数の実行結果として使用するのであれば、関数内でiCntの値を変更するような関数(現状でいえばiCntが戻り値の関数かな?)はアドレスを渡すしかないでしょう。
関数内でiCntを参照しかしない関数は値渡しでも問題ありません。(値渡しにすべき)
> 最初の処理区分のところでそれぞれ正常か異常かを判定すれば良いのでしょうか??;
nonさんも指摘されていますが何をもって異常とするかを、ほのかさんが仕様として決定しないとどこで処理すればよいかは答えようがありません。
あと、「最初の処理区分」ってなんですか?
Re:住所録プログラム…
Posted: 2009年6月04日(木) 11:40
by ほのか
回答ありがとうございます。
問題なく新規登録・削除・変更等が行えた場合は正常、不具合が起きた場合は異常とするようにしたいのですが…それでも大丈夫でしょうか?;
最初の処理区分というのは、「処理区分を入力してください」のswitch判定の部分です。
Re:住所録プログラム…
Posted: 2009年6月04日(木) 11:58
by Mist
> 問題なく新規登録・削除・変更等が行えた場合は正常、不具合が起きた場合は異常とするようにしたいのですが…それでも大丈夫でしょうか?;
何が大丈夫かを聞きたいのでしょうか?
仕様として正しいのかどうかを聞きたいのであれば、ここではなく担当官に聞くべきでしょう。
プログラムとしてできるかどうかということであれば、まず組んでみて問題があるなら再度質問してください、としか言えないです。
Re:住所録プログラム…
Posted: 2009年6月04日(木) 13:24
by non
例えば、新規登録のint shinki(Jusyoroku *data,int iCnt)の関数ですが、
どうなった場合があなたがいうところの不具合が起きたといえるのでしょうか?
関数の最初に
if(data!=NULL){
と、書かれていますから、data==NULLのときが不具合ということなのでしょうか?
しかし、dataがそもそもNULLなんてことがあるのでしょうか。担当教官はよく指摘しませんね。
では、最大文字数を超えた場合再入力を促すようになっていますが、これを再入力しないように
して不具合が起きたと判断することもできるでしょう。
また、printf("データを登録します。\nよろしいですか?(Y/N)>>>");で登録しなかった時を
不具合が起きたと判断することもできます。
このように仕様によって、何が不具合か変わってきます。仕様は課題を出した人か、本人が
決めなければ、私たち外野が口を出すことではありません。
Re:住所録プログラム…
Posted: 2009年6月04日(木) 13:49
by ほのか
回答ありがとうございます。
それぞれの関数が正常に動作してiCntの値が変動した場合は正常、登録や削除をしたのにiCntの値が変わらなかった場合は異常という形にしたいです;
Re:住所録プログラム…
Posted: 2009年6月04日(木) 14:06
by ほのか
すみません;
引数で渡された値が、現在保持しているメンバ変数の値と同じであればTRUE、違った場合FALSEを返すという感じの方が良いでしょうか…
仕様は特に決められていないため自分で考えているのですが、どのようにすれば1番良いものなのかよくわからないので…;
Re:住所録プログラム…
Posted: 2009年6月04日(木) 14:14
by Mist
仕様の解釈なんて人それですから、ここで誰かの回答でこれが一番といっても担当官がどう評価するかなんてわかりません。
研修なんだから無理に最高のものを作ろうとせず自分の思いつく範囲、できる範囲の仕様で作ったほうがいいと思いますよ。
第一、ここで言われたとおりの仕様で作ってもあなたの勉強にはならないでしょう。
Re:住所録プログラム…
Posted: 2009年6月04日(木) 14:52
by ほのか
回答ありがとうございます。
引数で渡された値が、現在保持しているメンバ変数の値と同じであればTRUE、違った場合FALSEを返すという形にしたいと思います…
iCntをアドレスに変えてみたのですが、ただ「*」や「&」をつけるだけではだめなのでしょうか?;
また、それぞれの関数だけでなく、main関数で宣言しているiCntもアドレスにするべきなのでしょうか?
Re:住所録プログラム…
Posted: 2009年6月04日(木) 15:30
by Mist
> iCntをアドレスに変えてみたのですが、ただ「*」や「&」をつけるだけではだめなのでしょうか?;
どこをどう変えたのかが分からないと答えようがありません。
現在のソースを見せてください。
> それぞれの関数だけでなく、main関数で宣言しているiCntもアドレスにするべきなのでしょうか?
意味不明です。
ポインタの概念が理解できていないのか、もしくは何か思いっきり勘違いしているように思います。
Re:住所録プログラム…
Posted: 2009年6月04日(木) 15:39
by ほのか
現在のソースを添付しました。
このソースだと新規登録や削除等がうまくいきません…;
Re:住所録プログラム…
Posted: 2009年6月04日(木) 15:52
by non
>iCnt = shinki(&data[iCnt],&iCnt);
戻り値がiCntに入ったらまずいでしょう。
関数内では、異常終了の処理をしていませんし、iCnt++;なんてのが、まだ残ってます。
関数から戻ってからの処理もありません。
Re:住所録プログラム…
Posted: 2009年6月04日(木) 16:06
by Mist
> ただ「*」や「&」をつけるだけではだめなのでしょうか?
これの言いたいことが何となくわかりました。
横着しようとしてもダメです。
そんなに簡単には修正できません。
各関数の引数、戻り値はNo:34482での私の回答を元に修正してください。
アドレスとわかるように変数名はpiCntとかにしたほうがいいかもしれませんが。
あと、iCntをアドレスで渡すのであれば関数の中も修正する必要があります。
Re:住所録プログラム…
Posted: 2009年6月04日(木) 16:13
by ほのか
回答ありがとうございます。
Mist様の回答を元に修正を行っているのですが、「bool shinki(Jusyoroku *data,int *piCnt);」と宣言すると下記エラーが出ました;
c:42: error: 構文解析エラー が "shinki" の前にあります
c:42: 警告: データ定義が型や記憶クラスを持っていません
Re:住所録プログラム…
Posted: 2009年6月04日(木) 16:15
by ほのか
申し訳ございません;
includeしていなかっただけでした;
Re:住所録プログラム…
Posted: 2009年6月04日(木) 18:53
by Mist
Re:住所録プログラム…
Posted: 2009年6月05日(金) 09:38
by ほのか
申し訳ございません;
No:34484の記事でURLを載せていたのですが…コメント部分に記載していませんでした;
Re:住所録プログラム…
Posted: 2009年6月05日(金) 09:59
by Mist
ああ、そういうことでしたか。
ただ、URLのところは発言者のHPアドレスが入っている事がほとんどなので、何か書いておいてもらわないとわかりにくいですね。
Re:住所録プログラム…
Posted: 2009年6月08日(月) 09:17
by ほのか
今後はコメント欄に掲載させていただきます。申し訳ございませんでした;
ソースを全体的に修正したのですが、ファイル読み込み関数もカウンタをアドレスにした方が良いのでしょうか??;
ファイル読み込み関数はiCntでなく人数が戻り値なのですが…
Re:住所録プログラム…
Posted: 2009年6月08日(月) 10:49
by Mist
> ソースを全体的に修正したのですが、ファイル読み込み関数もカウンタをアドレスにした方が良いのでしょうか??;
担当が「関数の戻り値は正常終了か異常終了を示す指標。」と言ってるのにそれを無視するのはまずいんじゃないですか?
あと、「異常応答した際は、プログラムを終了してください。」も全然できてないし。
shinki関数とかsakujo関数の戻り値はboolなのに「return *piCnt;」とか書いてるし。
こことか知恵袋で指摘されたことだけを鵜呑みで直してる感じがするんですが・・・。
修正する以前にソースコード全体を理解できていますか?
Re:住所録プログラム…
Posted: 2009年6月08日(月) 11:14
by ほのか
すみません…;
とりあえず修正しました。
Re:住所録プログラム…
Posted: 2009年6月08日(月) 11:45
by Mist
shinki(&data[iCnt],&iCnt);
if(shinki==false){
exit(1);
}
ここは完全に間違っています。
また、shinki関数とかsakujo関数はfalseを返す所がないしdata=NULLのときは何も返していません。
どちらも、コンパイル時にエラーか警告になっていると思いますが。
今までの流れを見て思ったのは、ほのかさんは基礎的な部分でのC言語でのプログラミングが理解できておられないようですので担当官に正直に言ってもうすこし簡単なことからやり直したほうがいいと思います。
Re:住所録プログラム…
Posted: 2009年6月08日(月) 11:51
by ほのか
コンパイルエラー等は出ていないのですが、では戻り値がfalseだった場合はどうやって判定すれば良いのでしょうか?;
先週までの課題ですし、来週からは違う言語をやることになっているので、やり直すことは難しいです…;
Re:住所録プログラム…
Posted: 2009年6月08日(月) 12:11
by Mist
> では戻り値がfalseだった場合はどうやって判定すれば良いのでしょうか?;
私は会社で研修担当していたことがあるのでよくわかるのですが、こういう質問をすること自体基本が理解できていない証拠なんです。
関数の戻り値をどうやってチェックするかなんて基礎中の基礎です。
担当官がどこまでの完成度を求めているかはわかりませんが、私が指摘していないだけで間違いはほかにもたくさんあります。
現状では誰かに完璧な答えをもらわないと、ほのかさんの今の実力だと担当官からの指摘は解決できないと思います。
だから、「自分にはできません」と正直に報告して担当から答えを教えてもらって、それを理解するほうがよっぽどほのかさんのためになると思いますよ。
私からの回答はこれで最後にします。