掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.25221

構造体
投稿者---mine(2006/01/11 20:28:00)


名前と番号をメンバーとする構造体を作成し、5件分のデータ入力後、
データの表示を行うプログラムです。
登録済みの番号が入力された場合にエラーメッセージを表示して番号を
再入力させる方法が分かりません。
どのようにプログラムを組んだらいいのでしょうか?

よろしくお願いします。



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

#define NAME_MAX        19
#define DATA_MAX        5
#define BUF               256
#define NO_MIN    1
#define NO_MAX    9999

typedef struct person
{
        int no;
        char name[NAME_MAX+1];
}Person;

void disp_data(Person *,int);
void input_data(Person *);

int main(void)
{
        int cnt;
        Person member[DATA_MAX];

        for(cnt = 0 ; cnt < DATA_MAX ; cnt++)
        {
                input_data(&member[cnt]);
        }
        disp_data(&member[0],DATA_MAX);

        return 0;
}

void disp_data(Person *pmem,int max_cnt)
{
        int cnt;

        printf("\n* No *** Name ***********\n");
        for(cnt = 0 ; cnt < max_cnt ; cnt++)
        {
                printf("%04d    %s\n",(pmem+cnt)->no,&(pmem+cnt)->name[0]);
        }
        printf("\n");

        return;
}

void input_data(Person *num)
{
        char buf[BUF];

        while(1)
        {
                printf("\nInput number : ");
                scanf("%d",&num->no);
                if(num->no >= NO_MIN && num->no <= NO_MAX)
                {
                        break;
                }
                printf("\nSorry. number is %d - %d.\n",NO_MIN,NO_MAX);
        }
        while(1)
        {
                printf("Input name : ");
                scanf("%s",&buf[0]);
                if(strlen(&buf[0])<=NAME_MAX)
                {
                        strcpy(&num->name[0],&buf[0]);
                        break;
                }
                printf("\nSorry. Input less than %d characters.\n\n",NAME_MAX+1);
        }

        return;
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体 25226 たいちう 2006/01/11 20:46:50


No.25226

Re:構造体
投稿者---たいちう(2006/01/11 20:46:50)


登録済みのチェックをどこでやるかによりますね。
チェックのためには今まで入力された全データ(のno)が必要ですが、
このままでは、input_dataでそれを見ることができません。

色々方法はありますが、input_dataの引数を、配列の先頭アドレスを
渡すようにすれば、input_dataのなかで全てのデータを参照できます。

この点に関しての変更は、引数の型は変わらず、
呼び出し元のmainで、input_data(member); とするだけです。
これで、input_data内で、全ての配列のデータにアクセスできます。

但し、これだけでは先頭のデータは判っても、どこまでのデータが
入力済みなのか判らないため、チェックの範囲はもちろん、
重複がないことが確認できたデータをどこに保存すればよいのか
わかりません。

そこで、input_dataに2つめの引数を追加して、今入力しようと
しているのがどのデータか、関数内で判断できるようにします。


# 元のプログラムを自分で理解しているなら、
# この位の説明が適当かな。


この投稿にコメントする

削除パスワード

No.25236

Re:構造体
投稿者---mine(2006/01/12 00:17:44)


書き込みありがとうございます。

しかし、書き込み内容を今ひとつ理解することが出来ません。
もう少し、分かりやすく教えてもらえないでしょうか?

よろしくお願いします。


この投稿にコメントする

削除パスワード

No.25237

Re:構造体
投稿者---fuku(2006/01/12 00:51:38)


>しかし、書き込み内容を今ひとつ理解することが出来ません。
>もう少し、分かりやすく教えてもらえないでしょうか?

どこが理解しにくいのか明確にすべきだと思いますよ.
漠然と「理解できない」だと答えに詰まる.

input_data(&member[cnt]);
だと,構造体配列の1つだけを渡していることになるため
重複判定ができません.

たいちうさんの仰るとおり
input_data(member);
としてやれば構造体配列を丸ごと渡していることになるので
チェックができるというもの


次に,input_data関数内で,どこまで(何件)登録されているか分かるようにしておく事が必要なんです
そのためには,cnt も引数で渡してやれば分かるという具合



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