第一节数据类型、变量与常量
程序中的变量与常量
程序的基本任务是:对数据进行处理
数据分为变量(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#是大小写敏感的
数据类型的概念
数据类型:本质上
是数据的存储方式及其能参与的运算的抽象
数据类型分两大类
值类型
引用类型
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;
}