質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

778閲覧

このコードをまとめたいです

BizarreWanderer

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2021/06/18 14:52

このようなプログラムをうったのですが、
int price = Shop("薬草");
money -= price;
price = Shop("万能薬");
money -= price;
このShopの部分を一つにまとめることはできないでしょうか??
薬草と万能薬とをコンマで区切ると
引数 2 を指定するメソッド 'Shop1' のオーバーロードはありません
とでてきてエラーになります

using System; namespace ConsoleApp2 { class Program { static void Main(string[] args) { // Plactise3-21 static int Shop(string itemName) { int price = 0; Console.WriteLine("いらっしゃいませ!"); if (itemName == "薬草") { Console.WriteLine(itemName + "は100円です"); price = 100; } else if (itemName == "棍棒") { Console.WriteLine(itemName + "は1500円です"); price = 1500; } else if (itemName == "万能薬") { Console.WriteLine(itemName + "は500円です"); price = 500; } return price; } int money = 2500; Console.WriteLine("所持金は" + money + "円です"); int price = Shop("薬草"); money -= price; price = Shop("万能薬"); money -= price; Console.WriteLine("所持金は" + money + "円です"); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

まとめるという意味が良く判らないんですが、一回の呼び出しで複数の商品名を渡したいって事ですか?Shopの引数を配列かListにすればいいと思いますが。

とりあえずShopの宣言をこんな感じにして、

C#

1static int Shop(string[] itemNames)

こんな感じで渡せます。

C#

1int price = Shop(new string[] { "薬草", "万能薬"});

配列にした場合のShopの処理は、自分で考えてみてください。

投稿2021/06/18 15:28

編集2021/06/18 15:32
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/18 15:30

あとはどうでもいいですけど、× Plactise 〇 practice
BizarreWanderer

2021/06/19 08:57

ありがとうございます! 配列にすればいいんですね 下にかいてあるnewをつける意味はどういったものがあるのでしょうか?
退会済みユーザー

退会済みユーザー

2021/06/19 09:07 編集

とりあえずこちらを読んでください。("C# new" でググッてトップに出てきます) https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/new-operator 言語仕様に関する事は、基本的にMSのドキュメントを読めば詳細にサンプル付きで記載されていますので、言語仕様の疑問はまずMSのドキュメントを確認する事をお勧めします。
BizarreWanderer

2021/06/19 09:13

わかりました! ありがとうございます!
guest

0

radianさんの回答とほぼ同じなんですが、コンマ区切りで引数を複数指定したい場合の例として書いておきます。

C#

1using System; 2 3namespace ConsoleApp2 { 4 class Program { 5 static void Main(string[] args) { 6 int money = 2500; 7 Console.WriteLine("所持金は" + money + "円です"); 8 int price = Shop("薬草", "万能薬"); 9 money -= price; 10 Console.WriteLine("所持金は" + money + "円です"); 11 Console.Read(); 12 } 13 static int Shop(params string[] itemNames) {//このparamsが肝 14 int price = 0; 15 Console.WriteLine("いらっしゃいませ!"); 16 17 foreach (var itemName in itemNames) { 18 if (itemName == "薬草") { 19 Console.WriteLine(itemName + "は100円です"); 20 price += 100; 21 } else if (itemName == "棍棒") { 22 Console.WriteLine(itemName + "は1500円です"); 23 price += 1500; 24 } else if (itemName == "万能薬") { 25 Console.WriteLine(itemName + "は500円です"); 26 price += 500; 27 } 28 } 29 return price; 30 } 31 } 32}

投稿2021/06/18 15:55

Hey_CH

総合スコア437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/18 17:15

課題か練習問題っぽいのをやってるのを処理の実装まで書くのは本人の為にならないのでは?
Hey_CH

2021/06/19 01:53

課題なんて書いてないですし、teratailって質問に対する回答を書く場で、質問者さんを育てる場と思ってないので、質問者さんが言及していることに対して、こういうのもあるよって事で書きました。 お気に障ったのなら申し訳ないです。
BizarreWanderer

2021/06/19 09:01

ありがとうございます! まだそこまで学んでいないので分からないことがおおいんですけど var itemName in itemNameとは普通に代入しているのとわけが違うのでしょうか?
Hey_CH

2021/06/19 09:12

foreach (var itemName in itemNames)の部分でしょうか? itemNames(このコードでは配列)から1つずつ取り出し、itemNameに代入するという感じの意味になります。 配列から要素を取り出す場合のfor文との違いは、for文は要素の数や位置を指定できるのに対し、foreachは全要素に対して処理を行うって事でしょうか。 よくわからない場合は「C# foreach」で検索してみてください。
BizarreWanderer

2021/06/19 09:14

そうです! 検索してみます!ありがとうございます
guest

0

まさにエラーに表示されているオーバーロードという機能を使えばできると思いますよ。
オーバーロードというのは、同じメソッド名で引数の並びや数、型が異なるもののことです。
詳しくは調べてみてください。

どういう処理を想定していて、戻り値どうしたいのはわかりませんが、以下のような
定義をすればいけると思います。

static int Shop(string itemName,string itemName2){ // 処理 }

投稿2021/06/18 15:07

Crimson_Tide

総合スコア509

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BizarreWanderer

2021/06/19 07:18

ありがとうございます! このメソッドを呼び出すときは必ず、この引数をふたつ呼び出さないといけないんでしょうか??
Crimson_Tide

2021/06/19 07:43

今後のためにもオーバーロードなんぞやというものを調べてみてください。 簡単に言えば、引数のパターンを引数の型や並びの違いで同じメソッド名で複数定義できる機能です。 同じような処理なのに、メソッド名を ShopKai(string itemName,string itemName2) とメソッドを 増やしていくとメンテナンス性が損なわれますよね。 既に定義されているstatic int Shop(string itemName) ではstring型引き数が1つ受け取ることしかできません。 そのためShop("薬草") という使い方しかできません。2つ受け取ることは想定していないので当然エラーがでます。 私の回答にある static int Shop(string itemName,string itemName2){ も”追加”で定義すると、 Shop("薬草","万能薬") 場合は 追加した場合の処理を。 Shop("薬草") の場合は、BizarreWandererさんが既に作成されている処理が実行されます。 どちらか一方ではなく、どちらも使えます。 他の方が回答されているように配列を受け取るようにして、配列を渡すようにすれば何の処理をしたいかによりますが、引数の数を意識しなくてよくはなりますね。
Crimson_Tide

2021/06/19 08:11

結局のところShopメソッドで何をしたいか、どのように使うか次第です。 追加した場合、引数1つと引数2つの両方同時に使えますが、両方使う必要がなければ追加ではなく単に修正すればいいだけです。その場合オーバーロードを使用する必要はありませんね。 質問では Shop("薬草"); とShop("万能薬");をまとめたい、「薬草と万能薬とをコンマで区切る」 とあるのでその場合どうしたら実現できるかだけを回答しました。 まとめることでShopメソッドをどうしたいのかまでは私にはわかりません。 Shopメソッドの引数に1以上の商品を複数指定して、その値段の合計値を返したいということなら、Hey_CHさんの回答のようにすればよいでしょう。
Zuishin

2021/06/19 08:12

いやさすがにこういうオーバーロードの使い方はしないです。
Crimson_Tide

2021/06/19 08:33

すみません、経験不足で できること と できるけど一般的にこういった使い方はしない(という意味かと推察しますが) ということまではわかりません。 認識に誤りがあるようでしたら、どのように誤りで、どういう使い方をするのかご指摘頂ければ幸いです。
Crimson_Tide

2021/06/19 08:39

オーバーロードして同じメソッドなのに全く異なる処理をする ということであればご指摘の通りかと思います。その場合はオーバーロードではなく、別メソッドにすべき・・ですかね。
BizarreWanderer

2021/06/19 08:55

なるほど、オーバーロードのべんきょうをしてみます!
Zuishin

2021/06/19 09:44 編集

同種のデータが複数ある場合は配列やリストを使います。 わざわざ変数をデータの数だけ作ったりはしません。 同様に、渡すデータが item1 item2 item3 のようなものであれば、その数だけオーバーロードを作ることはせず、配列や IEnumerble<> を引数にします。 この時、Hey_CH さんのように params を使うと非常に使い勝手が良くなります。 オーバーロードを使うのは引数の種類が違う場合で、その場合は省略可能引数も選択肢に入ります。
Crimson_Tide

2021/06/19 10:30

Zuishinさん ご丁寧な説明ありがとうございます。不勉強でした、とても参考になります。 BizarreWandererさん 私の回答や説明は適切ではありませんでした。申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問