構造体の使い方

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

構造体の使い方

#1

投稿記事 by rui » 10年前

C言語初心者です。 今下記のような問題をしています。

パン屋から、配達する場合に、特別なお客様の場合は、お得意様ごとに設定した割引をして
販売したいので、注文の時に、お得意様コードとパン事の個数を入力すると販売価格を表示するプログラムを作る
通常のパンの単価 税込み あんぱん 140円 ジャムパン 150円 カレーパン170円で、配達料金は1回注文合計金額が2000円以下の
場合は300円かかります。しかし、特別なお得意様の場合の単価は、お得意様ごとの割引を引いた単価です。また配達料も、
お得意様ごとのパンの購入金額によって異なります。

得意様コード   得意様名          割引額                     配達料
                    あんぱん  じゃむぱん カレーパン 1000円以下 1500円以下 2000円以下
104251 鈴木一郎  5円  5円 10円 300円 280円 260円
104420 ○○○○○○ 10円      10円 10円 300円 280円 250円
104755 ○○○○○○ 0円 5円 5円 300円 290円 280円
203320 ○○○○○○ 10円 10円 15円 300円 270円 250円
203321 ○○○○○○  5円 5円 5円 300円 290円 280円
203322 ○○○○○○ 10円 15円 20円 290円 270円 250円

注文を受けた時に、得意様コードとパンごとの個数を、aアンパンの個数、jジャムパンの個数、cカレーパンの
個数の様に入力すること。
またプログラムを作成する時は、構造体を用いて行い、販売金額表示時にて、お得意様名を表示すること。

実行例

コマンド名 203320△ c10 △ j5△ a5
お得意様名 鈴木一郎 パン販売金額 3150円 割引額 250円 配達料 0円 合計 2900円

上記のような問題で、パンの種類と個数を入力し、購入金額合計を出し、購入金額合計が2000以下の場合の条件処理を作る所までは
できましたが、構造体を使用して、それぞれの得意様の場合の割引と配達を行う処理が分かりません。
C言語初心者なので、詳しく教えて頂けないでしょうか。

宜しくお願い致します。

コード:

#include <stdio.h>
#include <stdlib.h>
#define anpan 140
#define jumpan 150
#define currypan 170
#define haitatu 300

int main(int kaisuu, char *kosuu[])
{
	int i;
	int k;
	int haitatu1 = 0;
	int goukei = 0;
	int sougoukei = 0;
	int pan = 0;
	for (i = 0; i < kaisuu; i++)
	{

		printf("%d番目の引数 = %s\n", i, kosuu[i]);
	}

	for (k = 1; k < kaisuu; k++)
	{

		if (*kosuu[k] == 'a')
		{
			pan = atoi(kosuu[k] + 1);
			goukei += pan * anpan;
		}


		else if (*kosuu[k] == 'j')
		{
			pan = atoi(kosuu[k] + 1);
			goukei += pan * jumpan;
		}

		else if (*kosuu[k] == 'c')
		{
			pan = atoi(kosuu[k] + 1);
			goukei += pan * currypan;

		}




	}



	if (goukei < 2000)

	{
		sougoukei = goukei + haitatu;


		printf("パン販売合計 %d円 配達料 %d円 合計%d円\n", goukei, haitatu, sougoukei);
	}

	else if (goukei >= 2000)
	{

		sougoukei = goukei;

		printf("パンの販売金額%d円 配達料 %d円 合計%d円\n", goukei, haitatu1, sougoukei);

	}
	

  return 0;

}
[/quote]

rui

Re: 構造体の使い方

#2

投稿記事 by rui » 10年前

rui さんが書きました:C言語初心者です。 今下記のような問題をしています。

パン屋から、配達する場合に、特別なお客様の場合は、お得意様ごとに設定した割引をして
販売したいので、注文の時に、お得意様コードとパン事の個数を入力すると販売価格を表示するプログラムを作る
通常のパンの単価 税込み あんぱん 140円 ジャムパン 150円 カレーパン170円で、配達料金は1回注文合計金額が2000円以下の
場合は300円かかります。しかし、特別なお得意様の場合の単価は、お得意様ごとの割引を引いた単価です。また配達料も、
お得意様ごとのパンの購入金額によって異なります。

得意様コード   得意様名          割引額                     配達料
                    あんぱん  じゃむぱん カレーパン 1000円以下 1500円以下 2000円以下
