構造体で…

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

構造体で…

#1

投稿記事 by テルル » 18年前

はじめまして!
学校の課題の構造体を用いたプログラムを作成しました。
範囲外番号を入力したときのエラーメッセージは表示できるのですが、
登録済みの番号を入力したときのエラーメッセージを
input_dataの中で処理しようと思っているのですが表示できません。
教えていただけませんか?



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

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

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

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

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

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

display_data(&member[0],DATA_MAX);

return 0;
}

void display_data(Person *pmem,int max_cnt)
{データの表示処理}

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

while(1)
{
printf("\n");
printf("Input Number : ");
scanf("%d",&imem->no);

if(imem->no < NO_MIN || imem->no > NO_MAX)
{
printf("\nSorry.Input number %d - %d",NO_MIN,NO_MAX);
}
  else
{
break;
}
}

続く…

Justy

Re:構造体で…

#2

投稿記事 by Justy » 18年前

 まず、現在の input_data()の仕様では番号の登録済み(重複チェック)はできません。
 input_data()には未入力の1つ分の Person情報しか情報が渡っていないからです。

 引数を [color=#d0d0ff" face="sans-serif]input_data(Person *person, int index) [/color]と Person情報の先頭と有効な数(カレントのインデックス)を与える形に変更します。

 こうすることで input_data()内で [color=#d0d0ff" face="sans-serif]Person member[DATA_MAX]; [/color]の全ての要素にアクセスできるようになります。

 当然 main()にある呼び出し元も
[color=#d0d0ff" face="monospace]    for(cnt = 0;cnt < DATA_MAX;cnt++) 
        input_data(member, cnt);[/color]
 のように、cntを与えます。


 あとは
[color=#d0d0ff" face="monospace]Person* FindPersonFromNo(int no, Person *item, int max_cnt)
{
    int i;
    for(i=0; i<max_cnt; ++i, ++item)
    {
        if(item->no == no)
            return item;
    }
    return NULL;
}[/color]
 こんな感じの noと同じ番号を持つ Person情報を検索する関数を作って、戻り値が NULLなら登録済みはないと判別できると思います。


#ちなみに入力した番号の登録済みチェックをするなら、数字以外が入力されたこともチェックするとプログラムが堅牢になると思います。

テルル

Re:構造体で…

#3

投稿記事 by テルル » 18年前

有り難うございました!
早速取りかかりたいと思います。

閉鎖

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