痔になりやすい生活習慣とは?

いつもお世話になります。
複数の.datファイル(カンマ区切りの4~5列、約800行程度)
ProcessData,LOT_ID,3,AP0076686.00C,
ProcessData,LOT_ID_SUB,3,AP0076686.00,
ProcessData,LOT_NO,3,AP0076686,
ProcessData,WAFER_ID,3,AP0076686.19,
ProcessData,WAFER_NO,1,19,
ProcessData,PRODSPEC_ID,3,T5DH20001-00001.00,
ProcessData,PRODGRP_ID,3,T5DH2,
ProcessData,PRODGRP_BIND,3,T5DH2,
ProcessData,MAIN_MAINPD_ID,3,A6L511NY.00,
ProcessData,MAINPD_ID,3,A6L511NY.00,
ProcessData,FLOW_TYPE,3,Main,
ProcessData,FLOW_TYPE_NO,1,1,
ProcessData,D_SEQNO,1,169,
ProcessData,OP_NO,3,PNH PEP.MA1,
ProcessData,OP_NO_NAME,3,本処理,
ProcessData,PD_IDENT,3,PPNHIMA1.00,
ProcessData,PD_IDENT_NAME,3,PEP,
ProcessData,EQP_GROUP_CODE,3,PKRF,
ProcessData,EQP_GROUP_NAME,3,KrF SCANNER(SK3000 + ES5),
ProcessData,EQP_GROUP_BIND,3,PKRF,
ProcessData,EQP_ID,3,PKRF004,
ProcessData,PH_RECIPE_ID,3,PES5MIX,
ProcessData,RCP_NAME_SPACE,3,PEPMA,
ProcessData,LC_RECIPE_ID,3,PKRF.01,
ProcessData,RECIPE_ID,3,PEPMA.PES5MIX,
ProcessData,S_DATE,4,2019/01/24 12:47:09,
ProcessData,E_DATE,4,2019/01/24 12:47:51,
ProcessData,CAST_ID,3,PA0-00349,
ProcessData,SLOT_NO,1,19,

の中からSplitを用いて string[]dataTemp = fileData.Split(',');で
(ProcessData[0],EQP_ID[1],3[2],PKRF004[3],)のように配列に格納して
ifを使ってdataTemp[1] == "EQP_ID"の時にdataTemp[3](PKRF004)を
    dataTemp[1] == "LOT_ID"の時にdataTemp[3] (AP0076686.00C)を
    dataTemp[1] == "WAFER_ID"の時にdataTemp[3] (AP0076686.19)を
dataTemp[1] == "S_DATE"の時にdataTemp[3](2019/01/24 12:47:09)を
新たにCSVファイルを作成して上記のデータを入力したリストを作りたいのですが、C#初心者で
色々と試行錯誤しましたが知識が足りないようです。。。。


リストについてはヘッダーなどは必要ありません。.datが大量にあるので一列にEQP_ID、LOT_ID、WAFER_ID、S_DATEが並んだ状態で何100行とある状態リストを作成したいです。

詳しい方ご教授をお願いいたします。

