ページ 1 / 1
C言語 アドレス帳
Posted: 2009年6月28日(日) 20:52
by JN
こんにちは
C言語でアドレス帳を作ろうとしてるんですが
配列などがあまりよく理解できずにあまり進みません。
本当は二次元配列を使ってやりたかったんですがよく理解できなかったので一次元配列で
できるところまで作りました。
今の状態でも多数エラーがあります><
アドレス帳に必要な機能は
1)データの登録
2)登録番号から各情報の表示
3)アドレスから氏名の検索
の3つです。
もしお時間がある方いましたらアドバイスなどお願いします<(_ _)>
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#define DATA_SIZE 100
char IDNUMBER[100],NAME[100],ADDRESS[100];
/*IDの範囲チェック*/
int CheckID(int ID)
{
if(ID < 0 || ID >= DATA_SIZE)
return -1;
return 0;
}
/*ID入力補助関数*/
int InputID()
{
int ID,result=-1;
while(result != 0)/*正しいIDを入力するまで繰り返し*/
{
printf("登録番号は?(0~%d):",DATA_SIZE-1);
scanf("%d",&ID);
/*IDチェック*/
result = CheckID(ID);
if(result != 0)
printf("不正なIDです。\n");
}
return ID;/*習得したIDを返す*/
}
/*登録*/
int Regist(int IDNUMBER[/url],char NAME[/url],char ADDRESS[/url])
{
int ID;
/*ID、名前、アドレスの習得*/
ID = InputID();
printf("名前を入力してください\n");
scanf("%s",NAME);
printf("アドレスを入力してください\n");
scanf("%s",ADDRESS);
}
/*登録番号から情報の表示*/
int Search(int IDNUMBER[DATA_SIZE],char NAME[DATA_SIZE],char ADDRESS[DATA_SIZE])
{
int bangou;
printf("検索したい情報の番号を入力してください");
scanf("%d",bangou);
IDNUMBER = bangou;
printf("%s",ADDRESS[bango[/url]);
}
/*アドレスから氏名の検索*/
int Search2(int IDNUMBER[DATA_SIZE],char NAME[DATA_SIZE],char ADDRESS[DATA_SIZE])
{
char adoresu[DATA_SIZE];
printf("検索したい情報のアドレスを入力してください");
scanf("%s",adoresu);
ADDRESS = adoresu;
printf("%s",ADDRESS);
}
void main(void)
{
int AddressList[100];
int AddressList2[100];
int MenuID=0;
while(MenuID!=4)
{
printf("アドレス帳\n");
printf("1:データの登録/修正\n");
printf("2:登録番号から各情報の表示\n");
printf("3:アドレスから氏名の検索\n");
printf("4:終了\n");
scanf("%d",&MenuID);
if(MenuID==1) Regist(AddressList,AddressList2);
else if(MenuID==2) Search(AddressList,AddressList2);
else if(MenuID==3) Search2(AddressList,AddressList2);
else if(MenuID==4) system("cls");/*コンソールをクリア*/
}
}
/*登録番号から情報を検索して表示できるようにする*/
/*アドレスから氏名の検索をできるようにする*/
Re:C言語 アドレス帳
Posted: 2009年6月28日(日) 21:08
by box
> 今の状態でも多数エラーがあります><
何をしたときに、どんなエラーが出るのですか?
Re:C言語 アドレス帳
Posted: 2009年6月28日(日) 21:11
by non
尋ねたいことが何なのか。的を絞ってもらった方が回答しやすいです。
グローバル変数の
char IDNUMBER[100],NAME[100],ADDRESS[100];
と、
mainで宣言されている、
int AddressList[100];
int AddressList2[100];
は、どういう関係があるのか(使用目的は何か)
また、
関数呼び出し側の
Regist(AddressList,AddressList2);
と関数の
int Regist(int IDNUMBER[/url],char NAME[/url],char ADDRESS)
の引数個数は、なぜ違うのかなど、謎がいっぱいです。
Re:C言語 アドレス帳
Posted: 2009年6月28日(日) 21:23
by sizuma
とりあえず関数の定義を復習した方がいいと思います。
自分で考えたプログラムを実装しようとする心意気はすごくいいと思いますが・・・
まずは登録の機能だけを作りながら、関数定義を確認してみては?
ぱっとみで、すべての関数で引数はいらないように思いますが。
あと名前はもうすこし分かりやすいものを・・・
Search →SearchName
Search2 →SearchData
みたいにすると分かりやすくなると思います
Re:C言語 アドレス帳
Posted: 2009年6月28日(日) 21:43
by JN
返信に時間がかかってしまってスイマセン<(_ _)>
みなさんが指摘してくださった事を直してたら少し時間がかかってしまいました。
>boxさん
nonさんが指摘してくださった「引数個数」の場所を直したら
エラーはでなくなりました。
そして正しく情報が保存されてるかわかりませんが
番号登録、名前、アドレスの入力はできるようになりアドレス入力が終わると
また最初のメニュー画面に戻るようになりました。
>nonさん
引数個数のところ直しました<(_ _)>
そしてエラーはでなくなりました。ありがとうございます。
(MenuID==2) SearchName(AddressList,AddressList2,AddressList3);
のところを
(MenuID==2) SearchName(IDNUMBER,NAME,ADDRESS);
に変えちゃっても大丈夫なのでしょうか?
ビルドは成功しましたが
>sizumaさん
名前の件了解です。
確かに1,2と名前をつけるより全然わかりやすいですね
次回から名前をつけるときには適当ではなくちゃんとわかりやすいようにつけたいと思います。
------------------------------------------------------------------------------
登録はちゃんと情報が保存されているかわかりませんが入力はちゃんとできるようになったので
次はとりあえず番号を入力すると名前やアドレスの表示をする部分を書きたいと思うのですが
今のソースのままだとメニューの[2]を押して検索したい番号を打ってEnterを押すと
Debug Error!
Program: h:\新しいフォルダ\report 03\Debug\report 03.exe
Module: h:\新しいフォルダ\report 03\Debug\report 03.exe
File:
Run-Time Check Failure #3 - The variable 'bangou" is being used without being initialized.
(Press Retry to debug the application)
と出てきてしまいます。
bangouという部分が何か問題があると言っているのはわかるんですがどこをどういう風に直したらいいのかわかりません><
現在のソース
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#define DATA_SIZE 100
char IDNUMBER[100],NAME[100],ADDRESS[100];
/*IDの範囲チェック*/
int CheckID(int ID)
{
if(ID < 0 || ID >= DATA_SIZE)
return -1;
return 0;
}
/*ID入力補助関数*/
int InputID()
{
int ID,result=-1;
while(result != 0)/*正しいIDを入力するまで繰り返し*/
{
printf("登録番号は?(0~%d):",DATA_SIZE-1);
scanf("%d",&ID);
/*IDチェック*/
result = CheckID(ID);
if(result != 0)
printf("不正なIDです。\n");
}
return ID;/*習得したIDを返す*/
}
/*登録*/
int Regist(int IDNUMBER[/url],char NAME[/url],char ADDRESS[/url])
{
int ID;
/*ID、名前、アドレスの習得*/
ID = InputID();
printf("名前を入力してください\n");
scanf("%s",NAME);
printf("アドレスを入力してください\n");
scanf("%s",ADDRESS);
}
/*登録番号から情報の表示*/
int SearchName(int IDNUMBER[DATA_SIZE],char NAME[DATA_SIZE],char ADDRESS[DATA_SIZE])
{
int bangou;
printf("検索したい情報の番号を入力してください\n");
scanf("%d",bangou);
IDNUMBER = bangou;
printf("%s",ADDRESS[bango[/url]);
}
/*アドレスから氏名の検索*/
int SearchData(int IDNUMBER[DATA_SIZE],char NAME[DATA_SIZE],char ADDRESS[DATA_SIZE])
{
char adoresu[DATA_SIZE];
printf("検索したい情報のアドレスを入力してください\n");
scanf("%s",adoresu);
ADDRESS = adoresu;
printf("%s",ADDRESS);
}
void main(void)
{
int AddressList[100];
int AddressList2[100];
int AddressList3[100];
int MenuID=0;
while(MenuID!=4)
{
printf("アドレス帳\n");
printf("1:データの登録/修正\n");
printf("2:登録番号から各情報の表示\n");
printf("3:アドレスから氏名の検索\n");
printf("4:終了\n");
scanf("%d",&MenuID);
if(MenuID==1) Regist(AddressList,AddressList2,AddressList3);
else if(MenuID==2) SearchName(AddressList,AddressList2,AddressList3);
else if(MenuID==3) SearchData(AddressList,AddressList2,AddressList3);
else if(MenuID==4) system("cls");/*コンソールをクリア*/
}
}
Re:C言語 アドレス帳
Posted: 2009年6月28日(日) 21:46
by MNS
Run-Time Check Failure #3 - The variable 'bangou" is being used without being initialized.
このエラーに関しては、
scanf("%d",bangou);
これが原因な気がします。
scanf("%d",&bangou);
に直して試してみてください。
Re:C言語 アドレス帳
Posted: 2009年6月28日(日) 22:01
by box
プログラムの設計図をきちんと書いてから、開発に取りかかる方がよいです。
今のコードを拝見すると、何だか行き当たりばったりに作っているように見えます。
例えば、
>if(MenuID==1) Regist(AddressList,AddressList2,AddressList3);
と
>int Regist(int IDNUMBER[/url],char NAME[/url],char ADDRESS[/url])
とで、引数の型が食い違っています。他の関数も、同様です。
ある関数を作るときには、
・その関数で何をさせたいのか
・そのためには、どんなデータをやりとりするのか
をじゅうぶんに意識する必要があります。
呼び出す側と呼び出された側とでデータの型が違っているのは、論外です。
Re:C言語 アドレス帳
Posted: 2009年6月28日(日) 22:05
by JN
MSNさん>
エラーでなくなりました
ありがとうございます<(_ _)>
------------------------------------------
番号を入力してもらい各情報の表示の部分は
登録番号を入力してもらったらその入力してもらった番号を
bangouに入れ、そのbangouに入ってる数字をIDNUMBERと照らし合わせ
同じ数字が合ったらその番号に入ってる名前とアドレスを表示するというものを考えています。
bangouに入った数字とIDNUMBERに入ってる数字の照らし合わせ方がよくわかりません><
↓みたいな感じの実行結果を表示したいと思ってます
検索したい情報の番号を入力してください
1
登録番号:1
名前:abc
アドレス:aiueo
Re:C言語 アドレス帳
Posted: 2009年6月28日(日) 22:18
by sizuma
とりあえずあんまり変えないで、適当な登録だけ作ってみたです。
30分以上かかった・・・
ちなみにCで書くのは初めてなんで、なんかいろいろ適当です
僕が怒られそうです^^;
配列の範囲のチェックとかしてないし
一応動きましたけど(笑)
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#define DATA_SIZE 100
char NAME[100][20];
char ADDRESS[100][20];
/*IDの範囲チェック*/
int CheckID(int ID)
{
if(ID < 0 || ID >= DATA_SIZE){
printf("不正なIDです。\n");
return 0;
}
if(strcmp(NAME[ID],""){
printf("すでに登録されてるデータがあります\n");
return 0;
}
return 1;
}
/*ID入力補助関数*/
int InputID()
{
int ID;
int result=0;
while(!result)/*正しいIDを入力するまで繰り返し*/
{
printf("登録番号は?(0~%d):",DATA_SIZE-1);
scanf("%d",&ID);
/*IDチェック*/
result = CheckID(ID);
}
return ID;/*習得したIDを返す*/
}
/*登録*/
void Regist(void)
{
/*ID、名前、アドレスの習得*/
int ID = InputID();
printf("名前を入力してください\n");
scanf("%s",NAME);
strcpy(NAME[ID],NAME);
printf("アドレスを入力してください\n");
scanf("%s",ADDRESS);
strcpy(ADDRESS[ID],ADDRESS)
}
void main(void)
{
int MenuID=0;
while(MenuID!=4)
{
printf("アドレス帳\n");
printf("1:データの登録/修正\n");
scanf("%d",&MenuID);
if(MenuID==1) Regist();
}
/*確認用
printf("確認したいID入力");
scanf("%d",&MenuID);
printf("%s\n%s",NAME[MenuID],ADDRESS[MenuID]);
*/
}
若干恥ずかしいミスを訂正しましたorz
C言語難しい
Re:C言語 アドレス帳
Posted: 2009年6月28日(日) 22:29
by JN
>boxさん
いろいろと初歩的なことを間違えててスイマセン<(_ _)>
これは数日前に学校で出された学校の課題なんですが
まだ学校でもプログラムを勉強し始めて数ヶ月なのでわからないことだらけですorz
これは期限が明後日の昼なので
今日またこれから自分でいろいろと読みなおしてみたりしてみます
ありがとうございます<(_ _)>
>sizumaさん
わざわざ登録の部分作ってくださったんですかΣ(・ω・ノ)ノ!
ありがとうございます><
sizumaさんのソースを見てよくわからなかった二次元配列の使い方も少しわかった気がします。
そしてみなさんの指摘などを受けて
自分には初歩的な事が理解できてなかったりいろいろと問題があることを改めて感じたので
ちょっと一人でいろいろと調べたり読みなおしてみたりしたいと思います。
また数時間後、明日あたりに来るかもしれませんがその時はお時間ありましたら
よろしくお願いします<(_ _)>
Re:C言語 アドレス帳
Posted: 2009年6月28日(日) 22:52
by pooka
>sizumaさん
ぱっと見これはまずいだろうと思った所です。
Regist関数の
>scanf("%s",NAME);
>NAME[ID][0] = NAME;
ここは新たに
char name[20];
などとして、
scanf("%s",name);
strcpy(NAME[ID],name);
としないときちんと動かないと思いますよ。
ADDRESSに関しても同様です。
Re:C言語 アドレス帳
Posted: 2009年6月28日(日) 23:02
by sizuma
本当ですね(汗
若干恥ずかしいミスを直したと思ったら、まだ恥ずかしいミスがありました・・・
っていうかじっくり探せばまだまだ出てきそうですorz
Javaとかで書いてるときはインスタンス変数と引数を同じ名前にしてthisで区別してるんで、てっきりローカル変数に
char NAME[20]
があるだろうと勘違いしてました(言い訳)
ここらへんはエラーのチェックもしてないし
もう間違えたままにしておきますんで、JNさん気をつけてくださいー
Re:C言語 アドレス帳
Posted: 2009年6月29日(月) 11:14
by JN
>sizumaさん
了解です<(_ _)>
sizumaさんのおかげでもうすぐプログラミング終わりそうですd(´д`o)
--------------------------------------------------------
みなさんのおかげで残す問題はあと1つになったのですが
この1つがわかりませんorz
アドレスを入力してもらったときにそれは誰のアドレスかを表示するものです。(アドレスから氏名の検索)
ネットなどで調べたらstrstrというものを使って文字列と文字列の照合を行えるみたいなことが
書いてあったのですが今一つ理解できません;
今の↓のソースではエラーは1つも出てきませんし実行した時
登録、登録番号を入力したときに各情報の表示は正常に動いてるように見えます。
お時間ある方いましたらお願いします<(_ _)>
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#define DATA_SIZE 100
char NAME[100][20];
char ADDRESS[100][20];
/*IDの範囲チェック*/
int CheckID(int ID)
{
if(ID < 0 || ID >= DATA_SIZE){
printf("不正なIDです。\n");
return 0;
}
return 1;
}
/*ID入力補助関数*/
int InputID()
{
int ID;
int result=0;
while(!result)/*正しいIDを入力するまで繰り返し*/
{
printf("登録番号は?(0~%d):",DATA_SIZE-1);
scanf("%d",&ID);
/*IDチェック*/
result = CheckID(ID);
}
return ID;/*習得したIDを返す*/
}
/*登録*/
void Regist(void)
{
/*ID、名前、アドレスの習得*/
int ID = InputID();
char name[20];
char address[20];
printf("名前を入力してください\n");
scanf("%s",name);
strcpy(NAME[ID],name);
printf("アドレスを入力してください\n");
scanf("%s",address);
strcpy(ADDRESS[ID],address);
}
/*登録番号から各情報の表示*/
void SearchNumber(void)
{
int id;
printf("確認したいID入力:");
scanf("%d",&id);
printf("登録番号:%d\n",id);
printf("名前:%s\n",NAME[id]);
printf("アドレス:%s\n\n",ADDRESS[id]);
}
/*アドレスから指名の検索*/
void SearchAddress(void)
{
}
void main(void)
{
int MenuID=0;
while(MenuID!=4)
{
printf("アドレス帳\n");
printf("1:データの登録/修正\n");
printf("2:登録番号から各情報の検索\n");
printf("3:アドレスから氏名の検索\n");
printf("4:終了\n\n");
scanf("%d",&MenuID);
if(MenuID==1) Regist();
else if(MenuID==2) SearchNumber();
else if(MenuID==3) SearchAddress();
else if(MenuID==4) system("cls");/*コンソールをクリア*/
}
}
Re:C言語 アドレス帳
Posted: 2009年6月29日(月) 11:52
by ねこ
文字列を比較するのはstrcmp関数です。
比較したい二つの文字を引数に指定し、戻り値が「0」の時は同じ文字となります。
データをfor文でくるくる回して、検索アドレスと登録されたアドレスを比較して同じだったら
同じ配列インデックスの名前を表示します。
なお現在の処理ではアドレスの重複チェックがないため
同じアドレスがあったら2個以上出すのか最初に検索された1個なのか
はたまたチェックして同じアドレスは格納しないようにするのか等
ちょっと改良の余地があるかも。
Re:C言語 アドレス帳
Posted: 2009年6月29日(月) 12:23
by non
strstrは見つかったらそのアドレスを、見つからないときはNULLを返しますから、
NULLでなかったら、その配列のINDEXの名前を表示すればいいです。
それよりも、登録するときにIDを入れるというのは、先生から与えられた仕様ですか?
Re:C言語 アドレス帳
Posted: 2009年6月29日(月) 16:28
by JN
>ねこさん
for文でまわすんですね!
strcmpで検索してちょっとやってみます。
アドレスの重複チェックはこの課題には与えられてなかったので入れてませんでした。。。
>nonさん
登録するときにID(登録番号)を入れるのは先生からそうするように言われました。
Re:C言語 アドレス帳
Posted: 2009年6月29日(月) 17:31
by non
>登録するときにID(登録番号)を入れるのは先生からそうするように言われました。
了解です。
アドレス検索が完全一致ならstrcmpでいいですが、部分一致OKならstrstrの方がいいですよ。
Re:C言語 アドレス帳
Posted: 2009年6月29日(月) 18:23
by sizuma
>登録ID
余裕があればすでに登録してあるIDを入力したら上書きするかの確認をしたり、
何も入力しなかったら空いてるIDで一番若い番号を返す、なんて機能があればいいんじゃないですかね
>strstr
部分一致OKにするなら2,3個返ってくる可能性も考慮して書いた方がよさそうですね
scanfで入力
for(全部チェック){
if(アドレスがある && strstrで調べる)printfで出力
}
みたいな感じはどうですか?
Re:C言語 アドレス帳
Posted: 2009年6月29日(月) 23:24
by JN
返事遅れてスイマセン<(_ _)>
バイトとかいろいろあり帰ってくるのが遅くなってしまいました。
>nonさん
そういう違いがあるんですね。
今回は友達とかも使ってるのでstrstrを使ってみようと思ってます。
>sizumaさん
全部チェックというところはどうやってやればいいんでしょうか?><
Re:C言語 アドレス帳
Posted: 2009年6月30日(火) 06:25
by sizuma
>全部チェック
配列の添字を0からDATA_SIZE - 1までループ
って意味です