104251 鈴木一郎   5円       5円      10円       300円    280円    260円
104420 ○○○○○○   10円      10円      10円       300円    280円    250円
104755 ○○○○○○    0円      5円       5円       300円     290円   280円
203320 ○○○○○○   10円      10円      15円       300円    270円    250円
203321 ○○○○○○    5円      5円       5円       300円     290円   280円
203322 ○○○○○○   10円      15円      20円       290円     270円   250円

注文を受けた時に、得意様コードとパンごとの個数を、aアンパンの個数、jジャムパンの個数、cカレーパンの
個数の様に入力すること。
またプログラムを作成する時は、構造体を用いて行い、販売金額表示時にて、お得意様名を表示すること。

実行例

コマンド名 203320△ c10 △ j5△ a5
お得意様名 鈴木一郎 パン販売金額 3150円 割引額 250円 配達料 0円 合計 2900円

上記のような問題で、パンの種類と個数を入力し、購入金額合計を出し、購入金額合計が2000以下の場合の条件処理を作る所までは
できましたが、構造体を使用して、それぞれの得意様の場合の割引と配達を行う処理が分かりません。
C言語初心者なので、詳しく教えて頂けないでしょうか。

宜しくお願い致します。

コード:

#include <stdio.h>
#include <stdlib.h>
#define anpan 140
#define jumpan 150
#define currypan 170
#define haitatu 300

int main(int kaisuu, char *kosuu[])
{
	int i;
	int k;
	int haitatu1 = 0;
	int goukei = 0;
	int sougoukei = 0;
	int pan = 0;
	for (i = 0; i < kaisuu; i++)
	{

		printf("%d番目の引数 = %s\n", i, kosuu[i]);
	}

	for (k = 1; k < kaisuu; k++)
	{

		if (*kosuu[k] == 'a')
		{
			pan = atoi(kosuu[k] + 1);
			goukei += pan * anpan;
		}


		else if (*kosuu[k] == 'j')
		{
			pan = atoi(kosuu[k] + 1);
			goukei += pan * jumpan;
		}

		else if (*kosuu[k] == 'c')
		{
			pan = atoi(kosuu[k] + 1);
			goukei += pan * currypan;

		}




	}



	if (goukei < 2000)

	{
		sougoukei = goukei + haitatu;


		printf("パン販売合計 %d円 配達料 %d円 合計%d円\n", goukei, haitatu, sougoukei);
	}

	else if (goukei >= 2000)
	{

		sougoukei = goukei;

		printf("パンの販売金額%d円 配達料 %d円 合計%d円\n", goukei, haitatu1, sougoukei);

	}
	

  return 0;

}
[/quote]

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 構造体の使い方

#3

投稿記事 by みけCAT » 10年前

rui さんが書きました:構造体を使用して、それぞれの得意様の場合の割引と配達を行う処理が分かりません。
C言語初心者なので、詳しく教えて頂けないでしょうか。
・構造体(型)の宣言
・構造体の変数(それぞれの得意様の情報を配列などで持たせる)
・得意様コードの入力
・入力された得意様コードw得意様のリストから検索する
・検索結果を割引額と配達料に反映する
・お得意様名の表示

などをやるべきですが、何がわからないですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

rui

Re: 構造体の使い方

#4

投稿記事 by rui » 10年前

・構造体(型)の宣言
・構造体の変数(それぞれの得意様の情報を配列などで持たせる)
・得意様コードの入力
・入力された得意様コードw得意様のリストから検索する
・検索結果を割引額と配達料に反映する
・お得意様名の表示

などをやるべきですが、何がわからないですか?


ご返答有難うございます。

・構造体の変数
⇒構造体一つの宣言に対してその中に変数を作りそれぞれのお得意様の情報を配列で入れていくと言うでしょうか?
例えば 変数{104251 鈴木一郎   5円       5円      10円       300円    280円    260円}

上記のように入れていけばいいのでしょうか

・得意様コードの入力
⇒得意様コードの入力はargc argvで入力させようと思いますが、得意様コードを入力して、
得意様コードがこの人だと識別するために得意様のリスト検索とは、Defineで固定にし、
if(得意様コード == Define)のような作り方でそれぞれ得意様識別にifを使っていくのでしょうか。

