C#基础教程一

12 篇文章 2 订阅

基本结构

Hello.cs

//引入类或方法
using System;

//定义命名空间
namespace Hello{
	//声明类
	class Program{
		//Main()方法,程序入口方法
		//返回类型为void或int,输入参数为string[] args或空
		//{}程序体
		//static静态修饰符
		//void返回修饰符
		//;分隔符,表示语句的结束
		//语句是基本单位,分号“;”终止,可以声明变量、常量、调用方法、创建对象或执行逻辑操作等
		//或/**/用于注释
		//str,标识符是用来命名变量、方法、参数、程序结构等的字符串。不能与关键字重复,数字不能首位,字母、下划线任何位置,“@”只能放在首位。
		static sring str = "Hello";
		static void Main(string[] args){
			Console.WriteLine();
			Console.WriteLine(str);
			Console.ReadLine();
			Console.Read();
		}
	}
}

csc Hello.cs

命令行编译

Cat.cs

using System;
namespace Animal{
    public class Cat{
        public void Print(){
            Console.WriteLine("cat");
        }
    }
}

Dog.cs

using System;
namespace Animal{
    public class Dog{
        public void Print(){
            Console.WriteLine("dog");
        }
    }
}

Program.cs

using Animal;
public class Program{
    static void Main(string[] args){
        new Dog().Print();
        new Cat().Print();
    }
}

搜索Developer Command Prompt for VS 2019

#生成模块
#csc D:\test\Cat.cs /t:module /out:D:\test\Cat.netmodule  
#csc D:\test\Dog.cs /t:module /out:D:\test\Dog.netmodule 
csc Cat.cs /t:module /out:Cat.netmodule
csc Dog.cs /t:module /out:Dog.netmodule

#模块生成动态库
#csc /addmodule:D:\test\Cat.netmodule;D:\test\Dog.netmodule /t:library /out:D:\test\Animal.dll 
csc /addmodule:Cat.netmodule;Dog.netmodule /t:library /out:Animal.dll  

#引用动态库
#csc D:\test\Program.cs /out:D:\test\Program.exe /R:D:\test\Animal.dll  
csc Program.cs /out:Program.exe /R:Animal.dll

关键字

abstract
as
base
bool
break
byte
case
catch
char
checked
class
const
continue
decimal
default
delegate
do
double
else
enum
event
explicit
extern
false
finally
fixed
float
for
foreach
goto
if
implicit
in
int
interface
internal
is
lock
long
namespace
new
null
object
operator
out
override
params
private
protected
public
readonly
ref
return
sbyte
sealed
short
sizeof
stackalloc
static
string
struct
switch
this
throw
try
ture
typeof
uint
ulong
unchecked
unsafe
ushort
using
virtual
void
volatile
while

数据类型

值类型Value Types

(堆)栈中分配,直接访问实例副本(互不影响),非空(有确定值)。

简单数据类型Simple Data Types

  • 整数
    (s)byte,1字节
    (u)short,2字节
    (u)int,4字节,0u(U),默认整数类型int
    (u)long,8字节,0l(L),0ul(UL)

  • 浮点
    float,4字节,0.0f(F),默认浮点类型float
    double,8字节,0.0d(D),
    decimal,16字节,0.0m(M),

  • 布尔
    bool,2字节,默认false

  • 字符
    char,2字节(Unicode),默认null

结构体数据类型Struct Data Types

public struct Person {
	public string name;
	public char sex;
	public ushort age;
}
Person person;
person.name = "xiaoming";
person.sex = 'M';
person.age = 25;
Console.WriteLine("name: {0}\nsex: {1}\nage:{2}", person.name, person.sex, person.age);
Console.WriteLine("name: "+person.name+"\nsex: “+person.sex+”\nage:"+person.age);

枚举数据类型Enumeration Data Types

enum Color[:int] { //long,int,short,byte等,默认int
	red=22, orange, yellow, green=7, blue, indigo, violet
}
Console.WriteLine("color:"+(int)Color.blue);

引用类型Reference Types

对象(引用类型的变量),存储实际数据的引用地址,new创建。
特征:

  • 托管堆中分配内存。
  • 关联|引用对象的成员必须初始化。
  • 由垃圾回收机制管理。
  • 多引用可指向同一对象,一变全变。
  • 被赋值前为null。

类Class

面向对象程序设计的基本单位。数据、方法和嵌套类等构成。

  • 对象类Object
    所有数据类型的基类,可以与其他数据类型转换(装箱与拆箱)。

  • 数组类Array
    一组类型相同的有序数据。

  • 字符串类String
    字符串赋值时,引用复制。

  • 其他

接口Interface

封装特定功能的集合,定义协议,组合方法和属性。

委托Delegate

持有某个方法(签名Signature,函数类型)的引用的类(类似函数指针),

指针类型Point Types

是值类型(栈),或引用类型(堆)。

变量与常量

变量

用来表示数值、字符串或类等。

  • 变量名
    数字、字母、下划线组成,不能数字开头,不能使用关键字,变量作用域内不能同名。
  • 变量类型
    存储的数据(变量值)类型决定。
  • 变量值
    变量所要存储的数据。
  • 声明与赋值
int h;
int i=10, j;
string x="a", y="b", z="c";

常量

编译后值不会改变的量。

  • 整数常量
    10、0x37AC
  • 实数常量
    3.14、3.14M
  • 字符常量
    ‘a’
  • 字符串常量
    “学习c#”
  • 布尔常量
    true、false
  • 符号常量
    [默认public]const int month = 12
    const定义时赋值。

运算符与表达式

运算符与变量或常量(操作数)组合形成表达式

  • 基本运算符
    (i)、a[i]、i.j、i++、sizeof、typeof、checked、unchecked、new、(强制类型转换)

  • 类型检测符
    is、as

  • 三目运算符
    ?:

  • 算术运算符
    +、-、*、/、%、--、++

1+5
"hello"+6
  • 赋值运算符
    =、+=、-=、*=、/=、%=、&=、|=、^=、>>=、<<=

  • 位运算符
    ~、&、|、^、>>、<<

  • 关系|比较运算符
    ==、!=、>、<、>=、<=

  • 逻辑运算符
    !、&&、||

数据类型转换

不同数据类型的变量间转换或不同数据类型的变量间运算(需转换)。

隐式转换Implicit Conversion

系统自动转换。

char -> ushort、int、uint、long、ulong、float、double、decimal
sbyte -> short、int、long、float、double、decimal
byte -> short、ushort、int、uint、long、ulong、float、double、decimal
short -> int、long、float、double、decimal
ushort -> int、uint、long、ulong、float、double、decimal
int -> long、float、double、decimal
uint -> long、ulong、float、double、decimal
long -> float、double、decimal
ulong -> float、double、decimal
float-> double

显示转换Explicit Conversion

人为强制转换

  1. 数值类型转换
double i = 3.141;
int j = (int)i;
  1. 字符串与数值类型转换
int k = int.Parse("123");
double x = double.Parse("45");

string str1 = x.ToString();
string str2 = 'a'.ToString();
  1. Convert转换
int k = int.Parse("123");
string str = Convert.ToString(k);

int data = Convert.ToInt16(str);

数组

相同类型的元素按序排列的集合,索引引用,从零开始。

定义

通过数组元素类型、维数、每个维度上下限定义。

//一维
int[] IArray;
//二维
string[,] SArray;

初始化

数组初始化后,维数及每维长度固定。

  1. 枚举初始化

指定数组长度的同时为各元素赋值。

int[] IArray = {7,3,4};
char[] CArray = new char[] {'a','b','c'};
string[] SArray = new string[3]{"how","are","you"};
int[,] TD_IArray = new int[3,2]{{1,0},{3,2},{3,3}};
  1. 实例初始化

默认值为元素类型初始值。

int[] IArray;
IArray = new int[15];
//或
int[] IArray = new int[15];

string[,] SArray = new string[5,7];

遍历

int[] IArray = new int[5]{1,2,3,4,5};
int[,] TD_IArray = new int[3,2]{{1,2},{3,4},{5,6}};
foreach(int i in IArray){
	Console.WriteLine(i);
}
foreach(int i in TD_IArray ){
	Console.WriteLine(i);
}

字符串string

字母组成的数组。

常用方法:

  • 删除空格
    TrimStart()删除前端空格
    TrimEnd()删除尾部空格
    Trim()删除前后空格
  • 大小写转换
    ToLower()
    ToUpper()
  • 首尾包含字符串
    StartsWith()
    EndsWith()
  • 字符串比较
    Unicode值比较
    CompareTo()
    Equals()
  • 插入删除字符串
    Insert()指定位置插入子字符串
    Remove()指定位置删除子字符串
string s1,s2,s3;
int p1,p2;
s1 = "Microsoft Visual ";
s2 = "Studio";
p1 = s1.Length;
s3 = s1.Insert(s1.Length,s2);//s1末端插入s2得到s3,s1本身不变
s3 = s3.Remove(s1.Length,s2.Length);//删除s3中从s1.Length位置处开始的s2.Length长度的字符串

数字加密

int Input_Num, Input_Key, Output_Num;
Console.WriteLine("输入数值及密钥");
if(int.TryParse(Console.ReadLine(), out input_Num) && int.TryParse(Console.ReadLine(), out Input_Key)){
	Output_Num = Input_Num ^ Input_Key;
	Console.WriteLine("加密后数值:"+Output_Num);
}else
	Console.WriteLine("输入整数值");

推箱子游戏

//设计地图,其中0表示空地,1表示墙,2表示箱子, 3表示人,4表示目标,5表示完成
int[,] map = new int[12, 13]{
    {0,0,0,0,0,1,1,1,1,1,1,1,0},
    {0,0,0,0,0,1,0,0,1,0,0,1,0},
    {0,0,0,0,0,1,0,0,2,2,0,1,0},
    {1,1,1,1,1,1,0,2,1,0,0,1,0},
    {1,4,4,4,1,1,1,0,1,0,0,1,1},
    {1,4,0,0,1,0,0,2,0,1,0,0,1},
    {1,4,0,0,0,0,2,0,2,0,2,0,1},
    {1,4,0,0,1,0,0,2,0,1,0,0,1},
    {1,4,4,4,1,1,1,0,1,0,0,1,1},
    {1,1,1,1,1,1,0,2,0,0,0,1,0},
    {0,0,0,0,0,1,0,3,1,0,0,1,0},
    {0,0,0,0,0,1,1,1,1,1,1,1,0}
};
int[,] map0 = new int[12, 13]{
    {0,0,0,0,0,1,1,1,1,1,1,1,0},
    {0,0,0,0,0,1,0,0,1,0,0,1,0},
    {0,0,0,0,0,1,0,0,0,0,0,1,0},
    {1,1,1,1,1,1,0,0,1,0,0,1,0},
    {1,4,4,4,1,1,1,0,1,0,0,1,1},
    {1,4,0,0,1,0,0,0,0,1,0,0,1},
    {1,4,0,0,0,0,0,0,0,0,0,0,1},
    {1,4,0,0,1,0,0,0,0,1,0,0,1},
    {1,4,4,4,1,1,1,0,1,0,0,1,1},
    {1,1,1,1,1,1,0,0,0,0,0,1,0},
    {0,0,0,0,0,1,0,0,1,0,0,1,0},
    {0,0,0,0,0,1,1,1,1,1,1,1,0}
};
//小人的初始坐标
int y = 10, x = 7;
//让小人动起来(用方向键↑↓←→控制),即改变小人的坐标位置,与下一个坐标内容互换,如果指定方向的下一个坐标是1(即面对墙),小人坐标不变(if进行判断)
//for循环中控制,清屏后打印新位置
for(; ; ){
    //打印新地图
    for(int i = 0; i < 12; i++){
        for(int j = 0; j < 13; j++){
            if(map[i, j] == 0){
                Console.Write(" ");
            }else if(map[i, j] == 1){
                Console.Write("■");
            }else if(map[i, j] == 2){
                Console.Write("口");
            }else if(map[i, j] == 3){
                Console.Write("♀");
            }else if(map[i, j] == 4){
                Console.Write("☆");
            }else if(map[i, j] == 5){
                Console.Write("★☆");
            }
        }
        Console.WriteLine();
    }

    //接收输入的按键
    ConsoleKeyInfo aj = Console.ReadKey();
    //清屏
    Console.Clear();
    
    if(aj.Key.ToString() == "UpArrow"){//向上移动
        if(map[y - 1, x] == 0 || map[y - 1, x] == 4){//小人的下一个坐标为空地,进行移动
            map[y - 1, x] = 3;
            if(map0[y, x] == 4){//如果小人现在的坐标是目标点的坐标
                map[y, x] = 4;
            }else{//如果小人现在的坐标不是目标点的坐标
                map[y, x] = 0;
            }
            y--;
        }else if(map[y - 1, x] == 1){//小人的下一个坐标为墙,跳过此次循环
			continue; 
		}else if(map[y - 1, x] == 2 || map[y - 1, x] == 5){//小人的下一个坐标为未到达目标的箱子或到达目标的箱子
            if(map[y - 2, x] == 1 || map[y - 2, x] == 2 || map[y - 2, x] == 5){//箱子的下一个目标为墙或空箱子或到达目标的箱子
				continue; 
			}else if(map[y - 2, x] == 0){//箱子的下一个目标为空地
                map[y - 2, x] = 2;
				map[y - 1, x] = 3;
                if(map0[y, x] == 4){//如果小人现在的坐标是目标点的坐标
                    map[y, x] = 4;
                }else{//如果小人现在的坐标不是目标点的坐标
                    map[y, x] = 0;
                }
				y--;
            }else if(map[y - 2, x] == 4){//箱子的下一个目标为目标点
                map[y - 2, x] = 5;
				map[y - 1, x] = 3;
                if (map0[y, x] == 4){//如果小人现在的坐标是目标点的坐标
                    map[y, x] = 4;
                }else{//如果小人现在的坐标不是目标点的坐标
                    map[y, x] = 0;
                }
				y--;
            }
        }
    }else if(aj.Key.ToString() == "DownArrow"){//向下移动
        if(map[y + 1, x] == 0 || map[y + 1, x] == 4){//小人的下一个坐标为空地,进行移动
			map[y + 1, x] = 3;
            if(map0[y, x] == 4){//如果小人现在的坐标是目标点的坐标
                map[y, x] = 4;
            }else{//如果小人现在的坐标不是目标点的坐标
                map[y + 1, x] = 3;
                map[y, x] = 0;
            }
			y++;
        }else if(map[y + 1, x] == 1){//小人的下一个坐标为墙,跳过此次循环
			continue; 
		}else if(map[y + 1, x] == 2 || map[y + 1, x] == 5){//小人的下一个坐标为未到达目标的箱子或到达目标的箱子
            if(map[y + 2, x] == 1 || map[y + 2, x] == 2 || map[y + 2, x] == 5){//箱子的下一个目标为墙或空箱子或到达目标的箱子
				continue; 
			}else if(map[y + 2, x] == 0){//箱子的下一个目标为空地
                map[y + 2, x] = 2;
				map[y + 1, x] = 3;
                if(map0[y, x] == 4){//如果小人现在的坐标是目标点的坐标
                    map[y, x] = 4;
                }else{//如果小人现在的坐标不是目标点的坐标
                    map[y, x] = 0;
                }
				y++;
            }else if(map[y + 2, x] == 4){//箱子的下一个目标为目标点
				map[y + 2, x] = 5;
				map[y + 1, x] = 3;
                if(map0[y, x] == 4){//如果小人现在的坐标是目标点的坐标
                    map[y, x] = 4;
                }else{//如果小人现在的坐标不是目标点的坐标
                    map[y, x] = 0;
                }
				y++;
            }
        }
    }else if(aj.Key.ToString() == "LeftArrow") {//向左移动
        if(map[y, x - 1] == 0 || map[y, x - 1] == 4){//小人的下一个坐标为空地,进行移动
            map[y, x - 1] = 3;
            if(map0[y, x] == 4){//如果小人现在的坐标是目标点的坐标
                map[y, x] = 4;
            }else{//如果小人现在的坐标不是目标点的坐标
                map[y, x] = 0;
            }
            x--;
        }else if(map[y, x - 1] == 1){//小人的下一个坐标为墙,跳过此次循环
			continue; 
		}else if(map[y, x - 1] == 2 || map[y, x - 1] == 5){//小人的下一个坐标为未到达目标的箱子或到达目标的箱子
            if(map[y, x - 2] == 1 || map[y, x - 2] == 2 || map[y, x - 2] == 5){//箱子的下一个目标为墙或空箱子或到达目标的箱子
				continue; 
			}else if(map[y, x - 2] == 0){//箱子的下一个目标为空地
				map[y, x - 2] = 2;
				map[y, x - 1] = 3;
                if(map0[y, x] == 4){//如果小人现在的坐标是目标点的坐标
                    map[y, x] = 4;
                }else{//如果小人现在的坐标不是目标点的坐标
                    map[y, x] = 0;
                }
				x--;
            }else if(map[y, x - 2] == 4){//箱子的下一个目标为目标点
				map[y, x - 2] = 5;
				map[y, x - 1] = 3;
                if(map0[y, x] == 4){//如果小人现在的坐标是目标点的坐标
                    map[y, x] = 4;
                }else{//如果小人现在的坐标不是目标点的坐标
                    map[y, x] = 0;
                }
				x--;
            }
        }
    }else if(aj.Key.ToString() == "RightArrow"){//向右移动
        if(map[y, x + 1] == 0 || map[y, x + 1] == 4){//小人的下一个坐标为空地,进行移动
			map[y, x + 1] = 3;
            if(map0[y, x] == 4){//如果小人现在的坐标是目标点的坐标
                map[y, x] = 4;
            }else{//如果小人现在的坐标不是目标点的坐标
                map[y, x] = 0;
            }
			x++;
        }else if(map[y, x + 1] == 1){//小人的下一个坐标为墙,跳过此次循环
			continue; 
		}else if(map[y, x + 1] == 2 || map[y, x + 1] == 5){//小人的下一个坐标为未到达目标的箱子或到达目标的箱子
            if(map[y, x + 2] == 1 || map[y, x + 2] == 2 || map[y, x + 2] == 5){//箱子的下一个目标为墙或空箱子或到达目标的箱子
				continue;
			}else if(map[y, x + 2] == 0){//箱子的下一个目标为空地
				map[y, x + 2] = 2;
				map[y, x + 1] = 3;
                if(map0[y, x] == 4){//如果小人现在的坐标是目标点的坐标
                    map[y, x] = 4;
                }else{//如果小人现在的坐标不是目标点的坐标
                    map[y, x] = 0;
                }
				x++;
            }else if(map[y, x + 2] == 4){//箱子的下一个目标为目标点
				map[y, x + 2] = 5;
				map[y, x + 1] = 3;
                if(map0[y, x] == 4){//如果小人现在的坐标是目标点的坐标
                    map[y, x] = 4;
                    x++;
                }else{//如果小人现在的坐标不是目标点的坐标
                    map[y, x] = 0;
                }
				x++;
            }
        }
    }
}

流程控制

基本结构

计算机程序执行的控制流程有3种基本的控制结构。

  1. 顺序结构
    程序流程按语句顺序依次执行,无转移。
  2. 分支结构
    程序执行中根据某些条件是否成立,从若干语句中选择一条来执行
    (1)两路分支结构,两种可能操作中按条件选择一个执行,if。
    (2)多路分支结构,多种可能操作中按条件选择一个执行,switch。
  3. 循环结构
    重复执行若干次程序段。
    (1)当型循环结构,条件成立时重复执行,先判断后执行,while,for,foreach。
    (2)直到型循环结构,条件成立时继续执行,先执行后判断,do…while。

条件语句

if语句

  1. if语句
int a,b,max;
a = 2;
b = 3;
max = a;
if(b>max)
	max = b;
  1. if…else语句
int a,b,max;
a = 2;
b = 3;
if(b>a)
	max = b;
else
	max = a;
  1. if…else if…else语句
float x,y;
x = 1.2f;
if(x<0)
	y = x+1;
else if(x<10)
	y = x*x-5;
else
	y = x*x*x;
  1. if语句嵌套
float x,y;
x = 1.2f;
if(x>=0)
	if(x>=10)
		y = x*x*x;
	else
		y = x*x-5;
else
	y = x+1;

