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

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

新規登録して質問してみよう
ただいま回答率
85.47%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

C#

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

Q&A

解決済

1回答

4123閲覧

簡単な数値カウントプログラムです。沢山の回答をお待ちしております。

megumi11222000

総合スコア11

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

C#

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

0グッド

0クリップ

投稿2015/12/04 01:53

編集2015/12/04 08:12

###前提・実現したいこと
VB.netでとあるルールを元に数値をカウントする簡単なプログラムを作成しています。実現する方法は様々ですが皆さんならどの様なプログラムを作成しますか?

※速度重視、可読性重視など、個人的なコメントもあればぜひ!

###ルール
Excel(csv)でデータを読み込みます。
A列、B列、C列にはそれぞれランダムで「1」が入ってきます。A>B>Cの順で1が入っている場合のみ、数値をカウントします。但し、A列が1の場合、数値は一度0に戻ります。

###例
イメージ説明

上記ですと、A1でカウント0、B2,3,4でカウント1,2,3、C1,2でカウント4,5となります。次にA4に1が入っているため、再度カウントは0に戻り,B4でカウント1、C4,5,6でカウント2,3,4となります。

出力例)
012345601234

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

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

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

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

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

izkn

2015/12/04 01:58

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
Alice0225

2015/12/04 02:06

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
Alice0225

2015/12/04 02:14 編集

B1がカウントされないのはなぜですか? 上記例ですと012345601234が正しい出力だと思われるのですが。
daichan

2015/12/04 02:09

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
megumi11222000

2015/12/04 02:25

失礼致しました、私の誤記です。出力例は、Alice0225 さんの仰るとおりになります。
Chironian

2015/12/04 02:34

スキャン方向に強い違和感を感じます。右方向にスキャンして列が尽きたら改行の間違いではないですよね?(A1でカウント0、B1, C1, B2, C2, B3でカウントアップの意味。) 後、ここで訂正しても見づらいですので、できれば元の質問文を修正された方がスムーズと思いますよ。
ozwk

2015/12/04 02:38

意見を募るふりをして丸投げしていると穿った見方をする(私みたいな)人もいるので、まずあなたの実装を書いてください。
megumi11222000

2015/12/04 03:10

>Chironianさん 質問内容については後で修正しようと思います。ご指摘有難う御座います。 列が尽きたら改行ではなく、A列を基準にB列C列をカウントする形でしょうか…。出力例をご参考いただければと思います。 >ozwkさん まだ実装前でしたので、私も考え、出来たらあげようと思います。ただ、あくまで本質問は私や他の方のソースに対する意見ではなく、自身ならどうするかという内容ですので、そこはご理解頂ければと思います。
Chironian

2015/12/04 03:45 編集

列が尽きたら改行でも、出力例と同じ出力になると思いますよ。 より簡単なスキャンで同じ出力を得ることができるのであれば、何故に複雑なスキャンが必要なのか、主旨を明確にしておくと好ましいと思います。
tozjp

2015/12/04 07:27

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
tanat

2015/12/04 09:12

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
guest

回答1

0

ベストアンサー

プログラム初心者です。
書き方は多分無駄が多い書き方になってしまっていると思います。
(VB.NETはほぼ触ったことがないので調べながらで簡単に作りました)

VB.NET

1Module Module1 2 3 Sub Main() 4 5 Dim FileName As String = "sample.csv" 6 Dim A_Data() As String 7 Dim B_Data() As String 8 Dim C_Data() As String 9 Dim B As Integer 10 Dim C As Integer 11 12 Dim reader As New IO.StreamReader(FileName, System.Text.Encoding.GetEncoding("shift-jis")) 13 Dim itm() As String '行の項目の配列 14 Dim i As Integer = 0 15 Dim iMax As Integer = 0 16 17 ReDim A_Data(reader.Peek()) 18 ReDim B_Data(reader.Peek()) 19 ReDim C_Data(reader.Peek()) 20 21 While (reader.Peek() >= 0) 22 23 itm = reader.ReadLine.Split(","c) '一行読み込み、カンマで区切る 24 25 A_Data(i) = itm(0) 26 B_Data(i) = itm(1) 27 C_Data(i) = itm(2) 28 29 i = i + 1 30 31 End While 32 33 For a As Integer = 0 To i 34 35 B = 1 36 37 If A_Data(a) = "1" Then 38 Console.Write("0") 39 i = a 40 41 While B_Data(i) = 1 42 Console.Write(B) 43 B = B + 1 44 i = i + 1 45 End While 46 47 C = B 48 i = a 49 50 While C_Data(i) = 1 51 Console.Write(C) 52 C = C + 1 53 i = i + 1 54 End While 55 56 End If 57 58 Next 59 60 Console.ReadKey() 61 62 End Sub 63 64End Module

一応動作はそれっぽく動いたかと思います。
汚いコードでスミマセン…

12/04 13:20 追記
考え方としては
CSVファイルから一行ずつ文字列を取得し、カンマ分割して配列へ。
a番目のA_Dataが1なら0を出力
a番目のB_Dataが1なら初回は1を出力、さらに連続して縦方向に1が続く場合は+1しながら出力を続ける
a番目のC_Dataが1ならB_Dataで出力した数字の続きから出力、B_Data同様連続して縦方向に1が続く場合は+1しながら出力を続ける
といった具合です。
わかりにくかったらすみません

投稿2015/12/04 03:37

編集2015/12/04 04:23
Alice0225

総合スコア206

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

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

megumi11222000

2015/12/04 08:54

回答有難う御座います。 私の方でも考えてみたんですが、Alice0225 さんと類似したような形となりました。 メモ帳でかいたので動かしてなくてすみません。大枠としては、 ’CSV読み込み Dim m As String() Using p = New FileIO.TextFieldParser('CSVファイル', System.Text.Encoding.Default) While Not p.EndOfData m = p.ReadFields ’mをDataTableに一旦つめこみ End While End Using Dim ACount As Integer = 0 Dim BCount As Integer = 0 Dim CCount As Integer = 0 For i As Integer = 0 To datatable.Rows.Count - 1 Do 'ここで0出力(A列として) While datatableの最後又は datatable.rows(ACount + BCount).items("A列") が 空の間まわる BCount+=1 'ここでBCount+1出力(B列として) End While CCount = BCount+1 While datatableの最後又は datatable.rows(ACount + CCount).items("A列") が 空の間まわる CCount=BCount+1 'ここでCCount+1出力(C列として) End While ACount+=BCount Loop Until datatableの最後又はAが1だったらぬけ ’BとCのCountクリア i += ACount Next 類似というのは、Forがありその中にWhileが二つ入りこむようなプログラムです。 Do-Loopが入ってる分私のプログラムは効率が悪いかもしれません。 私は多少の無駄があっても誰もが読みやすいものであれば、可読性があがり良いプログラムだと思っています。 効率性やそうした意味も含めるとAlice0225 さんの方が良いプログラムのように思います。
Alice0225

2015/12/04 08:58

私の拙いコードでお役に立てたのであれば幸いです。 もう少し効率よく書けそうな気がしないでもないのがちょっと歯がゆいですね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問