アドレス帳のプログラム

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

アドレス帳のプログラム

#1

投稿記事 by saya » 14年前

今アドレス帳のプログラムを作っているのですが
関数の使い方が今ひとつ理解できません

構造体に保存したデータを関数で見ることができて
見終わったらまた入力できるようにしたいのですがどうしたらいいか分かりません
つまりそれぞれの行動の場所を行き来できるようにしたいのですが
どうしたらいいでしょうか?
わかりずらい質問ですみません
コード載せます

コード:

#include<stdio.h>
 struct adress1 {
	char name[20];
	char adress[20];
	char yomikata[20];
}work[999];
 
int main(void)
{
	int i,a,c=0,b;
	for ( i=0; i<100; i++ )
	{
	
        printf("アドレスを入力してください\n");
	    scanf("%s",work[i].adress);
        printf("名前を入力してください\n");
		scanf("%s",work[i].name);
        printf("ふりがなを入力してください\n");
		scanf("%s",work[i].yomikata);
		printf("入力を終えるなら0を入力してください、続けるならそれ以外の数字を入力してください\n");
		scanf("%d",&a);
		c++;
		if(a==0)break;
		

	}	
       for(i=0;i<c;i++)
	   {
		printf("%s\n", work[i].adress);
		printf("%s\n", work[i].name);
		printf("%s\n", work[i].yomikata);
	    printf("次の人\n");
	   }
}

non
記事: 1097
登録日時: 15年前

Re: アドレス帳のプログラム

#2

投稿記事 by non » 14年前

saya さんが書きました: 構造体に保存したデータを関数で見ることができて
見終わったらまた入力できるようにしたいのですがどうしたらいいか分かりません
つまりそれぞれの行動の場所を行き来できるようにしたいのですが
どうしたらいいでしょうか?
もう少し、具体的にどんな関数が欲しいのか説明してください。

例えば、
構造体のポインタを渡したら、各メンバーを標準出力に出力する関数が欲しい・・・
すると、こんなプログラムになります。

コード:

void disp_work(struct adress *p)
{
        printf("%s\n", p->adress);
        printf("%s\n", p->name);
        printf("%s\n", p->yomikata);
}
non

saya

Re: アドレス帳のプログラム

#3

投稿記事 by saya » 14年前

すみません
入力し終わったらデータを見ることができて、
データを見たらまた入力することが出来る構造を作りたいです

non
記事: 1097
登録日時: 15年前

Re: アドレス帳のプログラム

#4

投稿記事 by non » 14年前

saya さんが書きました:すみません
入力し終わったらデータを見ることができて、
データを見たらまた入力することが出来る構造を作りたいです
仕様をまとめましょう。上の機能を1つの関数で全部やりたいのでしょうか?

1 関数名は何にするか?
2 関数の引数は何を渡すか?
3 戻り値はどうするのか?
4 機能として何が行いたいのか。
 現状ではこの機能として、
 各メンバーのデータを入力し、構造体に格納し、格納されたメンバーを表示する。
 これを繰り返し行いたいのでしょうが、0が入力されるまでなのでしょうか?
 この繰り返しや終了判定も関数の中で行いたいのでしょうか?

仕様をはっきり決めることが大事です。
non

saya

Re: アドレス帳のプログラム

#5

投稿記事 by saya » 14年前

ありがとうございました

1 関数名は何にするか? 

何でもいいです
2 関数の引数は何を渡すか? 

main関数で入力処理を行ってるので構造体自身だと思います
3 戻り値はどうするのか? 

ちょっと分からないです
構造体の中を表示させて
またmain関数の入力する場所に戻りたいです

4 機能として何が行いたいのか。
データを入力して
それを表示する機能を持ち
それら二つの処理どちらをするのか選べるような機能をもたせたいです

non
記事: 1097
登録日時: 15年前

Re: アドレス帳のプログラム

#6

投稿記事 by non » 14年前

saya さんが書きました: 1 関数名は何にするか? 

何でもいいです
sayaさんが作るのだからsayaさんが決めなければ、だれが決めるのですか?
saya さんが書きました:
2 関数の引数は何を渡すか? 