質問者からの補足コメント

  • うーん・・・

    詳しい説明ありがとうございます。
    初心者なものでいくつか質問致します。
    // 読み込み
    using (var sr = new StreamReader("test.dat"))
    using (var inputDat = new CsvHelper.CsvReader(sr))
    の部分ではファイルの場所がSystem.IO.FileNotFoundException: 'ファイル 'C:\Users\source\repos\ConsoleApp1\ConsoleApp1\bin\Debug\test.dat'なのですが任意のフォルダを指定する場合はどのようにしたらよいでしょうか?またフォルダ内に複数のdatファイルがある為 *.datで全てを読み込みたいのですがどのようにしたらよいでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2019/04/02 10:32
  • うーん・・・

    何度も申し訳ございません。
    // 書き出し
    using (var sw = new StreamWriter("newdat.dat"))
    using (var outputDat = new CsvHelper.CsvWriter(sw))の部分ですが、最終的にCSVファイルでリストを残したいのですがnewdat.datをlist.csvなどに書き換えればよいのでしょうか?
    またこのnewdat.datの保存場所が分からないです。。。(;^_^A
    任意の場所に指定できるのであれば教えていただきたいです。

      補足日時:2019/04/02 10:36
  • うーん・・・

    //"C:\test"以下の".txt"ファイルをすべて取得する
    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"C:\検証用\検証データ\MLOG_RCV\");System.IO.FileInfo[] files =di.GetFiles("*.dat", System.IO.SearchOption.AllDirectories);
    のように指定するとよいと思うのですが、回答1で教えていただいたコードのどの部分に追加すればよいのかがまだ分かっておりません。。。何度も申し訳ないですが宜しくお願い致します。
    読み込むdatファイルはC:\検証用\検証データ\MLOG_RCVにあり
    書き込むcsvファイルをC:\検証用\検証データ\MLOG_RCV\BACKUP\でList.csvにしたいです。

    No.3の回答に寄せられた補足コメントです。 補足日時:2019/04/02 15:09
  • つらい・・・

    何度も詳しい解説ありがとうございます。
    C#を最近勉強し始めたばかりで知らない言葉が沢山ありやっていることは単純でも混乱していました。絶対パスについてStream Reader("C:\検証用\検証データ\MLOG_RCV")のようにしたらエラーで「認識できないエスケープシーケンスです。」と出てしまい、書き方が間違えているのですが、なかなか思った通りに実装することができません。イメージとしては1部分をフォルダ内に*.datがある限り繰り返すwhileなどを使ったりするとよいのかと思うのですが、変にソースコードをいじってしまいエラーが・・・・

    No.4の回答に寄せられた補足コメントです。 補足日時:2019/04/02 18:09
  • うーん・・・

    数日かけての回答ありがとうございます。独学だと正しい書き方なども分からずサンプルも上手く使えないみたいです。 class DatRowValuesやclass NewDatRowValues、 class NewDatRowValuesMapper : CsvHelper.Configuration.ClassMap<NewDatRowValues>の中身については変更はしなくてよいという認識で間違いないでしょうか?{get ; set}を使ったことがなくてサンプルでもまだ完全には理解できてないみたいです。class Program内ですがvar path = @"C:\検証用\検証データ\MLOG_RCV";とforeach (var fi in files) {Console.WriteLine(fi.FullName);
    }を追加したのですが、エラーや警告が消えないみたいです。

    No.5の回答に寄せられた補足コメントです。 補足日時:2019/04/03 09:30
  • うーん・・・

    基礎的な部分ができていないので・・・using (var sr = new StreamReader(@"C:\検証用\検証データ\MLOG_RCV"));部分のemptyステートメントが間違っている可能性がありますという警告と
    var path = @"C:\検証用\検証データ\MLOG_RCV";
    foreach(var fi in files)
    {
    Console.WriteLine(fi.FullName);
    }
    の変数'path'は割り当てられていますが、その値は使用されていません。と
    現在のコンテキストに'㏛'という名前は存在しません。
    現在のコンテキストに'files'という名前は存在しません。
    現在のコンテキストに'sw'という名前は存在しません。のエラーが出ています。

      補足日時:2019/04/03 09:58
  • うーん・・・

    失礼しました。emptyステートメントについては セミコロンを間違えて入れていたので消したことで警告が消え、
    エラーと警告は変数'path'は割り当てられていますが、その値は使用されていません。と
    現在のコンテキストに'files'という名前は存在しません。のみになりました。

      補足日時:2019/04/03 10:02

A 回答 (6件)

質問内容が多岐に渡ってきているため、どこまで出来て、どこが出来ないのか、を整理して、


改めて質問を行うことをお勧めします。

今できないのは、元の質問内容ではなく、それぞれのロジックの書き方を理解していませんよね。
C#の文法。
対象ディレクトリ内のファイルの一覧を得るにはどうすればいいのか。
ファイルの読み込み、書き出しをするにはどうすればいいのか。
繰り返し処理するにはどうすればいいのか。
など。

最終目的を質問しても、誰も正解は教えてくれませんし、ネットには正解は転がっていません。
知識、情報を組み合わせて正解を作り上げるので。

そのため、実現するためのプロセスを細分化し、プロセス単位に方法論をネットで調べるとか、質問するとかになると思います。
    • good
    • 1

> 絶対パスについてStream Reader("C:\検証用\検証データ\MLOG_RCV")のようにしたらエ


> ラー
C#は、文字列内に\を入れるなら@を先頭に記述してください。
var path = @"C:\検証用\検証データ\MLOG_RCV";

GetFiles()によって配列で受け取っているので
foreach (var fi in files) {
Console.WriteLine(fi.FullName);
}
という書き方でいいです。

一度にやりたいことができないなら、1つ1つ順番に学ぶしかありませんね。
この回答への補足あり
    • good
    • 1

私が提示したものは、以下のことしかしていません。


 1.1ファイルの読み込み、解析、必要情報の保持。
 2.ファイルの書き出し。

ファイルの読み込みが複数ファイルあるならば、1.部分をファイル数分実施すればいいことになります。

FileInfoにはFullNameプロパティがあり、ファイルの絶対パスを得ることができます。
https://docs.microsoft.com/ja-jp/dotnet/api/syst …

書き出すファイル名は求める仕様に合わせて自由に設定してください。

実装が分からないというよりかは、どうすると実現できるのかがぼんやりしているのではないでしょうか。
この回答への補足あり
    • good
    • 1

System.IO.Path, System.IO.File, System.IO.Directoryあたりを眺めてみてはいかがですか。



https://dobon.net/vb/dotnet/file/getfiles.html

ファイル名も絶対パス指定すればその通りになります。
この回答への補足あり
    • good
    • 1

TextFieldParser で読む。


例はなんぼでも転がっているので略。
    • good
    • 1

[Nugetパッケージの管理]から CsvHelper をインストール。



複数ファイルを読み込んで書き出し用リストに突っ込めば出来ると思います。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace ConsoleApp1
{
class DatRowValues
{
public string ProcessData { get; set; }

public string KeyValue { get; set; }

public int IntValue { get; set; }

public string StringValue { get; set; }
}

class NewDatRowValues
{
public string EqpId { get; set; }

public string LotId { get; set; }

public string WaferId { get; set; }

public DateTime SDate { get; set; }
}

class NewDatRowValuesMapper : CsvHelper.Configuration.ClassMap<NewDatRowValues>
{
public NewDatRowValuesMapper()
{
Map(x => x.EqpId).Index(0);
Map(x => x.LotId).Index(1);
Map(x => x.WaferId).Index(2);
Map(x => x.SDate).Index(3).TypeConverterOption.Format("yyyy/MM/dd HH:mm:ss");
}
}

class Program
{
static void Main(string[] args)
{
// 書き出し用の入れ物を用意
var writeDatList = new List<NewDatRowValues>();

// 読み込み
using (var sr = new StreamReader("test.dat"))
using (var inputDat = new CsvHelper.CsvReader(sr))
{
inputDat.Configuration.HasHeaderRecord = false;

// 必要なキーとなる行のみ抽出
var dat = inputDat.GetRecords<DatRowValues>();
var targetRows = dat.Where(r =>
r.KeyValue == "EQP_ID" ||
r.KeyValue == "LOT_ID" ||
r.KeyValue == "WAFER_ID" ||
r.KeyValue == "S_DATE");

// それぞれの値を格納
var newRow = new NewDatRowValues();
foreach (var row in targetRows)
{
if (row.KeyValue == "EQP_ID")
{
newRow.EqpId = row.StringValue;
}
if (row.KeyValue == "LOT_ID")
{
newRow.LotId = row.StringValue;
}
if (row.KeyValue == "WAFER_ID")
{
newRow.WaferId = row.StringValue;
}
if (row.KeyValue == "S_DATE")
{
newRow.SDate = DateTime.Parse(row.StringValue);
}
}
writeDatList.Add(newRow);
}

// 書き出し
using (var sw = new StreamWriter("newdat.dat"))
using (var outputDat = new CsvHelper.CsvWriter(sw))
{
outputDat.Configuration.HasHeaderRecord = false;
outputDat.Configuration.RegisterClassMap<NewDatRowValuesMapper>();
outputDat.WriteRecords(writeDatList);
}
}
}
}
この回答への補足あり
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q関数によって、MAX_PATHの値が異なる理由を教えてください。

MAX_PATHは260固定なのに、関数によって異なる理由を教えてください。

CreateFileは259文字まで、それ以上は関数が失敗します。
MakeSureDirectoryPathExistsは248文字まで、それ以上は関数が失敗します。
renameは220文字まで、それ以上は関数が失敗します。

Aベストアンサー

昔のファイルシステム(FAT)ではパス名の最長が255文字に制限されていました。
それに、ドライブレター等(C:¥)3文字とファイル名(8+3)の間のピリオド1文字で
255+3+1=259文字が最長パスです。
さらに、C言語で作成されたライブラリでは、
文字列の末尾にはNull文字(0x00)を付ける約束になっています。
それを含めて、MAX_PATH=260 となっています。
今どきのファイルシステム(NTFS)とはかなり違いますよね。
そんな訳で、時代とともに移り変わるシステムの中身が、
統一が取れているはずと思う方がおかしい。

Qスーパーハッカーやホワイトハッカーが未だにプログラムをキーボードを使ってアナログな入力を10年前と変

スーパーハッカーやホワイトハッカーが未だにプログラムをキーボードを使ってアナログな入力を10年前と変わらずに未だにガチガチキーパンチャーしてるのって一般人から見たら超絶ダサいらしいですよ。

マツコデラックスがスーパーハッカーがプログラムをキーボードで打っていたのを見て「まだキーボードで打ってるんだ。人工知能や音声を文字化出来るようになってるのに10年前と変わらずキーボードで打ってるの?!」と言っていましたが、本当にそうだなと思いました。

未だにキーボードでプログラミングしてるって古くさいというか自動化、自動化と言ってる割にプログラマーが1番アナログだったりして。

Aベストアンサー

それは普通の文章入力しか想像できない人の発想ですね。

プログラミング言語では記号を多用しますが、これをいちいちダブルコーテーションだのアットマークだの言うのは手間だし、実は記号じゃなくてダブルコーテーションは”じゃなくそのままダブルコーテーションっていう文字列にしたかったんだけど…みたいな区別に困ることもあります。その辺をきれいに解決する手段が今のところないってこと、また「キーボード入力の方が話すよりも速くてしかも正確に入力できる」と言う事実があること、またいちいち口に出すと言うことは意外に労力を要すること、といった事情から音声認識でどうにかしようという空気にならないのでしょう。

QC#について質問【足し算】

C#超初心者です。

標準入力から2つの正の整数a,bが入力されます。aとbを足した数を出力するのですが、

入力は以下のフォーマットで与えられます。
a b
aとbの間には半角スペースが入っています。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
aとbを足した数を出力して下さい。
最後は改行し、余計な文字、空行を含んではいけません。

入力例1
1 1

出力例1
2

入力例2
0 99

出力例2
99


public class Sum{
public static void Main(string[]args){
var line = System.Console.ReadLine();
int[]ab = line.Split(' ');
System.Console.WriteLine(ab[0] + ab[1]);
}
}


Splitを使って半角スペースで文字列を分割しましたが。int型ではないので足し算をしても「11」に
なるようです。string型からint型への変換は可能でしょうか?
また上記のコードも間違えているのでどなたかご教授をお願い致します。

C#超初心者です。

標準入力から2つの正の整数a,bが入力されます。aとbを足した数を出力するのですが、

入力は以下のフォーマットで与えられます。
a b
aとbの間には半角スペースが入っています。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

期待する出力
aとbを足した数を出力して下さい。
最後は改行し、余計な文字、空行を含んではいけません。

入力例1
1 1

出力例1
2

入力例2
0 99

出力例2
99


public class Sum{
public static v...続きを読む

Aベストアンサー

int.Parse(ab[0]) + int.Parse(ab[1])

QC++を本で独学してますが、配列とポインタでわからないところがあります。

現在C++を本で独学しており、ポインタの章を終えて配列の章を
学んでいるのですがでわからないところがあります。

『配列名は配列の先頭要素のアドレスをあらわす。』と習ったのですが、
下記のコードにての

#include <iostream>
using namespace std;

int main()
{
char str[] = "Hello";
cout << str << '/\';
return 0;
}

を実行すると"Hello"が出力されるとのことですが、
どうしてchar型配列strの要素をそのまま出力することになるのでしょうか?
この場合、『配列名は配列の先頭要素のアドレスをあらわす。』に
のっとれば出力されるのは「char型配列strの先頭要素のアドレス」に
なり、アドレスが出力されなければおかしいと思うのですが・・・?

同様に

#include <iostream>
using namespace std;

int main()
{
char* char = "Hello";
cout << str << '/\';
return 0;
}

のコードでもどうして間接参照演算子*さえ使わずに
strの要素を出力できるのかがさっぱりわかりません。

ご説明頂ければ幸いです。

現在C++を本で独学しており、ポインタの章を終えて配列の章を
学んでいるのですがでわからないところがあります。

『配列名は配列の先頭要素のアドレスをあらわす。』と習ったのですが、
下記のコードにての

#include <iostream>
using namespace std;

int main()
{
char str[] = "Hello";
cout << str << '/\';
return 0;
}

を実行すると"Hello"が出力されるとのことですが、
どうしてchar型配列strの要素をそのまま出力することになるのでしょうか?
この場合、『配列名は配列の先頭要素...続きを読む

Aベストアンサー

cout の << は。その後の型によって何を表示するかが変わります。
このような仕組をポリモーフィズムと言って、C++の重要な仕組の一つです。


他のポインタだと、そのアドレスを出力する、となっています。
対して、 char * だと「その示すアドレスから順番に、'\0'の前までの『文字』を出力する」となっています。

これは、以下のような理由があります。
・C++の元になったC言語では、「文字列型」というものが無く、「charの配列の先頭から'\0'の前までを文字列として扱う」というルールを使っている。
C++でも、そのルールを引き継いで、char * / char[] を文字列として扱うケースが多い。
・cout << にchar * を指定したとき、圧倒的に「文字列を出力したい」ケースが多い


アドレスを出力させたいのなら、char *でないポインタにキャストすることです。
そういう時は、汎用につかえる void * にキャストするのが常套手段です。

C言語由来の記法では (void * ) str と、(型)とします。
ですが、このキャストはなんでも有りすぎるので、C++ではC++専用のキャスト方法が用意されているので、そちらを使いましょう。
static_cast<void *>(str)

cout の << は。その後の型によって何を表示するかが変わります。
このような仕組をポリモーフィズムと言って、C++の重要な仕組の一つです。


他のポインタだと、そのアドレスを出力する、となっています。
対して、 char * だと「その示すアドレスから順番に、'\0'の前までの『文字』を出力する」となっています。

これは、以下のような理由があります。
・C++の元になったC言語では、「文字列型」というものが無く、「charの配列の先頭から'\0'の前までを文字列として扱う」というルールを使っている。
C++で...続きを読む

QC#言語学んで

実際にプログラム打ち込んでも無反応です
何か打ち込んでもダメです
そしてエラーが起きます

Aベストアンサー

> そしてエラーが起きます

という事は、開発環境なんかはインストール、設定されてるって事ですね?

まずは、サンプルプログラムを打ち込む、というかコピペしてみては。

Microsoft .NET - Hello World -- 最初のプログラム (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/inside-a-program/hello-world-your-first-program

で、エラーが出るなら、エラーメッセージの内容を提示すると、問題解決の手掛かりになるかも。

QC言語、変数のスコープ

下のようなプログラムを作りました。

変数nの宣言の場所なのですが、最初main()関数の中で宣言していましたが、コンパイル時にエラーとなり、下記のようにmain()の外に出したらうまくコンパイルされ、実行結果も期待通りになりました。

そこで質問ですが、最初のようにmain()関数内で宣言すると、呼び出した関数内ではその変数は無効になるということでしょうか。

ちなみにnは、計算対象のデータ数で、main()関数内でコンソール入力によって決定します。

関数を呼び出したら親子のような関係という先入観があり、子の関数でも有効になるように思っていました。

抽象的かもしれませんが、よろしくご教授をお願いします。

◆◆◆◆◆◆◆◆◆◆
void fucnA(...);
void funcB(...);
void funcC(引数にnを含む);

int n;

int main(void)
{
...
(nを使用)
fucnC(引数にnを含む);
funcA(...);
funcC(引数にnを含む);
...
}

void funcA(...)
{
...
funcC(引数にnを含む);
...
}

void funcB(...)
{
...
}

void funcC(引数にnを含む)
{
(nを使用)
}
◆◆◆◆◆◆◆◆◆◆

下のようなプログラムを作りました。

変数nの宣言の場所なのですが、最初main()関数の中で宣言していましたが、コンパイル時にエラーとなり、下記のようにmain()の外に出したらうまくコンパイルされ、実行結果も期待通りになりました。

そこで質問ですが、最初のようにmain()関数内で宣言すると、呼び出した関数内ではその変数は無効になるということでしょうか。

ちなみにnは、計算対象のデータ数で、main()関数内でコンソール入力によって決定します。

関数を呼び出したら親子のような関係という先...続きを読む

Aベストアンサー

ローカル変数とグローバル変数の取り扱いには注意が必要です。

ローカル変数:スコープ範囲は宣言をした関数内のみ
グローバル変数:スコープ範囲はプログラムを書いているファイル内
グローバル変数とローカル変数が同じ変数名を用いている場合はその関数内においてはローカル変数のものとして取り扱います。

また、C言語での引数は必ず値渡しになります。
たとえば次のようなプログラムがどのように動くか考えてみましょう。

#include "stdio.h"

int n;
void func(int n);

int main(void){
n = 1;
printf("n=%d\n",n);
func(n);
printf("n=%d\n",n);
return 0;
}

func(int n){
n++;
}

気を付けておきたいのはmain()で表示している"n"とfunc()で操作している"n"は全く別物であるということです。

mainからfuncにnを渡していますが、funcの引数nはfunc内で宣言しているものであるためローカル変数として扱われグローバル変数のnとは別のものとして扱われます。
mainからfuncへの値の引き渡しはグローバル変数nの値をfunc内ローカル変数nに代入することで行われます。
(この時点でグローバルnは1,func内ローカルnも同じく1です。)
func内でnをインクリメントしていますが、これはローカル変数としてのnをインクリメントしているのであり、グローバルnは影響を受けません。
(この時点でグローバルnは1,func内ローカルnは2となります。)
この後でmain()関数内でnの値を表示していますが、これはグローバルnの値を表示していますので"0"を出力します。

もし、funcの中でグローバルnを直接操作したいのであれば、func内でnを宣言せず、引数としてして引き渡さず直接扱うことになります。
上記のプログラムの場合、funcの宣言内の(int n)を(void)に変え、mainでのfuncの呼び出しをfunc();とすればよいでしょう。
グローバルとローカルで同じ名前の変数を使うと間違いの元です。

グローバル変数を使わずに呼び出し側の変数を操作する場合はポインタを利用しましょう。

ローカル変数とグローバル変数の取り扱いには注意が必要です。

ローカル変数:スコープ範囲は宣言をした関数内のみ
グローバル変数:スコープ範囲はプログラムを書いているファイル内
グローバル変数とローカル変数が同じ変数名を用いている場合はその関数内においてはローカル変数のものとして取り扱います。

また、C言語での引数は必ず値渡しになります。
たとえば次のようなプログラムがどのように動くか考えてみましょう。

#include "stdio.h"

int n;
void func(int n);

int main(void){
n = 1;
printf...続きを読む

QC# ジェネリックについて

こんにちは。

ジェネリックについて教えてください。

インスタンスの作成部分において

player a = new player();
Player型の変数aのなかにPlayerクラスのインスタンスを代入という認識

player<int> a = new player<int>();
右辺:Playeクラスのインスタンスのなかに定義されている中身がInt型となる?
   (この場合ValueがINT型)
左辺:player<int> aの <int>って何ですか?
    変数aはPLAYER型ではなくInt型になるのでしょうか?

宜しくお願いいたします。
----------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ジェネリック
{
class Program
{
static void Main(string[] args)
{
player<int> a = new player<int>();
a.value = 2;
Console.WriteLine(a.value);
}
}
class player <t>
{
public t value;
}
}

こんにちは。

ジェネリックについて教えてください。

インスタンスの作成部分において

player a = new player();
Player型の変数aのなかにPlayerクラスのインスタンスを代入という認識

player<int> a = new player<int>();
右辺:Playeクラスのインスタンスのなかに定義されている中身がInt型となる?
   (この場合ValueがINT型)
左辺:player<int> aの <int>って何ですか?
    変数aはPLAYER型ではなくInt型になるのでしょうか?

宜しくお願いいたします。
-----------------...続きを読む

Aベストアンサー

>Playeクラスのインスタンスのなかに定義されている中身がInt型となる?
そうです

>player<int> aの <int>って何ですか?
>変数aはPLAYER型ではなくInt型になるのでしょうか?
playerの定義にある<t>という部分を明示的に型を指定しています
なので言葉で表すとするなら

Int型を指定されたplayerという名前のジェネリッククラスです

Qpythonのデータ型に組み込み型があると思いますが、なぜ組み込み型と呼ぶのでしょう? なにが何に組

pythonのデータ型に組み込み型があると思いますが、なぜ組み込み型と呼ぶのでしょう?
なにが何に組み込まれているのでしょう?
オブジェクトにデータ型が組み込まれているという意味でしょうか?

Aベストアンサー

型が言語に組み込まれている。
https://docs.python.org/ja/3/library/stdtypes.html

クラス型なんかは組み込み型や他のクラス型の組合せでPythonプログラム上で定義できるけど、組み込み型が何もなかったらクラス型の定義もできないですから。

Q下のようなプログラムを作ってみたのですが、このプログラムを構造体のポインタを用いて書き換えたいのです

下のようなプログラムを作ってみたのですが、このプログラムを構造体のポインタを用いて書き換えたいのですがどのように変えるのがいいのでしょうか?
[NUM]の配列の部分は変えずに、ポインタを使うことは可能なのでしょうか?
どの部分を書き換えればいいのか、分かる方いましたら教えて頂けると有難いです*_ _)


#include<stdio.h>
#define NUM 7

typedef struct person{
char day[10];
int time;
int stime;
int min;
int smin;
}person;

int main(){
person person[NUM];
int j;
for(j=0;j<NUM;j++){
printf("曜日と時間1,時間2,分1,分2を入力\n",person[j].day,person[j].time,person[j].stime,person[j].min,person[j].smin);
scanf("%s",&person[j].day);
scanf("%d",&person[j].time);
scanf("%d",&person[j].stime);
scanf("%d",&person[j].min);
scanf("%d",&person[j].smin);
printf("曜日は%s,時間は%d時%d分から%d時%d分\n",person[j].day,person[j].time,person[j].min,person[j].stime,person[j].smin);
}
return 0;
}

下のようなプログラムを作ってみたのですが、このプログラムを構造体のポインタを用いて書き換えたいのですがどのように変えるのがいいのでしょうか?
[NUM]の配列の部分は変えずに、ポインタを使うことは可能なのでしょうか?
どの部分を書き換えればいいのか、分かる方いましたら教えて頂けると有難いです*_ _)


#include<stdio.h>
#define NUM 7

typedef struct person{
char day[10];
int time;
int stime;
int min;
int smin;
}person;

int main(){
person person[NUM];
int j;
...続きを読む

Aベストアンサー

以下のようになります。
person person[NUM];は、紛らわしいので
person person_array[NUM];に変えています。
--------------------------------------------------
#include<stdio.h>
#define NUM 7

typedef struct person{
char day[10];
int time;
int stime;
int min;
int smin;
}person;

int main(){
person person_array[NUM];
person *person_ptr;
int j;
for(j=0;j<NUM;j++){
person_ptr = &person_array[j];
printf("曜日と時間1,時間2,分1,分2を入力\n");
scanf("%s",person_ptr->day);
scanf("%d",&person_ptr->time);
scanf("%d",&person_ptr->stime);
scanf("%d",&person_ptr->min);
scanf("%d",&person_ptr->smin);
printf("曜日は%s,時間は%d時%d分から%d時%d分\n",person_ptr->day,person_ptr->time,person_ptr->min,person_ptr->stime,person_ptr->smin);
}
return 0;
}

以下のようになります。
person person[NUM];は、紛らわしいので
person person_array[NUM];に変えています。
--------------------------------------------------
#include<stdio.h>
#define NUM 7

typedef struct person{
char day[10];
int time;
int stime;
int min;
int smin;
}person;

int main(){
person person_array[NUM];
person *person_ptr;
int j;
for(j=0;j<NUM;j++){
person_ptr = &person_array[j];
printf("曜日と時間1,時間2,分1,分2を入力\n");
scanf("%s",person_ptr->day);
scanf("%d",&...続きを読む

Qプログラミングに興味があります。 僕の勝手な考えですが、今配信されていないClipbox がインスト

プログラミングに興味があります。

僕の勝手な考えですが、今配信されていないClipbox
がインストールされている端末のClipboxの情報を
Clipboxがインストールされていない端末に移動(コピー)すればインストールされていなかった端末でもClipboxが使えるようになるのではないかと思っているのですが、
できないですかね。


(まだなんの知識もなく、プログラミングを勉強するつもりなので出来るようであればやってみたいなと思っています。)

Aベストアンサー

それとプログラミングにいったい何の関係があるのかって言うのは疑問ですが、アプリをコピーできれば使えるようになるってのはその通りです。そのためのアプリも実はすでにあったりします。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング