Movatterモバイル変換


[0]ホーム

URL:


はてラボはてな匿名ダイアリー
ようこそ ゲスト さんログインユーザー登録

「StreamReader」を含む日記RSS

はてなキーワード:StreamReaderとは

2012-08-13

C#基礎文法最速マスター

1.基礎
classの作成

プログラムclass記述します。たとえばSampleという名前classを作る場合、Sample.csファイル内に次のように書きます。(C#場合ファイル名とクラス名は同一でなくても良い。複数のクラスを書いても良い)

public class Sample {}
Mainメソッドの作成

プログラムclass内のMainメソッドの先頭から実行されます。Mainメソッドは次のように書きます

public class Sample {    public staticvoid Main(String[] args ) {         // 処理を書く     }}
Console.WriteLineメソッド

文字列を表字するメソッドです。

Console.WriteLine( "Hello world" );
コメント

コメントです。

// 一行コメント/*   複数行コメント */
変数の宣言

変数の宣言です。変数の宣言時にはデータ型を指定します。

//変数int num;
データ型

データ型です。C#データ型には値型と参照型とがあります。以下は値型のデータ型です。

// int(整数)型int num;//char(文字)型char c;// float(単精度浮動小数点)型float val;//double(倍精度浮動小数点)型double val;// bool(論理)型boolflag;//DateTime(日付)型DateTimedate;

以下は参照型のデータ型です。

//StringString s;//配列String[] array;
プログラムのコンパイル

プログラムコンパイルするには、コマンドラインで以下のようにします。

csc Sample.cs
プログラムの実行

プログラムを実行するには、コマンドラインで以下のようにします。

.net frameworkonWindows場合

Sample.exe

Mono.frameworkの場合

mono ./Sample.exe
2. 数値
数値の表現

int、float、double型の変数に数値を代入できます。int型には整数だけ代入できます。float、double型には整数でも小数でも代入できます

int i = 2;int i = 100000000;float num = 1.234f;double num = 1.234;
四則演算

四則演算です。

num = 1 + 1;num = 1 - 1;num = 1 * 2;num = 1 / 2;

商の求め方です。割る数と割られる数が両方とも整数場合計算結果の小数点以下が切り捨てられます

num = 1 / 2;  // 0

割る数と割られる数のどちらかが小数場合計算結果の小数点以下が切り捨てられません。

num = 1.0 / 2;    // 0.5num = 1 /2.0;    // 0.5num = 1.0 /2.0;  // 0.5

余りの求め方です。

// 余りmod = 4 % 2
インクリメントとデクリメント

インクリメントとデクリメントです。

// インクリメント ++i;// デクリメント --i;
3. 文字列
文字列の表現

文字列ダブルクォートで囲みます

Stringstr = "abc";
文字列操作

各種文字列操作です。

// 結合String join = "aaa" + "bbb";// 分割String[] record = "aaa,bbb,ccc".Split( "," );// 長さint length = "abcdef".Length();// 切り出し"abcd".Substring( 0, 2 )   //abc//検索int result = "abcd".IndexOf( "cd" ) // 見つかった場合はその位置、見つからなかった場合は-1が返る
4. 配列
配列変数の宣言

配列です。

//配列の宣言int[] array;
配列の生成

配列の生成です。配列の生成時には要素数を指定するか、初期データを指定します。

int[] array;// 要素数を指定して配列を生成array = new int[5];// 初期データを指定して配列を生成array = new int[] { 1, 2, 3 };// 宣言と同時に配列を生成int[] array2 = new int[5];
配列の要素の参照と代入

配列の要素の参照と代入です。

// 要素の参照array[0]array[1]// 要素の代入array[0] = 1;array[1] = 2;
配列の要素数

配列の要素数を取得するには以下のようにします。

array_num = array.Length;
配列のコピー

配列の要素を別の配列コピーするには以下のようにします。

int[] from = new int[] { 1, 2, 3 };int[] to = new int[5];from.CopyTo(to, 0);
5. 制御文
if文

if文です。

if ( 条件 ){}
if ~ else文

if ~ else文です。

if ( 条件 ){}else{}
if ~ else if 文

if ~ else if文です。

if ( 条件 ){}else if ( 条件 ){}
while文

while文です。

int i = 0;while ( i < 5 ){        // 処理        ++i;}
for文

for文です。

for ( int i = 0; i < 5; ++i ){    // 処理}
for-each文

for-each文です。配列の各要素を処理できます

int[]fields = new int[] { 1, 2, 3 };foreach (intfield infields){    // 処理}
6. メソッド

C#では関数メソッドと言いますメソッドを作るには次のようにします。戻り値を返却するにはreturn文を使います

static int sum( int num1, int num2 ){    inttotal;total = num1 + num2;    returntotal;}
9. ファイル入出力

ファイル入出力です。ファイル入出力を行うには、プログラムの先頭に以下を記述します。

using System.IO;

以下がファイル入力の雛形になりますファイルオープンや読み込みに失敗した場合catch節に処理が移ります

String filename = "text.txt";StreamReaderreader = null;try{reader = newStreamReader(filename);Stringline;    while ((line =reader.ReadLine()) != null)    {    }}catch (IOException e){    //エラー処理:}finally{    if (reader != null)    {try        {reader.Close();        }catch (IOException e) { }    }}

またはC#ではusingステートメントと言うものがあり、この様にも書ける

String filename = "text.txt";using (StreamReaderreader = newStreamReader(filename)){try    {Stringline;        while ((line =reader.ReadLine()) != null)        {            // 読み込んだ行を処理        }    }catch (IOException e)    {        //エラー処理:    }}

usingをつかうとCloseがなくなったことからわかるようにusing(){}を抜けるとき自動的にDisposeメソッドを呼び出し、オブジェクトを廃棄する。その分コードスッキリするが、使いにくい場面もあるので考えて使うこと。

以下がファイル出力の雛形になりますファイルオープンや書き込みに失敗した場合catch節に処理が移ります

String filename = "text.txt";StreamWriterwriter = null;try{writer = newStreamWriter(filename));writer.WriteLine("abc");writer.WriteLine("def");writer.WriteLine("fgh");}catch (IOException e){    //エラー処理:}finally{    if (writer != null)    {writer.Close();    }}

こちらもusingを使って書ける。が、割愛する。

知っておいたほうがよい文法

C#でよく出てくる知っておいたほうがよい文法の一覧です。

繰り返し文の途中で抜ける

繰り返し文の途中で抜けるにはbreak文を使用します。

for ( i = 0; i < 5; ++i ) {    if ( 条件 ) {        break;    // 条件を満たす場合、for文を抜ける。    }}
繰り返しの残り部分の処理をスキップする

残りの部分処理をスキップし、次の繰り返しに進むにはcontinue文を使用します。

for ( i = 0; i < 5; ++i ) {    if ( 条件 ) {continue;    // 条件を満たす場合、残りの部分処理をスキップし、次の繰り返しに進む。    }}
例外処理

例外を投げるにはthrow文を使用します。

throw new Exception( "Error messsage" );

例外処理をするにはtrycatch文を使用します。

try {    // 例外が発生する可能性のある処理}catch ( Exception e ) {    // 例外発生時の処理}

Permalink |記事への反応(0) | 12:16

このエントリーをはてなブックマークに追加ツイートシェア

2010-01-14

http://anond.hatelabo.jp/20100113192313

これで40分。

タイムアタックってことでアルゴリズムは全幅探索で書き上げました。

エラーチェック皆無。

A*ならもう5分ほど延びるかな?

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;namespace Maze{ class Program    {        // 探索用地図        static int[,] maze;        // 始点終点        staticPosition Start = newPosition(0, 0), Goal = newPosition(0, 0);        staticvoid Main(string[] args)        {            //////////////////////////// まずは各行のリストとして読み込みstring[] inMaze;            using (varfp = newFileStream(args[0], FileMode.Open, FileAccess.Read))            using (var iStream = newStreamReader(fp))                inMaze = iStream.ReadToEnd().Split('\n');            //迷路幅            int height = inMaze.Length;            //迷路高さ            int width = inMaze[0].Length;            /////////////////////////// 読み込んだ迷路を作業用地図に展開            maze = new int[width, height];            for (int y = 0; y < height; ++y)            {string line = inMaze[y];                for (int x = 0; x < line.Length; ++x)                {                    maze[x, y] = line[x] == '*'                        ? -1                        : 0;                    if (line[x] == 'S') Start = newPosition(x, y);                    if (line[x] == 'G') Goal = newPosition(x, y);                }            }            // 探索実行            int dist = Search(maze, Start);            // 探索結果から最短経路を再現Position backTracer = Goal;            while (dist&gt;1){                --dist;                backTracer = backTracer.Nearbys.First(pos =&gt; maze[pos.X,pos.Y] == dist);                maze[backTracer.X, backTracer.Y] = -2;            }            //////////////////// 最短経路こみのアスキー地図に変換char[,] outMaze = newchar[width, height];            for (int y = 0; y < height; ++y)            {                for (int x = 0; x < width; ++x)                {                    outMaze[x, y] = maze[x, y] == -2                        ? '$'                        : maze[x, y] == -1                            ? '*'                            : ' ';                }            }            outMaze[Start.X, Start.Y] = 'S';            outMaze[Goal.X, Goal.Y] = 'G';            ////////////////////// 結果は標準出力に。            for (int y = 0; y < height; ++y)            {                for (int x = 0; x < width; ++x)Console.Write(outMaze[x, y]);Console.WriteLine();            }Console.ReadLine();        }        /// <summary&gt;        /// 探索する。SG間の道のりを返す(道のり=SGが隣接しているなら1)        /// </summary&gt;        private static int Search(int[,] maze,Position Start)        {            List<Position&gt; FrontLine = new List<Position&gt;();            FrontLine.Add(Start);            int dist = 1;            for (; ; )            {                List<Position&gt; NextFrontLine = new List<Position&gt;();                foreach (varpos in FrontLine)                {                    foreach (var nextPos inpos.Nearbys)                    {                        if (nextPos == Goal) return dist;                        if (maze[nextPos.X, nextPos.Y] == 0)                        {                            maze[nextPos.X, nextPos.Y] = dist;                            NextFrontLine.Add(nextPos);                        }                    }                }                FrontLine = NextFrontLine;                ++dist;            }        }    }    structPosition    {        public readonly int X, Y;        publicPosition(int x, int y) { X = x; Y = y; }        public IEnumerable<Position&gt; Nearbys        {            get            {                return new[]{                    newPosition(X-1,Y),                    newPosition(X,Y-1),                    newPosition(X+1,Y),                    newPosition(X,Y+1),                };            }        }        public static bool operator==(Position p1,Positionp2){            return p1.X ==p2.X &amp;&amp; p1.Y ==p2.Y;        }        public static bool operator!=(Position p1,Positionp2){            return p1.X !=p2.X || p1.Y !=p2.Y;        }    }}

Permalink |記事への反応(2) | 02:18

このエントリーをはてなブックマークに追加ツイートシェア

 
ログインユーザー登録
ようこそ ゲスト さん
Copyright (C) 2001-2025 hatena. All Rights Reserved.

[8]ページ先頭

©2009-2025 Movatter.jp