main関数で入力処理を行ってるので構造体自身だと思います
3 戻り値はどうするのか? 

ちょっと分からないです
構造体の中を表示させて
またmain関数の入力する場所に戻りたいです
次の機能をしっかり決めてからにしましょう。
saya さんが書きました: 4 機能として何が行いたいのか。
データを入力して
それを表示する機能を持ち
それら二つの処理どちらをするのか選べるような機能をもたせたいです
すると、入力を行うのか、データを表示するのかを関数の中で選択させたいことになりますね。
入力したら、必ず表示するわけではないのですね?
また、入力するのか、表示するのかを引数で渡すわけでもないのですよね?

で、前に質問した
non さんが書きました:
これを繰り返し行いたいのでしょうが、0が入力されるまでなのでしょうか?
この繰り返しや終了判定も関数の中で行いたいのでしょうか?
の回答はどうなりましたか?
まだ、私には、この関数で何をやりたいのかわからないのですが、正しく説明してください。
non

saya

Re: アドレス帳のプログラム

#7

投稿記事 by saya » 14年前

1 関数名は何にするか? 

じゃあ
senntakuとかでいいです

2 関数の引数は何を渡すか? 

main関数で入力処理を行ってるので構造体自身だと思います

4 機能として何が行いたいのか。
データを表示するのかを関数の中で選択させたいです

入力したら、必ず表示するわけではないのですね?
はい

また、入力するのか、表示するのかを引数で渡すわけでもないのですよね?
はい

これを繰り返し行いたいのでしょうが、0が入力されるまでなのでしょうか?
この繰り返しや終了判定も関数の中で行いたいのでしょうか?

とりあえず今の段階で0が入力されたときに構造体のデータを表示できるプログラムを作っただけなので
0に深い意味はありません
繰り返しや終了判定がどこで行うかはこだわっていません




わかりにくいでしょうが
よろしくお願いします

non
記事: 1097
登録日時: 15年前

Re: アドレス帳のプログラム

#8

投稿記事 by non » 14年前

saya さんが書きました: とりあえず今の段階で0が入力されたときに構造体のデータを表示できるプログラムを作っただけなので
0に深い意味はありません
繰り返しや終了判定がどこで行うかはこだわっていません
あなたが、決める仕様なのですから、こだわっていないとかいう問題ではありません。
作るのはsayaさんですよ。私が作るわけではありません。
一般的にはどのような関数を作るのが良いだろうかという質問でしたら、早めにそう言ってくださいね。
今作ろうとしている仕様は、私が作るとしたら好ましい仕様ではありませんから。

さて、質問の続きです。

繰り返しは関数の中で行うのか否か?

関数の中で繰り返すとしたら、終了の合図は何か?

それにより、引数はどうするのか、戻り値はどうするのかなどが決まってきます。
例えば、引数ですが
この関数が1件のデータを入力するものなら、入力したい構造体のポインタを渡します。
全件のデータを入力するのなら、構造体の配列の先頭アドレスを渡します。
また、戻り値は、1件のデータを入力するなら、正常に入力されたか否か、または戻り値なし。
全件のデータを入力するなら、入力されたデータの件数を返す方がいいでしょう。
non

かずま

Re: アドレス帳のプログラム

#9

投稿記事 by かずま » 14年前

saya さんが書きました:入力し終わったらデータを見ることができて、
データを見たらまた入力することが出来る構造を作りたいです
これで構造がわかりませんか

コード:

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

#define MAX_NAME 20
#define MAX_DATA 100

struct Data {
    char name[MAX_NAME];
};

struct Data data[MAX_DATA];
int data_count = 0;

void input_data(void)
{
    char name[MAX_NAME];
    struct Data *p;
    for (;;) {
        printf("name? ");
        scanf("%s", name);
        if (name[0] == '0') break;
        p = &data[data_count];
        strcpy(p->name, name);
        data_count++;
    }
}

void display_data(void)
{
    int i;
    for (i = 0; i < data_count; i++) {
        struct Data *p = &data[i];
        printf("%3d %s\n", i+1, p->name);
    }
}

int main(void)
{
    for (;;) {
        input_data();
        display_data();
    }
    return 0;
}

閉鎖

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