switch语句

多分支条件判断

switch(表达式){
default:语句;
	[break;]
case 常量值1:语句1;
	[break;]
case 常量值2:语句2;
	[break;]
...
case 常量值n:语句n;
	[break;]
}
  • 表达式与常量值只能是整数、字符串或枚举类型。
  • case后常量值不能重复。
  • case后多条语句可以不使用{}标注。
  • default语句位置任意放置,可忽略。
int day = 6;
switch(day){
case 0:Console.WriteLine("Sunday");
	break;
case 1:Console.WriteLine("Monday");
	break;
case 2:Console.WriteLine("Tuesday");
	break;
case 3:Console.WriteLine("Wednesday");
	break;
case 4:Console.WriteLine("Thursday");
	break;
case 5:Console.WriteLine("Friday");
	break;
case 6:Console.WriteLine("Saturday");
	break;
default:Console.WriteLine("Error");
	break;
}

循环语句

反复执行某段代码,直到不满足条件。
4个要素:

  • 初始条件:循环最开始的状态。
  • 循环条件:满足条件下进行循环。
  • 状态改变:改变循环变量值,最终不满足循环条件,从而停止循环。
  • 循环体:反复执行的某段代码。

while语句

当型循环,先判断,后执行。

int i,n,sum;
n = 100;
sum = 0;
i = 1;
while(i<=n){
	sum += i;
	i++;
}

do…while语句

直到型循环,先执行后判断。

int i,n,sum;
n = 100;
sum = 0;
i = 1;
do{
	sum += i;
	i++;
}while(i<=n);

for语句

for(表达式1;表达式2;表达式3){
	语句块
}

等价于

表达式1;
while(表达式2){
	语句块
	表达式3;
}

(1)表达式1,循环初始化表达式,通常为赋值表达式(为循环变量赋初值)。
(2)表达式2,循环条件表达式,通常为关系表达式或逻辑表达式(循环结束条件)。
(3)表达式3,循环变量表达式,通常为赋值表达式(改变循环变量)。
(4)语句块,循环体,单语句或复合语句。

int i,n,sum;
n = 100;
sum = 0;
for(i=1;i<=n;i++){
	sum += i;
}

3种循环语句比较

(1)while与for语句先判断后执行(当型:可能一次也不执行);do…while语句先执行后判断(直到型:至少执行一次)。
(2)循环条件为真时继续执行。
(3)至少执行一次情况下,可以相互转换。
循环语句的嵌套称为多重循环。

跳转语句

改变程序的执行流程,转移到指定之处,无条件地跳出循环。

break语句

跳出程序的循环语句。
跳出最内层的while、do…while、for和switch语句,一般搭配if语句。

int n,i;

n = 151;
for(i=2;i<n;i++){
	if(n%i==0)
		break;
}
if(i==0)
	Console.WriteLine("{0}是素数",n)
else
	Console.WriteLine("{0}不是素数",n)

