大至急!途中まで作成してあるC言語プログラムを問題文に合うよう、既存ロジックの変更を少なく、修正部分は解説コメントを付けてお願いします。

提示方法は自由。ただし簡単なテスト実行を必須とします。400P進呈!!(複数人開けた場合は当方の判断で山分け)19日朝6時まで受付。

<問題>次の構造体を1レコードとするファイルを作成。ファイル名は「shokuin.dat」1人分のデータを画面から受け取る関数プロトタイプはint get_shokuin(shokuin *sp)とする。ファイルへのデータの書き込みはfwrite関数を使用。その他は自由。

<構造体(shokuin)>
職員番号:4桁 
氏名(漢字):20桁
氏名(カナ):20桁
郵便番号:6桁
住所:60桁
電話番号:12桁 

ソースはこちら
http://d.hatena.ne.jp/keronimo/20070918

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2007/09/22 00:44:15
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:Mook No.1

回答回数1314ベストアンサー獲得回数393

ポイント150pt

使用の不明な点が多々ありましたが、そこは適当に解釈しました。

#include <stdio.h>
#include <string.h>

struct shokuin {
    int shokuin_no;  // ★ 数値型にしたい?
    char name_kanji[40];
    char name_kana[20] ;
    char yubin[7] ;  // ★ '\0' 分のサイズが不足
    char jyusyo[60] ;
    char tel[13] ;   // ★ '\0' 分のサイズが不足
};

void get_shokuin( struct shokuin *sp );  // 構造体の型が不足

void main ( void )
{
    struct shokuin a[4] = // ★ a[] は不適なので サイズを4人分に変更:拡張性はよくない
    {
        { 1122, "池野", "イケノ", "111-00", "tokyo", "03-0123-0123" },
        { 3344, "武田", "タケダ", "176-00", "yokohama", "090-012-9876" },
        { 0, "", "", "", "", "" } 
    };
    struct shokuin *sp; //構造体へのポインタspの宣言

    get_shokuin( &(a[2]) ); //1人分のデータを画面から受け取る関数
    //最終レコードの作成    // ★ 関数でやるべき処理ではないので main へ移動
    a[3].shokuin_no = 0;

// ★ while から for 文に変更
    for( sp = a ; sp->shokuin_no != 0 ; sp++ ) //最終レコードの判断
    { //全員の表示
        printf("%d %s %s %s %s %s\n",  //  ★ 改行の追加
        sp->shokuin_no, sp->name_kanji, sp->name_kana,
        sp->yubin, sp->jyusyo, sp->tel );
    } 
}

void get_shokuin( struct shokuin *sp ) //1人分のデータを画面から受け取る
{ 
    printf( "1人分の情報を入力して下さい。\n" );
    printf( "職員番号の入力" );
    scanf ( "%d", &(sp->shokuin_no) ); // ★ アドレスに変更
    printf( "氏名(漢字)の入力" );
    scanf ( "%s", sp->name_kanji );
    printf( "氏名(カナ)の入力" );
    scanf ( "%s", sp->name_kana );
    printf( "郵便番号の入力" );
    scanf ( "%s", sp->yubin );
    printf( "住所の入力" );
    scanf ( "%s", sp->jyusyo );
    printf( "電話番号の入力" );
    scanf ( "%s", sp->tel );
}
id:q_chan No.2

回答回数48ベストアンサー獲得回数0

はてな利用規約 第6条禁止事項

http://www.hatena.ne.jp/rule/rule#kiyaku06

id:keronimo

何が禁止なのか文章で書け。

著作権?

2007/09/22 00:42:41
  • id:KUROX
    簡単そうであるが・・。
  • id:Mook
    初期データの2人分は何のためにあるのでしょうか。

    プログラムの動作からは、先頭にデータを読み込んで、
    2番目のデータを終端にしているように見えますが。
  • id:Kumappus
    テスト用のダミーデータだろうな>2人分。
    なんかまじめに考えると頭から全部書き直したくなるような内容なのでこっちに「レポートで○がもらえるだけ」の修正点書く。

    1. main()の頭のほうで

    FILE* fp;
    if( ( fp = fopen("recordfile.dat", "w") == NULL ){
    printf("Cannot open the data file\n");
    return(0);
    }
    入れてfpを得る

    2.//全員の表示
    printf(...)が入ってるwhileループのところに
    fwrite( (char*)sp, sizeof( struct shokuin ), fp );
    入れる。これで1レコード書き込まれる。

    3. main()の終わりで fclose(fp);

    でもこのプログラム、そもそも値の入力は1個で終わっちまうし(しかもその前にテスト用ダミーデータ2個つき)。既存ロジックが破綻してると思われる。
  • id:Mook
    あっ、ファイルへ書き出すんだ。
    全然見てなかった^^;;。
    関数の型も変えちゃったし。


    仕様未達なのでポイントは結構です。
  • id:Kumappus
    …でそー? まず、もとのを書き換えたくなるでそー?(笑)
  • id:jiangmin-alt
    ところで、そろそろスーパーpre記法使いませんか? その方が見やすいですよ。
  • id:cx20
    > そろそろスーパーpre記法使いませんか? その方が見やすいですよ。

    同感です。ついでに人力検索の解答欄にもシンタックス・ハイライトを実装して欲しいところ(はてなへの要望)ですけど。
  • id:keronimo
    しっかしうるさいのが多いな。
    ろくに言語使えないくせに解説だけはいっちょまえだ。
    関数使えばいいのくらい素人の俺だってわかるっての。
    cx20は前回初期化が足りないなどと検討違いなだめ回答くれといて、えらそうだな。
  • id:castiron
    もうなんか「だめだめ」だな・・・

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません