一、创建项目
点击“文件”——“新建”——“项目”,选择其他项目类型中的“Visual Studio 解决方案”,点击空白解决方案,编辑名称或使用默认名称,选择位置,再点击确定,即可创建新项目。
屏幕右方有一个“解决方案资源管理器”
在解决方案上右键,添加,新建项目,选择控制台程序,起名字,确定。
为了写代码方便,可以改变一下字体。在工具——选项——字体和颜色里改变字体和大小,在工具——选项——文本编辑器——所有语言里勾选行号。一般字体选择Arial Black,大小12。
二、代码
C#代码的本质是文本,所以不仅可以用vs2013打开,还可以用最简单的Windows记事本打开。
基本代码:Console 控制台
WriteLine()将括号内的内容显示到控制台上
ReadLine()读取用户在控制台输入的内容,读取到程序中。这时会暂停程序,直至输入回车键。
小结:Console是类【工具库】,WriteLine/ReadLine是方法【功能】,Title是属性【修饰】
using是引入命名空间,namespace是定义命名空间【类的住址】对类进行逻辑上的划分,防止重名,class是定义类【做工具】,static是定义方法【做功能】
- 调用语句:类.方法();
- 对齐语句快捷键:Ctrl + K + F
- 注释选中代码快捷键:Ctrl + K + C
- 取消注释:Ctrl + K + U
三、变量
1.定义
程序都是在内存中运行的。
程序是用来处理数据的。
变量就是在内存中开辟一块用于存储数据的空间。
2.内置数据类型
容量的单位
整型
- 使用整型数据时一般使用int(4个字节组成,数据范围 -231~231)
非整型
- 小数类型较多,一般根据实际情况确定数据类型。
非数值型
- char只能存储单个字符,使用单引号。string可以存储单个或多个字符(字符串),使用双引号。
- bool定义的变量只会返回True或False。
3.变量的声明
建议命名规则:
- 以小写字母开头
- 如果包含多个单词,除第一个单词外其他单词首字母大写
- 增加类型前缀便于理解
- 多用英文单词,不会就查
4.变量的赋值
在编写代码时经常出现隐藏的错误,这时就需要我们具备排除错误的能力,学会调试。
- 在可能出错的行添加断点
- 按F5 启动调试
- 按F11 逐语句执行
- 按Shift + F5 停止调试
小练习:枪支信息
占位符
在Write Line语句中,常常需要不断进行字符和变量的转换,比如弹夹子弹数目:XX,考试成绩:XX等,这时若只用Write Line就显得很长且不美观,所以有了占位符的概念。
这里有一个叫str的字符串,它采用字符格式Format,编写了一段代码,融合了文字字符串和变量,这里就用到了占位符{ },这里将文字字符串写在前,并在需要插入变量的位置输入占位符{数字},然后在后面依次输入变量名称,实现了字符串和变量融合输出的目的。需要注意,占位符里的数字要从0开始每次增1,否则会出现格式异常(format exception)
标准数字格式字符串
在Console(控制台)Write Line(输出)使用占位符时,可以运用标准数字字符串格式化来快速改变数字字符格式,如货币、时分、精度、百分数等。
转义符
在输出时,当我们需要输出的符号有其在C#中的特殊应用,如双引号""、单引号’、或者输出空字符,需要在他们前面加上转义符 \
其他字符
此外,在输出时常用的字符还有\r\n回车换行、\t水平制表符
- 了解内容
四、数据的基本运算
1.运算符
赋值运算符 =
- 将右边的值复制给左边
- 赋值表达式自身也有值,其本身值为所赋值,如num 1 = num 2 = 1;
除法运算符 /
- 计算两数的商(注意数的类型,若为整型会截断小数位)
取模运算符 %
- 取余数
- 判断一个数字能否被另一个数字整除 bool r1 = n1 % 2 == 0;
- 获取整数的个位 int r2 = n1 % 10;
比较运算符 > < >= <= == !=
- 进行数值的比较
- ==和!=还可应用于bool中判断文本是否相同
逻辑运算符 && || !
- 与&& 表示并且的关系,有一假俱假的性质
- 或|| 表示或者的关系,有一真俱真的性质
- 非 !表示取反 true和false相互转换
- 常用于bool运算
快捷运算符 += *= /= %=
- += 先加再赋值给自身
- *= 先乘再赋值给自身
- /= 先除再赋值给自身
- %=先取模再赋值给自身
(以上运算符均为二元运算符)
一元运算符 ++ - -
- ++自增1,- -自减1
- 无论放在变量前还是变量后,对于下一条指令,都是自增(自减)后的
- 先加先自增,后返回值;后加后自增,先返回值(针对输出语句)
三元运算符 条件表达式?表达式1:表达式2
- 先判断条件表达式是否正确,正确将表达式1赋给变量,否则将表达式2赋给变量
优先级
- 先乘除 后加减 小括号优先级最高
2.数据类型转换
Parse转换:将string转换为其他数据类型
- 待转换数据必须与转换后的数据“相像”
ToString转换:将任意类型转换为string类型
隐式转换
- byte可直接转换为int
- 隐式转换是由大范围到小范围的转换,不会出错,所以可以自动转换
显式转换
- 由大范围到小范围的强制转换
- 数据转换时若超过内存范围,会发生精度的丢失,如int 300转换成byte时成了44
- 不知道该如何转换时要看看划红线的提示
(由多种变量参与运算,结果自动向较大类型提升)
五、语句
1.选择语句
if(条件) else + 结果
(C#和C语言的选择语句基本相同,不再详细记录)
switch(变量名) case + 确定值 break
(常用于变量值确定的多分支结构)
2.循环语句
for(初始化;循环条件;增减变量)
(与C语言基本相同)
while (条件)
(与C语言基本相同)
do while(条件);
(与C语言基本相同)
猜数字游戏
Random random = new Random();
int number = random.Next(1, 101);
int inputnumber;
int count=0;
Console.WriteLine("欢迎玩猜数字游戏,系统已产生一个1到100之间的随机数,请您猜猜它是:");
do
{
count++;
inputnumber = int.Parse(Console.ReadLine());
if (inputnumber > number)
Console.WriteLine("大了!");
else if (inputnumber < number)
Console.WriteLine("小了!");
else if (inputnumber == number)
Console.WriteLine("恭喜你!猜对了!总共猜了{0}次",count);
} while (inputnumber!=number);
3.跳转语句
-
continue 用在循环体内部,结束本次循环,继续下次循环
-
break 退出最近的循环体或switch语句
六、方法
1.定义
语法
方法是类里面的一个概念,是对一系列语句的命名,表示一个功能或行为。visual studio控制台会自动调用Main()方法,除此之外的任何方法想要被使用都需要主动调用,即在Main()中调用方法名。
2.返回值类型
方法表示功能,那么返回值就是功能的结果
- 返回的数据必须与返回值类型兼容(可以隐式转换)
- return + 返回值 ,可以用其他语句接收这个返回值
- return; 没有返回值的方法,也可以写return关键字,直接跟分号,表示退出方法。
3.参数列表
方法中的参数列表表示从主方法读取的数据,也叫形参列表,主方法中的数据叫实参。
- 定义方法时叫形式参数,简称形参;
- 调用方法时叫实际参数,简称实参;
- 实参和形参要一一对应(类型、数量、顺序)
笔记1
使用C#时,我们经常需要调用系统自带的方法甚至是别人编写的方法,这时候就需要我们快速理解方法是怎么使用的
Insert:在字符串的指定位置插入字符。
Index:查找指定字符在字符串中的索引,并返回位置。
Remove:删除指定位置之后的所有字符,并返回新字符串。
Replace:替换指定字符为另一个字符
StratsWith:确定此字符串的开头是否和指定的字符串匹配
///(文档注释):为方法提供注释
4.如何定义方法
方法的定义要根据其访问类型、功能、返回值等综合考虑,最重要的是先明确其功能。
练习:在console控制台显示年历
在console控制台显示年历——C#练习代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
//显示年历
Console.WriteLine("请输入年份");
int year = int.Parse(Console.ReadLine());
int month = 1;
for (int i = 0; i < 12; i++)
{
monthlyCalendar(year, month);
month++;
Console.WriteLine("\n");
}
Console.ReadLine();
}
//显示月历
static void monthlyCalendar(int year, int month)
{
//显示表头
Console.WriteLine(month + "月");
Console.WriteLine("日\t一\t二\t三\t四\t五\t六");
for (int i = 0; i < GetWeekByDay(year, month, 1); i++)
{
Console.Write("\t");
}
int days = CountDayOfMonth(year, month);
for (int i = 1; i < days + 1; i++)
{
Console.Write(i);
Console.Write("\t");
int j = GetWeekByDay(year, month, i);
while (j == 6)
{
Console.Write("\n");
break;
}
}
}
/// <summary>
/// 根据年月日,计算星期数的方法。
/// </summary>
/// <param name="year">年份</param>
/// <param name="month">月份</param>
/// <param name="day">天</param>
/// <returns>星期数</returns>
private static int GetWeekByDay(int year, int month, int day)
{
DateTime dt = new DateTime(year, month, day);
return (int)dt.DayOfWeek;
}
/// <summary>
/// 计算每月的天数
/// </summary>
/// <param name="year">形参年份</param>
/// <param name="month">形参月份</param>
/// <returns>月份的天数</returns>
private static int CountDayOfMonth(int year, int month)
{
switch (month)
{
case 2:
return FebruaryDays(year);
case 4:
return 30;
case 6:
return 30;
case 9:
return 30;
case 11:
return 30;
default:
return 31;
}
}
//计算闰年二月天数
public static int FebruaryDays(int year)
{
if (year % 4 == 0 && year % 100 != 0)
return 29;
else if (year % 400 == 0)
return 29;
else return 28;
}
}
}
参考意见:
1.判断闰年可以用bool和三元运算符,bool方法来判断是否为闰年,再用三元运算符输出天数。
2.使用多层判断嵌套时要注意减少程序复杂度,提高可读性,可以减少嵌套就尽量减少。
利用return 0 短路先排除输入错误的情况,若没错就往下运行。这样减少了嵌套。
3.善用英文起方法名,要易懂,让其他人也能一看就懂。
4.switch case语句若返回值相同,可以省略之前的return,只留最后一个return。
5.方法重载
如何查看方法重载信息
方法:
1、光标在括号中间,Ctrl+Shift+空格键
2、写有重载的方法名后,按shift+(
七、递归与数组
1.递归
递归的定义:方法内部又调用自身的过程。
核心思想:将问题转移给范围小的子问题。
例1 计算阶乘
递归性能不如循环语句,因为每次需要在内存开辟一块空间,但递归能把复杂的问题简单化,所以递归适合复杂且重复的问题
例2 计算1-2+3-4+5······
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(GetFactorical(3));
Console.WriteLine(GetIsometric(8));
}
//计算阶乘
private static int GetFactorical(int num)
{
if (num == 1) return 1;
return num * GetFactorical(num - 1);
}
//计算1-2+3-4+5······
private static int GetIsometric(int num)
{
if (num == 1) return 1;
if (num % 2 == 0)
return GetIsometric(num - 1) - num;
else
return GetIsometric(num - 1) + num;
}
}
}
2.数组
什么是数组
- 从Array类派生的,一组数据类型相同的变量组合
- 一种空间连续的数据结构
- 元素通过索引(位置的序号)进行操作。
- 起始位置默认为0
数组初始化
1.声明一块内存 //int [] a;
2.初始化 new 数据类型 [容量]; //a = new int [6];
3.通过索引读写每个元素 // a[0] = 1;
- 数组名.length :提取数组长度
练习:在控制台录入学生成绩float[]
要求:如果成绩不在0–100之间,则提示成绩有误
static void Main()
{
float[] scoreArray = CreatScoreArray();
}
static float[] CreatScoreArray()
{
Console.WriteLine("请输入学生总数:");
int count = int.Parse(Console.ReadLine());
float[] scoreArray = new float[count];
for (int i =0;i<count;)
{
Console.WriteLine("请输入第{0}个学生的成绩:",i+1);
float score = float.Parse(Console.ReadLine());
if (score >= 0 && score <= 100)
scoreArray[i++] = score;
else
Console.WriteLine("成绩有误");
}
return scoreArray;
}
获取最大值方法
private static float GetMax(float[] array)
{
float max = array[0];
for (int i = 0; i < array.Length; i++)
{
if (max < array[i])
max = array[i];
}
return max;
}
数组的其他写法
1.初始化 + 赋值
- 括号里的数字要么不写,要么写的数字必须和赋值的数量相等
2.声明 +初始化 + 赋值(最简便的写法)
练习:根据年月日确定当天是本年的第几天
//根据年月日确定当天是本年的第几天
static void Main()
{
Console.WriteLine("请输入年月日,以回车隔开:");
int year = int.Parse(Console.ReadLine());
int month = int.Parse(Console.ReadLine());
int day = int.Parse(Console.ReadLine());
Console.WriteLine("当天是本年的第{0}天", totaldays(year, month, day));
}
//计算当天是本年的第几天
static int totaldays(int year, int month, int day)
{
int[] leapyearday = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (IsLeapYear(year)) leapyearday[1] = 29;
int days = 0;
for (int i = 0; i < month - 1; i++)
{
days += leapyearday[i];
}
days += day;
return days;
}
//判断是否为闰年
private static bool IsLeapYear(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return true;
else
return false;
}
笔记2
依次读取数组数据不仅可以用循环,也可以用foreach
foreach:从头到尾依次读取数组元素
- var:推断类型:根据所赋数据,推断出类型
- 适用性 :数据类型名称较长
- collection:要循环访问的集合或数组名称
笔记3
数组常用方法及属性
- 数组名.length:取数组元素总数
- Array.Clear:将指定数组从索引位置往后自定义个长度设置为零、false或null,具体取决于元素类型。
- Array.copy:从第一个元素开始,复制指定数组的一系列元素,将他们粘贴到另一个数组中。
- 数组名.克隆:创建一个浅表副本,类型为object,一般需要将object转换为其他类型使用。
- Array.IndexOf:搜索指定的对象,并返回数组中第一个匹配项的索引
- Array.LastIndexOf:搜索指定的对象,并返回数组中最后一个匹配项的索引
- Array.Sort:对数组元素进行排序
- Array.Reverse:反转整个数组中元素的顺序