C# 第二章 语言基础

第一节数据类型、变量与常量

程序中的变量与常量

程序的基本任务是:对数据进行处理

数据分为变量(variable)与常量(literal)

int age = 18;

变量是值可以改变,本质上市内存的空间,用来储存信息

常量的值是固定的,直接写出来的

int double  bool  string Person p= new Person();

 

变量命名要遵守如下规则

(1)不能是C#关键字

(2)由字母、数字、下划线构成

(3)第一个字符必须是字母或下划线

(4)不要太长,一般不超过31个字符为宜

(5)变量名最好不要与库函数名、类名相同

如:Age  age  personName book1  book5  _num

C#是大小写敏感的

 

数据类型的概念

数据类型:本质上

是数据的存储方式及其能参与的运算的抽象

C# 第二章 语言基础

 

数据类型分两大类

值类型

引用类型

int a = 5;

int b = a;

 

Person p= new Person();

Person p2 = p;

 

DateTime t =new DateTime(2018,1,1);

DateTime t2= t;

 

两种类型又是统一的

等价类型

注意:每种简单数据类型都有一个关键词

int 相当于 System.Int32

double 相当于 System.Double

bool 相当于 System.Boolean

string 相当于 System.String

(如果using system,则string相当于String)

 

十进制类型

Decimal 如120.50M

布尔类型

bool 如true false(小写) 不能用0或1代替

 

推断类型 var  a=1+2

 

第二节运算符与表达式

算术运算符,关系运算符,逻辑运算符

 

表达式时符合一定语法规则的运算符和操作数的序列

表达式的类型

运算符优先级与结合性

单目>算术>关系>逻辑>三目>赋值

用括号来改变优先级

 

类型的转换

字符串转成数值

double.Parse(s)  int.Parse(s)

 

数字转成字符串

10.ToString()

“”+10

 

使用Convert

Convert.ToInt32(textbox1.Text)

Convert.ToDouble(“123.45)

Convert.ToDateTime(“2009-10-01 14:00”)

 

第三节流程控制语句

结构化程序设计的三种基本流程:顺序,分支,循环

注意没有表达式语句

 

分支语句if

 

注意书写格式,特别是缩进

将后面的花括号去掉,再重新输一下,就会自动排版

也可以按Ctrl+E+D(格式文档)

或Ctrl+E+F(格式化选中部分)

 

多分支语句:switch语句

switch语句与C++不同之处

变量除了整形、枚举型,还可以用字符串

不能随便贯穿,必须有break;

 

using System;

public class GradeLevel{

    public static void Main( ){

        Console.Write("Input Grade Level: ");

        char grade = (char) Console.Read();

        switch( char.ToUpper( grade ) ){

            case 'A' : 

                Console.WriteLine(grade+" is 85~100");

                break;

            case 'B' : 

                Console.WriteLine(grade+" is 70~84");

                break;

            case 'C' : 

                Console.WriteLine(grade+" is 60~69");

                break;

            case 'D' : 

                Console.WriteLine(grade+" is <60");

                break;

            default : 

                Console.WriteLine("input error");

                break;

        }

    }

}

 

屏保文件目录c:\windows\system32

文件名:xxx.scr

int deltX = 10;

int deltY = 8;

  

private void timer1_Tick(object sender, System.EventArgs e)

{

    this.label1.Left += deltX;

    this.label1.Top += deltY;

    if( this.label1.Top < 0 ||

        this.label1.Top + this.label1.Height > this.Height )

        deltY = -deltY;

    if( this.label1.Left <0 ||

        this.label1.Left + this.label1.Width > this.Width )

        deltX = -deltX;

}

  

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)

{

    Application.Exit();

}

 

简单随机出题程序

设置属性名(name)匈牙利命名法

int a, b;

    string op;

    int result;

      

    Random rnd = new Random();  

  

    private void btnNew_Click(object sender, System.EventArgs e)

    {   

        a = rnd.Next( 9 ) + 1;

        b = rnd.Next( 9 ) + 1;

        int c = rnd.Next( 4 );

        switch( c )

        {

            case 0: op="+"; result=a+b; break;

            case 1: op="-"; result=a-b; break;

            case 2: op="*"; result=a*b; break;

            case 3: op="/"; result=a/b; break;

        }

        lblA.Text=a.ToString();

        lblB.Text=b.ToString();

        lblOp.Text=op;

        txtAnswer.Text="";

    }

  

    private void btnJudge_Click(object sender, System.EventArgs e)

    {

        string str = txtAnswer.Text;

        double d = double.Parse( str );

        string disp = "" + a + op + b+"="+ str +" ";

        if( d == result ) // if( Math.Abs(d-result)< 1e-3 )

            disp += "☆";

        else 

            disp += "╳";

      

        lstDisp.Items.Add( disp );

    }

}

 

 

循环语句

循环五要素:

初始化部分

循环条件部分

循环体部分

迭代部分

结束后处理

 

循环分类:for循环语句  while循环语句  do…while循环语句

 

跳转语句

break语句:结束循环

continue语句:进入下一次循环

goto语句:跳转到某个语句标号

可以从内层跳到外层

标号的写法:标识符加冒号

try{}catch{}语句:异常的捕获

 

角谷的猜想

using System;

class Jiaogu 

{

    public static void Main(string[] args) 

    {

        for( int n=1; n<=100; n++ )

        {

            int a = n;

            while( a != 1 )

            {

                Console.Write( " " +a );

                if( a%2==1 ) a = a*3+1; else a /= 2;

            }

            Console.WriteLine(" " +a);

        }

    }

}

 

画许多圆

Random random = new Random();

  

Color getRandomColor()

