C#でAtCoder入門 #01入出力

:::note info
C#初心者がAtCoderを始める際に最低限必要な入出力を紹介する記事です。
:::

:::note warn
特にC#であることにこだわりがない人はC++を使うことをお勧めします。使用人数がとても多いですし、AtCoder以外の多くのオンラインジャッジでも使用可能です。
:::



# 出力処理


### 文字列（string）

```csharp:サンプルコード
string A = "AtCoder";
Console.WriteLine(A);
```

```csharp:出力
AtCoder
```


### 整数（int）

```csharp:サンプルコード
int A = 123;
Console.WriteLine(A);
```

```csharp:出力
123
```


### 浮動小数点数（float）

```csharp:サンプルコード
float A = 0.123f;
Console.WriteLine(A);
```

```csharp:出力
0.123
```


### 1次元配列

```csharp:サンプルコード
int[] A = {1,2,3};
Console.WriteLine(string.Join("", A)); // 区切りなし
Console.WriteLine(string.Join(",", A)); // コンマ区切り
Console.WriteLine(string.Join(" ", A)); // スペース区切り
Console.WriteLine(string.Join("\r\n", A)); // 改行区切り
```

```csharp:出力
123
1,2,3
1 2 3
1
2
3
```


### 2次元配列

```csharp:サンプルコード
int[,] A = new string[2, 3] {{1,2,3},{4,5,6}};
Console.WriteLine(string.Join(",", A.Cast<int>()));
```

```csharp:出力
1,2,3,4,5,6
```



# 入力処理


## 1行 / 1列


### 文字列（string）

```csharp:入力
AtCoder
```

```csharp:サンプルコード
string A = Console.ReadLine();
Console.WriteLine(A);
```

```csharp:出力
AtCoder
```


### 整数（int）

```csharp:入力
123
```

```csharp:サンプルコード
int A = int.Parse(Console.ReadLine());
Console.WriteLine(A);
```

```csharp:出力
123
```


### 浮動小数点数（float）

```csharp:入力
0.123
```

```csharp:サンプルコード
float A = float.Parse(Console.ReadLine());
Console.WriteLine(A);
```

```csharp:出力
10
```


### 文字配列（char[]）

```csharp:入力
AtCoder
```

```csharp:サンプルコード
char[] A = Console.ReadLine().ToCharArray();
Console.WriteLine(string.Join(",", A));
```

```csharp:出力
A,t,C,o,d,e,r
```


## 1行 / 複数列


### 文字列配列（string[]）

```csharp:入力
I love AtCoder
```

```csharp:サンプルコード
string[] A = Console.ReadLine().Split(' ');
Console.WriteLine(string.Join(",", A));
```

```csharp:出力
I,love,AtCoder
```


### 整数配列（int[]）

```csharp:入力
10 20 30
```

```csharp:サンプルコード
int[] A = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
Console.WriteLine(string.Join(",", A));
```

```csharp:出力
10,20,30
```


### 浮動小数点数（float[]）

```csharp:入力
0.1 0.2 0.3
```

```csharp:サンプルコード
float[] A = Console.ReadLine().Split(' ').Select(float.Parse).ToArray();
Console.WriteLine(string.Join(",", A));
```

```csharp:出力
0.1,0.2,0.3
```


## 複数行 / 1列

最初の行に行数Nがある場合、N回値を読み込み、大きさNの配列に値を格納します。

```csharp:入力
3
I
love
AtCoder
```

```csharp:サンプルコード
int n = int.Parse(Console.ReadLine());
var A = new string[n];
for (int i = 0; i < n; i++) {
    A[i] = Console.ReadLine();
}
Console.WriteLine(string.Join(",", A));
```

```csharp:出力
I,love,AtCoder
```


行数が分からない場合、最後の行に到達するまで（`Console.ReadLine()`がnullになるまで）値を読み込み、リストに値を格納します。

```csharp:入力
I
love
AtCoder
```

```csharp:サンプルコード
var A = new List<string>();
while (true) {
    string line = Console.ReadLine();
    if (line == null) break;
    A.Add(line);
}
Console.WriteLine(string.Join(",", A));
```

```csharp:出力
I,love,AtCoder
```


## 複数行 / 複数列

最初の行に行数Nおよび列数Mがある場合、N回値を読み込み、大きさN×Mの配列に値を格納します。

```csharp:入力
3 4
1 2 3 4
5 6 7 8
9 10 11 12
```

```csharp:サンプルコード
int[] nm = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
int n = nm[0];
int m = nm[1];
var A = new int[n][];
for (int i = 0; i < n; i++) {
    A[i] = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
}
foreach (var a in A) {
  	Console.WriteLine(string.Join(",", a));
}
```

```csharp:出力
1,2,3,4
5,6,7,8
9,10,11,12
```


行数および列数が分からない場合、最後の行に到達するまで（`Console.ReadLine()`がnullになるまで）値を読み込み、リストに値を格納します。

```csharp:入力
1 2 3 4
5 6 7 8
9 10 11 12
```

```csharp:サンプルコード
var A = new List<List<int>>();
while (true) {
    string line = Console.ReadLine();
	if (line == null) break;
    A.Add(line.Split(' ').Select(int.Parse).ToList());
}
foreach (var a in A) {
  	Console.WriteLine(string.Join(",", a));
}
```

```csharp:出力
1,2,3,4
5,6,7,8
9,10,11,12
```



# 参考リンク

https://qiita.com/Camypaper/items/de6d576fe5513743a50e

https://rian.hatenablog.jp/entry/2017/12/06/040000