continue语句

结束本次循环,开始下一次循环。
while和do…while中,continue跳转到循环条件的判断部分;for中,continue跳转到“表达式3”,然后根据“表达式2”判断是否继续执行。

int sum = 0;
for(int i=1;i<100;i++){
	if(i%10==3)
		continue;
	sum += i;
}

goto语句

无条件跳转语句,跳转到内部的任何一条语句。
goto 标识符;

int i = 0;
int sum = 0;
label:
i++;
sum += i;
if(i<100)
	goto label;

彩虹圆饼

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 实验一{
    static class Program{
        //应用程序的主入口点
        [STAThread]
        static void Main(){
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 实验一{
    public partial class Form1 : Form{
        public Form1(){
            InitializeComponent();
        }
		
        Random random = new Random();//建立一个对象,可以生产随机数的对象
		
        Color getRandomColor(){ //用来随机获取颜色
            return Color.FromArgb(//获取红、绿、蓝三色的值
                random.Next(256),//随机抽取红色颜色
                random.Next(256),//随机抽取绿色颜色
                random.Next(256)//随机抽取蓝色颜色
                );
        }
		
        private void button1_Click(object sender, EventArgs e){
            Graphics g = this.CreateGraphics();//绘制接口
            int x = this.Width / 2;
            int y = this.Height / 2;
            for (int r = 1; r <= 100; r++){
                g.DrawEllipse(            //绘制一个由边框定义的圆
                    new Pen(getRandomColor(), 2),//新建画笔
                    x - r, //边框左上角x坐标
                    y - r,// 边框左上角Y坐标
                    2 * r,//边框长度
                    2 * r//边框宽度
                );
            }
            g.Dispose();
        }

        private void Form1_Load(object sender, EventArgs e){}
    }
}

Form1.Designer.cs

namespace 实验一{
    partial class Form1{
        //必需的设计器变量
        private System.ComponentModel.IContainer components = null;

        //清理所有正在使用的资源。
        //<param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing){
            if (disposing && (components != null)){
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码
		
        //设计器支持所需的方法 - 不要修改
        //使用代码编辑器修改此方法的内容。
        private void InitializeComponent(){
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
			
            // button1
            this.button1.Location = new System.Drawing.Point(92, 92);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 0;
            this.button1.Text = "画圆";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
			
            // Form1
            this.ClientSize = new System.Drawing.Size(284, 261);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
        }

        #endregion

        private System.Windows.Forms.Button button1;
    }
}
//默认exe会有控制台窗口
csc Program.cs Form1.cs Form1.Designer.cs -t:winexe

简单客车售票系统

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test3_ticket{
    class Program{
        static void Main(string[] args){
            Console.Title = "简单客车售票系统";     //设置控制台标题
            string[,] zuo = new string[10, 5];      //定义二维数组
            for(int i = 0; i < 10; i++){
                for (int j = 0; j < 5; j++){
					zuo[i, j] = "【有票】"; //初始化二维数组      
				}               
            }
            string s = string.Empty;           //定义字符串变量
            while(true){                      //开始售票
                System.Console.Clear();       //清空控制台信息
                Console.WriteLine("\n   简单客车售票系统" + "\n"); //输出字符串
                for(int i = 0; i < 10; i++){
                    for(int j = 0; j < 5; j++){
                        System.Console.Write(zuo[i, j]);  //输出售票信息
                    } 
                    System.Console.WriteLine();
                }
                System.Console.Write("请输入坐位行号和列号(如:0,2)输入q键退出:");
                s = System.Console.ReadLine();      //售票信息输入
                if(s == "q") 
					break;               //输入字符串"q"时退出系统
                string[] ss = s.Split(',');        //拆分字符串
                int one = int.Parse(ss[0]);        //得到坐位行数
                int two = int.Parse(ss[1]);        //得到坐位列数
                zuo[one, two] = "【已售】";        //标记售出票状态
            }
        }
    }
}
csc Program.cs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值