{

    return Color.FromArgb(

         random.Next(256) ,

         random.Next(256) ,

         random.Next(256) );

}

  

private void button1_Click(object sender, System.EventArgs e)

{

    Graphics g = this.CreateGraphics();

  

    int x0 = this.Width /2;

    int y0 = this.Height /2;

  

    for( int r=0 ; r<this.Height/2; r++ )

    {

        g.DrawEllipse(

            new Pen( getRandomColor(),1), 

            x0-r,y0-r, r*2, r*2 

            );

    } 

    g.Dispose();        

}

 

 

第四节  数组

数组是多个相同类型数据的组合

数组属于引用类型

C#语言中声明数组时不能指定其长度

动态初始化

数组定义与为数组元素分配空间并赋值操作分开进行

int []a = new int[3];

a[0]=3;

a[1]=9;

a[2]=8;

 

静态初始化:在定义数组的同时就为数组元素分配空间并赋值

 

数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化.。

 

foreach可以方便地处理数组、集合中各元素

int[] ages =new int[10];

foreach(int age in age)

{

         ……

}

foreach是只读式的遍历

 

复制素组

Array.Copy方法提供了数组元素复制功能

//源数组

int[] source={1,2,3,4,5,6};

//目的数组

int[]dest={10,9,8,7,6,5,4,3,2,1};

//复制源数组中从下标0开始的source.length个元素到

//目的数组,从下标0的位置开始存储

Array.Copy(source,0,dest,0,source.Length);

 

多维数组

int[,]a={};

交错数组

是数组中的数组

 

筛法求素数

要点:使用bool数组

using System;

public class PrimeFilter{

    public static void Main( string [] args ){

        int N = 100;

        bool [] a = new bool[N+1];

        for( int i=2; i<=N; i++ ) a[i]=true;

  

        for( int i=2; i<N; i++ )

        {

            if(a[i]) for( int j=i*2; j<=N; j+=i )

                a[j]=false;

        }

  

        for( int i=2; i<=N; i++) 

            if( a[i] ) Console.Write( i + " " );

    }

}

拍快游戏

十五子游戏

写程序先写注释

按钮的数组

按钮的生成、加入、事件

按钮的Tag

函数的书写

const int N = 4; //按钮的行、列数

        Button[,] buttons = new Button[N, N]; //按钮的数组

  

        private void Form1_Load(object sender, EventArgs e)

        {

            //产生所有按钮

            GenerateAllButtons();

        }

  

        private void button1_Click(object sender, EventArgs e)

        {

            //打乱顺序

            Shuffle();

        }

  

  

        //打乱顺序

        void Shuffle()

        {

            //多次随机交换两个按钮

            Random rnd = new Random();

            for (int i = 0; i < 100; i++)

            {

                int a = rnd.Next(N);

                int b = rnd.Next(N);

                int c = rnd.Next(N);

                int d = rnd.Next(N);

                Swap(buttons[a, b], buttons[c, d]);

            }

        }

  

        //生成所有的按钮

        void GenerateAllButtons()

        {

            int x0 = 100, y0 = 10, w = 45, d = 50;

            for (int r = 0; r < N; r++)

                for (int c = 0; c < N; c++)

                {

                    int num = r * N + c;

                    Button btn = new Button();

                    btn.Text = (num + 1).ToString();

                    btn.Top = y0 + r * d;

                    btn.Left = x0 + c * d;

                    btn.Width = w;

                    btn.Height = w;

                    btn.Visible = true;

                    btn.Tag = r * N + c; //这个数据用来表示它所在行列位置

                      

                    //注册事件

                    btn.Click += new EventHandler(btn_Click);

  

                    buttons[r, c] = btn; //放到数组中

                    this.Controls.Add(btn); //加到界面上

                }

            buttons[N - 1, N - 1].Visible = false; //最后一个不可见

        }

  

        //交换两个按钮

        void Swap(Button btna, Button btnb)

        {

            string t = btna.Text;

            btna.Text = btnb.Text;

            btnb.Text = t;

  

            bool v = btna.Visible;

            btna.Visible = btnb.Visible;

            btnb.Visible = v;

        }

  

        //按钮点击事件处理

        void btn_Click(object sender, EventArgs e)

        {

            Button btn = sender as Button; //当前点中的按钮

            Button blank = FindHiddenButton(); //空白按钮

  

            //判断是否与空白块相邻,如果是,则交换

            if (IsNeighbor(btn, blank))

            {

                Swap(btn, blank);

                blank.Focus();

            }

  

            //判断是否完成了

            if (ResultIsOk())

            {

                MessageBox.Show("ok");

            }

        }

  

        //查找要隐藏的按钮

        Button FindHiddenButton()

        {

            for (int r = 0; r < N; r++)

                for (int c = 0; c < N; c++)

                {

                    if (!buttons[r, c].Visible)

                    {

                        return buttons[r, c];

                    }

                }

            return null;

        }

  

        //判断是否相邻

        bool IsNeighbor(Button btnA, Button btnB)

        {

            int a = (int)btnA.Tag; //Tag中记录是行列位置

            int b = (int)btnB.Tag;

            int r1 = a / N, c1 = a % N;

            int r2 = b / N, c2 = b % N;

  

            if (r1 == r2 && (c1 == c2 - 1 || c1 == c2 + 1) //左右相邻

                || c1 == c2 && (r1 == r2 - 1 || r1 == r2 + 1))

                return true;

            return false;

        }

  

        //检查是否完成

        bool ResultIsOk()

        {

            for (int r = 0; r < N; r++)

                for (int c = 0; c < N; c++)

                {

                    if (buttons[r, c].Text != (r * N + c + 1).ToString())

                    {

                        return false;

                    }

                }

            return true;

        }