はじめまして!
学校の課題の構造体を用いたプログラムを作成しました。
範囲外番号を入力したときのエラーメッセージは表示できるのですが、
登録済みの番号を入力したときのエラーメッセージを
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;
}
}
続く…
構造体で…
Re:構造体で…
まず、現在の 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()にある呼び出し元も
あとは
#ちなみに入力した番号の登録済みチェックをするなら、数字以外が入力されたこともチェックするとプログラムが堅牢になると思います。
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なら登録済みはないと判別できると思います。#ちなみに入力した番号の登録済みチェックをするなら、数字以外が入力されたこともチェックするとプログラムが堅牢になると思います。