突然翻到之前写的这个,是第一次用CSDN的时候整理的,想着也不知道能不能有点用,不如现在发出来吧😂
——————————分割线——————————
好的,记录一下第一次用这个东西
一、基础知识
(一)理论基础
1. C#语言的开发环境:.NET Framework,简称为.NET,也叫.NET框架。
2. .NET Framework:主要有两个组件,公共语言运行时和.NET Framework类库。公共语言运行时是.NET Framework的基础。
3. 命名空间:
(1) 定义与理解:.Net FrameWork中的类都包含在命名空间里面。命名空间使用关键字namespace表示,它提供了一个组织相关类和其他类型的方式,它是一种逻辑组合,而不是物理组合。可以将命名空间理解为组,组中包含的是具有相同或类似功能的类。
(2) 定义规则:
(3) 一个程序集可以包含多个命名空间,一个命名空间也可以在多个程序集中使用。
(二)语法基础
1. 转义字符:
\r 回车
\n 换行
\a 蜂鸣警告
2. 变量:
变量命名规则:变量名称只能由字母、数字和下划线组成;不能以数字开头;不要使用关键字。
3. 常量:
使用const语句,必须设置初始值,不允许修改。比如:(让我来试一下这个代码块!
const double PI=3.1415926;
4. 输入:
int x = Console.ReadLine();//读取一行字符串变量
Console.Read();//等待键入(暂停程序)
5. Math的几种方法:
Math.Round (x) — 四舍五入
Math.Abs(x) — 绝对值
Math.Sqrt(x) — 开平方
Math.Pow(x,y) — xy
Math.exp() — ex
Math.Min — 最小值
Math.Max — 最大值
Math.Sin — 三角函数
注:Math类的常数:Math.PI 、Math.E (2.718)
6. 数据转换的几种方式:
(1)隐式转换:类型A,取值范围完全包含在类型B中,则可转换为B,即小转大。
(2)显式转换:()里表示要转换的类型,存在数据丢失。
注:可使用checked,检测是否有数据的溢出:
short a = 258;
byte b = checked((byte)a);
Console.WriteLine("{0}",b);
//另一种方法
try
{
....
}catch(Exception)
(3)Convert转换
int a = Convert.ToInt32("128");
//a=128,数值字符串转int
Convert.ToDouble//数值字符串转double
Convert.ToSingle//数值字符串转float
Convert.ToChar//整型数转char
Convert.ToString//任意数值转为字符串
(4)特殊(数值和字符串之间的转化):
string a = "12";
double b = double.Parse(a);//字符串转化为数值
float c =123.456f;
a = c.ToString();//数值转化为字符串
7. 运算符
(1)算数运算符:
“ / ” 除法运算符:若为两个整数相除,结果将得到整数部分,不向上向下取。
注:a++和++a的区别:a++为先自增,++a为后自增。
(2)逻辑运算符,见下表:
注:&和&&都表示“并且”,区别在于:&需要计算并判断前后两个操作数; &&遇到第一个操作数false时就不处理第二个数, 因此也称为“短路与”。| 和 | | 同理。
(3)赋值运算符(一个奇奇怪怪的东西,鬼知道题库会不会出…):
(4)条件运算符里的三元运算符:逻辑表达式 ? 表达式1 : 表达式2。逻辑表达式为真,运算结果为a;否则为b。
举个栗子:如果变量x的值大于等于10并且小于等于12,则计算结果为字符串”冬天“,否则为”其它”,计算结果保存到变量y中。
string y = (x>=10) && (x<=12) ? "冬天" : "其它";
(5)运算符的优先级:
二、程序基本控制结构
(一)顺序结构
(二)分支结构
1. if 语句
照常使用,别忘了有一个多分支的结构 else if 。
一个简单的例题:判断输入的年份是否闰年。闰年能被400整除,或者能被4整除但不能被100整除。
int a = Convert.ToInt32(Console.ReadLine());
if(a % 400 == 0)
Console.WriteLine("是闰年");
else
{
if(a % 4 == 0 & a % 100 != 0)
Console.WriteLine("是闰年");
else
Console.WriteLine("不是闰年");
}
2. Switch 语句:
基本语法:
switch(表达式)
{
case 常量表达式1:
语句序列1;
break;
case 常量表达式2:
语句序列2;
break;
...
default: //
语句序列n+1;
break;
}
注:switch是一个多分支结构。通常情况下,每个case分支下必须有break语句,如果没有会直接进行下一个语句。可以没有default语句。
那么举个栗子吧!用switch语句实现,输入学生成绩,判断成绩等级。
100-90:优秀;89-80:良好;79-70:中等;69-60:较差;60以下:不及格;
Console.Write("请输入成绩:");
float x = Convert.ToInt32(Console.ReadLine());
switch((int)x/10)
{
case 10:
case 9:
Console.WriteLine("优秀");
break;
case 8:
Console.WriteLine("良好");
break;
case 7:
Console.WriteLine("中等");
break;
case 6:
Console.WriteLine("较差");
break;
default:
Console.WriteLine("不及格");
break;
}
注:switch 语句中的表达式和常量表达式的运算结果均为固定值,因此,switch 语句只能判断离散值,如 2,3,4 等,而不能做类似 x>2 的判断。所以该题用 (int)x/10 的形式实现转化。
p.s.加一段课本上习题的代码,困惑了我好久,来来来加强一下理解(捂脸)
int a = 2, b = 7, c = 5;
switch (a > 0)
{
case true:
switch (b < 0)
{
case true:
Console.Write("@");
break;
case false:
Console.Write("!");
break;
}
break;
case false:
switch (c == 5)
{
case true:
Console.Write("*");
break;
case false:
Console.Write("#");
break;
default:
Console.Write("#");
break;
}
break;
default:
Console.Write("&");
break;
}
好的,解释一下,这个玩意儿呢,我理解错的点在于我觉得switch的条件不满足就进不去,but,是根据里面的条件来判断true or false然后选择进哪一个case,对,就是这样,,
(三)循环结构
1. For 语句:
基本语法格式:
for(初始化表达式;条件表达式;迭代表达式)
{
循环体语句;
}
注:别忘了还有一个循环嵌套,用 break 可以跳出循环。
2. While语句:
基本语法格式:
while (条件表达式)
{
循环体;
}
注:要有初始循环的条件,也要有结束循环的条件。
好的,那来看一个经典的例题吧(真好哈哈哈):Fibonacci数列。有一对兔子,从出生后3个月起每个月都生一对兔子。小兔子长到第3个月又生一对兔子。那么第30个月,有多少对兔子?
分析一下:
int a = 1;//第1个月
int b = 1;//第2个月
int c = 0;//兔子总数
int i = 3;//第i个月
while(i<=30)
{
c = a + b;
Console.WriteLine("第{0}月有{1}只",i,c);
a = b;
b = c;
i++
}
3. Do…While语句:
基本语法格式:
do
{
循环体;
} while (条件表达式);
4. 跳转语句:
(1)break 语句:用在循环体中,用于结束循环。
(2)continue 语句:用于循环体中,作用是结束本次循环的执行,开始下一次循环。
举个栗子!:众筹项目,在200人内需筹款100万,要求:
1)在得到每一笔众筹款时显示已筹到款项的总数;
2)当众筹额超过100万时结束众筹活动;
3)每人限10万以内。若超10万则输出“超过10万,无效数据”,并进入下一次筹集。
4)用两种方法实现。
//用for循环实现:
float sum = 0,amount,n = 0;
for(int i = 1 ; i <= 200 ; i++)
{
Console.Write("请输入筹集资金(万):");
amount = Convert.ToSingle(Console.ReadLine());
if(amount > 10)
{
Console.WriteLine("超过10万,无效数据");
continue;
}
n++;
sum += amount;
Console.WriteLine("第{0}笔:当前众筹资金:{1}万元\n",n,sum);
if(sum>1000)
{
Console.WriteLine("众筹活动结束。");
break;
}
}
//用While循环
float sum = 0,amount=0,i=0;
while (true)
{
Console.Write("请输入筹集资金:");
amount = Convert.ToSingle(Console.ReadLine());
if (amount>10)
{
Console.WriteLine("超过10万,无效数据");
continue;
}
i++;
sum += amount;
Console.WriteLine("第{0}笔:当前众筹资金:共{1}万\n", i, sum);
if (sum >= 100)
{
Console.WriteLine("众筹活动结束。");
break;
}
}
(3)goto 语句
goto语句可以实现代码的直接跳转。在C#中,允许给代码加上标签,这样就可以使用goto语句直接跳转到相应的标签行。
标签的定义:标签名:
goto语句的用法:goto 标签名;
好的,这种奇怪的东西必然要举个栗子(捂脸):计算1+2+3+…+100的值。
int i = 1,sum = 0;
x1:
sum += i;
i++;
if(i > 100)
goto x2;
goto x1;
x2:
Console.WriteLine("1+2+3+...+100={0}",sum);
Console.ReadKey();
再复习一下几个简单的循环的作业(捂脸)
#1 九九乘法表:
for (int i = 1; i <= 9; i++)
{
Console.WriteLine();
for (int j = 1; j <= 9; j++)
{
if (i >= j)
Console.Write("{0}*{1}={2} ", j, i, i * j);
}
}
就能得到这个效果:
emmmm…接下来,讲一下怎么生成随机数(我也不知道为什么这个知识点在这里出现hhh)
//产生一个1到100之间的随机数。
Random ran = new Random();
int num = ran.Next(1,100);
三、数组和字符串
数组
1. 一维数组
//数组的声明:数据类型[] 数组名;
int[] score;
string[] name;
/* 数组的初始化:1.数组名=new 数组类型[数组元素个数];
2.数组名=new [数组元素个数]{数组元素列表} */
score=new int[5]{1,2,3,4,5};
//声明的同时初始化并赋值:
int[] a=new int[3]{1,2,3};
char[] a=new char[]{'i','l','o','v','e','c','#'}
string[] str={ "I","love","c","#"};//注意单引号和双引号的区别
//数组的引用:数组名[下标]; 注意!!下标从0开始!
float[] score=new float[3];
score[0]=97;
score[1]=89;
score[2]=66;
注:bool 类型默认初值为 false,char 类型默认初值为 ‘a’ ,string 类型默认初值为null。
好的,来看几个例题吧!
编写7选3抽奖程序。要求:
1)产生3个随机数,大于等于1且小于等于7 。
2)这3个随机数保存到数组中。
3)这3个数不能重复。
//用do...while循环
int max = 8,num = 3;
Random ran = new Random();
int[] a = new int[num];
bool same;
int b,index = 1;
a[0] = ran.Next(1,max);
do
{
b = ran.Next(1,max);
same = false;
for(int i = 0; i < index; i++)
{
if(b == a[i])
{
same = true;
break;
}
}
if(!same)
{
a[index] = b;
index++;
}
}while(index < num);
Console.WriteLine("{0} {1} {2}",a[0],a[1],a[2]);
//用for循环