・検索結果を割引額と配達料に反映する
⇒割引額と配達量に反映するとは処理のイメージが出来ませんでした。
もう少し詳しく教えて頂けないでしょうか。

・お得意様名の表示
⇒char型の変数から配列に格納しお得意様名を表示させる方法で出来るのではと思いましたが、
あっていますでしょうか。

当方C言語初心者のため、どのように考えるのか、どんな処理をすれば良いのか、
など頭の中で中々組み立てれない状態です。

少し砕いたお話(こんな考え方、こんなプログラムコードの処理を使えば出来る、これとこれをロジックでまとめれば出来るなど)を頂けないでしょうか。

大変お手数ですがご返答の方宜しくお願い致します。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 構造体の使い方

#5

投稿記事 by みけCAT » 10年前

rui さんが書きました:・構造体(型)の宣言
・構造体の変数(それぞれの得意様の情報を配列などで持たせる)
・得意様コードの入力
・入力された得意様コードw得意様のリストから検索する
・検索結果を割引額と配達料に反映する
・お得意様名の表示

などをやるべきですが、何がわからないですか?


ご返答有難うございます。
引用部は引用部だとわかりやすいようにしていただきたいです。
rui さんが書きました:・構造体の変数
⇒構造体一つの宣言に対してその中に変数を作りそれぞれのお得意様の情報を配列で入れていくと言うでしょうか?
例えば 変数{104251 鈴木一郎   5円       5円      10円       300円    280円    260円}

上記のように入れていけばいいのでしょうか

文法はめちゃくちゃですが、イメージとしてはあっていると思います。
【訂正】擬似コード(?)は正しそうですが、表現がわかりにくいので、もしかしたら違うかもしれません。
構造体の配列を作り、それぞれの要素にそれぞれのお得意様の情報を入れていくといいでしょう。

rui さんが書きました:・得意様コードの入力
⇒得意様コードの入力はargc argvで入力させようと思いますが、得意様コードを入力して、
得意様コードがこの人だと識別するために得意様のリスト検索とは、Defineで固定にし、
if(得意様コード == Define)のような作り方でそれぞれ得意様識別にifを使っていくのでしょうか。

それでもいいでしょう。ただし、C言語では文字列の比較に==は利用できません。

rui さんが書きました:・検索結果を割引額と配達料に反映する
⇒割引額と配達量に反映するとは処理のイメージが出来ませんでした。
もう少し詳しく教えて頂けないでしょうか。

まず、処理に利用するパラメータ(割引額と配達料)の初期値(割引額=全て0、配達料=300)を持った変数
(構造体の方がいいかも)を用意します。これをparamとします。
次に、上のif文の条件が真になったら、paramが持っているデータをそのお得意様に合ったパラメータに変更します。
そして、この検索処理が終わったら、計算処理でparamが持つパラメータを利用します。

rui さんが書きました:・お得意様名の表示
⇒char型の変数から配列に格納しお得意様名を表示させる方法で出来るのではと思いましたが、
あっていますでしょうか。

間違いです。char型では1文字(1バイト?)しか格納できないので、
char*型の変数またはchar型の要素を持つ配列を用いてください。
【追記】もしくは、わざわざ配列に格納せずに、文字列(の先頭)を指すポインタを用意し、
それを用いて該当のお得意様名を表示させるほうがいいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

rui

Re: 構造体の使い方

#6

投稿記事 by rui » 10年前

文法はめちゃくちゃですが、イメージとしてはあっていると思います。
【訂正】擬似コード(?)は正しそうですが、表現がわかりにくいので、もしかしたら違うかもしれません。
構造体の配列を作り、それぞれの要素にそれぞれのお得意様の情報を入れていくといいでしょう。
⇒お得意様の情報とはお得様の割引額や配達料も配列に入れるのでしょうか

コード:

struct otokui
{
	int code;		
	char *name[4];	
	int waribiki[2];
	int haitatu2[2];
};

        struct otokui h1 = { 104251, "鈴木一郎" };
	struct otokui h2 = { 104420, "田中次郎" };
	struct otokui h3 = { 104755, "松井英樹" };
	struct otokui h4 = { 203320, "山本太郎" };
	struct otokui h5 = { 203321, "加藤博正" };
	struct otokui h6 = { 203322, "小泉純二" };
[/code]

