第一节数据类型、变量与常量
程序中的变量与常量
程序的基本任务是:对数据进行处理
数据分为变量(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 { 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 { 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; }