上記のような形なんでしょうか。


・得意様コードの入力
⇒得意様コードの入力はargc argvで入力させようと思いますが、得意様コードを入力して、
得意様コードがこの人だと識別するために得意様のリスト検索とは、Defineで固定にし、
if(得意様コード == Define)のような作り方でそれぞれ得意様識別にifを使っていくのでしょうか。

それでもいいでしょう。ただし、C言語では文字列の比較に==は利用できません。
⇒文字列以外での==はどのような処理がありますでしょうか。

まず、処理に利用するパラメータ(割引額と配達料)の初期値(割引額=全て0、配達料=300)を持った変数
(構造体の方がいいかも)を用意します。これをparamとします。
次に、上のif文の条件が真になったら、paramが持っているデータをそのお得意様に合ったパラメータに変更します。
そして、この検索処理が終わったら、計算処理でparamが持つパラメータを利用します。
⇒上の分がif文とはDefineの話のif文でしょうか。
また、paramが持っているデータをそのお得意様に合ったパラメータに変更をもう少し詳しく教えて頂けないでしょうか。

ご確認の方宜しくお願い致します。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 構造体の使い方

#7

投稿記事 by みけCAT » 10年前

rui さんが書きました:文法はめちゃくちゃですが、イメージとしてはあっていると思います。
【訂正】擬似コード(?)は正しそうですが、表現がわかりにくいので、もしかしたら違うかもしれません。
構造体の配列を作り、それぞれの要素にそれぞれのお得意様の情報を入れていくといいでしょう。
⇒お得意様の情報とはお得様の割引額や配達料も配列に入れるのでしょうか
はい。
rui さんが書きました:

コード:

struct otokui
{
	int code;		
	char *name[4];	
	int waribiki[2];
	int haitatu2[2];
};

        struct otokui h1 = { 104251, "鈴木一郎" };
	struct otokui h2 = { 104420, "田中次郎" };
	struct otokui h3 = { 104755, "松井英樹" };
	struct otokui h4 = { 203320, "山本太郎" };
	struct otokui h5 = { 203321, "加藤博正" };
	struct otokui h6 = { 203322, "小泉純二" };
[/code]

上記のような形なんでしょうか。
いいえ。
・nameは配列にせず、const char *型にした方がいいと思います。
・最初の仕様と比べて、waribikiとhaitatu2の要素数が足りない気がします。
rui さんが書きました:・得意様コードの入力
⇒得意様コードの入力はargc argvで入力させようと思いますが、得意様コードを入力して、
得意様コードがこの人だと識別するために得意様のリスト検索とは、Defineで固定にし、
if(得意様コード == Define)のような作り方でそれぞれ得意様識別にifを使っていくのでしょうか。

それでもいいでしょう。ただし、C言語では文字列の比較に==は利用できません。
⇒文字列以外での==はどのような処理がありますでしょうか。
==は数値(特に整数)やポインタの比較一般に利用します。
また、文字列でも1文字(バイト?)ずつ==で比較することで、一致判定を行うことが可能です。
rui さんが書きました:まず、処理に利用するパラメータ(割引額と配達料)の初期値(割引額=全て0、配達料=300)を持った変数
(構造体の方がいいかも)を用意します。これをparamとします。
次に、上のif文の条件が真になったら、paramが持っているデータをそのお得意様に合ったパラメータに変更します。
そして、この検索処理が終わったら、計算処理でparamが持つパラメータを利用します。
⇒上の分がif文とはDefineの話のif文でしょうか。
はい。
rui さんが書きました:また、paramが持っているデータをそのお得意様に合ったパラメータに変更をもう少し詳しく教えて頂けないでしょうか。
同じ構造体型の変数AとBでは、A=B;のような形でBの全データをAにコピーできます。
上の(不完全な)コードを利用して書くならば、

コード:

        struct otokui h1 = { 104251, "鈴木一郎" };
        struct otokui h2 = { 104420, "田中次郎" };

        struct otokui kokyaku = { 999999, "該当なし" };

        int otokuisama_code = 203320; /* 実際はコマンドライン引数から読み込む */

        if (otokuisama_code == h1.code) {
                kokyaku = h1;
        } else if(otokuisama_code == h2.code) {
                kokyaku = h2;
        }
のような形になります。(このコードではkokyakuがparamにあたります)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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